Token / Chain | Standard Decimals | Authoritative Source |
---|---|---|
USDC | 6 | https://developers.circle.com/stablecoins/quickstart-transfer-10-usdc-on-chain |
USDT (Ethereum) | 6 | https://etherscan.io/address/0xdac17f958d2ee523a2206206994597c13d831ec7#code |
Toncoin (TON) | 9 | https://docs.ton.org/v3/guidelines/dapps/cookbook |
Bitcoin (BTC) | 8 | https://developer.bitcoin.org/glossary.html#satoshis |
Ether & most ERC-20s | 18 | https://docs.openzeppelin.com/contracts/5.x/erc20 |
ERC-20 spec | variable | https://eips.ethereum.org/EIPS/eip-20 |
Solana (SOL) | 9 | https://docs.solana.com/terminology#lamport |
decimals
field actually represent?
It defines how many base units compose one token
unit.
If decimals = 18
, an on-chain integer of
1_000_000_000_000_000_000
equals
1 token.
https://docs.openzeppelin.com/contracts/5.x/erc20
Circle chose 6 to mirror fiat “cents” UX and keep
raw numbers small; every official USDC contract on every chain
follows this.
https://developers.circle.com/stablecoins/quickstart-transfer-10-usdc-on-chain
Any 18-decimal variant is a bridged / wrapped token
(e.g., Binance-Peg).
Always call the contract’s own decimals()
before
scaling.
https://developers.circle.com/stablecoins/quickstart-transfer-10-usdc-on-chain
The canonical Ethereum USDT contract locks
_decimals = 6
.
18-decimal versions are redeployed bridge tokens; verify each
chain’s contract.
https://etherscan.io/address/0xdac17f958d2ee523a2206206994597c13d831ec7#code
No. decimals
is an immutable constant in the
bytecode.
Changing precision requires a brand-new contract.
https://eips.ethereum.org/EIPS/eip-20
A satoshi –
1 BTC = 100 000 000 satoshis
, i.e. 8 decimals.
https://developer.bitcoin.org/glossary.html#satoshis
Toncoin uses 9 decimals (1 TON = 1 000 000 000 nanoTON
).
Most Jettons follow the same rule unless explicitly configured
(e.g., 6 for TON-USDT).
https://docs.ton.org/v3/guidelines/dapps/cookbook
Solana’s smallest unit is a lamport;
1 SOL = 1 000 000 000 lamports
(9 decimals).
https://docs.solana.com/terminology#lamport
Use human = raw / 10**decimals
.
For user input, multiply back (raw = human * 10**decimals
).
Employ arbitrary-precision libraries—never JS
Number
for big values.
https://docs.openzeppelin.com/contracts/5.x/erc20
decimals
mandatory in the ERC-20 standard?
No. It’s an optional function in EIP-20; clients
must not assume it exists.
https://eips.ethereum.org/EIPS/eip-20
Tip for developers: cache each token’s
decimals()
value per network, and always verify bridged
or wrapped assets individually to avoid scaling errors.