Primcast
中文

RWA token

Each asset is represented by its own RWAToken, an ERC-20 security token in the style of ERC-3643. It carries the asset's investor rules, its payout machinery and the controls a regulated issuer needs.

Lifecycle

  1. Create. An approved issuer calls RWATokenFactory.createToken(config). The token is deployed as a beacon proxy and the issuer becomes its admin. Governance then registers it as a system contract.
  2. Fund. Units are minted to investors through an offering, or directly by the admin with mintFor, to eligible wallets only.
  3. Operate. The issuer distributes revenue as dividends and funds the redemption pool; holders claim, redeem and trade.
  4. Mature. Once maturityTime passes, anyone can call checkMaturity() to move the token to Matured. Ordinary transfers stop, units can still leave venues towards eligible holders, and redemptions continue.

Configuration

SettingMeaningChangeable later?
name, symbol, decimalsERC-20 metadata; symbols are unique across the factoryNo
assetClassA short tag such as solar, wind or storageNo
settlementTokenThe stablecoin for dividends, redemptions and offerings (must be allowlisted)No
requireKycEvery party must hold valid KYCNo
requireAccreditedReceivers must be accreditedYes, by the admin
allowedJurisdictionsJurisdictions receivers may be in (empty = any, including unknown)Yes
redemptionPriceSettlement units paid per 10^decimals token units (0 = redemption disabled)Yes
redemptionDelaySecondsNotice period between request and execution (capped)Yes
perHolderCapMaximum balance per holder (0 = unlimited)Yes
maturityTimeWhen the token matures (0 = perpetual)Yes
deviceIdsAssetHub devices producing this asset's revenueYes
metadataURIOffering documents and legal terms (IPFS or HTTPS)Yes

Holders should read "changeable later" carefully. The admin can lower the redemption price, move the maturity date, change the eligible jurisdictions and change the holder cap at any time with updateToken. The contract does not cap the supply either: the admin can mint more units to eligible wallets. Every change emits an event, but none requires holder consent.

Status

StatusTransfersMintsRedemption requestsDividends
ActiveAllowed (subject to rules)AllowedAllowedAllowed
PausedBlockedBlockedBlockedClaims still allowed
MaturedOnly out of venues, to eligible holdersBlockedAllowedAllowed

The admin can set any status at any time, including moving a matured token back to active. checkMaturity() is the permissionless path from Active to Matured.

Dividends

Revenue is paid with a per-unit accumulator, so the cost of a distribution does not depend on the number of holders.

  1. The issuer approves the token to pull settlement from the issuer's wallet (a standing allowance lets a keeper trigger distributions).
  2. distributeDividend(amount) pulls amount and adds amount × 10²⁷ / eligibleSupply to accDividendPerUnit.
  3. Each holder's claimable amount is balance × (accDividendPerUnit − holder checkpoint) / 10²⁷, plus anything already settled. It is updated automatically whenever their balance changes.
  4. Holders pull their share with claimDividends() whenever they like. Claims are subject to receiver compliance.

Eligible supply is total supply minus units escrowed for redemption and minus balances of venues that do not earn dividends. Rounding dust stays in dividendResidual, which the admin can sweep. It never touches holder entitlements.

Dividends are not guaranteed. They exist only when the issuer distributes. The chain guarantees that a distribution is shared pro rata and can be claimed; it cannot guarantee that the asset earns revenue or that the issuer passes it on.

Redemptions

  1. The holder calls requestRedemption(units). The units move into the token's escrow and stop earning dividends. The payout is fixed at request time: units × redemptionPrice / 10^decimals.
  2. After executeAfter (request time plus the notice period), anyone can call executeRedemption(id). The admin or governance may execute earlier.
  3. Execution pays the holder from the redemption pool and burns the escrowed units. If the pool is short, execution reverts until the issuer tops it up with fundRedemptionPool. Execution also applies the token's receiver rules to the holder, so a holder who has since lost eligibility (KYC, accreditation, jurisdiction, freeze) must regain it before being paid.
  4. The admin can cancel a pending request with a reason; the units return to the holder.

Each holder may have a limited number of pending requests (64 by default). Redemption requests are refused while the token is paused.

Issuer powers

PowerFunction
Mint to eligible walletsmintFor
Burn from any holder (clawback)burn
Forced transfer between holdersforceTransfer
Freeze / unfreeze a holder for this tokensetFrozen
Pause, resume or mature the tokensetStatus
Update terms (see the table above)updateToken
Approve venues and their dividend treatmentsetVenue, setVenueDividends
Distribute dividends, sweep dustdistributeDividend, sweepDividendResidual
Fund the pool, cancel requestsfundRedemptionPool, cancelRedemption

Governance holds every admin power as well, and can additionally replace the admin (setAdmin), change per-token parameters and upgrade all tokens through the beacon.

Device binding

A token lists the AssetHub devices behind its revenue. At creation, each device must exist, be active and be operated by the token's admin. Only governance can bind devices run by someone else. See AssetHub.

Events

Minted, Burned, ForceTransferred, FrozenSet, TokenStatusSet, TokenUpdated, VenueSet, VenueDividendsSet, DividendDistributed, DividendClaimed, PoolFunded, RedemptionRequested, RedemptionExecuted, RedemptionCancelled, plus standard ERC-20 events.