Solidity交易回滚无原因字符串问题求助:合约mint调用失败排查
问题排查:testMint调用时交易无理由回滚
合约代码
TokenContract(BetToken)
contract BetToken is ERC20, Ownable { address[] betContractAddresses; constructor( string memory _name, string memory _symbol, address[] memory _betContractAddresses ) ERC20(_name, _symbol) { betContractAddresses = _betContractAddresses; } function mint(address to, uint256 amount) external { for (uint256 i; i < betContractAddresses.length; i++) { if (betContractAddresses[i] == msg.sender) { _mint(to, amount); } } } }
主合约相关函数
interface Token { function mint(address to, uint256 amount) external; } function testMint(address _address) external onlyOwner { Token caller = Token(_betTokenAddress); caller.mint(_address, 1000000); }
测试代码(Hardhat)
it("Testing bets", async () => { const [owner, address1, address2] = accounts; const sendToContractTx = await owner.sendTransaction({ to: betContract.address, value: ethers.utils.parseEther("1.0") }); await sendToContractTx.wait(1); const testMintTx = await betContract.testMint(owner.address); await testMintTx.wait(1); })
排查方向及解决方法
主合约未加入BetToken白名单:
BetToken的mint函数仅允许betContractAddresses数组内的地址调用。部署BetToken时,必须将主合约地址传入构造函数的_betContractAddresses参数,否则主合约调用mint会因权限不足无法执行铸币,若伴随其他异常会触发回滚。主合约
_betTokenAddress变量错误:
确认主合约部署时,已将正确的BetToken合约地址赋值给_betTokenAddress。如果该地址无效或指向非目标合约,调用mint会直接触发交易回滚。验证调用者权限:
检查测试脚本中accounts[0]是否为主合约的部署者(即onlyOwner修饰符限定的地址),非owner调用testMint会触发权限校验失败回滚。检查合约代码完整性:
提供的BetToken代码末尾缺少闭合的},实际部署的合约必须保证语法完整,否则会导致合约执行异常。
内容的提问来源于stack exchange,提问作者Hacker Attempt
相关产品推荐
相关产品推荐

