To create a clmm pool with some initial liquidity to be added
Signature
createPool(options: CreatePoolOptions): Promise<Transaction>
Params
Copy interface CreatePoolOptions {
// From sdk.contract.getFees()
fee: Contract.Fee;
// Coin type such as 0x2::sui::SUI
coinTypeA: string;
// Coin type such as 0x2::sui::SUI
coinTypeB: string;
// Amount of coin A
amountA: string | number;
// Amount of coin B
amountB: string | number;
// Represents the index of the lower tick boundary
tickLower: number;
// Represents the index of the upper tick boundary
tickUpper: number;
// Initial price
sqrtPrice: string;
// Creator wallet address
address: string;
// Acceptable wasted amount percentage. Range: [0, 100)
slippage: string | number;
// Expires timeout(ms), defaults 60_000
deadline?: number;
// Custom transaction handler
txb?: Transaction;
}
fee
fee will affect price precision. Now mainnet exist some different type fee type, they correspond to different fee rates and tick_spacing.
Copy [
{
objectId: '0x49dcf28ac3b5480e65bee812ad2d6e60108ab8037d5a815c3c11bbe7bc47c270',
type: '0x2e8c645bcd20436b6178d17dd7093dfd8ce097bc360414ca25d24f94e78eb18e::fee10bps::FEE10BPS',
fee: 10,
tickSpacing: 1
//fee rate 0.00001
},
{
objectId: '0x18136d55969b970330e6991e0deaa713fca99f4e526152c10d5592a01d45f857',
type: '0x91bfbc386a41afcfd9b2533058d7e915a1d3829089cc268ff4333d54d6339ca1::fee100bps::FEE100BPS',
fee: 100,
tickSpacing: 2
//fee rate 0.0001
},
{
objectId: '0xdfcd1043f54fef3aa649eccd4d0b2b09a3da6c87a8a62736467b686268869365',
type: '0x91bfbc386a41afcfd9b2533058d7e915a1d3829089cc268ff4333d54d6339ca1::fee500bps::FEE500BPS',
fee: 500,
tickSpacing: 10
//fee rate 0.0005
},
{
objectId: '0x5121798d1ac50ee8d5c3213c69d4955814318901070ac06a8accfba39fb30198',
type: '0xb924dd4ca619fdb3199f9e96129328da0bb7df1f57054dcc765debb360282726::fee2000bps::FEE2000BPS',
fee: 2000,
tickSpacing: 40
//fee rate 0.002
},
{
objectId: '0x0dfa811ff9d86f7680f212a78b2dd886f10916383d80accf287612a0df3906a0',
type: '0xb924dd4ca619fdb3199f9e96129328da0bb7df1f57054dcc765debb360282726::fee2500bps::FEE2500BPS',
fee: 2500,
tickSpacing: 50
//fee rate 0.0025
},
{
objectId: '0x6bc433c8604f58272155d0c65327ae0b316f63869e5de3846f70aef4625d8c46',
type: '0x91bfbc386a41afcfd9b2533058d7e915a1d3829089cc268ff4333d54d6339ca1::fee3000bps::FEE3000BPS',
fee: 3000,
tickSpacing: 60
//fee rate 0.003
},
{
objectId: '0xd30c41ec4b4d0eb9b30b0b898c53f81cd53a9eb0f75b5d3273584cd874b2d4c4',
type: '0x91bfbc386a41afcfd9b2533058d7e915a1d3829089cc268ff4333d54d6339ca1::fee10000bps::FEE10000BPS',
fee: 10000,
tickSpacing: 200
//fee rate 0.01
},
{
objectId: '0x9724fd1e579956dcaabe97399a374c7726cb96eabea2dec53a5509c41f2c1573',
type: '0xb924dd4ca619fdb3199f9e96129328da0bb7df1f57054dcc765debb360282726::fee20000bps::FEE20000BPS',
fee: 20000,
tickSpacing: 220
//fee rate 0.02
}
]
coinTypeA
Is a base token, such as turbos, wal
coinTypeB
is a quote token, It is recommended to use highly liquid token, such as sui, usdc, and usdt as quote tokens, which is conducive to the display and calculation of prices.
amountA
the amount about coin A, which used to add liquidity.
amountB
the amount about coin B, which used to add liquidity.
tickLower
Represents the index of the lower tick boundary.
tickUpper
Represents the index of the upper tick boundary.
The tick index must satisfy the condition: -443636 < tickLowerIndex < currentTickIndex < tickUpperIndex < 443636
, where 443636 is a constant derived from the maximum range of the Q32.62 fixed-point number format. Additionally, the tick index should be an integer multiple of tickSpacing
. If not, the contract will trigger an error.
Examples
Copy const turbosSdk = new TurbosSdk(Network.testnet, {
url: 'https://fullnode.testnet.sui.io',
});
const signer = turbosSdk.account.getKeypairFromMnemonics("your mnemonic");
const tickSpacing = 200;
const coinTypeA =
'0x541826891e877178df82f2df2996599618a259e719ef54a8e1969211c609cd21::turbos::TURBOS';
const coinTypeB = '0x2::sui::SUI';
const coinADecimals = 9;
const coinBDecimals = 9;
const fee = await turbosSdk.contract.getFee(tickSpacing);
const sqrtPrice = turbosSdk.math
.priceToSqrtPriceX64(0.01, coinADecimals, coinBDecimals)
.toString();
// 0.0001 - 10000 price range
const tickLower = turbosSdk.math.priceToInitializableTickIndex(
0.0001,
coinADecimals,
coinBDecimals,
tickSpacing,
);
const tickUpper = turbosSdk.math.priceToInitializableTickIndex(
10000,
coinADecimals,
coinBDecimals,
tickSpacing,
);
console.log(tickLower, tickUpper);
// initial liquidity
const amountA = 1 * 10 ** coinADecimals;
const amounts = turbosSdk.pool.estimateAmountsFromOneAmount({
sqrtPrice,
tickLower,
tickUpper,
amount: amountA.toString(),
isAmountA: true,
});
const txb = await turbosSdk.pool.createPool({
fee,
coinTypeA,
coinTypeB,
sqrtPrice,
tickLower,
tickUpper,
address: signer.toSuiAddress(),
amountA: amounts[0],
amountB: amounts[1],
slippage: 3,
deadline: Date.now() + 60 * 60 * 1000,
});
txb.setSender(signer.toSuiAddress());
const result = await turbosSdk.provider.signAndExecuteTransaction({
transaction: txb,
signer,
});
console.log(result);