Now liveThe Skillselion MCP - thousands of ranked skills, loaded into your agent mid-task. No install.Get it →
affaan-m avatar

Evm Token Decimals

  • 1.4k installs
  • 238k repo stars
  • Updated August 5, 2026
  • affaan-m/ecc

This is a copy of evm-token-decimals by affaan-m - installs and ranking accrue to the original listing.

evm-token-decimals is a Web3 backend skill at version 1.0.0 that prevents silent ERC-20 decimal-mismatch bugs for developers reading balances or computing fiat values across multiple EVM chains and bridged tokens.

About

evm-token-decimals is an ECC skill at version 1.0.0 that stops silent decimal-mismatch bugs where ERC-20 balances or USD values appear correct but are wrong by orders of magnitude. The skill queries decimals() at runtime, caches results by chain_id and token_address, and applies decimal-safe math in Python, TypeScript, or Solidity. Developers reach for evm-token-decimals when reading on-chain balances, computing fiat values, comparing token amounts across EVM chains, or handling bridged assets in portfolio trackers, bots, and DeFi aggregators. The workflow never assumes stablecoins share the same decimals and covers bridged token precision drift. Runtime inspection plus cached chain-aware normalization is the core pattern.

  • Runtime decimals() lookup instead of hardcoded assumptions
  • Chain-aware caching by (chain_id, token_address) pair
  • Safe normalization for bridged tokens and precision drift
  • Decimal-safe math helpers for portfolio trackers, bots, and dashboards
  • Ready-to-use Python + web3.py and TypeScript patterns

Evm Token Decimals by the numbers

  • 1,361 all-time installs (skills.sh)
  • +84 installs in the week ending Aug 5, 2026 (Skillselion tracking)
  • Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/affaan-m/ecc --skill evm-token-decimals

Add your badge

Show developers this skill is listed on Skillselion. Paste this into your README.

Listed on Skillselion
Installs1.4k
repo stars238k
Last updatedAugust 5, 2026
Repositoryaffaan-m/ecc

How do you prevent ERC-20 decimal mismatch bugs?

Eliminate silent decimal-mismatch bugs when reading ERC-20 balances or calculating fiat values across EVM chains.

Who is it for?

Developers building portfolio trackers, trading bots, or DeFi aggregators that read ERC-20 balances across multiple EVM chains and bridged tokens.

Skip if: Developers working only on non-EVM chains or static token lists where decimals never vary and on-chain queries are unnecessary.

When should I use this skill?

User reads ERC-20 balances, computes fiat values, compares cross-chain token amounts, or handles bridged assets and needs decimal-safe normalization.

What you get

Runtime decimals cache keyed by chain and token, decimal-safe balance normalization, and bridged-token precision handling code.

  • Decimals cache implementation
  • Decimal-safe balance normalization code

By the numbers

  • ECC skill version 1.0.0 for ERC-20 decimal handling
  • Supports Python, TypeScript, and Solidity runtime decimals patterns

Files

SKILL.mdMarkdownGitHub ↗

EVMトークン小数点

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

使用するタイミング

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

仕組み

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

使用例

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

from decimal import Decimal
from 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をハードコードしないでください。

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

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()

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

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小数点)に正規化する

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

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);
}

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

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

ルール

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

Related skills

FAQ

Why does evm-token-decimals query decimals() at runtime?

evm-token-decimals queries ERC-20 decimals() at runtime because assuming stablecoins or bridged tokens share the same precision causes silent balance and USD calculation errors. Results are cached by chain_id and token_address for efficient multi-chain backends.

Which languages does evm-token-decimals support?

evm-token-decimals covers Python, TypeScript, and Solidity patterns for reading ERC-20 balances and computing fiat values with decimal-safe math. The ECC skill version 1.0.0 targets portfolio trackers, bots, and DeFi aggregators across EVM chains.

Backend & APIsbackendintegrations

This week in AI coding

Five minutes, every Monday - the tools, releases and tactics for developers.

unsubscribe anytime.