如何通过web3获取MetaMask中已注册的代币与资产信息?
关于MetaMask资产列表获取的说明
MetaMask注入的window.ethereum标准提供者没有公开的原生API可以直接获取用户钱包内已注册的所有代币/资产列表,这个设计是出于用户隐私保护考虑:避免未授权的DApp直接获取用户全量资产信息,用于用户画像、定向钓鱼等恶意操作。
你可以根据你的实际需求选择对应的替代方案:
- 若你需要获取当前链上用户地址的实际持仓数据,不需要依赖MetaMask接口,走链上查询即可:
- 先调用
eth_requestAccounts获取用户授权的钱包地址 - 调用对应链RPC的
eth_getBalance接口查询原生代币(如ETH、BNB)余额 - 对于ERC20等标准合约类代币,如果你已知代币合约地址,直接调用对应合约的
balanceOf(用户地址)方法即可查询持仓 - 如果需要批量查询某地址下全量代币持仓,可以自行搭建链上索引服务,或使用公开的链上数据聚合接口完成查询
- 先调用
- 若你需要判断用户MetaMask中是否已经添加了某指定代币,可以通过
wallet_watchAsset方法间接判断:
调用该方法触发代币添加流程时,如果目标代币已经在用户MetaMask的资产列表中,MetaMask会直接提示「资产已存在」,不会重复触发添加确认。调用示例如下:
若返回值为const isAssetExistedOrAdded = await window.ethereum.request({ method: 'wallet_watchAsset', params: { type: 'ERC20', options: { address: '0x代币合约地址', symbol: '代币符号', decimals: 18, image: 'https://代币图标链接地址' } } })true,则证明该代币已存在于用户资产列表,或用户已完成新代币添加确认。
内容的提问来源于stack exchange,提问作者Ajay Amal
相关产品推荐
相关产品推荐

