Ochrana akumulácie poplatkov keď sa pripoja noví LP
Dátum: 2025-10-26
Repository: BiatecCLAMM (projects/BiatecCLAMM)
Primárny súbor: contracts/BiatecClammPool.algo.ts
Pozadie
Keď pool nazbiera swap poplatky, on-chain stav ich sleduje ako dodatočnú likviditu (LiquidityUsersFromFees) bez mintovania extra LP tokenov. Predchádzajúci add-liquidity flow mintoval nové LP tokeny z raw liquidity delta (newLiquidity - oldLiquidity). Výsledkom bolo, že nováčik mohol pridať likviditu a okamžite ju odobrať, aby harvestoval pro-rata podiel z historických poplatkov, ktoré by mali patriť incumbent LP.
Regresia sa objavila v pool teste "new liquidity provider does not scoop pre-existing fees" kde účet C pridá likviditu po swap-fee scenári a odoberie ju priamo. Očakávané správanie je, že účet dostane presne to, čo vložil (net zero profit).
Súhrn fixu
processAddLiquidity teraz rieši kvadratickú reláciu vynútenú immediate withdrawal parity a flooruje pozitívny root pred mintovaním LP tokenov:
X^2 + X(sumDistributedAndFees − Q) − Q * distributedBefore = 0
kde:
distributedBeforeje predtým distribuovaný LP supply (škálovaný na base precision),LiquidityUsersFromFeeszachytáva historickú fee likviditu stále vlastnenú incumbents,Q = depositShare * newLiquiditysdepositShareodvodeným z callerovej base-scale contribúcie,Xje base-scale LP delta, ktoré riešime.
Floorovaním root (a tým pádom zaokrúhľovaním v prospech poolu) zaistíme, že nováčikovia nikdy nemintujú dosť LP na odomknutie pre-existujúcich fees. Keď pool nemá nahromadené fees, kvadratická sa zrúti na pôvodné "mint the liquidity delta" správanie.
Rovnaká proporcionálna aritmetika sa znovu používa na exit: fee shares sú kalkulované s single multiply/divide pass takže rounding drift zostáva predvídateľný a vždy benefituje contract.
Očakávania zaokrúhľovania
- Výbery môžu trailovať vklady o pár base units kvôli mandatory flooring step. Rozdiel je bounded frakciou assetovej škály (≤ 20% z base škály v súčasných testoch) a zostáva vnútri poolu, favorizujúc existujúcich LP.
- Jest suite teraz assertuje, že newcomer balance nikdy nenarastie a toleruje iba tiny deficit. Akékoľvek rozšírenie gapu zlyhá test, dávajúc early warning ak maths regredujú.
Pozorovateľné efekty
- Čerstvý LP kto pridá a immediate odstráni likviditu teraz dostane exact množstvá vložené (až do očakávaného integer zaokrúhľovania), takže už nededia historické fees.
- Incumbent LP si zachovajú full ownership
LiquidityUsersFromFees. Fees nahromadené po tom, čo sa newcomer pripojí sú stále zdieľané fair, pretože kvadratické riešenie iba neutralizuje pre-existujúcu komponentu.
Test coverage
npm run test:1:build(a focused Jest case "new liquidity provider does not scoop pre-existing fees") teraz passuje s updated contract a relaxed rounding tolerance.- Iné liquidity testy zostávajú green pretože adjustment zachováva pôvodné správanie keď pool nemá accrued user fees.
Operačné poznámky
- Akákoľvek contract zmena vyžaduje recomputing TEAL artifacts (
npm run compile-contract) a regenerating clients (npm run generate-clientalebonpm run build) pred publishing packages. - Off-chain helpers alebo simulácie, ktoré sa spoliehali na raw
newLiquidity - oldLiquiditymint formula musia byť updated na mirrorovanie kvadratického riešenia, aby sa vyhlo drift medzi client-side estimates a on-chain results. - Pool deployments musia teraz používať pool provider's registered configuration app ID. Pool provider to vynucuje on-chain, takže double-checknite
Bglobal state key pred initiating deploy.
Ďalšie kroky
- Rozšíriť off-chain math utilities v
src/biatecClamm/na expose rovnakého LP token kalkulácie takže front-end previews zostanú accurate. - Pridať regression testy na cover asymetrické vklady a scenáre s non-zero
LiquidityBiatecFromFeesna ensure, že formula generalizuje.