Create clmm pool
Everyone can create cetus clmm pools directly.
1. Create a clmm pool with some initial liquidity to be added
sdk.Pool.createPoolTransactionPayload()
Function input params
Please refer to the original function for specific parameter types.
tick_spacing
: tick spacing will affect price precision. Now mainnet exist some different type tick_spacing, they correspond to different fee rates.tick spacingfee rate2
0.0001
10
0.0005
20
0.001
60
0.0025
200
0.01
220
0.02
initialize_sqrt_price
: for computational convenience, we use fixed-point numbers to represent square root prices. Use the provided by the SDK transformationprice
tosqrtPrice
:TickMath.priceToSqrtPriceX64()
.uri
: the icon of pool, it's allows null.coin_type_a
: the coin type address about coinA.coin_type_b
: the coin type address about coinB.
Example
amount_a
: the amount about coin A, which used to add liquidity.amount_b
: the amount about coin B, which used to add liquidity.Notice: amount a and b was calculated by
ClmmPoolUtil.estLiquidityAndcoinAmountFromOneAmounts()
, it will affected by selected tick interval、amount about one fixed coin(coinA or coinB)、current sqrt price of pool and allowed price slippage. You can see the usage in the next example.fix_amount_a
:true
means fixed coinA amount,false
means fixed coinB amount.tick_lower
: Represents the index of the lower tick boundary.tick_upper
: Represents the index of the upper tick boundary.
metadataA:
The coin metadata id of the coin a.metadataB:
The coin metadata id of the coin b.
Example
import BN from 'bn.js'
import { ClmmPoolUtil, initCetusSDK, TickMath } from '@cetusprotocol/cetus-sui-clmm-sdk'
import { SuiClient } from '@mysten/sui/client'
const sdk = initCetusSDK({network: 'mainnet'})
const signer = ... // set keypair
sdk.senderAddress = signer.getPublicKey().toSuiAddress() // set sdk.senderAddress
// initialize sqrt_price
const initialize_sqrt_price = TickMath.priceToSqrtPriceX64(d(1.2),6,6).toString()
const tick_spacing = 2
const current_tick_index = TickMath.sqrtPriceX64ToTickIndex(new BN(initialize_sqrt_price))
// build tick range
const tick_lower = TickMath.getPrevInitializableTickIndex(new BN(current_tick_index).toNumber()
, new BN(tick_spacing).toNumber())
const tick_upper = TickMath.getNextInitializableTickIndex(new BN(current_tick_index).toNumber()
, new BN(tick_spacing).toNumber())
// input token amount
const fix_coin_amount = new BN(200)
// input token amount is token a
const fix_amount_a = true
// slippage value 0.05 means 5%
const slippage = 0.05
const cur_sqrt_price = new BN(initialize_sqrt_price)
// Estimate liquidity and token amount from one amounts
const liquidityInput = ClmmPoolUtil.estLiquidityAndcoinAmountFromOneAmounts(
lowerTick,
upperTick,
fix_coin_amount,
fix_amount_a,
true,
slippage,
cur_sqrt_price
)
// Estimate token a and token b amount
const amount_a = fix_amount_a ? fix_coin_amount.toNumber() : liquidityInput.tokenMaxA.toNumber()
const amount_b = fix_amount_a ? liquidityInput.tokenMaxB.toNumber() : fix_coin_amount.toNumber()
const coinTypeA = '0x3cfe7b9f6106808a8178ebd2d5ae6656cd0ccec15d33e63fd857c180bde8da75::coin:CetusUSDT'
const coinTypeB = '0x3cfe7b9f6106808a8178ebd2d5ae6656cd0ccec15d33e63fd857c180bde8da75::coin::CetusUSDC'
const coinMetadataAID = await suiClient.getCoinMetadata({coinType: coinTypeA}).id
const coinMetadataBID = await suiClient.getCoinMetadata({coinType: coinTypeB}).id
// build creatPoolPayload Payload
const creatPoolPayload = sdk.Pool.createPoolTransactionPayload({
coinTypeA,
coinTypeB,
tick_spacing: tick_spacing,
initialize_sqrt_price: initialize_sqrt_price,
uri: '',
amount_a,
amount_b,
fix_amount_a,
tick_lower,
tick_upper,
metadata_a: coinMetadataAID,
metadata_b: coinMetadataBID,
})
const res = await sendTransaction(signer, creatPoolTransactionPayload, true)
Last updated