我正在尝试将多个令牌交换给Weth,但是这个事务失败了,错误导致了TransferHelper: TRANSFER_FROM_FAILED错误。
function swapToWeth(
address[] calldata tokens,
uint256[] calldata amounts
) public {
require(tokens.length == amounts.length, "TokenSwapper: Invalid inputs");
//to get the total weth converted
for (uint256 i = 0; i < tokens.length; i++) {
if(tokens[i]==address(weth)){
wethAmount+=amounts[i];
continue;
}
address[] memory path = new address[](2);
path[0] = tokens[i];
path[1] = address(weth);
uint256[] memory amountsOut = uniswapRouter.getAmountsOut(amounts[i], path);
require(amountsOut[1] > 0, "TokenSwapper: Invalid swap");
// IERC20(tokens[i]).transferFrom(msg.sender,address(this),amounts[i]);
IERC20(tokens[i]).approve(address(uniswapRouter), amounts[i]);
uniswapRouter.swapExactTokensForTokens(
amounts[i],
amountsOut[1],
path,
address(this),
block.timestamp
);
wethAmount+=amountsOut[0];
emit make_weth(path[0],path[1],amountsOut);
}
emit WethValue(wethAmount);
}发布于 2023-04-05 06:51:10
发生TransferHelper: TRANSFER_FROM_FAILED错误是因为用户对契约的transferFrom调用在交换之前没有发生。
Uniswap路由器正在尝试从您的合同中提取令牌,但是此时合同上没有令牌,令牌仍然在用户帐户上。
解决方案:首先在approve函数从用户调用transferFrom令牌到智能契约之前添加以下行:
IERC20(tokens[i]).transferFrom(msg.sender, address(this), amounts[i]);更新后的代码应该如下所示:
IERC20(tokens[i]).transferFrom(msg.sender, address(this), amounts[i]);
IERC20(tokens[i]).approve(address(uniswapRouter), amounts[i]);现在,令牌首先被转移到smart契约,然后契约批准Uniswap路由器将令牌用于交换。这应该能解决这个问题。
另外,在调用swapToWeth之前,要确保合同有来自用户的足够的补贴(最好是将此检查从链外进行,以节省更多的汽油)。
https://ethereum.stackexchange.com/questions/148539
复制相似问题