用于编辑
的滚动器
我使用的是Solity0.7.5,我正在尝试通过UniswapRouter02从我的帐户将DAI交换到ETH。
这是我的环境
我的代码如下
pragma solidity >=0.7.0 <0.8.0;
import "https://github.com/Uniswap/uniswap-v2-periphery/blob/master/contracts/interfaces/IUniswapV2Router02.sol";
import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/IERC20.sol";
contract UniswapExample {
address internal constant UNISWAP_ROUTER_ADDRESS = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;
IUniswapV2Router02 public uniswapRouter;
address private kovanDAI = 0x4F96Fe3b7A6Cf9725f59d353F723c1bDb64CA6Aa;
address private myAccount = msg.sender;
constructor() payable {
uniswapRouter = IUniswapV2Router02(UNISWAP_ROUTER_ADDRESS);
}
function convertDAItoETH(uint daiAmountIn, uint minETHAmountToReceieve) public payable {
IERC20 daiToken = IERC20(kovanDAI);
require(daiToken.transferFrom(myAccount, address(this), daiAmountIn), "transferFrom failed");
require(daiToken.approve(address(uniswapRouter), daiAmountIn), "approve failed");
uint deadline = block.timestamp + 15; // using 'now' for convenience, for mainnet pass deadline from frontend!
uniswapRouter.swapExactTokensForETH(daiAmountIn, minETHAmountToReceieve, getPathForDAItoETH(), myAccount, deadline);
}
function getPathForDAItoETH() private view returns (address[] memory) {
address[] memory path = new address[](2);
path[0] = kovanDAI;
path[1] = uniswapRouter.WETH();
return path;
}
}我学习了各种YouTube视频和Uniswap (https://uniswap.org/docs/v2/smart-contract-integration/trading-from-a-smart-contract/)的例子。
我遇到了两个问题。
首先,当我用param 28000,0(随机数为0ETH下限)单击convertDAItoETH时。

我收到这条消息了。

当我忽略它并单击,并通过Metamask确认事务时,我的事务很快就失败了。这是我的第二个问题。
当我进入以太扫描并查看事务详细信息时,它会告诉我它失败了Failed with error 'Dai/insufficient-allowance'。
这到底是什么意思?如你所见,我有3.5个戴,所以交换280000戴应该可以。

请帮帮忙。我刚刚开始学习这一点,但我只是找不到任何关于如何调试这种错误的好资源。
谢谢!
我把我的网络搬到了Ropsten。
我创建了一个函数
function setSmartContractAllownace(uint daiAmountIn) public {
daiToken.approve(address(this), daiAmountIn);
}当我运行它时,它成功地通过了(tx:https://ropsten.etherscan.io/tx/0x1a3b29699f353938f7e8b1825ff69aa44e262d90165e87b107131fc5813d05e3)
然后我去https://ropsten.etherscan.io/address/0xaD6D458402F60fD3Bd25163575031ACDce07538D#readContract检查零用钱。
_owner (address)
0x548F97658C6acb9a5A0B034116E79bcF98B9a15a -> (my account)
_spender (address)
0x99941f04C4a1cba96c237e02F1B2f2b3C5Bae5ea -> (my contract)返回0。
但是,如果我同时输入_owner和_spender作为我的合同地址,我将得到我设置的内容。
我以为approve(spender, amountIn)批准业主(账户)S代金券(合同在这种情况下)花。
我误会什么了?
发布于 2020-12-18 22:12:18
因此,我对令牌已经发布与我正在编写的令牌契约产生了误解。
我使用Web3js并通过以下代码加载发布DAI合同
let token = new web3.eth.Contract(erc20ABI.abi, daiContractAddress)
token.methods.approve(uniswapRouter02Address, tokenAmountIn)
.send({ from: web3.eth.defaultAccount, gas: gasLimit })
... // some listeners使用同样的方法,我能够加载我需要的其他合同并使用它们。
我不明白,或者仍然不知道的问题是
approve,合同将批准将用于支出者的资金谢谢你的耐心和帮助我。
发布于 2020-12-12 11:32:35
经过一些评论,我猜你的问题是帐户有正确的DAI余额,但你的合同没有。
让我们举几个例子:
所以这条链是这样的:
transfer向B发送一些C到B,用如下所示调用C的transfer:transfer(B, amount)convertDAItoETHconvertDAItoETH中,B调用C来批准D使用B的C令牌。所以看起来是这样的:C.approve(D, amount)convertDAItoETH B调用D执行交易时,D执行退出C并执行其魔术因此,您应该做的是将一些令牌转移到您的合同中,以便它能够执行approve。一旦合同有了令牌,你就可以通过链,它应该可以工作。
如果您对批准有问题,您应该始终检查审批是否存在--如果不是,您知道您的批准有什么问题(或者合同没有要批准的令牌)。
https://ethereum.stackexchange.com/questions/90960
复制相似问题