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,这大概率是笔误,会导致编译或运行时错误) updateRewardsmodifier内部逻辑在测试环境中未正确初始化(比如依赖的状态变量未赋值),导致调用revert
排查与修复建议
- 修正代码笔误:检查A合约中
investByToken函数内的stake(_userAddress, _liquidity),将_liquidity替换为正确的变量(比如_amount,或确保_liquidity已在函数内正确计算定义) - 验证测试部署流程:确认Hardhat测试脚本中部署的是合约B,而非抽象合约A(抽象合约无法直接部署)
- 检查modifier逻辑:确认
updateRewardsmodifier在测试环境中能正常执行,比如是否需要提前初始化相关状态变量 - 核对调用参数:确保测试脚本调用
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
相关产品推荐
相关产品推荐

