@clawnch/clawncher-sdk 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +603 -0
- package/dist/abis.d.ts +935 -0
- package/dist/abis.d.ts.map +1 -0
- package/dist/abis.js +486 -0
- package/dist/abis.js.map +1 -0
- package/dist/addresses.d.ts +51 -0
- package/dist/addresses.d.ts.map +1 -0
- package/dist/addresses.js +80 -0
- package/dist/addresses.js.map +1 -0
- package/dist/api-deployer-types.d.ts +165 -0
- package/dist/api-deployer-types.d.ts.map +1 -0
- package/dist/api-deployer-types.js +9 -0
- package/dist/api-deployer-types.js.map +1 -0
- package/dist/api-deployer.d.ts +114 -0
- package/dist/api-deployer.d.ts.map +1 -0
- package/dist/api-deployer.js +309 -0
- package/dist/api-deployer.js.map +1 -0
- package/dist/claimer.d.ts +197 -0
- package/dist/claimer.d.ts.map +1 -0
- package/dist/claimer.js +311 -0
- package/dist/claimer.js.map +1 -0
- package/dist/deployer.d.ts +229 -0
- package/dist/deployer.d.ts.map +1 -0
- package/dist/deployer.js +305 -0
- package/dist/deployer.js.map +1 -0
- package/dist/erc8004-types.d.ts +94 -0
- package/dist/erc8004-types.d.ts.map +1 -0
- package/dist/erc8004-types.js +8 -0
- package/dist/erc8004-types.js.map +1 -0
- package/dist/errors.d.ts +62 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +75 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +204 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +358 -0
- package/dist/index.js.map +1 -0
- package/dist/liquidity-types.d.ts +198 -0
- package/dist/liquidity-types.d.ts.map +1 -0
- package/dist/liquidity-types.js +8 -0
- package/dist/liquidity-types.js.map +1 -0
- package/dist/liquidity.d.ts +111 -0
- package/dist/liquidity.d.ts.map +1 -0
- package/dist/liquidity.js +608 -0
- package/dist/liquidity.js.map +1 -0
- package/dist/molten-types.d.ts +282 -0
- package/dist/molten-types.d.ts.map +1 -0
- package/dist/molten-types.js +8 -0
- package/dist/molten-types.js.map +1 -0
- package/dist/molten.d.ts +336 -0
- package/dist/molten.d.ts.map +1 -0
- package/dist/molten.js +560 -0
- package/dist/molten.js.map +1 -0
- package/dist/portfolio.d.ts +129 -0
- package/dist/portfolio.d.ts.map +1 -0
- package/dist/portfolio.js +218 -0
- package/dist/portfolio.js.map +1 -0
- package/dist/reader.d.ts +249 -0
- package/dist/reader.d.ts.map +1 -0
- package/dist/reader.js +488 -0
- package/dist/reader.js.map +1 -0
- package/dist/swap-types.d.ts +159 -0
- package/dist/swap-types.d.ts.map +1 -0
- package/dist/swap-types.js +22 -0
- package/dist/swap-types.js.map +1 -0
- package/dist/swap.d.ts +762 -0
- package/dist/swap.d.ts.map +1 -0
- package/dist/swap.js +345 -0
- package/dist/swap.js.map +1 -0
- package/dist/token-verification-data.d.ts +4 -0
- package/dist/token-verification-data.d.ts.map +1 -0
- package/dist/token-verification-data.js +6 -0
- package/dist/token-verification-data.js.map +1 -0
- package/dist/types.d.ts +244 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/dist/uniswap-abis.d.ts +470 -0
- package/dist/uniswap-abis.d.ts.map +1 -0
- package/dist/uniswap-abis.js +322 -0
- package/dist/uniswap-abis.js.map +1 -0
- package/dist/uniswap-addresses.d.ts +38 -0
- package/dist/uniswap-addresses.d.ts.map +1 -0
- package/dist/uniswap-addresses.js +67 -0
- package/dist/uniswap-addresses.js.map +1 -0
- package/dist/vanity.d.ts +115 -0
- package/dist/vanity.d.ts.map +1 -0
- package/dist/vanity.js +166 -0
- package/dist/vanity.js.map +1 -0
- package/dist/verify.d.ts +88 -0
- package/dist/verify.d.ts.map +1 -0
- package/dist/verify.js +181 -0
- package/dist/verify.js.map +1 -0
- package/dist/watcher.d.ts +112 -0
- package/dist/watcher.d.ts.map +1 -0
- package/dist/watcher.js +132 -0
- package/dist/watcher.js.map +1 -0
- package/package.json +59 -0
|
@@ -0,0 +1,608 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ClawnchLiquidity - Uniswap V3 & V4 Liquidity Management
|
|
3
|
+
*
|
|
4
|
+
* Manages liquidity positions on both Uniswap V3 and V4 pools on Base.
|
|
5
|
+
* Supports minting, adding/removing liquidity, and fee collection.
|
|
6
|
+
*
|
|
7
|
+
* V4 uses the PositionManager with multicall + command encoding.
|
|
8
|
+
* V3 uses the NonfungiblePositionManager directly.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```typescript
|
|
12
|
+
* import { ClawnchLiquidity } from '@clawnch/clawncher-sdk';
|
|
13
|
+
* import { createWalletClient, createPublicClient, http } from 'viem';
|
|
14
|
+
* import { privateKeyToAccount } from 'viem/accounts';
|
|
15
|
+
* import { base } from 'viem/chains';
|
|
16
|
+
*
|
|
17
|
+
* const account = privateKeyToAccount('0x...');
|
|
18
|
+
* const wallet = createWalletClient({ account, chain: base, transport: http() });
|
|
19
|
+
* const publicClient = createPublicClient({ chain: base, transport: http() });
|
|
20
|
+
*
|
|
21
|
+
* const liquidity = new ClawnchLiquidity({ wallet, publicClient });
|
|
22
|
+
*
|
|
23
|
+
* // Read a V3 position
|
|
24
|
+
* const pos = await liquidity.v3GetPosition(123456n);
|
|
25
|
+
* console.log(pos.liquidity, pos.unclaimedFees);
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
import { erc20Abi, maxUint256, maxUint128, encodeFunctionData, } from 'viem';
|
|
29
|
+
import { base, baseSepolia } from 'viem/chains';
|
|
30
|
+
import { ClawnchErrorCode, ClawnchDeployError } from './errors.js';
|
|
31
|
+
import { getUniswapV4Addresses, getUniswapV3Addresses } from './uniswap-addresses.js';
|
|
32
|
+
import { StateViewABI, V4PositionManagerABI, V3NonfungiblePositionManagerABI, Permit2ABI } from './uniswap-abis.js';
|
|
33
|
+
// ============================================================================
|
|
34
|
+
// Constants
|
|
35
|
+
// ============================================================================
|
|
36
|
+
const Q128 = 2n ** 128n;
|
|
37
|
+
const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000';
|
|
38
|
+
const DEFAULT_DEADLINE_SECONDS = 1200; // 20 minutes
|
|
39
|
+
const DEFAULT_SLIPPAGE_BPS = 50; // 0.5%
|
|
40
|
+
// ============================================================================
|
|
41
|
+
// Helpers
|
|
42
|
+
// ============================================================================
|
|
43
|
+
function getDeadline(secondsFromNow) {
|
|
44
|
+
return BigInt(Math.floor(Date.now() / 1000) + (secondsFromNow ?? DEFAULT_DEADLINE_SECONDS));
|
|
45
|
+
}
|
|
46
|
+
function applySlippage(amount, slippageBps) {
|
|
47
|
+
// Returns minimum acceptable amount after slippage
|
|
48
|
+
return amount - (amount * BigInt(slippageBps) / 10000n);
|
|
49
|
+
}
|
|
50
|
+
// ============================================================================
|
|
51
|
+
// ClawnchLiquidity
|
|
52
|
+
// ============================================================================
|
|
53
|
+
export class ClawnchLiquidity {
|
|
54
|
+
wallet;
|
|
55
|
+
publicClient;
|
|
56
|
+
network;
|
|
57
|
+
constructor(config) {
|
|
58
|
+
if (!config.wallet) {
|
|
59
|
+
throw new ClawnchDeployError(ClawnchErrorCode.WALLET_NOT_CONFIGURED, 'Wallet client is required for ClawnchLiquidity');
|
|
60
|
+
}
|
|
61
|
+
if (!config.publicClient) {
|
|
62
|
+
throw new ClawnchDeployError(ClawnchErrorCode.PUBLIC_CLIENT_NOT_CONFIGURED, 'Public client is required for ClawnchLiquidity');
|
|
63
|
+
}
|
|
64
|
+
this.wallet = config.wallet;
|
|
65
|
+
this.publicClient = config.publicClient;
|
|
66
|
+
this.network = config.network ?? 'mainnet';
|
|
67
|
+
}
|
|
68
|
+
getChain() {
|
|
69
|
+
return this.network === 'mainnet' ? base : baseSepolia;
|
|
70
|
+
}
|
|
71
|
+
getWalletAddress() {
|
|
72
|
+
return this.wallet.account.address;
|
|
73
|
+
}
|
|
74
|
+
// ==========================================================================
|
|
75
|
+
// Token Approval Helpers
|
|
76
|
+
// ==========================================================================
|
|
77
|
+
/**
|
|
78
|
+
* Approve an ERC20 token for a spender if current allowance is insufficient
|
|
79
|
+
*/
|
|
80
|
+
async ensureApproval(token, spender, amount) {
|
|
81
|
+
if (token === ZERO_ADDRESS)
|
|
82
|
+
return; // native ETH
|
|
83
|
+
const currentAllowance = await this.publicClient.readContract({
|
|
84
|
+
address: token,
|
|
85
|
+
abi: erc20Abi,
|
|
86
|
+
functionName: 'allowance',
|
|
87
|
+
args: [this.getWalletAddress(), spender],
|
|
88
|
+
});
|
|
89
|
+
if (currentAllowance < amount) {
|
|
90
|
+
const txHash = await this.wallet.writeContract({
|
|
91
|
+
address: token,
|
|
92
|
+
abi: erc20Abi,
|
|
93
|
+
functionName: 'approve',
|
|
94
|
+
args: [spender, maxUint256],
|
|
95
|
+
chain: this.getChain(),
|
|
96
|
+
});
|
|
97
|
+
await this.publicClient.waitForTransactionReceipt({ hash: txHash });
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
// ==========================================================================
|
|
101
|
+
// V4: Pool State Reading
|
|
102
|
+
// ==========================================================================
|
|
103
|
+
/**
|
|
104
|
+
* Get V4 pool state via StateView
|
|
105
|
+
*/
|
|
106
|
+
async v4GetPoolState(poolKey) {
|
|
107
|
+
const v4 = getUniswapV4Addresses(this.network);
|
|
108
|
+
// Compute poolId by hashing the pool key
|
|
109
|
+
// The SDK method Pool.getPoolId handles this, but we can also compute directly
|
|
110
|
+
const { keccak256, encodeAbiParameters } = await import('viem');
|
|
111
|
+
const poolId = keccak256(encodeAbiParameters([
|
|
112
|
+
{ type: 'address' },
|
|
113
|
+
{ type: 'address' },
|
|
114
|
+
{ type: 'uint24' },
|
|
115
|
+
{ type: 'int24' },
|
|
116
|
+
{ type: 'address' },
|
|
117
|
+
], [poolKey.currency0, poolKey.currency1, poolKey.fee, poolKey.tickSpacing, poolKey.hooks]));
|
|
118
|
+
const [slot0Result, liquidityResult] = await Promise.all([
|
|
119
|
+
this.publicClient.readContract({
|
|
120
|
+
address: v4.stateView,
|
|
121
|
+
abi: StateViewABI,
|
|
122
|
+
functionName: 'getSlot0',
|
|
123
|
+
args: [poolId],
|
|
124
|
+
}),
|
|
125
|
+
this.publicClient.readContract({
|
|
126
|
+
address: v4.stateView,
|
|
127
|
+
abi: StateViewABI,
|
|
128
|
+
functionName: 'getLiquidity',
|
|
129
|
+
args: [poolId],
|
|
130
|
+
}),
|
|
131
|
+
]);
|
|
132
|
+
return {
|
|
133
|
+
sqrtPriceX96: slot0Result[0],
|
|
134
|
+
tick: Number(slot0Result[1]),
|
|
135
|
+
liquidity: liquidityResult,
|
|
136
|
+
poolId,
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
// ==========================================================================
|
|
140
|
+
// V4: Position Reading
|
|
141
|
+
// ==========================================================================
|
|
142
|
+
/**
|
|
143
|
+
* Get V4 position details from a token ID
|
|
144
|
+
*/
|
|
145
|
+
async v4GetPosition(tokenId) {
|
|
146
|
+
const v4 = getUniswapV4Addresses(this.network);
|
|
147
|
+
// Get pool key and position info from PositionManager
|
|
148
|
+
const [poolKey, info] = await this.publicClient.readContract({
|
|
149
|
+
address: v4.positionManager,
|
|
150
|
+
abi: V4PositionManagerABI,
|
|
151
|
+
functionName: 'getPoolAndPositionInfo',
|
|
152
|
+
args: [tokenId],
|
|
153
|
+
});
|
|
154
|
+
// Compute poolId
|
|
155
|
+
const { keccak256, encodeAbiParameters } = await import('viem');
|
|
156
|
+
const poolId = keccak256(encodeAbiParameters([
|
|
157
|
+
{ type: 'address' },
|
|
158
|
+
{ type: 'address' },
|
|
159
|
+
{ type: 'uint24' },
|
|
160
|
+
{ type: 'int24' },
|
|
161
|
+
{ type: 'address' },
|
|
162
|
+
], [poolKey.currency0, poolKey.currency1, poolKey.fee, poolKey.tickSpacing, poolKey.hooks]));
|
|
163
|
+
// Get fee growth data from StateView to calculate unclaimed fees
|
|
164
|
+
const salt = `0x${tokenId.toString(16).padStart(64, '0')}`;
|
|
165
|
+
const [positionState, feeGrowthCurrent] = await Promise.all([
|
|
166
|
+
this.publicClient.readContract({
|
|
167
|
+
address: v4.stateView,
|
|
168
|
+
abi: StateViewABI,
|
|
169
|
+
functionName: 'getPositionInfo',
|
|
170
|
+
args: [poolId, v4.positionManager, info.tickLower, info.tickUpper, salt],
|
|
171
|
+
}),
|
|
172
|
+
this.publicClient.readContract({
|
|
173
|
+
address: v4.stateView,
|
|
174
|
+
abi: StateViewABI,
|
|
175
|
+
functionName: 'getFeeGrowthInside',
|
|
176
|
+
args: [poolId, info.tickLower, info.tickUpper],
|
|
177
|
+
}),
|
|
178
|
+
]);
|
|
179
|
+
const liquidity = positionState[0];
|
|
180
|
+
const feeGrowthInside0Last = positionState[1];
|
|
181
|
+
const feeGrowthInside1Last = positionState[2];
|
|
182
|
+
const feeGrowthInside0Current = feeGrowthCurrent[0];
|
|
183
|
+
const feeGrowthInside1Current = feeGrowthCurrent[1];
|
|
184
|
+
// Calculate unclaimed fees
|
|
185
|
+
const delta0 = feeGrowthInside0Current >= feeGrowthInside0Last
|
|
186
|
+
? feeGrowthInside0Current - feeGrowthInside0Last : 0n;
|
|
187
|
+
const delta1 = feeGrowthInside1Current >= feeGrowthInside1Last
|
|
188
|
+
? feeGrowthInside1Current - feeGrowthInside1Last : 0n;
|
|
189
|
+
const token0Fees = liquidity > 0n ? (delta0 * liquidity) / Q128 : 0n;
|
|
190
|
+
const token1Fees = liquidity > 0n ? (delta1 * liquidity) / Q128 : 0n;
|
|
191
|
+
return {
|
|
192
|
+
tokenId,
|
|
193
|
+
version: 'v4',
|
|
194
|
+
token0: poolKey.currency0,
|
|
195
|
+
token1: poolKey.currency1,
|
|
196
|
+
fee: Number(poolKey.fee),
|
|
197
|
+
tickLower: Number(info.tickLower),
|
|
198
|
+
tickUpper: Number(info.tickUpper),
|
|
199
|
+
liquidity,
|
|
200
|
+
unclaimedFees: {
|
|
201
|
+
token0: token0Fees,
|
|
202
|
+
token1: token1Fees,
|
|
203
|
+
},
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
// ==========================================================================
|
|
207
|
+
// V4: Mint Position
|
|
208
|
+
// ==========================================================================
|
|
209
|
+
/**
|
|
210
|
+
* Mint a new V4 liquidity position
|
|
211
|
+
*
|
|
212
|
+
* Note: For full V4 SDK integration (Pool/Position math, calldata encoding),
|
|
213
|
+
* the @uniswap/v4-sdk package is required. This method provides a lower-level
|
|
214
|
+
* interface using direct contract calls for environments where the Uniswap SDK
|
|
215
|
+
* may not be available.
|
|
216
|
+
*
|
|
217
|
+
* For production use, consider using the Uniswap V4 SDK's
|
|
218
|
+
* V4PositionManager.addCallParameters() for proper slippage calculation.
|
|
219
|
+
*/
|
|
220
|
+
async v4MintPosition(params) {
|
|
221
|
+
const v4 = getUniswapV4Addresses(this.network);
|
|
222
|
+
const recipient = params.recipient ?? this.getWalletAddress();
|
|
223
|
+
const hookAddress = params.hookAddress ?? ZERO_ADDRESS;
|
|
224
|
+
// Ensure token approvals to Permit2
|
|
225
|
+
await Promise.all([
|
|
226
|
+
this.ensureApproval(params.token0, v4.permit2, params.amount0Desired),
|
|
227
|
+
this.ensureApproval(params.token1, v4.permit2, params.amount1Desired),
|
|
228
|
+
]);
|
|
229
|
+
// Also ensure Permit2 has approved PositionManager
|
|
230
|
+
// This is a two-step approval: token -> Permit2 -> PositionManager
|
|
231
|
+
const maxUint160 = (2n ** 160n) - 1n;
|
|
232
|
+
const deadline48 = BigInt(Math.floor(Date.now() / 1000) + 86400 * 30); // 30 days
|
|
233
|
+
// Check and set Permit2 -> PositionManager allowances
|
|
234
|
+
for (const token of [params.token0, params.token1]) {
|
|
235
|
+
if (token === ZERO_ADDRESS)
|
|
236
|
+
continue;
|
|
237
|
+
const [currentAmount] = await this.publicClient.readContract({
|
|
238
|
+
address: v4.permit2,
|
|
239
|
+
abi: Permit2ABI,
|
|
240
|
+
functionName: 'allowance',
|
|
241
|
+
args: [this.getWalletAddress(), token, v4.positionManager],
|
|
242
|
+
});
|
|
243
|
+
if (currentAmount < params.amount0Desired) {
|
|
244
|
+
const txHash = await this.wallet.writeContract({
|
|
245
|
+
address: v4.permit2,
|
|
246
|
+
abi: Permit2ABI,
|
|
247
|
+
functionName: 'approve',
|
|
248
|
+
args: [token, v4.positionManager, maxUint160, Number(deadline48)],
|
|
249
|
+
chain: this.getChain(),
|
|
250
|
+
});
|
|
251
|
+
await this.publicClient.waitForTransactionReceipt({ hash: txHash });
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
// Build the V4 mint calldata using the PositionManager's multicall
|
|
255
|
+
// The actual encoding depends on the V4 SDK. Here we provide a simplified
|
|
256
|
+
// direct approach that can work without the full SDK dependency.
|
|
257
|
+
// For now, we use the direct multicall approach with encoded actions.
|
|
258
|
+
// In production, one would use V4PositionManager.addCallParameters() from @uniswap/v4-sdk.
|
|
259
|
+
// Since the V4 PositionManager uses a complex action encoding system,
|
|
260
|
+
// we'll document that the full V4 SDK is recommended for mint operations.
|
|
261
|
+
throw new ClawnchDeployError(ClawnchErrorCode.FEATURE_NOT_AVAILABLE, 'V4 minting requires @uniswap/v4-sdk for proper action encoding. ' +
|
|
262
|
+
'Install it and use V4PositionManager.addCallParameters() to generate calldata, ' +
|
|
263
|
+
'then pass it to v4ExecuteMulticall().');
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* Execute a V4 PositionManager multicall with pre-built calldata
|
|
267
|
+
*
|
|
268
|
+
* Use this with calldata generated by @uniswap/v4-sdk's
|
|
269
|
+
* V4PositionManager.addCallParameters(), removeCallParameters(), or
|
|
270
|
+
* collectCallParameters().
|
|
271
|
+
*
|
|
272
|
+
* @param calldata - Encoded calldata bytes from V4 SDK
|
|
273
|
+
* @param value - ETH value to send (for native ETH positions)
|
|
274
|
+
* @returns Transaction hash and receipt
|
|
275
|
+
*/
|
|
276
|
+
async v4ExecuteMulticall(calldata, value = 0n) {
|
|
277
|
+
const v4 = getUniswapV4Addresses(this.network);
|
|
278
|
+
const txHash = await this.wallet.writeContract({
|
|
279
|
+
address: v4.positionManager,
|
|
280
|
+
abi: V4PositionManagerABI,
|
|
281
|
+
functionName: 'multicall',
|
|
282
|
+
args: [[calldata]],
|
|
283
|
+
value,
|
|
284
|
+
chain: this.getChain(),
|
|
285
|
+
});
|
|
286
|
+
const receipt = await this.publicClient.waitForTransactionReceipt({ hash: txHash });
|
|
287
|
+
if (receipt.status === 'reverted') {
|
|
288
|
+
throw new ClawnchDeployError(ClawnchErrorCode.TX_REVERTED, `V4 multicall transaction reverted: ${txHash}`);
|
|
289
|
+
}
|
|
290
|
+
return { txHash, receipt };
|
|
291
|
+
}
|
|
292
|
+
// ==========================================================================
|
|
293
|
+
// V3: Position Reading
|
|
294
|
+
// ==========================================================================
|
|
295
|
+
/**
|
|
296
|
+
* Get V3 position details from a token ID
|
|
297
|
+
*/
|
|
298
|
+
async v3GetPosition(tokenId) {
|
|
299
|
+
const v3 = getUniswapV3Addresses(this.network);
|
|
300
|
+
const result = await this.publicClient.readContract({
|
|
301
|
+
address: v3.nonfungiblePositionManager,
|
|
302
|
+
abi: V3NonfungiblePositionManagerABI,
|
|
303
|
+
functionName: 'positions',
|
|
304
|
+
args: [tokenId],
|
|
305
|
+
});
|
|
306
|
+
// result: [nonce, operator, token0, token1, fee, tickLower, tickUpper,
|
|
307
|
+
// liquidity, feeGrowthInside0LastX128, feeGrowthInside1LastX128,
|
|
308
|
+
// tokensOwed0, tokensOwed1]
|
|
309
|
+
return {
|
|
310
|
+
tokenId,
|
|
311
|
+
version: 'v3',
|
|
312
|
+
token0: result[2],
|
|
313
|
+
token1: result[3],
|
|
314
|
+
fee: Number(result[4]),
|
|
315
|
+
tickLower: Number(result[5]),
|
|
316
|
+
tickUpper: Number(result[6]),
|
|
317
|
+
liquidity: result[7],
|
|
318
|
+
unclaimedFees: {
|
|
319
|
+
token0: result[10],
|
|
320
|
+
token1: result[11],
|
|
321
|
+
},
|
|
322
|
+
};
|
|
323
|
+
}
|
|
324
|
+
/**
|
|
325
|
+
* List all V3 positions for a wallet
|
|
326
|
+
*/
|
|
327
|
+
async v3GetPositionsForWallet(wallet) {
|
|
328
|
+
const v3 = getUniswapV3Addresses(this.network);
|
|
329
|
+
const owner = wallet ?? this.getWalletAddress();
|
|
330
|
+
const balance = await this.publicClient.readContract({
|
|
331
|
+
address: v3.nonfungiblePositionManager,
|
|
332
|
+
abi: V3NonfungiblePositionManagerABI,
|
|
333
|
+
functionName: 'balanceOf',
|
|
334
|
+
args: [owner],
|
|
335
|
+
});
|
|
336
|
+
const count = Number(balance);
|
|
337
|
+
if (count === 0)
|
|
338
|
+
return [];
|
|
339
|
+
// Fetch all token IDs
|
|
340
|
+
const tokenIdPromises = Array.from({ length: count }, (_, i) => this.publicClient.readContract({
|
|
341
|
+
address: v3.nonfungiblePositionManager,
|
|
342
|
+
abi: V3NonfungiblePositionManagerABI,
|
|
343
|
+
functionName: 'tokenOfOwnerByIndex',
|
|
344
|
+
args: [owner, BigInt(i)],
|
|
345
|
+
}));
|
|
346
|
+
const tokenIds = await Promise.all(tokenIdPromises);
|
|
347
|
+
// Fetch position details for each
|
|
348
|
+
const positions = await Promise.all(tokenIds.map(id => this.v3GetPosition(id)));
|
|
349
|
+
return positions;
|
|
350
|
+
}
|
|
351
|
+
// ==========================================================================
|
|
352
|
+
// V3: Mint Position
|
|
353
|
+
// ==========================================================================
|
|
354
|
+
/**
|
|
355
|
+
* Mint a new V3 liquidity position
|
|
356
|
+
*/
|
|
357
|
+
async v3MintPosition(params) {
|
|
358
|
+
const v3 = getUniswapV3Addresses(this.network);
|
|
359
|
+
const recipient = params.recipient ?? this.getWalletAddress();
|
|
360
|
+
const deadline = getDeadline(params.deadline);
|
|
361
|
+
const amount0Min = params.amount0Min ?? 0n;
|
|
362
|
+
const amount1Min = params.amount1Min ?? 0n;
|
|
363
|
+
// Ensure token approvals
|
|
364
|
+
await Promise.all([
|
|
365
|
+
this.ensureApproval(params.token0, v3.nonfungiblePositionManager, params.amount0Desired),
|
|
366
|
+
this.ensureApproval(params.token1, v3.nonfungiblePositionManager, params.amount1Desired),
|
|
367
|
+
]);
|
|
368
|
+
const txHash = await this.wallet.writeContract({
|
|
369
|
+
address: v3.nonfungiblePositionManager,
|
|
370
|
+
abi: V3NonfungiblePositionManagerABI,
|
|
371
|
+
functionName: 'mint',
|
|
372
|
+
args: [{
|
|
373
|
+
token0: params.token0,
|
|
374
|
+
token1: params.token1,
|
|
375
|
+
fee: params.fee,
|
|
376
|
+
tickLower: params.tickLower,
|
|
377
|
+
tickUpper: params.tickUpper,
|
|
378
|
+
amount0Desired: params.amount0Desired,
|
|
379
|
+
amount1Desired: params.amount1Desired,
|
|
380
|
+
amount0Min,
|
|
381
|
+
amount1Min,
|
|
382
|
+
recipient,
|
|
383
|
+
deadline,
|
|
384
|
+
}],
|
|
385
|
+
chain: this.getChain(),
|
|
386
|
+
});
|
|
387
|
+
const receipt = await this.publicClient.waitForTransactionReceipt({ hash: txHash });
|
|
388
|
+
if (receipt.status === 'reverted') {
|
|
389
|
+
throw new ClawnchDeployError(ClawnchErrorCode.TX_REVERTED, `V3 mint transaction reverted: ${txHash}`);
|
|
390
|
+
}
|
|
391
|
+
// Parse the mint event to get tokenId, liquidity, amounts
|
|
392
|
+
// The NonfungiblePositionManager emits IncreaseLiquidity(tokenId, liquidity, amount0, amount1)
|
|
393
|
+
// and Transfer(from, to, tokenId)
|
|
394
|
+
let tokenId = 0n;
|
|
395
|
+
let liquidityMinted = 0n;
|
|
396
|
+
let amount0 = 0n;
|
|
397
|
+
let amount1 = 0n;
|
|
398
|
+
for (const log of receipt.logs) {
|
|
399
|
+
// IncreaseLiquidity event topic
|
|
400
|
+
if (log.topics[0] === '0x3067048beee31b25b2f1681f88dac838c8bba36af25bfb2b7cf7473a5847e35f') {
|
|
401
|
+
tokenId = BigInt(log.topics[1] || '0');
|
|
402
|
+
// Decode data: liquidity (uint128), amount0 (uint256), amount1 (uint256)
|
|
403
|
+
if (log.data && log.data.length >= 194) {
|
|
404
|
+
liquidityMinted = BigInt('0x' + log.data.slice(2, 66));
|
|
405
|
+
amount0 = BigInt('0x' + log.data.slice(66, 130));
|
|
406
|
+
amount1 = BigInt('0x' + log.data.slice(130, 194));
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
return {
|
|
411
|
+
txHash,
|
|
412
|
+
tokenId,
|
|
413
|
+
amount0,
|
|
414
|
+
amount1,
|
|
415
|
+
liquidity: liquidityMinted,
|
|
416
|
+
receipt,
|
|
417
|
+
};
|
|
418
|
+
}
|
|
419
|
+
// ==========================================================================
|
|
420
|
+
// V3: Add Liquidity
|
|
421
|
+
// ==========================================================================
|
|
422
|
+
/**
|
|
423
|
+
* Add liquidity to an existing V3 position
|
|
424
|
+
*/
|
|
425
|
+
async v3AddLiquidity(tokenId, params) {
|
|
426
|
+
const v3 = getUniswapV3Addresses(this.network);
|
|
427
|
+
const deadline = getDeadline(params.deadline);
|
|
428
|
+
const amount0Min = params.amount0Min ?? 0n;
|
|
429
|
+
const amount1Min = params.amount1Min ?? 0n;
|
|
430
|
+
// Get position to know tokens
|
|
431
|
+
const position = await this.v3GetPosition(tokenId);
|
|
432
|
+
// Ensure approvals
|
|
433
|
+
await Promise.all([
|
|
434
|
+
this.ensureApproval(position.token0, v3.nonfungiblePositionManager, params.amount0Desired),
|
|
435
|
+
this.ensureApproval(position.token1, v3.nonfungiblePositionManager, params.amount1Desired),
|
|
436
|
+
]);
|
|
437
|
+
const txHash = await this.wallet.writeContract({
|
|
438
|
+
address: v3.nonfungiblePositionManager,
|
|
439
|
+
abi: V3NonfungiblePositionManagerABI,
|
|
440
|
+
functionName: 'increaseLiquidity',
|
|
441
|
+
args: [{
|
|
442
|
+
tokenId,
|
|
443
|
+
amount0Desired: params.amount0Desired,
|
|
444
|
+
amount1Desired: params.amount1Desired,
|
|
445
|
+
amount0Min,
|
|
446
|
+
amount1Min,
|
|
447
|
+
deadline,
|
|
448
|
+
}],
|
|
449
|
+
chain: this.getChain(),
|
|
450
|
+
});
|
|
451
|
+
const receipt = await this.publicClient.waitForTransactionReceipt({ hash: txHash });
|
|
452
|
+
if (receipt.status === 'reverted') {
|
|
453
|
+
throw new ClawnchDeployError(ClawnchErrorCode.TX_REVERTED, `V3 increaseLiquidity transaction reverted: ${txHash}`);
|
|
454
|
+
}
|
|
455
|
+
// Parse amounts from IncreaseLiquidity event
|
|
456
|
+
let amount0 = 0n;
|
|
457
|
+
let amount1 = 0n;
|
|
458
|
+
for (const log of receipt.logs) {
|
|
459
|
+
if (log.topics[0] === '0x3067048beee31b25b2f1681f88dac838c8bba36af25bfb2b7cf7473a5847e35f'
|
|
460
|
+
&& BigInt(log.topics[1] || '0') === tokenId) {
|
|
461
|
+
if (log.data && log.data.length >= 194) {
|
|
462
|
+
amount0 = BigInt('0x' + log.data.slice(66, 130));
|
|
463
|
+
amount1 = BigInt('0x' + log.data.slice(130, 194));
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
return { txHash, amount0, amount1, receipt };
|
|
468
|
+
}
|
|
469
|
+
// ==========================================================================
|
|
470
|
+
// V3: Remove Liquidity
|
|
471
|
+
// ==========================================================================
|
|
472
|
+
/**
|
|
473
|
+
* Remove liquidity from a V3 position
|
|
474
|
+
*
|
|
475
|
+
* This decreases liquidity and then collects the withdrawn tokens.
|
|
476
|
+
* If removing 100% and burnToken is true, also burns the NFT.
|
|
477
|
+
*/
|
|
478
|
+
async v3RemoveLiquidity(tokenId, params) {
|
|
479
|
+
const v3 = getUniswapV3Addresses(this.network);
|
|
480
|
+
const deadline = getDeadline(params.deadline);
|
|
481
|
+
const amount0Min = params.amount0Min ?? 0n;
|
|
482
|
+
const amount1Min = params.amount1Min ?? 0n;
|
|
483
|
+
// Get current position
|
|
484
|
+
const position = await this.v3GetPosition(tokenId);
|
|
485
|
+
if (position.liquidity === 0n) {
|
|
486
|
+
throw new ClawnchDeployError(ClawnchErrorCode.CLAIM_FAILED, 'Position has no liquidity to remove');
|
|
487
|
+
}
|
|
488
|
+
// Calculate liquidity to remove
|
|
489
|
+
const pct = Math.min(Math.max(params.percentageToRemove, 0), 1);
|
|
490
|
+
const liquidityToRemove = BigInt(Math.floor(Number(position.liquidity) * pct));
|
|
491
|
+
if (liquidityToRemove === 0n) {
|
|
492
|
+
throw new ClawnchDeployError(ClawnchErrorCode.INVALID_BPS, 'Calculated liquidity to remove is zero');
|
|
493
|
+
}
|
|
494
|
+
// Build multicall: decreaseLiquidity + collect (+ optionally burn)
|
|
495
|
+
const calls = [];
|
|
496
|
+
// 1. Decrease liquidity
|
|
497
|
+
calls.push(encodeFunctionData({
|
|
498
|
+
abi: V3NonfungiblePositionManagerABI,
|
|
499
|
+
functionName: 'decreaseLiquidity',
|
|
500
|
+
args: [{
|
|
501
|
+
tokenId,
|
|
502
|
+
liquidity: liquidityToRemove,
|
|
503
|
+
amount0Min,
|
|
504
|
+
amount1Min,
|
|
505
|
+
deadline,
|
|
506
|
+
}],
|
|
507
|
+
}));
|
|
508
|
+
// 2. Collect all tokens (includes withdrawn liquidity + fees)
|
|
509
|
+
calls.push(encodeFunctionData({
|
|
510
|
+
abi: V3NonfungiblePositionManagerABI,
|
|
511
|
+
functionName: 'collect',
|
|
512
|
+
args: [{
|
|
513
|
+
tokenId,
|
|
514
|
+
recipient: this.getWalletAddress(),
|
|
515
|
+
amount0Max: maxUint128,
|
|
516
|
+
amount1Max: maxUint128,
|
|
517
|
+
}],
|
|
518
|
+
}));
|
|
519
|
+
// 3. Optionally burn the NFT (only if 100% removed)
|
|
520
|
+
if (params.burnToken && pct === 1) {
|
|
521
|
+
calls.push(encodeFunctionData({
|
|
522
|
+
abi: V3NonfungiblePositionManagerABI,
|
|
523
|
+
functionName: 'burn',
|
|
524
|
+
args: [tokenId],
|
|
525
|
+
}));
|
|
526
|
+
}
|
|
527
|
+
// Execute multicall
|
|
528
|
+
const txHash = await this.wallet.writeContract({
|
|
529
|
+
address: v3.nonfungiblePositionManager,
|
|
530
|
+
abi: V3NonfungiblePositionManagerABI,
|
|
531
|
+
functionName: 'multicall',
|
|
532
|
+
args: [calls],
|
|
533
|
+
chain: this.getChain(),
|
|
534
|
+
});
|
|
535
|
+
const receipt = await this.publicClient.waitForTransactionReceipt({ hash: txHash });
|
|
536
|
+
if (receipt.status === 'reverted') {
|
|
537
|
+
throw new ClawnchDeployError(ClawnchErrorCode.TX_REVERTED, `V3 removeLiquidity transaction reverted: ${txHash}`);
|
|
538
|
+
}
|
|
539
|
+
// Parse Collect event for actual amounts received
|
|
540
|
+
let amount0 = 0n;
|
|
541
|
+
let amount1 = 0n;
|
|
542
|
+
// Collect event: topic0 = Collect(uint256 indexed tokenId, address recipient, uint256 amount0, uint256 amount1)
|
|
543
|
+
const collectTopic = '0x40d0efd1a53d60ecbf40971b9daf7dc90178c3aadc7aab1765632738fa8b8f01';
|
|
544
|
+
for (const log of receipt.logs) {
|
|
545
|
+
if (log.topics[0] === collectTopic && BigInt(log.topics[1] || '0') === tokenId) {
|
|
546
|
+
if (log.data && log.data.length >= 130) {
|
|
547
|
+
// Skip recipient (first 32 bytes of data), then amount0 + amount1
|
|
548
|
+
amount0 = BigInt('0x' + log.data.slice(66, 130));
|
|
549
|
+
amount1 = BigInt('0x' + log.data.slice(130, 194));
|
|
550
|
+
}
|
|
551
|
+
}
|
|
552
|
+
}
|
|
553
|
+
return { txHash, amount0, amount1, receipt };
|
|
554
|
+
}
|
|
555
|
+
// ==========================================================================
|
|
556
|
+
// V3: Collect Fees
|
|
557
|
+
// ==========================================================================
|
|
558
|
+
/**
|
|
559
|
+
* Collect unclaimed fees from a V3 position
|
|
560
|
+
*
|
|
561
|
+
* This calls collect() with max amounts to sweep all available fees.
|
|
562
|
+
*/
|
|
563
|
+
async v3CollectFees(tokenId, params = {}) {
|
|
564
|
+
const v3 = getUniswapV3Addresses(this.network);
|
|
565
|
+
const recipient = params.recipient ?? this.getWalletAddress();
|
|
566
|
+
const txHash = await this.wallet.writeContract({
|
|
567
|
+
address: v3.nonfungiblePositionManager,
|
|
568
|
+
abi: V3NonfungiblePositionManagerABI,
|
|
569
|
+
functionName: 'collect',
|
|
570
|
+
args: [{
|
|
571
|
+
tokenId,
|
|
572
|
+
recipient,
|
|
573
|
+
amount0Max: maxUint128,
|
|
574
|
+
amount1Max: maxUint128,
|
|
575
|
+
}],
|
|
576
|
+
chain: this.getChain(),
|
|
577
|
+
});
|
|
578
|
+
const receipt = await this.publicClient.waitForTransactionReceipt({ hash: txHash });
|
|
579
|
+
if (receipt.status === 'reverted') {
|
|
580
|
+
throw new ClawnchDeployError(ClawnchErrorCode.TX_REVERTED, `V3 collect transaction reverted: ${txHash}`);
|
|
581
|
+
}
|
|
582
|
+
// Parse Collect event
|
|
583
|
+
let amount0 = 0n;
|
|
584
|
+
let amount1 = 0n;
|
|
585
|
+
const collectTopic = '0x40d0efd1a53d60ecbf40971b9daf7dc90178c3aadc7aab1765632738fa8b8f01';
|
|
586
|
+
for (const log of receipt.logs) {
|
|
587
|
+
if (log.topics[0] === collectTopic && BigInt(log.topics[1] || '0') === tokenId) {
|
|
588
|
+
if (log.data && log.data.length >= 130) {
|
|
589
|
+
amount0 = BigInt('0x' + log.data.slice(66, 130));
|
|
590
|
+
amount1 = BigInt('0x' + log.data.slice(130, 194));
|
|
591
|
+
}
|
|
592
|
+
}
|
|
593
|
+
}
|
|
594
|
+
return { txHash, amount0, amount1, receipt };
|
|
595
|
+
}
|
|
596
|
+
// ==========================================================================
|
|
597
|
+
// Convenience: Detect pool version for a token
|
|
598
|
+
// ==========================================================================
|
|
599
|
+
/**
|
|
600
|
+
* Get all V3 positions for a wallet, optionally filtered by a specific token
|
|
601
|
+
*/
|
|
602
|
+
async getPositionsForToken(tokenAddress, wallet) {
|
|
603
|
+
const allPositions = await this.v3GetPositionsForWallet(wallet);
|
|
604
|
+
const tokenLower = tokenAddress.toLowerCase();
|
|
605
|
+
return allPositions.filter(p => p.token0.toLowerCase() === tokenLower || p.token1.toLowerCase() === tokenLower);
|
|
606
|
+
}
|
|
607
|
+
}
|
|
608
|
+
//# sourceMappingURL=liquidity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"liquidity.js","sourceRoot":"","sources":["../src/liquidity.ts"],"names":[],"mappings":"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"}
|