调用BSC测试网BEP20合约balanceOf时报execution reverted错误如何解决
错误原因
- 核心问题:你在标准BEP20合约的
balanceOf方法上添加了onlyOwner权限修饰符。标准BEP20协议规定balanceOf为无权限限制的公开查询方法,任何地址都可调用,添加修饰符后只有合约所有者(owner,即部署合约的钱包地址)可以调用该方法。 - 触发逻辑:你当前的调用代码未指定调用方地址,web3默认使用零地址作为调用方,不满足
onlyOwner的权限要求,触发合约校验失败直接回滚,因此返回execution reverted错误。
解决方法
- 【推荐方案,符合通用标准】移除
balanceOf方法上的onlyOwner修饰符,重新部署合约。保留该权限会导致区块浏览器、第三方钱包等工具都无法正常读取代币余额,不符合BEP20代币的通用兼容要求。 - 【特殊需求方案】如果你确实需要限制
balanceOf的调用权限,可在调用时指定owner地址作为调用方,代码修改如下:
let Web3 = require('web3'); const fs = require('fs'); let web3 = new Web3('https://data-seed-prebsc-1-s1.binance.org:8545'); // 替换为你部署合约时使用的钱包地址(即owner地址) const ownerAddress = "你的合约owner地址"; const contractAddress = '0x43045f0Cec750eEb70478B023885d1956588438E'; const contractAbi = JSON.parse(fs.readFileSync("scripts/contract_abi.json").toString()) const contract = new web3.eth.Contract(contractAbi, contractAddress); // 调用时添加from参数指定owner地址 contract.methods.balanceOf(contractAddress).call({from: ownerAddress}) .then(result=>console.log(result)) .catch(err => console.log(err));
- 额外校验项:如果调整后仍报错,可检查本地
contract_abi.json是否和部署后的合约ABI完全匹配,ABI不匹配会导致方法调用签名错误,也会触发执行回滚。
内容的提问来源于stack exchange,提问作者Vassily
相关产品推荐
相关产品推荐

