如何使用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
相关产品推荐
相关产品推荐

