如何通过 ethers.js 查询钱包地址的 ERC20 代币余额

·

在区块链开发中,查询特定地址的 ERC20 代币余额是一项常见需求。借助 ethers.js 这一流行的 JavaScript 库,开发者可以快速、高效地实现这一功能。本文将详细介绍操作步骤,并提供代码示例,帮助您轻松掌握相关技能。


准备工作

在开始查询之前,请确保已准备好以下信息:

由于仅进行只读操作,无需签名器,使用默认提供者(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);

环境配置与运行

若项目尚未初始化,请执行以下命令:

  1. 运行 yarn init -y 生成 package.json 文件。
  2. 安装 ethers 库:yarn add ethers
  3. 通过 node ./your-file.js 运行脚本。

通过 TypeScript 实现查询

若希望在 TypeScript 项目中实现相同功能,只需对上述代码稍作调整:

  1. 安装开发依赖:
    yarn add -D typescript ts-node @types/node
  2. 将文件后缀改为 .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 的简洁设计极大降低了开发门槛,适用于从快速原型到生产环境的多种场景。👉探索更多区块链开发策略