智能合约ETH无法提取求助:调用withdraw成功但余额未变化
问题排查方案
1. 验证调用者的Owner权限
- 调用合约的
owner()视图函数,确认当前MetaMask连接地址与返回的owner地址完全一致。若不一致,切换到owner地址后再尝试调用withdraw。
2. 排查金额单位不匹配问题
合约中withdraw的amount参数单位是wei,如果Scaffold-Eth UI未做单位转换:
- 输入的
20实际对应20 wei(约0.00000000000000002 ETH),转出后合约余额变化极小,肉眼难以察觉。 - 解决方式:在UI的金额输入逻辑中添加单位转换,比如用
ethers.parseEther(inputValue)将ETH数值转为wei后传入;或直接传入wei格式的目标金额(如转出1 ETH需传入1000000000000000000)。
3. 确认合约状态与逻辑执行
- 调用
paused()函数,确认合约处于未暂停状态(返回false)。 - 本地Hardhat节点测试验证:
- 部署合约并转入ETH;
- 传入正确wei数值调用
withdraw; - 检查是否触发
EthWithdrawal事件,同时确认合约余额减少、owner地址余额增加。
若本地测试正常,说明链上合约逻辑无问题,问题出在Scaffold-Eth的UI调用配置。
4. 排查转账调用的潜在异常
- 代码中
call{value: amount}可能因链上特殊Gas限制未执行成功,但未触发TransferFailed回退。可尝试给call指定最低Gas上限:(bool success, ) = payable(owner()).call{value: amount, gas: 2300}(""); - 查看区块浏览器交易详情的Internal Transactions,确认是否存在合约向owner转账的内部交易。若无,则说明
call未执行成功,需进一步排查链上转账规则。
内容的提问来源于stack exchange,提问作者Fergus Johnson
相关产品推荐
相关产品推荐

