Transaction Fee
Per-transaction fee deducted from transfer amounts on every mint, burn, or transfer. Uses supportsRewriting to reduce the amount in-flight before compliance checks and recipient receipt.
Purpose: Transaction Fee deducts a per-transaction fee from every mint, burn, or transfer by rewriting the transfer amount in-flight. The recipient receives amount - fee; the fee goes to a configured recipient.
- 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 is a rewriting feature — it modifies the transfer amount in-flight, so the recipient receives the post-fee amount.
| Capability | Who can call | Inputs | On-chain effect | Emits | Notes |
|---|---|---|---|---|---|
| Deduct fee on operation | Automatic (hook) | Triggered on mint, burn, transfer | Rewrites amount; routes fee to recipient | TransactionFeeCollected | supportsRewriting = true |
| Set fee rates | GOVERNANCE_ROLE | Rates per operation type (mint, burn, transfer in bps) | Updates fee rate configuration | FeeRatesUpdated | Blocked after freeze |
| Set fee recipient | GOVERNANCE_ROLE | Recipient address | Redirects future fee collection | FeeRecipientUpdated | Effective immediately |
| Freeze fee rates | GOVERNANCE_ROLE | None | Permanently locks all rates | FeeRatesFrozen | Irreversible |
Business impact
- Holders: Net-based fee — holders receive less than the face amount of a transfer. Senders initiate transfers for gross amount; recipients receive net.
- Issuer / recipient: Fee collected in the token itself to configured
feeRecipient. - Economics: Deducted on every operation (mint, burn, transfer). Fee rates can differ per operation type.
Risks & abuse cases
- Compliance module ordering risk: Because
supportsRewriting = true, the amount is rewritten before compliance modules run their checks. A compliance module checking minimum transfer amounts will see the post-fee (reduced) amount. Coordinate fee rates and compliance thresholds. - Rate freeze timing: Leaving
freezeFeeRates()uncalled allows GOVERNANCE_ROLE to raise rates after deployment. Call at launch. - High-frequency fee accumulation: Platforms with high transaction volume should monitor fee recipient balance; unexpected recipient addresses can drain value.
Controls & guardrails
| Role | Actions | Recommended guardrail |
|---|---|---|
GOVERNANCE_ROLE | setFeeRates() — set fee rates per operation | Call freezeFeeRates() after launch |
GOVERNANCE_ROLE | setFeeRecipient() — set fee destination | Multi-sig; audit all changes |
GOVERNANCE_ROLE | freezeFeeRates() — lock rates permanently | Call at launch |
Failure modes & edge cases
- Zero-amount transfer after fee: If fee equals the full transfer amount, the recipient receives zero tokens and the fee recipient receives the full amount. No revert — check minimum transfer amounts in compliance modules.
- Fee on minting: Minting to a holder results in holder receiving
amount - mint_fee. If mint semantics require exact amounts, account for the fee in the mint call.
Auditability & operational signals
TransactionFeeCollected(from, to, amount, fee, recipient)— emitted per transaction. Use for reconciliation and monitoring.FeeRatesUpdated(sender, mintRate, burnRate, transferRate)— emitted on rate changes.FeeRatesFrozen(sender)— emitted once on freeze.
Dependencies
- No external ERC-20 required — fee paid in the token itself.
supportsRewriting = true— interacts with the amount-rewriting pipeline. Must run before analytics features.
Compatibility & ordering notes
- Must run before: Historical Balances, Voting Power (analytics hooks must see post-fee amounts).
- Compliance module interaction: Compliance checks receive the post-rewrite amount. If any module enforces minimum amounts, ensure thresholds account for maximum fee rates.
- Compatible with AUM Fee (both collect in-token; order doesn't matter between them, but both before analytics).
- Compatible with External Transaction Fee (two separate fee mechanisms; External runs after).
Change impact
- Enable after launch: Only applies to transactions from activation point forward.
- Disable: No retroactive effect. In-flight transactions complete at old rate.
- Rate change before freeze: Effective immediately on next transaction.
- Recipient change: Effective immediately for all future collections.
See also
- Token Features Catalog — return to the full feature catalog
- Transaction Fee Accounting — off-chain tracking alternative
- Compliance Modules — transfer-level enforcement layer
AUM Fee
Time-based management fee on DALPAsset. Accrues over time based on total supply and is collected by minting new tokens to the fee recipient — an inflationary mechanism.
Transaction Fee Accounting
Tracks per-transaction fees for off-chain reconciliation without collecting them on-chain. Emits events for invoicing and reporting workflows. No holder economic impact.