@antseed/cli 0.1.148 → 0.1.150

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 (94) hide show
  1. package/README.md +51 -17
  2. package/dist/cli/commands/buyer/activity.d.ts +3 -0
  3. package/dist/cli/commands/buyer/activity.d.ts.map +1 -0
  4. package/dist/cli/commands/buyer/activity.js +555 -0
  5. package/dist/cli/commands/buyer/activity.js.map +1 -0
  6. package/dist/cli/commands/buyer/daemon.d.ts +13 -0
  7. package/dist/cli/commands/buyer/daemon.d.ts.map +1 -0
  8. package/dist/cli/commands/buyer/daemon.js +39 -0
  9. package/dist/cli/commands/buyer/daemon.js.map +1 -0
  10. package/dist/cli/commands/buyer/deposit.d.ts +8 -0
  11. package/dist/cli/commands/buyer/deposit.d.ts.map +1 -1
  12. package/dist/cli/commands/buyer/deposit.js +338 -25
  13. package/dist/cli/commands/buyer/deposit.js.map +1 -1
  14. package/dist/cli/commands/buyer/index.d.ts.map +1 -1
  15. package/dist/cli/commands/buyer/index.js +2 -0
  16. package/dist/cli/commands/buyer/index.js.map +1 -1
  17. package/dist/cli/commands/buyer/start.d.ts +1 -0
  18. package/dist/cli/commands/buyer/start.d.ts.map +1 -1
  19. package/dist/cli/commands/buyer/start.js +53 -10
  20. package/dist/cli/commands/buyer/start.js.map +1 -1
  21. package/dist/cli/commands/buyer/start.test.js +30 -1
  22. package/dist/cli/commands/buyer/start.test.js.map +1 -1
  23. package/dist/cli/commands/buyer/sweep.d.ts.map +1 -1
  24. package/dist/cli/commands/buyer/sweep.js +17 -17
  25. package/dist/cli/commands/buyer/sweep.js.map +1 -1
  26. package/dist/cli/commands/network/browse.d.ts.map +1 -1
  27. package/dist/cli/commands/network/browse.js +65 -114
  28. package/dist/cli/commands/network/browse.js.map +1 -1
  29. package/dist/cli/commands/payments.d.ts.map +1 -1
  30. package/dist/cli/commands/payments.js +29 -34
  31. package/dist/cli/commands/payments.js.map +1 -1
  32. package/dist/cli/commands/seller/start.d.ts.map +1 -1
  33. package/dist/cli/commands/seller/start.js +4 -1
  34. package/dist/cli/commands/seller/start.js.map +1 -1
  35. package/dist/cli/commands/seller/start.test.js +15 -0
  36. package/dist/cli/commands/seller/start.test.js.map +1 -1
  37. package/dist/cli/index.js +2 -0
  38. package/dist/cli/index.js.map +1 -1
  39. package/dist/config/defaults.d.ts.map +1 -1
  40. package/dist/config/defaults.js +7 -0
  41. package/dist/config/defaults.js.map +1 -1
  42. package/dist/config/loader.d.ts.map +1 -1
  43. package/dist/config/loader.js +41 -0
  44. package/dist/config/loader.js.map +1 -1
  45. package/dist/config/loader.test.js +52 -0
  46. package/dist/config/loader.test.js.map +1 -1
  47. package/dist/config/types.d.ts +10 -0
  48. package/dist/config/types.d.ts.map +1 -1
  49. package/dist/config/validation.d.ts.map +1 -1
  50. package/dist/config/validation.js +17 -0
  51. package/dist/config/validation.js.map +1 -1
  52. package/dist/generated/baked-defaults.d.ts +15 -0
  53. package/dist/generated/baked-defaults.d.ts.map +1 -0
  54. package/dist/generated/baked-defaults.js +15 -0
  55. package/dist/generated/baked-defaults.js.map +1 -0
  56. package/dist/plugins/manager.d.ts +1 -0
  57. package/dist/plugins/manager.d.ts.map +1 -1
  58. package/dist/plugins/manager.js +15 -4
  59. package/dist/plugins/manager.js.map +1 -1
  60. package/dist/plugins/manager.test.d.ts +2 -0
  61. package/dist/plugins/manager.test.d.ts.map +1 -0
  62. package/dist/plugins/manager.test.js +15 -0
  63. package/dist/plugins/manager.test.js.map +1 -0
  64. package/dist/proxy/buyer-proxy.d.ts +31 -2
  65. package/dist/proxy/buyer-proxy.d.ts.map +1 -1
  66. package/dist/proxy/buyer-proxy.js +481 -59
  67. package/dist/proxy/buyer-proxy.js.map +1 -1
  68. package/dist/proxy/buyer-proxy.test.js +894 -56
  69. package/dist/proxy/buyer-proxy.test.js.map +1 -1
  70. package/dist/proxy/conversation-store.d.ts +6 -6
  71. package/dist/proxy/conversation-store.d.ts.map +1 -1
  72. package/dist/proxy/conversation-store.js +16 -0
  73. package/dist/proxy/conversation-store.js.map +1 -1
  74. package/dist/proxy/deposit-watcher.d.ts +125 -0
  75. package/dist/proxy/deposit-watcher.d.ts.map +1 -0
  76. package/dist/proxy/deposit-watcher.js +306 -0
  77. package/dist/proxy/deposit-watcher.js.map +1 -0
  78. package/dist/proxy/deposit-watcher.test.d.ts +2 -0
  79. package/dist/proxy/deposit-watcher.test.d.ts.map +1 -0
  80. package/dist/proxy/deposit-watcher.test.js +173 -0
  81. package/dist/proxy/deposit-watcher.test.js.map +1 -0
  82. package/dist/proxy/network-models.d.ts +76 -0
  83. package/dist/proxy/network-models.d.ts.map +1 -0
  84. package/dist/proxy/network-models.js +229 -0
  85. package/dist/proxy/network-models.js.map +1 -0
  86. package/dist/proxy/network-models.test.d.ts +2 -0
  87. package/dist/proxy/network-models.test.d.ts.map +1 -0
  88. package/dist/proxy/network-models.test.js +734 -0
  89. package/dist/proxy/network-models.test.js.map +1 -0
  90. package/dist/proxy/routing.d.ts +3 -1
  91. package/dist/proxy/routing.d.ts.map +1 -1
  92. package/dist/proxy/routing.js +69 -16
  93. package/dist/proxy/routing.js.map +1 -1
  94. package/package.json +6 -5
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daemon.js","sourceRoot":"","sources":["../../../../src/cli/commands/buyer/daemon.ts"],"names":[],"mappings":"AAGA,4EAA4E;AAC5E,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,IAAY,EACZ,IAAY,EACZ,IAAkB,EAClB,SAAS,GAAG,MAAM;IAElB,IAAI,CAAC;QACH,OAAO,MAAM,KAAK,CAAC,oBAAoB,IAAI,GAAG,IAAI,EAAE,EAAE;YACpD,GAAG,IAAI;YACP,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC;SACvC,CAAC,CAAA;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC;AAED,0EAA0E;AAC1E,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAY,EAAE,IAAY,EAAE,SAAS,GAAG,KAAK;IAC5E,MAAM,GAAG,GAAG,MAAM,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,CAAC,CAAA;IAC/D,IAAI,CAAC,GAAG,EAAE,EAAE;QAAE,OAAO,IAAI,CAAA;IACzB,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAA;IAC/C,OAAO,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAA+B,CAAC,CAAC,CAAC,IAAI,CAAA;AAC1G,CAAC;AAOD,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,IAAY;IACrD,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,IAAI,EAAE,2BAA2B,EAAE,KAAK,CAAC,CAAA;IACvE,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI;QAAE,OAAO,IAAI,CAAA;IAC7C,OAAO;QACL,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI;QACjC,MAAM,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAgC;KAChE,CAAA;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,IAAY,EAAE,IAA6B;IAClF,MAAM,GAAG,GAAG,MAAM,WAAW,CAAC,IAAI,EAAE,0BAA0B,EAAE;QAC9D,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,CAAC;KAC/B,EAAE,KAAK,CAAC,CAAA;IACT,MAAM,IAAI,GAAG,MAAM,GAAG,EAAE,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAA4B,CAAA;IAC3E,OAAO,IAAI,EAAE,EAAE,KAAK,IAAI,CAAA;AAC1B,CAAC"}
@@ -1,3 +1,11 @@
1
1
  import type { Command } from 'commander';
2
+ export interface DepositCommandOptions {
3
+ amount?: string;
4
+ watch: boolean;
5
+ onchain?: string;
6
+ }
7
+ export declare function runDepositAction(cmd: Command, options: DepositCommandOptions): Promise<void>;
2
8
  export declare function registerBuyerDepositCommand(buyerCmd: Command): void;
9
+ /** Hidden top-level alias: `antseed deposit` → `antseed buyer deposit`. */
10
+ export declare function registerDepositAlias(program: Command): void;
3
11
  //# sourceMappingURL=deposit.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"deposit.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/buyer/deposit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAWzC,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAkCnE"}
1
+ {"version":3,"file":"deposit.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/buyer/deposit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AA8BxC,MAAM,WAAW,qBAAqB;IACpC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,OAAO,CAAA;IACd,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAySD,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CA0DlG;AASD,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAQnE;AAED,2EAA2E;AAC3E,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAK3D"}
@@ -1,38 +1,351 @@
1
1
  import chalk from 'chalk';
2
2
  import ora from 'ora';
3
+ import QRCode from 'qrcode';
3
4
  import { getGlobalOptions } from '../types.js';
4
5
  import { loadConfig } from '../../../config/loader.js';
5
- import { createDepositsClient, loadCryptoContext, parseUsdcToBaseUnits, } from '../../payment-utils.js';
6
- export function registerBuyerDepositCommand(buyerCmd) {
7
- buyerCmd
8
- .command('deposit <amount>')
9
- .description('Deposit USDC into the deposits contract (amount in human-readable USDC, e.g. "5" = 5 USDC)')
10
- .action(async (amount) => {
11
- const globalOpts = getGlobalOptions(buyerCmd);
12
- const config = await loadConfig(globalOpts.config);
13
- let amountBaseUnits;
6
+ import { loadCryptoContext, createDepositsClient, createDepositRelayClient, requireCryptoConfig, formatUsdc, parseUsdcToBaseUnits, } from '../../payment-utils.js';
7
+ import { AntseedNode, peerRelaysSweeps } from '@antseed/node';
8
+ import { parseBootstrapList, toBootstrapConfig } from '@antseed/node/discovery';
9
+ import { buildBuyerBootstrapEntries } from './start.js';
10
+ import { DepositWatcher, } from '../../../proxy/deposit-watcher.js';
11
+ import { daemonDepositsStatus, daemonSetWatchMode } from './daemon.js';
12
+ const DAEMON_STATUS_POLL_MS = 1_000;
13
+ const BALANCE_CHECK_INTERVAL_MS = 5_000;
14
+ const MAX_PEERS_TO_CONNECT = 4;
15
+ const PAYMENTS_PORT = 3118;
16
+ function sleep(ms) {
17
+ return new Promise((resolve) => setTimeout(resolve, ms));
18
+ }
19
+ /** EIP-681 payment request: opens a prefilled USDC transfer in mobile wallets. */
20
+ function buildPaymentUri(usdcAddress, evmChainId, address, amountBaseUnits) {
21
+ const base = `ethereum:${usdcAddress}@${evmChainId}/transfer?address=${address}`;
22
+ return amountBaseUnits ? `${base}&uint256=${amountBaseUnits.toString()}` : base;
23
+ }
24
+ /**
25
+ * Serve the connected-wallet deposit page for the duration of the watch, for
26
+ * users who prefer funding from a browser-extension wallet over sending to
27
+ * the hot wallet. Returns null when the port is taken (e.g. the desktop app's
28
+ * portal is running) — the QR/address flow works regardless.
29
+ */
30
+ async function startWebCheckout(dataDir, amountUsdc) {
31
+ try {
32
+ const { createServer } = await import('@antseed/payments');
33
+ let done = false;
34
+ const rawHex = process.env['ANTSEED_IDENTITY_HEX'] || undefined;
35
+ const identityHex = rawHex ? rawHex.replace(/^0x/i, '') : undefined;
36
+ const server = await createServer({
37
+ port: PAYMENTS_PORT,
38
+ dataDir,
39
+ identityHex,
40
+ onPaymentCompleted: () => { done = true; },
41
+ });
42
+ await server.listen({ port: PAYMENTS_PORT, host: '127.0.0.1' });
43
+ const token = server.bearerToken ?? '';
44
+ const params = new URLSearchParams();
45
+ if (token)
46
+ params.set('token', token);
47
+ params.set('page', 'pay');
48
+ params.set('action', 'deposit');
49
+ const amount = Number(amountUsdc);
50
+ if (Number.isFinite(amount) && amount > 0)
51
+ params.set('amount', String(amount));
52
+ return { url: `http://127.0.0.1:${PAYMENTS_PORT}?${params.toString()}`, completed: () => done };
53
+ }
54
+ catch {
55
+ return null;
56
+ }
57
+ }
58
+ // ─── Watch rendering ───
59
+ /** Render a watcher event onto the spinner; returns true when the flow is done. */
60
+ function renderEvent(spinner, event) {
61
+ switch (event.phase) {
62
+ case 'received':
63
+ spinner.text = `Received ${formatUsdc(BigInt(event.amountBaseUnits ?? '0'))} USDC in the hot wallet — sweeping into deposits...`;
64
+ return false;
65
+ case 'sweeping':
66
+ spinner.text = `Sweeping ${formatUsdc(BigInt(event.amountBaseUnits ?? '0'))} USDC into your deposits balance...`;
67
+ return false;
68
+ case 'deferred':
69
+ spinner.text = 'Deposit deferred: your deposits balance is at its credit limit. Funds stay in the wallet and sweep when headroom frees up.';
70
+ return false;
71
+ case 'error':
72
+ spinner.text = `${event.error ?? 'Sweep attempt failed'} (retrying automatically)`;
73
+ return false;
74
+ case 'credited':
75
+ spinner.succeed(chalk.green(`Deposited ${formatUsdc(BigInt(event.amountBaseUnits ?? '0'))} USDC into your credits.`));
76
+ if (event.txHash)
77
+ console.log(chalk.dim(`Transaction: ${event.txHash}`));
78
+ return true;
79
+ }
80
+ }
81
+ async function printFinalBalance(config, address) {
82
+ try {
83
+ const depositsClient = createDepositsClient(config);
84
+ const balance = await depositsClient.getBuyerBalance(address);
85
+ console.log(chalk.dim(`Deposits available: ${formatUsdc(balance.available)} USDC (total ${formatUsdc(balance.available + balance.reserved)} USDC)`));
86
+ }
87
+ catch {
88
+ // best-effort display only
89
+ }
90
+ }
91
+ async function makeWatchContext(config, dataDir, address, amountUsdc) {
92
+ const depositsClient = createDepositsClient(config);
93
+ const depositsTotal = async () => {
14
94
  try {
15
- amountBaseUnits = parseUsdcToBaseUnits(amount);
95
+ const balance = await depositsClient.getBuyerBalance(address);
96
+ return balance.available + balance.reserved;
16
97
  }
17
98
  catch {
18
- console.error(chalk.red('Error: Amount must be a positive number.'));
19
- process.exit(1);
99
+ return null;
20
100
  }
21
- const { wallet, address } = await loadCryptoContext(globalOpts.dataDir);
22
- const depositsClient = createDepositsClient(config);
23
- const amountFloat = parseFloat(amount);
24
- console.log(chalk.dim(`Wallet: ${address}`));
25
- console.log(chalk.dim(`Amount: ${amountFloat} USDC (${amountBaseUnits} base units)`));
26
- const spinner = ora('Depositing USDC into deposits contract...').start();
27
- try {
28
- const txHash = await depositsClient.deposit(wallet, address, amountBaseUnits);
29
- spinner.succeed(chalk.green(`Deposited ${amountFloat} USDC into deposits contract`));
30
- console.log(chalk.dim(`Transaction: ${txHash}`));
101
+ };
102
+ const web = await startWebCheckout(dataDir, amountUsdc);
103
+ return { config, address, web, depositsTotal, initialTotal: await depositsTotal() };
104
+ }
105
+ function printWebCheckoutHint(web) {
106
+ if (!web)
107
+ return;
108
+ console.log(` Prefer a browser wallet? Open: ${chalk.bold(web.url)}`);
109
+ console.log(chalk.dim(' (connect MetaMask / Coinbase Wallet / Rabby there — funds go straight into your deposits)'));
110
+ console.log('');
111
+ }
112
+ /** Non-sweep completion check shared by both watch loops. Returns a success message or null. */
113
+ async function checkExternalCompletion(ctx, sweeping) {
114
+ if (ctx.web?.completed())
115
+ return 'Deposit completed from the browser wallet.';
116
+ if (ctx.initialTotal === null || sweeping)
117
+ return null;
118
+ const total = await ctx.depositsTotal();
119
+ if (total !== null && total > ctx.initialTotal) {
120
+ return `Deposits balance increased by ${formatUsdc(total - ctx.initialTotal)} USDC.`;
121
+ }
122
+ return null;
123
+ }
124
+ /** Watch through the running buyer daemon's watcher (the normal path). */
125
+ async function watchViaDaemon(ctx, port) {
126
+ await daemonSetWatchMode(port, 'active');
127
+ // discardStdin would put the TTY in raw mode for the whole (long-lived)
128
+ // watch, which stops the terminal from ever delivering SIGINT on Ctrl+C.
129
+ const spinner = ora({
130
+ text: 'Waiting for USDC to arrive (Ctrl+C to stop watching — funds sweep automatically either way)...',
131
+ discardStdin: false,
132
+ }).start();
133
+ let demoted = false;
134
+ const demote = () => {
135
+ if (demoted)
136
+ return Promise.resolve();
137
+ demoted = true;
138
+ // Not a hard stop: the daemon keeps a slow background watch, so a
139
+ // transfer that lands after Ctrl+C is still swept automatically.
140
+ return daemonSetWatchMode(port, 'background').catch(() => { });
141
+ };
142
+ process.on('SIGINT', () => {
143
+ spinner.info('Stopped watching. The connection keeps sweeping incoming USDC in the background.');
144
+ // Let the demote request land, but never hang the exit on it.
145
+ setTimeout(() => process.exit(0), 2_000);
146
+ void demote().finally(() => process.exit(0));
147
+ });
148
+ const finish = async (message) => {
149
+ if (message)
150
+ spinner.succeed(chalk.green(message));
151
+ await demote();
152
+ await printFinalBalance(ctx.config, ctx.address);
153
+ process.exit(0);
154
+ };
155
+ let lastSeq = 0;
156
+ const initial = await daemonDepositsStatus(port);
157
+ if (initial?.status?.lastEvent)
158
+ lastSeq = initial.status.lastEvent.seq;
159
+ let lastBalanceCheckAt = 0;
160
+ for (;;) {
161
+ await sleep(DAEMON_STATUS_POLL_MS);
162
+ const current = await daemonDepositsStatus(port);
163
+ if (!current) {
164
+ spinner.text = 'Lost contact with the buyer connection — waiting for it to come back...';
165
+ continue;
166
+ }
167
+ const event = current.status?.lastEvent;
168
+ if (event && event.seq > lastSeq) {
169
+ lastSeq = event.seq;
170
+ if (renderEvent(spinner, event))
171
+ await finish();
31
172
  }
32
- catch (err) {
33
- spinner.fail(chalk.red(`Deposit failed: ${err.message}`));
34
- process.exit(1);
173
+ const sweeping = current.status?.sweepInFlight === true || event?.phase === 'sweeping';
174
+ if (Date.now() - lastBalanceCheckAt > BALANCE_CHECK_INTERVAL_MS) {
175
+ lastBalanceCheckAt = Date.now();
176
+ const message = await checkExternalCompletion(ctx, sweeping);
177
+ if (message)
178
+ await finish(message);
35
179
  }
180
+ }
181
+ }
182
+ /** No daemon: watch locally and sweep through an ephemeral node. */
183
+ async function watchStandalone(ctx, dataDir, crypto) {
184
+ // discardStdin: see watchViaDaemon — raw-mode stdin would swallow Ctrl+C.
185
+ const spinner = ora({ text: 'Waiting for USDC to arrive (Ctrl+C to stop watching)...', discardStdin: false }).start();
186
+ const { config, address } = ctx;
187
+ let node = null;
188
+ let latestReceipt = null;
189
+ const ensureNode = async () => {
190
+ if (node)
191
+ return node;
192
+ const bootstrapNodes = toBootstrapConfig(parseBootstrapList(buildBuyerBootstrapEntries(config.network?.bootstrapNodes)));
193
+ node = new AntseedNode({ role: 'buyer', bootstrapNodes, allowPrivateIPs: true, dataDir });
194
+ await node.start();
195
+ node.on('sweep:receipt', (event) => {
196
+ latestReceipt = event.payload;
197
+ });
198
+ const relayers = (await node.discoverPeers()).filter(peerRelaysSweeps);
199
+ await Promise.allSettled(relayers.slice(0, MAX_PEERS_TO_CONNECT).map((peer) => node.connectToPeer(peer)));
200
+ return node;
201
+ };
202
+ let credited = false;
203
+ const watcher = new DepositWatcher({
204
+ wallet: (await loadCryptoContext(dataDir)).wallet,
205
+ address,
206
+ depositsClient: createDepositsClient(config),
207
+ relayClient: createDepositRelayClient(config),
208
+ usdcAddress: crypto.usdcContractAddress,
209
+ evmChainId: crypto.evmChainId,
210
+ depositRelayAddress: crypto.depositRelayAddress,
211
+ dispatch: async (payload) => (await ensureNode()).dispatchSweepRequest(payload),
212
+ connectRelayers: async () => {
213
+ const n = await ensureNode();
214
+ const relayers = (await n.discoverPeers()).filter(peerRelaysSweeps);
215
+ await Promise.allSettled(relayers.slice(0, MAX_PEERS_TO_CONNECT).map((peer) => n.connectToPeer(peer)));
216
+ },
217
+ getReceipt: async (authNonce) => latestReceipt && latestReceipt.authNonce === authNonce ? latestReceipt : null,
218
+ onEvent: (event) => {
219
+ if (renderEvent(spinner, event))
220
+ credited = true;
221
+ },
222
+ idleIntervalMs: null,
223
+ });
224
+ process.on('SIGINT', () => {
225
+ watcher.stop();
226
+ spinner.info('Stopped watching. Funds already sent stay safe in the hot wallet — run `antseed buyer sweep` to deposit them.');
227
+ // Let the ephemeral node close cleanly, but never hang the exit on it.
228
+ setTimeout(() => process.exit(0), 2_000);
229
+ void (node ? node.stop().catch(() => { }) : Promise.resolve()).then(() => process.exit(0));
230
+ });
231
+ watcher.promote();
232
+ let lastBalanceCheckAt = 0;
233
+ let externalMessage = null;
234
+ while (!credited && !externalMessage) {
235
+ await sleep(DAEMON_STATUS_POLL_MS);
236
+ if (Date.now() - lastBalanceCheckAt > BALANCE_CHECK_INTERVAL_MS) {
237
+ lastBalanceCheckAt = Date.now();
238
+ externalMessage = await checkExternalCompletion(ctx, watcher.status().sweepInFlight);
239
+ }
240
+ }
241
+ watcher.stop();
242
+ if (externalMessage)
243
+ spinner.succeed(chalk.green(externalMessage));
244
+ await printFinalBalance(config, address);
245
+ if (node)
246
+ await node.stop().catch(() => { });
247
+ process.exit(0);
248
+ }
249
+ // ─── Legacy direct on-chain deposit (hot wallet pays gas) ───
250
+ async function depositOnchain(config, dataDir, amount) {
251
+ let amountBaseUnits;
252
+ try {
253
+ amountBaseUnits = parseUsdcToBaseUnits(amount);
254
+ }
255
+ catch {
256
+ console.error(chalk.red('Error: Amount must be a positive number.'));
257
+ process.exit(1);
258
+ }
259
+ const { wallet, address } = await loadCryptoContext(dataDir);
260
+ const depositsClient = createDepositsClient(config);
261
+ console.log(chalk.dim(`Wallet: ${address}`));
262
+ console.log(chalk.dim(`Amount: ${formatUsdc(amountBaseUnits)} USDC (${amountBaseUnits} base units)`));
263
+ const spinner = ora('Depositing USDC into deposits contract...').start();
264
+ try {
265
+ const txHash = await depositsClient.deposit(wallet, address, amountBaseUnits);
266
+ spinner.succeed(chalk.green(`Deposited ${formatUsdc(amountBaseUnits)} USDC into deposits contract`));
267
+ console.log(chalk.dim(`Transaction: ${txHash}`));
268
+ }
269
+ catch (err) {
270
+ spinner.fail(chalk.red(`Deposit failed: ${err.message}`));
271
+ process.exit(1);
272
+ }
273
+ }
274
+ // ─── Command ───
275
+ export async function runDepositAction(cmd, options) {
276
+ const globalOpts = getGlobalOptions(cmd);
277
+ const config = await loadConfig(globalOpts.config);
278
+ try {
279
+ if (options.onchain) {
280
+ await depositOnchain(config, globalOpts.dataDir, options.onchain);
281
+ return;
282
+ }
283
+ const crypto = requireCryptoConfig(config);
284
+ const { address } = await loadCryptoContext(globalOpts.dataDir);
285
+ const amountBaseUnits = options.amount ? parseUsdcToBaseUnits(options.amount) : null;
286
+ const uri = buildPaymentUri(crypto.usdcContractAddress, crypto.evmChainId, address, amountBaseUnits);
287
+ console.log('');
288
+ console.log(chalk.bold('Deposit USDC on Base'));
289
+ console.log(chalk.dim('Scan with a mobile wallet, or send USDC to the address below.'));
290
+ console.log('');
291
+ console.log(await QRCode.toString(uri, { type: 'terminal', small: true }));
292
+ console.log(` Address: ${chalk.bold(address)}`);
293
+ if (amountBaseUnits)
294
+ console.log(` Amount: ${formatUsdc(amountBaseUnits)} USDC`);
295
+ console.log(chalk.yellow(' Only send USDC on the Base network to this address.'));
296
+ console.log(chalk.dim(' Incoming USDC is swept into your deposits balance by the relayer network (fixed ~$0.05 fee, no ETH needed).'));
297
+ console.log('');
298
+ if (!crypto.depositRelayAddress) {
299
+ console.log(chalk.yellow('Automatic deposit is not available on this chain (no deposit relay).'));
300
+ console.log(chalk.dim('After funding, run `antseed buyer deposit --onchain <amount>` (requires ETH for gas).'));
301
+ return;
302
+ }
303
+ if (!options.watch) {
304
+ console.log(chalk.dim('Not watching (--no-watch). A running buyer connection sweeps incoming USDC automatically;'));
305
+ console.log(chalk.dim('without one, run `antseed buyer sweep` once the funds arrive.'));
306
+ return;
307
+ }
308
+ const ctx = await makeWatchContext(config, globalOpts.dataDir, address, options.amount ?? null);
309
+ printWebCheckoutHint(ctx.web);
310
+ const proxyPort = config.buyer.proxyPort;
311
+ const daemon = await daemonDepositsStatus(proxyPort);
312
+ if (daemon?.watcher) {
313
+ await watchViaDaemon(ctx, proxyPort);
314
+ }
315
+ else if (daemon) {
316
+ // A daemon is running but has no watcher (payments disabled, or it
317
+ // predates deposit watching). An ephemeral node here would collide
318
+ // with the daemon's peerId, so hand off to the manual command.
319
+ console.log(chalk.yellow('The running buyer connection cannot watch deposits (payments disabled or older version).'));
320
+ console.log(chalk.dim('Once the funds arrive, run `antseed buyer sweep` to deposit them.'));
321
+ }
322
+ else {
323
+ await watchStandalone(ctx, globalOpts.dataDir, { ...crypto, depositRelayAddress: crypto.depositRelayAddress });
324
+ }
325
+ }
326
+ catch (err) {
327
+ console.error(chalk.red(`Deposit failed: ${err.message}`));
328
+ process.exit(1);
329
+ }
330
+ }
331
+ function addDepositOptions(cmd) {
332
+ return cmd
333
+ .option('--amount <usdc>', 'Amount to prefill in the QR payment request and browser checkout')
334
+ .option('--no-watch', 'Print the address and QR code without waiting for funds')
335
+ .option('--onchain <usdc>', 'Legacy direct deposit: send <usdc> from the hot wallet on-chain (requires ETH for gas)');
336
+ }
337
+ export function registerBuyerDepositCommand(buyerCmd) {
338
+ addDepositOptions(buyerCmd
339
+ .command('deposit')
340
+ .description('Show your USDC funding address and QR code — incoming funds deposit into your credits automatically (gasless)')).action(async (options) => {
341
+ await runDepositAction(buyerCmd, options);
342
+ });
343
+ }
344
+ /** Hidden top-level alias: `antseed deposit` → `antseed buyer deposit`. */
345
+ export function registerDepositAlias(program) {
346
+ addDepositOptions(program.command('deposit', { hidden: true }))
347
+ .action(async (options) => {
348
+ await runDepositAction(program, options);
36
349
  });
37
350
  }
38
351
  //# sourceMappingURL=deposit.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"deposit.js","sourceRoot":"","sources":["../../../../src/cli/commands/buyer/deposit.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EACL,oBAAoB,EACpB,iBAAiB,EACjB,oBAAoB,GACrB,MAAM,wBAAwB,CAAC;AAEhC,MAAM,UAAU,2BAA2B,CAAC,QAAiB;IAC3D,QAAQ;SACL,OAAO,CAAC,kBAAkB,CAAC;SAC3B,WAAW,CAAC,4FAA4F,CAAC;SACzG,MAAM,CAAC,KAAK,EAAE,MAAc,EAAE,EAAE;QAC/B,MAAM,UAAU,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QAC9C,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAEnD,IAAI,eAAuB,CAAC;QAC5B,IAAI,CAAC;YACH,eAAe,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC;QACjD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC,CAAC;YACrE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,iBAAiB,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QACxE,MAAM,cAAc,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC;QAEpD,MAAM,WAAW,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;QACvC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,OAAO,EAAE,CAAC,CAAC,CAAC;QAC7C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,WAAW,UAAU,eAAe,cAAc,CAAC,CAAC,CAAC;QAEtF,MAAM,OAAO,GAAG,GAAG,CAAC,2CAA2C,CAAC,CAAC,KAAK,EAAE,CAAC;QAEzE,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,eAAe,CAAC,CAAC;YAC9E,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,aAAa,WAAW,8BAA8B,CAAC,CAAC,CAAC;YACrF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,gBAAgB,MAAM,EAAE,CAAC,CAAC,CAAC;QACnD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,mBAAoB,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YACrE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
1
+ {"version":3,"file":"deposit.js","sourceRoot":"","sources":["../../../../src/cli/commands/buyer/deposit.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/buyer/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYzC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAe5D"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/buyer/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAazC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAgB5D"}
@@ -6,6 +6,7 @@ import { registerBuyerSweepCommand } from './sweep.js';
6
6
  import { registerBuyerBalanceCommand } from './balance.js';
7
7
  import { registerBuyerConnectionCommand } from './connection.js';
8
8
  import { registerBuyerChannelsCommand } from './channels.js';
9
+ import { registerBuyerActivityCommand } from './activity.js';
9
10
  import { registerBuyerMeteringCommand } from './metering.js';
10
11
  import { registerBuyerEmissionsCommand } from './emissions.js';
11
12
  export function registerBuyerCommands(program) {
@@ -20,6 +21,7 @@ export function registerBuyerCommands(program) {
20
21
  registerBuyerBalanceCommand(buyerCmd);
21
22
  registerBuyerConnectionCommand(buyerCmd);
22
23
  registerBuyerChannelsCommand(buyerCmd);
24
+ registerBuyerActivityCommand(buyerCmd);
23
25
  registerBuyerMeteringCommand(buyerCmd);
24
26
  registerBuyerEmissionsCommand(buyerCmd);
25
27
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/cli/commands/buyer/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,EAAE,0BAA0B,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,2BAA2B,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAE,4BAA4B,EAAE,MAAM,eAAe,CAAC;AAC7D,OAAO,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,EAAE,2BAA2B,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAE,8BAA8B,EAAE,MAAM,iBAAiB,CAAC;AACjE,OAAO,EAAE,4BAA4B,EAAE,MAAM,eAAe,CAAC;AAC7D,OAAO,EAAE,4BAA4B,EAAE,MAAM,eAAe,CAAC;AAC7D,OAAO,EAAE,6BAA6B,EAAE,MAAM,gBAAgB,CAAC;AAE/D,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IACpD,MAAM,QAAQ,GAAG,OAAO;SACrB,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,yDAAyD,CAAC,CAAC;IAE1E,yBAAyB,CAAC,QAAQ,CAAC,CAAC;IACpC,0BAA0B,CAAC,QAAQ,CAAC,CAAC;IACrC,2BAA2B,CAAC,QAAQ,CAAC,CAAC;IACtC,4BAA4B,CAAC,QAAQ,CAAC,CAAC;IACvC,yBAAyB,CAAC,QAAQ,CAAC,CAAC;IACpC,2BAA2B,CAAC,QAAQ,CAAC,CAAC;IACtC,8BAA8B,CAAC,QAAQ,CAAC,CAAC;IACzC,4BAA4B,CAAC,QAAQ,CAAC,CAAC;IACvC,4BAA4B,CAAC,QAAQ,CAAC,CAAC;IACvC,6BAA6B,CAAC,QAAQ,CAAC,CAAC;AAC1C,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/cli/commands/buyer/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,EAAE,0BAA0B,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,2BAA2B,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAE,4BAA4B,EAAE,MAAM,eAAe,CAAC;AAC7D,OAAO,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,EAAE,2BAA2B,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAE,8BAA8B,EAAE,MAAM,iBAAiB,CAAC;AACjE,OAAO,EAAE,4BAA4B,EAAE,MAAM,eAAe,CAAC;AAC7D,OAAO,EAAE,4BAA4B,EAAE,MAAM,eAAe,CAAC;AAC7D,OAAO,EAAE,4BAA4B,EAAE,MAAM,eAAe,CAAC;AAC7D,OAAO,EAAE,6BAA6B,EAAE,MAAM,gBAAgB,CAAC;AAE/D,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IACpD,MAAM,QAAQ,GAAG,OAAO;SACrB,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,yDAAyD,CAAC,CAAC;IAE1E,yBAAyB,CAAC,QAAQ,CAAC,CAAC;IACpC,0BAA0B,CAAC,QAAQ,CAAC,CAAC;IACrC,2BAA2B,CAAC,QAAQ,CAAC,CAAC;IACtC,4BAA4B,CAAC,QAAQ,CAAC,CAAC;IACvC,yBAAyB,CAAC,QAAQ,CAAC,CAAC;IACpC,2BAA2B,CAAC,QAAQ,CAAC,CAAC;IACtC,8BAA8B,CAAC,QAAQ,CAAC,CAAC;IACzC,4BAA4B,CAAC,QAAQ,CAAC,CAAC;IACvC,4BAA4B,CAAC,QAAQ,CAAC,CAAC;IACvC,4BAA4B,CAAC,QAAQ,CAAC,CAAC;IACvC,6BAA6B,CAAC,QAAQ,CAAC,CAAC;AAC1C,CAAC"}
@@ -14,5 +14,6 @@ export declare function resolveBuyerRouterName(options: {
14
14
  router?: string;
15
15
  }): string;
16
16
  export declare function buildBuyerBootstrapEntries(configuredBootstrapNodes: string[] | undefined, localSeederDhtPort?: number): string[];
17
+ export declare function isCompatibleBuyerProxy(port: number, timeoutMs?: number): Promise<boolean>;
17
18
  export declare function registerBuyerStartCommand(buyerCmd: Command): void;
18
19
  //# sourceMappingURL=start.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/buyer/start.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAkBxC,OAAO,EAA+B,KAAK,qBAAqB,EAAE,MAAM,8BAA8B,CAAA;AACtG,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AAQ9D,wBAAgB,mCAAmC,CAAC,OAAO,EAAE;IAC3D,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,qBAAqB,CAAC,EAAE,MAAM,CAAA;IAC9B,sBAAsB,CAAC,EAAE,MAAM,CAAA;IAC/B,sBAAsB,CAAC,EAAE,MAAM,CAAA;IAC/B,yBAAyB,CAAC,EAAE,OAAO,CAAA;CACpC,GAAG,qBAAqB,CASxB;AAED,wBAAgB,oCAAoC,CAAC,WAAW,EAAE,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAKxG;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAE3E;AAED,wBAAgB,0BAA0B,CACxC,wBAAwB,EAAE,MAAM,EAAE,GAAG,SAAS,EAC9C,kBAAkB,CAAC,EAAE,MAAM,GAC1B,MAAM,EAAE,CAiBV;AAgHD,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAuTjE"}
1
+ {"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/buyer/start.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAmBxC,OAAO,EAA+B,KAAK,qBAAqB,EAAE,MAAM,8BAA8B,CAAA;AACtG,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AAQ9D,wBAAgB,mCAAmC,CAAC,OAAO,EAAE;IAC3D,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,qBAAqB,CAAC,EAAE,MAAM,CAAA;IAC9B,sBAAsB,CAAC,EAAE,MAAM,CAAA;IAC/B,sBAAsB,CAAC,EAAE,MAAM,CAAA;IAC/B,yBAAyB,CAAC,EAAE,OAAO,CAAA;CACpC,GAAG,qBAAqB,CASxB;AAED,wBAAgB,oCAAoC,CAAC,WAAW,EAAE,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAKxG;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAE3E;AAED,wBAAgB,0BAA0B,CACxC,wBAAwB,EAAE,MAAM,EAAE,GAAG,SAAS,EAC9C,kBAAkB,CAAC,EAAE,MAAM,GAC1B,MAAM,EAAE,CAiBV;AAyED,wBAAsB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,SAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAiC7F;AAED,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAwWjE"}
@@ -6,13 +6,14 @@ import { homedir } from 'node:os';
6
6
  import { createConnection } from 'node:net';
7
7
  import { getGlobalOptions } from '../types.js';
8
8
  import { loadConfig } from '../../../config/loader.js';
9
- import { AntseedNode, DepositsClient, getInstance, resolveChainConfig } from '@antseed/node';
9
+ import { AntseedNode, DepositRelayClient, DepositsClient, getInstance, peerRelaysSweeps, resolveChainConfig } from '@antseed/node';
10
10
  import { OFFICIAL_BOOTSTRAP_NODES, parseBootstrapList, toBootstrapConfig } from '@antseed/node/discovery';
11
11
  import { setupShutdownHandler } from '../../shutdown.js';
12
12
  import { loadRouterPlugin, loadVerifierPlugin, buildPluginConfig, getPackageVersions } from '../../../plugins/loader.js';
13
13
  import { ensurePluginsUpToDate } from '../../../plugins/drift.js';
14
14
  import { resolvePluginPackage } from '../../../plugins/registry.js';
15
15
  import { BuyerProxy } from '../../../proxy/buyer-proxy.js';
16
+ import { DepositWatcher } from '../../../proxy/deposit-watcher.js';
16
17
  import { curatedVerifierIds, resolveVerifierPolicy } from '../../../plugins/verifier.js';
17
18
  import { resolveEffectiveBuyerConfig } from '../../../config/effective.js';
18
19
  export function buildBuyerRuntimeOverridesFromFlags(options) {
@@ -131,7 +132,7 @@ async function isPortReachable(port, timeoutMs = 700) {
131
132
  socket.setTimeout(timeoutMs, () => finish(false));
132
133
  });
133
134
  }
134
- async function isCompatibleBuyerProxy(port, timeoutMs = 1200) {
135
+ export async function isCompatibleBuyerProxy(port, timeoutMs = 1200) {
135
136
  const overallBudgetMs = Math.max(1, timeoutMs);
136
137
  const startedAt = Date.now();
137
138
  const reachabilityTimeoutMs = Math.min(overallBudgetMs, 700);
@@ -153,10 +154,6 @@ async function isCompatibleBuyerProxy(port, timeoutMs = 1200) {
153
154
  if (antseedHeaderNames.some((header) => response.headers.has(header)))
154
155
  return true;
155
156
  const body = (await response.text()).toLowerCase();
156
- // Any of these markers indicate we reached an Antseed buyer proxy on this
157
- // port. The `no_peer_pinned` case is the common one now that auto
158
- // selection is disabled — a fresh proxy with no session pin answers
159
- // /v1/models with a structured `{ error: { type: 'no_peer_pinned', ... } }`.
160
157
  return body.includes('no sellers available on the network')
161
158
  || body.includes('no peers support')
162
159
  || body.includes('p2p request failed')
@@ -331,6 +328,9 @@ export function registerBuyerStartCommand(buyerCmd) {
331
328
  console.log(chalk.dim(` max per-request USDC: ${(Number(maxPerRequestUsdc) / 1_000_000).toFixed(6)}`));
332
329
  console.log(chalk.dim(` max reserve USDC: ${(Number(maxReserveAmountUsdc) / 1_000_000).toFixed(6)}`));
333
330
  console.log(chalk.dim(` min peer reputation: ${effectiveBuyerConfig.minPeerReputation}`));
331
+ console.log(chalk.dim(` auto routing: min trust=${effectiveBuyerConfig.routingPreferences.minTrustScore}, `
332
+ + `max input=${effectiveBuyerConfig.routingPreferences.maxInputUsdPerMillion} USD/1M, `
333
+ + `prefer free=${effectiveBuyerConfig.routingPreferences.preferFreePeers ? 'yes' : 'no'}`));
334
334
  console.log(chalk.dim(` peer refresh interval: ${effectiveBuyerConfig.peerRefreshIntervalMs}ms`));
335
335
  console.log(chalk.dim(` metadata fetch timeout: ${effectiveBuyerConfig.metadataFetchTimeoutMs}ms`));
336
336
  console.log(chalk.dim(` metadata v2 service opt-out: ${effectiveBuyerConfig.disableMetadataV2Services ? 'enabled' : 'disabled'}`));
@@ -342,10 +342,10 @@ export function registerBuyerStartCommand(buyerCmd) {
342
342
  console.log(chalk.yellow(` pinned peer: ${pinnedPeerId} (router bypassed)`));
343
343
  }
344
344
  else {
345
- console.log(chalk.yellow(' pinned peer: none — auto-selection is disabled, requests will fail until a peer is pinned'));
346
- console.log(chalk.dim(' Pin a peer with: antseed network browse → antseed buyer connection set --peer <peerId>'));
347
- console.log(chalk.dim(' Or per-request: x-antseed-pin-peer: <peerId> header'));
348
- console.log(chalk.dim(' Or in model: <peerId>@<model>'));
345
+ console.log(chalk.yellow(' pinned peer: none — model-only requests use the configured Price + Trust ranking'));
346
+ console.log(chalk.dim(' Explicit session pin: antseed network browse → antseed buyer connection set --peer <peerId>'));
347
+ console.log(chalk.dim(' Explicit request pin: x-antseed-pin-peer: <peerId> header'));
348
+ console.log(chalk.dim(' Explicit model pin: <peerId>@<model>'));
349
349
  }
350
350
  console.log('');
351
351
  const node = new AntseedNode({
@@ -423,6 +423,8 @@ export function registerBuyerStartCommand(buyerCmd) {
423
423
  node,
424
424
  pinnedPeerId,
425
425
  dataDir: globalOpts.dataDir,
426
+ configPath: globalOpts.config,
427
+ routingPreferences: effectiveBuyerConfig.routingPreferences,
426
428
  backgroundRefreshIntervalMs: effectiveBuyerConfig.peerRefreshIntervalMs,
427
429
  ...(verifierPolicy ? { verifier: verifierPolicy } : {}),
428
430
  });
@@ -450,6 +452,46 @@ export function registerBuyerStartCommand(buyerCmd) {
450
452
  process.exit(1);
451
453
  }
452
454
  }
455
+ // Hot-wallet deposit watcher (auto-sweep): incoming USDC is swept into
456
+ // the deposits balance gaslessly via the relayer network. Skipped when
457
+ // another daemon owns the proxy port — it already runs a watcher, and a
458
+ // second signer against the same wallet would race it.
459
+ let depositWatcher = null;
460
+ const depositRelayAddress = cryptoOverrides?.depositRelayAddress || chainConfig.depositRelayAddress;
461
+ if (ownsProxyListener && paymentsConfig?.enabled && depositRelayAddress) {
462
+ const identity = node.identity;
463
+ depositWatcher = new DepositWatcher({
464
+ wallet: identity.wallet,
465
+ address: identity.wallet.address,
466
+ depositsClient: new DepositsClient({
467
+ rpcUrl: chainConfig.rpcUrl,
468
+ ...(chainConfig.fallbackRpcUrls ? { fallbackRpcUrls: chainConfig.fallbackRpcUrls } : {}),
469
+ contractAddress: chainConfig.depositsContractAddress,
470
+ usdcAddress: chainConfig.usdcContractAddress,
471
+ evmChainId: chainConfig.evmChainId,
472
+ }),
473
+ relayClient: new DepositRelayClient({
474
+ rpcUrl: chainConfig.rpcUrl,
475
+ ...(chainConfig.fallbackRpcUrls ? { fallbackRpcUrls: chainConfig.fallbackRpcUrls } : {}),
476
+ contractAddress: depositRelayAddress,
477
+ evmChainId: chainConfig.evmChainId,
478
+ }),
479
+ usdcAddress: chainConfig.usdcContractAddress,
480
+ evmChainId: chainConfig.evmChainId,
481
+ depositRelayAddress,
482
+ dispatch: (payload) => node.dispatchSweepRequest(payload),
483
+ connectRelayers: async () => {
484
+ const relayers = (await node.discoverPeers()).filter(peerRelaysSweeps);
485
+ await Promise.allSettled(relayers.slice(0, 4).map((peer) => node.connectToPeer(peer)));
486
+ },
487
+ getReceipt: async (authNonce) => proxy.getSweepReceipt(authNonce),
488
+ });
489
+ proxy.setDepositWatcher(depositWatcher);
490
+ if (effectiveBuyerConfig.autoSweep !== false) {
491
+ depositWatcher.startIdle();
492
+ console.log(chalk.dim('Auto-sweep: watching the hot wallet — incoming USDC deposits automatically (buyer.autoSweep=false disables).'));
493
+ }
494
+ }
453
495
  const proxyUrl = `http://localhost:${proxyPort}`;
454
496
  console.log('');
455
497
  if (toolHints.length > 0) {
@@ -469,6 +511,7 @@ export function registerBuyerStartCommand(buyerCmd) {
469
511
  console.log('');
470
512
  setupShutdownHandler(async () => {
471
513
  nodeSpinner.start('Shutting down...');
514
+ depositWatcher?.stop();
472
515
  if (ownsProxyListener)
473
516
  await proxy.stop();
474
517
  await node.stop();