Skip to main content

Redemption

This chapter describes the principal redemption process at bond maturity. During redemption, investors receive the principal for the bonds they hold, the corresponding bond tokens are burned on-chain, and the bond issuance is closed once the full issued amount has been burned.

Business Flow

  1. Maturity and Principal Payday:

    • Redemption starts when the bond reaches its principal payday, which is generated for the bond maturityDate.
    • The Core Payment Service processes due PRINCIPAL paydays and prepares the settlement of the full principal amount.
    • Coupon settlement remains separate from redemption. Coupon payments distribute interest only and must not trigger token burning.
  2. Holder Resolution and Payment Creation:

    • The Core Payment Service queries the Indexer for the current bond issuance, the latest finalized checkpoint, and the eligible investors holding the bond.
    • For principal redemption, the payout amount for each investor is calculated as denomination * bondCount.
    • The service creates one issuer settlement payment for the aggregate principal amount and one buyer settlement payment for each investor.
  3. Fiat Settlement via PSP:

    • The issuer is instructed to fund the aggregate principal payment through the Payment Service Provider (PSP).
    • Once the PSP confirms receipt of the issuer funds, the Core Payment Service validates the payment and authorizes investor payouts.
    • After the PSP confirms that investor payouts were sent, the corresponding buyer settlement payments move to SENT.
  4. On-Chain Token Burn:

    • Token burning happens only after investor principal payouts are confirmed as sent by the PSP.
    • For a real buyer settlement payment transition from AUTHORISED to SENT, the Core Payment Service calls burnBondBatch(isin, version, froms, amounts, FINAL_SETTLEMENT).
    • froms contains investor wallet addresses and amounts contains the number of redeemed bonds for each investor.
    • Repeated PSP callbacks must not trigger duplicate burns for payments that were already settled.
  5. Bond Closure:

    • The blockchain emits a BondBurned event after tokens are burned.
    • The Blockchain Event Service forwards the event to the Registry Service as BondRegistryEvents.BOND_BURNED.
    • The Registry Service increments burned_bond_count for the bond identified by isin.
    • Once burned_bond_count == bond_count, the bond is set to BURNED and bondRegistry.closeBond(isin, version) is called on-chain.

Sequence Diagram