Что такое конвертер decimals токенов?
Конвертер decimals токенов переводит между сырым целым числом, которое хранит контракт токена, и человекочитаемой суммой, которую показывает кошелёк, используя значение decimals токена: сумма = сырое ÷ 10decimals. Контракты ERC-20 и TRC-20 отдают его через decimals(); SPL-mint хранит его в mint-аккаунте. USDT и USDC используют 6, WBTC — 8, ETH-подобные токены — 18.
Распространённые decimals токенов
| Токен | Decimals | 1 токен как сырое целое |
|---|---|---|
| USDT (Ethereum, Tron, Solana, Polygon, Arbitrum) | 6 | 1 000 000 |
| USDC (все основные сети) | 6 | 1 000 000 |
| USDT в BNB Smart Chain (Binance-Peg) | 18 | 1 000 000 000 000 000 000 |
| WBTC, cbBTC | 8 | 100 000 000 |
| ETH, WETH, DAI, LINK, UNI, AAVE | 18 | 1 000 000 000 000 000 000 |
| SOL и большинство SPL-токенов | 9 | 1 000 000 000 |
| GUSD | 2 | 100 |
Как работает конвертация
сумма = сырое ÷ 10decimals и сырое = сумма × 10decimals. Подвох в точности: значения с 18 знаками превышают то, что может представить число с плавающей точкой, поэтому эта страница использует целые числа произвольной точности. Ввод большего числа знаков, чем поддерживает токен, отклоняется, потому что сеть не может представить такую сумму.
Пример
Событие ERC-20 Transfer показывает value = 2500000. Если токен — USDC (6 decimals), это 2.5 USDC. Если то же число пришло из перевода DAI (18 decimals), это было бы 0.0000000000025 DAI — пылевая сумма. В обратную сторону: чтобы отправить 0.0025 WBTC (8 decimals), аргумент transfer должен быть 0.0025 × 108 = 250 000, а для отправки 1 LINK (18 decimals) требуется 1 000 000 000 000 000 000.
Типичные ошибки
- Предположение, что всегда 18. Жёстко прописанное 1018 превращает платёж 100 USDC в 0.0000000001 USDC. Читайте
decimals()из контракта. - Доверие тикеру. Мостовые токены с тем же тикером могут иметь разные decimals в разных сетях. Проверяйте контракт, с которым реально взаимодействуете.
- Округление до умножения. Сначала переведите человекочитаемую сумму в сырое целое, затем считайте в целых числах; плавающая точка может дать 2499999.9999 вместо 2500000.
В коде
- ethers.js:
ethers.parseUnits("1.5", 6)→1500000n;ethers.formatUnits(1500000n, 6)→"1.5". - web3.py:
int(Decimal("1.5") * 10**6); избегайтеfloat. - Solana web3.js: суммы в
createTransferInstruction— сырые целые; умножайте на10 ** mint.decimalsс помощью BigInt.
Для нативных монет см. конвертер единиц Ethereum, конвертер сатоши, конвертер лампортов и конвертер sun.