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.
- package/README.md +153 -37
- package/dist/ai/autoRefill.d.ts +27 -0
- package/dist/ai/autoRefill.d.ts.map +1 -0
- package/dist/ai/autoRefill.js +75 -0
- package/dist/ai/autoRefill.js.map +1 -0
- package/dist/ai/client.d.ts +73 -0
- package/dist/ai/client.d.ts.map +1 -0
- package/dist/ai/client.js +90 -0
- package/dist/ai/client.js.map +1 -0
- package/dist/ai/config.d.ts +7 -0
- package/dist/ai/config.d.ts.map +1 -0
- package/dist/ai/config.js +16 -0
- package/dist/ai/config.js.map +1 -0
- package/dist/ai/configure.d.ts +61 -0
- package/dist/ai/configure.d.ts.map +1 -0
- package/dist/ai/configure.js +452 -0
- package/dist/ai/configure.js.map +1 -0
- package/dist/ai/credits.d.ts +27 -0
- package/dist/ai/credits.d.ts.map +1 -0
- package/dist/ai/credits.js +99 -0
- package/dist/ai/credits.js.map +1 -0
- package/dist/ai/models.d.ts +13 -0
- package/dist/ai/models.d.ts.map +1 -0
- package/dist/ai/models.js +49 -0
- package/dist/ai/models.js.map +1 -0
- package/dist/ai/oauth.d.ts +45 -0
- package/dist/ai/oauth.d.ts.map +1 -0
- package/dist/ai/oauth.js +137 -0
- package/dist/ai/oauth.js.map +1 -0
- package/dist/ai/purchase.d.ts +30 -0
- package/dist/ai/purchase.d.ts.map +1 -0
- package/dist/ai/purchase.js +456 -0
- package/dist/ai/purchase.js.map +1 -0
- package/dist/commands/address.d.ts.map +1 -1
- package/dist/commands/address.js +88 -36
- package/dist/commands/address.js.map +1 -1
- package/dist/commands/ai.d.ts +9 -0
- package/dist/commands/ai.d.ts.map +1 -0
- package/dist/commands/ai.js +675 -0
- package/dist/commands/ai.js.map +1 -0
- package/dist/commands/balance.d.ts.map +1 -1
- package/dist/commands/balance.js +68 -129
- package/dist/commands/balance.js.map +1 -1
- package/dist/commands/history.d.ts.map +1 -1
- package/dist/commands/history.js +38 -78
- package/dist/commands/history.js.map +1 -1
- package/dist/commands/mcp.d.ts +14 -0
- package/dist/commands/mcp.d.ts.map +1 -0
- package/dist/commands/mcp.js +68 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/commands/pay.js +1 -1
- package/dist/commands/pay.js.map +1 -1
- package/dist/commands/receive.d.ts +1 -8
- package/dist/commands/receive.d.ts.map +1 -1
- package/dist/commands/receive.js +51 -124
- package/dist/commands/receive.js.map +1 -1
- package/dist/commands/send.d.ts +0 -10
- package/dist/commands/send.d.ts.map +1 -1
- package/dist/commands/send.js +40 -50
- package/dist/commands/send.js.map +1 -1
- package/dist/commands/swap.js +1 -1
- package/dist/commands/swap.js.map +1 -1
- package/dist/commands/token.d.ts +1 -9
- package/dist/commands/token.d.ts.map +1 -1
- package/dist/commands/token.js +192 -289
- package/dist/commands/token.js.map +1 -1
- package/dist/core/context.d.ts +30 -0
- package/dist/core/context.d.ts.map +1 -0
- package/dist/core/context.js +45 -0
- package/dist/core/context.js.map +1 -0
- package/dist/core/wallet.d.ts +130 -0
- package/dist/core/wallet.d.ts.map +1 -0
- package/dist/core/wallet.js +276 -0
- package/dist/core/wallet.js.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/mcp/server.d.ts +8 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +24 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tools.d.ts +5 -0
- package/dist/mcp/tools.d.ts.map +1 -0
- package/dist/mcp/tools.js +473 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/utils/format.d.ts +23 -0
- package/dist/utils/format.d.ts.map +1 -0
- package/dist/utils/format.js +62 -0
- package/dist/utils/format.js.map +1 -0
- package/dist/utils/x402.js +1 -1
- package/dist/utils/x402.js.map +1 -1
- package/dist/wallet/index.d.ts +13 -0
- package/dist/wallet/index.d.ts.map +1 -1
- package/dist/wallet/index.js +18 -0
- package/dist/wallet/index.js.map +1 -1
- package/dist/wallet/keys.d.ts.map +1 -1
- package/dist/wallet/keys.js +2 -0
- package/dist/wallet/keys.js.map +1 -1
- package/package.json +7 -3
- package/dist/commands/wallet.test.d.ts +0 -2
- package/dist/commands/wallet.test.d.ts.map +0 -1
- package/dist/commands/wallet.test.js +0 -68
- package/dist/commands/wallet.test.js.map +0 -1
- package/dist/nostr/chat.test.d.ts +0 -2
- package/dist/nostr/chat.test.d.ts.map +0 -1
- package/dist/nostr/chat.test.js +0 -121
- package/dist/nostr/chat.test.js.map +0 -1
- package/dist/nostr/store.test.d.ts +0 -2
- package/dist/nostr/store.test.d.ts.map +0 -1
- package/dist/nostr/store.test.js +0 -456
- package/dist/nostr/store.test.js.map +0 -1
- package/dist/utils/prices.test.d.ts +0 -5
- package/dist/utils/prices.test.d.ts.map +0 -1
- package/dist/utils/prices.test.js +0 -62
- package/dist/utils/prices.test.js.map +0 -1
- package/dist/utils/x402.test.d.ts +0 -2
- package/dist/utils/x402.test.d.ts.map +0 -1
- package/dist/utils/x402.test.js +0 -216
- package/dist/utils/x402.test.js.map +0 -1
- package/dist/wallet/cauldron/pools.test.d.ts +0 -3
- package/dist/wallet/cauldron/pools.test.d.ts.map +0 -1
- package/dist/wallet/cauldron/pools.test.js +0 -149
- package/dist/wallet/cauldron/pools.test.js.map +0 -1
- package/dist/wallet/cauldron/swap.test.d.ts +0 -2
- package/dist/wallet/cauldron/swap.test.d.ts.map +0 -1
- package/dist/wallet/cauldron/swap.test.js +0 -179
- package/dist/wallet/cauldron/swap.test.js.map +0 -1
- package/skills/README.md +0 -68
- package/skills/paytaca-send/SKILL.md +0 -159
- package/skills/paytaca-wallet/SKILL.md +0 -164
- 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":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAA;AACtD,OAAO,EACL,4BAA4B,EAC5B,QAAQ,GACT,MAAM,4BAA4B,CAAA;AACnC,OAAO,EAAE,aAAa,EAAsB,MAAM,oBAAoB,CAAA;AACtE,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAC7C,OAAO,EACL,wBAAwB,EACxB,4BAA4B,GAC7B,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAA;AACzD,OAAO,EACL,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,2BAA2B,CAAA;AAClC,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAA;AACnF,OAAO,EACL,YAAY,EACZ,+BAA+B,GAEhC,MAAM,gCAAgC,CAAA;AACvC,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAA;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAEnD,OAAO,EACL,SAAS,EACT,eAAe,GAIhB,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACtE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AACrE,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAgC5D,MAAM,kBAAkB,GAAG,CAAC,CAAA;AAC5B,MAAM,qBAAqB,GAAG,GAAG,CAAA;AACjC,MAAM,gCAAgC,GAAG,IAAI,CAAA;AAE7C,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAA;AAC1D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,OAAe,EACf,OAAe,EACf,OAAe;IAEf,IAAI,SAAS,GAAG,CAAC,CAAA;IACjB,MAAM,MAAM,GAAa,EAAE,CAAA;IAC3B,IAAI,SAAS,GAAG,EAAE,CAAA;IAElB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,kBAAkB,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5C,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;YACxE,MAAM,KAAK,GAAG,WAAW,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,EAAE,OAAO,CAAC,CAAA;YACvD,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,SAAS,GAAG,SAAS,OAAO,qBAAqB,CAAA;YACnD,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;gBACvC,IAAI,CAAC,IAAI,EAAE,CAAC;oBACV,SAAS,GAAG,MAAM,OAAO,iBAAiB,OAAO,EAAE,CAAA;gBACrD,CAAC;qBAAM,CAAC;oBACN,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAA;oBACzC,SAAS,EAAE,CAAA;gBACb,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,SAAS,GAAG,GAAG,EAAE,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC,CAAA;QACzC,CAAC;QACD,IAAI,CAAC,GAAG,kBAAkB,GAAG,CAAC;YAAE,MAAM,KAAK,CAAC,qBAAqB,CAAC,CAAA;IACpE,CAAC;IAED,IAAI,SAAS,KAAK,kBAAkB,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1D,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAA;QAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAA;QAC/B,MAAM,KAAK,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAA;QACtE,IAAI,KAAK,IAAI,gCAAgC;YAAE,OAAM;QACrD,MAAM,IAAI,KAAK,CACb,oDAAoD,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,mEAAmE,CACzI,CAAA;IACH,CAAC;IACD,MAAM,IAAI,KAAK,CACb,oEAAoE,SAAS,IAAI,kBAAkB,GACjG,SAAS,CAAC,CAAC,CAAC,iBAAiB,SAAS,EAAE,CAAC,CAAC,CAAC,EAC7C,8DAA8D,CAC/D,CAAA;AACH,CAAC;AAQD,SAAS,gBAAgB,CACvB,OAAe,EACf,UAAkB,EAClB,KAAoB,EACpB,IAAe,EACf,aAA4B;IAE5B,MAAM,OAAO,GAA2B;QACtC,cAAc,EAAE,kBAAkB;QAClC,eAAe,EAAE,UAAU;QAC3B,YAAY,EAAE,KAAK,CAAC,EAAE;QACtB,oBAAoB,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC;QAC1C,cAAc,EAAE,GAAG;KACpB,CAAA;IACD,IAAI,aAAa,KAAK,MAAM;QAAE,OAAO,CAAC,kBAAkB,CAAC,GAAG,MAAM,CAAA;IAElE,OAAO;QACL,GAAG,EAAE,GAAG,MAAM,CAAC,OAAO,EAAE,sBAAsB,CAAC,gBAAgB,kBAAkB,CAC/E,UAAU,CACX,EAAE;QACH,OAAO;QACP,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,KAAK,EAAE,KAAK,CAAC,EAAE;YACf,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YAC3C,MAAM,EAAE,KAAK;YACb,UAAU,EAAE,CAAC;SACd,CAAC;KACH,CAAA;AACH,CAAC;AAED,KAAK,UAAU,WAAW,CACxB,GAAkB,EAClB,QAAyB,EACzB,YAAiC,EACjC,aAAqB,EACrB,SAAkB;IAElB,MAAM,OAAO,GAAG,aAAa,CAAA;IAC7B,MAAM,UAAU,GAAG,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAA;IAE9C,MAAM,CAAC,QAAQ,EAAE,QAAQ,EAAE,UAAU,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACzD,kBAAkB,CAAC,OAAO,CAAC;QAC3B,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE;QAClB,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;KACxC,CAAC,CAAA;IACF,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvC,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAA;IACpE,CAAC;IACD,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAA;IAErE,MAAM,YAAY,GAAG,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,MAAM,CAC5C,CAAC,GAAW,EAAE,CAAiB,EAAE,EAAE,CAAC,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,EAC/D,EAAE,CACH,CAAA;IACD,IAAI,YAAY,IAAI,EAAE,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CACb,uFAAuF,CACxF,CAAA;IACH,CAAC;IAED,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAoB,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;IAC9E,MAAM,cAAc,GAAG,+BAA+B,CAAC;QACrD,KAAK,EAAE,CAAC,GAAG,QAAQ,EAAE,GAAG,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC;QAC3C,MAAM,EAAE,QAAQ;KACjB,CAAC,CAAA;IACF,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAA;IAClD,CAAC;IAED,MAAM,YAAY,GAAG,4BAA4B,CAAC,YAAY,CAAC,KAAK,CAAC,CAAA;IACrE,IAAI,CAAC,YAAY,IAAI,OAAO,YAAY,KAAK,QAAQ,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC;QAChF,MAAM,IAAI,KAAK,CAAC,4BAA4B,YAAY,CAAC,KAAK,EAAE,CAAC,CAAA;IACnE,CAAC;IACD,MAAM,aAAa,GAAG,4BAA4B,CAAC,aAAa,CAAC,CAAA;IACjE,IAAI,CAAC,aAAa,IAAI,OAAO,aAAa,KAAK,QAAQ,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,CAAC;QACnF,MAAM,IAAI,KAAK,CAAC,2BAA2B,aAAa,EAAE,CAAC,CAAA;IAC7D,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,gBAAgB,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAA;IACrE,MAAM,WAAW,GAAG,SAAS;QAC3B,CAAC,CAAC,MAAM,cAAc,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC;QACnD,CAAC,CAAC,IAAI,CAAA;IAER,MAAM,KAAK,GAAG,IAAI,WAAW,EAAE,CAAA;IAC/B,IAAI,KAAK,GAAG,IAAI,CAAA;IAChB,IAAI,OAAO,GAAG,IAAI,CAAA;IAClB,IAAI,SAAS,GAAiB,IAAI,CAAA;IAElC,KAAK,MAAM,MAAM,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;QAC9C,IAAI,CAAC;YACH,KAAK,GAAG,YAAY,CAAC;gBACnB,KAAK;gBACL,aAAa,EAAE,KAAK;gBACpB,MAAM,EAAE,SAAS;gBACjB,MAAM,EAAE,UAAU,GAAG,MAAM;aAC5B,CAAC,CAAA;YACF,MAAM,WAAW,GAAU;gBACzB;oBACE,IAAI,EAAE,oBAAoB,CAAC,KAAK;oBAChC,gBAAgB,EAAE,YAAY,CAAC,QAAQ;oBACvC,MAAM,EAAE,UAAU;iBACnB;aACF,CAAA;YAED,MAAM,WAAW,GAAG,SAAS;gBAC3B,CAAC,CAAC,kBAAkB,CAAC;oBACjB,WAAW,EAAE,KAAK;oBAClB,aAAa,EAAE,KAAK;oBACpB,SAAS;oBACT,WAAW;iBACZ,CAAC;gBACJ,CAAC,CAAC,IAAI,CAAA;YACR,IAAI,WAAW,EAAE,CAAC;gBAChB,MAAM,UAAU,GAAG,4BAA4B,CAAC,WAAW,CAAC,EAAE,CAAC,CAAA;gBAC/D,IAAI,UAAU,IAAI,OAAO,UAAU,KAAK,QAAQ,IAAI,UAAU,CAAC,QAAQ,EAAE,CAAC;oBACxE,WAAW,CAAC,IAAI,CAAC;wBACf,IAAI,EAAE,oBAAoB,CAAC,KAAK;wBAChC,gBAAgB,EAAE,UAAU,CAAC,QAAQ;wBACrC,MAAM,EAAE,WAAW,CAAC,MAAM;qBAC3B,CAAC,CAAA;gBACJ,CAAC;YACH,CAAC;YAED,WAAW,CAAC,IAAI,CAAC;gBACf,IAAI,EAAE,oBAAoB,CAAC,MAAM;gBACjC,gBAAgB,EAAE,aAAa,CAAC,QAAQ;gBACxC,6BAA6B,EAAE,KAAK;gBACpC,qDAAqD,EAAE,KAAK;gBAC5D,2CAA2C,EAAE,IAAI;aAClD,CAAC,CAAA;YAEF,OAAO,GAAG,KAAK,CAAC,aAAa,CAC3B,KAAK,CAAC,OAAO,EACb,cAAc,EACd,WAAW,EACX,IAAI,EACJ,EAAE,CACH,CAAA;YACD,KAAK,CAAC,aAAa,CAAC,OAAO,CAAC,CAAA;YAC5B,MAAK;QACP,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,SAAS,GAAG,GAAG,CAAA;QACjB,CAAC;IACH,CAAC;IAED,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,MAAM,GAAI,KAAa,EAAE,OAAO,EAAE,MAAM,CAAA;QAC9C,IAAI,MAAM,IAAI,YAAY,GAAG,MAAM,EAAE,CAAC;YACpC,MAAM,IAAI,KAAK,CACb,iDAAiD,MAAM,kCAAkC,YAAY,GAAG,CACzG,CAAA;QACH,CAAC;QACD,MAAM,IAAI,KAAK,CACb,+CACE,SAAS,EAAE,OAAO,IAAI,eACxB,EAAE,CACH,CAAA;IACH,CAAC;IAED,MAAM,EAAE,GAAI,OAAe,CAAC,6BAA6B,CAAA;IACzD,MAAM,QAAQ,GAAG,QAAQ,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAA;IAChD,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,SAAS,CAC/B,CAAC,CAAM,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,eAAe,CAAC,KAAK,QAAQ,CACrD,CAAA;IACD,IAAI,IAAI,KAAK,CAAC,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAA;IAElF,MAAM,KAAK,GAAG,QAAQ,CAAE,OAAe,CAAC,KAAK,CAAC,CAAA;IAC9C,MAAM,iBAAiB,GAAG,MAAO,GAAG,CAAC,GAAG,CAAC,UAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CACvE,YAAY,EACZ,EAAE,WAAW,EAAE,KAAK,EAAE,CACvB,CAAA;IACD,MAAM,IAAI,GAAG,iBAAiB,CAAC,IAAI,CAAA;IACnC,IAAI,IAAI,EAAE,MAAM,EAAE,CAAC;QACjB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,CAAA;QACnD,OAAO,IAAI,CAAC,MAAM,CAAA;IACpB,CAAC;IACD,IAAI,CAAC,IAAI,EAAE,OAAO,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,IAAI,kBAAkB,CAAC,CAAA;IACpD,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,CAAA;AAClC,CAAC;AAED,SAAS,gBAAgB,CACvB,MAAgB,EAChB,UAAkB,EAClB,OAAe;IAEf,MAAM,KAAK,GAAG,WAAW,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,EAAE,UAAU,CAAC,CAAA;IAC1D,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,kBAAkB,UAAU,wDAAwD,CAAC,CAAA;IACvG,CAAC;IACD,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;IACvC,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CACb,MAAM,OAAO,8BAA8B,KAAK,CAAC,YAAY,IAAI,KAAK,CAAC,EAAE,GAAG,CAC7E,CAAA;IACH,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAA;AACxB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,IAAoB;IAChD,MAAM,aAAa,GACjB,IAAI,CAAC,aAAa,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAA;IAChD,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IACzC,MAAM,OAAO,GAAG,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;IAElD,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA;IAClD,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IACpC,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,gBAAgB,EAAE,CAAA;IACjE,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,OAAO,IAAI,CAAC,EAAE,CAAC;QAC9C,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,6BAA6B,EAAE,CAAA;IAC9E,CAAC;IAED,IAAI,GAAkB,CAAA;IACtB,IAAI,KAAoB,CAAA;IACxB,IAAI,IAAe,CAAA;IACnB,IAAI,CAAC;QACH,GAAG,GAAG,aAAa,CAAC,SAAS,CAAC,CAAA;QAC9B,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,CAAA;QACvD,MAAM,QAAQ,GAAG,gBAAgB,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,CAAC,CAAA;QAC9D,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAA;QACtB,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAA;IACtB,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,CAAA;IAC5E,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA;IAE9C,IAAI,CAAC,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAChC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,GAAG,CAAC,UAAU,EAAE;gBACnD,UAAU,EAAE,OAAO;aACpB,CAAC,CAAA;YACF,IAAI,gBAAgB,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;gBACvC,MAAM,OAAO,GAAG,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,CAAA;gBAC7C,MAAM,SAAS,GAAG,cAAc,CAAC,OAAO,EAAE,sBAAsB,IAAI,CAAC,CAAC,CAAA;gBACtE,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,IAAI,EAAE,KAAK;oBACX,KAAK,EAAE,KAAK,CAAC,EAAE;oBACf,WAAW,EAAE,KAAK,CAAC,YAAY;oBAC/B,KAAK,EAAE,GAAG,KAAK,CAAC,YAAY,IAAI,KAAK,CAAC,EAAE,cAAc,SAAS,sFAAsF;iBACtJ,CAAA;YACH,CAAC;QACH,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,IAAI,EAAE,KAAK;gBACX,KAAK,EAAE,qDAAqD,GAAG,EAAE,OAAO,IAAI,GAAG,EAAE;aAClF,CAAA;QACH,CAAC;IACH,CAAC;IAED,IAAI,aAAa,KAAK,KAAK,EAAE,CAAC;QAC5B,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,UAAU,EAAE,CAAA;YAC1C,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,GAAG,GAAG,CAAC,CAAA;YACzD,IAAI,SAAS,GAAG,CAAC,IAAI,aAAa,GAAG,SAAS,EAAE,CAAC;gBAC/C,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,IAAI,EAAE,KAAK;oBACX,KAAK,EAAE,KAAK,CAAC,EAAE;oBACf,WAAW,EAAE,KAAK,CAAC,YAAY;oBAC/B,SAAS;oBACT,KAAK,EAAE,yBAAyB,CAAC,aAAa,GAAG,GAAG,CAAC,CAAC,OAAO,CAC3D,CAAC,CACF,0BAA0B,OAAO,sBAAsB,CACtD,SAAS,GAAG,GAAG,CAChB,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO;iBACpB,CAAA;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,2EAA2E;QAC7E,CAAC;IACH,CAAC;IAED,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC,kBAAkB,KAAK,GAAG,EAAE,CAAC;QAC9D,IAAI,CAAC;YACH,MAAM,kBAAkB,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC,CAAA;QAC3D,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,CAAA;QAC5E,CAAC;IACH,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,eAAe,CAClC,GAAG,CAAC,QAAQ,EACZ,mBAAmB,EACnB,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAClC,CAAA;IACD,MAAM,SAAS,GAAG,IAAI,SAAS,CAAC,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC,CAAA;IAC9D,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,gBAAgB,CAC7C,OAAO,EACP,GAAG,CAAC,UAAU,EACd,KAAK,EACL,IAAI,EACJ,aAAa,CACd,CAAA;IAED,IAAI,aAAuB,CAAA;IAC3B,IAAI,CAAC;QACH,aAAa,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAC/B,MAAM,EAAE,MAAM;YACd,OAAO;YACP,IAAI;YACJ,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC;SACpC,CAAC,CAAA;IACJ,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,mBAAmB,GAAG,EAAE,OAAO,IAAI,GAAG,EAAE,EAAE,CAAA;IACzF,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,IAAI,EAAE,CAAA;IAC5C,IAAI,SAAc,CAAA;IAClB,IAAI,CAAC;QACH,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;IACnC,CAAC;IAAC,MAAM,CAAC;QACP,SAAS,GAAG,SAAS,CAAA;IACvB,CAAC;IAED,IAAI,aAAa,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QACjC,OAAO;YACL,OAAO,EAAE,IAAI;YACb,IAAI,EAAE,KAAK;YACX,KAAK,EAAE,KAAK,CAAC,EAAE;YACf,WAAW,EAAE,KAAK,CAAC,YAAY;YAC/B,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,SAAS;YACT,aAAa;YACb,MAAM,EAAE,aAAa,CAAC,MAAM;YAC5B,IAAI,EAAE,SAAS;YACf,KAAK,EACH,aAAa,CAAC,EAAE;gBACd,CAAC,CAAC,oGAAoG;gBACtG,CAAC,CAAC,wBAAwB,aAAa,CAAC,MAAM,IAAI;SACvD,CAAA;IACH,CAAC;IAED,MAAM,eAAe,GAAG,wBAAwB,CAAC,SAAS,CAAC,CAAA;IAC3D,IAAI,CAAC,eAAe,EAAE,CAAC;QACrB,OAAO;YACL,OAAO,EAAE,KAAK;YACd,IAAI,EAAE,KAAK;YACX,MAAM,EAAE,GAAG;YACX,KAAK,EAAE,yDAAyD;SACjE,CAAA;IACH,CAAC;IACD,MAAM,YAAY,GAAG,4BAA4B,CAC/C,eAAe,EACf,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAClC,CAAA;IACD,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO;YACL,OAAO,EAAE,KAAK;YACd,IAAI,EAAE,KAAK;YACX,MAAM,EAAE,GAAG;YACX,KAAK,EAAE,mDAAmD;SAC3D,CAAA;IACH,CAAC;IAED,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;QACpB,OAAO;YACL,OAAO,EAAE,KAAK;YACd,IAAI,EAAE,KAAK;YACX,MAAM,EAAE,GAAG;YACX,KAAK,EAAE,KAAK,CAAC,EAAE;YACf,WAAW,EAAE,KAAK,CAAC,YAAY;YAC/B,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,SAAS;YACT,aAAa;YACb,gBAAgB,EAAE,YAAY,CAAC,KAAK;YACpC,KAAK,EAAE,wBAAwB;SAChC,CAAA;IACH,CAAC;IAED,MAAM,aAAa,GAAG,GAAG,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,MAAM,CAAA;IACvD,IAAI,IAAY,CAAA;IAChB,IAAI,IAAI,GAAG,CAAC,CAAA;IACZ,IAAI,CAAC;QACH,IAAI,aAAa,KAAK,MAAM,EAAE,CAAC;YAC7B,MAAM,MAAM,GAAG,MAAM,WAAW,CAC9B,GAAG,EACH,QAAQ,EACR,YAAY,EACZ,aAAa,EACb,SAAS,CACV,CAAA;YACD,IAAI,GAAG,MAAM,CAAC,IAAI,CAAA;YAClB,IAAI,GAAG,MAAM,CAAC,IAAI,CAAA;QACpB,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,iBAAiB,CAAC,YAAY,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,CAAC;gBACtD,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,IAAI,EAAE,KAAK;oBACX,MAAM,EAAE,GAAG;oBACX,KAAK,EAAE,iDAAiD;iBACzD,CAAA;YACH,CAAC;YACD,MAAM,SAAS,GAAG,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,GAAG,CAAA;YACnD,MAAM,UAAU,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,OAAO,CACtC,SAAS,EACT,YAAY,CAAC,KAAK,EAClB,aAAa,CACd,CAAA;YACD,IAAI,CAAC,UAAU,CAAC,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;gBAC5C,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,IAAI,EAAE,KAAK;oBACX,MAAM,EAAE,GAAG;oBACX,KAAK,EAAE,UAAU,CAAC,KAAK,IAAI,+BAA+B;iBAC3D,CAAA;YACH,CAAC;YACD,IAAI,GAAG,UAAU,CAAC,IAAI,CAAA;QACxB,CAAC;IACH,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,CAAA;IACzF,CAAC;IAED,MAAM,cAAc,GAAG,MAAM,SAAS,CAAC,oBAAoB,CACzD,YAAY,EACZ,eAAe,CAAC,QAAQ,CAAC,GAAG,EAC5B,IAAI,EACJ,IAAI,EACJ,YAAY,CAAC,MAAM,CACpB,CAAA;IACD,MAAM,YAAY,GAAG;QACnB,GAAG,OAAO;QACV,mBAAmB,EAAE,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC;KACpD,CAAA;IAED,IAAI,aAAuB,CAAA;IAC3B,IAAI,CAAC;QACH,aAAa,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAC/B,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,YAAY;YACrB,IAAI;YACJ,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC;SACpC,CAAC,CAAA;IACJ,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,OAAO;YACL,OAAO,EAAE,IAAI;YACb,IAAI,EAAE,IAAI;YACV,KAAK,EAAE,KAAK,CAAC,EAAE;YACf,WAAW,EAAE,KAAK,CAAC,YAAY;YAC/B,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,SAAS;YACT,aAAa;YACb,IAAI;YACJ,gBAAgB,EAAE,YAAY,CAAC,KAAK;YACpC,KAAK,EAAE,qDAAqD,GAAG,EAAE,OAAO,IAAI,GAAG,8CAA8C;SAC9H,CAAA;IACH,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,IAAI,EAAE,CAAA;IAC5C,IAAI,SAAc,CAAA;IAClB,IAAI,CAAC;QACH,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;IACnC,CAAC;IAAC,MAAM,CAAC;QACP,SAAS,GAAG,SAAS,CAAA;IACvB,CAAC;IAED,IAAI,gBAAgB,GAAG,KAAK,CAAA;IAC5B,IAAI,oBAAwC,CAAA;IAC5C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,GAAG,CAAC,UAAU,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,CAAA;QAC7E,MAAM,OAAO,GAAG,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,CAAA;QAC7C,gBAAgB,GAAG,gBAAgB,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,CAAA;QACrD,oBAAoB,GAAG,OAAO,EAAE,sBAAsB,CAAA;IACxD,CAAC;IAAC,MAAM,CAAC;QACP,gBAAgB;IAClB,CAAC;IAED,OAAO;QACL,OAAO,EAAE,aAAa,CAAC,EAAE;QACzB,IAAI,EAAE,IAAI;QACV,KAAK,EAAE,KAAK,CAAC,EAAE;QACf,WAAW,EAAE,KAAK,CAAC,YAAY;QAC/B,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,SAAS;QACT,aAAa;QACb,IAAI;QACJ,gBAAgB,EAAE,YAAY,CAAC,KAAK;QACpC,MAAM,EAAE,aAAa,CAAC,MAAM;QAC5B,gBAAgB;QAChB,oBAAoB;QACpB,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,aAAa,CAAC,EAAE;YACrB,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,2BAA2B,IAAI,8BAA8B,aAAa,CAAC,MAAM,GAAG;KACzF,CAAA;AACH,CAAC"}
|
|
@@ -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,
|
|
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"}
|
package/dist/commands/address.js
CHANGED
|
@@ -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 {
|
|
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
|
-
.
|
|
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
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
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
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
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
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
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
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
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
|