agentcash 0.3.0 → 0.3.2

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 (45) hide show
  1. package/dist/cjs/run-server.cjs +480 -3191
  2. package/dist/esm/{chunk-4YIIYCPO.js → chunk-BTIVASGJ.js} +5 -10
  3. package/dist/esm/{chunk-4YIIYCPO.js.map → chunk-BTIVASGJ.js.map} +1 -1
  4. package/dist/esm/chunk-E3MKYUQQ.js +575 -0
  5. package/dist/esm/chunk-E3MKYUQQ.js.map +1 -0
  6. package/dist/esm/{chunk-J3LUL7DB.js → chunk-ISR6DJ53.js} +1 -6
  7. package/dist/esm/{chunk-J3LUL7DB.js.map → chunk-ISR6DJ53.js.map} +1 -1
  8. package/dist/esm/{chunk-3MUBKDR7.js → chunk-KPEJO3KV.js} +1 -6
  9. package/dist/esm/{chunk-3MUBKDR7.js.map → chunk-KPEJO3KV.js.map} +1 -1
  10. package/dist/esm/{chunk-2OAFWAAC.js → chunk-VX2WPSZV.js} +29 -97
  11. package/dist/esm/chunk-VX2WPSZV.js.map +1 -0
  12. package/dist/esm/chunk-VZL5QWWM.js +363 -0
  13. package/dist/esm/chunk-VZL5QWWM.js.map +1 -0
  14. package/dist/esm/{chunk-FYIUFEVS.js → chunk-XXKBL2AC.js} +1 -6
  15. package/dist/esm/{chunk-FYIUFEVS.js.map → chunk-XXKBL2AC.js.map} +1 -1
  16. package/dist/esm/chunk-ZVDFFTHM.js +22 -0
  17. package/dist/esm/chunk-ZVDFFTHM.js.map +1 -0
  18. package/dist/esm/cli-context-JTXXAIO4.js +9 -0
  19. package/dist/esm/{commands-WQ5AY36Z.js → commands-IANPQPZS.js} +14 -35
  20. package/dist/esm/commands-IANPQPZS.js.map +1 -0
  21. package/dist/esm/{fund-JSFGMI3R.js → fund-H6QAHY62.js} +5 -9
  22. package/dist/esm/{fund-JSFGMI3R.js.map → fund-H6QAHY62.js.map} +1 -1
  23. package/dist/esm/index.js +11 -15
  24. package/dist/esm/index.js.map +1 -1
  25. package/dist/esm/{install-B4HDFMEM.js → install-KLEATNEC.js} +9 -25
  26. package/dist/esm/install-KLEATNEC.js.map +1 -0
  27. package/dist/esm/{server-SKKWDRW7.js → server-XNUVCZTJ.js} +35 -142
  28. package/dist/esm/server-XNUVCZTJ.js.map +1 -0
  29. package/dist/esm/shared/operations/index.d.ts +7 -7
  30. package/dist/esm/shared/operations/index.js +4 -5
  31. package/package.json +5 -3
  32. package/dist/esm/chunk-2OAFWAAC.js.map +0 -1
  33. package/dist/esm/chunk-A2KI7TKE.js +0 -59
  34. package/dist/esm/chunk-A2KI7TKE.js.map +0 -1
  35. package/dist/esm/chunk-JVUT4TKE.js +0 -197
  36. package/dist/esm/chunk-JVUT4TKE.js.map +0 -1
  37. package/dist/esm/chunk-VTLIFNZN.js +0 -46015
  38. package/dist/esm/chunk-VTLIFNZN.js.map +0 -1
  39. package/dist/esm/chunk-YOLNSINZ.js +0 -57
  40. package/dist/esm/chunk-YOLNSINZ.js.map +0 -1
  41. package/dist/esm/cli-context-2MKOXVXU.js +0 -10
  42. package/dist/esm/commands-WQ5AY36Z.js.map +0 -1
  43. package/dist/esm/install-B4HDFMEM.js.map +0 -1
  44. package/dist/esm/server-SKKWDRW7.js.map +0 -1
  45. /package/dist/esm/{cli-context-2MKOXVXU.js.map → cli-context-JTXXAIO4.js.map} +0 -0
@@ -0,0 +1,363 @@
1
+ import {
2
+ LEGACY_DIRECTORY,
3
+ configFile,
4
+ err,
5
+ fsErr,
6
+ getBalance,
7
+ getBaseUrl,
8
+ log,
9
+ ok,
10
+ resultFromPromise,
11
+ resultFromThrowable,
12
+ safeChmod,
13
+ safeFetchJson,
14
+ safeParse,
15
+ safeReadFile,
16
+ safeWriteFile
17
+ } from "./chunk-VX2WPSZV.js";
18
+
19
+ // src/shared/wallet.ts
20
+ import { existsSync, readFileSync } from "fs";
21
+ import { join } from "path";
22
+ import { getAddress } from "viem";
23
+ import { generatePrivateKey, privateKeyToAccount } from "viem/accounts";
24
+ import z from "zod";
25
+
26
+ // src/shared/neverthrow/json/index.ts
27
+ var type = "json";
28
+ var jsonErr = (surface, error) => {
29
+ return err(type, surface, error);
30
+ };
31
+ var safeStringifyJson = (surface, value) => {
32
+ return resultFromThrowable(
33
+ type,
34
+ surface,
35
+ () => JSON.stringify(value, null, 2),
36
+ () => ({
37
+ cause: "stringify",
38
+ message: "Could not stringify JSON"
39
+ })
40
+ );
41
+ };
42
+ var safeParseJson = (surface, value) => {
43
+ return resultFromThrowable(
44
+ type,
45
+ surface,
46
+ () => JSON.parse(value),
47
+ (e) => ({
48
+ cause: "parse",
49
+ message: e instanceof Error ? e.message : "Could not parse JSON"
50
+ })
51
+ );
52
+ };
53
+
54
+ // src/shared/wallet.ts
55
+ var WALLET_FILE = configFile("wallet.json");
56
+ var storedWalletSchema = z.object({
57
+ privateKey: z.string().regex(/^0x[a-fA-F0-9]{64}$/, "Invalid Ethereum private key").transform((privateKey) => privateKey),
58
+ address: z.string().regex(/^0x[a-fA-F0-9]{40}$/, "Invalid Ethereum address").transform((address) => getAddress(address)),
59
+ createdAt: z.string()
60
+ });
61
+ var walletSurface = "wallet";
62
+ var LEGACY_WALLET = join(LEGACY_DIRECTORY, "wallet.json");
63
+ var reconcileSurface = "wallet-reconcile";
64
+ async function reconcileLegacyWallet(current, isNew) {
65
+ const noChange = { account: current, isNew };
66
+ if (!existsSync(LEGACY_WALLET)) {
67
+ return noChange;
68
+ }
69
+ const legacyResult = resultFromThrowable(
70
+ "wallet",
71
+ reconcileSurface,
72
+ () => {
73
+ const raw = readFileSync(LEGACY_WALLET, "utf-8");
74
+ return storedWalletSchema.parse(JSON.parse(raw));
75
+ },
76
+ () => ({
77
+ cause: "file_not_readable",
78
+ message: "Legacy wallet exists but is invalid"
79
+ })
80
+ );
81
+ if (legacyResult.isErr()) {
82
+ log.info("Legacy wallet exists but is invalid, skipping reconciliation");
83
+ return noChange;
84
+ }
85
+ const legacyKey = legacyResult.value.privateKey;
86
+ const legacyAccount = privateKeyToAccount(legacyKey);
87
+ if (legacyAccount.address === current.address) {
88
+ return noChange;
89
+ }
90
+ const flags = { dev: false };
91
+ const balancesResult = await resultFromPromise(
92
+ "wallet",
93
+ reconcileSurface,
94
+ Promise.all([
95
+ getBalance({
96
+ address: legacyAccount.address,
97
+ flags,
98
+ surface: reconcileSurface
99
+ }),
100
+ getBalance({
101
+ address: current.address,
102
+ flags,
103
+ surface: reconcileSurface
104
+ })
105
+ ]),
106
+ () => ({
107
+ cause: "balance_check",
108
+ message: "Network error during wallet reconciliation"
109
+ })
110
+ );
111
+ if (balancesResult.isErr()) {
112
+ log.info("Network error during wallet reconciliation, skipping");
113
+ return noChange;
114
+ }
115
+ const [legacyBalanceResult, currentBalanceResult] = balancesResult.value;
116
+ if (legacyBalanceResult.isErr() || currentBalanceResult.isErr()) {
117
+ log.info("Could not check balances for wallet reconciliation, skipping");
118
+ return noChange;
119
+ }
120
+ const legacyBalance = legacyBalanceResult.value.balance;
121
+ const currentBalance = currentBalanceResult.value.balance;
122
+ if (legacyBalance > 0 && currentBalance === 0) {
123
+ log.info(
124
+ `Recovering funded legacy wallet ${legacyAccount.address} (balance: ${legacyBalance})`
125
+ );
126
+ const stored = {
127
+ privateKey: legacyKey,
128
+ address: legacyAccount.address,
129
+ createdAt: (/* @__PURE__ */ new Date()).toISOString()
130
+ };
131
+ const writeResult = await safeWriteFile(
132
+ reconcileSurface,
133
+ WALLET_FILE,
134
+ JSON.stringify(stored, null, 2)
135
+ ).andThen(() => safeChmod(reconcileSurface, WALLET_FILE, 384));
136
+ if (writeResult.isErr()) {
137
+ log.error(
138
+ `Failed to write recovered wallet: ${writeResult.error.message}`
139
+ );
140
+ return noChange;
141
+ }
142
+ return { account: legacyAccount, isNew: false };
143
+ }
144
+ if (legacyBalance > 0 && currentBalance > 0) {
145
+ log.info(
146
+ `Both wallets have funds. Current: ${current.address} (${currentBalance}), Legacy: ${legacyAccount.address} (${legacyBalance}). Manually copy ${LEGACY_WALLET} to ${WALLET_FILE} if you want to use the legacy wallet.`
147
+ );
148
+ return noChange;
149
+ }
150
+ return noChange;
151
+ }
152
+ async function getWallet() {
153
+ if (process.env.X402_PRIVATE_KEY) {
154
+ const account2 = privateKeyToAccount(process.env.X402_PRIVATE_KEY);
155
+ log.info(`Using wallet from env: ${account2.address}`);
156
+ return ok({ account: account2, isNew: false });
157
+ }
158
+ const readFileResult = await safeReadFile(walletSurface, WALLET_FILE);
159
+ if (!readFileResult.isOk()) {
160
+ const fileExistsResult = existsSync(WALLET_FILE);
161
+ if (fileExistsResult) {
162
+ return fsErr(walletSurface, {
163
+ cause: "file_not_readable",
164
+ message: `The file exists but is not readable. Fix corrupted state file: ${WALLET_FILE}`
165
+ });
166
+ }
167
+ }
168
+ if (readFileResult.isOk()) {
169
+ const data = readFileResult.value;
170
+ const jsonParseResult = safeParseJson(walletSurface, data);
171
+ if (jsonParseResult.isErr()) {
172
+ return jsonErr(walletSurface, {
173
+ cause: "parse",
174
+ message: `The data in ${WALLET_FILE} is not valid JSON`
175
+ });
176
+ }
177
+ const parseResult = safeParse(
178
+ walletSurface,
179
+ storedWalletSchema,
180
+ jsonParseResult.value
181
+ );
182
+ if (parseResult.isErr()) {
183
+ return parseResult;
184
+ }
185
+ const account2 = privateKeyToAccount(parseResult.value.privateKey);
186
+ log.info(`Loaded wallet: ${account2.address}`);
187
+ const reconciled2 = await reconcileLegacyWallet(account2, false);
188
+ return ok(reconciled2);
189
+ }
190
+ const privateKey = generatePrivateKey();
191
+ const account = privateKeyToAccount(privateKey);
192
+ const stored = {
193
+ privateKey,
194
+ address: account.address,
195
+ createdAt: (/* @__PURE__ */ new Date()).toISOString()
196
+ };
197
+ const saveResult = await safeWriteFile(
198
+ walletSurface,
199
+ WALLET_FILE,
200
+ JSON.stringify(stored, null, 2)
201
+ ).andThen(() => safeChmod(walletSurface, WALLET_FILE, 384));
202
+ if (saveResult.isErr()) {
203
+ return saveResult;
204
+ }
205
+ log.info(`Created wallet: ${account.address}`);
206
+ log.info(`Saved to: ${WALLET_FILE}`);
207
+ const reconciled = await reconcileLegacyWallet(account, true);
208
+ return ok(reconciled);
209
+ }
210
+
211
+ // src/shared/redeem-invite.ts
212
+ import z3 from "zod";
213
+
214
+ // src/shared/state.ts
215
+ import z2 from "zod";
216
+ import fs from "fs";
217
+ var STATE_FILE = configFile("state.json");
218
+ var stateSchema = z2.looseObject({
219
+ redeemedCodes: z2.array(z2.string())
220
+ }).partial();
221
+ var getState = () => {
222
+ const stateFileExists = fs.existsSync(STATE_FILE);
223
+ if (!stateFileExists) {
224
+ fs.writeFileSync(STATE_FILE, "{}");
225
+ return {};
226
+ }
227
+ const stateFileContent = fs.readFileSync(STATE_FILE, "utf-8");
228
+ const result = stateSchema.safeParse(JSON.parse(stateFileContent));
229
+ if (!result.success) {
230
+ return {};
231
+ }
232
+ return result.data;
233
+ };
234
+ var setState = (state) => {
235
+ const existing = getState();
236
+ const newState = stateSchema.parse({ ...existing, ...state });
237
+ fs.writeFileSync(STATE_FILE, JSON.stringify(newState, null, 2));
238
+ };
239
+
240
+ // src/shared/redeem-invite.ts
241
+ var redeemInviteCode = async ({
242
+ code,
243
+ dev,
244
+ address,
245
+ surface
246
+ }) => {
247
+ const state = getState();
248
+ if (state.redeemedCodes?.includes(code)) {
249
+ return err("user", surface, {
250
+ cause: "conflict",
251
+ message: "This invite code has already been redeemed"
252
+ });
253
+ }
254
+ const result = await safeFetchJson(
255
+ surface,
256
+ new Request(`${getBaseUrl(dev)}/api/invite/redeem`, {
257
+ method: "POST",
258
+ headers: {
259
+ "Content-Type": "application/json"
260
+ },
261
+ body: JSON.stringify({
262
+ code,
263
+ recipientAddr: address
264
+ })
265
+ }),
266
+ z3.object({
267
+ redemptionId: z3.string(),
268
+ txHash: z3.string(),
269
+ amount: z3.coerce.number()
270
+ })
271
+ );
272
+ if (result.isOk()) {
273
+ setState({
274
+ redeemedCodes: [...state.redeemedCodes ?? [], code]
275
+ });
276
+ }
277
+ return result;
278
+ };
279
+
280
+ // src/shared/networks.ts
281
+ import {
282
+ base,
283
+ baseSepolia,
284
+ mainnet,
285
+ sepolia,
286
+ optimism,
287
+ arbitrum,
288
+ polygon
289
+ } from "viem/chains";
290
+ var CHAIN_CONFIGS = {
291
+ "eip155:8453": {
292
+ chain: base,
293
+ caip2: "eip155:8453",
294
+ v1Name: "base",
295
+ usdcAddress: "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"
296
+ },
297
+ "eip155:84532": {
298
+ chain: baseSepolia,
299
+ caip2: "eip155:84532",
300
+ v1Name: "base-sepolia",
301
+ usdcAddress: "0x036CbD53842c5426634e7929541eC2318f3dCF7e"
302
+ },
303
+ "eip155:1": {
304
+ chain: mainnet,
305
+ caip2: "eip155:1",
306
+ v1Name: "ethereum",
307
+ usdcAddress: "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"
308
+ },
309
+ "eip155:11155111": {
310
+ chain: sepolia,
311
+ caip2: "eip155:11155111",
312
+ v1Name: "ethereum-sepolia",
313
+ usdcAddress: "0x1c7D4B196Cb0C7B01d743Fbc6116a902379C7238"
314
+ },
315
+ "eip155:10": {
316
+ chain: optimism,
317
+ caip2: "eip155:10",
318
+ v1Name: "optimism",
319
+ usdcAddress: "0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85"
320
+ },
321
+ "eip155:42161": {
322
+ chain: arbitrum,
323
+ caip2: "eip155:42161",
324
+ v1Name: "arbitrum",
325
+ usdcAddress: "0xaf88d065e77c8cC2239327C5EDb3A432268e5831"
326
+ },
327
+ "eip155:137": {
328
+ chain: polygon,
329
+ caip2: "eip155:137",
330
+ v1Name: "polygon",
331
+ usdcAddress: "0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359"
332
+ }
333
+ };
334
+ var V1_TO_CAIP2 = {
335
+ base: "eip155:8453",
336
+ "base-sepolia": "eip155:84532",
337
+ ethereum: "eip155:1",
338
+ "ethereum-sepolia": "eip155:11155111",
339
+ optimism: "eip155:10",
340
+ arbitrum: "eip155:42161",
341
+ polygon: "eip155:137"
342
+ };
343
+ var DEFAULT_NETWORK = "eip155:8453";
344
+ function toCaip2(network) {
345
+ if (network.startsWith("eip155:")) return network;
346
+ return V1_TO_CAIP2[network.toLowerCase()] ?? network;
347
+ }
348
+ function getChainConfig(network) {
349
+ return CHAIN_CONFIGS[toCaip2(network)];
350
+ }
351
+ function getChainName(network) {
352
+ return getChainConfig(network)?.chain.name ?? network;
353
+ }
354
+
355
+ export {
356
+ DEFAULT_NETWORK,
357
+ getChainName,
358
+ safeStringifyJson,
359
+ safeParseJson,
360
+ getWallet,
361
+ redeemInviteCode
362
+ };
363
+ //# sourceMappingURL=chunk-VZL5QWWM.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/shared/wallet.ts","../../src/shared/neverthrow/json/index.ts","../../src/shared/redeem-invite.ts","../../src/shared/state.ts","../../src/shared/networks.ts"],"sourcesContent":["import { existsSync, readFileSync } from 'fs';\nimport { join } from 'path';\n\nimport { getAddress } from 'viem';\nimport { generatePrivateKey, privateKeyToAccount } from 'viem/accounts';\n\nimport z from 'zod';\n\nimport {\n ok,\n resultFromThrowable,\n resultFromPromise,\n} from '@x402scan/neverthrow';\n\nimport {\n fsErr,\n safeChmod,\n safeReadFile,\n safeWriteFile,\n} from '@/shared/neverthrow/fs';\nimport { jsonErr, safeParseJson } from '@/shared/neverthrow/json';\nimport { safeParse } from '@/shared/neverthrow/parse';\nimport { getBalance } from '@/shared/balance';\n\nimport { log } from './log';\nimport { configFile, LEGACY_DIRECTORY } from './fs';\n\nimport type { Hex } from 'viem';\nimport type { PrivateKeyAccount } from 'viem/accounts';\n\nconst WALLET_FILE = configFile('wallet.json');\n\nconst storedWalletSchema = z.object({\n privateKey: z\n .string()\n .regex(/^0x[a-fA-F0-9]{64}$/, 'Invalid Ethereum private key')\n .transform(privateKey => privateKey as Hex),\n address: z\n .string()\n .regex(/^0x[a-fA-F0-9]{40}$/, 'Invalid Ethereum address')\n .transform(address => getAddress(address)),\n createdAt: z.string(),\n});\n\nconst walletSurface = 'wallet';\n\nconst LEGACY_WALLET = join(LEGACY_DIRECTORY, 'wallet.json');\n\nconst reconcileSurface = 'wallet-reconcile';\n\nasync function reconcileLegacyWallet(\n current: PrivateKeyAccount,\n isNew: boolean\n): Promise<{ account: PrivateKeyAccount; isNew: boolean }> {\n const noChange = { account: current, isNew };\n\n // 1. No legacy wallet → nothing to reconcile\n if (!existsSync(LEGACY_WALLET)) {\n return noChange;\n }\n\n // 2. Read & parse legacy wallet\n const legacyResult = resultFromThrowable(\n 'wallet',\n reconcileSurface,\n () => {\n const raw = readFileSync(LEGACY_WALLET, 'utf-8');\n return storedWalletSchema.parse(JSON.parse(raw));\n },\n () => ({\n cause: 'file_not_readable' as const,\n message: 'Legacy wallet exists but is invalid',\n })\n );\n\n if (legacyResult.isErr()) {\n log.info('Legacy wallet exists but is invalid, skipping reconciliation');\n return noChange;\n }\n\n const legacyKey = legacyResult.value.privateKey;\n\n // 3. Same key → already reconciled\n const legacyAccount = privateKeyToAccount(legacyKey);\n if (legacyAccount.address === current.address) {\n return noChange;\n }\n\n // 4. Keys differ → check balances\n const flags = { dev: false };\n\n const balancesResult = await resultFromPromise(\n 'wallet',\n reconcileSurface,\n Promise.all([\n getBalance({\n address: legacyAccount.address,\n flags,\n surface: reconcileSurface,\n }),\n getBalance({\n address: current.address,\n flags,\n surface: reconcileSurface,\n }),\n ]),\n () => ({\n cause: 'balance_check' as const,\n message: 'Network error during wallet reconciliation',\n })\n );\n\n if (balancesResult.isErr()) {\n log.info('Network error during wallet reconciliation, skipping');\n return noChange;\n }\n\n const [legacyBalanceResult, currentBalanceResult] = balancesResult.value;\n\n if (legacyBalanceResult.isErr() || currentBalanceResult.isErr()) {\n log.info('Could not check balances for wallet reconciliation, skipping');\n return noChange;\n }\n\n const legacyBalance = legacyBalanceResult.value.balance;\n const currentBalance = currentBalanceResult.value.balance;\n\n // 4a. Legacy has balance, current is empty → recover legacy\n if (legacyBalance > 0 && currentBalance === 0) {\n log.info(\n `Recovering funded legacy wallet ${legacyAccount.address} (balance: ${legacyBalance})`\n );\n const stored = {\n privateKey: legacyKey,\n address: legacyAccount.address,\n createdAt: new Date().toISOString(),\n };\n const writeResult = await safeWriteFile(\n reconcileSurface,\n WALLET_FILE,\n JSON.stringify(stored, null, 2)\n ).andThen(() => safeChmod(reconcileSurface, WALLET_FILE, 0o600));\n\n if (writeResult.isErr()) {\n log.error(\n `Failed to write recovered wallet: ${writeResult.error.message}`\n );\n return noChange;\n }\n\n return { account: legacyAccount, isNew: false };\n }\n\n // 4b. Both have balance → manual intervention needed\n if (legacyBalance > 0 && currentBalance > 0) {\n log.info(\n `Both wallets have funds. Current: ${current.address} (${currentBalance}), Legacy: ${legacyAccount.address} (${legacyBalance}). ` +\n `Manually copy ${LEGACY_WALLET} to ${WALLET_FILE} if you want to use the legacy wallet.`\n );\n return noChange;\n }\n\n // 4c. Legacy has no balance → nothing to recover\n return noChange;\n}\n\nexport async function getWallet() {\n if (process.env.X402_PRIVATE_KEY) {\n const account = privateKeyToAccount(process.env.X402_PRIVATE_KEY as Hex);\n log.info(`Using wallet from env: ${account.address}`);\n return ok({ account, isNew: false });\n }\n\n const readFileResult = await safeReadFile(walletSurface, WALLET_FILE);\n\n if (!readFileResult.isOk()) {\n const fileExistsResult = existsSync(WALLET_FILE);\n // file exists but is not readable\n if (fileExistsResult) {\n return fsErr(walletSurface, {\n cause: 'file_not_readable',\n message: `The file exists but is not readable. Fix corrupted state file: ${WALLET_FILE}`,\n });\n }\n }\n\n if (readFileResult.isOk()) {\n const data = readFileResult.value;\n const jsonParseResult = safeParseJson(walletSurface, data);\n\n // file exists but is not valid JSON\n if (jsonParseResult.isErr()) {\n return jsonErr(walletSurface, {\n cause: 'parse',\n message: `The data in ${WALLET_FILE} is not valid JSON`,\n });\n }\n\n const parseResult = safeParse(\n walletSurface,\n storedWalletSchema,\n jsonParseResult.value\n );\n\n // file has valid JSON but is not a valid wallet configuration\n if (parseResult.isErr()) {\n return parseResult;\n }\n\n const account = privateKeyToAccount(parseResult.value.privateKey);\n log.info(`Loaded wallet: ${account.address}`);\n const reconciled = await reconcileLegacyWallet(account, false);\n return ok(reconciled);\n }\n\n // Generate new\n const privateKey = generatePrivateKey();\n const account = privateKeyToAccount(privateKey);\n const stored = {\n privateKey,\n address: account.address,\n createdAt: new Date().toISOString(),\n };\n\n const saveResult = await safeWriteFile(\n walletSurface,\n WALLET_FILE,\n JSON.stringify(stored, null, 2)\n ).andThen(() => safeChmod(walletSurface, WALLET_FILE, 0o600));\n\n if (saveResult.isErr()) {\n return saveResult;\n }\n\n log.info(`Created wallet: ${account.address}`);\n log.info(`Saved to: ${WALLET_FILE}`);\n\n const reconciled = await reconcileLegacyWallet(account, true);\n return ok(reconciled);\n}\n","import { err, resultFromThrowable } from '@x402scan/neverthrow';\n\nimport type { BaseJsonError, JsonObject } from './types';\n\nconst type = 'json';\n\nexport const jsonErr = (surface: string, error: BaseJsonError) => {\n return err(type, surface, error);\n};\n\nexport const safeStringifyJson = (surface: string, value: JsonObject) => {\n return resultFromThrowable(\n type,\n surface,\n () => JSON.stringify(value, null, 2),\n () => ({\n cause: 'stringify' as const,\n message: 'Could not stringify JSON',\n })\n );\n};\n\nexport const safeParseJson = (surface: string, value: string) => {\n return resultFromThrowable(\n type,\n surface,\n () => JSON.parse(value) as JsonObject,\n e => ({\n cause: 'parse' as const,\n message: e instanceof Error ? e.message : 'Could not parse JSON',\n })\n );\n};\n","import z from 'zod';\n\nimport { safeFetchJson } from '@/shared/neverthrow/fetch';\nimport { err } from '@x402scan/neverthrow';\n\nimport { getBaseUrl } from './utils';\nimport { getState, setState } from './state';\n\nimport type { Address } from 'viem';\n\nexport interface RedeemInviteProps {\n code: string;\n dev: boolean;\n address: Address;\n surface: string;\n}\n\nexport const redeemInviteCode = async ({\n code,\n dev,\n address,\n surface,\n}: RedeemInviteProps) => {\n const state = getState();\n\n if (state.redeemedCodes?.includes(code)) {\n return err('user', surface, {\n cause: 'conflict',\n message: 'This invite code has already been redeemed',\n });\n }\n\n const result = await safeFetchJson(\n surface,\n new Request(`${getBaseUrl(dev)}/api/invite/redeem`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n code,\n recipientAddr: address,\n }),\n }),\n z.object({\n redemptionId: z.string(),\n txHash: z.string(),\n amount: z.coerce.number(),\n })\n );\n\n if (result.isOk()) {\n setState({\n redeemedCodes: [...(state.redeemedCodes ?? []), code],\n });\n }\n\n return result;\n};\n","import z from 'zod';\nimport fs from 'fs';\n\nimport { configFile } from './fs';\n\nconst STATE_FILE = configFile('state.json');\n\nconst stateSchema = z\n .looseObject({\n redeemedCodes: z.array(z.string()),\n })\n .partial();\n\nexport const getState = () => {\n const stateFileExists = fs.existsSync(STATE_FILE);\n if (!stateFileExists) {\n fs.writeFileSync(STATE_FILE, '{}');\n return {};\n }\n\n const stateFileContent = fs.readFileSync(STATE_FILE, 'utf-8');\n const result = stateSchema.safeParse(JSON.parse(stateFileContent));\n if (!result.success) {\n return {};\n }\n return result.data;\n};\n\nexport const setState = (state: z.infer<typeof stateSchema>) => {\n const existing = getState();\n const newState = stateSchema.parse({ ...existing, ...state });\n fs.writeFileSync(STATE_FILE, JSON.stringify(newState, null, 2));\n};\n","import {\n base,\n baseSepolia,\n mainnet,\n sepolia,\n optimism,\n arbitrum,\n polygon,\n} from 'viem/chains';\n\nimport type { Chain } from 'viem';\n\nexport interface ChainConfig {\n chain: Chain;\n caip2: string;\n v1Name: string;\n usdcAddress: `0x${string}`;\n}\n\nconst CHAIN_CONFIGS: Record<string, ChainConfig> = {\n 'eip155:8453': {\n chain: base,\n caip2: 'eip155:8453',\n v1Name: 'base',\n usdcAddress: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913',\n },\n 'eip155:84532': {\n chain: baseSepolia,\n caip2: 'eip155:84532',\n v1Name: 'base-sepolia',\n usdcAddress: '0x036CbD53842c5426634e7929541eC2318f3dCF7e',\n },\n 'eip155:1': {\n chain: mainnet,\n caip2: 'eip155:1',\n v1Name: 'ethereum',\n usdcAddress: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',\n },\n 'eip155:11155111': {\n chain: sepolia,\n caip2: 'eip155:11155111',\n v1Name: 'ethereum-sepolia',\n usdcAddress: '0x1c7D4B196Cb0C7B01d743Fbc6116a902379C7238',\n },\n 'eip155:10': {\n chain: optimism,\n caip2: 'eip155:10',\n v1Name: 'optimism',\n usdcAddress: '0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85',\n },\n 'eip155:42161': {\n chain: arbitrum,\n caip2: 'eip155:42161',\n v1Name: 'arbitrum',\n usdcAddress: '0xaf88d065e77c8cC2239327C5EDb3A432268e5831',\n },\n 'eip155:137': {\n chain: polygon,\n caip2: 'eip155:137',\n v1Name: 'polygon',\n usdcAddress: '0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359',\n },\n};\n\nconst V1_TO_CAIP2: Record<string, string> = {\n base: 'eip155:8453',\n 'base-sepolia': 'eip155:84532',\n ethereum: 'eip155:1',\n 'ethereum-sepolia': 'eip155:11155111',\n optimism: 'eip155:10',\n arbitrum: 'eip155:42161',\n polygon: 'eip155:137',\n};\n\nexport const DEFAULT_NETWORK = 'eip155:8453';\n\n/** Convert any network identifier to CAIP-2 format */\nexport function toCaip2(network: string): string {\n if (network.startsWith('eip155:')) return network;\n return V1_TO_CAIP2[network.toLowerCase()] ?? network;\n}\n\n/** Get chain config from network identifier */\nexport function getChainConfig(network: string): ChainConfig | undefined {\n return CHAIN_CONFIGS[toCaip2(network)];\n}\n\n/** Get USDC address for a network */\nexport function getUSDCAddress(network: string): `0x${string}` | undefined {\n return getChainConfig(network)?.usdcAddress;\n}\n\n/** Extract chain ID from CAIP-2 identifier */\nexport function getChainId(network: string): number | undefined {\n const caip2 = toCaip2(network);\n const match = /^eip155:(\\d+)$/.exec(caip2);\n return match ? parseInt(match[1]!, 10) : undefined;\n}\n\n/** Get human-readable chain name */\nexport function getChainName(network: string): string {\n return getChainConfig(network)?.chain.name ?? network;\n}\n\n/** Check if network is a testnet */\nexport function isTestnet(network: string): boolean {\n return getChainConfig(network)?.chain.testnet === true;\n}\n"],"mappings":"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","names":["account","reconciled","z","z","z","z"]}
@@ -1,9 +1,4 @@
1
- import {
2
- init_esm_shims
3
- } from "./chunk-A2KI7TKE.js";
4
-
5
1
  // src/server/tools/lib/request.ts
6
- init_esm_shims();
7
2
  import z from "zod";
8
3
  var requestSchema = z.object({
9
4
  url: z.url().describe("The endpoint URL"),
@@ -33,4 +28,4 @@ export {
33
28
  requestSchema,
34
29
  buildRequest
35
30
  };
36
- //# sourceMappingURL=chunk-FYIUFEVS.js.map
31
+ //# sourceMappingURL=chunk-XXKBL2AC.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/server/tools/lib/request.ts"],"sourcesContent":["import z from 'zod';\n\nimport type { Address } from 'viem';\n\nexport const requestSchema = z.object({\n url: z.url().describe('The endpoint URL'),\n method: z\n .enum(['GET', 'POST', 'PUT', 'DELETE', 'PATCH'])\n .default('GET')\n .describe('HTTP method'),\n body: z\n .unknown()\n .optional()\n .describe('Request body for POST/PUT/PATCH methods'),\n headers: z\n .record(z.string(), z.string())\n .optional()\n .describe('Additional headers to include')\n .default({}),\n});\n\ninterface BuildRequestProps {\n input: z.infer<typeof requestSchema>;\n address?: Address;\n sessionId?: string;\n provider?: string;\n}\n\nexport const buildRequest = ({\n input,\n address,\n sessionId,\n provider,\n}: BuildRequestProps) => {\n return new Request(input.url, {\n method: input.method,\n body: input.body\n ? typeof input.body === 'string'\n ? input.body\n : JSON.stringify(input.body)\n : undefined,\n headers: {\n ...(input.body ? { 'Content-Type': 'application/json' } : {}),\n ...input.headers,\n ...(address\n ? { 'X-Wallet-Address': address, 'X-Client-ID': provider }\n : {}),\n ...(sessionId ? { 'X-Session-ID': sessionId } : {}),\n },\n });\n};\n"],"mappings":";;;;;AAAA;AAAA,OAAO,OAAO;AAIP,IAAM,gBAAgB,EAAE,OAAO;AAAA,EACpC,KAAK,EAAE,IAAI,EAAE,SAAS,kBAAkB;AAAA,EACxC,QAAQ,EACL,KAAK,CAAC,OAAO,QAAQ,OAAO,UAAU,OAAO,CAAC,EAC9C,QAAQ,KAAK,EACb,SAAS,aAAa;AAAA,EACzB,MAAM,EACH,QAAQ,EACR,SAAS,EACT,SAAS,yCAAyC;AAAA,EACrD,SAAS,EACN,OAAO,EAAE,OAAO,GAAG,EAAE,OAAO,CAAC,EAC7B,SAAS,EACT,SAAS,+BAA+B,EACxC,QAAQ,CAAC,CAAC;AACf,CAAC;AASM,IAAM,eAAe,CAAC;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAyB;AACvB,SAAO,IAAI,QAAQ,MAAM,KAAK;AAAA,IAC5B,QAAQ,MAAM;AAAA,IACd,MAAM,MAAM,OACR,OAAO,MAAM,SAAS,WACpB,MAAM,OACN,KAAK,UAAU,MAAM,IAAI,IAC3B;AAAA,IACJ,SAAS;AAAA,MACP,GAAI,MAAM,OAAO,EAAE,gBAAgB,mBAAmB,IAAI,CAAC;AAAA,MAC3D,GAAG,MAAM;AAAA,MACT,GAAI,UACA,EAAE,oBAAoB,SAAS,eAAe,SAAS,IACvD,CAAC;AAAA,MACL,GAAI,YAAY,EAAE,gBAAgB,UAAU,IAAI,CAAC;AAAA,IACnD;AAAA,EACF,CAAC;AACH;","names":[]}
1
+ {"version":3,"sources":["../../src/server/tools/lib/request.ts"],"sourcesContent":["import z from 'zod';\n\nimport type { Address } from 'viem';\n\nexport const requestSchema = z.object({\n url: z.url().describe('The endpoint URL'),\n method: z\n .enum(['GET', 'POST', 'PUT', 'DELETE', 'PATCH'])\n .default('GET')\n .describe('HTTP method'),\n body: z\n .unknown()\n .optional()\n .describe('Request body for POST/PUT/PATCH methods'),\n headers: z\n .record(z.string(), z.string())\n .optional()\n .describe('Additional headers to include')\n .default({}),\n});\n\ninterface BuildRequestProps {\n input: z.infer<typeof requestSchema>;\n address?: Address;\n sessionId?: string;\n provider?: string;\n}\n\nexport const buildRequest = ({\n input,\n address,\n sessionId,\n provider,\n}: BuildRequestProps) => {\n return new Request(input.url, {\n method: input.method,\n body: input.body\n ? typeof input.body === 'string'\n ? input.body\n : JSON.stringify(input.body)\n : undefined,\n headers: {\n ...(input.body ? { 'Content-Type': 'application/json' } : {}),\n ...input.headers,\n ...(address\n ? { 'X-Wallet-Address': address, 'X-Client-ID': provider }\n : {}),\n ...(sessionId ? { 'X-Session-ID': sessionId } : {}),\n },\n });\n};\n"],"mappings":";AAAA,OAAO,OAAO;AAIP,IAAM,gBAAgB,EAAE,OAAO;AAAA,EACpC,KAAK,EAAE,IAAI,EAAE,SAAS,kBAAkB;AAAA,EACxC,QAAQ,EACL,KAAK,CAAC,OAAO,QAAQ,OAAO,UAAU,OAAO,CAAC,EAC9C,QAAQ,KAAK,EACb,SAAS,aAAa;AAAA,EACzB,MAAM,EACH,QAAQ,EACR,SAAS,EACT,SAAS,yCAAyC;AAAA,EACrD,SAAS,EACN,OAAO,EAAE,OAAO,GAAG,EAAE,OAAO,CAAC,EAC7B,SAAS,EACT,SAAS,+BAA+B,EACxC,QAAQ,CAAC,CAAC;AACf,CAAC;AASM,IAAM,eAAe,CAAC;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAyB;AACvB,SAAO,IAAI,QAAQ,MAAM,KAAK;AAAA,IAC5B,QAAQ,MAAM;AAAA,IACd,MAAM,MAAM,OACR,OAAO,MAAM,SAAS,WACpB,MAAM,OACN,KAAK,UAAU,MAAM,IAAI,IAC3B;AAAA,IACJ,SAAS;AAAA,MACP,GAAI,MAAM,OAAO,EAAE,gBAAgB,mBAAmB,IAAI,CAAC;AAAA,MAC3D,GAAG,MAAM;AAAA,MACT,GAAI,UACA,EAAE,oBAAoB,SAAS,eAAe,SAAS,IACvD,CAAC;AAAA,MACL,GAAI,YAAY,EAAE,gBAAgB,UAAU,IAAI,CAAC;AAAA,IACnD;AAAA,EACF,CAAC;AACH;","names":[]}
@@ -0,0 +1,22 @@
1
+ // src/shared/version.ts
2
+ import { readFileSync } from "fs";
3
+ import { dirname, join } from "path";
4
+ import { fileURLToPath } from "url";
5
+ function getVersion() {
6
+ if (true) {
7
+ return "0.3.2";
8
+ }
9
+ const __dirname2 = dirname(fileURLToPath(import.meta.url));
10
+ const pkg = JSON.parse(
11
+ readFileSync(join(__dirname2, "../../package.json"), "utf-8")
12
+ );
13
+ return pkg.version;
14
+ }
15
+ var MCP_VERSION = getVersion();
16
+ var DIST_TAG = MCP_VERSION.includes("-beta") ? "beta" : "latest";
17
+
18
+ export {
19
+ MCP_VERSION,
20
+ DIST_TAG
21
+ };
22
+ //# sourceMappingURL=chunk-ZVDFFTHM.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/shared/version.ts"],"sourcesContent":["import { readFileSync } from 'fs';\nimport { dirname, join } from 'path';\nimport { fileURLToPath } from 'url';\n\ndeclare const __MCP_VERSION__: string | undefined;\n\nfunction getVersion(): string {\n if (typeof __MCP_VERSION__ !== 'undefined') {\n return __MCP_VERSION__;\n }\n // Fallback for dev mode (tsx)\n const __dirname = dirname(fileURLToPath(import.meta.url));\n const pkg = JSON.parse(\n readFileSync(join(__dirname, '../../package.json'), 'utf-8')\n ) as { version: string };\n return pkg.version;\n}\n\nexport const MCP_VERSION = getVersion();\n\nexport const DIST_TAG = MCP_VERSION.includes('-beta') ? 'beta' : 'latest';\n"],"mappings":";AAAA,SAAS,oBAAoB;AAC7B,SAAS,SAAS,YAAY;AAC9B,SAAS,qBAAqB;AAI9B,SAAS,aAAqB;AAC5B,MAAI,MAAwC;AAC1C,WAAO;AAAA,EACT;AAEA,QAAMA,aAAY,QAAQ,cAAc,YAAY,GAAG,CAAC;AACxD,QAAM,MAAM,KAAK;AAAA,IACf,aAAa,KAAKA,YAAW,oBAAoB,GAAG,OAAO;AAAA,EAC7D;AACA,SAAO,IAAI;AACb;AAEO,IAAM,cAAc,WAAW;AAE/B,IAAM,WAAW,YAAY,SAAS,OAAO,IAAI,SAAS;","names":["__dirname"]}
@@ -0,0 +1,9 @@
1
+ import {
2
+ configureCliContext,
3
+ isVerbose
4
+ } from "./chunk-ISR6DJ53.js";
5
+ export {
6
+ configureCliContext,
7
+ isVerbose
8
+ };
9
+ //# sourceMappingURL=cli-context-JTXXAIO4.js.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  buildRequest,
3
3
  requestSchema
4
- } from "./chunk-FYIUFEVS.js";
4
+ } from "./chunk-XXKBL2AC.js";
5
5
  import {
6
6
  checkEndpoint,
7
7
  createFetchWithPayment,
@@ -10,36 +10,25 @@ import {
10
10
  safeGetPaymentSettlement,
11
11
  submitErrorReport,
12
12
  tokenStringToNumber
13
- } from "./chunk-VTLIFNZN.js";
14
- import "./chunk-YOLNSINZ.js";
13
+ } from "./chunk-E3MKYUQQ.js";
14
+ import "./chunk-ZVDFFTHM.js";
15
15
  import {
16
+ DEFAULT_NETWORK,
16
17
  getWallet,
17
18
  redeemInviteCode,
18
19
  safeParseJson
19
- } from "./chunk-JVUT4TKE.js";
20
+ } from "./chunk-VZL5QWWM.js";
20
21
  import {
21
- DEFAULT_NETWORK,
22
22
  safeParseResponse
23
- } from "./chunk-2OAFWAAC.js";
24
- import "./chunk-J3LUL7DB.js";
25
- import {
26
- init_esm_shims
27
- } from "./chunk-A2KI7TKE.js";
28
-
29
- // src/cli/commands/index.ts
30
- init_esm_shims();
23
+ } from "./chunk-VX2WPSZV.js";
24
+ import "./chunk-ISR6DJ53.js";
31
25
 
32
26
  // src/cli/commands/fetch.ts
33
- init_esm_shims();
34
27
  import { randomBytes } from "crypto";
35
28
  import { x402Client, x402HTTPClient } from "@x402/core/client";
36
29
  import { ExactEvmScheme } from "@x402/evm/exact/client";
37
30
 
38
- // src/cli/output/index.ts
39
- init_esm_shims();
40
-
41
31
  // src/cli/output/types.ts
42
- init_esm_shims();
43
32
  var errorCodeToExitCode = {
44
33
  GENERAL_ERROR: 1 /* GeneralError */,
45
34
  INSUFFICIENT_BALANCE: 2 /* InsufficientBalance */,
@@ -53,7 +42,6 @@ var errorCodeToExitCode = {
53
42
  };
54
43
 
55
44
  // src/cli/output/format.ts
56
- init_esm_shims();
57
45
  function isTTY() {
58
46
  return process.stdout.isTTY ?? false;
59
47
  }
@@ -68,7 +56,6 @@ function isQuiet(quietFlag) {
68
56
  }
69
57
 
70
58
  // src/cli/output/response.ts
71
- init_esm_shims();
72
59
  import chalk from "chalk";
73
60
  function successResponse(data, metadata) {
74
61
  return {
@@ -171,11 +158,7 @@ function output(response, format = "json", quiet = false) {
171
158
  }
172
159
  }
173
160
 
174
- // src/cli/commands/lib/index.ts
175
- init_esm_shims();
176
-
177
161
  // src/cli/commands/lib/get-wallet-or-exit.ts
178
- init_esm_shims();
179
162
  async function getWalletOrExit(flags) {
180
163
  const walletResult = await getWallet();
181
164
  if (walletResult.isErr()) {
@@ -185,7 +168,6 @@ async function getWalletOrExit(flags) {
185
168
  }
186
169
 
187
170
  // src/cli/commands/lib/parse-request-input.ts
188
- init_esm_shims();
189
171
  function parseRequestInput(surface, args, flags) {
190
172
  let parsedBody;
191
173
  if (args.body) {
@@ -341,7 +323,6 @@ async function fetchCommand(args, flags) {
341
323
  }
342
324
 
343
325
  // src/cli/commands/check.ts
344
- init_esm_shims();
345
326
  import { randomBytes as randomBytes2 } from "crypto";
346
327
  var SURFACE2 = "cli:check";
347
328
  async function checkCommand(args, flags) {
@@ -417,7 +398,6 @@ async function checkCommand(args, flags) {
417
398
  }
418
399
 
419
400
  // src/cli/commands/discover.ts
420
- init_esm_shims();
421
401
  async function discoverCommand(args, flags) {
422
402
  const result = await discoverResources("cli:discover", args.url);
423
403
  if (result.isOk()) {
@@ -445,7 +425,6 @@ async function discoverCommand(args, flags) {
445
425
  }
446
426
 
447
427
  // src/cli/commands/wallet.ts
448
- init_esm_shims();
449
428
  var SURFACE3 = "cli:wallet";
450
429
  async function walletInfoCommand(_args, flags) {
451
430
  const { account } = await getWalletOrExit(flags);
@@ -456,9 +435,11 @@ async function walletInfoCommand(_args, flags) {
456
435
  return outputAndExit(
457
436
  successResponse({
458
437
  address: result.value.address,
459
- network: result.value.network,
460
- networkName: result.value.networkName,
461
- usdcBalance: result.value.usdcBalance,
438
+ balance: result.value.balance,
439
+ chains: result.value.chains.map((c) => ({
440
+ chain: c.chain,
441
+ balance: c.balance
442
+ })),
462
443
  isNewWallet: result.value.isNewWallet,
463
444
  depositLink: result.value.depositLink,
464
445
  ...result.value.message ? { message: result.value.message } : {}
@@ -488,7 +469,6 @@ async function walletRedeemCommand(args, flags) {
488
469
  }
489
470
 
490
471
  // src/cli/commands/report-error.ts
491
- init_esm_shims();
492
472
  var SURFACE4 = "cli:report-error";
493
473
  async function reportErrorCommand(args, flags) {
494
474
  const { account } = await getWalletOrExit(flags);
@@ -519,9 +499,8 @@ async function reportErrorCommand(args, flags) {
519
499
  }
520
500
 
521
501
  // src/cli/commands/server.ts
522
- init_esm_shims();
523
502
  async function serverCommand(flags) {
524
- const { startServer } = await import("./server-SKKWDRW7.js");
503
+ const { startServer } = await import("./server-XNUVCZTJ.js");
525
504
  await startServer(flags);
526
505
  }
527
506
  export {
@@ -533,4 +512,4 @@ export {
533
512
  walletInfoCommand,
534
513
  walletRedeemCommand
535
514
  };
536
- //# sourceMappingURL=commands-WQ5AY36Z.js.map
515
+ //# sourceMappingURL=commands-IANPQPZS.js.map