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.
Purpose: Fixed Treasury Yield distributes a fixed-rate yield to DALPAsset token holders at periodic intervals. Yield is calculated from historical balance snapshots at each interval end and paid from a denomination asset treasury. Holders pull (claim) their yield.
- 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. Yield is pull-based — holders claim their accumulated yield from a denomination asset treasury. Requires Historical Balances for snapshot-based calculation. The yield schedule (rate, start date, intervals, denomination asset) is configured at deployment and emits FixedTreasuryYieldScheduleSet — it is immutable post-activation and not included in the runtime capabilities below.
| Capability | Who can call | Inputs | On-chain effect | Emits | Notes |
|---|---|---|---|---|---|
| Claim accrued yield | Token holder | None (claims all completed periods) | Transfers denomination asset from treasury to holder | YieldClaimed | Pull-based; unclaimed yield stays in treasury |
| Set treasury address | GOVERNANCE_ROLE | Treasury address | Redirects future yield payouts | TreasuryUpdated | Fund new treasury before changing |
| Consume interest on conversion | Automatic (on burn/redeem) | Principal amount + context | Deducts accrued interest for conversion calculation | InterestConsumed | Only active when paired with Conversion |
| Close accrual on full exit | Automatic (hook on burn/redeem) | Triggered when holder balance reaches zero | Stops future yield accrual for holder | AccrualClosed | Prevents claims after full redemption |
Accrued yield, period schedule, current period, and unclaimed totals are available as read-only queries.
Business impact
- Holders: Periodic yield claimable proportional to balance at each interval snapshot. Holders who transfer tokens between intervals still receive yield for the fraction of the period they held.
- Issuer: Must maintain sufficient denomination asset in the treasury throughout the yield period. Yield obligations are fixed at configuration time.
- Economics: Pull-based — no automatic distribution. Unclaimed yield remains in treasury until claimed. Rate is fixed (in basis points) for the configured period.
Risks & abuse cases
- Underfunded treasury: If the treasury denomination asset balance falls below the total outstanding yield obligation, claimants who redeem late may find the treasury depleted.
- Large holding concentration: A single holder with a large % of supply can claim a disproportionate fraction of the treasury on first claim, leaving nothing for other holders.
- Unclaimed yield accumulates: Pull-based yield that is never claimed sits in the treasury indefinitely. Platforms should define an expiry policy for unclaimed yield.
- Rate configured but not funded: Yield rate can be set without treasury being funded. Off-chain monitoring must ensure treasury is funded before the yield period begins.
Controls & guardrails
| Role | Actions | Recommended guardrail |
|---|---|---|
GOVERNANCE_ROLE | setTreasury() — set denomination asset treasury address | Fund treasury before yield period starts; monitor balance continuously |
No on-chain rate freeze mechanism — rate is set at deployment and is part of the feature configuration. Governance should use time-locked multi-sig for any yield schedule changes.
Failure modes & edge cases
- Historical Balances not active: Fixed Treasury Yield cannot calculate yield without Historical Balances checkpoints. If Historical Balances is removed while yield is active, yield claims will fail.
- Yield period ended but unclaimed: Yield calculated from past intervals remains claimable until claimed. Platforms must handle long-tailed claim windows in their UX.
- Treasury address change mid-period: If
setTreasury()is called mid-period, future claims draw from the new treasury. Ensure new treasury is funded before changing. - Zero-balance holder at snapshot: Holders with zero balance at an interval snapshot receive zero yield for that interval regardless of balance at other times in the period.
Auditability & operational signals
FixedTreasuryYieldScheduleSet(startDate, endDate, rate, interval, periodEndTimestamps, denominationAsset, treasury)— emitted once at deployment when yield schedule is configured.YieldClaimed(holder, claimedAmount, fromPeriod, toPeriod, periodAmounts, periodYields, totalYieldPerPeriod)— emitted per claim. Primary signal for treasury drawdown tracking.TreasuryUpdated(sender, oldTreasury, newTreasury)— emitted on treasury address change.InterestConsumed(holder, amountWad, reason, consumedAt)— emitted when accrued interest is consumed for conversion calculation.AccrualClosed(holder, closedAt)— emitted when a holder's yield accrual is permanently closed (full exit).- Treasury denomination asset balance: monitor continuously; alert when balance falls below remaining yield obligations (calculated off-chain: rate × total supply × remaining intervals).
Dependencies
- Historical Balances feature — required. Must be active and ordered before Fixed Treasury Yield in the feature array.
- Denomination asset (ERC-20) — the asset paid as yield (e.g., USDC). Must be deployed and accessible.
- Treasury contract — must be funded with denomination asset before yield period starts.
Compatibility & ordering notes
supportsRewriting = false— pull-based, no hooks on transfers.- No hooks — does not run in the feature hook chain. Order in the feature array is irrelevant for this feature.
- Compatible with Maturity Redemption: both can be active simultaneously. Yield continues to accrue until maturity; post-maturity transfers are blocked but yield claims remain valid until claimed.
- Requires Historical Balances to be ordered last in the hook array (see Historical Balances ordering notes).
Change impact
- Enable after launch: Yield accrual starts from the configured
startDate. Past periods are not retroactively covered. - Disable mid-period: Existing claimable yield for completed intervals remains claimable; future intervals stop accruing. Treasury funds can be withdrawn.
- Treasury address change: Effective for all future claims. Ensure new treasury is funded.
- Rate change: Only possible before period starts (rate is immutable post-activation by design). For rate changes, deploy a new yield configuration.
See also
- Token Features Catalog — return to the full feature catalog
- Historical Balances — required dependency
- Maturity Redemption — compatible lifecycle feature for bonds
- Treasury Distribution — yield distribution flow
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.
Conversion
Convertible instrument pair for DALPAsset — Conversion (loan-side) and Conversion Minter (equity-side). Manages trigger types, executes holder-initiated and forced conversions, and coordinates cross-token burns and mints.