@clawnch/clawtomaton 0.4.0 → 0.5.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 +9 -4
- package/dist/agent/index.d.ts.map +1 -1
- package/dist/agent/index.js +43 -0
- package/dist/agent/index.js.map +1 -1
- package/dist/agent/prompt.js +1 -1
- package/dist/agent/prompt.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/skills/analyze-market.d.ts.map +1 -1
- package/dist/skills/analyze-market.js +24 -1
- package/dist/skills/analyze-market.js.map +1 -1
- package/dist/skills/index.d.ts +4 -1
- package/dist/skills/index.d.ts.map +1 -1
- package/dist/skills/index.js +13 -1
- package/dist/skills/index.js.map +1 -1
- package/dist/skills/liquidity.d.ts +16 -0
- package/dist/skills/liquidity.d.ts.map +1 -0
- package/dist/skills/liquidity.js +358 -0
- package/dist/skills/liquidity.js.map +1 -0
- package/dist/skills/permit2.d.ts +14 -0
- package/dist/skills/permit2.d.ts.map +1 -0
- package/dist/skills/permit2.js +181 -0
- package/dist/skills/permit2.js.map +1 -0
- package/dist/skills/uniswap-swap.d.ts +17 -0
- package/dist/skills/uniswap-swap.d.ts.map +1 -0
- package/dist/skills/uniswap-swap.js +268 -0
- package/dist/skills/uniswap-swap.js.map +1 -0
- package/dist/skills/xmtp.d.ts +15 -9
- package/dist/skills/xmtp.d.ts.map +1 -1
- package/dist/skills/xmtp.js +116 -14
- package/dist/skills/xmtp.js.map +1 -1
- package/dist/xmtp/client.d.ts +48 -0
- package/dist/xmtp/client.d.ts.map +1 -1
- package/dist/xmtp/client.js +175 -3
- package/dist/xmtp/client.js.map +1 -1
- package/dist/xmtp/index.d.ts +1 -1
- package/dist/xmtp/index.d.ts.map +1 -1
- package/dist/xmtp/types.d.ts +22 -1
- package/dist/xmtp/types.d.ts.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,358 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skill: liquidity — Uniswap V4/V3 liquidity management.
|
|
3
|
+
*
|
|
4
|
+
* Actions:
|
|
5
|
+
* - positions: List all V3 positions for the agent's wallet
|
|
6
|
+
* - v4_position: Read a specific V4 position by token ID
|
|
7
|
+
* - v4_pool: Read V4 pool state (price, liquidity, tick)
|
|
8
|
+
* - v3_mint: Mint a new V3 liquidity position
|
|
9
|
+
* - v4_mint: Mint a new V4 liquidity position (uses @uniswap/v4-sdk)
|
|
10
|
+
* - v3_add: Add liquidity to an existing V3 position
|
|
11
|
+
* - v3_remove: Remove liquidity from a V3 position
|
|
12
|
+
* - v3_collect: Collect fees from a V3 position
|
|
13
|
+
*/
|
|
14
|
+
import { ClawnchLiquidity } from '@clawnch/clawncher-sdk';
|
|
15
|
+
export const liquiditySkill = {
|
|
16
|
+
name: 'liquidity',
|
|
17
|
+
description: 'Manage Uniswap V4/V3 liquidity positions. ' +
|
|
18
|
+
'List positions, read pool state, mint/add/remove liquidity, collect fees.',
|
|
19
|
+
parameters: [
|
|
20
|
+
{
|
|
21
|
+
name: 'action',
|
|
22
|
+
type: 'string',
|
|
23
|
+
description: 'Action: "positions", "v4_position", "v4_pool", "v3_mint", "v4_mint", ' +
|
|
24
|
+
'"v3_add", "v3_remove", "v3_collect".',
|
|
25
|
+
required: true,
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
name: 'tokenId',
|
|
29
|
+
type: 'string',
|
|
30
|
+
description: 'Position NFT token ID (for v4_position, v3_add, v3_remove, v3_collect).',
|
|
31
|
+
required: false,
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
name: 'token0',
|
|
35
|
+
type: 'address',
|
|
36
|
+
description: 'Token 0 address (for mint operations and v4_pool). Must be lower address.',
|
|
37
|
+
required: false,
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
name: 'token1',
|
|
41
|
+
type: 'address',
|
|
42
|
+
description: 'Token 1 address (for mint operations and v4_pool). Must be higher address.',
|
|
43
|
+
required: false,
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
name: 'fee',
|
|
47
|
+
type: 'number',
|
|
48
|
+
description: 'Fee tier in hundredths of bps (e.g. 3000 = 0.3%). Default: 3000.',
|
|
49
|
+
required: false,
|
|
50
|
+
default: 3000,
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
name: 'tickSpacing',
|
|
54
|
+
type: 'number',
|
|
55
|
+
description: 'Tick spacing for V4 pool. Default: 60.',
|
|
56
|
+
required: false,
|
|
57
|
+
default: 60,
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
name: 'hookAddress',
|
|
61
|
+
type: 'address',
|
|
62
|
+
description: 'V4 hook contract address. Default: zero address (no hook).',
|
|
63
|
+
required: false,
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
name: 'tickLower',
|
|
67
|
+
type: 'number',
|
|
68
|
+
description: 'Lower tick boundary for new positions.',
|
|
69
|
+
required: false,
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
name: 'tickUpper',
|
|
73
|
+
type: 'number',
|
|
74
|
+
description: 'Upper tick boundary for new positions.',
|
|
75
|
+
required: false,
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
name: 'amount0',
|
|
79
|
+
type: 'string',
|
|
80
|
+
description: 'Amount of token0 in human-readable units.',
|
|
81
|
+
required: false,
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
name: 'amount1',
|
|
85
|
+
type: 'string',
|
|
86
|
+
description: 'Amount of token1 in human-readable units.',
|
|
87
|
+
required: false,
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
name: 'percentage',
|
|
91
|
+
type: 'number',
|
|
92
|
+
description: 'Percentage of liquidity to remove (0-100). For v3_remove.',
|
|
93
|
+
required: false,
|
|
94
|
+
default: 100,
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
name: 'slippageBps',
|
|
98
|
+
type: 'number',
|
|
99
|
+
description: 'Slippage tolerance in basis points. Default: 50 (0.5%).',
|
|
100
|
+
required: false,
|
|
101
|
+
default: 50,
|
|
102
|
+
},
|
|
103
|
+
],
|
|
104
|
+
execute: async (params, ctx) => {
|
|
105
|
+
const action = params.action.toLowerCase();
|
|
106
|
+
try {
|
|
107
|
+
const { buildClients } = await import('../identity/index.js');
|
|
108
|
+
const rpcUrl = process.env.BASE_RPC_URL ?? 'https://mainnet.base.org';
|
|
109
|
+
const { publicClient, walletClient } = buildClients(ctx.identity, rpcUrl);
|
|
110
|
+
const liquidity = new ClawnchLiquidity({
|
|
111
|
+
wallet: walletClient,
|
|
112
|
+
publicClient: publicClient,
|
|
113
|
+
network: 'mainnet',
|
|
114
|
+
});
|
|
115
|
+
// ====================================================================
|
|
116
|
+
// Read operations
|
|
117
|
+
// ====================================================================
|
|
118
|
+
if (action === 'positions') {
|
|
119
|
+
const positions = await liquidity.v3GetPositionsForWallet();
|
|
120
|
+
if (positions.length === 0) {
|
|
121
|
+
return { callId: '', success: true, result: 'No V3 liquidity positions found.' };
|
|
122
|
+
}
|
|
123
|
+
const lines = positions.map((p, i) => {
|
|
124
|
+
const hasLiquidity = p.liquidity > 0n;
|
|
125
|
+
return [
|
|
126
|
+
`#${i + 1} — TokenID: ${p.tokenId} (${p.version})`,
|
|
127
|
+
` Pair: ${p.token0} / ${p.token1}`,
|
|
128
|
+
` Fee: ${p.fee / 10000}% | Ticks: ${p.tickLower} → ${p.tickUpper}`,
|
|
129
|
+
` Liquidity: ${hasLiquidity ? p.liquidity.toString() : '0 (closed)'}`,
|
|
130
|
+
` Unclaimed fees: ${p.unclaimedFees.token0.toString()} / ${p.unclaimedFees.token1.toString()}`,
|
|
131
|
+
].join('\n');
|
|
132
|
+
});
|
|
133
|
+
return {
|
|
134
|
+
callId: '',
|
|
135
|
+
success: true,
|
|
136
|
+
result: `Found ${positions.length} V3 position(s):\n\n${lines.join('\n\n')}`,
|
|
137
|
+
metadata: { count: positions.length },
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
if (action === 'v4_position') {
|
|
141
|
+
if (!params.tokenId) {
|
|
142
|
+
return { callId: '', success: false, result: null, error: 'tokenId is required for v4_position' };
|
|
143
|
+
}
|
|
144
|
+
const tokenId = BigInt(params.tokenId);
|
|
145
|
+
const pos = await liquidity.v4GetPosition(tokenId);
|
|
146
|
+
const lines = [
|
|
147
|
+
`V4 Position #${pos.tokenId}`,
|
|
148
|
+
`Pair: ${pos.token0} / ${pos.token1}`,
|
|
149
|
+
`Fee: ${pos.fee / 10000}% | Ticks: ${pos.tickLower} → ${pos.tickUpper}`,
|
|
150
|
+
`Liquidity: ${pos.liquidity.toString()}`,
|
|
151
|
+
`Unclaimed fees: ${pos.unclaimedFees.token0.toString()} / ${pos.unclaimedFees.token1.toString()}`,
|
|
152
|
+
];
|
|
153
|
+
return { callId: '', success: true, result: lines.join('\n') };
|
|
154
|
+
}
|
|
155
|
+
if (action === 'v4_pool') {
|
|
156
|
+
if (!params.token0 || !params.token1) {
|
|
157
|
+
return { callId: '', success: false, result: null, error: 'token0 and token1 required for v4_pool' };
|
|
158
|
+
}
|
|
159
|
+
const poolKey = {
|
|
160
|
+
currency0: params.token0,
|
|
161
|
+
currency1: params.token1,
|
|
162
|
+
fee: params.fee ?? 3000,
|
|
163
|
+
tickSpacing: params.tickSpacing ?? 60,
|
|
164
|
+
hooks: params.hookAddress ?? '0x0000000000000000000000000000000000000000',
|
|
165
|
+
};
|
|
166
|
+
const state = await liquidity.v4GetPoolState(poolKey);
|
|
167
|
+
// Convert sqrtPriceX96 to price
|
|
168
|
+
const sqrtPrice = Number(state.sqrtPriceX96) / Number(2n ** 96n);
|
|
169
|
+
const price = sqrtPrice * sqrtPrice;
|
|
170
|
+
const lines = [
|
|
171
|
+
`V4 Pool State:`,
|
|
172
|
+
`Pool ID: ${state.poolId}`,
|
|
173
|
+
`sqrtPriceX96: ${state.sqrtPriceX96.toString()}`,
|
|
174
|
+
`Price (token1/token0): ${price.toExponential(6)}`,
|
|
175
|
+
`Tick: ${state.tick}`,
|
|
176
|
+
`Liquidity: ${state.liquidity.toString()}`,
|
|
177
|
+
];
|
|
178
|
+
return {
|
|
179
|
+
callId: '',
|
|
180
|
+
success: true,
|
|
181
|
+
result: lines.join('\n'),
|
|
182
|
+
metadata: {
|
|
183
|
+
poolId: state.poolId,
|
|
184
|
+
tick: state.tick,
|
|
185
|
+
liquidity: state.liquidity.toString(),
|
|
186
|
+
price,
|
|
187
|
+
},
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
// ====================================================================
|
|
191
|
+
// V3 Write operations
|
|
192
|
+
// ====================================================================
|
|
193
|
+
if (action === 'v3_mint') {
|
|
194
|
+
if (!params.token0 || !params.token1 || !params.tickLower || !params.tickUpper || !params.amount0 || !params.amount1) {
|
|
195
|
+
return {
|
|
196
|
+
callId: '',
|
|
197
|
+
success: false,
|
|
198
|
+
result: null,
|
|
199
|
+
error: 'v3_mint requires: token0, token1, tickLower, tickUpper, amount0, amount1',
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
const amount0 = BigInt(Math.floor(parseFloat(params.amount0) * 1e18));
|
|
203
|
+
const amount1 = BigInt(Math.floor(parseFloat(params.amount1) * 1e18));
|
|
204
|
+
const result = await liquidity.v3MintPosition({
|
|
205
|
+
token0: params.token0,
|
|
206
|
+
token1: params.token1,
|
|
207
|
+
fee: params.fee ?? 3000,
|
|
208
|
+
tickLower: params.tickLower,
|
|
209
|
+
tickUpper: params.tickUpper,
|
|
210
|
+
amount0Desired: amount0,
|
|
211
|
+
amount1Desired: amount1,
|
|
212
|
+
deadline: 1200,
|
|
213
|
+
});
|
|
214
|
+
const lines = [
|
|
215
|
+
`V3 mint complete!`,
|
|
216
|
+
`Token ID: ${result.tokenId}`,
|
|
217
|
+
`Liquidity: ${result.liquidity.toString()}`,
|
|
218
|
+
`Amount0: ${result.amount0.toString()}`,
|
|
219
|
+
`Amount1: ${result.amount1.toString()}`,
|
|
220
|
+
`TX: ${result.txHash}`,
|
|
221
|
+
];
|
|
222
|
+
return {
|
|
223
|
+
callId: '',
|
|
224
|
+
success: true,
|
|
225
|
+
result: lines.join('\n'),
|
|
226
|
+
metadata: { txHash: result.txHash, tokenId: result.tokenId.toString() },
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
if (action === 'v4_mint') {
|
|
230
|
+
if (!params.token0 || !params.token1 || !params.tickLower || !params.tickUpper || !params.amount0 || !params.amount1) {
|
|
231
|
+
return {
|
|
232
|
+
callId: '',
|
|
233
|
+
success: false,
|
|
234
|
+
result: null,
|
|
235
|
+
error: 'v4_mint requires: token0, token1, tickLower, tickUpper, amount0, amount1',
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
const amount0 = BigInt(Math.floor(parseFloat(params.amount0) * 1e18));
|
|
239
|
+
const amount1 = BigInt(Math.floor(parseFloat(params.amount1) * 1e18));
|
|
240
|
+
const result = await liquidity.v4MintPosition({
|
|
241
|
+
token0: params.token0,
|
|
242
|
+
token1: params.token1,
|
|
243
|
+
fee: params.fee ?? 3000,
|
|
244
|
+
tickSpacing: params.tickSpacing ?? 60,
|
|
245
|
+
hookAddress: params.hookAddress ?? undefined,
|
|
246
|
+
tickLower: params.tickLower,
|
|
247
|
+
tickUpper: params.tickUpper,
|
|
248
|
+
amount0Desired: amount0,
|
|
249
|
+
amount1Desired: amount1,
|
|
250
|
+
slippageBps: params.slippageBps ?? 50,
|
|
251
|
+
deadline: 1200,
|
|
252
|
+
});
|
|
253
|
+
const lines = [
|
|
254
|
+
`V4 mint complete!`,
|
|
255
|
+
`Token ID: ${result.tokenId}`,
|
|
256
|
+
`Liquidity: ${result.liquidity.toString()}`,
|
|
257
|
+
`Amount0: ${result.amount0.toString()}`,
|
|
258
|
+
`Amount1: ${result.amount1.toString()}`,
|
|
259
|
+
`TX: ${result.txHash}`,
|
|
260
|
+
];
|
|
261
|
+
return {
|
|
262
|
+
callId: '',
|
|
263
|
+
success: true,
|
|
264
|
+
result: lines.join('\n'),
|
|
265
|
+
metadata: { txHash: result.txHash, tokenId: result.tokenId.toString() },
|
|
266
|
+
};
|
|
267
|
+
}
|
|
268
|
+
if (action === 'v3_add') {
|
|
269
|
+
if (!params.tokenId || !params.amount0 || !params.amount1) {
|
|
270
|
+
return {
|
|
271
|
+
callId: '',
|
|
272
|
+
success: false,
|
|
273
|
+
result: null,
|
|
274
|
+
error: 'v3_add requires: tokenId, amount0, amount1',
|
|
275
|
+
};
|
|
276
|
+
}
|
|
277
|
+
const tokenId = BigInt(params.tokenId);
|
|
278
|
+
const amount0 = BigInt(Math.floor(parseFloat(params.amount0) * 1e18));
|
|
279
|
+
const amount1 = BigInt(Math.floor(parseFloat(params.amount1) * 1e18));
|
|
280
|
+
const result = await liquidity.v3AddLiquidity(tokenId, {
|
|
281
|
+
amount0Desired: amount0,
|
|
282
|
+
amount1Desired: amount1,
|
|
283
|
+
deadline: 1200,
|
|
284
|
+
});
|
|
285
|
+
const lines = [
|
|
286
|
+
`V3 add liquidity complete!`,
|
|
287
|
+
`Amount0 deposited: ${result.amount0.toString()}`,
|
|
288
|
+
`Amount1 deposited: ${result.amount1.toString()}`,
|
|
289
|
+
`TX: ${result.txHash}`,
|
|
290
|
+
];
|
|
291
|
+
return {
|
|
292
|
+
callId: '',
|
|
293
|
+
success: true,
|
|
294
|
+
result: lines.join('\n'),
|
|
295
|
+
metadata: { txHash: result.txHash },
|
|
296
|
+
};
|
|
297
|
+
}
|
|
298
|
+
if (action === 'v3_remove') {
|
|
299
|
+
if (!params.tokenId) {
|
|
300
|
+
return { callId: '', success: false, result: null, error: 'v3_remove requires: tokenId' };
|
|
301
|
+
}
|
|
302
|
+
const tokenId = BigInt(params.tokenId);
|
|
303
|
+
const pct = (params.percentage ?? 100) / 100;
|
|
304
|
+
const result = await liquidity.v3RemoveLiquidity(tokenId, {
|
|
305
|
+
percentageToRemove: pct,
|
|
306
|
+
burnToken: pct === 1,
|
|
307
|
+
deadline: 1200,
|
|
308
|
+
});
|
|
309
|
+
const lines = [
|
|
310
|
+
`V3 remove liquidity complete!`,
|
|
311
|
+
`Amount0 received: ${result.amount0.toString()}`,
|
|
312
|
+
`Amount1 received: ${result.amount1.toString()}`,
|
|
313
|
+
`TX: ${result.txHash}`,
|
|
314
|
+
];
|
|
315
|
+
return {
|
|
316
|
+
callId: '',
|
|
317
|
+
success: true,
|
|
318
|
+
result: lines.join('\n'),
|
|
319
|
+
metadata: { txHash: result.txHash },
|
|
320
|
+
};
|
|
321
|
+
}
|
|
322
|
+
if (action === 'v3_collect') {
|
|
323
|
+
if (!params.tokenId) {
|
|
324
|
+
return { callId: '', success: false, result: null, error: 'v3_collect requires: tokenId' };
|
|
325
|
+
}
|
|
326
|
+
const tokenId = BigInt(params.tokenId);
|
|
327
|
+
const result = await liquidity.v3CollectFees(tokenId);
|
|
328
|
+
const lines = [
|
|
329
|
+
`V3 fee collection complete!`,
|
|
330
|
+
`Token0 fees: ${result.amount0.toString()}`,
|
|
331
|
+
`Token1 fees: ${result.amount1.toString()}`,
|
|
332
|
+
`TX: ${result.txHash}`,
|
|
333
|
+
];
|
|
334
|
+
return {
|
|
335
|
+
callId: '',
|
|
336
|
+
success: true,
|
|
337
|
+
result: lines.join('\n'),
|
|
338
|
+
metadata: { txHash: result.txHash },
|
|
339
|
+
};
|
|
340
|
+
}
|
|
341
|
+
return {
|
|
342
|
+
callId: '',
|
|
343
|
+
success: false,
|
|
344
|
+
result: null,
|
|
345
|
+
error: `Unknown action "${action}". Use: positions, v4_position, v4_pool, v3_mint, v4_mint, v3_add, v3_remove, v3_collect.`,
|
|
346
|
+
};
|
|
347
|
+
}
|
|
348
|
+
catch (err) {
|
|
349
|
+
return {
|
|
350
|
+
callId: '',
|
|
351
|
+
success: false,
|
|
352
|
+
result: null,
|
|
353
|
+
error: err instanceof Error ? err.message : String(err),
|
|
354
|
+
};
|
|
355
|
+
}
|
|
356
|
+
},
|
|
357
|
+
};
|
|
358
|
+
//# sourceMappingURL=liquidity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"liquidity.js","sourceRoot":"","sources":["../../src/skills/liquidity.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skill: permit2 — Manage Permit2 token approvals and allowances.
|
|
3
|
+
*
|
|
4
|
+
* Actions:
|
|
5
|
+
* - status: Check ERC20→Permit2 and Permit2→spender allowance state
|
|
6
|
+
* - approve: Full Permit2 approval flow (ERC20→Permit2, then Permit2→spender)
|
|
7
|
+
* - revoke: Emergency lockdown — revoke all Permit2 allowances for a token/spender
|
|
8
|
+
*
|
|
9
|
+
* This skill gives the agent fine-grained control over token permissions,
|
|
10
|
+
* useful for security hygiene and pre-approval before swaps/LP operations.
|
|
11
|
+
*/
|
|
12
|
+
import type { SkillDefinition } from '../types.js';
|
|
13
|
+
export declare const permit2Skill: SkillDefinition;
|
|
14
|
+
//# sourceMappingURL=permit2.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permit2.d.ts","sourceRoot":"","sources":["../../src/skills/permit2.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAKH,OAAO,KAAK,EAAE,eAAe,EAA4B,MAAM,aAAa,CAAC;AAW7E,eAAO,MAAM,YAAY,EAAE,eA4K1B,CAAC"}
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skill: permit2 — Manage Permit2 token approvals and allowances.
|
|
3
|
+
*
|
|
4
|
+
* Actions:
|
|
5
|
+
* - status: Check ERC20→Permit2 and Permit2→spender allowance state
|
|
6
|
+
* - approve: Full Permit2 approval flow (ERC20→Permit2, then Permit2→spender)
|
|
7
|
+
* - revoke: Emergency lockdown — revoke all Permit2 allowances for a token/spender
|
|
8
|
+
*
|
|
9
|
+
* This skill gives the agent fine-grained control over token permissions,
|
|
10
|
+
* useful for security hygiene and pre-approval before swaps/LP operations.
|
|
11
|
+
*/
|
|
12
|
+
import { Permit2Client, PERMIT2_ADDRESS } from '@clawnch/clawncher-sdk';
|
|
13
|
+
import { getUniswapV4Addresses } from '@clawnch/clawncher-sdk';
|
|
14
|
+
import { erc20Abi } from 'viem';
|
|
15
|
+
/** Known spender labels for readable output */
|
|
16
|
+
const KNOWN_SPENDERS = {
|
|
17
|
+
// Base mainnet V4 addresses — filled at runtime from SDK
|
|
18
|
+
};
|
|
19
|
+
function spenderLabel(address) {
|
|
20
|
+
return KNOWN_SPENDERS[address.toLowerCase()] ?? address.slice(0, 10) + '...';
|
|
21
|
+
}
|
|
22
|
+
export const permit2Skill = {
|
|
23
|
+
name: 'permit2',
|
|
24
|
+
description: 'Manage Permit2 token approvals. Actions: "status" (check allowance state for a token), ' +
|
|
25
|
+
'"approve" (ensure full Permit2 approval for a token→spender), ' +
|
|
26
|
+
'"revoke" (emergency lockdown — revoke Permit2 allowance for token/spender).',
|
|
27
|
+
parameters: [
|
|
28
|
+
{
|
|
29
|
+
name: 'action',
|
|
30
|
+
type: 'string',
|
|
31
|
+
description: 'One of: status, approve, revoke',
|
|
32
|
+
required: true,
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
name: 'token',
|
|
36
|
+
type: 'address',
|
|
37
|
+
description: 'Token contract address',
|
|
38
|
+
required: true,
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
name: 'spender',
|
|
42
|
+
type: 'address',
|
|
43
|
+
description: 'Spender address (e.g. UniversalRouter, PositionManager). ' +
|
|
44
|
+
'Defaults to V4 PositionManager if omitted.',
|
|
45
|
+
required: false,
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
name: 'amount',
|
|
49
|
+
type: 'string',
|
|
50
|
+
description: 'Amount for approve action (raw units). Defaults to max.',
|
|
51
|
+
required: false,
|
|
52
|
+
},
|
|
53
|
+
],
|
|
54
|
+
execute: async (params, ctx) => {
|
|
55
|
+
const action = params.action?.toLowerCase();
|
|
56
|
+
const token = params.token;
|
|
57
|
+
if (!action || !token) {
|
|
58
|
+
return {
|
|
59
|
+
callId: '',
|
|
60
|
+
success: false,
|
|
61
|
+
result: null,
|
|
62
|
+
error: 'Missing required params: action, token',
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
try {
|
|
66
|
+
const { buildClients } = await import('../identity/index.js');
|
|
67
|
+
const rpcUrl = process.env.BASE_RPC_URL ?? 'https://mainnet.base.org';
|
|
68
|
+
const { publicClient, walletClient } = buildClients(ctx.identity, rpcUrl);
|
|
69
|
+
const v4 = getUniswapV4Addresses('mainnet');
|
|
70
|
+
const spender = params.spender ?? v4.positionManager;
|
|
71
|
+
// Populate known spenders
|
|
72
|
+
KNOWN_SPENDERS[v4.positionManager.toLowerCase()] = 'V4 PositionManager';
|
|
73
|
+
KNOWN_SPENDERS[PERMIT2_ADDRESS.toLowerCase()] = 'Permit2';
|
|
74
|
+
const permit2 = new Permit2Client({
|
|
75
|
+
wallet: walletClient,
|
|
76
|
+
publicClient: publicClient,
|
|
77
|
+
chainId: 8453,
|
|
78
|
+
});
|
|
79
|
+
switch (action) {
|
|
80
|
+
// ── STATUS ──────────────────────────────────────────────
|
|
81
|
+
case 'status': {
|
|
82
|
+
// 1. ERC20 allowance to Permit2
|
|
83
|
+
const erc20Allowance = await publicClient.readContract({
|
|
84
|
+
address: token,
|
|
85
|
+
abi: erc20Abi,
|
|
86
|
+
functionName: 'allowance',
|
|
87
|
+
args: [ctx.identity.address, PERMIT2_ADDRESS],
|
|
88
|
+
});
|
|
89
|
+
// 2. Permit2 internal allowance to spender
|
|
90
|
+
const permit2Allowance = await permit2.getAllowance(token, spender);
|
|
91
|
+
const now = Math.floor(Date.now() / 1000);
|
|
92
|
+
const expired = permit2Allowance.expiration <= now;
|
|
93
|
+
// 3. Token symbol for display
|
|
94
|
+
let symbol = 'TOKEN';
|
|
95
|
+
try {
|
|
96
|
+
symbol = await publicClient.readContract({
|
|
97
|
+
address: token,
|
|
98
|
+
abi: erc20Abi,
|
|
99
|
+
functionName: 'symbol',
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
catch { /* ignore */ }
|
|
103
|
+
const lines = [
|
|
104
|
+
`Permit2 Status for ${symbol} (${token.slice(0, 10)}...)`,
|
|
105
|
+
` Spender: ${spenderLabel(spender)} (${spender.slice(0, 10)}...)`,
|
|
106
|
+
``,
|
|
107
|
+
` ERC20 → Permit2: ${erc20Allowance > 0n ? 'APPROVED' : 'NOT APPROVED'} (${erc20Allowance > 10n ** 36n ? 'max' : erc20Allowance.toString()})`,
|
|
108
|
+
` Permit2 → Spender: ${permit2Allowance.amount > 0n && !expired ? 'ACTIVE' : expired ? 'EXPIRED' : 'NONE'}`,
|
|
109
|
+
` Amount: ${permit2Allowance.amount > 10n ** 36n ? 'max' : permit2Allowance.amount.toString()}`,
|
|
110
|
+
` Expiration: ${expired ? 'EXPIRED' : new Date(permit2Allowance.expiration * 1000).toISOString()}`,
|
|
111
|
+
` Nonce: ${permit2Allowance.nonce}`,
|
|
112
|
+
];
|
|
113
|
+
return {
|
|
114
|
+
callId: '',
|
|
115
|
+
success: true,
|
|
116
|
+
result: lines.join('\n'),
|
|
117
|
+
metadata: {
|
|
118
|
+
erc20Approved: erc20Allowance > 0n,
|
|
119
|
+
permit2Active: permit2Allowance.amount > 0n && !expired,
|
|
120
|
+
expired,
|
|
121
|
+
nonce: permit2Allowance.nonce,
|
|
122
|
+
},
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
// ── APPROVE ────────────────────────────────────────────
|
|
126
|
+
case 'approve': {
|
|
127
|
+
const amount = params.amount ? BigInt(params.amount) : 10n ** 36n;
|
|
128
|
+
const result = await permit2.ensurePermit2Allowance(token, spender, amount);
|
|
129
|
+
const parts = [];
|
|
130
|
+
if (result.approvalTxHash) {
|
|
131
|
+
parts.push(`ERC20→Permit2 approval tx: ${result.approvalTxHash}`);
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
parts.push('ERC20→Permit2: already approved');
|
|
135
|
+
}
|
|
136
|
+
if (result.permitTxHash) {
|
|
137
|
+
parts.push(`Permit2→${spenderLabel(spender)} approval tx: ${result.permitTxHash}`);
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
parts.push(`Permit2→${spenderLabel(spender)}: already sufficient`);
|
|
141
|
+
}
|
|
142
|
+
return {
|
|
143
|
+
callId: '',
|
|
144
|
+
success: true,
|
|
145
|
+
result: parts.join('\n'),
|
|
146
|
+
metadata: {
|
|
147
|
+
approvalTxHash: result.approvalTxHash,
|
|
148
|
+
permitTxHash: result.permitTxHash,
|
|
149
|
+
},
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
// ── REVOKE ─────────────────────────────────────────────
|
|
153
|
+
case 'revoke': {
|
|
154
|
+
const txHash = await permit2.lockdown([{ token, spender }]);
|
|
155
|
+
return {
|
|
156
|
+
callId: '',
|
|
157
|
+
success: true,
|
|
158
|
+
result: `Permit2 lockdown executed for ${token.slice(0, 10)}... → ${spenderLabel(spender)}\nTx: ${txHash}`,
|
|
159
|
+
metadata: { txHash },
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
default:
|
|
163
|
+
return {
|
|
164
|
+
callId: '',
|
|
165
|
+
success: false,
|
|
166
|
+
result: null,
|
|
167
|
+
error: `Unknown action: ${action}. Use: status, approve, revoke`,
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
catch (err) {
|
|
172
|
+
return {
|
|
173
|
+
callId: '',
|
|
174
|
+
success: false,
|
|
175
|
+
result: null,
|
|
176
|
+
error: `Permit2 ${action} failed: ${err.message ?? err}`,
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
},
|
|
180
|
+
};
|
|
181
|
+
//# sourceMappingURL=permit2.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permit2.js","sourceRoot":"","sources":["../../src/skills/permit2.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skill: uniswap_swap — Direct Uniswap V4 swap via Trading API + on-chain quoter fallback.
|
|
3
|
+
*
|
|
4
|
+
* Two swap paths:
|
|
5
|
+
* 1. Uniswap Trading API (if UNISWAP_API_KEY is set) — hosted aggregation, best prices
|
|
6
|
+
* 2. On-chain V4 Quoter simulation — works without API key, direct V4 pool
|
|
7
|
+
*
|
|
8
|
+
* Supports all 15 Uniswap chains, but defaults to Base (8453).
|
|
9
|
+
*
|
|
10
|
+
* Actions:
|
|
11
|
+
* - swap: Execute a swap via Trading API
|
|
12
|
+
* - quote: Get a quote (price + impact) without executing
|
|
13
|
+
* - deeplink: Generate a Uniswap app deep link for the swap
|
|
14
|
+
*/
|
|
15
|
+
import type { SkillDefinition } from '../types.js';
|
|
16
|
+
export declare const uniswapSwapSkill: SkillDefinition;
|
|
17
|
+
//# sourceMappingURL=uniswap-swap.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uniswap-swap.d.ts","sourceRoot":"","sources":["../../src/skills/uniswap-swap.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAUH,OAAO,KAAK,EAAE,eAAe,EAA4B,MAAM,aAAa,CAAC;AAE7E,eAAO,MAAM,gBAAgB,EAAE,eAqR9B,CAAC"}
|