@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.
Files changed (40) hide show
  1. package/README.md +9 -4
  2. package/dist/agent/index.d.ts.map +1 -1
  3. package/dist/agent/index.js +43 -0
  4. package/dist/agent/index.js.map +1 -1
  5. package/dist/agent/prompt.js +1 -1
  6. package/dist/agent/prompt.js.map +1 -1
  7. package/dist/index.d.ts +1 -1
  8. package/dist/index.d.ts.map +1 -1
  9. package/dist/skills/analyze-market.d.ts.map +1 -1
  10. package/dist/skills/analyze-market.js +24 -1
  11. package/dist/skills/analyze-market.js.map +1 -1
  12. package/dist/skills/index.d.ts +4 -1
  13. package/dist/skills/index.d.ts.map +1 -1
  14. package/dist/skills/index.js +13 -1
  15. package/dist/skills/index.js.map +1 -1
  16. package/dist/skills/liquidity.d.ts +16 -0
  17. package/dist/skills/liquidity.d.ts.map +1 -0
  18. package/dist/skills/liquidity.js +358 -0
  19. package/dist/skills/liquidity.js.map +1 -0
  20. package/dist/skills/permit2.d.ts +14 -0
  21. package/dist/skills/permit2.d.ts.map +1 -0
  22. package/dist/skills/permit2.js +181 -0
  23. package/dist/skills/permit2.js.map +1 -0
  24. package/dist/skills/uniswap-swap.d.ts +17 -0
  25. package/dist/skills/uniswap-swap.d.ts.map +1 -0
  26. package/dist/skills/uniswap-swap.js +268 -0
  27. package/dist/skills/uniswap-swap.js.map +1 -0
  28. package/dist/skills/xmtp.d.ts +15 -9
  29. package/dist/skills/xmtp.d.ts.map +1 -1
  30. package/dist/skills/xmtp.js +116 -14
  31. package/dist/skills/xmtp.js.map +1 -1
  32. package/dist/xmtp/client.d.ts +48 -0
  33. package/dist/xmtp/client.d.ts.map +1 -1
  34. package/dist/xmtp/client.js +175 -3
  35. package/dist/xmtp/client.js.map +1 -1
  36. package/dist/xmtp/index.d.ts +1 -1
  37. package/dist/xmtp/index.d.ts.map +1 -1
  38. package/dist/xmtp/types.d.ts +22 -1
  39. package/dist/xmtp/types.d.ts.map +1 -1
  40. 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"}