# createPool

To create a clmm pool with some initial liquidity to be added

### Signature

`createPool(options: CreatePoolOptions): Promise<Transaction>`

### Params

```typescript
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.

```json
[
  {
    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

```typescript
    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);
```
