@azeth/mcp-server 0.2.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 (63) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +141 -0
  3. package/dist/index.d.ts +3 -0
  4. package/dist/index.d.ts.map +1 -0
  5. package/dist/index.js +48 -0
  6. package/dist/index.js.map +1 -0
  7. package/dist/tools/account.d.ts +4 -0
  8. package/dist/tools/account.d.ts.map +1 -0
  9. package/dist/tools/account.js +640 -0
  10. package/dist/tools/account.js.map +1 -0
  11. package/dist/tools/agreements.d.ts +4 -0
  12. package/dist/tools/agreements.d.ts.map +1 -0
  13. package/dist/tools/agreements.js +865 -0
  14. package/dist/tools/agreements.js.map +1 -0
  15. package/dist/tools/guardian-approval.d.ts +4 -0
  16. package/dist/tools/guardian-approval.d.ts.map +1 -0
  17. package/dist/tools/guardian-approval.js +319 -0
  18. package/dist/tools/guardian-approval.js.map +1 -0
  19. package/dist/tools/guardian.d.ts +4 -0
  20. package/dist/tools/guardian.d.ts.map +1 -0
  21. package/dist/tools/guardian.js +267 -0
  22. package/dist/tools/guardian.js.map +1 -0
  23. package/dist/tools/messaging.d.ts +4 -0
  24. package/dist/tools/messaging.d.ts.map +1 -0
  25. package/dist/tools/messaging.js +353 -0
  26. package/dist/tools/messaging.js.map +1 -0
  27. package/dist/tools/payments.d.ts +14 -0
  28. package/dist/tools/payments.d.ts.map +1 -0
  29. package/dist/tools/payments.js +723 -0
  30. package/dist/tools/payments.js.map +1 -0
  31. package/dist/tools/registry.d.ts +4 -0
  32. package/dist/tools/registry.d.ts.map +1 -0
  33. package/dist/tools/registry.js +608 -0
  34. package/dist/tools/registry.js.map +1 -0
  35. package/dist/tools/reputation.d.ts +4 -0
  36. package/dist/tools/reputation.d.ts.map +1 -0
  37. package/dist/tools/reputation.js +433 -0
  38. package/dist/tools/reputation.js.map +1 -0
  39. package/dist/tools/transfer.d.ts +4 -0
  40. package/dist/tools/transfer.d.ts.map +1 -0
  41. package/dist/tools/transfer.js +181 -0
  42. package/dist/tools/transfer.js.map +1 -0
  43. package/dist/utils/client.d.ts +25 -0
  44. package/dist/utils/client.d.ts.map +1 -0
  45. package/dist/utils/client.js +100 -0
  46. package/dist/utils/client.js.map +1 -0
  47. package/dist/utils/error-selectors.d.ts +23 -0
  48. package/dist/utils/error-selectors.d.ts.map +1 -0
  49. package/dist/utils/error-selectors.js +159 -0
  50. package/dist/utils/error-selectors.js.map +1 -0
  51. package/dist/utils/rate-limit.d.ts +17 -0
  52. package/dist/utils/rate-limit.d.ts.map +1 -0
  53. package/dist/utils/rate-limit.js +75 -0
  54. package/dist/utils/rate-limit.js.map +1 -0
  55. package/dist/utils/resolve.d.ts +38 -0
  56. package/dist/utils/resolve.d.ts.map +1 -0
  57. package/dist/utils/resolve.js +308 -0
  58. package/dist/utils/resolve.js.map +1 -0
  59. package/dist/utils/response.d.ts +42 -0
  60. package/dist/utils/response.d.ts.map +1 -0
  61. package/dist/utils/response.js +257 -0
  62. package/dist/utils/response.js.map +1 -0
  63. package/package.json +62 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limit.js","sourceRoot":"","sources":["../../src/utils/rate-limit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ import type { AzethKit } from '@azeth/sdk';
2
+ /** Result of resolving a human-friendly identifier to an on-chain address */
3
+ export interface ResolvedAddress {
4
+ address: `0x${string}`;
5
+ /** Original input if it was not already a raw address */
6
+ resolvedFrom?: string;
7
+ /** Trust registry tokenId (when resolved via name) */
8
+ tokenId?: string;
9
+ /** Trust registry name (when resolved via name) */
10
+ name?: string;
11
+ }
12
+ /**
13
+ * Resolve a human-friendly identifier to an Ethereum address.
14
+ *
15
+ * Resolution order:
16
+ * 1. Raw address (0x...) → returned as-is, no network call
17
+ * 2. "me" → client.resolveSmartAccount() (first smart account)
18
+ * 3. "#token:N" → on-chain ERC-8004 tokenId lookup (unambiguous)
19
+ * 4. "#N" → client.getSmartAccounts()[N-1] (1-indexed)
20
+ * 5. Name string → query server discovery API with exact match
21
+ * - Deduplicates by owner (keeps highest tokenId per owner)
22
+ * - 0 matches → SERVICE_NOT_FOUND error
23
+ * - 1 match → resolved
24
+ * - Multiple distinct owners → INVALID_INPUT error with disambiguation list
25
+ *
26
+ * @param input - Address, "me", "#token:N", "#N", or a participant name
27
+ * @param client - AzethKit instance (required for "me", "#N", and name resolution)
28
+ */
29
+ export declare function resolveAddress(input: string, client?: AzethKit, context?: 'service' | 'account'): Promise<ResolvedAddress>;
30
+ /**
31
+ * Resolve a smartAccount field that can be an address, name, "me", or "#N".
32
+ * Looks up owned accounts and matches by name (exact, case-insensitive).
33
+ *
34
+ * @param input - Address, name, "me", "#N", or undefined (defaults to first account)
35
+ * @param client - AzethKit instance
36
+ */
37
+ export declare function resolveSmartAccount(input: string | undefined, client: AzethKit): Promise<`0x${string}` | undefined>;
38
+ //# sourceMappingURL=resolve.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../src/utils/resolve.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AA+D3C,6EAA6E;AAC7E,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,KAAK,MAAM,EAAE,CAAC;IACvB,yDAAyD;IACzD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,sDAAsD;IACtD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mDAAmD;IACnD,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,cAAc,CAClC,KAAK,EAAE,MAAM,EACb,MAAM,CAAC,EAAE,QAAQ,EACjB,OAAO,CAAC,EAAE,SAAS,GAAG,SAAS,GAC9B,OAAO,CAAC,eAAe,CAAC,CA4K1B;AA+ED;;;;;;GAMG;AACH,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,MAAM,EAAE,QAAQ,GACf,OAAO,CAAC,KAAK,MAAM,EAAE,GAAG,SAAS,CAAC,CAoDpC"}
@@ -0,0 +1,308 @@
1
+ import { AzethError, AZETH_CONTRACTS, ERC8004_REGISTRY } from '@azeth/common';
2
+ import { TrustRegistryModuleAbi, AzethOracleAbi } from '@azeth/common/abis';
3
+ import { validateAddress, resolveChain, resolveViemChain } from './client.js';
4
+ /** Minimal ABI for ERC-8004 Identity Registry tokenURI (external contract) */
5
+ const ERC8004_TOKEN_URI_ABI = [
6
+ {
7
+ type: 'function',
8
+ name: 'tokenURI',
9
+ inputs: [{ name: 'tokenId', type: 'uint256', internalType: 'uint256' }],
10
+ outputs: [{ name: '', type: 'string', internalType: 'string' }],
11
+ stateMutability: 'view',
12
+ },
13
+ ];
14
+ /** Parse an ERC-8004 data: URI to extract the agent name */
15
+ function parseAgentName(uri) {
16
+ try {
17
+ if (!uri.startsWith('data:application/json,'))
18
+ return '(unknown)';
19
+ const jsonStr = decodeURIComponent(uri.slice('data:application/json,'.length));
20
+ const metadata = JSON.parse(jsonStr);
21
+ return metadata.name ?? '(unknown)';
22
+ }
23
+ catch {
24
+ return '(unknown)';
25
+ }
26
+ }
27
+ /** Look up an account's name on-chain via TrustRegistryModule.getTokenId → ERC-8004 tokenURI */
28
+ async function lookupAccountName(client, addr) {
29
+ const chain = resolveChain(process.env['AZETH_CHAIN']);
30
+ const trustRegistryAddr = AZETH_CONTRACTS[chain].trustRegistryModule;
31
+ const identityRegistryAddr = ERC8004_REGISTRY[chain];
32
+ try {
33
+ const tokenId = await client.publicClient.readContract({
34
+ address: trustRegistryAddr,
35
+ abi: TrustRegistryModuleAbi,
36
+ functionName: 'getTokenId',
37
+ args: [addr],
38
+ });
39
+ if (tokenId === 0n)
40
+ return null;
41
+ try {
42
+ const uri = await client.publicClient.readContract({
43
+ address: identityRegistryAddr,
44
+ abi: ERC8004_TOKEN_URI_ABI,
45
+ functionName: 'tokenURI',
46
+ args: [tokenId],
47
+ });
48
+ return { name: parseAgentName(uri), tokenId: tokenId.toString() };
49
+ }
50
+ catch {
51
+ return { name: '(registered)', tokenId: tokenId.toString() };
52
+ }
53
+ }
54
+ catch {
55
+ return null;
56
+ }
57
+ }
58
+ /**
59
+ * Resolve a human-friendly identifier to an Ethereum address.
60
+ *
61
+ * Resolution order:
62
+ * 1. Raw address (0x...) → returned as-is, no network call
63
+ * 2. "me" → client.resolveSmartAccount() (first smart account)
64
+ * 3. "#token:N" → on-chain ERC-8004 tokenId lookup (unambiguous)
65
+ * 4. "#N" → client.getSmartAccounts()[N-1] (1-indexed)
66
+ * 5. Name string → query server discovery API with exact match
67
+ * - Deduplicates by owner (keeps highest tokenId per owner)
68
+ * - 0 matches → SERVICE_NOT_FOUND error
69
+ * - 1 match → resolved
70
+ * - Multiple distinct owners → INVALID_INPUT error with disambiguation list
71
+ *
72
+ * @param input - Address, "me", "#token:N", "#N", or a participant name
73
+ * @param client - AzethKit instance (required for "me", "#N", and name resolution)
74
+ */
75
+ export async function resolveAddress(input, client, context) {
76
+ const trimmed = input.trim();
77
+ // 1. Raw address — or malformed hex (starts with 0x but isn't 42 chars)
78
+ if (validateAddress(trimmed)) {
79
+ return { address: trimmed };
80
+ }
81
+ if (/^0x/i.test(trimmed)) {
82
+ throw new AzethError(`"${trimmed}" looks like an address but is not valid (expected 0x + 40 hex characters).`, 'INVALID_INPUT', { field: 'address', provided: trimmed });
83
+ }
84
+ // 2. "me" — resolve to first smart account
85
+ if (trimmed.toLowerCase() === 'me') {
86
+ if (!client) {
87
+ throw new AzethError('"me" requires a connected client (AZETH_PRIVATE_KEY). Provide an explicit address instead.', 'UNAUTHORIZED');
88
+ }
89
+ const addr = await client.resolveSmartAccount();
90
+ return { address: addr, resolvedFrom: 'me' };
91
+ }
92
+ // 3. "#token:N" — resolve by ERC-8004 tokenId (unambiguous)
93
+ const tokenMatch = /^#token:(\d+)$/i.exec(trimmed);
94
+ if (tokenMatch) {
95
+ const chain = resolveChain(process.env['AZETH_CHAIN']);
96
+ const trustRegistryAddr = AZETH_CONTRACTS[chain].trustRegistryModule;
97
+ try {
98
+ const { createPublicClient, http } = await import('viem');
99
+ const viemChain = resolveViemChain(chain);
100
+ const rpcUrl = process.env['AZETH_RPC_URL'];
101
+ const pubClient = createPublicClient({ chain: viemChain, transport: http(rpcUrl) });
102
+ const tokenId = BigInt(tokenMatch[1]);
103
+ const accountAddr = await pubClient.readContract({
104
+ address: trustRegistryAddr,
105
+ abi: TrustRegistryModuleAbi,
106
+ functionName: 'getAccountByTokenId',
107
+ args: [tokenId],
108
+ });
109
+ if (accountAddr === '0x0000000000000000000000000000000000000000') {
110
+ throw new AzethError(`No participant registered with token ID ${tokenMatch[1]}.`, context === 'account' ? 'ACCOUNT_NOT_FOUND' : 'SERVICE_NOT_FOUND');
111
+ }
112
+ return {
113
+ address: accountAddr,
114
+ resolvedFrom: trimmed,
115
+ tokenId: tokenMatch[1],
116
+ };
117
+ }
118
+ catch (err) {
119
+ if (err instanceof AzethError)
120
+ throw err;
121
+ throw new AzethError(`Failed to resolve token ID ${tokenMatch[1]}: ${err instanceof Error ? err.message : String(err)}`, 'NETWORK_ERROR');
122
+ }
123
+ }
124
+ // 4. "#N" — resolve to Nth smart account (1-indexed)
125
+ const indexMatch = /^#(\d+)$/.exec(trimmed);
126
+ if (indexMatch) {
127
+ if (!client) {
128
+ throw new AzethError(`"${trimmed}" requires a connected client (AZETH_PRIVATE_KEY). Provide an explicit address instead.`, 'UNAUTHORIZED');
129
+ }
130
+ const accounts = await client.getSmartAccounts();
131
+ const idx = parseInt(indexMatch[1], 10);
132
+ if (idx < 1 || idx > accounts.length) {
133
+ throw new AzethError(`Account index ${idx} is out of range. You have ${accounts.length} account(s): ${accounts.map((a, i) => `#${i + 1}=${a}`).join(', ')}`, 'INVALID_INPUT');
134
+ }
135
+ return { address: accounts[idx - 1], resolvedFrom: trimmed };
136
+ }
137
+ // 4. Name string — query server discovery API, with on-chain fallback
138
+ const serverUrl = process.env['AZETH_SERVER_URL'] ?? 'https://api.azeth.ai';
139
+ const queryParams = new URLSearchParams({ name: trimmed, limit: '10' });
140
+ let matches;
141
+ try {
142
+ const response = await fetch(`${serverUrl}/api/v1/registry/discover?${queryParams}`, {
143
+ signal: AbortSignal.timeout(10_000),
144
+ });
145
+ if (!response.ok) {
146
+ const errorCode = response.status >= 400 && response.status < 500 ? 'SERVICE_NOT_FOUND' : 'NETWORK_ERROR';
147
+ throw new AzethError(`Discovery API returned ${response.status} while resolving name "${trimmed}"`, errorCode, { cause: 'server', httpStatus: response.status });
148
+ }
149
+ const body = await response.json();
150
+ matches = (body.data ?? []).map(d => ({
151
+ tokenId: String(d.tokenId),
152
+ owner: d.owner,
153
+ name: d.name,
154
+ capabilities: d.capabilities,
155
+ }));
156
+ }
157
+ catch (err) {
158
+ // Fall back to on-chain name resolution for server errors
159
+ const isAzethErr = err instanceof AzethError;
160
+ const isFetchErr = err instanceof TypeError && err.message.includes('fetch');
161
+ const shouldFallback = isFetchErr || (isAzethErr && ['SERVER_UNAVAILABLE', 'SERVICE_NOT_FOUND', 'NETWORK_ERROR'].includes(err.code));
162
+ if (!shouldFallback) {
163
+ if (isAzethErr)
164
+ throw err;
165
+ throw err;
166
+ }
167
+ // On-chain fallback: enumerate registry via AzethOracle.discoverRegistry()
168
+ matches = await resolveNameOnChain(trimmed);
169
+ }
170
+ // Deduplicate by owner: when the same owner re-registers with the same name,
171
+ // keep only the entry with the highest tokenId (most recent registration).
172
+ // This mirrors the dedup logic in azeth_discover_services (registry.ts).
173
+ const dedupMap = new Map();
174
+ for (const m of matches) {
175
+ const key = m.owner.toLowerCase();
176
+ const existing = dedupMap.get(key);
177
+ if (!existing || BigInt(m.tokenId) > BigInt(existing.tokenId)) {
178
+ dedupMap.set(key, m);
179
+ }
180
+ }
181
+ const deduped = [...dedupMap.values()];
182
+ // 0 matches
183
+ if (deduped.length === 0) {
184
+ throw new AzethError(`No participant named "${trimmed}" found in the trust registry.`, context === 'account' ? 'ACCOUNT_NOT_FOUND' : 'SERVICE_NOT_FOUND');
185
+ }
186
+ // 1 match after dedup
187
+ if (deduped.length === 1) {
188
+ const m = deduped[0];
189
+ return {
190
+ address: m.owner,
191
+ resolvedFrom: trimmed,
192
+ tokenId: m.tokenId,
193
+ name: m.name,
194
+ };
195
+ }
196
+ // Multiple distinct owners — error with disambiguation list
197
+ const disambigList = deduped.map(m => ` - "${m.name}" (tokenId: ${m.tokenId}, address: ${m.owner}, capabilities: [${m.capabilities.join(', ')}])`).join('\n');
198
+ throw new AzethError(`Multiple participants named "${trimmed}" found. Use the address, #token:N, or tokenId directly:\n${disambigList}`, 'INVALID_INPUT', { matches: deduped.map(m => ({ tokenId: m.tokenId, owner: m.owner, name: m.name })) });
199
+ }
200
+ /** On-chain name resolution fallback via AzethOracle.discoverRegistry().
201
+ * Enumerates the ERC-8004 Identity Registry and matches by name (case-insensitive). */
202
+ async function resolveNameOnChain(name) {
203
+ const { createPublicClient, http } = await import('viem');
204
+ const chain = resolveChain(process.env['AZETH_CHAIN']);
205
+ const viemChain = resolveViemChain(chain);
206
+ const rpcUrl = process.env['AZETH_RPC_URL'];
207
+ const registryAddress = ERC8004_REGISTRY[chain];
208
+ const oracleAddress = AZETH_CONTRACTS[chain]?.priceOracle;
209
+ if (!registryAddress || !oracleAddress) {
210
+ throw new AzethError(`No ERC-8004 registry or AzethOracle configured for ${chain}. Provide an explicit address.`, 'REGISTRY_ERROR');
211
+ }
212
+ const pubClient = createPublicClient({ chain: viemChain, transport: http(rpcUrl) });
213
+ const BATCH_SIZE = 1000;
214
+ const nameLower = name.trim().toLowerCase();
215
+ const results = [];
216
+ let startId = 0;
217
+ let reachedEnd = false;
218
+ while (!reachedEnd) {
219
+ let snapshots;
220
+ let scannedCount;
221
+ try {
222
+ [snapshots, scannedCount] = await pubClient.readContract({
223
+ address: oracleAddress,
224
+ abi: AzethOracleAbi,
225
+ functionName: 'discoverRegistry',
226
+ args: [registryAddress, BigInt(startId), BigInt(BATCH_SIZE)],
227
+ });
228
+ }
229
+ catch {
230
+ throw new AzethError(`Failed to query on-chain registry for name "${name}". Provide an explicit address instead.`, 'NETWORK_ERROR');
231
+ }
232
+ for (const snap of snapshots) {
233
+ if (!snap.exists)
234
+ continue;
235
+ if (!snap.uri.startsWith('data:application/json,'))
236
+ continue;
237
+ try {
238
+ const jsonStr = decodeURIComponent(snap.uri.slice('data:application/json,'.length));
239
+ const meta = JSON.parse(jsonStr);
240
+ const entryName = typeof meta.name === 'string' ? meta.name : '';
241
+ if (entryName.trim().toLowerCase() === nameLower) {
242
+ results.push({
243
+ tokenId: snap.tokenId.toString(),
244
+ owner: snap.owner,
245
+ name: entryName,
246
+ capabilities: Array.isArray(meta.capabilities)
247
+ ? meta.capabilities.filter((c) => typeof c === 'string')
248
+ : [],
249
+ });
250
+ }
251
+ }
252
+ catch {
253
+ // Malformed metadata — skip
254
+ }
255
+ }
256
+ if (scannedCount < BigInt(BATCH_SIZE)) {
257
+ reachedEnd = true;
258
+ }
259
+ else {
260
+ startId += BATCH_SIZE;
261
+ }
262
+ }
263
+ return results;
264
+ }
265
+ /**
266
+ * Resolve a smartAccount field that can be an address, name, "me", or "#N".
267
+ * Looks up owned accounts and matches by name (exact, case-insensitive).
268
+ *
269
+ * @param input - Address, name, "me", "#N", or undefined (defaults to first account)
270
+ * @param client - AzethKit instance
271
+ */
272
+ export async function resolveSmartAccount(input, client) {
273
+ if (!input)
274
+ return undefined;
275
+ const trimmed = input.trim();
276
+ // Raw address — return as-is
277
+ if (validateAddress(trimmed)) {
278
+ return trimmed;
279
+ }
280
+ // "me", "#N", or "#token:N" — same as resolveAddress
281
+ if (trimmed.toLowerCase() === 'me' || /^#\d+$/.test(trimmed) || /^#token:\d+$/i.test(trimmed)) {
282
+ const result = await resolveAddress(trimmed, client);
283
+ return result.address;
284
+ }
285
+ // Name string — look up own accounts by name on-chain
286
+ const accounts = await client.getSmartAccounts();
287
+ if (accounts.length === 0) {
288
+ throw new AzethError('No smart accounts found. Create one first with azeth_create_account.', 'ACCOUNT_NOT_FOUND');
289
+ }
290
+ const nameLower = trimmed.toLowerCase();
291
+ // Look up each account's name on-chain via TrustRegistryModule + ERC-8004
292
+ const matchedAccounts = [];
293
+ for (const addr of accounts) {
294
+ const info = await lookupAccountName(client, addr);
295
+ if (info && info.name.trim().toLowerCase() === nameLower) {
296
+ matchedAccounts.push({ address: addr, name: info.name, tokenId: info.tokenId });
297
+ }
298
+ }
299
+ if (matchedAccounts.length === 0) {
300
+ throw new AzethError(`No smart account named "${trimmed}" found. Your accounts: ${accounts.map((a, i) => `#${i + 1}=${a}`).join(', ')}`, 'ACCOUNT_NOT_FOUND');
301
+ }
302
+ if (matchedAccounts.length === 1) {
303
+ return matchedAccounts[0].address;
304
+ }
305
+ const list = matchedAccounts.map(m => ` - "${m.name}" (address: ${m.address}, tokenId: ${m.tokenId})`).join('\n');
306
+ throw new AzethError(`Multiple of your accounts match "${trimmed}". Use the address directly:\n${list}`, 'INVALID_INPUT');
307
+ }
308
+ //# sourceMappingURL=resolve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve.js","sourceRoot":"","sources":["../../src/utils/resolve.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ import type { CallToolResult } from '@modelcontextprotocol/sdk/types.js';
2
+ /** Structured success response returned by all MCP tools */
3
+ export interface ToolSuccess<T> {
4
+ success: true;
5
+ data: T;
6
+ meta: {
7
+ txHash?: string;
8
+ blockNumber?: number;
9
+ timestamp: string;
10
+ };
11
+ }
12
+ /** Structured error response returned by all MCP tools */
13
+ export interface ToolError {
14
+ success: false;
15
+ error: {
16
+ code: string;
17
+ message: string;
18
+ suggestion?: string;
19
+ };
20
+ }
21
+ /** Format a successful tool result for MCP */
22
+ export declare function success<T>(data: T, meta?: {
23
+ txHash?: string;
24
+ blockNumber?: number;
25
+ }): CallToolResult;
26
+ /** Format an error tool result for MCP */
27
+ export declare function error(code: string, message: string, suggestion?: string): CallToolResult;
28
+ /** Convert an unknown error into a structured MCP error response */
29
+ export declare function handleError(err: unknown): CallToolResult;
30
+ /** Format a bigint 18-decimal USD amount with adaptive precision.
31
+ * Shows 2 decimals for normal amounts; falls back to 6 decimals for micro-amounts
32
+ * that would otherwise round to "$0". */
33
+ export declare function formatUSD(amount: bigint): string;
34
+ /** Generate a guardian-related error response with actionable remediation guidance.
35
+ * Used when a UserOp fails with AA24 or pre-flight detects GUARDIAN_REQUIRED. */
36
+ export declare function guardianRequiredError(reason: string, details: {
37
+ operation?: string;
38
+ amount?: string;
39
+ limit?: string;
40
+ guardianAddress?: string;
41
+ }): CallToolResult;
42
+ //# sourceMappingURL=response.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"response.d.ts","sourceRoot":"","sources":["../../src/utils/response.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAGzE,4DAA4D;AAC5D,MAAM,WAAW,WAAW,CAAC,CAAC;IAC5B,OAAO,EAAE,IAAI,CAAC;IACd,IAAI,EAAE,CAAC,CAAC;IACR,IAAI,EAAE;QACJ,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;CACH;AAED,0DAA0D;AAC1D,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,KAAK,CAAC;IACf,KAAK,EAAE;QACL,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;CACH;AAED,8CAA8C;AAC9C,wBAAgB,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,cAAc,CAYpG;AAED,0CAA0C;AAC1C,wBAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,cAAc,CASxF;AAmBD,oEAAoE;AACpE,wBAAgB,WAAW,CAAC,GAAG,EAAE,OAAO,GAAG,cAAc,CAoCxD;AAsGD;;0CAE0C;AAC1C,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAOhD;AAED;kFACkF;AAClF,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE;IACP,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,GACA,cAAc,CA8DhB"}