首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IUniswapV2Router02. smart在smart合同中失败

IUniswapV2Router02. smart在smart合同中失败
EN

Ethereum用户
提问于 2021-04-21 14:25:56
回答 1查看 1.3K关注 0票数 0

我试图通过uniswap路由器合同将weth令牌交换为dai令牌(都是ERC20):

我尝试了两种方法:

1.使用松露控制台操纵weth/dai/路由器合同。这种方法效果很好。详情见下文:

代码语言:javascript
复制
// Dai.sol
pragma solidity ^0.6.6;


contract Dai {
    function balanceOf(address owner) external view returns(uint) {}
    function totalSupply() external view returns (uint256){}
    function transfer(address recipient, uint256 amount) external returns (bool){}
    function allowance(address owner, address spender) external view returns (uint256){}
    function approve(address spender, uint256 amount) external returns (bool){}
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool){}
}
代码语言:javascript
复制
// Weth.sol
pragma solidity ^0.6.6;

contract Weth {
    function deposit() public payable {}
    function approve(address spender, uint amount) external {}
    function allowance(address owner, address spender) external view returns(uint) {}
    function balanceOf(address owner) external view returns(uint) {}
    function transfer(address recipient, uint256 amount) external returns (bool){}
}
代码语言:javascript
复制
// Router.sol

pragma solidity ^0.6.6;

contract Router {
    function swapExactTokensForTokens(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts){}
    function getAmountsOut(uint amountIn, address[] memory path) public view returns (uint[] memory amounts){}
    function getAmountsIn(uint amountOut, address[] memory path)public view virtual returns (uint[] memory amounts) {}
}

松露控制台上有一步一步的命令行:

代码语言:javascript
复制
truffle(kovan)> dai = await Dai.at("0x4f96fe3b7a6cf9725f59d353f723c1bdb64ca6aa")
truffle(kovan)> weth = await Weth.at("0xd0a1e359811322d97991e03f863a0c30c2cf029c")
truffle(kovan)> router =await Router.at("0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D")

truffle(kovan)> amountIn = await router.getAmountsIn(web3.utils.toWei("1"), [weth.address, dai.address])
truffle(kovan)> amountIn = amountIn[0]
truffle(kovan)> amountOut = web3.utils.toWei("1")
truffle(kovan)> weth.approve(router.address, amountIn)
truffle(kovan)> time = Math.floor((Date.now()/1000)) + 60*120
truffle(kovan)> router.swapExactTokensForTokens(amountIn, amountOut, [weth.address, dai.address], accounts[0], time)

在这种情况下,swapExactTokensForTokens的事务已经成功通过(https://kovan.etherscan.io/tx/0x11e51ad94d90ec9b2182768bcea87ad5a15d5cf83a91a02d52f2990cbaed5c61)。

  1. 从uniswapv2导入IUniswapV2Router02.sol,并在我的合同中操作router.swapExactTokensForTokens。
代码语言:javascript
复制
// SwapToken.sol
pragma solidity ^0.6.6;

import "@uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router02.sol";
import "@uniswap/v2-core/contracts/interfaces/IERC20.sol";

contract SwapTokens {
    
    IUniswapV2Router02 public uniRouter = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
    
    event test (uint timestamp, uint amountIn, uint amountOut, address[] path, uint allowance, address sender);
    
    function swapper(address token1, address token2) public  {
        address[] memory path = new address[](2);
        path[0] = token1;
        path[1] = token2;
        uint amountOut = 1 ether;
        uint amountIn = uniRouter.getAmountsIn(
            amountOut,
            path
        )[0];
                
        IERC20(token1).approve(address(uniRouter), amountIn);
        
        uint allowed = IERC20(token1).allowance(msg.sender, address(uniRouter));        
        
        emit test(now+90, amountIn, amountOut, path, allowed, msg.sender);

        uniRouter.swapExactTokensForTokens(
            amountIn, 
            amountOut,
            path, 
            msg.sender, 
            now + 120
        );
    }
}

然后运行swapper函数,如下所示:

代码语言:javascript
复制
sw = await SwapTokens.deployed()
sw.swapper(weth.address, dai.address)

事务失败,错误为“TransferHelper:TRANSFER_FROM_FAILED”(https://kovan.etherscan.io/tx/0x3324fd65004e001163b665b79583f894e17854bc3371b89f39d472504cb4b46a)

这两种方式对我来说都是一样的。我不知道我做错了哪一部分。

EN

回答 1

Ethereum用户

回答已采纳

发布于 2021-04-21 15:21:00

当您从合同内部调用uniswap合同时,msg.sender将始终是您的合同,因为您正在进行外部操作,请确保

  1. 您的合同要么有您想要交换的令牌,要么有津贴。
  2. 检查您是否在正确的网络上并使用正确的地址
票数 0
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

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

复制
相关文章

相似问题

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