- vừa được xem lúc

Cũng dễ. Phần 3: Swap hoy.

0 0 9

Người đăng: thiên thần gãy cánh

Theo Viblo Asia

Phần trước mình đã làm rõ các 2 công thức để tính amountToken0 và amountToken1 mà provider phải cho vào khi thêm thanh khoản. Bây giờ chúng ta sẽ làm rõ việc việc swap, các con số sẽ tính toán như thế nào. Nhắc lại các công thức:

  1. L=xyL = \sqrt{xy}

  2. P=yxP = \frac{y}{x}

  3. Δy=LΔP\Delta{y} = L* \Delta{\sqrt{P}}

  4. Δx=LΔ1P\Delta{x} = L * \Delta{\frac{1}{\sqrt{P}}}

3. Swap

3.1 Swap trong 1 price-range

Ví dụ 1: Swap token1 lấy token0

Đầu tiên để đơn giản, chúng ta sẽ xét đến việc swap trong price-range trước. Current-price-range đang có thanh khoản là LL, current-price là P0P_0.

Ví dụ, Alice đang muốn swap một lượng Δy\Delta{y} token1 lấy một lấy token0, chúng ta cần tính xem lượng Δx\Delta{x} token0 mà Alice sẽ nhận được là bao nhiêu:

image.png

Chúng ta có các tham số đã biết sau:

  • Δy\Delta{y}
  • P0P_0 => biết được luôn P0\sqrt{P_0}
  • LL

Các bước tính toán như sau:

  • Bước 1: Sử dụng công thức (3)(3) để tính ΔP\Delta{\sqrt{P}}

ΔP=ΔyL\Delta{\sqrt{P}} = \frac{\Delta{y}}{L}

  • Bước 2: Do đã biết được P0\sqrt{P_0}ΔP\Delta{\sqrt{P}}, dễ dàng suy ra được P1\sqrt{P_1}

P1=P0+ΔP\sqrt{P_1} = \sqrt{P_0} + \Delta{\sqrt{P}}

  • Bước 3: biết được P0\sqrt{P_0}P1\sqrt{P_1}, thay vào công thức (4)(4) để tính ra được Δx\Delta{x}

Δx=L(P0P1P1P0)\Delta{x} = L * (\frac{\sqrt{P_0} - \sqrt{P_1}}{\sqrt{P_1} \sqrt{P_0}})

Nếu để ý, Δx\Delta{x} sẽ ra kết quả âm, điều này thể hiện là sau khi swap, lượng token0 trong Pool sẽ giảm đi một lượng Δx|\Delta{x}|, nghĩa là sẽ chuyển Δx|\Delta{x}| token0 từ Pool cho Alice.

Đối chiếu vào code ta sẽ có:

  • Bước 1+2, chính là hàm getNextSqrtPriceFromAmount1RoundingDown() trong file libraries/SqrtPriceMath.sol, đừng lăn tăn về FixedPoint96.RESOLUTIONFixedPoint96.Q96 mình sẽ nói về chúng ở tập sau: image.png

  • Bước 3, chính là hàm getAmount0Delta() mà mình đã nói ở phần trước

Ví dụ 2: Swap token0 lấy token1

Ví dụ, Bob đang muốn swap 1 lượng Δx\Delta{x} token0 lấy token1. Hãy tính toán lượng Δy\Delta{y} token1 mà Bob sẽ nhận được: image.png

Chúng ta có các tham số đã biết sau:

  • Δx\Delta{x}
  • P0P_0 => biết được luôn P0\sqrt{P_0}
  • LL

Các bước tính toán như sau:

  • Bước 1: Sử dụng công thức (4)(4) để tính P1\sqrt{P_1}

Δx=LΔ1P\Delta{x} = L\Delta{\frac{1}{\sqrt{P}}}

<=>Δx=L(1P11P0)<=> \Delta{x} = L(\frac{1}{\sqrt{P_1}} - \frac{1}{\sqrt{P_0}})

<=>LP1=Δx+LP0<=> \frac{L}{\sqrt{P_1}} = \Delta{x} + \frac{L}{\sqrt{P_0}}

<=>LP1=ΔxP0+LP0<=> \frac{L}{\sqrt{P_1}} = \frac{\Delta{x}\sqrt{P_0} + L}{\sqrt{P_0}}

<=>P1=LP0ΔxP0+L<=> \sqrt{P_1} = \frac{L\sqrt{P_0}}{\Delta{x}\sqrt{P_0} + L}

<=>P1=LΔx+LP0<=> \sqrt{P_1} = \frac{L}{\Delta{x} + \frac{L}{\sqrt{P_0}}}

  • Bước 2: Sử dụng công thức (3)(3) để tính Δy\Delta{y}:

Δy=L(P1P0)\Delta{y} = L * (\sqrt{P_1} - \sqrt{P_0})

Tương tự như ví dụ 1, Δy\Delta{y} cũng sẽ ra kết quả âm, điều này thể hiện Δy|\Delta{y}| sẽ là lượng token1 mà Pool sẽ chuyển cho Bob.

Đối chiếu vào code ta sẽ có:

  • Bước 1, chính là hàm getNextSqrtPriceFromAmount0RoundingUp() trong libraries/SqrtPriceMath.sol. Hàm này tính P1=LΔx+LP0\sqrt{P_1} = \frac{L}{\Delta{x} + \frac{L}{\sqrt{P_0}}}. Tại sao? Điều này mình sẽ giải thích cùng với FixedPoint96.RESOLUTION vào tập sau: image.png
  • Bước 2, chính là hàm getAmount1Delta() mà mình đã nói ở phần trước

3.2 Swap cross qua các price-range

Bình luận

Bài viết tương tự

- vừa được xem lúc

[Blockchain] Road to Bitcoin

. Chắc mọi người hẳn đã không còn xa lạ gì với anh chàng tỷ phú đã ném vỡ cửa kính ô tô nhà mình cùng với siêu năng lực điều khiển vật giá chỉ bằng lời nói, người đã đẩy định giá Bitcoin trên thị trường vượt ngưỡng 50K dolar/coin với những bài twitter để đời . .

0 0 61

- vừa được xem lúc

Khi Ethereum có chi phí giao dịch quá đắt đỏ - Tương lai cho layer2 ?

Với sự phát triển như vũ bão của Blockchain, ETH dường như đang quá tải và hệ quả là chi phí Gas đã lên đến 1000Gwei, phí để tạo những transaction phức tạp đã xấp xỉ 500$ . Và một giải pháp cứu cánh cho các sản phẩm Defi trên ETH chính là Layer2, và trong nhiệm vụ lần này Matic đang thể hiện khả năn

0 0 89

- vừa được xem lúc

Blockchain với Java - Tại sao không?

Cuộc cách mạng công nghiệp 4.0 ra đời kéo theo nhiều sự thay đổi và xu hướng mới được hình thành. Riêng đối với lĩnh vực CNTT cũng không nằm ngoài vùng ảnh hưởng mạnh mẽ. Chính làn sóng 4.

0 0 92

- vừa được xem lúc

Phân loại và tầm quan trọng của các node trong mạng blockchain

Trước khi đi vào phân loại và nêu rõ được tầm quan trọng của các node trọng mạng blockchain thì mình xin được trích dẫn khái niệm về blockchain từ Wikipedia như sau:. .

0 1 65

- vừa được xem lúc

Code Smart Contract bằng Assembly ?

Introduction. Hồi còn học trong ghế nhà trường bộ môn lập trình tốn nhiều não nhất của mình là code assembly. Nôm na thì bất cứ ngôn ngữ bậc cao nào như C , Go, Java,... được sinh ra để người dễ hiểu và dễ code , tuy nhiên chúng đều sẽ được compiled down xuống assembly một ngôn ngữ bậc thấp để máy h

0 0 58

- vừa được xem lúc

Dextool - Công cụ phân tích Decentralized Exchange tuyệt vời

. Trend Defi mặc dù đã bớt nhiệt nhưng những sản phẩm nổi bật của làn sóng này mang lại thì vẫn rất được người dùng ưa chuộng. Đặc biệt là các nền tảng Decentralized Exchange, tiêu biểu là Uniswap, SushiSwap, 1inch Exchange, FalconSwap,... Nhưng khi đã sử dụng các nền tảng DEx này mà không biết đến

0 0 106