# TAPP DEX SDK
....

### Prerequisites

**1. NPM Install**

```
npm i @undercurrent-technologies/tapp-sdk
```

**2. Initialization**

The Tapp TypeScript SDK provides a convenient helper function `initTappSDK` to initialize the SDK. You have an option to select either `mainnet` or `testnet` for the network.

**Available params**
| key     | type          | description                          |
|---------|---------------|--------------------------------------|
| network | Aptos Network | optional, default: `Network.TESTNET`. Allowed: `Network.TESTNET` or `Network.MAINNET` |
| url     | string        | optional. default: Testnet API       |


```ts
import { Network } from "@aptos-labs/ts-sdk";
import { initTappSDK } from '@tapp/tapp-sdk'

const sdk = initTappSDK({
    network: Network.MAINNET,
    url: 'https://....'
})
```

### Features
#### Pool

**1. Get all pools**

use `sdk.Pool.getPools`  method.


**Available params**
| key      | type     | description                                |
|----------|----------|--------------------------------------------|
| page     | int      | optional, default: `1`                     |
| size     | int      | optional, default: `10`                    |
| sortBy   | string   | optional, default: `tvl`                   |
| poolType | PoolType | optional. allowed: `CLMM`, `AMM`, `STABLE` |

**Example**
```ts
async function getPools() {
    const poolItems = await sdk.Pool.getPools({
        page: 1,
        size: 15
    });
    console.log(poolItems)
}
```

**2. Get Pool by `poolId`**

use `sdk.Pool.getInfo`  method.

**Example**
```ts
async function getInfo() {
    const poolId = "...."
    const poolInfo = await sdk.Pool.getInfo(poolId);
}
```

#### Swap
**1. Swap AMM**

use `sdk.Swap.swapAMMTransactionPayload` method

**Example**
```ts
const { signAndSubmitTransaction, account } = useWallet();

async function swapAMM() {
    const params: SwapAMMParams = {
        poolId: '0x61064a140af9c1f7e01855536b92f2cba6101f02c06eba26926640b4cc2c0741',
        a2b: true,
        fixedAmountIn: true;
        amount0: 100000000;
        amount1: 10000000;
    }
    const data = sdk.Swap.swapAMMTransactionPayload(params);

    await signAndSubmitTransaction({
        sender: account.address,
        data: data
    });
}
```

**2. Swap CLMM**

use `sdk.Swap.swapCLMMTransactionPayload` method

**Example**
```ts
const { signAndSubmitTransaction, account } = useWallet();

async function swapCLMM() {
    const params: SwapCLMMParams = {
        poolId: '0x4de93306851b15eb4aea21161f397d57ffd6cc07fe14dd1277d5ffd84db548d4',
        amountIn: 100000000,
        minAmountOut: 521850658,
        a2b: true,
        fixedAmountIn: true,
        targetSqrtPrice: 4295048016
    }
    const data = sdk.Swap.swapCLMMTransactionPayload(params);

    await signAndSubmitTransaction({
        sender: account.address,
        data: data
    });
}
```

**3. Swap STABLE**

use `sdk.Swap.swapStableTransactionPayload` method

**Example**
```ts
const { signAndSubmitTransaction, account } = useWallet();

async function swapStable() {
    const params: SwapStableParams = {
        poolId: "0x52d2cc18cbcc07d05456e239f474b784288523e4a5e3ae8c8dc6aed8abbc752b",
        tokenIn: 2,
        tokenOut: 3,
        amountIn: 100000000,
        minAmountOut: 0,
    }
    const data = sdk.Swap.swapStableTransactionPayload(params);

    await signAndSubmitTransaction({
        sender: account.address,
        data: data
    });
}
```

**4. Get Swap Route**

use `sdk.Swap.getRoute` method

**Example**
```ts
async function getRoute() {
    const token0 = '0xb61f9f829842869968edba4b88f0cf785ac6729fd664f50c7be8c630fd2daebc'
    const token1 = '0x895e73b44e8b083df4b203cce9ffe808b62dc17b27fdc0249be50e17b76e12e8'
    const poolInfo = await sdk.Swap.getRoute(token0, token1);

    console.log(poolInfo)
}
```

#### Create Pool And Add Liquidity
 **1. AMM** 

use `sdk.Position.createAMMPoolAndAddLiquidity` method

**Example**
```ts
const { signAndSubmitTransaction, account } = useWallet();

async function createAMMPoolAndAddLiquidity() {
    const params: CreateAMMPoolAndAddLiquidityParams = {
        tokenAddress: ['0xb61f9f829842869968edba4b88f0cf785ac6729fd664f50c7be8c630fd2daebc', '0x895e73b44e8b083df4b203cce9ffe808b62dc17b27fdc0249be50e17b76e12e8'],
        fee: 3000,
        amounts: [20000000000, 30000000000],
    }
    const data = sdk.Position.createAMMPoolAndAddLiquidity(params);

    await signAndSubmitTransaction({
        sender: account.address,
        data: data
    });
}
```

 **2. CLMM** 

 use `sdk.Position.createCLMMPoolAndAddLiquidity` method

**Example**
```ts
const { signAndSubmitTransaction, account } = useWallet();

async function createCLMMPoolAndAddLiquidity() {
    const params: CreateCLMMPoolAndAddLiquidityParams = {
        tokenAddress: ['0xb61f9f829842869968edba4b88f0cf785ac6729fd664f50c7be8c630fd2daebc', '0x895e73b44e8b083df4b203cce9ffe808b62dc17b27fdc0249be50e17b76e12e8'],
        fee: 3000,
        amounts: [10000000000, 10000000000],
        initialPrice: 1,
        minPrice: 0.000001,
        maxPrice: Infinity,
        isMaxAmountB: boolean,
    }
    const data = sdk.Position.createCLMMPoolAndAddLiquidity(params);

    await signAndSubmitTransaction({
        sender: account.address,
        data: data
    });
}
```

 **3. STABLE** 

 use `sdk.Position.createStablePoolAndAddLiquidity` method

**Example**
```ts
const { signAndSubmitTransaction, account } = useWallet();

async function createStablePoolAndAddLiquidity() {
    const params: createStablePoolAndAddLiquidityParams = {
        tokenAddress: ['0xb61f9f829842869968edba4b88f0cf785ac6729fd664f50c7be8c630fd2daebc', '0x895e73b44e8b083df4b203cce9ffe808b62dc17b27fdc0249be50e17b76e12e8', '0xc92acc4a5268f9ffe9bac16bc1d1cb6cb63e560fe42592b24992062dd40eb47a'],
        fee: 500,
        amounts: [20000000000, 10000000000, 2000000000],
        amplificationFactor: 1000,
    }
    const data = sdk.Position.createStablePoolAndAddLiquidity(params);

    await signAndSubmitTransaction({
        sender: account.address,
        data: data
    });
}
```

#### Remove Liquidity
When you want to remove liquidity from the position, you can use the following method.

**1. Remove AMM Single Position**

use `sdk.Position.removeSingleAMMLiquidity` method

**Example**
```ts
const { signAndSubmitTransaction, account } = useWallet();

async function removeSingleAMMLiquidity() {
    const params: RemoveSingleAMMLiquidityParams = {
        poolId: '0x61064a140af9c1f7e01855536b92f2cba6101f02c06eba26926640b4cc2c0741',
        positionAddr: '0xaf43e27cedbcd99a08b30845b900ca3947098fa4564da465712884995e7881b7',
        mintedShare: 10000,
        minAmount0: 10000,
        minAmount1: 10000,
    }
    const data = sdk.Position.removeSingleAMMLiquidity(params);

    await signAndSubmitTransaction({
        sender: account.address,
        data: data
    });
}
```

**2. Remove AMM Multiple Positions**

use `sdk.Position.removeMultipleAMMLiquidity` method.

**Example**
```ts
const { signAndSubmitTransaction, account } = useWallet();

async function removeMultipleAMMLiquidity() {
    const params: RemoveMultipleAMMLiquidityParams = {
        poolId: '0x57ce8bc35b6ca1613fe1a0f5d8ecbb02e14e6920643ad478ab935de165a3a707',
        positions: [
            {
                positionAddr: '0xaf43e27cedbcd99a08b30845b900ca3947098fa4564da465712884995e7881b7',
                mintedShare: 10000,
                minAmount0: 10000,
                minAmount1: 10000,
            },
            {
                positionAddr: '0xaf43e27cedbcd99a08b30845b900ca3947098fa4564da465712884995e7881b8',
                mintedShare: 20000,
                minAmount0: 20000,
                minAmount1: 20000,
            }
        ]
    }
    const data = sdk.Position.removeMultipleAMMLiquidity(params);

    await signAndSubmitTransaction({
        sender: account.address,
        data: data
    });
}
```


**3. Remove CLMM Single Position**

use `sdk.Position.removeSingleCLMMLiquidity` method

**Example**
```ts
const { signAndSubmitTransaction, account } = useWallet();

async function removeSingleCLMMLiquidity() {
    const params: RemoveSingleCLMMLiquidityParams = {
        poolId: '0x57ce8bc35b6ca1613fe1a0f5d8ecbb02e14e6920643ad478ab935de165a3a707',
        positionAddr: '0xaf43e27cedbcd99a08b30845b900ca3947098fa4564da465712884995e7881b7',
        mintedShare: 10000,
        minAmount0: 10000,
        minAmount1: 10000,
    }
    const data = sdk.Position.removeSingleCLMMLiquidity(params);

    await signAndSubmitTransaction({
        sender: account.address,
        data: data
    });
}
```

**4. Remove CLMM Multiple Positions**

use `sdk.Position.removeMultipleCLMMLiquidity` method.

**Example**
```ts
const { signAndSubmitTransaction, account } = useWallet();

async function removeMultipleCLMMLiquidity() {
    const params: RemoveMultipleCLMMLiquidityParams = {
        poolId: '0x57ce8bc35b6ca1613fe1a0f5d8ecbb02e14e6920643ad478ab935de165a3a707',
        positions: [
            {
                positionAddr: '0xaf43e27cedbcd99a08b30845b900ca3947098fa4564da465712884995e7881b7',
                mintedShare: 10000,
                minAmount0: 10000,
                minAmount1: 10000,
            },
            {
                positionAddr: '0xaf43e27cedbcd99a08b30845b900ca3947098fa4564da465712884995e7881b7',
                mintedShare: 20000,
                minAmount0: 20000,
                minAmount1: 20000,
            }
        ]
    }
    const data = sdk.Position.removeMultipleCLMMLiquidity(params);

    await signAndSubmitTransaction({
        sender: account.address,
        data: data
    });
}
```

**5. Remove STABLE Single Position**

use `sdk.Position.removeSingleStableLiquidity` method

**Example**
```ts
const { signAndSubmitTransaction, account } = useWallet();

async function removeSingleStableLiquidity() {
    const params: RemoveSingleStableLiquidityParams = {
        poolId: '0x57ce8bc35b6ca1613fe1a0f5d8ecbb02e14e6920643ad478ab935de165a3a707',
        liquidityType: 2,
        position: {
            positionAddr: '0xaf43e27cedbcd99a08b30845b900ca3947098fa4564da465712884995e7881b7',
            mintedShare: 10000,
            amounts: [100, 200, 300]
        }
    }
    const data = sdk.Position.removeSingleStableLiquidity(params);

    await signAndSubmitTransaction({
        sender: account.address,
        data: data
    });
}
```

**6. Remove STABLE Multiple Positions**

use `sdk.Position.removeMultipleStableLiquidity` method.

**Example**
```ts
const { signAndSubmitTransaction, account } = useWallet();

async function removeMultipleStableLiquidity() {
    const params: RemoveMultipleStableLiquidityParams = {
        poolId: '0x57ce8bc35b6ca1613fe1a0f5d8ecbb02e14e6920643ad478ab935de165a3a707',
        liquidityType: 2,
        positions: [
            {
                positionAddr: '0xaf43e27cedbcd99a08b30845b900ca3947098fa4564da465712884995e7881b7',
                mintedShare: 10000,
                amounts: [100, 200, 300]
            },
            {
                positionAddr: '0xaf43e27cedbcd99a08b30845b900ca3947098fa4564da465712884995e7881b8',
                mintedShare: 10000,
                amounts: [300, 400, 500]
            }
        ]
    }
    const data = sdk.Position.removeMultipleStableLiquidity(params);

    await signAndSubmitTransaction({
        sender: account.address,
        data: data
    });
}
```

#### Collect Fee

use `sdk.Position.collectFee` method.

**Example**
```ts
const { signAndSubmitTransaction, account } = useWallet();

async function collectFee() {
    const params: CollectFeeParams = {
        poolId: "0x57ce8bc35b6ca1613fe1a0f5d8ecbb02e14e6920643ad478ab935de165a3a707"
        positionAddr: "0xaf43e27cedbcd99a08b30845b900ca3947098fa4564da465712884995e7881b7"
    }
    const data = sdk.Position.collectFee(params);

    await signAndSubmitTransaction({
        sender: account.address,
        data: data
    });
}
```
