首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >总是得到‘`Dai/不足-允许’错误

总是得到‘`Dai/不足-允许’错误
EN

Ethereum用户
提问于 2020-12-09 10:40:33
回答 2查看 3.6K关注 0票数 1

用于编辑

的滚动器

我使用的是Solity0.7.5,我正在尝试通过UniswapRouter02从我的帐户将DAI交换到ETH。

这是我的环境

  • 混合IDE
  • 带有KOVAN测试网的Metamask
  • 我有大约2个ETH和3个DAI在我的链接帐户(msg.sender)。

我的代码如下

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

我创建了一个函数

代码语言:javascript
复制
  function setSmartContractAllownace(uint daiAmountIn) public {
     daiToken.approve(address(this), daiAmountIn);
  }

当我运行它时,它成功地通过了(tx:https://ropsten.etherscan.io/tx/0x1a3b29699f353938f7e8b1825ff69aa44e262d90165e87b107131fc5813d05e3)

然后我去https://ropsten.etherscan.io/address/0xaD6D458402F60fD3Bd25163575031ACDce07538D#readContract检查零用钱。

代码语言:javascript
复制
_owner (address)
0x548F97658C6acb9a5A0B034116E79bcF98B9a15a  -> (my account)
_spender (address)
0x99941f04C4a1cba96c237e02F1B2f2b3C5Bae5ea  -> (my contract)

返回0。

但是,如果我同时输入_owner和_spender作为我的合同地址,我将得到我设置的内容。

我以为approve(spender, amountIn)批准业主(账户)S代金券(合同在这种情况下)花。

我误会什么了?

EN

回答 2

Ethereum用户

回答已采纳

发布于 2020-12-18 22:12:18

因此,我对令牌已经发布与我正在编写的令牌契约产生了误解。

我最终没有使用混合和我自己的智能合同.

我使用Web3js并通过以下代码加载发布DAI合同

代码语言:javascript
复制
let token = new web3.eth.Contract(erc20ABI.abi, daiContractAddress)
token.methods.approve(uniswapRouter02Address, tokenAmountIn)
    .send({ from: web3.eth.defaultAccount, gas: gasLimit })
    ... // some listeners

使用同样的方法,我能够加载我需要的其他合同并使用它们。

我不明白,或者仍然不知道的问题是

  1. 我不能批准已经通过混合发布的令牌。
  2. 如果我从合同中调用approve,合同将批准将用于支出者的资金
  3. 那些关于为YouTube令牌编写合同的YouTube视频是我自己的令牌,所以如果我不打算发布自己的令牌,我就不应该这么做。

谢谢你的耐心和帮助我。

票数 0
EN

Ethereum用户

发布于 2020-12-12 11:32:35

经过一些评论,我猜你的问题是帐户有正确的DAI余额,但你的合同没有。

让我们举几个例子:

  • A:你的帐户
  • B:你的定制合同
  • C:象征性合同(DAI)
  • D: Uniswap路由器合同

所以这条链是这样的:

  • A用transfer向B发送一些C到B,用如下所示调用C的transfertransfer(B, amount)
  • 在一个单独的事务中,A调用B的convertDAItoETH
  • convertDAItoETH中,B调用C来批准D使用B的C令牌。所以看起来是这样的:C.approve(D, amount)
  • convertDAItoETH B调用D执行交易时,D执行退出C并执行其魔术

因此,您应该做的是将一些令牌转移到您的合同中,以便它能够执行approve。一旦合同有了令牌,你就可以通过链,它应该可以工作。

如果您对批准有问题,您应该始终检查审批是否存在--如果不是,您知道您的批准有什么问题(或者合同没有要批准的令牌)。

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

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

复制
相关文章

相似问题

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