Evm Token Decimals

by affaan-mef648e01899bNo license275K starsListed Oct 8, 2026Updated Oct 8, 2026Repository updated 3 days ago

EVMチェーン全体でサイレントな小数点不一致バグを防ぐ。ランタイムでの小数点照会、チェーン対応キャッシング、ブリッジドトークンの精度ドリフト、ボット・ダッシュボード・DeFiツール向けの安全な正規化をカバーします。

Instructions onlySoftware Development
AI-generated overview

Guides developers in querying ERC-20 token decimals at runtime and normalizing balances safely across EVM chains.

What it does
This skill provides guidance and code patterns for reading ERC-20 token decimals at runtime instead of hardcoding them. It covers caching decimals by chain and token address, handling non-standard or bridged tokens defensively, and normalizing amounts to a consistent scale. Examples are given in Python, TypeScript, and Solidity, plus a command-line check.
When to use it
Use it when reading ERC-20 balances, computing fiat values from on-chain amounts, comparing token quantities across EVM chains, or handling bridged assets. It is aimed at portfolio trackers, bots, dashboards, and DeFi tools where decimal mismatches could silently distort values.
Requirements
The agent needs no special tools, but the examples reference Python with web3 and decimal, TypeScript with ethers, Solidity, and the cast command-line tool, along with RPC access to an EVM chain. No scripts are shipped.

EVMトークン小数点

サイレントな小数点不一致は、エラーを発生させることなく残高やUSD値が桁違いになる最も簡単な方法のひとつです。

使用するタイミング

  • Python、TypeScript、またはSolidityでERC-20残高を読み取る場合
  • オンチェーン残高から法定通貨の値を計算する場合
  • 複数のEVMチェーン間でトークン量を比較する場合
  • ブリッジされた資産を扱う場合
  • ポートフォリオトラッカー、ボット、またはアグリゲーターを構築する場合

仕組み

ステーブルコインが同じ小数点を使用していると仮定しないでください。ランタイムでdecimals()を照会し、(chain_id, token_address)でキャッシュし、値の計算には小数点安全な数学を使用します。

使用例

ランタイムで小数点を照会する

python
from decimal import Decimalfrom web3 import Web3
ERC20_ABI = [    {"name": "decimals", "type": "function", "inputs": [],     "outputs": [{"type": "uint8"}], "stateMutability": "view"},    {"name": "balanceOf", "type": "function",     "inputs": [{"name": "account", "type": "address"}],     "outputs": [{"type": "uint256"}], "stateMutability": "view"},]
def get_token_balance(w3: Web3, token_address: str, wallet: str) -> Decimal:    contract = w3.eth.contract(        address=Web3.to_checksum_address(token_address),        abi=ERC20_ABI,    )    decimals = contract.functions.decimals().call()    raw = contract.functions.balanceOf(Web3.to_checksum_address(wallet)).call()    return Decimal(raw) / Decimal(10 ** decimals)

シンボルが他の場所で通常6小数点を持つからといって1_000_000をハードコードしないでください。

チェーンとトークンでキャッシュする

python
from functools import lru_cache
@lru_cache(maxsize=512)def get_decimals(chain_id: int, token_address: str) -> int:    w3 = get_web3_for_chain(chain_id)    contract = w3.eth.contract(        address=Web3.to_checksum_address(token_address),        abi=ERC20_ABI,    )    return contract.functions.decimals().call()

特殊なトークンを防御的に処理する

python
try:    decimals = contract.functions.decimals().call()except Exception:    logging.warning(        "decimals() reverted on %s (chain %s), defaulting to 18",        token_address,        chain_id,    )    decimals = 18

フォールバックをログに記録して可視化しておく。古いまたは非標準トークンはまだ存在します。

SolidityでWAD(18小数点)に正規化する

solidity
interface IERC20Metadata {    function decimals() external view returns (uint8);}
function normalizeToWad(address token, uint256 amount) internal view returns (uint256) {    uint8 d = IERC20Metadata(token).decimals();    if (d == 18) return amount;    if (d < 18) return amount * 10 ** (18 - d);    return amount / 10 ** (d - 18);}

ethersを使ったTypeScript

typescript
import { Contract, formatUnits } from 'ethers';
const ERC20_ABI = [  'function decimals() view returns (uint8)',  'function balanceOf(address) view returns (uint256)',];
async function getBalance(provider: any, tokenAddress: string, wallet: string): Promise<string> {  const token = new Contract(tokenAddress, ERC20_ABI, provider);  const [decimals, raw] = await Promise.all([    token.decimals(),    token.balanceOf(wallet),  ]);  return formatUnits(raw, decimals);}

クイックなオンチェーン確認

bash
cast call <token_address> "decimals()(uint8)" --rpc-url <rpc>

ルール

  • 常にランタイムでdecimals()を照会する
  • シンボルではなく、チェーンとトークンアドレスでキャッシュする
  • floatではなくDecimal、BigInt、または同等の正確な数学を使用する
  • ブリッジングやラッパーの変更後は小数点を再照会する
  • 比較や価格計算の前に内部会計を一貫して正規化する

Source and attribution

Source:affaan-m/eccindocs/ja-JP/skills/evm-token-decimalsat commitef648e0

License: No license

Content belongs to its original authors. SourceWeft indexes it from a public repository.

Report or request removal