我正在使用sushiswap 将weth 转移到dai。当我使用 web3.js 调用 swapExactTokensForTokens 目录时,一切正常。 但是,当我尝试在 IUniswapV2Router02.sol 中包含 swapExactTokensForTokens 时,事情出错了。我的代码在下面的 remix 上运行:
pragma solidity ^0.6.6;
import "https://github.com/Uniswap/uniswap-v2-periphery/blob/master/contracts/interfaces/IUniswapV2Router02.sol";
import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/docs-v3.x/contracts/token/ERC20/IERC20.sol";
contract Arbitrage {
IUniswapV2Router02 public sushiRouter = IUniswapV2Router02(0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506);
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 = sushiRouter.getAmountsIn(
amountOut,
path
)[0];
IERC20(token1).approve(address(sushiRouter), amountIn);
uint allowed = IERC20(token1).allowance(msg.sender, address(sushiRouter));
emit test(now+90, amountIn, amountOut, path, allowed, msg.sender);
sushiRouter.swapExactTokensForTokens(
amountIn,
amountOut,
path,
msg.sender,
now + 60
);
}
}
Remix 上显示的错误消息是
Gas estimation errored with the following message (see below). The transaction execution will likely fail. Do you want to force sending?
The execution failed due to an exception. Reverted
我也使用 truffle + ganache-cli(来自主网)。松露控制台上显示的错误是
Uncaught:
Error: Returned error: VM Exception while processing transaction: revert TransferHelper: TRANSFER_FROM_FAILED -- Reason given: TransferHelper: TRANSFER_FROM_FAILED.
我认为“sushiRouter.swapExactTokensForTokens()”内部出了问题,因为一旦我将其注释掉,代码就会成功发出事件。
如果有人能告诉我我在哪部分搞砸了,我将不胜感激。
------ 下面是更多信息-----
删除交换部分后,如下所示:
...
contract Arbitrage {
IUniswapV2Router02 public sushiRouter = IUniswapV2Router02(0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506);
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 = sushiRouter.getAmountsIn(
amountOut,
path
)[0];
IERC20(token1).approve(address(sushiRouter), amountIn);
IERC20(token2).approve(address(sushiRouter), amountOut);
uint allowed = IERC20(token1).allowance(msg.sender, address(sushiRouter));
emit test(now+90, amountIn, amountOut, path, allowed, msg.sender);
}
}
交易完成,交易详情如下:
---- 4/21 更新 ----
当我在我的 ganache 分叉主网上尝试错误时,我可能会找到一些线索。
Google 表示“TRANSFER_FROM_FAILED”的原因是sushiswap 路由器合约没有足够的配额来传输令牌。所以我再次检查“测试事件”中的允许字段。令人惊讶的是,即使我已经完成了批准,它实际上还是“0”。
为什么?下面这行代码不生效??我有什么想念的吗?
IERC20(token1).approve(address(sushiRouter), amountIn);
除此之外,即使我通过 truffle 控制台手动批准 100 weth,交换仍然失败:
truffle(development)> weth.approve(srouter.address, web3.utils.toWei("1000"))
truffle(development)> allowed = await weth.allowance(accounts[0], srouter.address)
truffle(development)> allowed.toString()
'1000000000000000000000'
truffle(development)> tx = await sw.swapper(weth.address, dai.address)
Uncaught:
Error: Returned error: VM Exception while processing transaction: revert TransferHelper: TRANSFER_FROM_FAILED -- Reason given: TransferHelper: TRANSFER_FROM_FAILED.
我很确定我的环境设置不应该有任何问题,因为我手动做了类似的过程有问题:
流程如下:
ganache-cli --fork https://mainnet.infura.io/v3/<projectID> --unlock 0x47ac0fb4f2d84898e4d9e7b4dab3c24507a6d503 -p 7545
松露控制台和迁移
在 truffle 控制台上实现 swaptoken 没有任何问题
truffle(development)> dai = await Dai.at("0x6b175474e89094c44da98b954eedeac495271d0f")
truffle(development)> weth = await Weth.at("0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2")
truffle(development)> sw = await SwapTokens.deployed()
truffle(development)> srouter =await Router.at("0xd9e1cE17f2641f24aE83637ab66a2cca9C378B9F")
truffle(development)> web3.eth.sendTransaction({from:accounts[0], to: "0x47ac0fb4f2d84898e4d9e7b4dab3c24507a6d503", value:web3.utils.toWei("20")})
truffle(development)> dai.transfer(accounts[0], web3.utils.toWei("5000"), {from: "0x47ac0fb4f2d84898e4d9e7b4dab3c24507a6d503"}
truffle(development)> weth.deposit({from:accounts[0], value:web3.utils.toWei("50")})
truffle(development)> amountIn = await srouter.getAmountsIn(web3.utils.toWei("1"), [weth.address, dai.address])
truffle(development)> amountIn = amountIn[0]
truffle(development)> weth.approve(srouter.address, amountIn)
truffle(development)> amountOut = web3.utils.toWei("1")
truffle(development)> time = Math.floor((Date.now()/1000)) + 60*300
srouter.swapExactTokensForTokens(amountIn, amountOut, [weth.address, dai.address], accounts[0], time)
一切顺利。
但是当我在智能合约中调用它时它会失败?
请帮忙,我在这里卡了这么久@@