Evm Token Decimals

作者 affaan-mef648e01899b無授權條款275K 個星標收錄於 2026年10月8日更新於 2026年10月8日儲存庫3 天前更新

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

AI 產生的概覽

指導開發者在執行時查詢 ERC-20 代幣小數位,並在各 EVM 鏈上安全地正規化餘額。

功能
這項技能提供指引與程式碼模式,用於在執行時讀取 ERC-20 代幣小數位,而不是將其寫死。內容涵蓋依鏈與代幣地址快取小數位、防禦性地處理非標準或跨鏈橋代幣,以及將金額正規化到一致精度。範例使用 Python、TypeScript 與 Solidity,並附上一種命令列檢查方式。
適用情境
適用於讀取 ERC-20 餘額、由鏈上金額計算法幣價值、跨 EVM 鏈比較代幣數量,或處理跨鏈橋資產等情境。它面向投資組合追蹤器、機器人、儀表板與 DeFi 工具,這些情境中小數位不一致可能無聲地扭曲數值。
執行需求
這項技能本身不需要特殊工具,但範例涉及 Python(web3、decimal)、TypeScript(ethers)、Solidity 以及 cast 命令列工具,並需要存取 EVM 鏈的 RPC。未隨附任何指令碼。

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、または同等の正確な数学を使用する
  • ブリッジングやラッパーの変更後は小数点を再照会する
  • 比較や価格計算の前に内部会計を一貫して正規化する

來源與署名

來源:affaan-m/ecc位於docs/ja-JP/skills/evm-token-decimals提交ef648e0

授權條款: 無授權條款

內容歸原作者所有。SourceWeft 從公開儲存庫中收錄這些內容。

檢舉或申請下架