在区块链开发中,查询特定地址的 ERC20 代币余额是一项常见需求。借助 ethers.js 这一流行的 JavaScript 库,开发者可以快速、高效地实现这一功能。本文将详细介绍操作步骤,并提供代码示例,帮助您轻松掌握相关技能。
准备工作
在开始查询之前,请确保已准备好以下信息:
- 合约地址:目标 ERC20 代币的智能合约地址。例如 USDT 的合约地址为
0xdac17f958d2ee523a2206206994597c13d831ec7。 - 合约 ABI:用于与合约交互的应用程序二进制接口。对于标准 ERC20 代币,可使用通用 ABI 片段,仅包含必要函数(如
balanceOf和decimals)。 - 查询地址:需要查询余额的钱包地址。请将示例中的零地址替换为实际地址。
由于仅进行只读操作,无需签名器,使用默认提供者(Provider)即可完成调用。
通过 JavaScript 查询 ERC20 余额
以下是使用 ethers.js 查询代币余额的完整 JavaScript 代码示例:
const ethers = require('ethers');
// ERC20 ABI 片段(仅包含必要函数)
const ERC20_ABI = [
{
"constant": true,
"inputs": [],
"name": "decimals",
"outputs": [{"name": "", "type": "uint8"}],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [{"name": "_owner", "type": "address"}],
"name": "balanceOf",
"outputs": [{"name": "balance", "type": "uint256"}],
"payable": false,
"stateMutability": "view",
"type": "function"
}
];
async function getFormattedBalanceOfErc20TokenHolder(contractAddress, getBalanceOfAddress) {
const usdtErc20Contract = new ethers.Contract(
contractAddress,
ERC20_ABI,
ethers.getDefaultProvider()
);
const balance = await usdtErc20Contract.balanceOf(getBalanceOfAddress);
const numDecimals = await usdtErc20Contract.decimals();
const formattedBalance = balance.div(10 ** numDecimals);
console.log(`地址 ${getBalanceOfAddress} 在合约 ${contractAddress} 中的余额为 ${formattedBalance}`);
return formattedBalance;
}
// 使用 USDT 合约地址示例
const USDT_CONTRACT_ADDRESS = '0xdAC17F958D2ee523a2206206994597C13D831ec7';
const addr = '0x0000000000000000000000000000000000000000'; // 请替换为实际地址
getFormattedBalanceOfErc20TokenHolder(USDT_CONTRACT_ADDRESS, addr);环境配置与运行
若项目尚未初始化,请执行以下命令:
- 运行
yarn init -y生成 package.json 文件。 - 安装 ethers 库:
yarn add ethers。 - 通过
node ./your-file.js运行脚本。
通过 TypeScript 实现查询
若希望在 TypeScript 项目中实现相同功能,只需对上述代码稍作调整:
- 安装开发依赖:
yarn add -D typescript ts-node @types/node - 将文件后缀改为
.ts,并使用ts-node ./your-file.ts运行。
TypeScript 类型系统可提供更好的代码提示与错误检查,适合大型项目使用。👉查看实时开发工具
常见问题
1. 什么是 ERC20 标准?
ERC20 是以太坊上代币的通用标准,规定了代币合约必须实现的基本接口,包括转账、余额查询等功能。这使得不同代币能在钱包和交易所中兼容操作。
2. 为什么需要 ABI?
ABI(应用程序二进制接口)定义了如何与智能合约交互,包括函数名称、参数类型和返回格式。没有正确的 ABI,无法解析合约的调用与返回数据。
3. 如何获取其他代币的合约地址?
可通过 Etherscan 等区块链浏览器搜索代币名称,或在项目官方文档中查找已验证的合约地址。务必使用可靠来源以避免安全风险。
4. 余额查询是否消耗 Gas?
否,查询操作仅读取区块链数据,不修改状态,因此不需要支付 Gas 费用。
5. 除 ethers.js 外,还有哪些库可用?
web3.js、viem 等库也支持类似功能,选择取决于项目需求和个人偏好。ethers.js 以轻量化和易用性著称。
6. 如何处理非标准 ERC20 代币?
部分代币可能偏离标准,例如使用非常规小数位数。此时需单独处理其 ABI 或调整数值格式化逻辑。
通过以上步骤,您应能顺利查询任何 ERC20 代币的余额。ethers.js 的简洁设计极大降低了开发门槛,适用于从快速原型到生产环境的多种场景。👉探索更多区块链开发策略