# Concentrated Liquidity Pool Integration 1

{% stepper %}
{% step %}

### Retrieve Necessary Parameters

Use the APIs to retrieve the necessary parameters for the Token Swap operation.

Example transaction: <https://preprod.cardanoscan.io/transaction/dbc4653b23fa52c11d6f657141bc32c56818481dc0796e1d65526dd35f382005>
{% endstep %}

{% step %}

### Build the Redeemer Structure

To optimize data size and allow one transaction to swap across multiple pools simultaneously, the Redeemer is a ByteArray, where each field has a defined index and byte size.

Concentrated ExchangeActionRedeemer Structure:

{% code title="" %}

```
pub type ExchangeActionRedeemer {
    in_idx: Int, // 1 byte: pool or staking
    action: ExchangeAction // 1 byte
}

pub type ExchangeAction {
  CreatePool(CreatePoolParams)
    // platform_fee_out_idx > 0 if platform_fee_X/Y > 0
    ModifyLiquidity(Int, List<ModifyLiquidityParams>)
    // (UTxOType, LicenseIdx)
    WithdrawPlatformFee((Int, Int) ,List<WithdrawPlatformFeeParams>)
    Swap(List<SwapParams>)
    // platfrom_fee_out_idx
    ClaimUndefined((Int, Int) ,List<ClaimUndefinedParams>)
    DelegatePool
}

type SwapParams {
    pool_in_idx: Int, // 1 byte
    pool_out_idx: Int, // 1 byte
    delta_amount: Int, // 32 byte (Int256)
}
```

{% endcode %}

* Diagnostic Notation format:

```
h'0103...' // Swap Action = 03
```

* CBOR format:

```
58240103... // 36 bytes (<in_idx><action><pool_in_idx><pool_out_idx><delta_amount>)
```

{% endstep %}

{% step %}

### Create the Transaction

Use the retrieved parameters to create the token swap transaction.

{% stepper %}
{% step %}

#### Validity range

* Set the validity range for the transaction.
* Ensure the time-to-live (TTL) <= 6 minutes.
  {% endstep %}

{% step %}

#### Input

* Note: The `outRef`, `address`, `coin`, and `multiAssets` information is fully returned by the API.
* PoolInUtxo: The pool you intend to swap tokens with.
  * Spend Redeemer: Build the redeemer according to the ExchangeActionRedeemer Swap structure for Concentrated Pool, ensuring the specified indices are correct.
  * The input Pool UTxO must have the valid PoolNFT:
    * `pool_in_asset[PoolNFT] = 1`
      {% endstep %}

{% step %}

#### Output

* PoolOutUtxo: The output of the pool after the swap.
  * All information for the pool output UTxO is fully returned by the API.
  * The pool datum structure must adhere to the correct order:

{% code title="" %}

```
type PoolDatum {
       // Pool liquidity pair used for trading
       token_X: TupleAsset,
       token_Y: TupleAsset,
       //
       lp_fee_rate: Basis, // LP fee decided by pool creator
       platform_fee_X: Int, // platform fee accumulated on each swap transaction collected in token X
       platform_fee_Y: Int, // platform fee accumulated on each swap transaction collected in token Y
       // to save costs, onchain will let offchain calculate sqrt price
       sqrt_lower_price: PRational,
       sqrt_upper_price: PRational,
       // min X, min Y to avoid DDOS when ModifyLiquidity and Swap
       min_x_change: Int,
       min_y_change: Int,
       circulating_lp_token: Int, // current lp token in circulation, changed when supply/withdraw liquidity
       last_withdraw_epoch: Int // the last epoch when a withdrawal was made from the pool
   }
```

{% endcode %}

* Diagnostic Notation format example:

```
24_0(<<121_0([_
     [_
         h'9a614be30284aa88eb845da7657b5d0a235f1b95628b23c08050d502',
         h'6655534441',
     ],
     [_
         h'834a15101873b4e1ddfaa830df46792913995d8738dcde34eda27905',
         h'665553444d',
     ],
     0,
     0,
     0,
     121_0([_ 15811388300841898_3, 10000000000000000_3]),
     121_0([_ 17320508075688772_3, 10000000000000000_3]),
     1090866_2,
     399256_2,
     10000000_2,
     65339_1,
 ])>>)
```

{% endstep %}

{% step %}

#### Reference Input

* Add all reference inputs from [SDK](https://github.com/danogo-finance/clmm-sdk) .
  {% endstep %}

{% step %}

#### Withdrawal

* Withdraw Redeemer:
  * Add a withdrawal to the reward address with the reward amount from [SDK](https://github.com/danogo-finance/clmm-sdk).
  * The reward redeemer has the ExchangeActionRedeemer structure.
* Withdraw Staking Reward:
  * Must add staking withdrawal if the staking reward amount is greater than 0.
  * Staking reward address with the reward amount from [SDK](https://github.com/danogo-finance/clmm-sdk).
  * Staking redeemer: Built according to the ExchangeActionRedeemer structure.
    {% endstep %}
    {% endstepper %}

{% hint style="info" %}
After sorting the inputs and reference inputs according to the chain's sort order, ensure the correct indices are used when specifying them in the redeemers.
{% endhint %}
{% endstep %}
{% endstepper %}


---

# 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.dano.finance/developers/integration/concentrated-liquidity-pool-integration-1.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.
