使用ethers调用BSC上的智能合约返回-32603错误如何解决
问题排查与修复方案
你遇到的-32603错误属于EVM JSON-RPC的内部执行错误,通常由合约执行回滚、参数错误或链ID不匹配导致,按以下优先级排查:
1. 核心错误:Chainlink喂价地址与链不匹配
你当前迁移脚本中使用的0x0567F2323251f0Aab15c8dFb1967E4e8A7D42aeE是BSC主网的BNB/USD喂价地址,但你的合约部署在BSC测试网,测试网对应喂价地址为0x2514895c72f98844e12c4897cae4b565d9887693。
地址不匹配会导致priceFeed.latestRoundData()调用失败,直接触发合约回滚,返回-32603错误。
修复方式:替换迁移脚本中的喂价地址,重新部署合约即可。
2. 前端网络匹配错误
- 确认你MetaMask当前切换的是BSC测试网(链ID 97),如果链ID不匹配,
Contract.networks[networkId]会读取到空值或错误的合约地址,调用直接失败。 - 建议在前端增加网络校验逻辑,示例代码:
const BSC_TESTNET_CHAINID = "97" const networkId = await provider.request({ method: 'net_version' }) if (networkId !== BSC_TESTNET_CHAINID) { alert("请切换到BSC测试网") return }
3. 增加错误捕获逻辑定位问题
修改你的getPrice函数,增加try catch捕获具体的链上错误信息,方便后续定位,同时对返回的精度值做转换方便正常展示:
const getPrice = async (contract) => { try { console.log('contract', contract) const price = await contract.getPrice() console.log('price', price) const priceContainer = document.getElementById('price') // 返回的price是扩大了1e18倍的数值,做单位转换后再展示 priceContainer.innerText = ethers.utils.formatUnits(price, 18) } catch (err) { console.error("调用getPrice失败:", err.message, err) } }
4. 确认合约部署配置
检查truffle的网络配置文件,确认部署时指定的是BSC测试网,且FundMe.json的networks字段下存在链ID为97的条目,对应的合约地址和你在BSC测试网浏览器上的地址一致。
内容的提问来源于stack exchange,提问作者Patric Robert Gutersohn
相关产品推荐
相关产品推荐

