q96 = 2**96
def price_to_sqrtp(p):
return int(math.sqrt(p) * q96)
sqrtp_low = price_to_sqrtp(4545)
sqrtp_cur = price_to_sqrtp(5000)
sqrtp_upp = price_to_sqrtp(5500)
def liquidity0(amount, pa, pb):
if pa > pb: # pa is current price and pb is upper price in price range, so how it is
# possible that pa is greater than pb ??
pa, pb = pb, pa # what does this line actually does?
return (amount * (pa * pb) / q96) / (pb - pa) # as we make sqrt of prices, why here
# we used q96 again?
def liquidity1(amount, pa, pb):
if pa > pb:
pa, pb = pb, pa
return amount * q96 / (pb - pa)
eth = 10**18
amount_eth = 1 * eth
amount_usdc = 5000 * eth
liq0 = liquidity0(amount_eth, sqrtp_cur, sqrtp_upp)
liq1 = liquidity1(amount_usdc, sqrtp_cur, sqrtp_low)
liq = int(min(liq0, liq1)) # Does substracting the liq1 from liq0 gives the liq? i mean
# how this works?
> 1517882343751509868544在这段代码中,我有几个问题,我在代码中提出的问题作为注释。
发布于 2023-04-08 15:28:44
怎么可能pa大于pb?
如果用户提供的最高价格(pb)低于当前价格(pa),则此检查已经到位,以处理潜在的输入错误。
"pa,pb = pb,pa“行做什么?
如果pa大于pb,则它只是交换pa和pb的值,这一行保证了pa的值被分配给pb,pb被赋给pa的值。
既然我们的价格是平方吨,为什么还要再使用q96呢?
它用于在计算中保持精度,在计算流动性时,需要在分母中再次使用q96,以抵消比例因子并保持正确的单位。
从liq1中减去liq0是否给出了liq?
不,行"liq = int(min( liq0,liq1))“计算流动性(liq)作为两个计算出的流动性值(liq0和liq1 )的最小值。
https://ethereum.stackexchange.com/questions/148681
复制相似问题