Trade BT/CT
Mint BT+CT from tokens by splitting FW, and redeem BT+CT back to tokens with different handling pre- and post-expiry.
Key references: IPActionMiscV3.mintBcFromToken, mintBcFromFw, redeemBcToToken, redeemBcToFw.
Details
Goal: Split FW into BT + CT and later unwind back to base token.
Preconditions:
Approvals for
tokenInto Router.Set
minBcOut/minTokenOutthresholds.
Minting:
mintBcFromToken/mintBcFromFw— always produces equal BT + CT, both pre- and post-expiry. Post-expiry uses frozenpostExpiry.firstBCIndexfor the conversion rate.Redemption pre-expiry: Both BT and CT must be provided.
CT.redeemBC()burns both and returns FW. No AMM swap involved.Redemption post-expiry: Only BT is required.
CT.redeemBC()burns BT only; CT is NOT burned. FW returned at the currentbcIndex, and any post-expiry yield accrual goes to the treasury.
Views and events
Views
CT (
IBCToken):bcIndexStored(),bcIndexCurrent();FW(),BT();isExpired(),balanceOf(user).BT (
IBondToken):balanceOf(user),FW(),CT(),expiry(),isExpired().FW:
previewDeposit,previewRedeem.
Events
Router:
MintBcFromToken,MintBcFromFw,RedeemBcToToken,RedeemBcToFw.CT:
Mint,Burn,RedeemInterest.
Reward share (CT)
Suggested formula:
userCt / totalCtover the epoch (TWAP).Functions to call:
IBCToken(CT).balanceOf(user),IERC20(CT).totalSupply()Exclude expired CT. Post-expiry CT is minted but never burned, inflating
totalSupply()— consider filtering by excluding known router/contract addresses.
Reward share (BT)
Suggested formula:
userBt / totalBtwhere:userBt = IBondToken(BT).balanceOf(user) - getUserPosition(marketParamsBT, user).borrowAssetstotalBt = IERC20(BT).totalSupply() - IBondToken(BT).balanceOf(market) - IBondToken(BT).balanceOf(lendingMarket)
Over the epoch (TWAP).
Last updated