evm-token-decimals
EVMチェーン全体でサイレントな小数点不一致バグを防ぐ。ランタイムでの小数点照会、チェーン対応キャッシング、ブリッジドトークンの精度ドリフト、ボット・ダッシュボード・DeFiツール向けの安全な正規化をカバーします。
DeepseekModel
官方收录技能
质量 优秀 · 90
v1.0.0
获取
https://deepseekmodel.com/api/download.php?id=affaan-m-ecc-docs-ja-jp-skills-evm-token-decimals-skill-md&format=skill
下载 .skill
标准格式,含 system_prompt 与 model_config,导入任意 Agent 框架即可使用
.skill 文件中 system_prompt 字段的实际内容。
name evm-token-decimals description EVMチェーン全体でサイレントな小数点不一致バグを防ぐ。ランタイムでの小数点照会、チェーン対応キャッシング、ブリッジドトークンの精度ドリフト、ボット・ダッシュボード・DeFiツール向けの安全な正規化をカバーします。 origin ECC direct-port adaptation version 1.0.0 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ではなく Decimal 、 BigInt 、または同等の正確な数学を使用する ブリッジングやラッパーの変更後は小数点を再照会する 比較や価格計算の前に内部会計を一貫して正規化する
Agent 识别该技能的关键词,点击任意一个即可复制。
该技能未提供触发词。
下载的 .skill 包内含以下字段。
| 字段 | 说明 |
|---|---|
| format | 格式标识(skill/v1) |
| skill_id | 技能唯一 ID |
| name | 技能名称 |
| version | 版本号 |
| description | 技能描述 |
| category | 所属分类(数组) |
| trigger_words | 触发词列表 |
| tags | 标签列表 |
| source | 来源标识 |
| source_url | 来源链接(本页地址) |
| exported_at | 导出时间(每次下载生成) |
| system_prompt | 系统提示词正文 |
| model_config | 模型参数:provider / model / temperature / max_tokens / top_p |
| examples | 示例 |
| install_guide | 各平台导入说明(Coze / Dify / Claude / 自定义框架) |