Solidity Uniswap V2 Pair中添加流动性

这篇具有很好参考价值的文章主要介绍了Solidity Uniswap V2 Pair中添加流动性。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

        添加流动性的功能的用户入口,UniswapV2在UniswapV2Router中实现,它用来计算新的流动性并发行LP-Token,流动性管理简单地视为LP-Token管理。当你为一个pair增加流动性时,合约会创造LP Token;当你移除流动性时,LP-Token就会被销毁。pair合约中的添加流动性函数,是只执行核心操作的低级函数。

        添加流动性函数

        这是添加流动性的底层函数,

function mint() public {
   uint256 balance0 = IERC20(token0).balanceOf(address(this));
   uint256 balance1 = IERC20(token1).balanceOf(address(this));
   uint256 amount0 = balance0 - reserve0;
   uint256 amount1 = balance1 - reserve1;

   uint256 liquidity;


   if (totalSupply == 0) {
      liquidity = ???
      _mint(address(0), MINIMUM_LIQUIDITY);
   } else {
      liquidity = ???
   }

   if (liquidity <= 0) revert InsufficientLiquidityMinted();
   _mint(msg.sender, liquidity);
   _update(balance0, balance1);
   emit Mint(msg.sender, amount0, amount1);
}

        首先,我们需要计算用户新存入的金额(即没有保存到reserve中的)。然后,计算必须发行的 LP-Token的数量,作为对提供流动性的奖励。然后,我们发行 LP-Token并更新reserve,函数 _update 只是将余额保存到reserve中。

        从代码中可以看出,最初存入pool时,根据totalSupply 是否为0 ,流动性的计算方法是不同的。想想看,当池中没有流动性时,我们需要发行多少 LP-Token?

        对于初始 LP-token的数量,Uniswap V2 最终使用了存入金额的几何平均数:

Solidity Uniswap V2 Pair中添加流动性,solidity合约那点事儿,区块链,智能合约,uniswap

        这样的主要好处是,确保了初始流动性比率不会影响资产池份额的价值。

        然后,我们在计算,当pool里已经有一些流动性时发行LP-Token的情况。

        这里的主要有两个要求,第一是,按照比例,存入的Token;第二是,按照比例,发行LP-Token。

Solidity Uniswap V2 Pair中添加流动性,solidity合约那点事儿,区块链,智能合约,uniswap

        发行LP-Token的数量,与token的存款数量成正比。但是,在一个pair中,有两个潜在的Token——我们应该在公式中使用哪一个呢?

        我们可以选择其中任何一个,但存款金额的比例与reserve的比例越接近,差异就越小。因此,如果存款金额的比例不同,LP-Token金额也会不同,而且其中一个会比另一个大。

        如果我们选择更大的,那么我们将通过提供流动性来激励价格变化,这将导致价格操纵。如果我们选择较小的一个,我们将惩罚不平衡流动性的存款(流动性提供者将获得更少的LP-Token)。很明显,选择更小的数字更有益。

if (totalSupply == 0) {

   liquidity = Math.sqrt(amount0 * amount1) - MINIMUM_LIQUIDITY;

   _mint(address(0), MINIMUM_LIQUIDITY);

} else {

   liquidity = Math.min(

      (amount0 * totalSupply) / _reserve0,

      (amount1 * totalSupply) / _reserve1

   );

}

        在第一个分支中,我们在提供初始流动性时减去 MINIMUM_LIQUIDITY(即常数 1000,或 1e-15)。这样可以防止有人把一个pool的份额做得太贵,从而把小规模的流动性提供者拒之门外。对于大多数pool来说,1000 wei的 LP-Token可以忽略不计,但如果有人试图让一份pool的代币成本过高(比如 100 美元),他们就必须烧掉 1000 倍的成本(即 100,000 美元)。

使用solidity编写测试

        我将使用 Foundry 测试我们的智能合约,它无需与 JavaScript 打交道。我们使用智能合约测试智能合约。这就相当于,测试智能合约的智能合约。

这就是我们设置pair合约测试所需要的:

contract ZuniswapV2PairTest is Test {

  ERC20Mintable token0;

  ERC20Mintable token1;

  ZuniswapV2Pair pair;


  function setUp() public {

    token0 = new ERC20Mintable("Token A", "TKNA");

    token1 = new ERC20Mintable("Token B", "TKNB");

    pair = new ZuniswapV2Pair(address(token0), address(token1));


    token0.mint(10 ether);

    token1.mint(10 ether);

  }

}

测试一下交易对初始化(提供初始流动性):

function testMintBootstrap() public {

  token0.transfer(address(pair), 1 ether);

  token1.transfer(address(pair), 1 ether);


  pair.mint();


  assertEq(pair.balanceOf(address(this)), 1 ether - 1000);

  assertReserves(1 ether, 1 ether);

  assertEq(pair.totalSupply(), 1 ether);

}

1 个ether的Token0 和 1 个ether的Token1 加入测试池。因此,1 个ether的 LP-Token被发行,我们得到 1 个ether - 1000(减去最小流动性)。pool的reserve和总供应量也会相应改变。

如果向一个已有一定流动性的pool提供平衡的流动性,会发生什么情况呢?让我们来看看:

function testMintWhenTheresLiquidity() public {

  token0.transfer(address(pair), 1 ether);

  token1.transfer(address(pair), 1 ether);



  pair.mint(); // + 1 LP



  token0.transfer(address(pair), 2 ether);

  token1.transfer(address(pair), 2 ether);



  pair.mint(); // + 2 LP



  assertEq(pair.balanceOf(address(this)), 3 ether - 1000);

  assertEq(pair.totalSupply(), 3 ether);

  assertReserves(3 ether, 3 ether);

}

让我们看看提供不平衡流动性时会发生什么:

function testMintUnbalanced() public {

  token0.transfer(address(pair), 1 ether);

  token1.transfer(address(pair), 1 ether);



  pair.mint(); // + 1 LP

  assertEq(pair.balanceOf(address(this)), 1 ether - 1000);

  assertReserves(1 ether, 1 ether);



  token0.transfer(address(pair), 2 ether);

  token1.transfer(address(pair), 1 ether);



  pair.mint(); // + 1 LP

  assertEq(pair.balanceOf(address(this)), 2 ether - 1000);

  assertReserves(3 ether, 2 ether);

}

即使用户提供的Token0流动性多于Token1流动性,他们仍然只能获得1 LP-Token。文章来源地址https://www.toymoban.com/news/detail-854353.html

到了这里,关于Solidity Uniswap V2 Pair中添加流动性的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Moonbeam路由流动性

    Moonbeam路由流动性(Moonbeam Routed Liquidity, MRL)使加密资产流动性能够从其他生态系统(如以太坊、Solana、Polygon或Avalanche)进入波卡生态系统。借助MRL,用户可以通过简洁的用户体验向/从波卡转移他们的流动性。 赋予MRL其强大功能的是一个能够让Moonbeam EVM上的任何ERC-20在波卡

    2024年02月09日
    浏览(35)
  • 什么是市场流动性?

    流动性是一种资产可以在不影响其当前市场价格的情况下转换为另一种资产的容易程度。买卖双方都受益于流动性所带来的基本市场动态,流动性低的市场更容易受到资产价格波动、交易僵局和市场操纵的影响。流动性对于促进快速和无缝的市场交易至关重要。。 区块链技术

    2024年01月23日
    浏览(74)
  • 加降息与BTC流动性事件策略研究

    加降息与BTC流动性事件策略研究 不知曾几何时,市场上流传着数字货币与黄金等同的避险论调。也不知曾几何时,市场上通过BTC来观察流动性,作为市场流动性充裕的先行性指标。这些数据和行为不光用于观察全球股市权益市场,同样用来先行性指导和参考固收、大宗商品等

    2023年04月08日
    浏览(34)
  • 未来加密叙事:Web3,DeFi,可持续流动性

    在 Web3.0 时代,数据的快速交互、跨链和多链发展趋势将大大增加互操作性和生态协同性,通过智能合约的基础技术创新,让链上用户价值得到充分体现。在Web3场域下探索DeFi的创新之路将更具前瞻性。 作为加密世界机遇与风险并存的领域,DeFi经历了多轮市场轮换以及投机、

    2024年02月11日
    浏览(28)
  • 借贷协议 Tonka Finance:铭文资产流动性的新破局者

    “Tonka Finance 是铭文赛道中首个借贷协议,它正在为铭文资产赋予捕获流动性的能力,并为其构建全新的金融场景。” 在 2023 年的 1 月,比特币 Ordinals 协议被推出后,包括 BRC20,Ordinals 等在内的系列铭文资产在包括比特币等在内的生态中掀起了一轮狂潮。尤其是在包括 Bina

    2024年02月03日
    浏览(34)
  • Stader Labs 为 BNB Chain 用户提供流动性质押解决方案

    从以太坊 Merge 转为 PoS 之后,大量显卡矿机遭到淘汰,同时全球关于清洁能源方面的讨论也越来越多,PoW 已经逐步走向了末路。接下来对于区块链来说,质押节点和流动性质押成为未来重要的风口,Staking 成为了市场刚需。 对于用户而言,选择一个安全可靠的 Staking 平台至关

    2024年02月03日
    浏览(35)
  • 从8个新 NFT AMM,聊聊能如何为 NFT 提供流动性

    DeFi 的出现,开启了数字金融民主化的革命。其中,通过 AMM 自由创建流动性池极大地增加了 ERC-20 Token 的流动性,并为一些长尾 Token 解锁了价值的发现,因而今天在链上可以看到各种丰富的交易、借贷和杠杆等活动。 而另一方面,随着过去两年 NFT 的普及,基于 NFT 的金融化

    2024年02月14日
    浏览(32)
  • CCG合约量化:DeFi 中的流动性池是什么以及它们如何工作?

    流动资金池在 DeFi 的形成中发挥着重要作用。它们在自动化做市、借贷、收益农业和许多游戏项目中至关重要。但究竟什么是加密货币中的流动性池? 本文解释了流动资金池概念背后的理念,讨论了它们的工作原理,并分享了主要加密项目为何利用资金池。事不宜迟,让我们

    2024年02月11日
    浏览(37)
  • Bit.Store 加密卡集成主流 BRC20通证,助力 BTC 生态流动性

    “Bit.Store 首创性的将包括 ORDI、SATS、以及 RATS 在内的主流 BRC20 资产集成到其加密卡支付中,通过以其推出的加密银行卡为媒介,助力 BTC 生态 Token 的流动性与消费。” 比特币网络在被设计之初,就是以一种去中心化、点对点的现金系统为定位,旨在打破传统金融体系,并创

    2024年01月20日
    浏览(46)
  • 多链混沌:Layer2 格局演变与跨链流动性的新探索

    点击查看原文:多链混沌:Layer2 格局演变与跨链流动性的新探索 如今的 Crypto 是一个由多链构成的混沌世界。曾经,以太坊聚集了加密世界绝大多数的流动性与 DeFi 应用,但现在其 TVL 占比已经降到 60% 以下,并仍处于下降态势。 一些 EVM 兼容链与新公链仍在持续蚕食市场份

    2024年02月02日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包