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.
- Doc type: Reference
- What you'll find here: Business impact, risks, controls, failure modes, auditability, dependencies, and ordering notes
- Related:
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).
| Capability | Who can call | Inputs | On-chain effect | Emits | Notes |
|---|---|---|---|---|---|
| Trigger maturity | GOVERNANCE_ROLE | None | Transitions token to matured state | Matured | Only after maturity date; irreversible |
| Trigger early maturity | EMERGENCY_ROLE | None | Forces matured state before scheduled date | MaturedEarly | Emergency use only |
| Redeem tokens | Token holder | Amount to redeem | Burns tokens; transfers denomination asset from treasury | Redeemed | Only available post-maturity |
| Set treasury address | GOVERNANCE_ROLE | Treasury address | Redirects redemption payouts | TreasuryUpdated | Fund treasury before maturity |
| Block transfers post-maturity | Automatic (hook) | Triggered on every transfer attempt | Reverts non-redemption transfers | None (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 callmature()at any time, not just at the scheduled maturity date. Premature maturity blocks transfers unexpectedly. Use time-locked governance formature()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
| Role | Actions | Recommended guardrail |
|---|---|---|
GOVERNANCE_ROLE | setTreasury() — set denomination asset treasury address | Multi-sig; audit all changes; fund treasury before calling mature() |
GOVERNANCE_ROLE | mature() — transition to post-maturity state | Time-lock or multi-sig to prevent premature maturity |
EMERGENCY_ROLE | matureEarly() — emergency early maturity trigger | Emergency 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 callmature()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 whenmature()is called.MaturedEarly(triggeredBy, timestamp)— emitted whenmatureEarly()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 viacanUpdate()(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
- Token Features Catalog — return to the full feature catalog
- Fixed Treasury Yield — coupon payments compatible with maturity
- Compliance Modules — transfer enforcement layer
Permit
EIP-2612 gasless approvals for DALPAsset. Users sign approval messages off-chain; anyone can submit the signature on-chain to set an allowance without the holder paying gas.
Fixed Treasury Yield
Fixed-rate yield paid to token holders at periodic intervals from a treasury. Pull-based — holders claim their yield. Requires Historical Balances for snapshot-based yield calculation.