> ## Documentation Index
> Fetch the complete documentation index at: https://docs.canopy.deal/llms.txt
> Use this file to discover all available pages before exploring further.

# Redeem Canopy Claim Tokens for Underlying Collateral

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.

<Steps>
  <Step title="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.
  </Step>

  <Step title="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.
  </Step>

  <Step title="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.
  </Step>

  <Step title="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.
  </Step>

  <Step title="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.
  </Step>
</Steps>

## 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.

<Steps>
  <Step title="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.

    ```typescript theme={null}
    // 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)}`);
    }
    ```
  </Step>

  <Step title="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.

    ```typescript theme={null}
    const claimToken = new ethers.Contract(seriesData.claimToken, ERC20_ABI, provider);
    const balance = await claimToken.balanceOf(myAddress);
    ```
  </Step>

  <Step title="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.

    ```typescript theme={null}
    // 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);
    ```
  </Step>
</Steps>

<Warning>
  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.
</Warning>

<Note>
  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.
</Note>

<Tip>
  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.
</Tip>
