@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.
Files changed (98) hide show
  1. package/README.md +603 -0
  2. package/dist/abis.d.ts +935 -0
  3. package/dist/abis.d.ts.map +1 -0
  4. package/dist/abis.js +486 -0
  5. package/dist/abis.js.map +1 -0
  6. package/dist/addresses.d.ts +51 -0
  7. package/dist/addresses.d.ts.map +1 -0
  8. package/dist/addresses.js +80 -0
  9. package/dist/addresses.js.map +1 -0
  10. package/dist/api-deployer-types.d.ts +165 -0
  11. package/dist/api-deployer-types.d.ts.map +1 -0
  12. package/dist/api-deployer-types.js +9 -0
  13. package/dist/api-deployer-types.js.map +1 -0
  14. package/dist/api-deployer.d.ts +114 -0
  15. package/dist/api-deployer.d.ts.map +1 -0
  16. package/dist/api-deployer.js +309 -0
  17. package/dist/api-deployer.js.map +1 -0
  18. package/dist/claimer.d.ts +197 -0
  19. package/dist/claimer.d.ts.map +1 -0
  20. package/dist/claimer.js +311 -0
  21. package/dist/claimer.js.map +1 -0
  22. package/dist/deployer.d.ts +229 -0
  23. package/dist/deployer.d.ts.map +1 -0
  24. package/dist/deployer.js +305 -0
  25. package/dist/deployer.js.map +1 -0
  26. package/dist/erc8004-types.d.ts +94 -0
  27. package/dist/erc8004-types.d.ts.map +1 -0
  28. package/dist/erc8004-types.js +8 -0
  29. package/dist/erc8004-types.js.map +1 -0
  30. package/dist/errors.d.ts +62 -0
  31. package/dist/errors.d.ts.map +1 -0
  32. package/dist/errors.js +75 -0
  33. package/dist/errors.js.map +1 -0
  34. package/dist/index.d.ts +204 -0
  35. package/dist/index.d.ts.map +1 -0
  36. package/dist/index.js +358 -0
  37. package/dist/index.js.map +1 -0
  38. package/dist/liquidity-types.d.ts +198 -0
  39. package/dist/liquidity-types.d.ts.map +1 -0
  40. package/dist/liquidity-types.js +8 -0
  41. package/dist/liquidity-types.js.map +1 -0
  42. package/dist/liquidity.d.ts +111 -0
  43. package/dist/liquidity.d.ts.map +1 -0
  44. package/dist/liquidity.js +608 -0
  45. package/dist/liquidity.js.map +1 -0
  46. package/dist/molten-types.d.ts +282 -0
  47. package/dist/molten-types.d.ts.map +1 -0
  48. package/dist/molten-types.js +8 -0
  49. package/dist/molten-types.js.map +1 -0
  50. package/dist/molten.d.ts +336 -0
  51. package/dist/molten.d.ts.map +1 -0
  52. package/dist/molten.js +560 -0
  53. package/dist/molten.js.map +1 -0
  54. package/dist/portfolio.d.ts +129 -0
  55. package/dist/portfolio.d.ts.map +1 -0
  56. package/dist/portfolio.js +218 -0
  57. package/dist/portfolio.js.map +1 -0
  58. package/dist/reader.d.ts +249 -0
  59. package/dist/reader.d.ts.map +1 -0
  60. package/dist/reader.js +488 -0
  61. package/dist/reader.js.map +1 -0
  62. package/dist/swap-types.d.ts +159 -0
  63. package/dist/swap-types.d.ts.map +1 -0
  64. package/dist/swap-types.js +22 -0
  65. package/dist/swap-types.js.map +1 -0
  66. package/dist/swap.d.ts +762 -0
  67. package/dist/swap.d.ts.map +1 -0
  68. package/dist/swap.js +345 -0
  69. package/dist/swap.js.map +1 -0
  70. package/dist/token-verification-data.d.ts +4 -0
  71. package/dist/token-verification-data.d.ts.map +1 -0
  72. package/dist/token-verification-data.js +6 -0
  73. package/dist/token-verification-data.js.map +1 -0
  74. package/dist/types.d.ts +244 -0
  75. package/dist/types.d.ts.map +1 -0
  76. package/dist/types.js +5 -0
  77. package/dist/types.js.map +1 -0
  78. package/dist/uniswap-abis.d.ts +470 -0
  79. package/dist/uniswap-abis.d.ts.map +1 -0
  80. package/dist/uniswap-abis.js +322 -0
  81. package/dist/uniswap-abis.js.map +1 -0
  82. package/dist/uniswap-addresses.d.ts +38 -0
  83. package/dist/uniswap-addresses.d.ts.map +1 -0
  84. package/dist/uniswap-addresses.js +67 -0
  85. package/dist/uniswap-addresses.js.map +1 -0
  86. package/dist/vanity.d.ts +115 -0
  87. package/dist/vanity.d.ts.map +1 -0
  88. package/dist/vanity.js +166 -0
  89. package/dist/vanity.js.map +1 -0
  90. package/dist/verify.d.ts +88 -0
  91. package/dist/verify.d.ts.map +1 -0
  92. package/dist/verify.js +181 -0
  93. package/dist/verify.js.map +1 -0
  94. package/dist/watcher.d.ts +112 -0
  95. package/dist/watcher.d.ts.map +1 -0
  96. package/dist/watcher.js +132 -0
  97. package/dist/watcher.js.map +1 -0
  98. 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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"}