You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 18:01:06