【问题标题】:Automated Market Makers - Liquidity Pool - Question about the calculation自动做市商 - 流动资金池 - 关于计算的问题
【发布时间】:2022-01-05 22:18:30
【问题描述】:

尊敬的, 我想根据 Uniswap V2 逻辑对正确计算池余额的所有步骤进行编码。
任何知道如何提供帮助的人都可以使用任何编程语言(Python、Javascript 等)编写代码,在这个示例中,我使用了 R。
可以在此处查看流动性池的平衡过程:example1example2。 但是,考虑到每笔交易 0.3% 的 Uniswap 费用,目前尚不清楚如何做到这一点。

library(tidyverse)
##### INITIAL PARAMETERS
#Uniswap charges users a flat 0.30% fee for
#every trade that takes place on the platform and 
#automatically sends it to a liquidity reserve
Uniswap.fee <- 0.30 / 100

ETH.initial.price <- 100
ETH.pool.price    <- 100

BNT.initial.price <- 1
BNT.pool.price    <- 1

##### INITIAL SITUATION

BNT.units <- 1000
BNT.total <- BNT.units * BNT.initial.price

ETH.units <- BNT.total / ETH.initial.price
ETH.total <- ETH.units * ETH.initial.price

Pool.Value <- BNT.total + ETH.total
Pool.DF <- data.frame(Symbol = c("BNT", "ETH"), Share = c(BNT.total,ETH.total))
ggplot(Pool.DF, aes(x = Symbol, y=Share, fill=Symbol)) +
  geom_bar(width = 1, position = "dodge", stat="identity") + labs(title="Initial POOL")

##### FINAL SITUATION

ETH.final.price   <- 120
ETH.pool.price    <- 100
BNT.final.price   <- 1
BNT.pool.price    <- 1

##### Imbalanced.Pool
Imbalanced.Pool <- data.frame(Symbol = c("BNT", "ETH"), 
                              Share = c(BNT.total,ETH.units * ETH.final.price ))
ggplot(Imbalanced.Pool, aes(x = Symbol, y=Share, fill=Symbol)) +
  geom_bar(width = 1, position = "dodge", stat="identity")+ labs(title="Imbalanced POOL: ETH valorization")

#### need to balance:

... 现在我不知道如何继续正确平衡并获得无常损失和套利利润值的步骤。

非常感谢,

【问题讨论】:

    标签: javascript python r logic cryptocurrency


    【解决方案1】:

    对于使用自动做市商的 DeFi 协议,我们实现了一对资产(例如 BTC-USDT)的池,我们简单地为这两种资产定价:

    b * u = 常数

    这里b是池中的BTC数量,u是USDT的数量。此外,该常数在许多论文中经常写成K
    现在假设你想将一定数量的 b' BTC 兑换成 USDT。你把 b' BTC 给 DeFi 协议,协议发现它应该减少 USDT 的数量(这将给你)以保持 b * u = 不变。然后通过简单的计算,矿池决定给你 u' USDT,这样: (b+b')*(u-u') = 常数

    通过本次交易(假设没有产生 0.3% 的手续费),您通过赠送 b' BTC 获得 u' USDT。

    然后是 0.3% 的费用。当你给矿池 b' BTC 时,矿池就像你只给了扣除的金额 b'' == 99.7% * b'。然后池计算 u'' 以便

    (b+b'')*(u-u'') = 常数

    在实际计算中,由于小数位数有限(您只能收到 0.1272 USDT 而不是 0.127272727272...),因此总会出现错误。因此,随着越来越多的交换交易被执行,断言的常量会慢慢增加。这会慢慢增加流动资金池的数量。请注意,应计 0.3% 的费用可能不作为流动资金池的一部分。

    对于代码,我会以火烈鸟的代码为例。

    首先你通过 FlamingoSwapRouter 初始化一个交换。您将出售的代币交给路由器 https://github.com/flamingo-finance/flamingo-contract-swap/blob/74e61f8406f9e8ededed72f9cb7e0139091ae17c/Swap/flamingo-contract-swap/FlamingoSwapRouter/FlamingoSwapRouterContract.cs#L237

    然后路由器SafeTransfer你卖出的代币到它的交换对合约,并调用交换合约的swap方法给你你买的代币。
    https://github.com/flamingo-finance/flamingo-contract-swap/blob/74e61f8406f9e8ededed72f9cb7e0139091ae17c/Swap/flamingo-contract-swap/FlamingoSwapPair/FlamingoSwapPairContract.cs#L140
    您可以看到代码var balance0Adjusted = balance0 * 1000 - amount0In * 3;,它调整了流动性池中代币的假设数量。流动性池中有少量的代币是应计费用,而不是流动性的一部分。

    【讨论】:

      猜你喜欢
      • 2022-09-28
      • 2022-11-07
      • 2017-12-15
      • 1970-01-01
      • 2023-02-03
      • 2021-07-06
      • 2018-10-04
      • 2012-12-22
      • 2022-01-09
      相关资源
      最近更新 更多