This entry is part 1 of 1 in the series DeFi dành cho lập trình viên
  • Giải thích công thức tính thanh khoản tự động của Uniswap v2

Uniswap là một giao thức tạo lập thị trường giao dịch tự động (Automated Market Maker) và hoạt động như sàn giao dịch phi tập trung (DEX). Các sàn giao dịch tập trung như Binance thì sàn sẽ đứng ra đảm bảo về thanh khoản cho người dùng khi giao dịch. Nhưng đối với các sàn giao dịch tự động và phi tập trung như Uniswap, thanh khoản sẽ do người dùng cuối cung cấp. Bù lại, người cung cấp thanh khoản sẽ nhận được phần phí giao dịch khi có người hóa đổi token của mình trên giao thức (được gọi là swap).

Uniswap sử dụng công thức x * y = k để tính lượng token nhận được khi swap. Vậy công thức trên hoạt động như thế nào để đảm bảo tính công bằng và tự động cho việc cung cấp thanh khoản? Trong bài viết này, chúng ta sẽ tìm hiểu về công thức này.

Swap giữa ETH và UNI trên Uniswap

Cách tổ chức thanh khoản:

Thanh khoản của các token trong Uniswap sẽ được tổ chức theo từng cặp gọi là pair. Mỗi cặp sẽ có một smart contract riêng tên là Pair.

Ví dụ: Ta có các cặp thanh khoản giữa USDT/ETH và giữa BTC/ETH. Khi đó, ta không chỉ giao dịch được từng cặp: USDT ↔  ETH, BTC ↔ ETH mà vẫn có thể giao dịch giữa USDT ↔ BTC thông qua "cầu nối" ETH.

Khi bạn swap từ token X sang token Y thì có nghĩa là nạp một lượng token X vào smart contract và đồng thời smart contract sẽ trả lại bạn một lượng token Y. Khi đó, lượng token X trong smart contract sẽ tăng lên và lượng token Y sẽ giảm xuống. Mỗi smart contract từng cặp sẽ áp dụng công thức x * y = k để tự động căn bằng số lượng token được lưu trữ.

Công thức:

Uniswap áp dụng công thức sau để cân bằng thanh khoản, trong đó k là hằng số, x và y lần lượt là số lượng token X và Y tương ứng với cặp:

x * y = k

Công thức trên ta có thể biểu diễn công thức bằng đồ thị sau, với x0 , y0 lần lượt là số lượng token hiện có trong Pair contract:

Đồ thị biểu diễn công thức x * y = k

Giả sử như ta bán một lượng dx của token X để nhận về một lượng dy của token Y. Bài toán mà chúng ta cần giải quyết là tính lượng token Y cần trả lại cho người dùng, tức là đi tính dy.

Ta có đồ thị sau:

Đồ thị biểu diễn khi thêm một lượng dx

Dựa vào đồ thị này, ta có lượng token luôn căn bằng theo X * Y = k, ta có:

Chuyển vế, ta được:

Mà k = x0 * y0 nên thay vào k của công thức trên, đồng thời quy đồng mẫu số:

Đơn giản biểu thức, kết quả cuối cùng ta có được là:

Tuy nhiên, công thức trên chỉ đúng khi Uniswap không tín phí giao dịch. Hiện tại Uniswap thu 0.3% trên số lượng token nạp vào (tức là dx). Lượng token nạp vào thực tế chỉ có là 99.7% (ứng với số thập phân là 0.997). Giá trị thực tế của dx phải là 0.997 * dx. Công thức thực tế phải là:

Trong công thức trên, dx là số lượng của token X muốn swap (biết trước). Vậy còn x0 và y0 sẽ được lấy như thế nào? Chúng ta sẽ tìm hiểu về khái niệm reserves ngay bên dưới.

Reserves:

Trong công thức trên, chúng ta cần biết được token lượng token đang lưu trữ của mỗi cặp, tức là x0 , y0 trong công thức. Còn số này trong smart contract của Uniswap gọi là Reservers (tạm dịch là dự trữ).

Con số này có thể biết được thông qua smart contract trên Etherscan.

Đầu tiên, ta cần biết address của Pair contract cần xem. Địa chỉ của mỗi Pair của Uniswap V2 có thể tìm thấy tại: https://v2.info.uniswap.org. Ví dụ: thông tin của ETH-USDT sẽ như ảnh bên dưới. Ta sẽ có thông tin của address của pair và của từng token tạo nên pair để tiện đối chiếu. Ngoài ra, ta có thể clock vào "View on Etherscan" để chuyển qua xem trên EtherScan:

Thông tin Pair trên Uniswap

Chúng ta xem EtherScan ở mục Contract, sẽ có hàm getReserves. Đây là hàm dùng để lấy lượng token hiện tại trong smart contract của Pair:

Hàm getReserves dùng để lấy lượng token có trong Pair contract

Đến đây thì ta đã có giá trị x0 , y0 để thay vào công thức rồi.

Kết:

Trong bài viết này, chúng ta đã biết sơ về cơ chế tự động quản lý thanh khoản của Uniswap, một trong những giao thức hàng đầu về AMM (Automated Market Maker, tạm dịch là giao thức tạo lập thị trường tự động). Đồng thời, chúng ta đã tìm hiểu công thức x * y = k được dùng để vận hành quản lý thanh khoản của giao thức này.

Trong bài viết tiếp theo, bạn muốn mình nói thêm về giao thức Uniswap nữa không? Nếu có, hãy để lại comment nhé. 😉