# Create CLMM Pool

### Overview

Create a new CLMM pool with initial liquidity in a single transaction. The SDK automatically handles coin type ordering according to protocol requirements.

### Prerequisites

* Valid sender address configured in SDK
* Sufficient balance of both tokens
* Token metadata (optional)

### Quick Start

```typescript
import { clmmMainnet, initFerraSDK } from '@ferra-labs/clmm'

// Initialize SDK
const sdk = initFerraSDK({
  ...clmmMainnet,
  network: 'beta',
  fullNodeUrl: 'https://...',
  wallet: '0x...'
})

// Create pool with initial liquidity
const params = {
  // Token types
  coinTypeA: '0x2::sui::SUI',
  coinTypeB: '0x...::usdc::USDC',
  
  // Pool parameters
  tick_spacing: 60,              // Tick spacing (1, 10, 60, 200)
  initialize_sqrt_price: '...',  // Initial price (sqrt format)
  uri: 'https://...',   // Pool uri
  
  // Liquidity position
  tick_lower: -1000,             // Lower price bound
  tick_upper: 1000,              // Upper price bound
  amount_a: '1000000000',        // Amount of token A (with decimals)
  amount_b: '1000000',           // Amount of token B (with decimals)
  fix_amount_a: true,            // Fix token A amount
  slippage: 0.05,
  // Optional metadata
  metadata_a: coinAMetadata,
  metadata_b: coinBMetadata
}

const tx = await sdk.Pool.createPoolTransactionPayloadslippage(params)
const result = await sdk.fullClient.signAndExecuteTransaction({
  transaction: tx,
  signer: keypair
})
```

### Parameters

| Parameter               | Type         | Description                                                     |
| ----------------------- | ------------ | --------------------------------------------------------------- |
| `coinTypeA`             | string       | First token type                                                |
| `coinTypeB`             | string       | Second token type                                               |
| `tick_spacing`          | number       | Fee tier (2=0.01%, 10=0.05%, 20=0.1%, 60=0.5%, 200=1%, 220=5% ) |
| `initialize_sqrt_price` | string       | Initial sqrt price (X64 format)                                 |
| `uri`                   | string       | Pool description                                                |
| `tick_lower`            | number       | Lower tick boundary                                             |
| `tick_upper`            | number       | Upper tick boundary                                             |
| `amount_a`              | string       | Amount of token A                                               |
| `amount_b`              | string       | Amount of token B                                               |
| `fix_amount_a`          | boolean      | If true, fix token A amount; else fix token B                   |
| `metadata_a`            | CoinMetadata | Token A metadata (optional)                                     |
| `metadata_b`            | CoinMetadata | Token B metadata (optional)                                     |

### Price Calculation

Calculate initial sqrt price:

```typescript
import { TickMath } from '@ferra-labs/clmm'

// Convert price to sqrt price
const price = 1.5 // 1 tokenA = 1.5 tokenB
const sqrtPrice = TickMath.priceToSqrtPriceX64(
  price, 
  decimalsA, 
  decimalsB
)
```

### Tick Spacing Guide

<table><thead><tr><th>Tick Spacing</th><th width="249">Fee</th></tr></thead><tbody><tr><td>2</td><td>0.01%</td></tr><tr><td>10</td><td>0.05%</td></tr><tr><td>20</td><td>0.1%</td></tr><tr><td>60</td><td>0.5%</td></tr><tr><td>200</td><td>1%</td></tr><tr><td>220</td><td>5%</td></tr></tbody></table>

### Error Handling

```typescript
try {
  const tx = await sdk.Pool.createPoolTransactionPayload(params)
  // Execute transaction
} catch (error) {
  if (error.code === 'InvalidSendAddress') {
    // Set sender address
    sdk.senderAddress = '0x...'
  } else if (error.code === 'InsufficientBalance') {
    // Handle insufficient funds
  }
}
```

### Important Notes

* Coin types are automatically sorted according to protocol rules
* The SDK handles coin selection from your wallet
* Remaining coins are automatically returned to sender
* Pool creation includes initial liquidity position (NFT)


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.ferra.ag/integration/clmm/typescript-sdk/create-clmm-pool.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
