SettleMint
ComponentsToken Features

Maturity Redemption

How DALP handles bond maturity redemption: operator maturity actions, treasury funding and allowance readiness, indexed solvency signals, and holder redemption after maturity.

Maturity Redemption gives a bond-style token a controlled end state. Before maturity, holders can transfer tokens normally. At maturity, you trigger the transition through an authorised operator call. After that, ordinary transfers stop and holders redeem tokens for the denomination asset at the configured face value.

Use this feature when you need maturity to be explicit: the date alone does not end the instrument, and holders can only redeem once an authorised operator call has moved the token into its redemption state. DALP enforces the token-state transition and records maturity and redemption events. As the issuer, you still run the surrounding processes: cash management, treasury funding, investor notices, accounting, and legal-register updates. For the fixed-income templates that attach maturity-redemption to a new asset, see the fixed-income section of the system templates catalog.

Rendering diagram...

Lifecycle model

Maturity Redemption separates three steps: the bond date, the operator call, and the holder payout. The date defines when scheduled maturity is allowed. The operator call records that the bond has matured. The payout burns redeemed tokens and pays denomination asset from your configured treasury.

PhaseWhat happensUser impact
Pre-maturityThe token is active. Transfers follow the normal feature and compliance stack.Holders can transfer tokens when the rest of the asset configuration allows it.
Maturity triggerAn authorised operator calls mature() after the scheduled date, or an emergency operator calls matureEarly() before it.The token enters the redemption state. This transition is irreversible.
Post-maturityThe feature blocks ordinary transfers and enables holder redemption.Holders call the redeem route to burn tokens and receive the denomination asset from treasury.

The bond does not mature automatically when the date arrives. Your off-chain operator process or an authorised user must call mature() to make the change. Until that call lands, normal transfer behaviour continues for the token.

Interface capabilities

The table below lists each operation, who can call it, and what it does.

CapabilityWho can callInputsEffectEmitsNotes
Trigger maturityGOVERNANCE_ROLENoneTransitions token to the matured stateMaturedOnly after the configured maturity date
Trigger early maturityEMERGENCY_ROLENoneForces the matured state before the scheduled dateMaturedEarlyEmergency path only
Redeem tokensToken holder with redeem permissionAmount to redeemBurns tokens and transfers denomination asset from treasuryRedeemedOnly available after maturity
Approve treasury allowanceTreasury walletAllowance amount in base unitsLets the feature spend denomination asset from a wallet treasuryERC-20 ApprovalOnly the treasury wallet can approve
Set treasury addressGOVERNANCE_ROLETreasury addressRedirects future redemption payoutsTreasuryUpdatedFund and verify the new treasury before holders redeem
Block transfers after maturityAutomatic transfer hookTransfer attemptReverts non-redemption transfersNone, because the transaction revertsBurns, mints, forced transfers, and feature-invoked updates can still pass through the hook

Operator responsibilities

As the issuer or operator, prepare four things before holders can redeem reliably:

  1. Move the token into the matured state with mature() after the configured maturity date, or with matureEarly() through the emergency path.
  2. Ensure the configured treasury holds enough denomination asset to cover expected redemptions.
  3. If the treasury is a wallet, that wallet must approve the maturity-redemption feature to spend the denomination asset.
  4. Check the bond-status response for indexed balance, allowance coverage, and treasury classification before announcing that redemption is available.

A wallet treasury and a contract treasury behave differently. A wallet treasury pays through ERC-20 transferFrom, so the feature needs allowance from that wallet. A contract treasury uses the treasury contract's own payout controls, so the wallet-approval route does not apply. The Console hides the approval button unless the connected wallet is the configured wallet treasury and the bond-status response shows an allowance gap for it.

Only the configured treasury wallet can submit the allowance approval. Other token roles, including custodians and admins, cannot approve on behalf of that wallet because ERC-20 approval belongs to the account that owns the funds.

API routes

OperationRouteWho signsPurpose
Trigger scheduled maturityPOST /api/v2/tokens/{tokenAddress}/maturity-redemption/maturationsAuthorised governance operatorMove the token into post-maturity state after the configured maturity date.
Trigger early maturityPOST /api/v2/tokens/{tokenAddress}/maturity-redemption/early-maturationsAuthorised emergency operatorMove the token into post-maturity state before the configured maturity date. Use only under the programme's incident procedure.
Set treasuryPATCH /api/v2/tokens/{tokenAddress}/maturity-redemption/treasuryAuthorised governance operatorChange the treasury address used for future redemption payouts.
Top up treasuryPOST /api/v2/tokens/{tokenAddress}/maturity-redemption/top-upsAny funding walletTransfer denomination asset from the caller's wallet into the configured treasury.
Approve wallet-treasury allowancePOST /api/v2/tokens/{tokenAddress}/maturity-redemption/treasury-allowanceTreasury walletApprove the feature to pull denomination asset from a wallet treasury.
Redeem tokensPOST /api/v2/tokens/{tokenAddress}/maturity-redemption/redemptionsToken holderBurn the holder's tokens and pay denomination asset at face value.

Submit amounts in base units of the relevant token. For example, the redemption amount is the token amount to burn, and your allowance or top-up amount is the denomination-asset amount in its smallest unit.

Treasury readiness signals

Use GET /api/v2/tokens/{tokenAddress}/stats/bond-status before and after treasury operations. The response separates treasury balance, the ERC-20 allowance from treasury to the feature, treasury classification, feature address, and indexer status. Check both balance and allowance fields: a funded treasury can still fail wallet-treasury redemptions when approval is missing, and a valid approval does not guarantee funds. Each response field is explained below.

FieldMeaningOperator use
denominationAssetBalanceAvailableDenomination asset balance held by the configured treasuryConfirms whether the treasury has funds available for redemption
denominationAssetBalanceRequiredDenomination asset required to redeem the outstanding token supply at face valueSets the target balance for full coverage
coveredPercentageBalance coverage percentageShows balance readiness only, not allowance readiness
denominationAssetTreasuryAllowanceERC-20 allowance from treasury to the maturity-redemption featureShows whether a wallet treasury has authorised the feature to pull funds
allowanceCoveredPercentageAllowance coverage percentageShows whether allowance covers the required redemption volume
treasuryIsContracttrue for a contract treasury, false for a wallet treasury, null while classification is pendingDetermines whether wallet allowance applies
solvencyKnownWhether the indexer has computed the bond-status solvency rowDistinguishes real zero balances from a temporary unknown state
treasuryAddressCurrent maturity-redemption treasuryIdentifies the payout source
featureAddressMaturity-redemption feature contractIdentifies the spender for wallet allowance

These values are indexer-backed. A confirmed top-up, treasury change, allowance approval, or redemption can briefly show a stale value while the indexer catches up. Treat solvencyKnown: false as "coverage is not known yet", not as an empty treasury. Treat treasuryIsContract: null as a wait-and-retry state. In both cases, avoid sending approval or redeem requests that the API already knows may fail based on current state.

Holder redemption UX

A holder can see the redeem button when your connected wallet has a redeemable token balance and the wallet has the redeem permission. Before maturity, the button remains visible but disabled with a maturity-specific reason. After maturity, it can still be disabled by treasury or token state:

ConditionHolder-facing result
Token is not matureRedemption stays unavailable until the maturity transition has been triggered.
solvencyKnown is falseThe UI shows that treasury verification is still in progress.
Wallet treasury allowance is zeroThe UI explains that treasury allowance is insufficient.
Treasury balance is unavailable or emptyThe UI explains that treasury funds are missing.
Token is pausedRedemption is blocked by the paused token state.

The redemption request is POST /api/v2/tokens/{tokenAddress}/maturity-redemption/redemptions. The request supplies the token amount to redeem. The API resolves the feature address, checks wallet-treasury allowance when the treasury is a wallet, queues the redemption transaction, and returns the standard queued mutation response.

If a wallet treasury has only partial allowance, the UI can still open the redemption flow. The API calculates the payout for the requested amount and rejects the request when the allowance is below that payout. This keeps partial coverage honest: a small redemption may fit while a larger one does not.

As a first-time holder, the sequence is: wait until the issuer has triggered maturity, confirm the redeem route is available for your connected wallet, enter the token amount to redeem, and submit the queued transaction. The payout depends on the configured face value and the denomination asset, not on market price.

Failure modes and edge cases

Failure modeWhat happensRecovery path
Treasury balance is too lowRedemptions revert when the treasury cannot pay the requested payout. Early redeemers can be paid while later redeemers fail if funds run out.Top up the treasury and wait for bond-status values to update.
Wallet treasury allowance is too lowThe API rejects wallet-treasury redemptions when allowance is below the calculated payout.The treasury wallet approves enough allowance for the expected redemption volume.
Treasury classification is pendingThe approve and redeem routes reject the request until the indexer classifies the treasury.Wait for indexing to catch up and retry.
mature() is not called at the scheduled dateThe token remains in pre-maturity state and ordinary transfer behaviour continues.Trigger maturity through the authorised operator process.
mature() is called too earlyThe on-chain call reverts.Use matureEarly() only through the emergency role and process.
Face value is wrongRedemption economics use the configured face value.Redeploy or provide an external remediation path. The feature does not change face value after deployment.
Treasury address changesRedemption transactions use the treasury configured when the transaction executes, including transactions that were queued before the change.Pause redemption operations during treasury rotation, then verify funding, allowance, and classification before holders redeem.

Controls and guardrails

RoleCallGuardrail
GOVERNANCE_ROLEsetTreasury()Use multi-signature approval or equivalent governance, then verify funding and classification before holders redeem.
Treasury walletApprove denomination-asset allowance for the featureApprove enough allowance for the expected redemption volume. Use base units and only sign from the configured treasury wallet.
GOVERNANCE_ROLEmature()Trigger only when the configured maturity date has arrived. The chain rejects an early scheduled maturity call.
EMERGENCY_ROLEmatureEarly()Reserve for documented emergency procedures before the scheduled date. Once the scheduled date has arrived, use mature().

Auditability and operational signals

Maturity Redemption emits events when the token matures, matures early, redeems, or changes treasury. Use those events alongside the bond-status response to reconcile your records:

  • Matured(maturityDate, triggeredBy) records the scheduled maturity transition.
  • MaturedEarly(originalMaturityDate, actualMaturityDate, triggeredBy) records the emergency maturity transition.
  • Redeemed(holder, tokenAmount, payoutAmount) records each redemption.
  • TreasuryUpdated(sender, oldTreasury, newTreasury) records treasury changes.
  • ERC-20 Approval events from the treasury to the feature feed the allowance value used by bond-status monitoring.

Monitor balance coverage and allowance coverage together. Balance without allowance still blocks wallet-treasury redemptions. Allowance without funds does not enable payouts.

Dependencies

  • Denomination asset: the ERC-20 asset paid to holders on redemption. It must be deployed and accessible on the same EVM network as the token.
  • Treasury: a wallet or contract that holds denomination asset for redemption.
  • Operator process: an authorised process or user that calls mature() at the scheduled time.
  • Indexer: the bond-status response depends on indexed balance, allowance, treasury classification, and solvency state.

Compatibility and ordering notes

  • supportsRewriting = false: the feature does not rewrite transfer amounts.
  • Place this feature before fee features in your ordered list because it enforces the post-maturity transfer restriction.
  • Fixed Treasury Yield can be active on the same bond. Yield claims are pull-based and independent of the maturity state.
  • Compliance modules can block transfers before maturity. Maturity Redemption blocks ordinary transfers after maturity regardless of compliance outcome.
  • Forced recovery, forced transfer, mint, and burn flows have their own role controls. Treat post-maturity as a holder-redemption state, not a trading state.

Change impact

  • Enable at deployment with face value and maturity parameters.
  • Removing the feature before maturity removes the future redemption lifecycle.
  • Removing the feature after maturity stops transfer blocking and removes the redemption path. Do not remove it after maturity without a replacement redemption process in place.
  • Treasury changes affect future redemption calls.

See also

On this page