Skip to content

Commit 72f1fcf

Browse files
committed
feat: removeLiquidity
1 parent 32c33f9 commit 72f1fcf

File tree

5 files changed

+63
-33
lines changed

5 files changed

+63
-33
lines changed

src/constants/common.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
export const DEFAULT_DEADLINE = 60 * 10 // 10 minutes
2+
export const DEFAULT_SLIPPAGE_TOLERANCE = 50

src/core/uniDevKitV4.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,10 @@ import type {
1717
PreparePermit2DataResult,
1818
} from '@/types/utils/permit2'
1919
import { buildAddLiquidityCallData } from '@/utils/buildAddLiquidityCallData'
20+
import {
21+
type BuildRemoveLiquidityCallDataParams,
22+
buildRemoveLiquidityCallData,
23+
} from '@/utils/buildRemoveLiquidityCallData'
2024
import { buildSwapCallData } from '@/utils/buildSwapCallData'
2125
import { getPool } from '@/utils/getPool'
2226
import { getPoolKeyFromPoolId } from '@/utils/getPoolKeyFromPoolId'
@@ -234,4 +238,14 @@ export class UniDevKitV4 {
234238
async preparePermit2Data(params: PreparePermit2DataParams): Promise<PreparePermit2DataResult> {
235239
return preparePermit2Data(params, this.instance)
236240
}
241+
242+
/**
243+
* Builds a remove liquidity call data for a given remove liquidity parameters.
244+
* @param params @type {BuildRemoveLiquidityCallDataParams}
245+
* @returns Promise resolving to remove liquidity call data including calldata and value
246+
* @throws Error if SDK instance is not found or if remove liquidity call data is invalid
247+
*/
248+
async buildRemoveLiquidityCallData(params: BuildRemoveLiquidityCallDataParams) {
249+
return buildRemoveLiquidityCallData(params, this.instance)
250+
}
237251
}

src/utils/buildAddLiquidityCallData.ts

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,14 @@
1+
import { DEFAULT_SLIPPAGE_TOLERANCE } from '@/constants/common'
2+
import { percentFromBips } from '@/helpers/percent'
13
import type { UniDevKitV4Instance } from '@/types'
24
import type {
35
BuildAddLiquidityCallDataResult,
46
BuildAddLiquidityParams,
57
} from '@/types/utils/buildAddLiquidityCallData'
6-
import { Percent } from '@uniswap/sdk-core'
8+
import { getDefaultDeadline } from '@/utils/getDefaultDeadline'
79
import { TickMath, encodeSqrtRatioX96, nearestUsableTick } from '@uniswap/v3-sdk'
810
import { Position, V4PositionManager } from '@uniswap/v4-sdk'
911

10-
const DEFAULT_DEADLINE = 1800n // 30 minutes
11-
const DEFAULT_SLIPPAGE_TOLERANCE = 50
12-
1312
/**
1413
* Builds the calldata and native value required to add liquidity to a Uniswap V4 pool.
1514
*
@@ -80,14 +79,10 @@ export async function buildAddLiquidityCallData(
8079
permit2BatchSignature,
8180
} = params
8281

83-
console.log('params', params)
84-
8582
try {
86-
const deadline =
87-
deadlineParam ??
88-
(await instance.client.getBlock().then((b) => b.timestamp + DEFAULT_DEADLINE)).toString()
83+
const deadline = deadlineParam ?? (await getDefaultDeadline(instance)).toString()
8984

90-
const slippagePercent = new Percent(slippageTolerance, 10_000)
85+
const slippagePercent = percentFromBips(slippageTolerance)
9186
const createPool = pool.liquidity.toString() === '0'
9287

9388
const tickLower = tickLowerParam ?? nearestUsableTick(TickMath.MIN_TICK, pool.tickSpacing)

src/utils/buildRemoveLiquidityCallData.ts

Lines changed: 33 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,33 @@
1-
import { Percent } from '@uniswap/sdk-core'
2-
import { type Position, V4PositionManager } from '@uniswap/v4-sdk'
1+
import { DEFAULT_SLIPPAGE_TOLERANCE } from '@/constants/common'
2+
import { percentFromBips } from '@/helpers/percent'
3+
import type { UniDevKitV4Instance } from '@/types'
4+
import { getDefaultDeadline } from '@/utils/getDefaultDeadline'
5+
import { getPosition } from '@/utils/getPosition'
6+
import { V4PositionManager } from '@uniswap/v4-sdk'
37

48
/**
59
* Parameters required to build the calldata for removing liquidity from a Uniswap v4 position.
610
*/
711
export interface BuildRemoveLiquidityCallDataParams {
8-
/**
9-
* The position object representing the liquidity position to modify.
10-
*/
11-
position: Position
12-
1312
/**
1413
* The percentage of liquidity to remove from the position.
1514
*/
1615
liquidityPercentage: number
1716

1817
/**
19-
* The deadline for the transaction.
18+
* The tokenId of the position to remove liquidity from.
2019
*/
21-
deadline: string
20+
tokenId: string
2221

2322
/**
2423
* The slippage tolerance for the transaction.
2524
*/
26-
slippageTolerance: number
25+
slippageTolerance?: number
2726

2827
/**
29-
* The tokenId of the position to remove liquidity from.
28+
* The deadline for the transaction. (default: 5 minutes from now)
3029
*/
31-
tokenId: string
30+
deadline?: string
3231
}
3332

3433
/**
@@ -41,7 +40,7 @@ export interface BuildRemoveLiquidityCallDataParams {
4140
* ```typescript
4241
* const { calldata, value } = buildRemoveLiquidityCallData({
4342
* position,
44-
* liquidityPercentage: new Percent(1, 1), // 100%
43+
* liquidityPercentage: 10_000, // 100%
4544
* });
4645
*
4746
* const tx = await sendTransaction({
@@ -51,18 +50,29 @@ export interface BuildRemoveLiquidityCallDataParams {
5150
* });
5251
* ```
5352
*/
54-
export function buildRemoveLiquidityCallData({
55-
position,
56-
liquidityPercentage,
57-
deadline,
58-
slippageTolerance,
59-
tokenId,
60-
}: BuildRemoveLiquidityCallDataParams) {
53+
export async function buildRemoveLiquidityCallData(
54+
{
55+
liquidityPercentage,
56+
deadline: deadlineParam,
57+
slippageTolerance,
58+
tokenId,
59+
}: BuildRemoveLiquidityCallDataParams,
60+
instance: UniDevKitV4Instance,
61+
) {
62+
// Get position data
63+
const positionData = await getPosition({ tokenId }, instance)
64+
if (!positionData) {
65+
throw new Error('Position not found')
66+
}
67+
68+
const deadline = deadlineParam ?? (await getDefaultDeadline(instance)).toString()
69+
70+
// Build remove liquidity call data
6171
try {
62-
const { calldata, value } = V4PositionManager.removeCallParameters(position, {
63-
slippageTolerance: new Percent(slippageTolerance, 100),
72+
const { calldata, value } = V4PositionManager.removeCallParameters(positionData.position, {
73+
slippageTolerance: percentFromBips(slippageTolerance ?? DEFAULT_SLIPPAGE_TOLERANCE),
6474
deadline: deadline,
65-
liquidityPercentage: new Percent(liquidityPercentage, 100),
75+
liquidityPercentage: percentFromBips(liquidityPercentage),
6676
tokenId: tokenId,
6777
})
6878

src/utils/getDefaultDeadline.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import { DEFAULT_DEADLINE } from '@/constants/common'
2+
import type { UniDevKitV4Instance } from '@/types'
3+
4+
export async function getDefaultDeadline(
5+
instance: UniDevKitV4Instance,
6+
timeFromNow: number = DEFAULT_DEADLINE,
7+
): Promise<bigint> {
8+
return (await instance.client.getBlock()).timestamp + BigInt(timeFromNow)
9+
}

0 commit comments

Comments
 (0)