Skip to main content

Coupon Distribution

Bond Token holders receive periodic stablecoin payments corresponding to the underlying bond's coupon schedule through an automated, snapshot-based distribution system.


Overview​

Bond Token holders receive onchain coupon distributions corresponding to the issuer's actual coupon payments. Snapshot‑based entitlements ensure fungibility and prevent transfer gaming. Throughout the flow, Bondi does not take custody of investor proceeds: funds move from the regulated segregated account directly into onchain distribution contracts, and payouts are enforced by contract logic.

Coupon Flow Diagram​

Segregated AccountSeg. Account
AdminAdmin
OrchestratorOrchestrator
Distribution ContractDistribution
RelayerRelayer
Bond Token HolderToken Holder
Reinvestment / Redemption VaultsVaults
Transfer gross USD stablecoin for coupon
registerCoupon(amount)
Record snapshot block
Snapshot Bond Token holder balances
finalizeCoupon(couponId, root, blockNumber)
6. Claims
claimCouponForUser(user/vault, couponId, amount, proof)
Pay coupon stablecoin (KYC-verified holder)
Pay coupon stablecoin + trigger vault callback
Mint Coupon Tokens (non-verified holder)
Self-claim a coupon leaf
claimCoupon(couponId, amount, proof)
Same fork: stablecoin if verified, Coupon Tokens otherwise
Later: KYC-verified token holder redeems
redeemCouponTokens(amount)
Burn Coupon Tokens, pay stablecoin

How Coupons Work​

Off-chain Process​

The coupon payment process begins in traditional finance and bridges to onchain distribution:

  • Issuer Payment: The bond issuer pays the coupon to the paying agent (or its trustee), who transfers it through the depository into Bondi's regulated segregated account.
  • Currency Conversion: Funds are converted from fiat currency to stablecoins.
  • Onchain Transfer: The segregated account transfers the funds to the Distribution Contract for automated distribution.

Onchain Coupon Distribution​

Once funds arrive onchain, the coupon is registered and distributed through an explicit, auditable sequence:

1. Gross Transfer: The segregated account (Cell) onramps fiat and transfers the gross coupon amount in stablecoins directly to the Distribution contract. Bondi never touches user funds.


2. Coupon Registration: The Distribution Safe (Admin in the diagram above) calls Distribution.registerCoupon(amount). Commission is deducted using the immutable couponCommissionBps set at deployment time per Bond Token; the net amount is stored as the coupon's distributable total. A solvency check confirms the contract holds enough stablecoin to cover all registered liabilities.


3. Snapshot block: The block number at registration is recorded onchain as the snapshot block used to calculate holder entitlements.


4. Holder snapshot: Bondi's orchestrator service snapshots Bond Token holder balances at that block to build the entitlement dataset. Bond Tokens provided as liquidity in the Bond Token's canonical pool keep earning coupons: the snapshot credits each liquidity position's Bond Token share to its owner, so LPs are paid like any other holder without withdrawing. Liquidity in any other pool does not earn coupons. The exact, reproducible procedure is Coupon Attribution to Pool LPs.


5. Finalization: The orchestrator computes the Merkle tree from the net amount and calls Distribution.finalizeCoupon(couponId, root, blockNumber) to publish the root for claims.


6. Claims: Bondi's relayer calls claimCouponForUser(user, couponId, amount, proof) for every leaf in the snapshot; no action required from the holder. The final coupon is the one exception: the relayer settles the vault leaves at once, wallet holders claim it in the Bondi frontend together with their principal, and whatever is still unclaimed is settled by the relayer after the same post-maturity delay as principal. Eligible addresses receive the coupon in stablecoin. "Eligible" means a KYC-verified wallet or a registered Bondi vault (Reinvestment or Redemption). For registered vaults, Distribution transfers the coupon proceeds and triggers the vault callback in the same transaction so the vault can register the coupon immediately. Non-eligible wallets receive Coupon Tokens for the amount owed, in the same relayer pass; the stablecoin stays reserved in the Distribution contract until a verified holder redeems them (Coupon and Principal Tokens). As a fallback, any holder can self-claim a leaf directly via claimCoupon(couponId, amount, proof), and the same rule applies.

Net-amount distribution

The Merkle tree is always built from the net (post-commission) coupon amount. The CouponAnnounced event reports (couponId, blockNumber, netAmount, commissionBps): the commissionBps value reflects the immutable couponCommissionBps set at deployment time per Bond Token. For the exact snapshot and Merkle procedure, see the Merkle Snapshots & Claims specification.

Relayer-Assisted Claims​

Bondi operates a relayer service that submits coupon and incentive claims on behalf of holders. For coupons, the relayer processes every leaf, not only eligible ones (for the final coupon, vault leaves at once and the remaining leaves after the post-maturity delay; see step 6 above): verified wallets and registered vaults receive stablecoin, and every other holder receives Coupon Tokens. Every relayer claim still checks the Merkle proof. The relayer covers the transaction cost but cannot redirect funds. Holders can always claim manually instead.