paytaca-cli 0.6.1 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (130) hide show
  1. package/README.md +153 -37
  2. package/dist/ai/autoRefill.d.ts +27 -0
  3. package/dist/ai/autoRefill.d.ts.map +1 -0
  4. package/dist/ai/autoRefill.js +75 -0
  5. package/dist/ai/autoRefill.js.map +1 -0
  6. package/dist/ai/client.d.ts +73 -0
  7. package/dist/ai/client.d.ts.map +1 -0
  8. package/dist/ai/client.js +90 -0
  9. package/dist/ai/client.js.map +1 -0
  10. package/dist/ai/config.d.ts +7 -0
  11. package/dist/ai/config.d.ts.map +1 -0
  12. package/dist/ai/config.js +16 -0
  13. package/dist/ai/config.js.map +1 -0
  14. package/dist/ai/configure.d.ts +61 -0
  15. package/dist/ai/configure.d.ts.map +1 -0
  16. package/dist/ai/configure.js +452 -0
  17. package/dist/ai/configure.js.map +1 -0
  18. package/dist/ai/credits.d.ts +27 -0
  19. package/dist/ai/credits.d.ts.map +1 -0
  20. package/dist/ai/credits.js +99 -0
  21. package/dist/ai/credits.js.map +1 -0
  22. package/dist/ai/models.d.ts +13 -0
  23. package/dist/ai/models.d.ts.map +1 -0
  24. package/dist/ai/models.js +49 -0
  25. package/dist/ai/models.js.map +1 -0
  26. package/dist/ai/oauth.d.ts +45 -0
  27. package/dist/ai/oauth.d.ts.map +1 -0
  28. package/dist/ai/oauth.js +137 -0
  29. package/dist/ai/oauth.js.map +1 -0
  30. package/dist/ai/purchase.d.ts +30 -0
  31. package/dist/ai/purchase.d.ts.map +1 -0
  32. package/dist/ai/purchase.js +456 -0
  33. package/dist/ai/purchase.js.map +1 -0
  34. package/dist/commands/address.d.ts.map +1 -1
  35. package/dist/commands/address.js +88 -36
  36. package/dist/commands/address.js.map +1 -1
  37. package/dist/commands/ai.d.ts +9 -0
  38. package/dist/commands/ai.d.ts.map +1 -0
  39. package/dist/commands/ai.js +675 -0
  40. package/dist/commands/ai.js.map +1 -0
  41. package/dist/commands/balance.d.ts.map +1 -1
  42. package/dist/commands/balance.js +68 -129
  43. package/dist/commands/balance.js.map +1 -1
  44. package/dist/commands/history.d.ts.map +1 -1
  45. package/dist/commands/history.js +38 -78
  46. package/dist/commands/history.js.map +1 -1
  47. package/dist/commands/mcp.d.ts +14 -0
  48. package/dist/commands/mcp.d.ts.map +1 -0
  49. package/dist/commands/mcp.js +68 -0
  50. package/dist/commands/mcp.js.map +1 -0
  51. package/dist/commands/pay.js +1 -1
  52. package/dist/commands/pay.js.map +1 -1
  53. package/dist/commands/receive.d.ts +1 -8
  54. package/dist/commands/receive.d.ts.map +1 -1
  55. package/dist/commands/receive.js +51 -124
  56. package/dist/commands/receive.js.map +1 -1
  57. package/dist/commands/send.d.ts +0 -10
  58. package/dist/commands/send.d.ts.map +1 -1
  59. package/dist/commands/send.js +40 -50
  60. package/dist/commands/send.js.map +1 -1
  61. package/dist/commands/swap.js +1 -1
  62. package/dist/commands/swap.js.map +1 -1
  63. package/dist/commands/token.d.ts +1 -9
  64. package/dist/commands/token.d.ts.map +1 -1
  65. package/dist/commands/token.js +192 -289
  66. package/dist/commands/token.js.map +1 -1
  67. package/dist/core/context.d.ts +30 -0
  68. package/dist/core/context.d.ts.map +1 -0
  69. package/dist/core/context.js +45 -0
  70. package/dist/core/context.js.map +1 -0
  71. package/dist/core/wallet.d.ts +130 -0
  72. package/dist/core/wallet.d.ts.map +1 -0
  73. package/dist/core/wallet.js +276 -0
  74. package/dist/core/wallet.js.map +1 -0
  75. package/dist/index.js +4 -0
  76. package/dist/index.js.map +1 -1
  77. package/dist/mcp/server.d.ts +8 -0
  78. package/dist/mcp/server.d.ts.map +1 -0
  79. package/dist/mcp/server.js +24 -0
  80. package/dist/mcp/server.js.map +1 -0
  81. package/dist/mcp/tools.d.ts +5 -0
  82. package/dist/mcp/tools.d.ts.map +1 -0
  83. package/dist/mcp/tools.js +473 -0
  84. package/dist/mcp/tools.js.map +1 -0
  85. package/dist/utils/format.d.ts +23 -0
  86. package/dist/utils/format.d.ts.map +1 -0
  87. package/dist/utils/format.js +62 -0
  88. package/dist/utils/format.js.map +1 -0
  89. package/dist/utils/x402.js +1 -1
  90. package/dist/utils/x402.js.map +1 -1
  91. package/dist/wallet/index.d.ts +13 -0
  92. package/dist/wallet/index.d.ts.map +1 -1
  93. package/dist/wallet/index.js +18 -0
  94. package/dist/wallet/index.js.map +1 -1
  95. package/dist/wallet/keys.d.ts.map +1 -1
  96. package/dist/wallet/keys.js +2 -0
  97. package/dist/wallet/keys.js.map +1 -1
  98. package/package.json +7 -3
  99. package/dist/commands/wallet.test.d.ts +0 -2
  100. package/dist/commands/wallet.test.d.ts.map +0 -1
  101. package/dist/commands/wallet.test.js +0 -68
  102. package/dist/commands/wallet.test.js.map +0 -1
  103. package/dist/nostr/chat.test.d.ts +0 -2
  104. package/dist/nostr/chat.test.d.ts.map +0 -1
  105. package/dist/nostr/chat.test.js +0 -121
  106. package/dist/nostr/chat.test.js.map +0 -1
  107. package/dist/nostr/store.test.d.ts +0 -2
  108. package/dist/nostr/store.test.d.ts.map +0 -1
  109. package/dist/nostr/store.test.js +0 -456
  110. package/dist/nostr/store.test.js.map +0 -1
  111. package/dist/utils/prices.test.d.ts +0 -5
  112. package/dist/utils/prices.test.d.ts.map +0 -1
  113. package/dist/utils/prices.test.js +0 -62
  114. package/dist/utils/prices.test.js.map +0 -1
  115. package/dist/utils/x402.test.d.ts +0 -2
  116. package/dist/utils/x402.test.d.ts.map +0 -1
  117. package/dist/utils/x402.test.js +0 -216
  118. package/dist/utils/x402.test.js.map +0 -1
  119. package/dist/wallet/cauldron/pools.test.d.ts +0 -3
  120. package/dist/wallet/cauldron/pools.test.d.ts.map +0 -1
  121. package/dist/wallet/cauldron/pools.test.js +0 -149
  122. package/dist/wallet/cauldron/pools.test.js.map +0 -1
  123. package/dist/wallet/cauldron/swap.test.d.ts +0 -2
  124. package/dist/wallet/cauldron/swap.test.d.ts.map +0 -1
  125. package/dist/wallet/cauldron/swap.test.js +0 -179
  126. package/dist/wallet/cauldron/swap.test.js.map +0 -1
  127. package/skills/README.md +0 -68
  128. package/skills/paytaca-send/SKILL.md +0 -159
  129. package/skills/paytaca-wallet/SKILL.md +0 -164
  130. package/skills/paytaca-x402/SKILL.md +0 -130
@@ -0,0 +1,456 @@
1
+ import { ExchangeLab } from '@cashlab/cauldron';
2
+ import { PayoutAmountRuleType } from '@cashlab/common';
3
+ import { cashAddressToLockingBytecode, binToHex, } from '@cashlab/common/libauth.js';
4
+ import { requireWallet } from '../core/context.js';
5
+ import { isValidBchAddress } from '../core/wallet.js';
6
+ import { LibauthHDWallet } from '../wallet/keys.js';
7
+ import { X402Payer } from '../wallet/x402.js';
8
+ import { parsePaymentRequiredJson, selectBchPaymentRequirements, } from '../utils/x402.js';
9
+ import { BCH_DERIVATION_PATH } from '../utils/network.js';
10
+ import { fetchPoolsForToken, fetchCauldronFee, } from '../wallet/cauldron/api.js';
11
+ import { apiPoolToMicroPool, microPoolToPoolV0 } from '../wallet/cauldron/pools.js';
12
+ import { attemptTrade, watchtowerUtxosToSpendableCoins, } from '../wallet/cauldron/transact.js';
13
+ import { computePlatformFee } from '../wallet/cauldron/swap.js';
14
+ import { getBchUsdPrice } from '../utils/prices.js';
15
+ import { getConfig, getWalletStatus, } from './client.js';
16
+ import { LIFT_TOKEN_ID, resolveBackendUrl, apiUrl } from './config.js';
17
+ import { selectModel, selectTier, formatDuration } from './models.js';
18
+ import { findSession, hasActiveCredits } from './credits.js';
19
+ const PLAN_PROBE_SAMPLES = 3;
20
+ const PLAN_PROBE_SPACING_MS = 500;
21
+ const PLAN_PROBE_PRICE_DRIFT_TOLERANCE = 0.05;
22
+ function sleep(ms) {
23
+ return new Promise((resolve) => setTimeout(resolve, ms));
24
+ }
25
+ export async function probePlanStability(baseUrl, modelId, minutes) {
26
+ let okSamples = 0;
27
+ const prices = [];
28
+ let lastError = '';
29
+ for (let i = 0; i < PLAN_PROBE_SAMPLES; i++) {
30
+ try {
31
+ const config = await getConfig({ backendUrl: baseUrl, timeoutMs: 6000 });
32
+ const model = selectModel(config.models || [], modelId);
33
+ if (!model) {
34
+ lastError = `model ${modelId} not in plan config`;
35
+ }
36
+ else {
37
+ const tier = selectTier(model, minutes);
38
+ if (!tier) {
39
+ lastError = `no ${minutes}-min plan for ${modelId}`;
40
+ }
41
+ else {
42
+ prices.push(Number(tier.price_sats) || 0);
43
+ okSamples++;
44
+ }
45
+ }
46
+ }
47
+ catch (err) {
48
+ lastError = err?.message || String(err);
49
+ }
50
+ if (i < PLAN_PROBE_SAMPLES - 1)
51
+ await sleep(PLAN_PROBE_SPACING_MS);
52
+ }
53
+ if (okSamples === PLAN_PROBE_SAMPLES && prices.length > 0) {
54
+ const min = Math.min(...prices);
55
+ const max = Math.max(...prices);
56
+ const drift = min > 0 ? (max - min) / min : max === min ? 0 : Infinity;
57
+ if (drift <= PLAN_PROBE_PRICE_DRIFT_TOLERANCE)
58
+ return;
59
+ throw new Error(`Backend plan price was unstable before purchase (${prices.join(', ')} sats). No payment was broadcast — please retry in a few seconds.`);
60
+ }
61
+ throw new Error(`Backend plan endpoint was unreachable before purchase (reachable ${okSamples}/${PLAN_PROBE_SAMPLES}${lastError ? `, last error: ${lastError}` : ''}). No payment was broadcast — please retry in a few seconds.`);
62
+ }
63
+ function buildPlanRequest(baseUrl, walletHash, model, tier, paymentMethod) {
64
+ const headers = {
65
+ 'Content-Type': 'application/json',
66
+ 'X-Wallet-Hash': walletHash,
67
+ 'X-Model-Id': model.id,
68
+ 'X-Duration-Minutes': String(tier.minutes),
69
+ 'X-Plan-Probe': '1',
70
+ };
71
+ if (paymentMethod === 'lift')
72
+ headers['X-Payment-Method'] = 'lift';
73
+ return {
74
+ url: `${apiUrl(baseUrl, '/v1/chat/completions')}?wallet_hash=${encodeURIComponent(walletHash)}`,
75
+ headers,
76
+ body: JSON.stringify({
77
+ model: model.id,
78
+ messages: [{ role: 'user', content: 'ok' }],
79
+ stream: false,
80
+ max_tokens: 1,
81
+ }),
82
+ };
83
+ }
84
+ async function payWithLift(ctx, hdWallet, requirements, changeAddress, isChipnet) {
85
+ const tokenId = LIFT_TOKEN_ID;
86
+ const amountSats = BigInt(requirements.amount);
87
+ const [apiPools, allUtxos, tokenUtxos] = await Promise.all([
88
+ fetchPoolsForToken(tokenId),
89
+ ctx.bch.getUtxos(),
90
+ ctx.bch.getUtxos({ category: tokenId }),
91
+ ]);
92
+ if (!apiPools || apiPools.length === 0) {
93
+ throw new Error('No active Cauldron pools for the payment token.');
94
+ }
95
+ const pools = apiPools.map(apiPoolToMicroPool).map(microPoolToPoolV0);
96
+ const tokenBalance = (tokenUtxos || []).reduce((sum, u) => sum + BigInt(u.amount || 0), 0n);
97
+ if (tokenBalance <= 0n) {
98
+ throw new Error('No LIFT tokens in the wallet. Add LIFT to pay this plan with tokens, or pay with BCH.');
99
+ }
100
+ const bchUtxos = allUtxos.filter((utxo) => !utxo.is_cashtoken);
101
+ const spendableCoins = watchtowerUtxosToSpendableCoins({
102
+ utxos: [...bchUtxos, ...(tokenUtxos || [])],
103
+ wallet: hdWallet,
104
+ });
105
+ if (spendableCoins.length === 0) {
106
+ throw new Error('No spendable UTXOs available.');
107
+ }
108
+ const payToDecoded = cashAddressToLockingBytecode(requirements.payTo);
109
+ if (!payToDecoded || typeof payToDecoded === 'string' || !payToDecoded.bytecode) {
110
+ throw new Error(`Invalid payment address: ${requirements.payTo}`);
111
+ }
112
+ const changeDecoded = cashAddressToLockingBytecode(changeAddress);
113
+ if (!changeDecoded || typeof changeDecoded === 'string' || !changeDecoded.bytecode) {
114
+ throw new Error(`Invalid change address: ${changeAddress}`);
115
+ }
116
+ const feeConfig = await fetchCauldronFee(isChipnet).catch(() => null);
117
+ const bchUsdPrice = feeConfig
118
+ ? await getBchUsdPrice(isChipnet).catch(() => null)
119
+ : null;
120
+ const exlab = new ExchangeLab();
121
+ let trade = null;
122
+ let tradeTx = null;
123
+ let lastError = null;
124
+ for (const buffer of [2000n, 20000n, 100000n]) {
125
+ try {
126
+ trade = attemptTrade({
127
+ pools,
128
+ isBuyingToken: false,
129
+ supply: undefined,
130
+ demand: amountSats + buffer,
131
+ });
132
+ const payoutRules = [
133
+ {
134
+ type: PayoutAmountRuleType.FIXED,
135
+ locking_bytecode: payToDecoded.bytecode,
136
+ amount: amountSats,
137
+ },
138
+ ];
139
+ const platformFee = feeConfig
140
+ ? computePlatformFee({
141
+ tradeResult: trade,
142
+ isBuyingToken: false,
143
+ feeConfig,
144
+ bchUsdPrice,
145
+ })
146
+ : null;
147
+ if (platformFee) {
148
+ const feeDecoded = cashAddressToLockingBytecode(platformFee.to);
149
+ if (feeDecoded && typeof feeDecoded !== 'string' && feeDecoded.bytecode) {
150
+ payoutRules.push({
151
+ type: PayoutAmountRuleType.FIXED,
152
+ locking_bytecode: feeDecoded.bytecode,
153
+ amount: platformFee.amount,
154
+ });
155
+ }
156
+ }
157
+ payoutRules.push({
158
+ type: PayoutAmountRuleType.CHANGE,
159
+ locking_bytecode: changeDecoded.bytecode,
160
+ allow_mixing_native_and_token: false,
161
+ allow_mixing_native_and_token_when_bch_change_is_dust: false,
162
+ add_change_to_txfee_when_bch_change_is_dust: true,
163
+ });
164
+ tradeTx = exlab.createTradeTx(trade.entries, spendableCoins, payoutRules, null, 1n);
165
+ exlab.verifyTradeTx(tradeTx);
166
+ break;
167
+ }
168
+ catch (err) {
169
+ lastError = err;
170
+ }
171
+ }
172
+ if (!tradeTx) {
173
+ const supply = trade?.summary?.supply;
174
+ if (supply && tokenBalance < supply) {
175
+ throw new Error(`Insufficient LIFT balance: this payment needs ${supply} base units but the wallet has ${tokenBalance}.`);
176
+ }
177
+ throw new Error(`Could not fund the payment by selling LIFT: ${lastError?.message || 'unknown error'}`);
178
+ }
179
+ const tx = tradeTx.libauth_generated_transaction;
180
+ const payToHex = binToHex(payToDecoded.bytecode);
181
+ const vout = tx.outputs.findIndex((o) => binToHex(o.lockingBytecode) === payToHex);
182
+ if (vout === -1)
183
+ throw new Error('Payment output missing from built transaction.');
184
+ const txHex = binToHex(tradeTx.txbin);
185
+ const broadcastResponse = await ctx.bch.watchtower.BCH._api.post('broadcast/', { transaction: txHex });
186
+ const data = broadcastResponse.data;
187
+ if (data?.result) {
188
+ data[data.success ? 'txid' : 'error'] = data.result;
189
+ delete data.result;
190
+ }
191
+ if (!data?.success || !data?.txid) {
192
+ throw new Error(data?.error || 'Broadcast failed');
193
+ }
194
+ return { txid: data.txid, vout };
195
+ }
196
+ function resolveModelTier(config, modelQuery, minutes) {
197
+ const model = selectModel(config.models || [], modelQuery);
198
+ if (!model) {
199
+ throw new Error(`Unknown model "${modelQuery}". Run \`paytaca ai models\` to list available models.`);
200
+ }
201
+ const tier = selectTier(model, minutes);
202
+ if (!tier) {
203
+ throw new Error(`No ${minutes}-minute plan available for ${model.display_name || model.id}.`);
204
+ }
205
+ return { model, tier };
206
+ }
207
+ export async function buyPlan(opts) {
208
+ const paymentMethod = opts.paymentMethod === 'lift' ? 'lift' : 'bch';
209
+ const isChipnet = Boolean(opts.isChipnet);
210
+ const baseUrl = resolveBackendUrl(opts.backendUrl);
211
+ const modelQuery = String(opts.model || '').trim();
212
+ const minutes = Number(opts.minutes);
213
+ if (!modelQuery) {
214
+ return { success: false, paid: false, error: 'Missing model.' };
215
+ }
216
+ if (!Number.isFinite(minutes) || minutes <= 0) {
217
+ return { success: false, paid: false, error: 'Missing or invalid minutes.' };
218
+ }
219
+ let ctx;
220
+ let model;
221
+ let tier;
222
+ try {
223
+ ctx = requireWallet(isChipnet);
224
+ const config = await getConfig({ backendUrl: baseUrl });
225
+ const resolved = resolveModelTier(config, modelQuery, minutes);
226
+ model = resolved.model;
227
+ tier = resolved.tier;
228
+ }
229
+ catch (err) {
230
+ return { success: false, paid: false, error: err?.message || String(err) };
231
+ }
232
+ const priceSats = Number(tier.price_sats) || 0;
233
+ if (!opts.skipActiveCreditGuard) {
234
+ try {
235
+ const status = await getWalletStatus(ctx.walletHash, {
236
+ backendUrl: baseUrl,
237
+ });
238
+ if (hasActiveCredits(status, model.id)) {
239
+ const session = findSession(status, model.id);
240
+ const remaining = formatDuration(session?.time_remaining_seconds ?? 0);
241
+ return {
242
+ success: false,
243
+ paid: false,
244
+ model: model.id,
245
+ displayName: model.display_name,
246
+ error: `${model.display_name || model.id} still has ${remaining} of active credits. A new plan cannot be purchased until they are used up or expire.`,
247
+ };
248
+ }
249
+ }
250
+ catch (err) {
251
+ return {
252
+ success: false,
253
+ paid: false,
254
+ error: `Could not check existing credits before purchase: ${err?.message || err}`,
255
+ };
256
+ }
257
+ }
258
+ if (paymentMethod === 'bch') {
259
+ try {
260
+ const balance = await ctx.bch.getBalance();
261
+ const availableSats = Math.round(balance.spendable * 1e8);
262
+ if (priceSats > 0 && availableSats < priceSats) {
263
+ return {
264
+ success: false,
265
+ paid: false,
266
+ model: model.id,
267
+ displayName: model.display_name,
268
+ priceSats,
269
+ error: `Insufficient balance: ${(availableSats / 1e8).toFixed(8)} BCH available but the ${minutes}-minute plan costs ${(priceSats / 1e8).toFixed(8)} BCH.`,
270
+ };
271
+ }
272
+ }
273
+ catch {
274
+ // Balance check is best-effort; the payment flow will surface real errors.
275
+ }
276
+ }
277
+ if (!opts.skipProbe && process.env.PAYTACA_PLAN_PROBE !== '0') {
278
+ try {
279
+ await probePlanStability(baseUrl, model.id, tier.minutes);
280
+ }
281
+ catch (err) {
282
+ return { success: false, paid: false, error: err?.message || String(err) };
283
+ }
284
+ }
285
+ const hdWallet = new LibauthHDWallet(ctx.mnemonic, BCH_DERIVATION_PATH, isChipnet ? 'chipnet' : 'mainnet');
286
+ const x402Payer = new X402Payer({ hdWallet, addressIndex: 0 });
287
+ const { url, headers, body } = buildPlanRequest(baseUrl, ctx.walletHash, model, tier, paymentMethod);
288
+ let firstResponse;
289
+ try {
290
+ firstResponse = await fetch(url, {
291
+ method: 'POST',
292
+ headers,
293
+ body,
294
+ signal: AbortSignal.timeout(240000),
295
+ });
296
+ }
297
+ catch (err) {
298
+ return { success: false, paid: false, error: `Request failed: ${err?.message || err}` };
299
+ }
300
+ const firstText = await firstResponse.text();
301
+ let firstData;
302
+ try {
303
+ firstData = JSON.parse(firstText);
304
+ }
305
+ catch {
306
+ firstData = firstText;
307
+ }
308
+ if (firstResponse.status !== 402) {
309
+ return {
310
+ success: true,
311
+ paid: false,
312
+ model: model.id,
313
+ displayName: model.display_name,
314
+ minutes: tier.minutes,
315
+ priceSats,
316
+ paymentMethod,
317
+ status: firstResponse.status,
318
+ data: firstData,
319
+ error: firstResponse.ok
320
+ ? 'No purchase made: the model already has active credits, so the request was served without payment.'
321
+ : `Unexpected response (${firstResponse.status}).`,
322
+ };
323
+ }
324
+ const paymentRequired = parsePaymentRequiredJson(firstData);
325
+ if (!paymentRequired) {
326
+ return {
327
+ success: false,
328
+ paid: false,
329
+ status: 402,
330
+ error: 'Could not parse PaymentRequired from 402 response body.',
331
+ };
332
+ }
333
+ const requirements = selectBchPaymentRequirements(paymentRequired, isChipnet ? 'chipnet' : 'mainnet');
334
+ if (!requirements) {
335
+ return {
336
+ success: false,
337
+ paid: false,
338
+ status: 402,
339
+ error: 'Server does not accept BCH payment for this plan.',
340
+ };
341
+ }
342
+ if (!opts.confirmed) {
343
+ return {
344
+ success: false,
345
+ paid: false,
346
+ status: 402,
347
+ model: model.id,
348
+ displayName: model.display_name,
349
+ minutes: tier.minutes,
350
+ priceSats,
351
+ paymentMethod,
352
+ recipientAddress: requirements.payTo,
353
+ error: 'Payment not confirmed.',
354
+ };
355
+ }
356
+ const changeAddress = ctx.bch.getAddressSetAt(0).change;
357
+ let txid;
358
+ let vout = 0;
359
+ try {
360
+ if (paymentMethod === 'lift') {
361
+ const result = await payWithLift(ctx, hdWallet, requirements, changeAddress, isChipnet);
362
+ txid = result.txid;
363
+ vout = result.vout;
364
+ }
365
+ else {
366
+ if (!isValidBchAddress(requirements.payTo, isChipnet)) {
367
+ return {
368
+ success: false,
369
+ paid: false,
370
+ status: 402,
371
+ error: 'Server returned an invalid BCH payment address.',
372
+ };
373
+ }
374
+ const amountBch = Number(requirements.amount) / 1e8;
375
+ const sendResult = await ctx.bch.sendBch(amountBch, requirements.payTo, changeAddress);
376
+ if (!sendResult.success || !sendResult.txid) {
377
+ return {
378
+ success: false,
379
+ paid: false,
380
+ status: 402,
381
+ error: sendResult.error || 'Transaction broadcast failed.',
382
+ };
383
+ }
384
+ txid = sendResult.txid;
385
+ }
386
+ }
387
+ catch (err) {
388
+ return { success: false, paid: false, status: 402, error: err?.message || String(err) };
389
+ }
390
+ const paymentPayload = await x402Payer.createPaymentPayload(requirements, paymentRequired.resource.url, txid, vout, requirements.amount);
391
+ const retryHeaders = {
392
+ ...headers,
393
+ 'PAYMENT-SIGNATURE': JSON.stringify(paymentPayload),
394
+ };
395
+ let retryResponse;
396
+ try {
397
+ retryResponse = await fetch(url, {
398
+ method: 'POST',
399
+ headers: retryHeaders,
400
+ body,
401
+ signal: AbortSignal.timeout(240000),
402
+ });
403
+ }
404
+ catch (err) {
405
+ return {
406
+ success: true,
407
+ paid: true,
408
+ model: model.id,
409
+ displayName: model.display_name,
410
+ minutes: tier.minutes,
411
+ priceSats,
412
+ paymentMethod,
413
+ txid,
414
+ recipientAddress: requirements.payTo,
415
+ error: `Payment was broadcast but the response timed out: ${err?.message || err}. Check credits with \`paytaca ai credits\`.`,
416
+ };
417
+ }
418
+ const retryText = await retryResponse.text();
419
+ let retryData;
420
+ try {
421
+ retryData = JSON.parse(retryText);
422
+ }
423
+ catch {
424
+ retryData = retryText;
425
+ }
426
+ let sessionActivated = false;
427
+ let timeRemainingSeconds;
428
+ try {
429
+ const status = await getWalletStatus(ctx.walletHash, { backendUrl: baseUrl });
430
+ const session = findSession(status, model.id);
431
+ sessionActivated = hasActiveCredits(status, model.id);
432
+ timeRemainingSeconds = session?.time_remaining_seconds;
433
+ }
434
+ catch {
435
+ // Non-critical.
436
+ }
437
+ return {
438
+ success: retryResponse.ok,
439
+ paid: true,
440
+ model: model.id,
441
+ displayName: model.display_name,
442
+ minutes: tier.minutes,
443
+ priceSats,
444
+ paymentMethod,
445
+ txid,
446
+ recipientAddress: requirements.payTo,
447
+ status: retryResponse.status,
448
+ sessionActivated,
449
+ timeRemainingSeconds,
450
+ data: retryData,
451
+ error: retryResponse.ok
452
+ ? undefined
453
+ : `Payment broadcast (txid ${txid}) but the backend returned ${retryResponse.status}.`,
454
+ };
455
+ }
456
+ //# sourceMappingURL=purchase.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"purchase.js","sourceRoot":"","sources":["../../src/ai/purchase.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"address.d.ts","sourceRoot":"","sources":["../../src/commands/address.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAInC,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA+F9D"}
1
+ {"version":3,"file":"address.d.ts","sourceRoot":"","sources":["../../src/commands/address.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAInC,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAgJ9D"}
@@ -8,7 +8,7 @@
8
8
  * Use --token to derive token-aware (z-prefix) addresses for CashTokens.
9
9
  */
10
10
  import chalk from 'chalk';
11
- import { loadWallet, loadMnemonic } from '../wallet/index.js';
11
+ import { WalletNotConfiguredError, resolveNetwork, requireWallet } from '../core/context.js';
12
12
  export function registerAddressCommands(program) {
13
13
  const address = program
14
14
  .command('address')
@@ -20,33 +20,63 @@ export function registerAddressCommands(program) {
20
20
  .argument('[index]', 'Address index (default: 0)', '0')
21
21
  .option('--chipnet', 'Use chipnet (testnet) instead of mainnet')
22
22
  .option('--token', 'Show token-aware (z-prefix) addresses for CashTokens')
23
- .action((_index, opts) => {
23
+ .option('--json', 'Output as JSON')
24
+ .action(async (_index, opts) => {
24
25
  const isChipnet = Boolean(opts.chipnet);
25
26
  const isToken = Boolean(opts.token);
27
+ const asJson = Boolean(opts.json);
26
28
  const index = parseInt(_index, 10);
27
29
  if (isNaN(index) || index < 0) {
28
30
  console.log(chalk.red('\nError: Index must be a non-negative integer.\n'));
29
31
  process.exit(1);
30
32
  }
31
- const data = loadMnemonic();
32
- if (!data) {
33
- console.log(chalk.red('\nNo wallet found. Run `paytaca wallet create` or `paytaca wallet import` first.\n'));
34
- process.exit(1);
33
+ try {
34
+ const ctx = requireWallet(isChipnet);
35
+ const network = resolveNetwork(isChipnet).network;
36
+ const addressSet = isToken
37
+ ? ctx.bch.getTokenAddressSetAt(index)
38
+ : ctx.bch.getAddressSetAt(index);
39
+ let subscribed = false;
40
+ try {
41
+ subscribed = Boolean(await ctx.bch.getNewAddressSet(index));
42
+ }
43
+ catch {
44
+ // Non-critical
45
+ }
46
+ if (asJson) {
47
+ console.log(JSON.stringify({
48
+ network,
49
+ index,
50
+ token: isToken,
51
+ receiving: addressSet.receiving,
52
+ change: addressSet.change,
53
+ subscribed,
54
+ }, null, 2));
55
+ return;
56
+ }
57
+ const label = isToken ? 'Token address' : 'Address';
58
+ console.log(chalk.bold(`\n ${label} at index ${index} (${network})\n`));
59
+ console.log(` Receiving: ${addressSet.receiving}`);
60
+ console.log(chalk.dim(` Change: ${addressSet.change}`));
61
+ if (isToken)
62
+ console.log(chalk.dim(' Type: token-aware (z-prefix)'));
63
+ console.log(subscribed
64
+ ? chalk.dim(' Watching: subscribed with Watchtower')
65
+ : chalk.yellow(' Watching: not subscribed (address may not be monitored)'));
66
+ console.log();
35
67
  }
36
- const w = loadWallet();
37
- const bchWallet = w.forNetwork(isChipnet);
38
- const network = isChipnet ? 'chipnet' : 'mainnet';
39
- const addressSet = isToken
40
- ? bchWallet.getTokenAddressSetAt(index)
41
- : bchWallet.getAddressSetAt(index);
42
- const label = isToken ? 'Token address' : 'Address';
43
- console.log(chalk.bold(`\n ${label} at index ${index} (${network})\n`));
44
- console.log(` Receiving: ${addressSet.receiving}`);
45
- console.log(chalk.dim(` Change: ${addressSet.change}`));
46
- if (isToken) {
47
- console.log(chalk.dim(' Type: token-aware (z-prefix)'));
68
+ catch (err) {
69
+ if (asJson) {
70
+ console.log(JSON.stringify({ error: err.message || String(err) }, null, 2));
71
+ process.exit(1);
72
+ }
73
+ if (err instanceof WalletNotConfiguredError) {
74
+ console.log(chalk.red(`\n${err.message}\n`));
75
+ process.exit(1);
76
+ }
77
+ console.log(chalk.red(`\n Error: ${err.message || err}\n`));
78
+ process.exit(1);
48
79
  }
49
- console.log();
50
80
  });
51
81
  // ── address list ───────────────────────────────────────────────────────
52
82
  address
@@ -55,33 +85,55 @@ export function registerAddressCommands(program) {
55
85
  .option('-n, --count <count>', 'Number of addresses to derive', '5')
56
86
  .option('--chipnet', 'Use chipnet (testnet) instead of mainnet')
57
87
  .option('--token', 'Show token-aware (z-prefix) addresses for CashTokens')
88
+ .option('--json', 'Output as JSON')
58
89
  .action((_opts) => {
59
90
  const isChipnet = Boolean(_opts.chipnet);
60
91
  const isToken = Boolean(_opts.token);
92
+ const asJson = Boolean(_opts.json);
61
93
  const count = parseInt(_opts.count, 10);
62
94
  if (isNaN(count) || count < 1) {
63
95
  console.log(chalk.red('\nError: Count must be a positive integer.\n'));
64
96
  process.exit(1);
65
97
  }
66
- const data = loadMnemonic();
67
- if (!data) {
68
- console.log(chalk.red('\nNo wallet found. Run `paytaca wallet create` or `paytaca wallet import` first.\n'));
69
- process.exit(1);
98
+ try {
99
+ const ctx = requireWallet(isChipnet);
100
+ const network = resolveNetwork(isChipnet).network;
101
+ const addresses = [];
102
+ for (let i = 0; i < count; i++) {
103
+ const addressSet = isToken
104
+ ? ctx.bch.getTokenAddressSetAt(i)
105
+ : ctx.bch.getAddressSetAt(i);
106
+ addresses.push({
107
+ index: i,
108
+ receiving: addressSet.receiving,
109
+ change: addressSet.change,
110
+ });
111
+ }
112
+ if (asJson) {
113
+ console.log(JSON.stringify({ network, token: isToken, addresses }, null, 2));
114
+ return;
115
+ }
116
+ const typeLabel = isToken ? 'Token Addresses' : 'Addresses';
117
+ console.log(chalk.bold(`\n ${typeLabel} (${network})\n`));
118
+ console.log(chalk.dim(` ${'Index'.padEnd(8)}${'Receiving Address'}`));
119
+ console.log(chalk.dim(` ${'─'.repeat(70)}`));
120
+ for (const a of addresses) {
121
+ console.log(` ${String(a.index).padEnd(8)}${a.receiving}`);
122
+ }
123
+ console.log();
70
124
  }
71
- const w = loadWallet();
72
- const bchWallet = w.forNetwork(isChipnet);
73
- const network = isChipnet ? 'chipnet' : 'mainnet';
74
- const typeLabel = isToken ? 'Token Addresses' : 'Addresses';
75
- console.log(chalk.bold(`\n ${typeLabel} (${network})\n`));
76
- console.log(chalk.dim(` ${'Index'.padEnd(8)}${'Receiving Address'}`));
77
- console.log(chalk.dim(` ${'─'.repeat(70)}`));
78
- for (let i = 0; i < count; i++) {
79
- const addressSet = isToken
80
- ? bchWallet.getTokenAddressSetAt(i)
81
- : bchWallet.getAddressSetAt(i);
82
- console.log(` ${String(i).padEnd(8)}${addressSet.receiving}`);
125
+ catch (err) {
126
+ if (asJson) {
127
+ console.log(JSON.stringify({ error: err.message || String(err) }, null, 2));
128
+ process.exit(1);
129
+ }
130
+ if (err instanceof WalletNotConfiguredError) {
131
+ console.log(chalk.red(`\n${err.message}\n`));
132
+ process.exit(1);
133
+ }
134
+ console.log(chalk.red(`\n Error: ${err.message || err}\n`));
135
+ process.exit(1);
83
136
  }
84
- console.log();
85
137
  });
86
138
  }
87
139
  //# sourceMappingURL=address.js.map