UniswapV2 学习

  • Nirvana
  • 发布于 1天前
  • 阅读 262

第一步:理解需求LP提供流动性,获取收益凭证普通用户参与swap,以币换币我输入多少币,计算能获得多少币?我要获得多少币,需要输入多少币?第二步:计算公式,怎么算呢?流动性不变,进来0.997dx个Token,换出去多少个yToken呢?​基础公式:(x0+dx

第一步:理解需求

  • LP提供流动性,获取收益凭证
  • 普通用户参与swap,以币换币
    • 我输入多少币,计算能获得多少币?
    • 我要获得多少币,需要输入多少币?

第二步:计算公式,怎么算呢?

流动性不变,进来0.997dx 个 Token,换出去多少个y Token呢?

  • 基础公式: $$ (x{0}+dx) \cdot (y{0}-dy) = x{0}y{0} $$
  • 考虑手续费后: $$ (x{0}+0.997 dx) \cdot (y{0}-dy) = x{0} y{0} $$
  • 最终输出公式: $$ dy=\frac{0.997 dx\cdot y{0}}{x{0}+0.997 dx} $$
  • 完全匹配推导公式:$$ dy=\frac{997dx \cdot y{0}}{1000x{0} + 997dx} $$
# getAmountOut 
        uint amountInWithFee = amountIn.mul(997);

        uint numerator = amountInWithFee.mul(reserveOut);

        uint denominator = reserveIn.mul(1000).add(amountInWithFee);

        amountOut = numerator / denominator;

第三步:工程实现,怎么使用代码实现我这些功能呢?

第四步:遗留问题

  • 扣的手续费去哪里了?

    • 添加进池子里面,增加了流动性
  • 多个交易对怎么交易,怎么扣手续费?

换币内部完整交易流程

image.png 第一步,用户调用路由合约的swapExactTokensForTokens或swapTokensForExactTokens两类方法; 第二步,用户调用transferFrom将钱转给Pair(Pair也是一个合约,由Factory创建); 第三步,Pair内部依据AMM公式完成交换; 第四步,Pair将交换后的token转给用户;

⚠️ ​流程中的关键安全设计

  • 滑点保护​:
    Router 的 amountOutMin 参数确保实际输出量 ≥ 用户设定阈值,否则交易回滚。
  • 手续费分配​:
    0.3% 手续费直接注入流动性池,提升 K 值,使 LP Token 增值。
  • 防重入锁​:
    Pair 合约的 ​lock 修饰符阻止交换过程中重入攻击(如:在 swap 回调中再次调用 swap)。
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
Nirvana
Nirvana
江湖只有他的大名,没有他的介绍。