@clawnch/clawtomaton 0.6.0 → 0.8.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.
@@ -0,0 +1,409 @@
1
+ /**
2
+ * Skill: paid_services — Monetize agent capabilities via XMTP.
3
+ *
4
+ * Users pay ETH to the agent's wallet, then request services via XMTP.
5
+ * Payment is verified on-chain by scanning recent blocks for matching transfers.
6
+ *
7
+ * Actions:
8
+ * - catalog: List available services with pricing
9
+ * - verify_payment: Check if an address has paid for a service
10
+ * - execute_service: Execute a paid service after verifying payment
11
+ * - advertise: Generate a message advertising services
12
+ *
13
+ * Configured via autonomy.paidServices in ClawtomatonConfig.
14
+ * Requires XMTP to be enabled for communication with users.
15
+ */
16
+ import { parseEther, formatEther } from 'viem';
17
+ // ============================================================================
18
+ // Skill Definition
19
+ // ============================================================================
20
+ export const paidServicesSkill = {
21
+ name: 'paid_services',
22
+ description: [
23
+ 'Monetize agent capabilities via XMTP. Users pay ETH, then request services.',
24
+ 'Actions: catalog (list services), verify_payment (check on-chain payment),',
25
+ 'execute_service (run service after payment), advertise (generate promo message).',
26
+ 'Requires autonomy.paidServices config with a service catalog.',
27
+ ].join(' '),
28
+ parameters: [
29
+ {
30
+ name: 'action',
31
+ type: 'string',
32
+ description: 'Action: "catalog", "verify_payment", "execute_service", "advertise"',
33
+ required: true,
34
+ },
35
+ {
36
+ name: 'serviceId',
37
+ type: 'string',
38
+ description: 'Service ID from catalog (for verify_payment, execute_service)',
39
+ required: false,
40
+ },
41
+ {
42
+ name: 'payerAddress',
43
+ type: 'address',
44
+ description: 'Address that sent payment (for verify_payment, execute_service)',
45
+ required: false,
46
+ },
47
+ {
48
+ name: 'txHash',
49
+ type: 'string',
50
+ description: 'Payment transaction hash (optional — speeds up verification)',
51
+ required: false,
52
+ },
53
+ {
54
+ name: 'params',
55
+ type: 'string',
56
+ description: 'JSON string of service-specific params (for execute_service)',
57
+ required: false,
58
+ },
59
+ ],
60
+ execute: async (params, ctx) => {
61
+ try {
62
+ const action = params.action;
63
+ if (!action) {
64
+ return { callId: '', success: false, result: null, error: 'Missing action parameter.' };
65
+ }
66
+ const paidServicesCfg = getPaidServicesConfig(ctx);
67
+ if (!paidServicesCfg) {
68
+ return {
69
+ callId: '',
70
+ success: false,
71
+ result: null,
72
+ error: 'Paid services not configured. Set autonomy.paidServices in config with enabled: true and a catalog.',
73
+ };
74
+ }
75
+ switch (action) {
76
+ case 'catalog':
77
+ return handleCatalog(paidServicesCfg);
78
+ case 'verify_payment':
79
+ return await handleVerifyPayment(paidServicesCfg, params, ctx);
80
+ case 'execute_service':
81
+ return await handleExecuteService(paidServicesCfg, params, ctx);
82
+ case 'advertise':
83
+ return handleAdvertise(paidServicesCfg, ctx);
84
+ default:
85
+ return {
86
+ callId: '',
87
+ success: false,
88
+ result: null,
89
+ error: `Unknown action: "${action}". Use: catalog, verify_payment, execute_service, advertise`,
90
+ };
91
+ }
92
+ }
93
+ catch (err) {
94
+ return { callId: '', success: false, result: null, error: err instanceof Error ? err.message : String(err) };
95
+ }
96
+ },
97
+ };
98
+ function getPaidServicesConfig(ctx) {
99
+ const stateStore = ctx.stateStore;
100
+ if (!stateStore)
101
+ return null;
102
+ // Access autonomy config via the __autonomyConfig injected by agent
103
+ const autonomy = ctx.__autonomyConfig;
104
+ if (!autonomy?.paidServices?.enabled)
105
+ return null;
106
+ if (!autonomy.paidServices.catalog || autonomy.paidServices.catalog.length === 0)
107
+ return null;
108
+ return autonomy.paidServices;
109
+ }
110
+ // ============================================================================
111
+ // Action handlers
112
+ // ============================================================================
113
+ function handleCatalog(config) {
114
+ const catalog = config.catalog;
115
+ const lines = [
116
+ `Available Paid Services (${catalog.length}):`,
117
+ '',
118
+ ];
119
+ for (const svc of catalog) {
120
+ lines.push(`${svc.id}: ${svc.name}`);
121
+ lines.push(` ${svc.description}`);
122
+ lines.push(` Price: ${svc.priceEth} ETH`);
123
+ lines.push(` Skill: ${svc.skill}`);
124
+ lines.push('');
125
+ }
126
+ lines.push('To use a service:');
127
+ lines.push('1. User sends ETH to your wallet');
128
+ lines.push('2. You verify payment with verify_payment');
129
+ lines.push('3. You execute the service with execute_service');
130
+ return { callId: '', success: true, result: lines.join('\n') };
131
+ }
132
+ async function handleVerifyPayment(config, params, ctx) {
133
+ const serviceId = params.serviceId;
134
+ const payerAddress = params.payerAddress;
135
+ if (!serviceId || !payerAddress) {
136
+ return {
137
+ callId: '',
138
+ success: false,
139
+ result: null,
140
+ error: 'Missing required params: serviceId, payerAddress',
141
+ };
142
+ }
143
+ const service = config.catalog.find(s => s.id === serviceId);
144
+ if (!service) {
145
+ return {
146
+ callId: '',
147
+ success: false,
148
+ result: null,
149
+ error: `Unknown service: "${serviceId}". Use catalog action to see available services.`,
150
+ };
151
+ }
152
+ const expectedAmountWei = parseEther(service.priceEth);
153
+ const windowMs = config.paymentWindowMs ?? 3_600_000; // 1 hour default
154
+ const minConfirmations = config.minConfirmations ?? 5;
155
+ // If a specific txHash is provided, verify it directly
156
+ const txHash = params.txHash;
157
+ if (txHash) {
158
+ return await verifySpecificTx(ctx, txHash, payerAddress, expectedAmountWei, minConfirmations);
159
+ }
160
+ // Otherwise, scan recent blocks for matching transfers
161
+ return await scanForPayment(ctx, payerAddress, expectedAmountWei, windowMs, minConfirmations);
162
+ }
163
+ async function handleExecuteService(config, params, ctx) {
164
+ const serviceId = params.serviceId;
165
+ const payerAddress = params.payerAddress;
166
+ if (!serviceId || !payerAddress) {
167
+ return {
168
+ callId: '',
169
+ success: false,
170
+ result: null,
171
+ error: 'Missing required params: serviceId, payerAddress',
172
+ };
173
+ }
174
+ const service = config.catalog.find(s => s.id === serviceId);
175
+ if (!service) {
176
+ return {
177
+ callId: '',
178
+ success: false,
179
+ result: null,
180
+ error: `Unknown service: "${serviceId}".`,
181
+ };
182
+ }
183
+ // First verify payment
184
+ const expectedAmountWei = parseEther(service.priceEth);
185
+ const windowMs = config.paymentWindowMs ?? 3_600_000;
186
+ const minConfirmations = config.minConfirmations ?? 5;
187
+ const txHash = params.txHash;
188
+ const verification = txHash
189
+ ? await verifySpecificTx(ctx, txHash, payerAddress, expectedAmountWei, minConfirmations)
190
+ : await scanForPayment(ctx, payerAddress, expectedAmountWei, windowMs, minConfirmations);
191
+ if (!verification.success || !verification.metadata?.verified) {
192
+ return {
193
+ callId: '',
194
+ success: false,
195
+ result: null,
196
+ error: `Payment not verified for service "${serviceId}". ${verification.result ?? verification.error ?? 'No matching payment found.'}`,
197
+ };
198
+ }
199
+ // Payment verified — instruct the agent to execute the underlying skill
200
+ const serviceParams = params.params
201
+ ? JSON.parse(params.params)
202
+ : service.defaultParams ?? {};
203
+ return {
204
+ callId: '',
205
+ success: true,
206
+ result: [
207
+ `Payment VERIFIED for service "${service.name}" from ${payerAddress}`,
208
+ `TX: ${verification.metadata.txHash}`,
209
+ `Amount: ${service.priceEth} ETH`,
210
+ ``,
211
+ `Now execute the service using the "${service.skill}" skill with these params:`,
212
+ JSON.stringify(serviceParams, null, 2),
213
+ ``,
214
+ `After completing the service, send the result to the user via XMTP.`,
215
+ ].join('\n'),
216
+ metadata: {
217
+ serviceId,
218
+ payerAddress,
219
+ verified: true,
220
+ skill: service.skill,
221
+ params: serviceParams,
222
+ paymentTxHash: verification.metadata.txHash,
223
+ },
224
+ };
225
+ }
226
+ function handleAdvertise(config, ctx) {
227
+ const catalog = config.catalog;
228
+ const lines = [
229
+ `I offer paid services. Send ETH to my wallet, then message me the service you want.`,
230
+ ``,
231
+ `My wallet: ${ctx.identity.address}`,
232
+ ``,
233
+ `Services:`,
234
+ ];
235
+ for (const svc of catalog) {
236
+ lines.push(` ${svc.name} — ${svc.priceEth} ETH`);
237
+ lines.push(` ${svc.description}`);
238
+ }
239
+ lines.push('');
240
+ lines.push('How to use:');
241
+ lines.push('1. Send the exact ETH amount for the service you want to my wallet');
242
+ lines.push('2. Message me here with the service name and any details');
243
+ lines.push('3. I\'ll verify your payment on-chain and deliver the service');
244
+ return {
245
+ callId: '',
246
+ success: true,
247
+ result: lines.join('\n'),
248
+ metadata: { type: 'advertisement', serviceCount: catalog.length },
249
+ };
250
+ }
251
+ // ============================================================================
252
+ // Payment verification helpers
253
+ // ============================================================================
254
+ async function verifySpecificTx(ctx, txHash, expectedFrom, expectedAmountWei, minConfirmations) {
255
+ try {
256
+ const { buildClients } = await import('../identity/index.js');
257
+ const rpcUrl = process.env.BASE_RPC_URL ?? 'https://mainnet.base.org';
258
+ const { publicClient } = buildClients(ctx.identity, rpcUrl);
259
+ const pc = publicClient;
260
+ const receipt = await pc.getTransactionReceipt({ hash: txHash });
261
+ if (!receipt) {
262
+ return {
263
+ callId: '',
264
+ success: true,
265
+ result: `Transaction ${txHash} not found or not yet confirmed.`,
266
+ metadata: { verified: false },
267
+ };
268
+ }
269
+ // Check confirmations
270
+ const currentBlock = await pc.getBlockNumber();
271
+ const confirmations = Number(currentBlock - receipt.blockNumber);
272
+ if (confirmations < minConfirmations) {
273
+ return {
274
+ callId: '',
275
+ success: true,
276
+ result: `Transaction ${txHash} has ${confirmations} confirmations (need ${minConfirmations}). Wait and try again.`,
277
+ metadata: { verified: false, confirmations },
278
+ };
279
+ }
280
+ // Fetch the full transaction to check value and from/to
281
+ const tx = await pc.getTransaction({ hash: txHash });
282
+ if (!tx) {
283
+ return {
284
+ callId: '',
285
+ success: true,
286
+ result: `Could not fetch transaction details for ${txHash}.`,
287
+ metadata: { verified: false },
288
+ };
289
+ }
290
+ // Verify sender
291
+ if (tx.from.toLowerCase() !== expectedFrom.toLowerCase()) {
292
+ return {
293
+ callId: '',
294
+ success: true,
295
+ result: `Transaction sender (${tx.from}) doesn't match expected payer (${expectedFrom}).`,
296
+ metadata: { verified: false },
297
+ };
298
+ }
299
+ // Verify recipient is the agent
300
+ if (tx.to?.toLowerCase() !== ctx.identity.address.toLowerCase()) {
301
+ return {
302
+ callId: '',
303
+ success: true,
304
+ result: `Transaction recipient (${tx.to}) is not the agent wallet (${ctx.identity.address}).`,
305
+ metadata: { verified: false },
306
+ };
307
+ }
308
+ // Verify amount (allow up to 5% overpayment, exact or higher is fine)
309
+ if (tx.value < expectedAmountWei) {
310
+ return {
311
+ callId: '',
312
+ success: true,
313
+ result: `Payment amount (${formatEther(tx.value)} ETH) is less than required (${formatEther(expectedAmountWei)} ETH).`,
314
+ metadata: { verified: false, paidWei: tx.value.toString() },
315
+ };
316
+ }
317
+ return {
318
+ callId: '',
319
+ success: true,
320
+ result: `Payment VERIFIED: ${formatEther(tx.value)} ETH from ${tx.from} in tx ${txHash} (${confirmations} confirmations).`,
321
+ metadata: { verified: true, txHash, confirmations, paidWei: tx.value.toString() },
322
+ };
323
+ }
324
+ catch (err) {
325
+ return {
326
+ callId: '',
327
+ success: false,
328
+ result: null,
329
+ error: `Payment verification failed: ${err instanceof Error ? err.message : String(err)}`,
330
+ };
331
+ }
332
+ }
333
+ async function scanForPayment(ctx, expectedFrom, expectedAmountWei, windowMs, minConfirmations) {
334
+ try {
335
+ const { buildClients } = await import('../identity/index.js');
336
+ const rpcUrl = process.env.BASE_RPC_URL ?? 'https://mainnet.base.org';
337
+ const { publicClient } = buildClients(ctx.identity, rpcUrl);
338
+ const pc = publicClient;
339
+ const currentBlock = await pc.getBlockNumber();
340
+ // Base produces ~2s blocks, so windowMs / 2000 = blocks to scan
341
+ const blocksToScan = BigInt(Math.ceil(windowMs / 2000));
342
+ const fromBlock = currentBlock > blocksToScan ? currentBlock - blocksToScan : 0n;
343
+ // Scan for ETH transfers to the agent's address
344
+ // We use eth_getLogs to find internal transfers, but for simple ETH sends,
345
+ // we need to scan blocks. This is expensive, so we limit the scan.
346
+ //
347
+ // For a production-grade implementation, you'd use an indexer (Alchemy, QuickNode).
348
+ // For now, we scan a limited number of recent blocks.
349
+ const maxBlocksToScan = 900n; // ~30 minutes of Base blocks
350
+ const effectiveFromBlock = currentBlock - maxBlocksToScan > fromBlock
351
+ ? currentBlock - maxBlocksToScan
352
+ : fromBlock;
353
+ // Check the last N blocks for transactions from expectedFrom to agent
354
+ // We can't efficiently scan all blocks, so we'll check a sample
355
+ const sampleSize = 50; // Check 50 most recent blocks
356
+ const step = maxBlocksToScan > BigInt(sampleSize)
357
+ ? maxBlocksToScan / BigInt(sampleSize)
358
+ : 1n;
359
+ for (let blockNum = currentBlock; blockNum > effectiveFromBlock; blockNum -= step) {
360
+ try {
361
+ const block = await pc.getBlock({ blockNumber: blockNum, includeTransactions: true });
362
+ if (!block || !block.transactions)
363
+ continue;
364
+ for (const tx of block.transactions) {
365
+ if (typeof tx === 'string')
366
+ continue; // Skip if only hash returned
367
+ const txObj = tx;
368
+ if (txObj.from?.toLowerCase() === expectedFrom.toLowerCase() &&
369
+ txObj.to?.toLowerCase() === ctx.identity.address.toLowerCase() &&
370
+ BigInt(txObj.value ?? '0') >= expectedAmountWei) {
371
+ const confirmations = Number(currentBlock - blockNum);
372
+ if (confirmations < minConfirmations) {
373
+ return {
374
+ callId: '',
375
+ success: true,
376
+ result: `Found payment tx ${txObj.hash} but only ${confirmations} confirmations (need ${minConfirmations}). Wait and retry.`,
377
+ metadata: { verified: false, txHash: txObj.hash, confirmations },
378
+ };
379
+ }
380
+ return {
381
+ callId: '',
382
+ success: true,
383
+ result: `Payment VERIFIED: ${formatEther(BigInt(txObj.value))} ETH from ${expectedFrom} in tx ${txObj.hash} (${confirmations} confirmations).`,
384
+ metadata: { verified: true, txHash: txObj.hash, confirmations, paidWei: txObj.value.toString() },
385
+ };
386
+ }
387
+ }
388
+ }
389
+ catch {
390
+ // Individual block read failure — continue scanning
391
+ }
392
+ }
393
+ return {
394
+ callId: '',
395
+ success: true,
396
+ result: `No matching payment found from ${expectedFrom} for ${formatEther(expectedAmountWei)} ETH in the last ~${Math.round(Number(maxBlocksToScan) * 2 / 60)} minutes. The user should provide the txHash for faster verification.`,
397
+ metadata: { verified: false },
398
+ };
399
+ }
400
+ catch (err) {
401
+ return {
402
+ callId: '',
403
+ success: false,
404
+ result: null,
405
+ error: `Payment scan failed: ${err instanceof Error ? err.message : String(err)}. Ask the user for the txHash directly.`,
406
+ };
407
+ }
408
+ }
409
+ //# sourceMappingURL=services.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"services.js","sourceRoot":"","sources":["../../src/skills/services.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Skill: wayfinder — Cross-chain DeFi via Wayfinder Paths.
3
+ *
4
+ * Two tiers:
5
+ * REST (always available): pools, balances, quote, resolve_token
6
+ * CLI (requires Python + wayfinder-paths): execute_swap, strategy
7
+ *
8
+ * Configurable via autonomy.wayfinder in ClawtomatonConfig.
9
+ * Requires WAYFINDER_API_KEY env var or config.autonomy.wayfinder.apiKey.
10
+ */
11
+ import type { SkillDefinition } from '../types.js';
12
+ export declare const wayfinderSkill: SkillDefinition;
13
+ //# sourceMappingURL=wayfinder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wayfinder.d.ts","sourceRoot":"","sources":["../../src/skills/wayfinder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,EAAE,eAAe,EAA4B,MAAM,aAAa,CAAC;AAO7E,eAAO,MAAM,cAAc,EAAE,eA0J5B,CAAC"}