Skip to content

Commit 39ca552

Browse files
authored
encode swap+add with mint/increaseliquidity (Uniswap#18)
+ includes outputTokenPermit
1 parent 24b7e14 commit 39ca552

File tree

5 files changed

+5697
-5504
lines changed

5 files changed

+5697
-5504
lines changed

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
"dependencies": {
2929
"@ethersproject/abi": "^5.5.0",
3030
"@uniswap/sdk-core": "^3.0.1",
31-
"@uniswap/swap-router-contracts": "1.0.0",
31+
"@uniswap/swap-router-contracts": "1.1.0",
3232
"@uniswap/v2-sdk": "^3.0.1",
3333
"@uniswap/v3-sdk": "^3.7.1"
3434
},

src/approveAndCall.ts

+49-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,17 @@
11
import { Interface } from '@ethersproject/abi'
22
import invariant from 'tiny-invariant'
33
import { abi } from '@uniswap/swap-router-contracts/artifacts/contracts/interfaces/IApproveAndCall.sol/IApproveAndCall.json'
4-
import { Currency, Token } from '@uniswap/sdk-core'
5-
import { NonfungiblePositionManager } from '@uniswap/v3-sdk'
4+
import { Currency, Percent, Token } from '@uniswap/sdk-core'
5+
import {
6+
MintSpecificOptions,
7+
IncreaseSpecificOptions,
8+
NonfungiblePositionManager,
9+
Position,
10+
toHex,
11+
} from '@uniswap/v3-sdk'
12+
13+
// condensed version of v3-sdk AddLiquidityOptions containing only necessary swap + add attributes
14+
export type CondensedAddLiquidityOptions = Omit<MintSpecificOptions, 'createPool'> | IncreaseSpecificOptions
615

716
export enum ApprovalTypes {
817
NOT_REQUIRED = 0,
@@ -12,6 +21,11 @@ export enum ApprovalTypes {
1221
ZERO_THEN_MAX_MINUS_ONE = 4,
1322
}
1423

24+
// type guard
25+
export function isMint(options: CondensedAddLiquidityOptions): options is Omit<MintSpecificOptions, 'createPool'> {
26+
return Object.keys(options).some((k) => k === 'recipient')
27+
}
28+
1529
export abstract class ApproveAndCall {
1630
public static INTERFACE: Interface = new Interface(abi)
1731

@@ -47,6 +61,39 @@ export abstract class ApproveAndCall {
4761
}
4862
}
4963

64+
public static encodeAddLiquidity(
65+
position: Position,
66+
addLiquidityOptions: CondensedAddLiquidityOptions,
67+
slippageTolerance: Percent
68+
): string {
69+
const { amount0: amount0Min, amount1: amount1Min } = position.mintAmountsWithSlippage(slippageTolerance)
70+
71+
if (isMint(addLiquidityOptions)) {
72+
return ApproveAndCall.INTERFACE.encodeFunctionData('mint', [
73+
{
74+
token0: position.pool.token0.address,
75+
token1: position.pool.token1.address,
76+
fee: position.pool.fee,
77+
tickLower: position.tickLower,
78+
tickUpper: position.tickUpper,
79+
amount0Min: toHex(amount0Min),
80+
amount1Min: toHex(amount1Min),
81+
recipient: addLiquidityOptions.recipient,
82+
},
83+
])
84+
} else {
85+
return ApproveAndCall.INTERFACE.encodeFunctionData('increaseLiquidity', [
86+
{
87+
token0: position.pool.token0.address,
88+
token1: position.pool.token1.address,
89+
amount0Min: toHex(amount0Min),
90+
amount1Min: toHex(amount1Min),
91+
tokenId: toHex(addLiquidityOptions.tokenId),
92+
},
93+
])
94+
}
95+
}
96+
5097
public static encodeApprove(token: Currency, approvalType: ApprovalTypes): string {
5198
switch (approvalType) {
5299
case ApprovalTypes.MAX:

0 commit comments

Comments
 (0)