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

Solidity中重写函数能否使用Modifier?遇Gas估算错误求助

Solidity重写函数能否使用Modifier?解决Hardhat测试环境调用报错问题

核心结论

Solidity完全支持在重写的函数上使用modifier,你当前的代码逻辑本身是合法的,报错问题并非来自重写函数加modifier的语法,而是测试环境的调用或部署细节问题。

错误原因分析

你遇到的错误提示function selector was not recognized and there's no fallback function,本质是测试时发起的调用找不到匹配的合约函数签名,和stake函数的modifier无关。常见触发场景包括:

  • 测试脚本调用的函数参数数量/类型不匹配
  • 部署的合约实例不正确(比如误部署了抽象合约A而非合约B)
  • 合约内部存在未定义变量(比如你代码示例中investByToken函数里调用stake时用的_liquidity,但函数参数里只有_amount,这大概率是笔误,会导致编译或运行时错误)
  • updateRewards modifier内部逻辑在测试环境中未正确初始化(比如依赖的状态变量未赋值),导致调用revert

排查与修复建议

  • 修正代码笔误:检查A合约中investByToken函数内的stake(_userAddress, _liquidity),将_liquidity替换为正确的变量(比如_amount,或确保_liquidity已在函数内正确计算定义)
  • 验证测试部署流程:确认Hardhat测试脚本中部署的是合约B,而非抽象合约A(抽象合约无法直接部署)
  • 检查modifier逻辑:确认updateRewards modifier在测试环境中能正常执行,比如是否需要提前初始化相关状态变量
  • 核对调用参数:确保测试脚本调用investByToken时,参数数量、类型完全匹配合约定义(比如不要漏传_token参数,或传错地址类型)

修正后的示例代码(修复笔误)

abstract contract A {
    function stake(
        address _userAddress,
        uint256 _amount
    ) internal virtual {}

    function investByToken(
        address _userAddress,
        IERC20Upgradeable _token,
        uint256 _amount
    ) external payable {
        // ... 扣取手续费等逻辑
        stake(_userAddress, _amount); // 修正为正确的变量
    }
}
contract B is A {
    modifier updateRewards() {
        // 补充modifier逻辑
        _;
    }

    function stake(
        address _userAddress,
        uint256 _amount
    ) internal override updateRewards {}
}

内容的提问来源于stack exchange,提问作者Ali Jalal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 01:20:35