【问题标题】:UniswapV2 swapExactTokensForETH approve and transferUniswapV2 swapExactTokensForETH 批准和转移
【发布时间】:2022-08-23 23:05:19
【问题描述】:

我试图创建一个智能合约。我按照本教程获得了 uniswap 交换示例https://cryptomarketpool.com/how-to-swap-tokens-on-uniswap-using-a-smart-contract/

这是我的智能合约功能之一,我想将一些代币数量换成一些 eth。

  function swapTokenToEth(uint tokenAmount, uint amountOutMin) public {
    uint deadline = block.timestamp + 150;
    IERC20(token).transferFrom(msg.sender, address(this), tokenAmount);
    IERC20(token).approve(UNISWAP_V2_ROUTER, tokenAmount);
    uniswapRouter.swapExactTokensForETH(tokenAmount, amountOutMin, getPath(), msg.sender, deadline);
  }

我从 Truffle 测试环境中调用此交换方法

await dex.swapTokenToEth(tokenAmount, amountOutMin {
  from: accounts[1],
});

我不断收到此错误:

Error: Returned error: VM Exception while processing transaction: revert ERC20: transfer amount exceeds allowance -- Reason given: ERC20: transfer amount exceeds allowance.

我尝试了几件事,但现在我被卡住了,我不明白这个错误。 关于如何解决这个问题的任何提示?

    标签: solidity web3js


    【解决方案1】:

    ERC20:转账金额超过限额

    这是来自合同的自定义错误消息。

    根据上下文,我假设它来自token 合约的函数transferFrom()(或这个调用的另一个函数),来自失败的require() 条件。

    这意味着accounts[1](执行swapTokenToEth() 函数的用户)尚未批准dex 合约来操纵他们的代币。

    解决方案:在执行dex.swapTokenToEth()之前,还需要从accounts[1]地址执行tokenContract.approve(dexAddress)。只需执行一次approve() 函数(除非您重新部署合同)并有足够的数量 - 批准会随着transferFrom() 函数中使用的每个数量而减少。

    【讨论】:

      猜你喜欢
      • 2022-11-05
      • 2022-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-10
      • 2015-08-20
      • 1970-01-01
      相关资源
      最近更新 更多