Appendix C · Asset IDs
TRN uses an integer asset id as the primary identifier inside the runtime. The EVM-side ERC-20 mirror is derived deterministically — see Appendix B.
| Asset | id | Symbol | Decimals (Substrate) | Decimals (EVM) | Notes |
|---|---|---|---|---|---|
| XRP | 2 | XRP | 6 | 18 | Native gas asset on TRN. Bridged 1:1 from XRPL. |
| ROOT | 1 | ROOT | 6 | 18 | Native staking + governance token. |
| SYLO | 3172 | SYLO | 18 | 18 | Sylo platform token. |
| ASTO | 4196 | ASTO | 18 | 18 | Altered State Machine token. |
| VTX | 3 | VTX | 6 | 18 | Vortex distribution voucher. |
| USDT | 1984 | USDT | 6 | 18 | Bridged Tether (Ethereum). |
Decimal asymmetry
EVM-side balances are scaled to 18 decimals for ERC-20 compatibility. Substrate-side balances use the asset's native decimals (6 for XRP/ROOT/VTX, 18 for SYLO/ASTO). When converting between the two, scale by 10^(18 - substrateDecimals).
How to verify
Asset ids and metadata can be queried with the assets pallet:
ts
const meta = await api.query.assets.metadata(2); // XRP
console.log(meta.symbol.toUtf8(), meta.decimals.toNumber());Or via the EVM ERC-20 mirror:
ts
import { erc20Abi, getContract } from 'viem';
const erc20 = getContract({ abi: erc20Abi, address: '0xCCCCCCCC00000000000000000000000000000002', client });
const symbol = await erc20.read.symbol();Asset ids cross-checked against the Rootscan token list and the
@therootnetwork/evm constants. Treat new assets as authoritative only after looking them up on Rootscan.