Agregacja płynności wielu podmiotów i dowód uczciwości opłat
Ten dokument zawiera pełny dowód matematyczny, model księgowy, przykłady liczbowe oraz weryfikację w testach on-chain wykazujące, że Biatec CLAMM (BIATEC-CLAMM-01-06-08) pobiera i dystrybuuje opłaty w sposób całkowicie dokładny, gdy wielu użytkowników dostarcza i wypłaca płynność w tej samej puli w różnym czasie.
W szczególności niniejszy przewodnik dowodzi, że:
- Brak utraty opłat: 100% opłat transakcyjnych (swap) oraz dystrybuowanych nagród stakingowych jest rejestrowanych on-chain i dzielonych pomiędzy dostawców płynności (
LiquidityUsersFromFees) a protokół (LiquidityBiatecFromFees) bez żadnego nieprzypisanego wycieku. - Brak przejmowania opłat przez późnych uczestników: Dostawca płynności, który dołącza do puli po naliczeniu opłat, nie może wypłacić żadnej części opłat wypracowanych przed jego depozytem.
- Brak rozwodnienia obecnych dostawców płynności (LP): Dotychczasowi dostawcy płynności zachowują 100% swojego kapitału początkowego oraz 100% wcześniej naliczonych opłat, gdy do puli dołączają nowi dostawcy płynności, a ich naliczone opłaty automatycznie procentują (compoundują) jako aktywna płynność przy kolejnych transakcjach.
- Wypłaty niezależne od kolejności: Gdy wielu dostawców płynności opuszcza pulę, wypłata dla każdego uczestnika jest niezależna od tego, kto wypłaca jako pierwszy (z dokładnością do atomowych jednostek aktywa wynikających z całkowitoliczbowego zaokrąglania w dół, które zawsze działa na korzyść puli).
1. Zmienne księgowe on-chain i niezmiennik zachowania płynności
Każdy kontrakt BiatecClammPool utrzymuje cztery podstawowe wielkości płynności w 9-dziesiętnej skali bazowej ():
| Symbol | Stan kontraktu / Wzór | Opis |
|---|---|---|
Liquidity (L) | Całkowita skoncentrowana płynność wyznaczona ze śledzonych rezerw . | |
distributedLp | Tokeny LP w obiegu poza kontem puli, przeskalowane do 9 miejsc dziesiętnych: . | |
LiquidityUsersFromFees (Lu) | Skumulowana płynność z opłat/nagród należąca proporcjonalnie (pro rata) do posiadaczy tokenów LP będących w obiegu. | |
LiquidityBiatecFromFees (Lb) | Skumulowana płynność opłat protokołu należąca do wykonawcy opłat Biatec (addressExecutiveFee). |
Fundamentalny niezmiennik zachowania płynności
W każdym punkcie cyklu życia puli całkowita płynność krzywej spełnia równanie:
gdzie:
- to całkowite roszczenie płynnościowe wszystkich posiadaczy tokenów LP (do wypłacenia przez
removeLiquidity), - to całkowite roszczenie płynnościowe wykonawcy opłat protokołu (do wypłacenia przez
removeLiquidityAdmin), - to reszta z całkowitoliczbowego zaokrąglenia w dół poniżej mikrojednostki LP ( na depozyt), która może zostać w dowolnym momencie dopisana do (lub , jeśli ) za pomocą
reconcileLiquidity.
2. Jak opłaty są pobierane przy każdym swapie i dystrybucji nagród
2.1 Naliczanie opłat transakcyjnych (swap)
Gdy trader wymienia kwotę wejściową (w skali bazowej):
-
Potrącenie opłaty przed wyceną na krzywej: Kontrakt oblicza efektywny mnożnik opłat na podstawie parametru
feepuli oraz poziomu użytkownika wBiatecIdentityProvider:Wyłącznie kwota netto jest używana do obliczenia kwoty wyjściowej drugiego aktywa wzdłuż krzywej stałej płynności .
-
Ochrona zaokrąglania kwoty wyjściowej: Podczas konwersji z 9-dziesiętnej skali bazowej na natywne miejsca dziesiętne aktywa wyjściowego każda niezerowa reszta ułamkowa powoduje zmniejszenie wypłaty o 1 natywną jednostkę aktywa (
realSwapBDecimals = realSwapBDecimals - 1), dzięki czemu konwersja całkowitoliczbowa nigdy nie uszczupla rezerw puli. -
Aktualizacja rezerw i przeliczenie płynności: Pełna kwota wejściowa (wraz z częścią stanowiącą opłatę ) jest dodawana do rezerwy wejściowej, natomiast od rezerwy wyjściowej odejmowana jest wyłącznie faktycznie przelana kwota . Następnie kontrakt przelicza płynność puli:
-
Wyczerpujący podział opłaty (): Przyrost płynności jest dzielony pomiędzy posiadaczy LP a Biatec:
Ponieważ jest zdefiniowane jako , suma zachodzi tożsamościowo, z zerową stratą na zaokrągleniach.
2.2 Dystrybucja nagród stakingowych i nadwyżki aktywów (distributeExcessAssets)
Gdy nagrody stakingowe lub zewnętrzny zysk są dopisywane przez distributeExcessAssets, kontrakt weryfikuje fizyczne pokrycie w saldach (ensurePoolBalancesWithinHoldings), oblicza i stosuje identyczny wyczerpujący podział .
3. Dowód matematyczny: agregacja płynności wielu podmiotów w różnym czasie
Rozważmy dwóch niezależnych dostawców płynności — Stronę A (Dotychczasowy LP) oraz Stronę B (Nowy LP) — którzy wpłacają środki do tej samej puli w różnych momentach , przy czym swapy odbywają się zarówno przed (), jak i po () dołączeniu Strony B.
Krok 1 (): Strona A dostarcza początkową płynność
Strona A wpłaca aktywa dodające płynności do pustej puli ().
-
Strona A otrzymuje mikrotokenów LP, co odpowiada jednostkom bazowym ().
-
Stan puli po :
Krok 2 (): Swapy naliczają opłaty , gdy w puli jest tylko Strona A
Swapy w przedziale generują płynność opłat dla użytkowników oraz płynność opłat protokołu .
-
Stan puli w chwili :
-
Ponieważ Strona A posiada 100% tokenów LP w obiegu (), całkowite uprawnienie płynnościowe Strony A w chwili wynosi:
-
Każda jednostka bazowa tokenu LP w obiegu ma teraz pokrycie w jednostkach płynności użytkowników.
Krok 3 (): Strona B wpłaca do puli
W chwili Strona B wpłaca aktywa zwiększające płynność puli z do .
W metodzie processAddLiquidity kontrakt oblicza skorygowaną o opłaty ilość mintowanych tokenów LP :
Dla Strony B mintowane jest mikrotokenów LP (, gdzie ), a niewymintowana płynność zostaje dopisana do LiquidityUsersFromFees:
Całkowita liczba LP w obiegu wynosi teraz , a całkowita płynność należąca do użytkowników to:
Twierdzenie 1 (Strona B nie może przejąć wcześniej naliczonych opłat)
Jeśli Strona B natychmiast wywoła removeLiquidity dla wszystkich swoich tokenów w chwili , wypłata płynności dla Strony B wyniesie:
Ponieważ , otrzymujemy:
Mnożąc przez , uzyskujemy:
Wniosek: Strona B nigdy nie może wypłacić więcej płynności niż (dokładnie tyle płynności, ile wpłaciła). Strona B otrzymuje zero jednostek z wcześniej naliczonych opłat .
Twierdzenie 2 (Strona A zachowuje 100% kapitału oraz wcześniej naliczonych opłat)
Bezpośrednio po dołączeniu Strony B w chwili roszczenie płynnościowe Strony A wynosi:
Wniosek: Uprawnienie Strony A nigdy nie ulega zmniejszeniu wskutek depozytu Strony B (a wręcz wzrasta o maksymalnie jednostek bazowych zaokrąglenia na korzyść puli).
Krok 4 (): Kolejne swapy naliczają opłaty , gdy obie strony są w puli
W przedziale zarówno Strona A, jak i Strona B posiadają kapitał aktywnie zapewniający płynność w puli:
- Aktywna płynność Strony A w chwili wynosi (początkowy kapitał Strony A powiększony o skapitalizowane opłaty z Epoki 2).
- Aktywna płynność Strony B w chwili wynosi .
Ponieważ , stosunek tokenów LP w obiegu posiadanych przez Stronę A i Stronę B spełnia zależności:
Gdy nowe swapy w chwili dodają do LiquidityUsersFromFees ():
-
Całkowite roszczenie Strony A wynosi:
-
Całkowite roszczenie Strony B wynosi:
Wniosek: Nowe opłaty są rozdzielane dokładnie proporcjonalnie do aktywnej płynności każdej ze stron w puli w okresie , automatycznie kapitalizując wcześniejsze zyski z opłat Strony A.
Krok 5 (): Wypłaty niezależne od kolejności (removeLiquidity)
Gdy Strona wypłaca swoje tokeny LP jako pierwsza w chwili :
lpWithOthers.myPortionOfFeesCollected.lpDeltaWithFees.LiquidityUsersFromFeeszostaje pomniejszone do .- Rezerwy puli są wypłacane proporcjonalnie według współczynnika , pozostawiając rezerw w puli.
Gdy pozostała Strona wypłaca swoje tokeny LP w chwili :
lpWithOthers(ponieważ tokeny LP Strony wróciły do puli w chwili ).myPortionOfFeesCollected.- Strona otrzymuje , a
LiquidityUsersFromFeesspada do .
Przegląd cyklu życia
4. Konkretny przykład liczbowy
Załóżmy, że pula o stałej cenie (, ) przechodzi przez następującą sekwencję zdarzeń:
-
Epoka 1 () — Alice wpłaca :
- Alice otrzymuje mikro-LP ().
- Stan puli: .
-
Epoka 2 () — Naliczane są opłaty/nagrody w wysokości ( płynności):
- trafia do użytkowników (), a trafia do Biatec ().
- Stan puli: .
- Uprawnienie płynnościowe Alice wynosi ().
-
Epoka 3 () — Bob wpłaca ( płynności):
-
Kontrakt oblicza zdyskontowaną ilość LP do wymintowania dla Boba:
-
Bob otrzymuje mikro-LP ( jednostek bazowych).
-
Niewymintowana korekta rozwodnienia opłat zostaje dodana do :
-
Całkowita liczba LP w obiegu: .
-
Sprawdzenie natychmiastowych roszczeń w chwili :
- Roszczenie Boba: (Bob nie może przejąć żadnej części z opłat Alice).
- Roszczenie Alice: (Alice zachowuje 100% swojego depozytu oraz 100% opłat z Epoki 2).
-
-
Epoka 4 () — Naliczane są dodatkowe opłaty/nagrody w wysokości ( płynności):
- trafia do użytkowników (), a trafia do Biatec ().
- .
- Udział Boba w nowych opłatach wynosi ().
- Udział Alice w nowych opłatach wynosi ().
- Całkowita opłata protokołu Biatec wynosi ().
5. Weryfikacja w zestawach testów on-chain
Wszystkie niezmienniki dotyczące opłat i agregacji płynności wielu podmiotów są stale weryfikowane na żywej maszynie wirtualnej Algorand LocalNet AVM w zestawach testów Jest:
| Plik testowy | Zweryfikowane scenariusze |
|---|---|
__test__/pool/multi-party-fee-aggregation.test.ts | 1. Dwóch dostawców płynności (LP) dołączających w różnym czasie w trakcie dwóch epok swapów dzieli się opłatami ściśle proporcjonalnie do aktywnej płynności . 2. Niezależność wypłat od kolejności (najpierw Alice vs. najpierw Bob) oraz izolacja opłat protokołu Biatec (). 3. Trzech LP (Alice, Bob, Charlie) dołączających w trzech różnych momentach z częściowymi (50%) i pełnymi wypłatami. 4. Dystrybucja nagród stakingowych / nadwyżki aktywów ( distributeExcessAssets) pomiędzy wielu LP dołączających w różnym czasie.5. Szybkie 5-krotne cykle wpłat i wypłat wykonywane przez drugi podmiot nigdy nie przejmują opłat ani nie zmniejszają fizycznych zasobów puli. |
__test__/pool/liquidity.test.ts | Nowy dostawca płynności dołączający po dwukierunkowych swapach i natychmiast wypłacający środki nie może przejąć wcześniej naliczonych opłat (deltaA <= 0, deltaB <= 0). |
__test__/pool/mainnet-replay-3720188642.test.ts | Pełne odtworzenie 242 transakcji z historii MainNet puli Gold/GoldDAO 3720188642 weryfikujące zachowanie równania po każdym depozycie, swapie i pełnym umorzeniu. |
__test__/pool/reconcile-liquidity.test.ts | Weryfikacja, że pył z zaokrąglania poniżej mikrojednostki LP trafia do , gdy , oraz do , gdy , a także że wywołanie reconcileLiquidity jest ograniczone wyłącznie do addressExecutiveFee. |
__test__/pool/fees.test.ts | Deterministyczne naliczanie opłat swap, wypłata LP wraz z opłatami, pobieranie opłat protokołu przez removeLiquidityAdmin oraz distributeExcessAssets w różnych przedziałach cenowych. |
Lokalne uruchomienie zestawu weryfikacyjnego
# Upewnij się, że Algorand LocalNet jest uruchomiony
algokit localnet start
# Uruchom dedykowany zestaw testów agregacji opłat wielu podmiotów
npx jest __test__/pool/multi-party-fee-aggregation.test.ts
# Uruchom pełne budowanie kontraktów oraz cały zestaw testów
npm run test