我的智能合约接收WETH。我想创建一个任何人都可以运行的函数,将ETH转换为ETH。
这是我的代码
function swapWeth() public nonReentrant {
uint balanceWETH = IWETH(WETH).balanceOf(address(this));
if (balanceWETH > 0) {
IERC20(WETH).approve(address(this), balanceWETH);
IWETH(WETH).withdraw(balanceWETH);
}
}
当我调用这个函数时,我总是得到下面的消息,我的交易永远不会通过。
我们无法估计天然气。可能有一个错误合同和此交易可能失败。
我如何调试这个?
我只想调用WETH智能合约的withdraw
函数,将我的合约的WETH交换成ETH。发起交易的用户只需支付gas费。
我只是想把我的合约的WETH转换成ETH。
如有任何帮助,不胜感激。
感谢编辑:我把代码改成这个,它仍然失败。我在戈利。有人能举个例子吗?
function withdrawETH() public {
address WETH9 = 0xB4FBF271143F4FBf7B91A5ded31805e42b2208d6; // Goerli
uint balanceWETH = IERC20(WETH9).balanceOf(address(this));
IWETH9(WETH9).withdraw(balanceWETH);
}
合同地址:https://goerli.etherscan.io/address/0xd9e84819483410b08ec24320eb88acfc4ee6e8c8
编辑请看下面彼得的回应和评论。问题是我的'receive'函数
IERC20(WETH).approve(address(this), balanceWETH);
这行给出了批准
- 从您的合同地址-这是调用
approve()
函数的地址 - 到您的合同地址-第一个参数,值
address(this)
由执行approve()
功能的地址给出批准。
如果你想获得用户的批准,他们需要在单独的交易中直接在WETH
合约上调用approve()
函数,而不是通过你的合约。