When Can You Redeem?
Redemption becomes available the momentblock.timestamp >= series.unlockTime. You can check this on-chain by reading the series’ unlockTime field. Attempting to call redeem before the unlock time will revert with NotYetUnlocked().
Function Signatures
The venue provides two redemption entry points:Simple Redemption
amount claim tokens from msg.sender and transfers the underlying collateral. Applies a default minAssetReceived = 1.
Redemption with Minimum Output
redeem, but reverts with SlippageExceeded() if the net asset tokens received by the caller are less than minAssetReceived. Use this when redeeming fee-on-transfer asset tokens.
Parameters
The deterministic series identifier, computed as
keccak256(abi.encode(asset, unlockTime)). You can find this from the SeriesCreated event or compute it off-chain using the asset address and unlock time. The venue also provides a helper: seriesIdFor(asset, unlockTime).The number of claim tokens to burn in this redemption. Must be greater than zero and must not exceed your current claim token balance. You can redeem your full balance in one call or redeem incrementally across multiple calls — partial redemption is fully supported.
The minimum net asset tokens that must arrive in your wallet after any transfer fees. If the delivered amount falls below this threshold, the transaction reverts with
SlippageExceeded(). Only available in redeemWithMinimum.1:1 Redemption
Canopy enforces a strict 1:1 backing ratio between claim tokens and escrowed collateral. When you redeem, exactlyamount units of the underlying asset are released from escrow:
amount tokens. For fee-on-transfer tokens, you receive amount minus the transfer fee — use redeemWithMinimum to protect against this.
This is not a proportional share calculation — it is a direct 1:1 exchange. One claim token always redeems for one unit of the underlying asset (minus any outbound transfer fee on the asset token itself).
Events
assetReceived is the net quantity of underlying collateral transferred to the redeemer. For standard tokens this equals amount; for fee-on-transfer tokens it may be less.
Revert Conditions
| Condition | Error |
|---|---|
series.claimToken == address(0) (series does not exist) | SeriesUnknown() |
block.timestamp < series.unlockTime | NotYetUnlocked() |
amount == 0 | InvalidParams() |
| Caller does not hold enough claim tokens | ERC-20 burn revert |
Net asset received < minAssetReceived | SlippageExceeded() |
Example: Checking Unlock Status and Redeeming
Finding the SeriesId and Claim Token Address
If you transferred some or all of your claim tokens to another wallet before the unlock time, only the tokens currently held in
msg.sender’s wallet can be redeemed in that call. The receiving wallet must call redeem itself to convert those tokens into collateral. Claim tokens are fully portable ERC-20 tokens — whoever holds them at redemption time receives the collateral.