@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.
- package/LICENSE +21 -0
- package/README.md +141 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +48 -0
- package/dist/index.js.map +1 -0
- package/dist/tools/account.d.ts +4 -0
- package/dist/tools/account.d.ts.map +1 -0
- package/dist/tools/account.js +640 -0
- package/dist/tools/account.js.map +1 -0
- package/dist/tools/agreements.d.ts +4 -0
- package/dist/tools/agreements.d.ts.map +1 -0
- package/dist/tools/agreements.js +865 -0
- package/dist/tools/agreements.js.map +1 -0
- package/dist/tools/guardian-approval.d.ts +4 -0
- package/dist/tools/guardian-approval.d.ts.map +1 -0
- package/dist/tools/guardian-approval.js +319 -0
- package/dist/tools/guardian-approval.js.map +1 -0
- package/dist/tools/guardian.d.ts +4 -0
- package/dist/tools/guardian.d.ts.map +1 -0
- package/dist/tools/guardian.js +267 -0
- package/dist/tools/guardian.js.map +1 -0
- package/dist/tools/messaging.d.ts +4 -0
- package/dist/tools/messaging.d.ts.map +1 -0
- package/dist/tools/messaging.js +353 -0
- package/dist/tools/messaging.js.map +1 -0
- package/dist/tools/payments.d.ts +14 -0
- package/dist/tools/payments.d.ts.map +1 -0
- package/dist/tools/payments.js +723 -0
- package/dist/tools/payments.js.map +1 -0
- package/dist/tools/registry.d.ts +4 -0
- package/dist/tools/registry.d.ts.map +1 -0
- package/dist/tools/registry.js +608 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/reputation.d.ts +4 -0
- package/dist/tools/reputation.d.ts.map +1 -0
- package/dist/tools/reputation.js +433 -0
- package/dist/tools/reputation.js.map +1 -0
- package/dist/tools/transfer.d.ts +4 -0
- package/dist/tools/transfer.d.ts.map +1 -0
- package/dist/tools/transfer.js +181 -0
- package/dist/tools/transfer.js.map +1 -0
- package/dist/utils/client.d.ts +25 -0
- package/dist/utils/client.d.ts.map +1 -0
- package/dist/utils/client.js +100 -0
- package/dist/utils/client.js.map +1 -0
- package/dist/utils/error-selectors.d.ts +23 -0
- package/dist/utils/error-selectors.d.ts.map +1 -0
- package/dist/utils/error-selectors.js +159 -0
- package/dist/utils/error-selectors.js.map +1 -0
- package/dist/utils/rate-limit.d.ts +17 -0
- package/dist/utils/rate-limit.d.ts.map +1 -0
- package/dist/utils/rate-limit.js +75 -0
- package/dist/utils/rate-limit.js.map +1 -0
- package/dist/utils/resolve.d.ts +38 -0
- package/dist/utils/resolve.d.ts.map +1 -0
- package/dist/utils/resolve.js +308 -0
- package/dist/utils/resolve.js.map +1 -0
- package/dist/utils/response.d.ts +42 -0
- package/dist/utils/response.d.ts.map +1 -0
- package/dist/utils/response.js +257 -0
- package/dist/utils/response.js.map +1 -0
- 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"}
|