トークン小数桁数変換ツールとは
トークン小数桁数変換ツールは、トークンコントラクトが保存する生の整数と、ウォレットが表示する人間向けの金額との間を、トークンの decimals 値を使って変換します:金額 = 生の値 ÷ 10decimals。ERC-20とTRC-20のコントラクトは decimals() でこの値を公開し、SPLのミントはミントアカウントに保存しています。USDTとUSDCは6、WBTCは8、ETH系のトークンは18を使います。
主なトークンの小数桁数
| トークン | 小数桁数 | 1トークンの生の整数値 |
|---|---|---|
| USDT(Ethereum、Tron、Solana、Polygon、Arbitrum) | 6 | 1,000,000 |
| USDC(主要チェーンすべて) | 6 | 1,000,000 |
| BNB Smart Chain上のUSDT(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桁)なら2.5 USDCです。同じ数値がDAIの送金(小数18桁)から来たなら、0.0000000000025 DAIというダスト金額になります。逆方向では、0.0025 WBTC(小数8桁)を送るには transfer の引数を0.0025 × 108 = 250,000にする必要があり、1 LINK(小数18桁)を送るには1,000,000,000,000,000,000が必要です。
よくあるミス
- 18と決めつける。 1018をハードコードすると、100 USDCの支払いが0.0000000001 USDCになります。コントラクトから
decimals()を読み取ってください。 - シンボルを信用する。 同じティッカーのブリッジ済みトークンでも、チェーンによって小数桁数が異なることがあります。実際にやり取りするコントラクトを確認してください。
- 掛ける前に丸める。 まず表示金額を生の整数に変換し、その後の演算は整数で行ってください。浮動小数点では2500000ではなく2499999.9999になることがあります。
コードでは
- 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の金額は生の整数です。BigIntを使って10 ** mint.decimalsを掛けてください。
ネイティブコインについてはEthereum単位変換ツール、satoshi変換ツール、lamports変換ツール、sun変換ツールをご覧ください。