SettleMint
ArchitectureComponentsToken Features

Maturity Redemption

Bond maturity lifecycle feature for DALPAsset. Manages the pre-maturity, mature, and post-maturity states. Post-maturity transfers are blocked; holders redeem tokens for a denomination asset at face value.

Purpose: Maturity Redemption implements the maturity lifecycle for bond-type instruments. Before maturity, tokens transfer normally. After maturity, transfers are blocked and holders redeem tokens for a denomination asset at configured face value.


Interface (capabilities)

This feature exposes the following capabilities. It implements a three-phase state machine: pre-maturity (normal transfers), mature (governance-triggered transition), post-maturity (transfers blocked, redemption enabled).

CapabilityWho can callInputsOn-chain effectEmitsNotes
Trigger maturityGOVERNANCE_ROLENoneTransitions token to matured stateMaturedOnly after maturity date; irreversible
Trigger early maturityEMERGENCY_ROLENoneForces matured state before scheduled dateMaturedEarlyEmergency use only
Redeem tokensToken holderAmount to redeemBurns tokens; transfers denomination asset from treasuryRedeemedOnly available post-maturity
Set treasury addressGOVERNANCE_ROLETreasury addressRedirects redemption payoutsTreasuryUpdatedFund treasury before maturity
Block transfers post-maturityAutomatic (hook)Triggered on every transfer attemptReverts non-redemption transfersNone (reverts)Fail-closed via canUpdate

Business impact

  • Holders: Pre-maturity: normal transfer behavior. Post-maturity: transfers blocked; must call redeem(amount) to receive denomination asset at face value. Tokens are burned on redemption.
  • Issuer: Must fund the treasury contract with sufficient denomination asset before or at maturity. Underfunded treasury blocks all redemptions.
  • Economics: State machine with three states: pre-maturity → mature (triggered by GOVERNANCE_ROLE) → post-maturity (redemption window). Token supply decreases as holders redeem.

Risks & abuse cases

  • Underfunded treasury at maturity: If the denomination asset treasury does not hold sufficient balance to cover all outstanding tokens at face value, redemptions will revert for holders who try to redeem when funds run out.
  • mature() called too early: GOVERNANCE_ROLE can call mature() at any time, not just at the scheduled maturity date. Premature maturity blocks transfers unexpectedly. Use time-locked governance for mature() calls.
  • Partial redemption cliff: Holders who do not redeem during the redemption window (if one is defined) may lose access. Define a clear redemption window and communicate it to holders.
  • Treasury address change: setTreasury() can redirect redemption payouts. Audit all treasury address changes.

Controls & guardrails

RoleActionsRecommended guardrail
GOVERNANCE_ROLEsetTreasury() — set denomination asset treasury addressMulti-sig; audit all changes; fund treasury before calling mature()
GOVERNANCE_ROLEmature() — transition to post-maturity stateTime-lock or multi-sig to prevent premature maturity
EMERGENCY_ROLEmatureEarly() — emergency early maturity triggerEmergency use only; requires documented justification

Failure modes & edge cases

  • Redemption revert on empty treasury: If treasury is depleted, later redemptions revert. First redeemers get paid; last redeemers may not if treasury is underfunded.
  • mature() not called at scheduled date: Maturity does not trigger automatically. An off-chain process must call mature() at the correct time. Missed maturity date means normal transfers continue past the intended date.
  • Face value misconfiguration: Face value is set at deployment. A misconfigured face value cannot be changed post-deployment (immutable by design).

Auditability & operational signals

  • Matured(maturityDate, denominationAsset, faceValue) — emitted when mature() is called.
  • MaturedEarly(triggeredBy, timestamp) — emitted when matureEarly() is called.
  • Redeemed(holder, tokenAmount, denominationAmount) — emitted per redemption. Monitor for redemption volume and treasury drawdown rate.
  • Treasury balance monitoring: track denomination asset balance in treasury; alert when balance falls below total outstanding tokens × face value.

Dependencies

  • Denomination asset (ERC-20) — the asset paid to holders on redemption (e.g., USDC, stablecoin). Must be deployed and accessible.
  • Treasury contract — must hold sufficient denomination asset at maturity. Treasury address set via setTreasury().
  • Off-chain process — must call mature() at the scheduled maturity date.

Compatibility & ordering notes

  • supportsRewriting = false — does not modify amounts. Post-maturity transfer blocking is enforced via canUpdate() (reverts for all non-redemption transfers).
  • Order first in the feature array (transfer restriction). Must run before fee features.
  • Compatible with Fixed Treasury Yield: both can be active simultaneously for coupon-paying bonds. Yield is pull-based and independent of maturity state.
  • Compliance modules run before features — compliance can block transfers pre-maturity; Maturity Redemption blocks post-maturity regardless.

Change impact

  • Enable at deployment: Must be configured at deployment with face value and maturity parameters. Cannot be added post-deployment without these parameters.
  • Disable before maturity: Can be removed without effect (no redemption has occurred).
  • Disable after mature() is called: Transfer blocking ceases; holders can no longer redeem. Do not disable post-maturity without a redemption alternative.
  • Treasury address change: Effective for all future redemptions. Existing redemption transactions in-flight complete at old treasury.

See also

On this page