Több szereplős likviditás-aggregáció és díjméltányossági bizonyítás
Ez a dokumentum tartalmazza a teljes matematikai bizonyítást, a könyvelési modellt, a számszerű példákat és az on-chain tesztellenőrzést, amelyek igazolják, hogy a Biatec CLAMM (BIATEC-CLAMM-01-06-08) pontosan gyűjti és osztja szét a díjakat akkor is, amikor több felhasználó eltérő időpontokban ad hozzá és von ki likviditást ugyanabban a poolban.
Ez az útmutató konkrétan bizonyítja, hogy:
- Nincs díjvesztés: A swap díjak és a szétosztott staking jutalmak 100%-a láncon belül rögzül, és veszteség nélkül oszlik meg a likviditásszolgáltatók (
LiquidityUsersFromFees) és a protokoll (LiquidityBiatecFromFees) között.
- A későn csatlakozók nem tudják lefölözni a korábbi díjakat: Az a likviditásszolgáltató, aki a díjak felhalmozódása után lép be a poolba, nem tudja kivonni a befizetése előtt keletkezett díjak egyetlen részét sem.
- A meglévő LP-k nem hígulnak fel: A meglévő likviditásszolgáltatók megtartják tőkéjük 100%-át és a korábban felhalmozott díjaik 100%-át, amikor új likviditásszolgáltatók csatlakoznak a poolhoz, és a felhalmozott díjaik automatikusan aktív likviditásként kamatoznak tovább a későbbi kereskedések során.
- Kivonási sorrendtől független kifizetések: Amikor több likviditásszolgáltató lép ki a poolból, az egyes résztvevők kifizetése független attól, hogy ki vonja ki először a tőkéjét (legfeljebb ≤2 atomi eszközegységnyi egészosztási lefelé kerekítés erejéig, amely mindig a bent maradó pool javára kerekít).
1. On-chain könyvelési változók és megmaradási invariáns
Minden BiatecClammPool okosszerződés négy alapvető likviditási mennyiséget tart nyilván 9 tizedesjegyű alapléptékben (SCALE=109):
| Szimbólum | Szerződés állapota / Képlet | Leírás |
|---|
| L | Liquidity (L) | A nyilvántartott tartalékokból (x,y)=(assetABalanceBaseScale,assetBBalanceBaseScale) származtatott teljes koncentrált likviditás. |
| D | distributedLp | A pool számláján kívül forgó LP tokenek mennyisége, 9 tizedesjegyre skálázva: D=(TOTAL_SUPPLY−poolLpBalance)×1000. |
| Lu | LiquidityUsersFromFees (Lu) | A forgalomban lévő LP tokenek tulajdonosait arányosan (pro rata) megillető felhalmozott díj-/jutalom-likviditás. |
| Lb | LiquidityBiatecFromFees (Lb) | A Biatec díjvégrehajtót (addressExecutiveFee) megillető felhalmozott protokolldíj-likviditás. |
Alapvető megmaradási invariáns
A pool életciklusának minden pontján a teljes görbe-likviditás L teljesíti az alábbi összefüggést:
L=D+Lu+Lb+U
ahol:
- D+Lu az összes LP token tulajdonos teljes likviditási követelése (
removeLiquidity hívással váltható vissza),
- Lb a protokolldíj-végrehajtó teljes likviditási követelése (
removeLiquidityAdmin hívással váltható vissza),
- U a mikro-LP alatti egész lefelé kerekítési maradék (0≤U<1000 alapegyseˊg=10−6 LP betétenként), amely a
reconcileLiquidity segítségével bármikor jóváírható az Lu számlán (vagy az Lb számlán, ha D=0).
2. Hogyan történik a díjak begyűjtése minden swapon és jutalomszétosztáson
2.1 Swap díjak felhalmozódása (swap)
Amikor egy kereskedő Δin bemeneti összeget swapol (alapléptékben):
-
Díjlevonás a görbe szerinti árazás előtt:
A szerződés kiszámítja a tényleges díjszorzót a pool fee paramétere és a kereskedő BiatecIdentityProvider szintje alapján:
feesMultiplier=s−⌊user.basefee⋅user.feeMultiplier⌋,s=109
Kizárólag a nettó bemenet Δin,afterFee=⌊Δin⋅feesMultiplier/s⌋ vesz részt az ellenoldali eszköz Δout kimenetének kiszámításában az Lold állandó likviditási görbe mentén.
-
Kimeneti kerekítési védelem:
Amikor a Δout értéket a 9 tizedesjegyű alapléptékről a kimeneti eszköz natív tizedeseire váltjuk át, bármilyen nem nulla törtmaradék esetén a kimenet 1 natív eszközegységgel csökken (realSwapBDecimals = realSwapBDecimals - 1), garantálva, hogy az egészre kerekítés soha ne csapolja meg a pool tartalékait.
-
Tartalékok frissítése és a likviditás újraszámítása:
A teljes Δin bemenet (beleértve a Δin−Δin,afterFee díjrészt is) hozzáadódik a bejövő tartalékhoz, miközben a kimenő tartalékból csak a ténylegesen kiutalt Δout,real vonódik le. Ezután a szerződés újraszámítja a pool likviditását:
Lnew=setCurrentLiquidityNonDecreasing(Lold)≥Lold
-
Maradéktalan díjfelosztás (ΔLu+ΔLb=diff):
A diff=Lnew−Lold likviditásnövekedés megoszlik az LP-tulajdonosok és a Biatec között:
ΔLu=⌊sdiff⋅(s−fbiatec)⌋,ΔLb=diff−ΔLu
Mivel a ΔLb definíció szerint diff−ΔLu, a ΔLu+ΔLb=diff összeg azonosan teljesül, nulla kerekítési veszteséggel.
2.2 Staking és többlet eszközök szétosztása (distributeExcessAssets)
Amikor staking jutalmakat vagy külső hozamot írnak jóvá a distributeExcessAssets hívással, a szerződés ellenőrzi a fizikai fedezetet (ensurePoolBalancesWithinHoldings), kiszámítja a diff=Lnew−Lold növekedést, és pontosan ugyanezt a maradéktalan ΔLu+ΔLb=diff felosztást alkalmazza.
3. Matematikai bizonyítás: több fél likviditásának aggregálása eltérő időpontokban
Tekintsünk két független likviditásszolgáltatót — A fél (Meglévő LP) és B fél (Új belépő) —, akik eltérő t0<t2 időpontokban helyeznek el likviditást ugyanabban a poolban, miközben a B fél belépése előtt (t1) és után (t3) is történnek swapok.
1. lépés (t0): Az A fél kezdeti likviditást biztosít
Az A fél eszközöket helyez el, amelyek ΔLA likviditást adnak egy üres poolhoz (D0=0,Lu,0=0,Lb,0=0).
-
Az A fél dA=⌊ΔLA/1000⌋ mikro-LP tokent kap, ami DA=1000dA=ΔLA−rA alapegységnek felel meg (0≤rA<1000).
-
A pool állapota t0 után:
D1=DA,Lu,1=0,Lb,1=0,L1=DA+rA
2. lépés (t1): A swapok F1 díjat halmoznak fel, miközben csak az A fél van a poolban
A [t0,t1] időszakban végrehajtott swapok F1>0 felhasználói díjlikviditást és B1≥0 protokolldíj-likviditást termelnek.
-
A pool állapota t1-ben:
D1=DA,Lu,1=F1,Lb,1=B1,L1′=DA+F1+B1+rA
-
Mivel az A fél birtokolja a forgalomban lévő LP tokenek 100%-át (D1=DA), az A fél visszaváltható likviditási jogosultsága t1-ben:
ClaimA(t1)=DA+⌊DALu,1⋅DA⌋=DA+F1
-
A forgalomban lévő LP tokenek minden egyes alapegysége mögött most DADA+F1>1 egységnyi felhasználói likviditás áll.
3. lépés (t2): A B fél ΔLB likviditást helyez el a poolban
A t2 időpontban a B fél eszközöket fizet be, amelyek a pool likviditását L1′-ről L2=L1′+ΔLB értékre növelik.
A processAddLiquidity metódusban a szerződés kiszámítja a díjakkal korrigált Xbase LP mintelési mennyiséget:
Xbase=⌊DA+F1ΔLB⋅DA⌋
A B fél számára dB=⌊Xbase/1000⌋ mikro-LP token kerül kibocsátásra (DB=1000dB=Xbase−rB, ahol 0≤rB<1000), a nem mintelt ΔLB−Xbase likviditás pedig jóváírásra kerül a LiquidityUsersFromFees számlán:
Lu,2=F1+(ΔLB−Xbase)
A teljes forgalomban lévő LP mennyiség most D2=DA+DB, a teljes felhasználói tulajdonban lévő likviditás pedig:
D2+Lu,2=(DA+Xbase−rB)+(F1+ΔLB−Xbase)=DA+F1+ΔLB−rB
1. tétel (A B fél nem tudja lefölözni a korábban felhalmozott díjakat)
Ha a B fél t2+ időpontban azonnal meghívja a removeLiquidity metódust az összes DB LP tokenjével, a B fél likviditási kifizetése:
ClaimB(t2+)=DB+⌊DA+DBLu,2⋅DB⌋=⌊DA+DB(DA+DB+Lu,2)⋅DB⌋
Mivel DB≤Xbase≤DA+F1ΔLB⋅DA, fennáll, hogy:
DA+DBDB≤DA+XbaseXbase≤DA+F1+ΔLBΔLB
Beszorozva DA+DB+Lu,2=DA+F1+ΔLB−rB≤DA+F1+ΔLB értékkel:
ClaimB(t2+)≤ΔLB
Következtetés: A B fél soha nem tud több likviditást kivonni, mint ΔLB (pontosan annyi likviditást, amennyit befizetett). A B fél nulla egységet kap a korábban felhalmozott F1 díjakból.
2. tétel (Az A fél megtartja tőkéje és korábbi díjai 100%-át)
Közvetlenül a B fél t2+-beli csatlakozása után az A fél likviditási követelése:
ClaimA(t2+)=DA+⌊DA+DBLu,2⋅DA⌋=(DA+F1+ΔLB−rB)−ClaimB(t2+)≥DA+F1
Következtetés: Az A fél ClaimA(t2+) jogosultságát soha nem csökkenti a B fél befizetése (sőt, legfeljebb rB<1000 alapegységnyi mikro-LP alatti kerekítéssel nő a pool javára).
4. lépés (t3): A későbbi swapok F2 díjat halmoznak fel, miközben mindkét fél a poolban van
A [t2,t3] időszakban mind az A fél, mind a B fél tőkéje aktívan biztosít likviditást a poolban:
- Az A fél aktív felhasználói likviditása t2-ben Lactive,A=DA+F1 (az A fél kezdeti tőkéje plusz a 2. korszakban felhalmozott és visszaforgatott F1 díjai).
- A B fél aktív felhasználói likviditása t2-ben Lactive,B=ΔLB.
Mivel DB≈DA+F1ΔLB⋅DA, az A és B fél által birtokolt forgalomban lévő LP tokenek aránya:
DA+DBDA=DA+F1+ΔLBDA+F1=Lactive,A+Lactive,BLactive,A
DA+DBDB=DA+F1+ΔLBΔLB=Lactive,A+Lactive,BLactive,B
Amikor a t3-beli új swapok F2 összeget adnak a LiquidityUsersFromFees számlához (Lu,3=Lu,2+F2):
Következtetés: Az új F2 díjak pontosan az egyes felek [t2,t3] alatti aktív likviditásának arányában oszlanak meg, automatikusan kamatos kamatként (compounding) kezelve az A fél korábbi F1 díjbevételét.
5. lépés (t4,t5): Sorrendtől független kivonások (removeLiquidity)
Amikor az i∈{A,B} fél elsőként vonja ki Di LP tokenjeit t4-ben:
lpWithOthers =DA+DB.
myPortionOfFeesCollected =⌊DA+DBLu,3⋅Di⌋.
lpDeltaWithFees =Di+myPortionOfFeesCollected=Claimi(t3).
- A
LiquidityUsersFromFees értéke Lu,4=Lu,3−myPortionOfFeesCollected értékre csökken.
- A pool (x,y) tartalékai arányosan, LClaimi(t3) arányban kerülnek kifizetésre, így az (x,y) tartalékok LL−Claimi(t3) hányada marad a poolban.
Amikor a bent maradó j=i fél kivonja Dj LP tokenjeit t5-ben:
lpWithOthers =Dj (mivel az i fél LP tokenjei t4-ben visszakerültek a poolba).
myPortionOfFeesCollected =⌊DjLu,4⋅Dj⌋=Lu,4.
- A j fél megkapja a Dj+Lu,4=Claimj(t3) összeget, a
LiquidityUsersFromFees pedig 0-ra csökken.
Életciklus áttekintése
4. Konkrét számszerű példa
Tegyük fel, hogy egy rögzített áras pool (P=1.0, biatecFee=10%) az alábbi folyamaton megy keresztül:
-
1. korszak (t0) — Alice befizet 100 A+100 B összeget:
- ΔLA=200×109
- Alice kap 200,000,000 mikro-LP-t (DA=200×109).
- Pool állapota: L=200×109,D=200×109,Lu=0,Lb=0.
-
2. korszak (t1) — 20 A+20 B (40×109 likviditás) díj/jutalom halmozódik fel:
- 90% a felhasználókat illeti (ΔLu=36×109), 10% pedig a Biatecet (ΔLb=4×109).
- Pool állapota: L=240×109,D=200×109,Lu=36×109,Lb=4×109.
- Alice likviditási jogosultsága DA+Lu=236×109 (118 A+118 B).
-
3. korszak (t2) — Bob befizet 60 A+60 B összeget (ΔLB=120×109 likviditás):
-
A szerződés kiszámítja Bob diszkontált LP mintelését:
Xbase=⌊(200+36)×109120×109×200×109⌋=101,694,915,254
-
Bob kap dB=101,694,915 mikro-LP-t (DB=101,694,915,000 alapegység).
-
A nem mintelt díjhígulási ellentételezés ΔLB−Xbase=18,305,084,746 hozzáadódik az Lu-hoz:
Lu,2=36×109+18,305,084,746=54,305,084,746
-
Teljes forgalomban lévő LP: D2=301,694,915,000.
-
Azonnali követelések ellenőrzése t2+-ban:
- Bob követelése: 101,694,915,000+⌊301,694,915,00054,305,084,746×101,694,915,000⌋=119,999,999,700≤120×109 (Bob egyetlen egységet sem tud lefölözni Alice 36×109 díjából).
- Alice követelése: 200×109+⌊301,694,915,00054,305,084,746×200×109⌋=236,000,000,046≥236×109 (Alice megtartja betétje 100%-át és a 2. korszak díjainak 100%-át).
-
4. korszak (t3) — További 10 A+10 B (20×109 likviditás) díj/jutalom halmozódik fel:
- 90% a felhasználókat illeti (ΔLu=18×109), 10% pedig a Biatecet (ΔLb=2×109).
- Lu,3=54,305,084,746+18×109=72,305,084,746.
- Bob részesedése az új 18×109 díjból: 236+120120×18×109≈6.0674×109 (≈3.0337 A+3.0337 B).
- Alice részesedése az új 18×109 díjból: 236+120236×18×109