| 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.