Základné prípady použitia Biatec CLAMM
Táto príručka vás prevedie každodennými tokmi podporovanými Biatec koncentrovanou likviditou AMM (CLAMM). Zameriava sa na inštancovanie klientov, financovanie likvidity v cenovom pásme alebo pri konštantnej cene, odstraňovanie likvidity, vykonávanie swapov a spotrebu pool-provider oracle feedu. Pokročilé témy ako správanie zaokrúhľovania a staking-specifické toky sú pokryté v existujúcich dokumentoch v docs/.
Predpoklady
- Prístup k Algorand sieti (Sandbox LocalNet, TestNet alebo MainNet) a
Algodv2RPC endpoint. - Deployované inštancie Biatec konfiguračného providera, identity providera a pool provider kontraktov. Príklady nižšie predpokladajú, že ich app ID sú už známe.
- Vždy potvrďte, že pool-provider globálny stav (
key = 'B') zodpovedá konfiguračnému app ID, na ktoré odkazujete v akejkoľvek deploy skupine pred podpísaním. Ak sa ID rozchádzajú, prerušte transakciu, aby ste sa vyhli interakcii s falošným configom. - Financovaný účet reprezentovaný ako
AlgokitTransactionSignerAccountna podpísanie transakcií. - Znalosť 1e9 základnej škály (
SCALE = 1_000_000_000n) používané kontraktmi. Pozrite sidocs/liquidity-rounding.mdpre detaily presnosti. - Voliteľné, ale odporúčané: použite
getConfig(genesisId)na stiahnutie najnovších produkčných app ID pre podporované siete namiesto hard-kódovania.
Zdieľané nastavenie
import algosdk from 'algosdk';
import { AlgorandClient } from '@algorandfoundation/algokit-utils';
import { mnemonicToSecretKey } from 'algosdk';
import { clientBiatecClammPool, BiatecPoolProviderClient, getConfig } from 'biatec-concentrated-liquidity-amm';
const ALGOD_URL = 'http://localhost:4001';
const ALGOD_TOKEN = 'a'.repeat(64);
const algod = new algosdk.Algodv2(ALGOD_TOKEN, ALGOD_URL, '');
const algorand = AlgorandClient.fromConfig({ algod });
const { addr, sk } = mnemonicToSecretKey(process.env.MNEMONIC!);
const signerAccount = {
addr,
signer: async (txs: algosdk.Transaction[], indexes: number[]) => {
const signed = txs.map((tx) => tx.signTxn(sk));
return indexes.map((i) => signed[i]);
},
};
const { configAppId: configProviderAppId, identityAppId: identityProviderAppId, poolProviderAppId } = getConfig('testnet-v1.0');
const poolProviderClient = new BiatecPoolProviderClient({
algorand,
appId: poolProviderAppId,
});
// Nasmerujte CLAMM klienta na existujúci pool, keď poznáte jeho app ID.
const poolAppId = 45678n;
const poolClient = clientBiatecClammPool({
algorand,
appId: poolAppId,
});
Tip: Použite helper v
src/biatecClamm/getPools.tsna objavenie poolov spravovaných pool providerom, keď poznáte iba asset ID alebo verifikačnú triedu.
Vytvorenie poolu (cenové rozpätie vs konštantná cena)
Vytvorenie poolu je spracované clammCreateSender. Prejdite priceMin, priceMax a currentPrice v základnej škále (1e9). Nastavenie priceMin === priceMax pripne pool na konštantnú cenu, čo je ako sa vytvárajú staking pooly.
import { clammCreateSender } from 'biatec-concentrated-liquidity-amm';
const SCALE = 1_000_000_000n;
await poolProviderClient.send.setNativeTokenName({
args: {
appBiatecConfigProvider: configProviderAppId,
nativeTokenName: 'Algo',
},
appReferences: [configProviderAppId],
});
const poolClient = await clammCreateSender({
transactionSigner: signerAccount,
clientBiatecPoolProvider: poolProviderClient,
appBiatecConfigProvider: configProviderAppId,
assetA: 9581n,
assetB: 0n, // 0n indikuje natívny token
fee: 10_000_000n, // 1% poplatok vyjadrený v základnej škále
verificationClass: 0,
priceMin: SCALE / 2n,
priceMax: SCALE * 2n,
currentPrice: SCALE,
});
// clammCreateSender automaticky volá bootstrapStep2, takže pool je pripravený na vklady.
Pre konštantno-cenové staking pooly, znovu použite snippet vyššie a nastavte priceMin, priceMax a currentPrice na rovnakú hodnotu základnej škály (zvyčajne SCALE). Pozrite si docs/staking-pools.md pre dodatočné staking-specifické vedenie.
Poskytovanie likvidity
clammAddLiquiditySender obaľuje skupinu transakcií potrebnú na vklad oboch aktív a odkaz na pool-provider metadata.
import { clammAddLiquiditySender } from 'biatec-concentrated-liquidity-amm';
await clammAddLiquiditySender({
clientBiatecClammPool: poolClient,
clientBiatecPoolProvider: poolProviderClient,
account: signerAccount,
algod,
appBiatecConfigProvider: configProviderAppId,
appBiatecIdentityProvider: identityProviderAppId,
assetA: 9581n,
assetB: 0n,
assetLp: 9619n,
assetADeposit: 2_500_000n, // množstvo v natívnych desatinných miestach aktíva
assetBDeposit: 2_500_000n,
});
- Sender automaticky optuje do LP tokenu, ak je potrebné.
- Vklady musia rešpektovať cenové rozpätie poolu. Pri pridávaní likvidity do širokého rozpätia, veľkosť oboch vkladov podľa pomerov exponovaných off-chain kalkulátormi pod
contracts/clients/BiatecPoolProviderClient.ts(calculateAsset*queries). - Pre detailné očakávania zaokrúhľovania, prečítajte si
docs/liquidity-rounding.mdadocs/liquidity-fee-protection.md.
Výber likvidity
clammRemoveLiquiditySender spaľuje LP tokeny výmennou za základné aktíva plus nahromadené poplatky.
import { clammRemoveLiquiditySender } from 'biatec-concentrated-liquidity-amm';
await clammRemoveLiquiditySender({
clientBiatecClammPool: poolClient,
account: signerAccount,
algod,
appBiatecConfigProvider: configProviderAppId,
appBiatecIdentityProvider: identityProviderAppId,
assetA: 9581n,
assetB: 0n,
assetLp: 9619n,
lpToSend: 3_000_000n,
});
Použite clammRemoveLiquidityAdminSender helper, ak potrebujete administratívny výber, ktorý obchádza identity kontroly (rezervované pre governance toky).
Swapovanie aktív
clammSwapSender vykoná swap v oboch smeroch. Poskytnite aktívum, ktoré posielate, množstvo a minimálne množstvo, ktoré ste ochotní prijať (po poplatkoch) v proti aktívume.
import { clammSwapSender } from 'biatec-concentrated-liquidity-amm';
await clammSwapSender({
clientBiatecClammPool: poolClient,
account: signerAccount,
algod,
appBiatecConfigProvider: configProviderAppId,
appBiatecIdentityProvider: identityProviderAppId,
appBiatecPoolProvider: poolProviderAppId,
assetA: 9581n,
assetB: 0n,
fromAsset: 9581n,
fromAmount: 10_000_000n,
minimumToReceive: 9_800_000n,
});
Swap helper pripája pool-provider a identity box referencie automaticky. Na odhad výstupných množstiev pred odoslaním swapu, zavolajte read-only kalkulačné metódy exponované na BiatecPoolProviderClient (napríklad clientBiatecPoolProvider.getPrice alebo calculateAsset* rodinu metód).
Spotreba pool-provider oracle feedu
Biatec pool provider udržiava on-chain oracle dáta pre každý pár aktív. Zavolajte generovanú getPrice metódu s appPoolId = 0n na získanie agregovaných metrík. Návratová hodnota je už dekódovaná do camelCase polí.
const priceInfo = await poolProviderClient.appClient.getPrice({
args: {
assetA: 0n,
assetB: 9581n,
appPoolId: 0n, // nula => agregované cez všetky pooly pre pár
},
});
console.log('najnovšia cena (základná škála):', priceInfo.latestPrice);
console.log('period1 VWAP (základná škála):', priceInfo.period1NowVwap);
console.log('najnovší obchodný poplatok (aktívum A):', priceInfo.period1NowFeeA);
Keď potrebujete pool-specifické oracle dáta, prejdite CLAMM app ID ako appPoolId namiesto nuly. Metóda vracia rovnakú AppPoolInfo štruktúru v oboch prípadoch.
Dodatočné operácie
- Distribuovať odmeny:
clammDistributeExcessAssetsSenderpripisuje staking alebo fee odmeny LP držiteľom. Množstvá musia byť vyjadrené v 1e9 základnej škále. - Vybrať protokol poplatky:
clammWithdrawExcessAssetsSenderumožňuje fee executorovi získať nahromadený protokol príjem. - Prepnúť stav validátora:
clammSendOnlineKeyRegistrationSenderaclammSendOfflineKeyRegistrationSenderobaľujú AVM key registration toky, keď pool účet stakuje na consensus sieťach. - Pool discovery a quotovanie:
getPools(zsrc/biatecClamm/getPools.ts) enumeruje registry záznamy; generovaný pool-provider klient exponuje pure funkcie pre sizing vklady a výbery (napr.calculateAssetADepositOnAssetBDeposit).
Odporúčané čítanie
docs/liquidity-rounding.mdpre pravidlá zaokrúhľovania a presnosti.docs/liquidity-fee-protection.mdpre fee accounting záruky.docs/staking-pools.mdpre konštantno-cenové (same-asset) staking scenáre.
Tieto stavebné bloky pokrývajú štandardnú používateľskú cestu: vytvorte alebo objavte pool, poskytnite likviditu so správnymi cenovými hranicami, zarábajte poplatky, vykonajte swapy a spoliehajte sa na pool provider pre oracle-grade cenové dáta.