我试着创造一份明智的合同。我按照本教程学习了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);
}我是从一个信托基金测试环境中调用这个交换方法的。
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.我试过几件事,但现在我被困住了,我不明白这个错误。对如何解决这个问题有什么建议吗?
发布于 2022-01-13 21:15:20
ERC20:转移金额超过免税额
这是来自合同的自定义错误消息。
根据上下文,我假设它来自token契约的函数transferFrom() (或此函数调用的另一个函数),来自失败的require()条件。
这意味着accounts[1] (执行swapTokenToEth()函数的用户)没有批准dex契约来操作它们的令牌。
解决方案:在执行dex.swapTokenToEth()之前,还需要从accounts[1]地址执行tokenContract.approve(dexAddress)。只执行一次approve()函数就足够了(除非您重新部署合同),并且数量足够--随着transferFrom()函数中使用的数量的增加,审批就会减少。
https://stackoverflow.com/questions/70702899
复制相似问题