"BTC" or "ETH-PERP" to refer to assets. Instead, it uses an AssetIdentifier — a T+-specific value that uniquely identifies a tradeable asset on the exchange. Every order, market query, and inventory lookup requires a valid AssetIdentifier. Understanding the two accepted forms, and how to construct them correctly, is essential before placing any trades.
The Two Accepted Forms
Registry Index
An integer (or its string representation) that maps to an asset’s position in the T+ registry. This is the simplest form when you already know the index.
address@chain_id
An EVM token contract address paired with the T+ 9-byte chain ID. Used when you have an on-chain address and need to construct the identifier without knowing the registry index.
Registry Index
tplus assets list (see the CLI guide) or by querying the clearing engine. When the backend sends an asset identifier over the wire, it serialises both forms as plain strings ("200" or "<address>@<chain>").
address@chain_id
AssetIdentifier("BTC-PERP") or any ticker-style string will not work. T+ has no symbol namespace — always use an index or an address@chain_id string.Chain IDs: T+ 9-byte Format vs. Raw EVM Chain IDs
This is the most common source of errors when constructing asset identifiers manually. T+ uses its own 9-byte chain ID format (18 hex characters), not the raw integer chain ID you see in MetaMask or EVM tooling.Converting an EVM Chain ID
<routing_id:1B><vm_id:8B>. Hand-encoding this is error-prone — always use ChainID.evm() for EVM-compatible chains.
Advanced: from_parts
For non-EVM chains or custom routing configurations, use ChainID.from_parts:
Using AssetAddress.from_evm_address (recommended)
The simplest path for EVM assets is to let AssetAddress.from_evm_address handle the chain ID conversion entirely:
AssetAddress vs. ChainAddress
Both names refer to the same underlying type, but the choice of name signals semantic role at the call site:
AssetAddress
Use when the address refers to a tradeable asset — constructing an
AssetIdentifier, identifying tokens in settlement requests, or looking up decimals.ChainAddress
Use when the address refers to a non-asset chain-scoped entity — deposit vaults, the asset registry, the credential manager, or market-maker EOAs.
AssetAddress. If no (vault, registry, EOA), use ChainAddress.
Common Mistakes
Using a raw EVM chain ID in a string literal
Using a ticker symbol
Passing Asset Identifiers to Client Methods
MostOrderBookClient and MarketDataClient methods accept AssetIdentifier | str. Build the identifier once and pass the object through — don’t re-stringify it on every call: