You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用ethers.js从MetaMask中获取BTC、USDT等代币的显示名称

问题解决说明

你在ethers provider文档中找不到相关方法是合理的,provider仅封装了链原生的RPC接口,ERC20代币数据属于合约层业务逻辑,需要通过合约调用实现。
首先明确前提:

  • MetaMask本身是以太坊生态钱包,原生仅支持以太坊(ETH)及对应链上符合ERC标准的代币,你提到的原生BTC不属于以太坊生态,无法直接通过ethers+MetaMask读取,如果是以太坊上的包装BTC(WBTC)、USDT这类ERC20代币,可按照以下方案实现

实现步骤

1. 准备必要参数

查询指定ERC20代币信息需要提前准备两个参数:

  • 对应链上该ERC20代币的合约地址
  • 调用所需的最小ERC20 ABI片段,代码如下:
const erc20Abi = [
  // 读取代币全称
  "function name() view returns (string)",
  // 读取代币符号(如USDT、WBTC)
  "function symbol() view returns (string)",
  // 读取指定地址的代币余额
  "function balanceOf(address owner) view returns (uint256)",
  // 读取代币精度,用于余额单位转换
  "function decimals() view returns (uint8)"
]

2. 调用合约获取代币信息

可以直接在你现有代码的基础上扩展,示例代码适配ethers v3版本:

// 你的现有代码
const provider = new ethers.providers.Web3Provider(window.ethereum, "any")
await provider.send("eth_requestAccounts", [])
const signer = provider.getSigner()
const address = await signer.getAddress()
const balance = await signer.getBalance()

// 新增:查询ERC20代币信息,以以太坊主网USDT为例
const usdtContractAddress = "0xdAC17F958D2ee523a2206206994597C13D831ec7"
// 初始化ERC20合约实例
const erc20Contract = new ethers.Contract(usdtContractAddress, erc20Abi, provider)

// 读取代币名称
const tokenName = await erc20Contract.name()
// 读取代币符号
const tokenSymbol = await erc20Contract.symbol()
// 读取当前钱包地址的代币原始余额
const rawTokenBalance = await erc20Contract.balanceOf(address)
// 转换为用户可读的余额格式
const decimals = await erc20Contract.decimals()
const readableBalance = ethers.utils.formatUnits(rawTokenBalance, decimals)

注意事项

  • 若需要查询其他EVM兼容链上的代币(如BSC链的USDT、Polygon链的WBTC),需要先调用wallet_switchEthereumChain方法切换MetaMask到对应链,再执行上述合约调用逻辑
  • 非EVM生态的原生资产(如原生比特币BTC、Solana链SOL)无法通过MetaMask+ethers直接读取,需要对接对应链的专属钱包SDK

内容的提问来源于stack exchange,提问作者Safari

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 19:54:03