首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Uniswap V2 addLiquidityETH()

Uniswap V2 addLiquidityETH()
EN

Ethereum用户
提问于 2021-06-06 17:30:30
回答 1查看 2.7K关注 0票数 1

我一直在学习团结和团结是如何运作的。

我找到了一份明智的合同,它吸引了我足够多的人想要用它来学习更牢固的东西。

https://etherscan.io/address/0xa1fc6d28b2fc00ff0ff93b2da3f2b3c8ae85ad64#code

代码语言:javascript
复制
function openTrading() external onlyOwner() {
    require(!tradingOpen,"trading is already open");
    IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
    uniswapV2Router = _uniswapV2Router;
    _approve(address(this), address(uniswapV2Router), _tTotal);
    uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory()).createPair(address(this), _uniswapV2Router.WETH());
    uniswapV2Router.addLiquidityETH{value: address(this).balance}(address(this),balanceOf(address(this)),0,0,owner(),block.timestamp);
    swapEnabled = true;
    cooldownEnabled = true;
    _maxTxAmount = 4250000000 * 10**9;
    tradingOpen = true;
    IERC20(uniswapV2Pair).approve(address(uniswapV2Router), type(uint).max);
}

看起来够简单了吗?仅仅运行openTrading()就可以了,对吗?

相反,我会得到一个错误“警告!在合同执行过程中遇到的倒回错误”。有点莫名其妙。我已经注释掉了每一行,以查看导致该阻止程序的原因,并且当它不调用uniswapV2Router.addLiquidityETH()时,它似乎会做其他的事情。我看过Uniswap的文档,检查了语法和平衡,它们看起来都很好。

因此,对于菜鸟来说,在坚实的环境下,如何正确有效地调试?我用过Remix来部署这个。对于Uniswap,有什么想法吗?

以太扫描事务位于https://kovan.etherscan.io/tx/0x85772a6da056371fdbc797498dcb2fd3fc3cbca52375698bc6d9f9787928e2e2

EN

回答 1

Ethereum用户

发布于 2021-06-09 06:37:53

我写了那份合同:-D

这是一个基本的Safemoon分支,包括修复在HashEx和CertiK审核中发现的所有问题。此外,还有一个开发费功能,它对单个交易征税,这样开发者就可以不用做传统的“团队钱包”补偿,而这正是很多交易员所厌倦的。

openTrading()函数背后的全部原因是,在准备启动之前,我不希望某些“列表”机器人列出令牌。合同的其他部分要求令牌的Uniswap对地址,以执行旨在防止“狙击”机器人过早购买太多令牌的条件,但我无法在没有那些列出机器人注意的情况下创建该对地址。清单中的机器人听取对Uniswap工厂合同进行的任何createPair()函数调用。如果我在构造函数中调用createPair(),该构造函数将在合同部署后立即创建对,那么这些机器人会将令牌列为不可出售的标记(准确地说,此时没有流动性),这将吓跑许多交易者。如果我使用Uniswap来像平常一样增加流动性(这也是一个createPair()调用),那么我就无法在合同中设置对地址,这样狙击机器人就可以进入了。我本可以使用setPair()类型的函数,在通过Uniswap添加流动性之后调用该函数,但这将在添加流动性和设置狙击机器人可以进入的对地址之间创建一个窗口。

openTrading()似乎是解决这些问题的最佳方法。它创造了一对,然后增加了流动性,然后启用了反狙击的机器人保护,所有这些都在同一交易中。因此,清单机器人很高兴,不再有狙击机器人可以进入的窗口。

对于提供给addLiquidityETH()的参数,我没有包括任何是否正确的检查(或指令),因为我不希望其他人使用这段代码。不过,它似乎得到了一些欢迎。

address(this).balance调用中的addLiquidityETH()引用合同本身的ETH余额。这用于Uniswap对的初始流动性,并由addLiquidityETH()将其转换为WETH。流动性对的另一半将是ERC20标记本身,这就是balanceOf(address(this))所指的。该行中的owner()被Uniswap用作接收表示池WETH/ERC20 20令牌的LP令牌的地址。

TLDR

您需要将您计划用于初始流动性的令牌和ETH发送到合约本身。一旦这样做,您应该能够调用openTrading()函数。如果发生了可怕的错误,可以使用manualsend()函数将ETH从合同发送到第一个开发费地址。此外,该函数只能由第一个开发费地址调用,而不能由所有者调用。

附注:

_maxTxAmount = 4250000000 * 10**9;中的4250000000将允许购买的令牌的最大数量设置为42.5亿。我们最初的流动性是8.5亿,000,000令牌(1万亿总供应量,15%被烧毁),所以42.5亿将是0.5%,这似乎是一个足够低的数字,它将防止任何人过早成为鲸鱼。大约一分钟后,限制被提高到1%,然后是10%,然后是100% (禁用限制)。

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

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

复制
相关文章

相似问题

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