Handling Time
In a lot of contracts, time is of the essence. Properly handling time is essential for a lot of contracts like auctions and swaps.
The valid_range property in the ScriptContext specifies within what time the transaction can be submitted, it's used to constrain the time of the transaction.
It's of type POSIXTimeRange.
POSIXTimeRange
The POSIXTimeRange type is used to specify a time range.
dataclass()
class POSIXTimeRange(PlutusData):
"""
Time range in which this transaction can be executed
"""
# Lower bound for the execution of the transaction
# Can be negative infinity or a int.
lower_bound: LowerBoundPOSIXTime
# Upper bound for the execution of the transaction
# Can be positive infinity or a int.
upper_bound: UpperBoundPOSIXTime
A POSIXTimeRange can be visualized like a subsection of a numberline starting from negative infinity(-∞) to positive infinity (+∞)
⬤-------------→⬤
-∞ -3 -2 -1 0 1 2 3 +∞
└┴┴┴┴┴─┴─┴──┴───┴───┴───┴───┴───┴─┴─┴┴┴┴┘
Useful Methods
Helper functions for the POSIXTimeRange type are stored in opshin.ledger.interval.
make_range(lower_bound: int, upper_bound: int) -> POSIXTimeRange
This takes a the lower bound as the first argument and the upper bound as the second argument makes a POSIXTimeRange that starts from lower_bound and ends at upper_bound.
valid_range = make_range(-3, 2)
This can be visualized as:
lower_bound upper_bound
⬤----------------→⬤
-∞ -3 -2 -1 0 1 2 3 +∞
└┴┴┴┴┴─┴─┴──┴───┴───┴───┴───┴───┴─┴─┴┴┴┴┘
make_from(lower_bound: int) -> POSIXTimeRange
This takes a the lower bound as the first argument and makes a POSIXTimeRange that starts from lower_bound and ends at positive infinity.
valid_range = make_from(-1)
This can be visualized as:
lower_bound
⬤---------------------→⬤
-∞ -3 -2 -1 0 1 2 3 +∞
└┴┴┴┴┴─┴─┴──┴───┴───┴───┴───┴───┴─┴─┴┴┴┴┘
make_to(upper_bound: int) -> POSIXTimeRange
This takes a the upper bound as the first argument and makes a POSIXTimeRange that starts from negative infinity and ends at upper_bound.
valid_range = make_to(1)
This can be visualized as:
upper_bound
⬤---------------------→⬤
-∞ -3 -2 -1 0 1 2 3 +∞
└┴┴┴┴┴─┴─┴──┴───┴───┴───┴───┴───┴─┴─┴┴┴┴┘
Vesting Contract
To really grok how time is managed on Cardano we'll write a simple vesting contract.