Skip to main content

Token features

How the sixteen documented token features reach a token, how to choose one, and why a feature operation is rejected, with one reference page per feature group.

Seventeen token features add behaviour to a token, such as paying a coupon, charging a fee, or converting a loan into equity, and this catalogue documents sixteen of them. A feature reaches a token through an instrument template or, after issuance, through a governance action. This page covers that route, how to choose a feature, and why an operation is rejected. Five reference pages hold one entry per feature, with its parameters, units and the roles that operate it. Instrument templates covers the template workflow, and composable token explains why a token's behaviour is built from features. The Platform API manages the same features programmatically.

An instrument template is a set of token features with their defaults, plus metadata fields and a compliance policy. You select a feature on the template's “Features” step, and issuing from that template installs it. After issuance, an account that holds the governance role attaches, detaches, rotates, or updates it. A token holds an ordered list of at most 32 features and runs them in list order: the template's order at issuance, and the end of the list for a feature attached later. The platform never sorts the list.

After issuance, the Console attaches twelve features from the “Attach a feature” list on a token's Features tab. Hold, voting power, permit, and supply delegate take no settings. Register lines, the feature behind Booked movements, is the one feature this catalogue does not document. It needs hold attached first and asks which moves an investor may request. Maturity redemption, dividend yield, interest yield, management fee, transaction fee, transaction fee accounting, and external transaction fee ask for their settings, which the sheet shows for review before the wallet step. The list leaves out a feature that is already attached, and interest yield on an asset type other than deposit or fund. Fixed treasury yield attaches from “Set yield schedule” on the token's yield page, and voting power also from the Governance wizard, which offers an inline attach when the token lacks it.

The menu on a feature's section on the same tab detaches every feature except conversion and the distribution waterfall, and replaces a feature that has settings. Conversion and the distribution waterfall reach a token through the platform only from a template at issuance, and neither the Console nor the Platform API attaches, detaches or rotates them. The Platform API attaches every other feature. On chain, the token's governance role can still replace the whole feature list, those two included. Each feature entry names the actions that exist after issuance and the role each one needs.

Every form that configures a feature, in the template's “Features” step, in structures, and at issuance, shows each parameter under its name and a sentence on what to enter, and opens the feature with its own summary line, the same sentence the feature's detail screen shows. The tables give the platform identifier wherever an API call takes it. The four fee features, fixed treasury yield, conversion, and the conversion minter have a second generation, a newer implementation of the feature contract, and their entries say how it differs. Each feature instance runs the implementation its feature factory points to, and the Console shows no generation badge.

Where a token's features come from.An instrument template has three parts: the token features with their defaults, the metadata fields an issuer fills in, and the compliance policy a new token starts with. Issue asset turns the template into a token. The token holds an ordered list of at most 32 features, which it runs in list order. The platform never sorts the list. After issuance, an account with the governance role can attach, detach, rotate, or update a feature. A later template edit does not reach a token that was already issued.Where a token's features come from.An instrument template has three parts: the token features with their defaults, the metadata fields an issuer fills in, and the compliance policy a new token starts with. Issue asset turns the template into a token. The token holds an ordered list of at most 32 features, which it runs in list order. The platform never sorts the list. After issuance, an account with the governance role can attach, detach, rotate, or update a feature. A later template edit does not reach a token that was already issued.

A template fixes the starting feature list, and after issuance only governance actions change the token's own list.

Feature reference pages

Each page covers one group of features and states, for every feature in it, the parameters, the units, and the actions after issuance.

  • Income features: dividend yield, interest yield, fixed treasury yield, maturity redemption, and the distribution waterfall.
  • Fee features: management fee, transaction fee, transaction fee accounting, and external transaction fee.
  • Conversion features: conversion and the conversion minter.
  • Permit: the permit feature and the Platform API routes that sign and relay a permit.
  • Balance, voting, hold and supply features: historical balances, voting power, hold, and supply delegate.

Choose the feature by what it does

Group the sixteen features by the job they do, then pick the one in that row that matches your requirement.

You need to
Features
The feature decides
Pay holders income or principal
How much a holder receives, from which treasury, and when
Charge or account for fees
Who pays, in which asset, and whether value moves
Convert one instrument into another
The price, the window, and which token is minted
Keep records and enable voting
Which balances can be read at a past time, and who holds vote weight
Approve or reserve units
Who can approve a spender by signature, and who can reserve units
Let a wallet or add-on mint and burn
Who may mint, who may burn, and up to what amount

Within the income row, the choice is how the amount is decided. Dividend yield pays an amount per share that the issuer declares each time, fixed from balances on a record date. Interest yield pays a rate that accrues on balances as time passes. Fixed treasury yield pays a fixed coupon for each period, on the balance held at the end of that period. Maturity redemption pays face value once, after maturity, in exchange for the token. The distribution waterfall decides no amount. It splits one pool across the share classes of an instrument, and each class's dividend yield then pays from its own part.

Within the fee row, the choice is who pays and what moves. One 100-token transfer shows the four behaviours side by side. The example uses a transaction fee of 2.5%, which is 250 basis points,, a flat external fee of 2.5 units of a second token, and a 1% yearly management fee that is collected separately.

On one 100-token transfer
Net: transaction feeGross: external transaction feeInflationary: Management feeTracking: transaction fee accounting
The receiver gets
97.5 tokens
100 tokens
100 tokens
100 tokens
The sender pays
100 tokens
100 tokens, plus 2.5 fee tokens
100 tokens
100 tokens
The fee is paid in
The same token, to the recipient
A second token, to the recipient
New tokens, minted to the recipient
Nothing moves
The fee depends on
A percentage of the amount
A fixed amount for each operation
Average supply and elapsed time
A percentage, recorded only
It dilutes holders
No
No
Yes
No
A holder must act
No
Hold fee tokens and approve the feature
No
No

The next table shows what each feature needs before it works, what it cannot sit beside, and whether it needs a token before issuance. A feature that needs a token before issuance makes the template row show “Needs a denomination asset” or “Needs a target token” on Issue asset until the tenant has that token. The Features step enforces the dependencies and the conflicts as you toggle: “Select Historical Balances first.” and “Conflicts with Transaction Fee Accounting.” are the messages it shows.

Feature
Needs
Cannot sit beside
Needs a token before issuance
A conversion minter on the target token, and an interest provider if interest converts
Yes: a denomination token and a target token
A conversion feature that is on its list of converters
No
Dividend yield and historical balances
Nothing
Yes: a payment token
Historical balances
Nothing
Yes: a denomination token
Nothing
Nothing
Yes: a fee token
Historical balances
Nothing
Yes: a denomination token
Nothing
Nothing
No
Nothing
Nothing
No
Historical balances
Nothing
Yes: a denomination token
Nothing
No
Nothing
Yes: a denomination token
Nothing
Nothing
No
Nothing
No
Nothing
Transaction fee accounting
No
Nothing
Transaction fee
No
Nothing (token governance needs it)
Nothing
No

When an operation is rejected

A rejection comes from one of three places: the template, the attach and detach API, or the token itself while it runs. A rejection reflects the rule and the state at that moment, so repeating the same call fails again until the condition changes.

The template's “Features” step blocks a feature that misses a dependency or conflicts with another one. Publishing checks both again, and issuing a token with the conflicting pair is rejected with DALP-0605.

An attach, detach, or rotate through the Platform API can be rejected for these reasons.

Reason
What it means
already-attached
The token already has the feature. A conflicting feature that is already attached gives the same reason, with a message that names it, and the refusal's conflictingFeatureName field carries the id of the feature to detach.
conversion-incompatible
The token's conversion uses MarkConverted, and you tried to attach or rotate interest yield or fixed treasury yield. A balance-based yield would keep paying on converted supply.
conversion-provider-unresolvable
The change would leave the conversion feature without exactly one interest provider: both yield features are attached and none is chosen, the chosen one is wrong, or the denominations differ.
dividends-outstanding
A detach or rotate of dividend yield while declared dividends are still unclaimed. Let holders claim, or reclaim the dividends, first.
Detach blocked by dependents
Another attached feature depends on the feature. The message lists them.
Detach blocked by open proposals
The token's governor has pending, active, or queued proposals, and the feature is voting power.
dependency-not-attached
An attach of a feature whose dependency is missing. The refusal lists the missing features, for example historical balances for a yield feature, or hold for register lines.
token-not-configurable
The token was issued without a feature list, as tokens of the original asset families are, so nothing can be attached.
start-date-in-future
An interest yield start date after the chain's next block. Leave it out or set it at or before that time.
payout-treasury-is-token
A yield or maturity redemption treasury that is a token contract.
fixed-yield-ends-after-maturity
A fixed treasury yield that would end after the attached maturity date, or a maturity date before the attached fixed treasury yield ends. Applies to attach only.
create-feature-would-revert
A simulation of the factory call from the submitting wallet reverted. The refusal names the contract error when it is known. Nothing was queued.
feature-not-found, stale-index
The feature is not attached, or the index lists a feature the token no longer carries on chain.
unchanged-address
A rotate whose configuration equals the current one, so it would land on the address already in use. A feature without settings, such as permit, always gives this.
not-replaceable
A rotate of register lines. Change its requestable kinds through the settings route instead.
name-mismatch
The body names a different feature from the path.
factory-not-found
The system has no factory registered for the feature.

At run time, a token or a feature reverts with an error that names the rule. These are the ones you meet most often.

Feature
Error
When it happens
Any feature with a governance action
UnauthorizedCaller (DALP-4331)
The caller lacks the governance role.
Maturity redemption
TransferBlockedAfterMaturity (DALP-1092)
A transfer or a mint after maturity.
Maturity redemption
InsufficientTreasuryBalance (DALP-1043)
Maturing, or redeeming, when the treasury cannot cover the payout.
Hold
AmountExceedsAvailable
A transfer, burn, or reservation above the available balance.
Conversion
CannotTransferConvertedTokens
MarkConverted: a transfer or burn of units already converted.
Conversion
ConversionMinterMissing, UnauthorizedConverter
The target token has no minter, or its minter does not list the conversion feature.
Conversion
ZeroTargetAmount
The target amount rounds down to zero.
Distribution waterfall
InsufficientAllocation
A class's payout exceeds its leg.
Distribution waterfall
UnauthorizedClass, PayoutAssetMismatch
The caller is not the class's dividend yield, or the payout is in another asset.
Distribution waterfall
UnboundDividend, ReferenceRequired
The claimed dividend was not bound by a funded distribution, or the call names none.
Distribution waterfall
WaterfallUnderfunded, AlreadyReleased
A release while the waterfall holds less than it owes, or of a leg already released.
Distribution waterfall
SplitChanged
The split changed between the preview and the confirm. Nothing moved.
Distribution waterfall
ClassNotBound
A class has no token bound.
Distribution waterfall
DistributionNettingLocked
A netting change after a distribution was funded under that priority row.
Distribution waterfall
UnknownPriorityRow
A netting change or read for a determination kind that has no priority row.
Transaction fee, transaction fee accounting
FeeRatesAreFrozen (DALP-1020)
A rate change after a freeze. Accounting also locks the recipient. The net fee does not.
Management fee
FeeRateIsFrozen (DALP-1019)
A rate or recipient change after a freeze.
External transaction fee
FeesAreFrozen (DALP-1024)
An amount, recipient, or token change after a freeze.
External transaction fee
ERC20InsufficientAllowance (DALP-1102)
The payer has not approved the feature to spend the fee token.
Transaction fee accounting
NoFeesToReconcile (DALP-1070)
Reconcile with a zero total.
Fixed treasury yield
NoYieldAvailable (DALP-4243)
A claim when no completed period has anything to pay.
Historical balances
QueryBeforeEnabled
A strict lookup for a time before the feature started.

Troubleshooting

A feature card says Select X first or Conflicts with X

The Features step shows “Select Historical Balances first.” when a feature needs another one, and “Conflicts with Transaction Fee Accounting.” when two selected features cannot sit on one token. Enable the named feature first. Turning a feature off also turns off every feature that depends on it, so the confirmation can remove more than the card you clicked.

A template shows Needs a denomination asset

Seven features need a token that already exists in the tenant: external transaction fee, maturity redemption, fixed treasury yield, dividend yield, interest yield, the distribution waterfall, and conversion. Any token satisfies the check, and conversion also needs a target token that has the conversion minter. Open the template's detail panel and issue the token it needs, or register an existing one, for example with “Issue a stablecoin” or “Register an existing stablecoin”, then return to Issue asset.

A coupon pays more than expected

The contract pays its stored rate once for each payment period. A schedule created through the Platform API with rateBasis set to per_period, or with no basis from either the request or its template, stores the rate as given, so 500 basis points with a daily interval pays 5% of face value every day. Also check the schedule length: with a per-period rate, a span that is not a whole number of intervals ends with a shorter period that still pays a full coupon. Fix the rate and the dates by detaching the feature and attaching a new schedule.

A transfer fails after maturity

After maturity every mint and every regular transfer reverts with TransferBlockedAfterMaturity. The matured state cannot be reset, and the block lasts while maturity redemption stays attached. Burns pass, so holders redeem. A custodian can still run a forced transfer, and an attached feature can still move units. Redeem the position, because retrying the transfer fails again.

A transfer fails on held units

A venue has reserved some of the holder's units, so the transfer is above the available balance and reverts with AmountExceedsAvailable. Units the custodian froze count the same way. Cancel the resting order on the venue to release the hold, or transfer no more than the available balance.

A waterfall class receives nothing

Check four causes. Distinct ordinary ranks are winner-take-all, so a class at a higher rank gets nothing in ordinary mode. The pool may not reach the class, and the preview then shows “Not reached”. A class with a leg but no supply on the record date, or a per-share rate that rounds to zero, gets no dividend, and its leg stays in the waterfall. Last, fund reverts with ClassNotBound until every class has a token.

An operation reverts on the fee token's allowance

An external transaction fee pulls the fee from the payer with an ERC-20 transfer, so the payer needs fee-token balance and an allowance for the feature contract. The payer is the account that receives a mint, or the sender of a transfer or a burn. The fee recipient is not exempt, so it needs the allowance when it pays.

A detached feature leaves a gap in its history

Historical balances records nothing while it is detached. A lookup for that period returns the last checkpoint written before the detach, so a dividend with a record date in the gap reads stale balances. The platform blocks the detach if the token has fixed treasury yield, dividend yield, interest yield, or the distribution waterfall. Remove dependent features before detaching historical balances.

Frequently asked questions

Can I add or remove a feature after issuance?

Yes for most features, with the governance role. Holders do not approve these changes: governance can attach a management fee that dilutes every holder, or a transaction fee on every transfer, to a token already in circulation. The Console attaches twelve features from the “Attach a feature” list on the Features tab: hold, voting power, permit, supply delegate, register lines, maturity redemption, dividend yield, interest yield, management fee, transaction fee, transaction fee accounting, and external transaction fee. It attaches fixed treasury yield from “Set yield schedule” on the yield page, which “View yield details” on the Features tab opens. The Platform API attaches those features, historical balances, and the conversion minter. Through the platform, conversion and the distribution waterfall reach a token only at issuance, and neither the Console nor the Platform API detaches them. A detach is blocked while another feature depends on the feature, while declared dividends are unclaimed, and, for voting power, while governance proposals are open. These settings change in place: fee rates and recipients, the fixed treasury yield and maturity redemption treasuries, the interest rate, and the conversion window. Any other setting needs a rotate, which replaces the feature with a new contract at the end of the list. The Console offers it as “Replace” in the section menu of a feature that has settings.

Does the order of features matter?

Yes, and the platform does not enforce an order. Features run in list order, so a mis-ordered list can change compliance, fee, and rewrite behaviour. The list follows the template at issuance. A feature attached later goes to the end, and a rotated feature moves to the end. The recommended order puts hold first, then restrictions, fees, external fee hooks and analytics, and the DALP Library places hold first on every template except Share-Class Mirror. Read the order from the token's getFeatures() list, since the API lists features alphabetically.

Is the fixed treasury yield rate annual?

In the Console's issuance form and its “Set yield schedule” action for this feature, yes. An asset on the standalone yield schedule takes its rate per period. You enter the rate per year and DALP converts it to the rate each period pays: 500 basis points a year on a semi-annual schedule pays 246.575 basis points every 180 days, and a shorter final period pays that prorated to its length. Through the Platform API, set rateBasis to annual for the same conversion. A request that leaves it out takes the basis its template states, which is annual for the DALP Library's fixed-income templates. With per_period, or with no basis stated anywhere, the API treats rate as the per-period rate, so 500 basis points on a daily schedule pays 5% of face value every day.

Do unclaimed dividends expire?

No. The claim deadline does not stop a claim. A holder can claim after the deadline until governance reclaims the dividend. Reclaiming releases the feature's liability, closes the dividend and moves no tokens, and a holder can no longer claim it after that. In a waterfall, the unclaimed amount stays in that class's leg. Once governance has reclaimed the dividend, an account with the governance role can release the leg, which returns the amount to the wallet that funded the distribution.

Does a template edit change issued tokens?

No. A template edit changes future issuance only. The token's own feature list lives on chain, and only governance actions on the token change it.

Was this page helpful?