Skip to main content

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:

  1. 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.
  2. 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.
  3. 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.
  4. 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\le 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\text{SCALE} = 10^9):

SzimbólumSzerződés állapota / KépletLeírás
LLLiquidity (L)A nyilvántartott tartalékokból (x,y)=(assetABalanceBaseScale,assetBBalanceBaseScale)(x, y) = (\text{assetABalanceBaseScale}, \text{assetBBalanceBaseScale}) származtatott teljes koncentrált likviditás.
DDdistributedLpA pool számláján kívül forgó LP tokenek mennyisége, 9 tizedesjegyre skálázva: D=(TOTAL_SUPPLY−poolLpBalance)×1000D = (\text{TOTAL\_SUPPLY} - \text{poolLpBalance}) \times 1000.
LuL_uLiquidityUsersFromFees (Lu)A forgalomban lévő LP tokenek tulajdonosait arányosan (pro rata) megillető felhalmozott díj-/jutalom-likviditás.
LbL_bLiquidityBiatecFromFees (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 LL teljesíti az alábbi összefüggést:

L=D+Lu+Lb+UL = D + L_u + L_b + U

ahol:

  • D+LuD + L_u az összes LP token tulajdonos teljes likviditási követelése (removeLiquidity hívással váltható vissza),
  • LbL_b a protokolldíj-végrehajtó teljes likviditási követelése (removeLiquidityAdmin hívással váltható vissza),
  • UU a mikro-LP alatti egész lefelé kerekítési maradék (0≤U<1000 alapegyseˊg=10−6 LP0 \le U < 1000\text{ alapegység} = 10^{-6}\text{ LP} betétenként), amely a reconcileLiquidity segítségével bármikor jóváírható az LuL_u számlán (vagy az LbL_b számlán, ha D=0D = 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\Delta_{\text{in}} bemeneti összeget swapol (alapléptékben):

  1. 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−⌊fee⋅user.feeMultiplieruser.base⌋,s=109\text{feesMultiplier} = s - \left\lfloor \frac{\text{fee} \cdot \text{user.feeMultiplier}}{\text{user.base}} \right\rfloor, \quad s = 10^9

    Kizárólag a nettó bemenet Δin,afterFee=⌊Δin⋅feesMultiplier/s⌋\Delta_{\text{in,afterFee}} = \lfloor \Delta_{\text{in}} \cdot \text{feesMultiplier} / s \rfloor vesz részt az ellenoldali eszköz Δout\Delta_{\text{out}} kimenetének kiszámításában az LoldL_{\text{old}} állandó likviditási görbe mentén.

  2. Kimeneti kerekítési védelem: Amikor a Δout\Delta_{\text{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.

  3. Tartalékok frissítése és a likviditás újraszámítása: A teljes Δin\Delta_{\text{in}} bemenet (beleértve a Δin−Δin,afterFee\Delta_{\text{in}} - \Delta_{\text{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\Delta_{\text{out,real}} vonódik le. Ezután a szerződés újraszámítja a pool likviditását:

    Lnew=setCurrentLiquidityNonDecreasing(Lold)≥LoldL_{\text{new}} = \text{setCurrentLiquidityNonDecreasing}(L_{\text{old}}) \ge L_{\text{old}}
  4. Maradéktalan díjfelosztás (ΔLu+ΔLb=diff\Delta L_u + \Delta L_b = \text{diff}): A diff=Lnew−Lold\text{diff} = L_{\text{new}} - L_{\text{old}} likviditásnövekedés megoszlik az LP-tulajdonosok és a Biatec között:

    ΔLu=⌊diff⋅(s−fbiatec)s⌋,ΔLb=diff−ΔLu\Delta L_u = \left\lfloor \frac{\text{diff} \cdot (s - f_{\text{biatec}})}{s} \right\rfloor, \quad \Delta L_b = \text{diff} - \Delta L_u

    Mivel a ΔLb\Delta L_b definíció szerint diff−ΔLu\text{diff} - \Delta L_u, a ΔLu+ΔLb=diff\Delta L_u + \Delta L_b = \text{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\text{diff} = L_{\text{new}} - L_{\text{old}} növekedést, és pontosan ugyanezt a maradéktalan ΔLu+ΔLb=diff\Delta L_u + \Delta L_b = \text{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<t2t_0 < t_2 időpontokban helyeznek el likviditást ugyanabban a poolban, miközben a B fél belépése előtt (t1t_1) és után (t3t_3) is történnek swapok.

1. lépés (t0t_0): Az A fél kezdeti likviditást biztosít​

Az A fél eszközöket helyez el, amelyek ΔLA\Delta L_A likviditást adnak egy üres poolhoz (D0=0,Lu,0=0,Lb,0=0D_0 = 0, L_{u,0} = 0, L_{b,0} = 0).

  • Az A fél dA=⌊ΔLA/1000⌋d_A = \lfloor \Delta L_A / 1000 \rfloor mikro-LP tokent kap, ami DA=1000 dA=ΔLA−rAD_A = 1000 \, d_A = \Delta L_A - r_A alapegységnek felel meg (0≤rA<10000 \le r_A < 1000).

  • A pool állapota t0t_0 után:

    D1=DA,Lu,1=0,Lb,1=0,L1=DA+rAD_1 = D_A, \quad L_{u,1} = 0, \quad L_{b,1} = 0, \quad L_1 = D_A + r_A

2. lépés (t1t_1): A swapok F1F_1 díjat halmoznak fel, miközben csak az A fél van a poolban​

A [t0,t1][t_0, t_1] időszakban végrehajtott swapok F1>0F_1 > 0 felhasználói díjlikviditást és B1≥0B_1 \ge 0 protokolldíj-likviditást termelnek.

  • A pool állapota t1t_1-ben:

    D1=DA,Lu,1=F1,Lb,1=B1,L1′=DA+F1+B1+rAD_1 = D_A, \quad L_{u,1} = F_1, \quad L_{b,1} = B_1, \quad L_1' = D_A + F_1 + B_1 + r_A
  • Mivel az A fél birtokolja a forgalomban lévő LP tokenek 100%-át (D1=DAD_1 = D_A), az A fél visszaváltható likviditási jogosultsága t1t_1-ben:

    ClaimA(t1)=DA+⌊Lu,1⋅DADA⌋=DA+F1\text{Claim}_A(t_1) = D_A + \left\lfloor \frac{L_{u,1} \cdot D_A}{D_A} \right\rfloor = D_A + F_1
  • A forgalomban lévő LP tokenek minden egyes alapegysége mögött most DA+F1DA>1\frac{D_A + F_1}{D_A} > 1 egységnyi felhasználói likviditás áll.

3. lépés (t2t_2): A B fél ΔLB\Delta L_B likviditást helyez el a poolban​

A t2t_2 időpontban a B fél eszközöket fizet be, amelyek a pool likviditását L1′L_1'-ről L2=L1′+ΔLBL_2 = L_1' + \Delta L_B értékre növelik.

A processAddLiquidity metódusban a szerződés kiszámítja a díjakkal korrigált XbaseX_{\text{base}} LP mintelési mennyiséget:

Xbase=⌊ΔLB⋅DADA+F1⌋X_{\text{base}} = \left\lfloor \frac{\Delta L_B \cdot D_A}{D_A + F_1} \right\rfloor

A B fél számára dB=⌊Xbase/1000⌋d_B = \lfloor X_{\text{base}} / 1000 \rfloor mikro-LP token kerül kibocsátásra (DB=1000 dB=Xbase−rBD_B = 1000 \, d_B = X_{\text{base}} - r_B, ahol 0≤rB<10000 \le r_B < 1000), a nem mintelt ΔLB−Xbase\Delta L_B - X_{\text{base}} likviditás pedig jóváírásra kerül a LiquidityUsersFromFees számlán:

Lu,2=F1+(ΔLB−Xbase)L_{u,2} = F_1 + (\Delta L_B - X_{\text{base}})

A teljes forgalomban lévő LP mennyiség most D2=DA+DBD_2 = D_A + D_B, a teljes felhasználói tulajdonban lévő likviditás pedig:

D2+Lu,2=(DA+Xbase−rB)+(F1+ΔLB−Xbase)=DA+F1+ΔLB−rBD_2 + L_{u,2} = (D_A + X_{\text{base}} - r_B) + (F_1 + \Delta L_B - X_{\text{base}}) = D_A + F_1 + \Delta L_B - r_B

1. tétel (A B fél nem tudja lefölözni a korábban felhalmozott díjakat)​

Ha a B fél t2+t_2^+ időpontban azonnal meghívja a removeLiquidity metódust az összes DBD_B LP tokenjével, a B fél likviditási kifizetése:

ClaimB(t2+)=DB+⌊Lu,2⋅DBDA+DB⌋=⌊(DA+DB+Lu,2)⋅DBDA+DB⌋\text{Claim}_B(t_2^+) = D_B + \left\lfloor \frac{L_{u,2} \cdot D_B}{D_A + D_B} \right\rfloor = \left\lfloor \frac{(D_A + D_B + L_{u,2}) \cdot D_B}{D_A + D_B} \right\rfloor

Mivel DB≤Xbase≤ΔLB⋅DADA+F1D_B \le X_{\text{base}} \le \frac{\Delta L_B \cdot D_A}{D_A + F_1}, fennáll, hogy:

DBDA+DB≤XbaseDA+Xbase≤ΔLBDA+F1+ΔLB\frac{D_B}{D_A + D_B} \le \frac{X_{\text{base}}}{D_A + X_{\text{base}}} \le \frac{\Delta L_B}{D_A + F_1 + \Delta L_B}

Beszorozva DA+DB+Lu,2=DA+F1+ΔLB−rB≤DA+F1+ΔLBD_A + D_B + L_{u,2} = D_A + F_1 + \Delta L_B - r_B \le D_A + F_1 + \Delta L_B értékkel:

ClaimB(t2+)≤ΔLB\text{Claim}_B(t_2^+) \le \Delta L_B

Következtetés: A B fél soha nem tud több likviditást kivonni, mint ΔLB\Delta L_B (pontosan annyi likviditást, amennyit befizetett). A B fél nulla egységet kap a korábban felhalmozott F1F_1 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+t_2^+-beli csatlakozása után az A fél likviditási követelése:

ClaimA(t2+)=DA+⌊Lu,2⋅DADA+DB⌋=(DA+F1+ΔLB−rB)−ClaimB(t2+)≥DA+F1\text{Claim}_A(t_2^+) = D_A + \left\lfloor \frac{L_{u,2} \cdot D_A}{D_A + D_B} \right\rfloor = (D_A + F_1 + \Delta L_B - r_B) - \text{Claim}_B(t_2^+) \ge D_A + F_1

Következtetés: Az A fél ClaimA(t2+)\text{Claim}_A(t_2^+) jogosultságát soha nem csökkenti a B fél befizetése (sőt, legfeljebb rB<1000r_B < 1000 alapegységnyi mikro-LP alatti kerekítéssel nő a pool javára).

4. lépés (t3t_3): A későbbi swapok F2F_2 díjat halmoznak fel, miközben mindkét fél a poolban van​

A [t2,t3][t_2, t_3] 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 t2t_2-ben Lactive,A=DA+F1L_{\text{active},A} = D_A + F_1 (az A fél kezdeti tőkéje plusz a 2. korszakban felhalmozott és visszaforgatott F1F_1 díjai).
  • A B fél aktív felhasználói likviditása t2t_2-ben Lactive,B=ΔLBL_{\text{active},B} = \Delta L_B.

Mivel DB≈ΔLB⋅DADA+F1D_B \approx \frac{\Delta L_B \cdot D_A}{D_A + F_1}, az A és B fél által birtokolt forgalomban lévő LP tokenek aránya:

DADA+DB=DA+F1DA+F1+ΔLB=Lactive,ALactive,A+Lactive,B\frac{D_A}{D_A + D_B} = \frac{D_A + F_1}{D_A + F_1 + \Delta L_B} = \frac{L_{\text{active},A}}{L_{\text{active},A} + L_{\text{active},B}} DBDA+DB=ΔLBDA+F1+ΔLB=Lactive,BLactive,A+Lactive,B\frac{D_B}{D_A + D_B} = \frac{\Delta L_B}{D_A + F_1 + \Delta L_B} = \frac{L_{\text{active},B}}{L_{\text{active},A} + L_{\text{active},B}}

Amikor a t3t_3-beli új swapok F2F_2 összeget adnak a LiquidityUsersFromFees számlához (Lu,3=Lu,2+F2L_{u,3} = L_{u,2} + F_2):

  • Az A fél teljes követelése:

    ClaimA(t3)=(DA+F1)+DA+F1DA+F1+ΔLBF2\text{Claim}_A(t_3) = (D_A + F_1) + \frac{D_A + F_1}{D_A + F_1 + \Delta L_B} F_2
  • A B fél teljes követelése:

    ClaimB(t3)=ΔLB+ΔLBDA+F1+ΔLBF2\text{Claim}_B(t_3) = \Delta L_B + \frac{\Delta L_B}{D_A + F_1 + \Delta L_B} F_2

Következtetés: Az új F2F_2 díjak pontosan az egyes felek [t2,t3][t_2, t_3] alatti aktív likviditásának arányában oszlanak meg, automatikusan kamatos kamatként (compounding) kezelve az A fél korábbi F1F_1 díjbevételét.

5. lépés (t4,t5t_4, t_5): Sorrendtől független kivonások (removeLiquidity)​

Amikor az i∈{A,B}i \in \{A, B\} fél elsőként vonja ki DiD_i LP tokenjeit t4t_4-ben:

  1. lpWithOthers =DA+DB= D_A + D_B.
  2. myPortionOfFeesCollected =⌊Lu,3⋅DiDA+DB⌋= \lfloor \frac{L_{u,3} \cdot D_i}{D_A + D_B} \rfloor.
  3. lpDeltaWithFees =Di+myPortionOfFeesCollected=Claimi(t3)= D_i + \text{myPortionOfFeesCollected} = \text{Claim}_i(t_3).
  4. A LiquidityUsersFromFees értéke Lu,4=Lu,3−myPortionOfFeesCollectedL_{u,4} = L_{u,3} - \text{myPortionOfFeesCollected} értékre csökken.
  5. A pool (x,y)(x, y) tartalékai arányosan, Claimi(t3)L\frac{\text{Claim}_i(t_3)}{L} arányban kerülnek kifizetésre, így az (x,y)(x, y) tartalékok L−Claimi(t3)L\frac{L - \text{Claim}_i(t_3)}{L} hányada marad a poolban.

Amikor a bent maradó j≠ij \ne i fél kivonja DjD_j LP tokenjeit t5t_5-ben:

  1. lpWithOthers =Dj= D_j (mivel az ii fél LP tokenjei t4t_4-ben visszakerültek a poolba).
  2. myPortionOfFeesCollected =⌊Lu,4⋅DjDj⌋=Lu,4= \lfloor \frac{L_{u,4} \cdot D_j}{D_j} \rfloor = L_{u,4}.
  3. A jj fél megkapja a Dj+Lu,4=Claimj(t3)D_j + L_{u,4} = \text{Claim}_j(t_3) összeget, a LiquidityUsersFromFees pedig 00-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.0P = 1.0, biatecFee=10%\text{biatecFee} = 10\%) az alábbi folyamaton megy keresztül:

  1. 1. korszak (t0t_0) — Alice befizet 100 A+100 B100\text{ A} + 100\text{ B} összeget:

    • ΔLA=200×109\Delta L_A = 200 \times 10^9
    • Alice kap 200,000,000200,000,000 mikro-LP-t (DA=200×109D_A = 200 \times 10^9).
    • Pool állapota: L=200×109,  D=200×109,  Lu=0,  Lb=0L = 200 \times 10^9, \; D = 200 \times 10^9, \; L_u = 0, \; L_b = 0.
  2. 2. korszak (t1t_1) — 20 A+20 B20\text{ A} + 20\text{ B} (40×10940 \times 10^9 likviditás) díj/jutalom halmozódik fel:

    • 90%90\% a felhasználókat illeti (ΔLu=36×109\Delta L_u = 36 \times 10^9), 10%10\% pedig a Biatecet (ΔLb=4×109\Delta L_b = 4 \times 10^9).
    • Pool állapota: L=240×109,  D=200×109,  Lu=36×109,  Lb=4×109L = 240 \times 10^9, \; D = 200 \times 10^9, \; L_u = 36 \times 10^9, \; L_b = 4 \times 10^9.
    • Alice likviditási jogosultsága DA+Lu=236×109D_A + L_u = 236 \times 10^9 (118 A+118 B118\text{ A} + 118\text{ B}).
  3. 3. korszak (t2t_2) — Bob befizet 60 A+60 B60\text{ A} + 60\text{ B} összeget (ΔLB=120×109\Delta L_B = 120 \times 10^9 likviditás):

    • A szerződés kiszámítja Bob diszkontált LP mintelését:

      Xbase=⌊120×109×200×109(200+36)×109⌋=101,694,915,254X_{\text{base}} = \left\lfloor \frac{120 \times 10^9 \times 200 \times 10^9}{(200 + 36) \times 10^9} \right\rfloor = 101,694,915,254
    • Bob kap dB=101,694,915d_B = 101,694,915 mikro-LP-t (DB=101,694,915,000D_B = 101,694,915,000 alapegység).

    • A nem mintelt díjhígulási ellentételezés ΔLB−Xbase=18,305,084,746\Delta L_B - X_{\text{base}} = 18,305,084,746 hozzáadódik az LuL_u-hoz:

      Lu,2=36×109+18,305,084,746=54,305,084,746L_{u,2} = 36 \times 10^9 + 18,305,084,746 = 54,305,084,746
    • Teljes forgalomban lévő LP: D2=301,694,915,000D_2 = 301,694,915,000.

    • Azonnali követelések ellenőrzése t2+t_2^+-ban:

      • Bob követelése: 101,694,915,000+⌊54,305,084,746×101,694,915,000301,694,915,000⌋=119,999,999,700≤120×109101,694,915,000 + \lfloor \frac{54,305,084,746 \times 101,694,915,000}{301,694,915,000} \rfloor = 119,999,999,700 \le 120 \times 10^9 (Bob egyetlen egységet sem tud lefölözni Alice 36×10936 \times 10^9 díjából).
      • Alice követelése: 200×109+⌊54,305,084,746×200×109301,694,915,000⌋=236,000,000,046≥236×109200 \times 10^9 + \lfloor \frac{54,305,084,746 \times 200 \times 10^9}{301,694,915,000} \rfloor = 236,000,000,046 \ge 236 \times 10^9 (Alice megtartja betétje 100%-át és a 2. korszak díjainak 100%-át).
  4. 4. korszak (t3t_3) — További 10 A+10 B10\text{ A} + 10\text{ B} (20×10920 \times 10^9 likviditás) díj/jutalom halmozódik fel:

    • 90%90\% a felhasználókat illeti (ΔLu=18×109\Delta L_u = 18 \times 10^9), 10%10\% pedig a Biatecet (ΔLb=2×109\Delta L_b = 2 \times 10^9).
    • Lu,3=54,305,084,746+18×109=72,305,084,746L_{u,3} = 54,305,084,746 + 18 \times 10^9 = 72,305,084,746.
    • Bob részesedése az új 18×10918 \times 10^9 díjból: 120236+120×18×109≈6.0674×109\frac{120}{236 + 120} \times 18 \times 10^9 \approx 6.0674 \times 10^9 (≈3.0337 A+3.0337 B\approx 3.0337\text{ A} + 3.0337\text{ B}).
    • Alice részesedése az új 18×10918 \times 10^9 díjból: 236236+120×18×109≈11.9326×109\frac{236}{236 + 120} \times 18 \times 10^9 \approx 11.9326 \times 10^9 (≈5.9663 A+5.9663 B\approx 5.9663\text{ A} + 5.9663\text{ B}).
    • A Biatec teljes protokolldíja Lb=6×109L_b = 6 \times 10^9 (3 A+3 B3\text{ A} + 3\text{ B}).

5. On-chain tesztcsomag ellenőrzés​

Minden több szereplős díj- és likviditás-aggregációs invariánst folyamatosan ellenőriz a Jest tesztcsomag egy élő Algorand LocalNet AVM-en:

TesztfájlEllenőrzött forgatókönyvek
__test__/pool/multi-party-fee-aggregation.test.ts1. Két, eltérő időpontban csatlakozó LP két swap-korszakon keresztül szigorúan az aktív likviditás (DA+Lu,1):ΔLB(D_A + L_{u,1}) : \Delta L_B arányában osztozik a díjakon.
2. Kivonási sorrendtől való függetlenség (Alice először vs. Bob először) és a Biatec protokolldíj (LbL_b) elkülönítése.
3. Három LP (Alice, Bob, Charlie) csatlakozása három eltérő időpontban részleges (50%) és teljes kivonásokkal.
4. Staking / többleteszköz-jutalom szétosztás (distributeExcessAssets) eltérő időpontokban csatlakozó LP-k között.
5. Egy második fél által végzett gyors, 5-szörös befizetés/kivonás ciklus soha nem szív el díjakat és nem csökkenti a pool fizikai eszközállományát.
__test__/pool/liquidity.test.tsA kétirányú swapok után csatlakozó és azonnal kilépő új likviditásszolgáltató nem tudja lefölözni a korábbi díjakat (deltaA <= 0, deltaB <= 0).
__test__/pool/mainnet-replay-3720188642.test.tsA 3720188642 Gold/GoldDAO pool teljes, 242 tranzakciós MainNet történetének visszajátszása, amely minden betét, swap és teljes visszaváltás után ellenőrzi az L=D+Lu+LbL = D + L_u + L_b megmaradási invariánst.
__test__/pool/reconcile-liquidity.test.tsAnnak ellenőrzése, hogy a mikro-LP alatti kerekítési por az LuL_u-ra kerül, amikor D>0D > 0, illetve az LbL_b-re, amikor D=0D = 0, valamint hogy a reconcileLiquidity hívására kizárólag az addressExecutiveFee jogosult.
__test__/pool/fees.test.tsDeterminisztikus swap díjfelhalmozás, LP kivonás díjakkal, removeLiquidityAdmin protokolldíj-kivonás és distributeExcessAssets különböző ársávokban.

Az ellenőrző tesztcsomag helyi futtatása​

# Győződjön meg róla, hogy az Algorand LocalNet fut
algokit localnet start

# A dedikált több szereplős díjaggregációs tesztcsomag futtatása
npx jest __test__/pool/multi-party-fee-aggregation.test.ts

# A teljes szerződés-build és az összes tesztcsomag futtatása
npm run test