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:
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à , current-price là .
Ví dụ, Alice đang muốn swap một lượng token1 lấy một lấy token0, chúng ta cần tính xem lượng token0 mà Alice sẽ nhận được là bao nhiêu:
Chúng ta có các tham số đã biết sau:
- => biết được luôn
Các bước tính toán như sau:
- Bước 1: Sử dụng công thức để tính
- Bước 2: Do đã biết được và , dễ dàng suy ra được
- Bước 3: biết được và , thay vào công thức để tính ra được
Nếu để ý, 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 , nghĩa là sẽ chuyển 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.RESOLUTION và FixedPoint96.Q96 mình sẽ nói về chúng ở tập sau:
-
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 token0 lấy token1. Hãy tính toán lượng token1 mà Bob sẽ nhận được:
Chúng ta có các tham số đã biết sau:
- => biết được luôn
Các bước tính toán như sau:
- Bước 1: Sử dụng công thức để tính
- Bước 2: Sử dụng công thức để tính :
Tương tự như ví dụ 1, cũng sẽ ra kết quả âm, điều này thể hiện 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 . 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:
- Bước 2, chính là hàm getAmount1Delta() mà mình đã nói ở phần trước