Currencies & Units
Why every amount-bearing operation on this node takes decimals explicitly, and never assumes 18
1,000,000,000,000,000,000,000 instead of 1,000,000,000 — off by a factor of a
trillion. This is why decimals is a required field on every conversion operation this node offers,
with no default.
Known Currencies
These are the currencies this integration recognizes by symbol (used for reference/UI purposes — see the note below on how operations actually consume decimals):
| Symbol | Name | Decimals |
|---|---|---|
CFG | Centrifuge | 18 |
AIR | Altair | 18 |
USDC | USD Coin | 6 |
USDT | Tether USD | 6 |
DAI | Dai Stablecoin | 18 |
FRAX | Frax | 18 |
wETH | Wrapped Ether | 18 |
GLMR | Glimmer | 18 |
Native Tokens vs. Pool Currencies
CFG and AIR are the native tokens of the centrifuge and
altair networks respectively — their decimals (18 for both) are fixed per network and returned as
part of each network's descriptor (see Networks). Pool currencies
(USDC, USDT, DAI, FRAX, wETH, GLMR) are the stablecoins and bridged assets that Centrifuge's real-world-asset pools
are actually denominated in — a pool's repayments, NAV, and tranche values are in whatever currency that specific
pool was configured with, not in CFG.
utility.convertUnits and
utility.convertRate take decimals directly as a config field — they do not accept a
currency symbol and resolve decimals for you. The caller (or the workflow author) is responsible for supplying
the right value for whichever currency the amount is actually denominated in. See
Roadmap for a planned currency-symbol convenience.
Base Units vs. Display Units
| Term | Accepted spellings | Meaning |
|---|---|---|
| Base units | base, planck, baseunits | The smallest indivisible on-chain unit — what account.getBalance returns and what an extrinsic amount is denominated in. |
| Display units | display | Whole tokens with a decimal fraction — what a human reads (e.g. "2.5 CFG"). |
Converting requires a decimals value in both directions: display → base multiplies by
10decimals (truncating any excess fraction); base → display divides by the same factor and trims
trailing fractional zeros, returning plain "0" for a zero amount rather than "0.000…0".
CentrifugeCurrencies.TryResolve(symbol)
returns null for a symbol it doesn't recognize — callers must treat that as a reason to stop, not a
reason to guess 18. The same philosophy runs through every conversion operation on this node.