# Concentrated Pool

### Steps to Integration

There are three steps in removing liquidity: 1) prepare input, 2) approve tokens, 3) conduct remove liquidity. You need to install PiperX sdk and import it to proceed.

<pre class="language-javascript"><code class="lang-javascript"><strong>import { v3RemoveLiquidity, v3PositionManagerApproval } from '@piperx/sdk/src/core'
</strong>import { WIP_ADDRESS } from '@piperx/sdk/src/constant'
</code></pre>

#### Prepare Input

You need the following inputs before you can remove a liquidity&#x20;

```typescript
token1_address: address, // if it is $IP native token, use WIP_ADDRESS
token2_address: address, // if it is $IP native token, use WIP_ADDRESS
tokenId: number // id of the liquidity that you want to remove
liquidity: bigint, // amount of lp token you want to remove to the pool
amount1Min: bigint, // minimal amount of token 1 you want to receive
amount2Min: bigint, // minmial amount of token 2 you want to receive 
expire_time: bigint// expiration timestamp for a swap
signer: ethers.Signer.
```

Note that, when remove $IP token, you should pass in the PiperX wrapped $IP token address, because the $IP token is not a ERC-20 token. For example, if you are removing liquidity from $IP - $USDC pool, please use wrapped $IP address `WIP_ADDRESS.`

#### Remove the liquidity

```typescript
await v3RemoveLiquidity(
    token1_address: string,
    token2_address: string,
    tokenId: number
    liquidity: bigint,
    amount1Min: bigint,
    amount2Min: bigint,
    expire_time: bigint,
    signer
)
```
