首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Uniswap V2中的交换令牌函数失败

Uniswap V2中的交换令牌函数失败
EN

Ethereum用户
提问于 2023-04-05 06:16:20
回答 1查看 135关注 0票数 1

我正在尝试将多个令牌交换给Weth,但是这个事务失败了,错误导致了TransferHelper: TRANSFER_FROM_FAILED错误。

代码语言:javascript
复制
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);

    }
EN

回答 1

Ethereum用户

发布于 2023-04-05 06:51:10

发生TransferHelper: TRANSFER_FROM_FAILED错误是因为用户对契约的transferFrom调用在交换之前没有发生。

Uniswap路由器正在尝试从您的合同中提取令牌,但是此时合同上没有令牌,令牌仍然在用户帐户上。

解决方案:首先在approve函数从用户调用transferFrom令牌到智能契约之前添加以下行:

代码语言:javascript
复制
IERC20(tokens[i]).transferFrom(msg.sender, address(this), amounts[i]);

更新后的代码应该如下所示:

代码语言:javascript
复制
IERC20(tokens[i]).transferFrom(msg.sender, address(this), amounts[i]);
IERC20(tokens[i]).approve(address(uniswapRouter), amounts[i]);

现在,令牌首先被转移到smart契约,然后契约批准Uniswap路由器将令牌用于交换。这应该能解决这个问题。

另外,在调用swapToWeth之前,要确保合同有来自用户的足够的补贴(最好是将此检查从链外进行,以节省更多的汽油)。

票数 1
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/148539

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档