Non-EVM Standards
Polkadot Asset Hub Parachain
Learn how Polkadot Asset Hub enables native asset issuance and cross-chain transfers within the Polkadot ecosystem.
Polkadot Asset Hub Parachain (RWA), the system parachain on Polkadot's relay chain ecosystem, defines a Substrate-based framework for asset issuance and management using the Assets pallet, enabling compliant tokenization of real-world assets with interoperability across parachains. For Real World Asset (RWA) protocols, this standard is especially valuable, as tokens can express fractional claims on tokenized commodities, real estate, equities, or other off-chain collateral while maintaining a compliant, interoperable interface for minting, transfers, teleports, and reserves with built-in XCM (Cross-Consensus Message) for cross-chain flows.
Before Asset Hub (launched in 2023 as Statemint, rebranded in 2024), Polkadot RWA projects relied on custom parachain pallets or EVM layers, leading to fragmented compliance, inconsistent teleportation, and scalability silos. Asset Hub resolved this by centralizing asset operations on a dedicated parachain, leveraging Substrate's Assets pallet for fungible tokens and Uniques for NFTs, with RWA extensions via orml-tokens and governance for upgrades. For RWA builders, the standard provides a scalable abstraction layer supporting off-chain oracles for KYC, XCM for cross-chain settlements, and asynchronous reserves, while enabling seamless composability with DeFi protocols like Acala or Centrifuge. As of late 2025, it powers $2B+ in tokenized value, including Centrifuge's $1.5B+ in RWAs bridged to Asset Hub for liquidity.
A key design principle is parachain-centric extensibility, where tokens expose standardized Substrate APIs augmented by pallet hooks without exposing internal runtime logic. This is well suited to RWA tokens where transfers may depend on off-chain governance or oracle data, yet integrators like wallets or aggregators still need reliable, auditable operations.
Use of Asset Hub Parachain (RWA) in RWA Contexts
Asset Hub Parachain (RWA) is the foundational standard for RWA tokens on Polkadot because it abstracts the complexity of tokenizing and managing real-world assets into a Substrate-pallet framework. While traditional DeFi tokens use Assets pallet for unrestricted teleports, RWA tokens adapt the model to illiquid, regulated assets, tokenized private credit, commercial real estate, commodities, or bond portfolios, where on-chain tokens represent legally backed off-chain value held by custodians or SPVs.
Key Applications in RWA Development
Fractional Ownership and Liquidity Provision
Many RWAs are high-value and indivisible (for example, a ten-million-dollar property or a portfolio of invoices). Asset Hub allows developers to mint fungible assets proportional to deposits, unlocking fractional ownership and secondary-market liquidity under compliance rules.
- Implement
assets.createwith reserve keys to cap issuance, linking metadata to off-chain deeds. - Tokens can teleport freely via XCM to DEXs like Hydration, offering liquidity for assets that would otherwise be locked for years.
- Example: An invoice token where compliance pallet restricts ownership to verified holders, with fractions for diversified credit pools.
Yield Accrual and NAV Management
Reserve and admin keys automate revenue distribution (e.g., interest from credit tokens), with XCM queries to oracles (e.g., Pyth) for real-time NAV updates. This supports auto-accrual without manual interventions, ideal for tokenized bonds or funds.
Using trusted sources (Pyth, Switchboard) ensures accurate reserves, critical for compliance and for investor teleports. Regulators increasingly expect transparent audit trails, and Asset Hub provides this without exposing internal pallet state.
Redemption and Settlement Mechanics
RWA redemptions are inherently asynchronous, as physical settlement layers (banks, custodians, transfer agents) cannot finalize instantly.
Patterns include:
assets.burnwith reserve for queued claims.- Compliance hooks for invalid teleports.
- Tx memos for signed proofs.
- Proof-of-reserve checks before fulfillment.
Composability Across the RWA Stack
Asset Hub tokens plug directly into Polkadot DeFi:
- Centrifuge accepts tokens as collateral within compliance restrictions.
- Hydration pairs can provide deep secondary liquidity for permitted teleports.
- Aggregators (e.g., Talisman) route into Asset Hub natively.
For regulated RWAs:
- Pair with compliance pallets for investor eligibility gating.
- Combine with XCM for modular settlements.
- Integrate identity proofs via admin keys.
This drastically reduces integration complexity, for example, a tokenized commodity asset can list across lending markets without custom adapters.
Developer Advantages in RWA Builds
- Regulatory Alignment: Native pallets and metadata hide off-chain custodian processes while preserving accurate reserves for MiFID II/MiCA-aligned disclosures.
- Extensibility: Substrate hooks and orml-tokens allow injecting RWA-specific logic i.e., pricing oracles, geofencing, or IPFS-pinned compliance policies.
- Risk Isolation: Tokens remain fully runtime compliant, burns do not impact wallet-held balances outside reserves.
- Upgrade Path: Polkadot's agile governance migrates via runtime upgrades, preserving TVL and simplifying audits.
To visualize the end-to-end flow in an RWA token, the following sequence diagram captures the typical create - transfer - burn cycle. It illustrates how users interact with the Asset Hub runtime, how pallets interact with admins and oracles, and how off-chain compliance updates flow back on-chain through txns or memos. This representation is especially important for understanding asynchronous teleports, delayed settlements, and pallet-driven compliance in RWA systems.
This diagram highlights how Asset Hub acts as the connective tissue between on-chain asset operations and off-chain asset realities. Creations embed reserves proportional to supply, pallets capture real-world compliance as transfers execute, and burn functions help manage revocations during disputes. For illiquid RWA portfolios, the model can be extended with explicit compliance pallets between the runtime (A) and the custodian or SPV (C) to handle delayed settlement cycles.
Core Specification
An Asset Hub RWA token must implement the Assets pallet interface for its fungible structure, the reserved representation of a user’s proportional claim on the underlying asset. Optional orml-tokens enhance for multi-asset, a valuable enhancement for RWA use cases where institutions manage reserves without needing full custom runtimes.
In Asset Hub (RWA), the asset behaves like any Substrate token (balance queries, total supply, transfers), while asset_id refers to pallet instances for asset management. The specification enforces a clean separation between base assets and reserve params, ensuring predictable operations and seamless integration across Polkadot and RWA systems.
Key Definitions
- Asset ID: The u32 identifier for the asset class, e.g., a tokenized invoice or real estate share.
- Account: The holder's address, extensible for frozen states or memos.
- Total Supply: The aggregate asset value managed by the pallet, equal to the sum of principal, reserved amounts, and adjustments for fees or losses.
- Control Params: (e.g., Admin, Freezer) Provide idealized, rule-agnostic behaviors for UI, analytics, and oracle integrations. They represent the regulatory relationship between base assets and enforced logic.
- Extrinsic Functions: (e.g., create, transfer) Provide near-exact estimates of expected outcomes, reflecting params, rounding, or NAV changes, without executing state updates. These enable accurate transaction planning.
- Rounding Rules: Asset Hub mandates rounding in favor of the asset:
- Round down when issuing units or deductions, preventing dilution.
- Round up when applying freezes or requirements, protecting existing participants. These rules ensure fair distribution and discourage precision-based attacks.
Asset Hub defines core extrinsics with 15+ params, organized by their roles in creation, management, and transfers. Every asset is created via a single extrinsic, ensuring a single source of truth for behavior and movements. Below is the Rust-equivalent interface via substrate-api-client, accompanied by developer notes covering edge cases, rounding behavior, and considerations specific to RWA tokens such as asynchronous params and oracle-driven updates.
1use substrate_api_client::{Api, compose_extrinsic, XtStatus};
2use sp_keyring::AccountKeyring;
3use sp_runtime::MultiAddress;
4use pallet_assets::{self as assets};
5
6// Client setup
7let url = "wss://asset-hub-polkadot-rpc.polkadot.io";
8let api = Api::new(url).unwrap();
9let signer = AccountKeyring::Alice.pair();
10
11// Core Asset Creation
12let create_call = assets::Call::create {
13 id: 1u32, // Asset ID
14 admin: MultiAddress::Id(AccountKeyring::Alice.to_account_id()),
15 min_balance: 1u128,
16};
17let xt = compose_extrinsic!(api.clone(), "Assets", create_call);
18let _ = api.send_extrinsic(xt.hex_encode(), XtStatus::InBlock).unwrap();
19
20// Deposit (Mint)
21let deposit_call = assets::Call::mint {
22 id: 1u32,
23 beneficiary: MultiAddress::Id(AccountKeyring::Bob.to_account_id()),
24 amount: 1000u128,
25};
26let xt = compose_extrinsic!(api.clone(), "Assets", deposit_call);
27let _ = api.send_extrinsic(xt.hex_encode(), XtStatus::InBlock).unwrap();
28
29// Transfer
30let transfer_call = assets::Call::transfer {
31 id: 1u32,
32 target: MultiAddress::Id(AccountKeyring::Bob.to_account_id()),
33 amount: 500u128,
34};
35let xt = compose_extrinsic!(api.clone(), "Assets", transfer_call);
36let _ = api.send_extrinsic(xt.hex_encode(), XtStatus::InBlock).unwrap();
37
38// Burn (Withdraw)
39let withdraw_call = assets::Call::burn {
40 id: 1u32,
41 who: MultiAddress::Id(AccountKeyring::Bob.to_account_id()),
42 amount: 200u128,
43};
44let xt = compose_extrinsic!(api.clone(), "Assets", withdraw_call);
45let _ = api.send_extrinsic(xt.hex_encode(), XtStatus::InBlock).unwrap();
46
47// Freeze
48let freeze_call = assets::Call::freeze {
49 id: 1u32,
50 who: MultiAddress::Id(AccountKeyring::Bob.to_account_id()),
51};
52let xt = compose_extrinsic!(api.clone(), "Assets", freeze_call);
53let _ = api.send_extrinsic(xt.hex_encode(), XtStatus::InBlock).unwrap();
Detailed Function Breakdown (with RWA Developer Notes)
Below is an extrinsic-by-extrinsic explanation of the Asset Hub interface, including edge cases, rounding behavior, and RWA-specific implementation guidance for regulated assets, off-chain settlement, and param-driven validation.
create
Creates the asset class with admin and min_balance.
- RWA Integration: For compliance-based assets, prepend oracle check (Pyth / oracles) in custom pallet.
- Edge Case: Must handle duplicate IDs (revert: AssetAlreadyExists).
mint / burn
Increases/decreases supply to/from beneficiary with issuer param.
- Formula: u128 math with rounding down.
- Usage: UI quoting, risk dashboards.
- RWA Note: Reflects pure regulatory mint, does not account for settlement delays or custody fees.
transfer
Moves amount from caller to target.
- Ensures no precision-based arbitrage.
- RWA Note: Useful for compliant trades in regulated markets.
freeze / thaw
Toggles frozen state for account with freezer param.
- Return false for “invalid.”
- RWA Note: Enforce investor halts, jurisdiction restrictions, or temporary pauses due to regulatory flags.
set_metadata (Extrinsic)
Sets name/symbol/decimals for asset.
- Discrepancies vs create reveal metadata impact.
- RWA Note: Useful for quote generation in dynamic vaults or those with evolving fees.
destroy (Extrinsic)
Removes asset if supply zero.
- Requires prior admin check.
- Includes errors for non-empty (e.g., AssetInUse).
- RWA Note:
- For illiquid assets (such as real estate and commodities): pair with burn asynchronous resolutions.
- Trigger oracle checks for sanctions/residency validation.
Reference Implementation
Polkadot-js’s Asset Hub offers a mature, security-audited foundation for building pallet tokens via Rust. The runtime integrates with Chainweb, providing a clean extrinsic surface for RWA-specific logic. Its design encourages minimal calls while still supporting custom param models, metadata links, control layers, and oracle integration.
Key capabilities include:
- Inflation Attack Protection: The implementation prevents dilution by enforcing param min_balance and admin checks. Early creators cannot exploit low-supply corner cases to extract excess value.
- Rounding Compliance: All extrinsics use u128 arithmetic for precise, deterministic operations that adhere to Asset Hub requirements of rounding in favor of the asset. This eliminates subtle precision-drift exploits.
- Extensible Params: Lifecycle extrinsics such as freeze allow developers to embed RWA-specific functionality, NAV oracle checks, compliance gating, settlement status validation, or fee accounting, without modifying core logic.
- Flexible Structure: Asset Hub builds on Substrate’s base, with optional orml wrappers for regulated administration. This makes it straightforward to integrate custodial controls, upgrade pathways, or param-gated operations required in regulated RWA environments.
1use pallet_assets::Config for Runtime;
2use frame_support::parameter_types;
3
4parameter_types! {
5 pub const AssetDeposit: Balance = 100 * DOT;
6}
7
8impl pallet_assets::Config for Runtime {
9 type RuntimeEvent = RuntimeEvent;
10 type Balance = u128;
11 type AssetId = u32;
12 type Currency = Balances;
13 type ForceOrigin = EnsureRoot<AccountId>;
14 type AssetDeposit = AssetDeposit;
15 type AssetAccountDeposit = ConstU128<10 * DOT>;
16 type MetadataDepositBase = ConstU128<DOT>;
17 type MetadataDepositPerByte = ConstU128<DOT / 10>;
18 type ApprovalDeposit = ConstU128<DOT / 10>;
19 type StringLimit = ConstU32<50>;
20 type Freezer = ();
21 type Extra = ();
22 type CallbackHandle = ();
23 type WeightInfo = ();
24 type RemoveItemsLimit = ConstU32<1000>;
25}
- The create pins params at runtime. For RWA tokens, prefer custom pallets and link metadata to IPFS for provenance.
- Accounts can be extended for multi-asset in UIs.
Create Flow (Admin-Facing)
Admin-level extrinsics call runtime with params.
1// As above in create_call
2// Pre-create: Param validation in runtime
- Use compose_extrinsic for fee optimization.
- Override pre-create to add compliance checks (KYC, caps) and revert early if param fails.
- For illiquid or async-backed assets, combine create with provisional supply and oracle finalization to avoid over-issuance.
Transfer Flow
Symmetric to create, transfer requires deposit then updates balances.
1// As in transfer_call
2// Pre-transfer: Check frozen via query
3let balance = api.call(assets::Pallet::balance(1u32, Alice.to_account_id())).unwrap();
4if balance == 0 { panic!("Insufficient"); }
- Deposit-first follows checks-effects-interactions and reduces reentrancy risk (though runtime-atomic).
- For queued transfers, implement XCM messages for status and push into a compliance queue.
- Add transfer limits via custom pallets.
Burn Flow
Default burns are issuer-gated; RWA overrides query reasons.
1// As in withdraw_call
2// Pre-burn: Oracle query for justification
3// e.g., via Pyth for compliance flag
- Burn uses amount for precision.
- Consider a time-bound param for revocations.
Adding Freeze (Example: Compliance Halt)
Freeze handling keeps execution consistent.
1let freeze_call = assets::Call::freeze_account {
2 id: 1u32,
3 who: MultiAddress::Id(Bob.to_account_id()),
4};
5let xt = compose_extrinsic!(api.clone(), "Assets", freeze_call);
6let _ = api.send_extrinsic(xt.hex_encode(), XtStatus::InBlock).unwrap();
- Keep freeze accounting transparent: Use memos for events and track via Subscan API.
- For RWA products, freezes may address regulatory events, document in metadata.

