求助:使用ethers 6.6.0获取Sepolia测试网Metamask的Provider和Signer时遇ENS错误
解决ethers 6.6.0中Sepolia测试网调用getBalance(ENS域名)报错的问题
问题原因
Sepolia测试网不支持ENS(以太坊域名服务),当你调用provider.getBalance("ethers.eth")时,ethers会自动尝试解析该ENS域名对应的地址,但Sepolia网络中没有部署ENS相关合约,因此触发UNSUPPORTED_OPERATION错误。
解决方案
方案1:直接使用Hex格式的以太坊地址
将ENS域名替换为对应的0x开头的Hex地址,跳过ENS解析步骤:
let API_KEY = "...."; const getEthereumContract = async () => { const provider = new ethers.JsonRpcProvider("https://sepolia.infura.io/v3/{API_KEY}"); await window.ethereum.enable(); // 替换为你要查询的Hex格式地址,示例为ethers.eth对应的主网地址 const balance = await provider.getBalance("0x6fC21092DA55B392b045eD78F4732bff3C580e2c"); console.log({balance}); const signer = await provider.getSigner(); const transactionContract = new ethers.Contract(contractAddress, contractAbi, signer); console.log({provider, signer, transactionContract}); }
方案2:先通过主网解析ENS再查询余额
如果确实需要通过ENS域名获取地址,先用以太坊主网的Provider解析得到地址,再用Sepolia Provider查询该地址的余额:
let API_KEY = "...."; const MAINNET_API_KEY = "...."; // 你的主网API密钥 const getEthereumContract = async () => { // 主网Provider用于解析ENS const mainnetProvider = new ethers.JsonRpcProvider(`https://eth-mainnet.g.alchemy.com/v2/${MAINNET_API_KEY}`); const targetAddress = await mainnetProvider.resolveName("ethers.eth"); const sepoliaProvider = new ethers.JsonRpcProvider(`https://sepolia.infura.io/v3/${API_KEY}`); await window.ethereum.enable(); const balance = await sepoliaProvider.getBalance(targetAddress); console.log({balance}); const signer = await sepoliaProvider.getSigner(); const transactionContract = new ethers.Contract(contractAddress, contractAbi, signer); console.log({sepoliaProvider, signer, transactionContract}); }
注意事项
- Sepolia测试网未部署ENS合约,所有依赖ENS的操作(如
resolveName、传入ENS域名调用getBalance)均无法正常执行 - 无论使用Alchemy、Infura还是Web3Provider连接Sepolia,都需避免传入ENS域名作为地址参数
内容的提问来源于stack exchange,提问作者MrSudden
相关产品推荐
相关产品推荐

