我的智能合约如何用WETH交换ETH?



我的智能合约接收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()函数,而不是通过你的合约。

最新更新