Agregácia likvidity viacerých strán a dôkaz spravodlivosti poplatkov
Tento dokument poskytuje kompletný matematický dôkaz, účtovný model, číselné príklady a on-chain testovacie overenie dokazujúce, že Biatec CLAMM (BIATEC-CLAMM-01-06-08) vyberá a rozdeľuje poplatky presne aj vtedy, keď viacerí používatelia vkladajú a vyberajú likviditu v tom istom poole v rôznych časoch.
Konkrétne táto príručka dokazuje, že:
- Žiadna strata poplatkov: 100% poplatkov zo swapov a distribuovaných staking odmien je zachytených on-chain a rozdelených medzi poskytovateľov likvidity (
LiquidityUsersFromFees) a protokol (LiquidityBiatecFromFees) s nulovým nepriradeným únikom. - Žiadne odčerpanie poplatkov neskoršími účastníkmi: Poskytovateľ likvidity, ktorý vstúpi do poolu po nahromadení poplatkov, nemôže odčerpať žiadnu časť poplatkov zarobených pred jeho vkladom.
- Žiadne zriedenie existujúcich LP: Existujúci poskytovatelia likvidity si zachovávajú 100% svojej istiny a 100% svojich predtým nahromadených poplatkov, keď do poolu vstúpia noví poskytovatelia likvidity, a ich nahromadené poplatky sa automaticky zložene úročia (compoundujú) ako aktívna likvidita pre nasledujúce obchody.
- Výbery nezávislé od poradia: Keď z poolu vystupuje viacero poskytovateľov likvidity, výplata pre každého účastníka je nezávislá od toho, kto vyberá ako prvý (s presnosťou na atomické jednotky aktíva z celočíselného zaokrúhľovania nadol, ktoré vždy zaokrúhľuje v prospech zostávajúceho poolu).
1. On-chain účtovné premenné a zákon zachovania likvidity
Každý kontrakt BiatecClammPool udržiava štyri základné veličiny likvidity v 9-desatinnej základnej škále ():
| Symbol | Stav kontraktu / Vzorec | Popis |
|---|---|---|
Liquidity (L) | Celková koncentrovaná likvidita odvodená zo sledovaných rezerv . | |
distributedLp | LP tokeny v obehu mimo účtu poolu, preškálované na 9 desatinných miest: . | |
LiquidityUsersFromFees (Lu) | Nahromadená likvidita z poplatkov/odmien vlastnená pomerne (pro rata) držiteľmi LP tokenov v obehu. | |
LiquidityBiatecFromFees (Lb) | Nahromadená likvidita protokolových poplatkov vlastnená exekútorom poplatkov Biatec (addressExecutiveFee). |
Základný invariant zachovania likvidity
V každom okamihu životného cyklu poolu celková likvidita krivky spĺňa:
kde:
- je celkový nárok na likviditu všetkých držiteľov LP tokenov (vyberateľný cez
removeLiquidity), - je celkový nárok na likviditu exekútora protokolových poplatkov (vyberateľný cez
removeLiquidityAdmin), - je zvyšok z celočíselného zaokrúhlenia nadol pod úrovňou mikro-LP ( na vklad), ktorý možno kedykoľvek pripísať do (alebo , ak ) pomocou
reconcileLiquidity.
2. Ako sa zbierajú poplatky pri každom swape a distribúcii odmien
2.1 Narastanie poplatkov zo swapu (swap)
Keď obchodník vymieňa vstupnú sumu (v základnej škále):
-
Odpočítanie poplatku pred ocenením na krivke: Kontrakt vypočíta efektívny násobiteľ poplatkov z parametra
feepoolu a úrovne obchodníka vBiatecIdentityProvider:Iba čistý vstup sa použije na výpočet výstupu protistranného aktíva pozdĺž krivky konštantnej likvidity .
-
Ochrana zaokrúhľovania výstupu: Pri konverzii z 9-desatinnej základnej škály na natívne desatinné miesta výstupného aktíva akýkoľvek nenulový desatinný zvyšok spôsobí zníženie výstupu o 1 natívnu jednotku aktíva (
realSwapBDecimals = realSwapBDecimals - 1), čím sa zaručí, že celočíselná konverzia nikdy neodčerpá rezervy poolu. -
Aktualizácia rezerv a prepočítanie likvidity: Celý vstup (vrátane poplatkovej časti ) sa pripočíta k vstupnej rezerve, zatiaľ čo z výstupnej rezervy sa odpočíta iba skutočne prevedený výstup . Kontrakt následne prepočíta likviditu poolu:
-
Bezozvyškové rozdelenie poplatku (): Prírastok likvidity sa rozdelí medzi držiteľov LP a Biatec:
Pretože je definované ako , súčet platí identicky s nulovou stratou zo zaokrúhľovania.
2.2 Staking a distribúcia prebytočných aktív (distributeExcessAssets)
Keď sa staking odmeny alebo externý výnos pripisujú cez distributeExcessAssets, kontrakt overí fyzické krytie (ensurePoolBalancesWithinHoldings), vypočíta a použije identické bezozvyškové rozdelenie .
3. Matematický dôkaz: agregácia likvidity viacerých strán v rôznych časoch
Uvažujme dvoch nezávislých poskytovateľov likvidity — Stranu A (Existujúci LP) a Stranu B (Nový LP) — ktorí vložia prostriedky do toho istého poolu v rôznych časoch , pričom swapy prebiehajú pred () aj po () vstupe Strany B.
Krok 1 (): Strana A dodá počiatočnú likviditu
Strana A vloží aktíva pridávajúce likvidity do prázdneho poolu ().
-
Strana A dostane mikro-LP tokenov, čo zodpovedá základným jednotkám ().
-
Stav poolu po :
Krok 2 (): Swapy nahromadia poplatky , kým je v poole iba Strana A
Swapy počas vytvoria používateľskú poplatkovú likviditu a protokolovú poplatkovú likviditu .
-
Stav poolu v čase :
-
Keďže Strana A drží 100% LP tokenov v obehu (), vyberateľný nárok Strany A na likviditu v čase je:
-
Každá základná jednotka LP tokenu v obehu je teraz krytá jednotkami používateľskej likvidity.
Krok 3 (): Strana B vloží do poolu
V čase Strana B vloží aktíva, ktoré zvýšia likviditu poolu z na .
V metóde processAddLiquidity kontrakt vypočíta poplatkovo upravené množstvo mintovaných LP :
Pre Stranu B sa namintuje mikro-LP tokenov (, kde ) a nenamintovaná likvidita sa pripíše do LiquidityUsersFromFees:
Celkové množstvo LP v obehu je teraz a celková likvidita vlastnená používateľmi je:
Veta 1 (Strana B nemôže odčerpať predtým nahromadené poplatky)
Ak Strana B okamžite zavolá removeLiquidity so všetkými LP tokenmi v čase , výplata likvidity pre Stranu B je:
Pretože , platí:
Vynásobením hodnotou dostávame:
Záver: Strana B nikdy nemôže vybrať viac likvidity ako (presne tú likviditu, ktorú Strana B vložila). Strana B dostane nula jednotiek z predtým nahromadených poplatkov .
Veta 2 (Strana A si zachováva 100% istiny a predtým nahromadených poplatkov)
Bezprostredne po vstupe Strany B v čase je nárok Strany A na likviditu:
Záver: Nárok Strany A sa vkladom Strany B nikdy nezníži (a zvýši sa najviac o základných jednotiek zaokrúhlenia pod mikro-LP v prospech poolu).
Krok 4 (): Následné swapy nahromadia poplatky , kým sú obe strany v poole
Počas majú Strana A aj Strana B kapitál, ktorý aktívne poskytuje likviditu v poole:
- Aktívna používateľská likvidita Strany A v čase je (počiatočná istina Strany A plus jej zložené poplatky z Epochy 2).
- Aktívna používateľská likvidita Strany B v čase je .
Pretože , pomer LP tokenov v obehu držaných Stranou A a Stranou B spĺňa:
Keď nové swapy v čase pridajú do LiquidityUsersFromFees ():
-
Celkový nárok Strany A sa stáva:
-
Celkový nárok Strany B sa stáva:
Záver: Nové poplatky sa rozdeľujú v presnom pomere k aktívnej likvidite každej strany v poole počas , čím sa automaticky zložene úročia (compoundujú) predchádzajúce výnosy z poplatkov Strany A.
Krok 5 (): Výbery nezávislé od poradia (removeLiquidity)
Keď Strana vyberie svoje LP tokeny ako prvá v čase :
lpWithOthers.myPortionOfFeesCollected.lpDeltaWithFees.LiquidityUsersFromFeessa zníži na .- Rezervy poolu sa vyplatia pomerne podľa , pričom v poole zostane rezerv .
Keď zostávajúca Strana vyberie svoje LP tokeny v čase :
lpWithOthers(pretože LP tokeny Strany boli vrátené do poolu v čase ).myPortionOfFeesCollected.- Strana dostane a
LiquidityUsersFromFeesklesne na .
Prehľad životného cyklu
4. Konkrétny číselný príklad
Predpokladajme, že pool s pevnou cenou (, ) prejde nasledujúcou postupnosťou:
-
Epocha 1 () — Alice vloží :
- Alice dostane mikro-LP ().
- Stav poolu: .
-
Epocha 2 () — Nahromadia sa poplatky/odmeny vo výške ( likvidity):
- ide používateľom () a ide Biatec ().
- Stav poolu: .
- Nárok Alice na likviditu je ().
-
Epocha 3 () — Bob vloží ( likvidity):
-
Kontrakt vypočíta diskontované množstvo LP pre Boba:
-
Bob dostane mikro-LP ( základných jednotiek).
-
Nenamintovaná kompenzácia riedenia poplatkov sa pripočíta k :
-
Celkové LP v obehu: .
-
Kontrola okamžitých nárokov v čase :
- Nárok Boba: (Bob nemôže odčerpať nič z Aliciných poplatkov ).
- Nárok Alice: (Alice si ponechá 100% svojho vkladu a 100% poplatkov z Epochy 2).
-
-
Epocha 4 () — Nahromadia sa ďalšie poplatky/odmeny vo výške ( likvidity):
- ide používateľom () a ide Biatec ().
- .
- Podiel Boba na nových poplatkoch je ().
- Podiel Alice na nových poplatkoch je ().
- Celkový protokolový poplatok Biatec je ().
5. Overenie v on-chain testovacej sade
Všetky invarianty pre poplatky a agregáciu likvidity viacerých strán sú priebežne overované voči živému Algorand LocalNet AVM v testovacej sade Jest:
| Testovací súbor | Overené scenáre |
|---|---|
__test__/pool/multi-party-fee-aggregation.test.ts | 1. Dvaja LP vstupujúci v rôznych časoch počas dvoch epoch swapov sa delia o poplatky striktne podľa aktívnej likvidity . 2. Nezávislosť od poradia výberu (Alice prvá vs. Bob prvý) a izolácia protokolového poplatku Biatec (). 3. Traja LP (Alice, Bob, Charlie) vstupujúci v troch rôznych časoch s čiastočnými (50%) a úplnými výbermi. 4. Staking / distribúcia odmien z prebytočných aktív ( distributeExcessAssets) medzi viacerých LP vstupujúcich v rôznych časoch.5. Rýchle 5-násobné cykly vkladov a výberov druhou stranou nikdy neodčerpávajú poplatky ani neznižujú fyzické držby poolu. |
__test__/pool/liquidity.test.ts | Nový poskytovateľ likvidity, ktorý vstúpi po obojsmerných swapoch a okamžite vyberie prostriedky, nemôže odčerpať predtým nahromadené poplatky (deltaA <= 0, deltaB <= 0). |
__test__/pool/mainnet-replay-3720188642.test.ts | Úplné prehratie 242 transakcií z MainNet histórie poolu Gold/GoldDAO 3720188642 overujúce zachovanie po každom vklade, swape a úplnom výbere. |
__test__/pool/reconcile-liquidity.test.ts | Overenie, že prach zo zaokrúhľovania pod úrovňou mikro-LP sa pripíše do , keď , a do , keď , a že volanie reconcileLiquidity je obmedzené na addressExecutiveFee. |
__test__/pool/fees.test.ts | Deterministické narastanie poplatkov zo swapu, výber LP s poplatkami, výber protokolových poplatkov cez removeLiquidityAdmin a distributeExcessAssets naprieč cenovými rozsahmi. |
Lokálne spustenie overovacej sady
# Uistite sa, že Algorand LocalNet beží
algokit localnet start
# Spustite vyhradenú testovaciu sadu pre agregáciu poplatkov viacerých strán
npx jest __test__/pool/multi-party-fee-aggregation.test.ts
# Spustite kompletné zostavenie kontraktov a celú testovaciu sadu
npm run test