RWA Index Token (iRAAC)¶
Overview¶
The RWAIndexToken (iRAAC) is the ERC-20 index token minted/burned by the RWA Vault to represent proportional ownership in the protocol’s RWA index. Transfers are standard ERC-20 moves except when either the sender or recipient is a swap pair address explicitly whitelisted by governance—then a swap fee/burn fee may apply (see “Swap-Aware Transfers” below).
Swap fee allow-list & current fee settings
- The protocol can enable swap fees for specific AMM pair addresses (allow-listed in
isSwapPair
). - Burn fee is currently set to
0
. - The swap fee is only used for permissionless DEXes where the protocol would otherwise miss fees. It is not enabled for fee-sharing venues (e.g., if the pool already charges protocol fees).
- Fees are subject to change—see the Parameters page for the latest values.
Purpose¶
- Provide a simple ERC-20 representation of the RWA index position managed by the Vault
- Support mint/burn hooks restricted to the Vault for controlled issuance/redemptions
- Make AMM trading safer for the protocol via optional, allow-listed swap-time fees on permissionless DEX pairs
- Enforce basic compliance controls (blacklist/registry) via
WithCompliance
Token Economics (High-Level)¶
- Mint/Burn: Only the Vault can mint/burn iRAAC to reflect deposits/withdrawals into the underlying RWA index.
-
Fees on Transfers:
-
Standard transfers: No fee.
-
Swap-aware transfers: If either
from
orto
is an allow-listed swap pair, iRAAC charges:- Swap fee (
swapFeeBP
) → sent tofeeCollector
- Burn fee (
burnFeeBP
) → permanently burned - Default settings:
burnFeeBP = 0
;swapFeeBP
may be 0 unless explicitly enabled for a given pair.
- Swap fee (
Design intent
The swap fee is a safety valve only for permissionless venues to prevent fee leakage and align external trading with protocol sustainability. If a venue (e.g., Curve) already takes fees that accrue to LPs/treasury, do not mark that pool as a swap pair.
Parameters¶
Governance controls a small set of parameters via the token owner (protocol multisig):
Parameter | Type | Who sets it | Notes |
---|---|---|---|
vault |
address |
Owner | Only this address can mint /burn |
feeCollector |
address |
Owner | Receives swap fees (if any) |
swapFeeBP |
uint256 (bp) |
Owner | Out of FEE_DENOM = 10_000 |
burnFeeBP |
uint256 (bp) |
Owner | Out of FEE_DENOM ; currently 0 |
isSwapPair[pair] |
bool |
Owner | Allow-lists AMM pairs where fees apply |
An event log is inherited from standard OZ ERC-20; parameter changes are visible on-chain via transactions to the setters below.
Early Beta
Fee knobs are conservative in early beta. Check the Parameters page for live values before relying on any figures here.
Swap-Aware Transfers¶
When transfer
or transferFrom
is called:
- If neither
from
norto
is an allow-listedisSwapPair
, iRAAC acts like a standard ERC-20 (no fee). - If either side is an allow-listed
isSwapPair
, the token computes:
feeAmount = amount * swapFeeBP / FEE_DENOM
burnAmount = amount * burnFeeBP / FEE_DENOM
rest = amount - feeAmount - burnAmount
burnAmount
is burned fromsender
feeAmount
is sent tofeeCollector
rest
is delivered torecipient
Do not allow-list fee-sharing pools
If a pool (e.g., a Curve pool) already levies swap fees that flow to LPs/treasury, do not mark it as a swapPair
. Double-charging would harm users and is not intended.
Current Swap-Fee-Enabled Pairs¶
The table below lists AMM pairs currently allow-listed for swap fees. If a network section is empty, no swap fee is presently enforced on that network.
Ethereum Mainnet¶
AMM / Pair | Pair Address | Notes |
---|---|---|
— | — | (none at this time) |
Testnets (e.g., Sepolia)¶
AMM / Pair | Pair Address | Notes |
---|---|---|
— | — | (none at this time) |
Other Networks¶
Chain | AMM / Pair | Pair Address | Notes |
---|---|---|---|
— | — | — | (none at this time) |
To update this list, add/remove entries via
setSwapPair(pair, enabled)
and keep this doc in sync.
Key Functions¶
Function | Description | Access |
---|---|---|
mint(to, amount) |
Mint iRAAC to to |
onlyVault |
burn(from, amount) |
Burn iRAAC from from |
onlyVault |
transfer(to, amount) |
ERC-20 transfer; applies fees if swap-aware | Any |
transferFrom(from, to, amount) |
ERC-20 transferFrom; applies fees if swap-aware | Any |
setVault(vault) |
Set the Vault address | onlyOwner |
setFeeCollector(feeCollector) |
Set fee receiver | onlyOwner |
setFees(swapFeeBP, burnFeeBP) |
Update fee basis points | onlyOwner |
setSwapPair(pair, enabled) |
Allow-/disallow pair for fees | onlyOwner |
Implementation Details¶
- Standards & libs: OpenZeppelin
ERC20
,Ownable
- Fee math: Denominator
FEE_DENOM = 10_000
(basis points) -
Storage:
-
vault
,feeCollector
swapFeeBP
,burnFeeBP
isSwapPair[address]
mapping- Transfer path: Unified
_swapAwareTransfer
enforces compliance + optional fees
Interactions¶
- RWA Vault — sole minter/burner of iRAAC based on underlying index accounting
- FeeCollector — receives swap fees when swap-aware path is triggered
- Compliance Registry — consulted by
WithCompliance
for blacklist checks - AMM Pairs — only pairs explicitly allow-listed incur swap-time fees
Notes¶
- Swap fee allow-list is opt-in and pair-specific. If the protocol integrates with a venue that already shares fees back (e.g., Curve), do not enable swap fees here.
- Burn fee is currently
0
. - For the latest live parameters, always refer to the Parameters page in the docs.