When a Canopy forward series reaches its unlock timestamp, the escrowed collateral backing that series becomes redeemable by claim token holders. Each claim token is backed 1:1 by the underlying asset, and redemption is fully permissionless — any holder can trigger it at any time after the unlock time without needing approval from a counterparty, an admin, or any other party. The claim tokens are burned on redemption and the corresponding collateral is transferred directly to your wallet. Partial redemptions are supported, so you can redeem any portion of your balance and hold the rest.
Redeeming via the Canopy Terminal
If you are using the Canopy trading terminal rather than integrating programmatically, the UI surfaces all redeemable positions automatically once the unlock time has passed.
Open the Canopy terminal and go to My Claims
Navigate to the Canopy trading terminal and click the My Claims tab. This view lists every series for which your connected wallet holds claim tokens.
Find the series showing Redeemable status
Series whose unlock timestamp has passed display a Redeemable badge. Series that are still locked show their remaining time to unlock instead.
Enter the amount of claim tokens to redeem
Type the number of claim tokens you want to redeem, or click Max to redeem your entire balance for that series. The UI shows the expected asset output — for standard tokens this is a 1:1 exchange.
Click Redeem and confirm the transaction
Click Redeem and approve the transaction in your wallet. The terminal submits the redeem call to the venue on your behalf.
Receive your assets and confirm the burn
After the transaction confirms, the redeemed asset tokens appear in your wallet and the spent claim tokens are permanently burned. The My Claims balance updates to reflect the redemption.
Redeeming Programmatically with ethers.js
For indexers, bots, or custom frontends, you can redeem claim tokens directly against the contract. Work through the following steps to check the unlock status, verify your balance, and execute the redemption.
Compute the series ID and check unlock status
Always gate the redemption call behind an unlock time check. Calling redeem before the unlock time will revert with NotYetUnlocked(), wasting gas.// Compute the series ID
const seriesId = await venue.seriesIdFor(ASSET_ADDRESS, unlockTime);
// Check series data
const seriesData = await venue.series(seriesId);
const now = Math.floor(Date.now() / 1000);
if (now < Number(seriesData.unlockTime)) {
throw new Error(`Not yet unlocked. Unlocks at ${new Date(Number(seriesData.unlockTime) * 1000)}`);
}
Check your claim token balance
Retrieve your current claim token balance from the ERC-20 contract deployed at seriesData.claimToken. This is the maximum amount you can redeem in a single call.const claimToken = new ethers.Contract(seriesData.claimToken, ERC20_ABI, provider);
const balance = await claimToken.balanceOf(myAddress);
Call redeem on the venue
Pass the series ID and the amount you want to redeem. You can pass any value from 1 up to your full balance — partial redemptions are fully supported. For fee-on-transfer asset tokens, use redeemWithMinimum to set a floor on the received amount.// Simple redemption (1:1 for standard tokens)
const tx = await venue.redeem(seriesId, balance);
await tx.wait();
console.log("Redemption complete");
// Or with minimum output for fee-on-transfer tokens:
// const tx = await venue.redeemWithMinimum(seriesId, balance, balance * 99n / 100n);
Redemption permanently burns the claim tokens you submit. There is no undo, refund, or re-issuance path once the transaction confirms. Double-check the amount and the series before signing.
Partial redemption is fully supported. Pass any amount up to your current balance — you do not need to redeem all of your claim tokens at once. Your remaining tokens continue to be backed 1:1 by the escrowed collateral.
If you prefer liquidity now rather than waiting for the unlock time, claim tokens are standard ERC-20 tokens and can be transferred or listed on any compatible trading venue. You are not required to hold them until unlock to capture value.