paytaca-cli 0.2.0 → 0.3.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 +63 -2
- package/dist/commands/check.d.ts +14 -0
- package/dist/commands/check.d.ts.map +1 -0
- package/dist/commands/check.js +162 -0
- package/dist/commands/check.js.map +1 -0
- package/dist/commands/claude.d.ts +9 -0
- package/dist/commands/claude.d.ts.map +1 -0
- package/dist/commands/claude.js +20 -0
- package/dist/commands/claude.js.map +1 -0
- package/dist/commands/opencode.d.ts +9 -0
- package/dist/commands/opencode.d.ts.map +1 -0
- package/dist/commands/opencode.js +20 -0
- package/dist/commands/opencode.js.map +1 -0
- package/dist/commands/pay.d.ts +17 -0
- package/dist/commands/pay.d.ts.map +1 -0
- package/dist/commands/pay.js +347 -0
- package/dist/commands/pay.js.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -1
- package/dist/types/x402.d.ts +72 -0
- package/dist/types/x402.d.ts.map +1 -0
- package/dist/types/x402.js +9 -0
- package/dist/types/x402.js.map +1 -0
- package/dist/utils/skill.d.ts +17 -0
- package/dist/utils/skill.d.ts.map +1 -0
- package/dist/utils/skill.js +100 -0
- package/dist/utils/skill.js.map +1 -0
- package/dist/utils/x402.d.ts +17 -0
- package/dist/utils/x402.d.ts.map +1 -0
- package/dist/utils/x402.js +119 -0
- package/dist/utils/x402.js.map +1 -0
- package/dist/utils/x402.test.d.ts +2 -0
- package/dist/utils/x402.test.d.ts.map +1 -0
- package/dist/utils/x402.test.js +216 -0
- package/dist/utils/x402.test.js.map +1 -0
- package/dist/wallet/x402.d.ts +29 -0
- package/dist/wallet/x402.d.ts.map +1 -0
- package/dist/wallet/x402.js +45 -0
- package/dist/wallet/x402.js.map +1 -0
- package/package.json +7 -2
- package/skills/paytaca/SKILL.md +123 -0
|
@@ -0,0 +1,347 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI command: pay <url>
|
|
3
|
+
*
|
|
4
|
+
* Makes an HTTP request to a URL, handling x402-bch v2.2 payment requirements.
|
|
5
|
+
* If the server returns 402 PAYMENT-REQUIRED, the wallet pays for the request.
|
|
6
|
+
*
|
|
7
|
+
* Flow:
|
|
8
|
+
* 1. Make HTTP request to URL
|
|
9
|
+
* 2. If 402 response, parse PaymentRequired JSON body
|
|
10
|
+
* 3. Build BCH transaction to pay the required amount
|
|
11
|
+
* 4. Broadcast transaction
|
|
12
|
+
* 5. Build PaymentPayload per x402-bch v2.2 spec
|
|
13
|
+
* 6. Retry original request with PAYMENT-SIGNATURE header containing JSON PayloadPayload
|
|
14
|
+
*/
|
|
15
|
+
import chalk from 'chalk';
|
|
16
|
+
import readline from 'readline';
|
|
17
|
+
import { loadWallet, loadMnemonic } from '../wallet/index.js';
|
|
18
|
+
import { LibauthHDWallet } from '../wallet/keys.js';
|
|
19
|
+
import { X402Payer } from '../wallet/x402.js';
|
|
20
|
+
import { parsePaymentRequiredJson, selectBchPaymentRequirements } from '../utils/x402.js';
|
|
21
|
+
import { BCH_DERIVATION_PATH } from '../utils/network.js';
|
|
22
|
+
export function registerPayCommand(program) {
|
|
23
|
+
program
|
|
24
|
+
.command('pay')
|
|
25
|
+
.description('Make a paid HTTP request with BCH payment via x402-bch v2.2 protocol')
|
|
26
|
+
.argument('<url>', 'URL to request')
|
|
27
|
+
.option('-X, --method <method>', 'HTTP method (default: GET)', 'GET')
|
|
28
|
+
.option('-H, --header <header>', 'Add header to request (repeatable)')
|
|
29
|
+
.option('-d, --body <body>', 'Request body for POST/PUT requests')
|
|
30
|
+
.option('--chipnet', 'Use chipnet (testnet) instead of mainnet')
|
|
31
|
+
.option('--max-amount <amount>', 'Maximum payment amount in satoshis (overrides server\'s max-amount)')
|
|
32
|
+
.option('--change-address <address>', 'Change address for BCH transaction')
|
|
33
|
+
.option('--payer <value>', 'Payer identifier (defaults to wallet address index 0, or pass custom value like user ID for server-side lookups)')
|
|
34
|
+
.option('--dry-run', 'Show what would happen without making payment')
|
|
35
|
+
.option('--json', 'Output results as JSON')
|
|
36
|
+
.action(async (url, opts) => {
|
|
37
|
+
const isChipnet = Boolean(opts.chipnet);
|
|
38
|
+
const network = isChipnet ? 'chipnet' : 'mainnet';
|
|
39
|
+
const isJson = Boolean(opts.json);
|
|
40
|
+
const isDryRun = Boolean(opts.dryRun);
|
|
41
|
+
const data = loadMnemonic();
|
|
42
|
+
if (!data) {
|
|
43
|
+
const err = 'No wallet found. Run `paytaca wallet create` or `paytaca wallet import` first.';
|
|
44
|
+
if (isJson) {
|
|
45
|
+
console.log(JSON.stringify({ success: false, error: err }));
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
console.log(chalk.red(`\n${err}\n`));
|
|
49
|
+
}
|
|
50
|
+
process.exit(1);
|
|
51
|
+
}
|
|
52
|
+
const wallet = loadWallet();
|
|
53
|
+
const bchWallet = wallet.forNetwork(isChipnet);
|
|
54
|
+
const hdWallet = new LibauthHDWallet(data.mnemonic, BCH_DERIVATION_PATH, isChipnet ? 'chipnet' : 'mainnet');
|
|
55
|
+
const x402Payer = new X402Payer({ hdWallet, addressIndex: 0 });
|
|
56
|
+
const headers = {};
|
|
57
|
+
if (opts.header) {
|
|
58
|
+
for (const h of opts.header) {
|
|
59
|
+
const idx = h.indexOf(':');
|
|
60
|
+
if (idx === -1) {
|
|
61
|
+
const err = `Invalid header format: ${h}. Expected "Key: Value"`;
|
|
62
|
+
if (isJson) {
|
|
63
|
+
console.log(JSON.stringify({ success: false, error: err }));
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
console.log(chalk.red(`\n Error: ${err}\n`));
|
|
67
|
+
}
|
|
68
|
+
process.exit(1);
|
|
69
|
+
}
|
|
70
|
+
const key = h.substring(0, idx).trim();
|
|
71
|
+
const value = h.substring(idx + 1).trim();
|
|
72
|
+
headers[key] = value;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
const method = opts.method?.toUpperCase() || 'GET';
|
|
76
|
+
const body = opts.body;
|
|
77
|
+
if (isJson) {
|
|
78
|
+
await runPayJson(url, method, headers, body, opts, x402Payer, bchWallet, isChipnet);
|
|
79
|
+
}
|
|
80
|
+
else if (isDryRun) {
|
|
81
|
+
await runPayDryRun(url, method, headers, body, opts, x402Payer, bchWallet, isChipnet);
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
await runPayHuman(url, method, headers, body, opts, x402Payer, bchWallet, isChipnet);
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
async function runPayHuman(url, method, headers, body, opts, x402Payer, bchWallet, isChipnet) {
|
|
89
|
+
const network = isChipnet ? 'chipnet' : 'mainnet';
|
|
90
|
+
console.log(`\n ${chalk.bold(method)} ${url}`);
|
|
91
|
+
console.log(chalk.dim(` Network: ${chalk.cyan(network)}`));
|
|
92
|
+
console.log(chalk.dim(` Payer: ${opts.payer || x402Payer.getPayerAddress()}`));
|
|
93
|
+
if (Object.keys(headers).length > 0) {
|
|
94
|
+
console.log(chalk.dim(` Headers: ${JSON.stringify(headers)}`));
|
|
95
|
+
}
|
|
96
|
+
console.log();
|
|
97
|
+
try {
|
|
98
|
+
const result = await executePay(url, method, headers, body, opts, x402Payer, bchWallet, false);
|
|
99
|
+
if (result.payment?.required && result.payment.txid) {
|
|
100
|
+
const explorer = isChipnet
|
|
101
|
+
? 'https://chipnet.chaingraph.cash/tx/'
|
|
102
|
+
: 'https://bchexplorer.info/tx/';
|
|
103
|
+
console.log(chalk.dim(` Payment txid: ${explorer}${result.payment.txid}`));
|
|
104
|
+
if (result.payment.recipientAddress) {
|
|
105
|
+
console.log(chalk.dim(` Recipient: ${result.payment.recipientAddress}`));
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
console.log(chalk.green(`\n Response: ${result.status} ${result.statusText}`));
|
|
109
|
+
console.log();
|
|
110
|
+
console.log(formatResponse(result.data));
|
|
111
|
+
}
|
|
112
|
+
catch (err) {
|
|
113
|
+
console.log(chalk.red(`\n Error: ${err.message || err}\n`));
|
|
114
|
+
process.exit(1);
|
|
115
|
+
}
|
|
116
|
+
console.log();
|
|
117
|
+
}
|
|
118
|
+
async function runPayDryRun(url, method, headers, body, opts, x402Payer, bchWallet, isChipnet) {
|
|
119
|
+
const network = isChipnet ? 'chipnet' : 'mainnet';
|
|
120
|
+
const dryRunInfo = {
|
|
121
|
+
url,
|
|
122
|
+
method,
|
|
123
|
+
willRequirePayment: false,
|
|
124
|
+
};
|
|
125
|
+
console.log(`\n ${chalk.bold(method)} ${url} ${chalk.dim('[DRY RUN]')}`);
|
|
126
|
+
console.log(chalk.dim(` Network: ${chalk.cyan(network)}`));
|
|
127
|
+
console.log(chalk.dim(` Payer: ${opts.payer || x402Payer.getPayerAddress()}`));
|
|
128
|
+
console.log();
|
|
129
|
+
try {
|
|
130
|
+
const response = await fetch(url, {
|
|
131
|
+
method,
|
|
132
|
+
headers,
|
|
133
|
+
body: ['POST', 'PUT', 'PATCH'].includes(method) ? body : undefined,
|
|
134
|
+
});
|
|
135
|
+
if (response.status === 402) {
|
|
136
|
+
dryRunInfo.willRequirePayment = true;
|
|
137
|
+
const responseBody = await response.json();
|
|
138
|
+
const paymentRequired = parsePaymentRequiredJson(responseBody);
|
|
139
|
+
if (!paymentRequired) {
|
|
140
|
+
console.log(chalk.red(' Error: Could not parse PaymentRequired from 402 response body'));
|
|
141
|
+
process.exit(1);
|
|
142
|
+
}
|
|
143
|
+
const requirements = selectBchPaymentRequirements(paymentRequired, isChipnet ? 'chipnet' : 'mainnet');
|
|
144
|
+
if (!requirements) {
|
|
145
|
+
console.log(chalk.red(' Error: Server does not accept BCH payment'));
|
|
146
|
+
const acceptedSchemes = paymentRequired.accepts.map(a => `${a.scheme}:${a.network}`).join(', ');
|
|
147
|
+
console.log(chalk.dim(` Accepted schemes: ${acceptedSchemes}`));
|
|
148
|
+
process.exit(1);
|
|
149
|
+
}
|
|
150
|
+
const changeAddressSet = bchWallet.getAddressSetAt(0);
|
|
151
|
+
const changeAddress = opts.changeAddress || changeAddressSet.change;
|
|
152
|
+
dryRunInfo.payment = {
|
|
153
|
+
acceptsBch: true,
|
|
154
|
+
paymentUrl: requirements.payTo,
|
|
155
|
+
amountSats: requirements.amount,
|
|
156
|
+
maxTimeoutSeconds: requirements.maxTimeoutSeconds,
|
|
157
|
+
resourceUrl: paymentRequired.resource.url,
|
|
158
|
+
payerAddress: opts.payer || x402Payer.getPayerAddress(),
|
|
159
|
+
changeAddress,
|
|
160
|
+
network: requirements.network,
|
|
161
|
+
};
|
|
162
|
+
try {
|
|
163
|
+
const balanceResult = await bchWallet.getBalance();
|
|
164
|
+
const available = (balanceResult.spendable * 1e8).toFixed(0);
|
|
165
|
+
const required = requirements.amount;
|
|
166
|
+
const sufficient = BigInt(available) >= BigInt(required);
|
|
167
|
+
dryRunInfo.balanceCheck = {
|
|
168
|
+
available,
|
|
169
|
+
required,
|
|
170
|
+
sufficient,
|
|
171
|
+
};
|
|
172
|
+
console.log(chalk.yellow(' 402 PAYMENT REQUIRED'));
|
|
173
|
+
console.log(chalk.dim(' Payment details:'));
|
|
174
|
+
console.log(chalk.dim(` PayTo: ${requirements.payTo}`));
|
|
175
|
+
console.log(chalk.dim(` Amount: ${requirements.amount} sats (${(Number(requirements.amount) / 1e8).toFixed(8)} BCH)`));
|
|
176
|
+
console.log(chalk.dim(` Timeout: ${requirements.maxTimeoutSeconds}s`));
|
|
177
|
+
console.log(chalk.dim(` Resource: ${paymentRequired.resource.url}`));
|
|
178
|
+
console.log();
|
|
179
|
+
console.log(chalk.dim(' Wallet:'));
|
|
180
|
+
console.log(chalk.dim(` Payer: ${opts.payer || x402Payer.getPayerAddress()}`));
|
|
181
|
+
console.log(chalk.dim(` Change: ${changeAddress}`));
|
|
182
|
+
console.log();
|
|
183
|
+
if (sufficient) {
|
|
184
|
+
console.log(chalk.green(` Balance OK: ${available} sats available, ${required} sats required`));
|
|
185
|
+
}
|
|
186
|
+
else {
|
|
187
|
+
console.log(chalk.red(` Insufficient: ${available} sats available, ${required} sats required`));
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
catch (balanceErr) {
|
|
191
|
+
console.log(chalk.dim(` (Could not check balance: ${balanceErr.message})`));
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
else {
|
|
195
|
+
console.log(chalk.green(` Response: ${response.status} ${response.statusText} (no payment required)`));
|
|
196
|
+
}
|
|
197
|
+
console.log();
|
|
198
|
+
console.log(chalk.dim(' To execute: paytaca pay ' + url));
|
|
199
|
+
}
|
|
200
|
+
catch (err) {
|
|
201
|
+
console.log(chalk.red(`\n Error: ${err.message || err}\n`));
|
|
202
|
+
process.exit(1);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
async function runPayJson(url, method, headers, body, opts, x402Payer, bchWallet, isChipnet) {
|
|
206
|
+
try {
|
|
207
|
+
const result = await executePay(url, method, headers, body, opts, x402Payer, bchWallet, false);
|
|
208
|
+
console.log(JSON.stringify(result, null, 2));
|
|
209
|
+
}
|
|
210
|
+
catch (err) {
|
|
211
|
+
const errorResult = { success: false, error: err.message || String(err) };
|
|
212
|
+
console.log(JSON.stringify(errorResult, null, 2));
|
|
213
|
+
process.exit(1);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
async function executePay(url, method, headers, body, opts, x402Payer, bchWallet, skipPayment) {
|
|
217
|
+
const response = await fetch(url, {
|
|
218
|
+
method,
|
|
219
|
+
headers,
|
|
220
|
+
body: ['POST', 'PUT', 'PATCH'].includes(method) ? body : undefined,
|
|
221
|
+
});
|
|
222
|
+
const responseHeaders = {};
|
|
223
|
+
response.headers.forEach((value, key) => {
|
|
224
|
+
responseHeaders[key] = value;
|
|
225
|
+
});
|
|
226
|
+
const responseText = await response.text();
|
|
227
|
+
let responseData;
|
|
228
|
+
try {
|
|
229
|
+
responseData = JSON.parse(responseText);
|
|
230
|
+
}
|
|
231
|
+
catch {
|
|
232
|
+
responseData = responseText;
|
|
233
|
+
}
|
|
234
|
+
if (response.status === 402) {
|
|
235
|
+
const paymentRequired = parsePaymentRequiredJson(responseData);
|
|
236
|
+
if (!paymentRequired) {
|
|
237
|
+
return { success: false, status: 402, error: 'Could not parse PaymentRequired from 402 response body' };
|
|
238
|
+
}
|
|
239
|
+
const requirements = selectBchPaymentRequirements(paymentRequired, opts.chipnet ? 'chipnet' : 'mainnet');
|
|
240
|
+
if (!requirements) {
|
|
241
|
+
return {
|
|
242
|
+
success: false,
|
|
243
|
+
status: 402,
|
|
244
|
+
error: 'Server does not accept BCH payment',
|
|
245
|
+
data: { acceptedSchemes: paymentRequired.accepts.map(a => ({ scheme: a.scheme, network: a.network })) },
|
|
246
|
+
};
|
|
247
|
+
}
|
|
248
|
+
if (skipPayment) {
|
|
249
|
+
return {
|
|
250
|
+
success: true,
|
|
251
|
+
status: 402,
|
|
252
|
+
payment: { required: true },
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
const payerAddress = opts.payer || x402Payer.getPayerAddress();
|
|
256
|
+
const address = requirements.payTo;
|
|
257
|
+
const amountBch = Number(requirements.amount) / 1e8;
|
|
258
|
+
const changeAddressSet = bchWallet.getAddressSetAt(0);
|
|
259
|
+
const changeAddress = opts.changeAddress || changeAddressSet.change;
|
|
260
|
+
console.log(chalk.yellow('\n ⚠ Payment Required'));
|
|
261
|
+
console.log(chalk.dim(` Amount: ${amountBch} BCH (${requirements.amount} sats)`));
|
|
262
|
+
console.log(chalk.dim(` To: ${address}`));
|
|
263
|
+
console.log(chalk.dim(` Change: ${changeAddress}`));
|
|
264
|
+
console.log(chalk.dim(` Payer: ${payerAddress}`));
|
|
265
|
+
const confirmed = await promptConfirmation('Confirm payment?');
|
|
266
|
+
if (!confirmed) {
|
|
267
|
+
return {
|
|
268
|
+
success: false,
|
|
269
|
+
status: 402,
|
|
270
|
+
payment: { required: true, error: 'Payment rejected by user' },
|
|
271
|
+
error: 'Payment rejected by user',
|
|
272
|
+
};
|
|
273
|
+
}
|
|
274
|
+
const sendResult = await bchWallet.sendBch(amountBch, address, changeAddress);
|
|
275
|
+
if (!sendResult.success) {
|
|
276
|
+
return {
|
|
277
|
+
success: false,
|
|
278
|
+
status: 402,
|
|
279
|
+
payment: { required: true, error: sendResult.error },
|
|
280
|
+
error: sendResult.error,
|
|
281
|
+
};
|
|
282
|
+
}
|
|
283
|
+
const txid = sendResult.txid;
|
|
284
|
+
const paymentPayload = await x402Payer.createPaymentPayload(requirements, paymentRequired.resource.url, txid, 0, requirements.amount);
|
|
285
|
+
headers['PAYMENT-SIGNATURE'] = JSON.stringify(paymentPayload);
|
|
286
|
+
const retryResponse = await fetch(url, {
|
|
287
|
+
method,
|
|
288
|
+
headers,
|
|
289
|
+
body: ['POST', 'PUT', 'PATCH'].includes(method) ? body : undefined,
|
|
290
|
+
});
|
|
291
|
+
const retryResponseHeaders = {};
|
|
292
|
+
retryResponse.headers.forEach((value, key) => {
|
|
293
|
+
retryResponseHeaders[key] = value;
|
|
294
|
+
});
|
|
295
|
+
const retryResponseText = await retryResponse.text();
|
|
296
|
+
let retryResponseData;
|
|
297
|
+
try {
|
|
298
|
+
retryResponseData = JSON.parse(retryResponseText);
|
|
299
|
+
}
|
|
300
|
+
catch {
|
|
301
|
+
retryResponseData = retryResponseText;
|
|
302
|
+
}
|
|
303
|
+
return {
|
|
304
|
+
success: retryResponse.ok,
|
|
305
|
+
status: retryResponse.status,
|
|
306
|
+
statusText: retryResponse.statusText,
|
|
307
|
+
headers: retryResponseHeaders,
|
|
308
|
+
data: retryResponseData,
|
|
309
|
+
payment: { required: true, txid, recipientAddress: address },
|
|
310
|
+
};
|
|
311
|
+
}
|
|
312
|
+
return {
|
|
313
|
+
success: response.ok,
|
|
314
|
+
status: response.status,
|
|
315
|
+
statusText: response.statusText,
|
|
316
|
+
headers: responseHeaders,
|
|
317
|
+
data: responseData,
|
|
318
|
+
payment: { required: false },
|
|
319
|
+
};
|
|
320
|
+
}
|
|
321
|
+
function formatResponse(data) {
|
|
322
|
+
if (typeof data === 'string')
|
|
323
|
+
return data;
|
|
324
|
+
if (typeof data === 'object') {
|
|
325
|
+
try {
|
|
326
|
+
return JSON.stringify(data, null, 2);
|
|
327
|
+
}
|
|
328
|
+
catch {
|
|
329
|
+
return String(data);
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
return String(data);
|
|
333
|
+
}
|
|
334
|
+
async function promptConfirmation(message) {
|
|
335
|
+
const rl = readline.createInterface({
|
|
336
|
+
input: process.stdin,
|
|
337
|
+
output: process.stdout,
|
|
338
|
+
});
|
|
339
|
+
return new Promise((resolve) => {
|
|
340
|
+
rl.question(chalk.bold(`\n ${message} (y/N): `), (answer) => {
|
|
341
|
+
rl.close();
|
|
342
|
+
const confirmed = answer.toLowerCase() === 'y' || answer.toLowerCase() === 'yes';
|
|
343
|
+
resolve(confirmed);
|
|
344
|
+
});
|
|
345
|
+
});
|
|
346
|
+
}
|
|
347
|
+
//# sourceMappingURL=pay.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pay.js","sourceRoot":"","sources":["../../src/commands/pay.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -13,6 +13,10 @@ import { registerBalanceCommand } from './commands/balance.js';
|
|
|
13
13
|
import { registerReceiveCommand } from './commands/receive.js';
|
|
14
14
|
import { registerHistoryCommand } from './commands/history.js';
|
|
15
15
|
import { registerTokenCommands } from './commands/token.js';
|
|
16
|
+
import { registerPayCommand } from './commands/pay.js';
|
|
17
|
+
import { registerCheckCommand } from './commands/check.js';
|
|
18
|
+
import { registerOpencodeCommand } from './commands/opencode.js';
|
|
19
|
+
import { registerClaudeCommand } from './commands/claude.js';
|
|
16
20
|
const program = new Command();
|
|
17
21
|
program
|
|
18
22
|
.name('paytaca')
|
|
@@ -25,5 +29,9 @@ registerBalanceCommand(program);
|
|
|
25
29
|
registerReceiveCommand(program);
|
|
26
30
|
registerHistoryCommand(program);
|
|
27
31
|
registerTokenCommands(program);
|
|
32
|
+
registerPayCommand(program);
|
|
33
|
+
registerCheckCommand(program);
|
|
34
|
+
registerOpencodeCommand(program);
|
|
35
|
+
registerClaudeCommand(program);
|
|
28
36
|
program.parse();
|
|
29
37
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAA;AAC7D,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAA;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AACxD,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAA;AAC9D,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAA;AAC9D,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAA;AAC9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAA;AAC7D,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAA;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AACxD,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAA;AAC9D,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAA;AAC9D,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAA;AAC9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAA;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AACtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAC1D,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAA;AAChE,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAA;AAE5D,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAA;AAE7B,OAAO;KACJ,IAAI,CAAC,SAAS,CAAC;KACf,WAAW,CAAC,mCAAmC,CAAC;KAChD,OAAO,CAAC,OAAO,CAAC,CAAA;AAEnB,sBAAsB,CAAC,OAAO,CAAC,CAAA;AAC/B,uBAAuB,CAAC,OAAO,CAAC,CAAA;AAChC,mBAAmB,CAAC,OAAO,CAAC,CAAA;AAC5B,sBAAsB,CAAC,OAAO,CAAC,CAAA;AAC/B,sBAAsB,CAAC,OAAO,CAAC,CAAA;AAC/B,sBAAsB,CAAC,OAAO,CAAC,CAAA;AAC/B,qBAAqB,CAAC,OAAO,CAAC,CAAA;AAC9B,kBAAkB,CAAC,OAAO,CAAC,CAAA;AAC3B,oBAAoB,CAAC,OAAO,CAAC,CAAA;AAC7B,uBAAuB,CAAC,OAAO,CAAC,CAAA;AAChC,qBAAqB,CAAC,OAAO,CAAC,CAAA;AAE9B,OAAO,CAAC,KAAK,EAAE,CAAA"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* x402 BCH type definitions
|
|
3
|
+
* Implements x402-bch v2.2 specification
|
|
4
|
+
* https://github.com/x402-bch/x402-bch/blob/master/specs/x402-bch-specification-v2.2.md
|
|
5
|
+
*/
|
|
6
|
+
export declare const BCH_ASSET_ID = "0x0000000000000000000000000000000000000001";
|
|
7
|
+
export declare const BCH_MAINNET_NETWORK = "bip122:000000000000000000651ef99cb9fcbe";
|
|
8
|
+
export declare const BCH_CHIPNET_NETWORK = "bip122:000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f";
|
|
9
|
+
export interface ResourceInfo {
|
|
10
|
+
url: string;
|
|
11
|
+
description?: string;
|
|
12
|
+
mimeType?: string;
|
|
13
|
+
}
|
|
14
|
+
export interface PaymentRequirements {
|
|
15
|
+
scheme: string;
|
|
16
|
+
network: string;
|
|
17
|
+
amount: string;
|
|
18
|
+
asset: string;
|
|
19
|
+
payTo: string;
|
|
20
|
+
maxTimeoutSeconds: number;
|
|
21
|
+
extra: object;
|
|
22
|
+
}
|
|
23
|
+
export interface PaymentRequired {
|
|
24
|
+
x402Version: number;
|
|
25
|
+
error?: string;
|
|
26
|
+
resource: ResourceInfo;
|
|
27
|
+
accepts: PaymentRequirements[];
|
|
28
|
+
extensions: object;
|
|
29
|
+
}
|
|
30
|
+
export interface Authorization {
|
|
31
|
+
from: string;
|
|
32
|
+
to: string;
|
|
33
|
+
value: string;
|
|
34
|
+
txid: string;
|
|
35
|
+
vout: number | null;
|
|
36
|
+
amount: string | null;
|
|
37
|
+
}
|
|
38
|
+
export interface Payload {
|
|
39
|
+
signature: string;
|
|
40
|
+
authorization: Authorization;
|
|
41
|
+
}
|
|
42
|
+
export interface PaymentPayload {
|
|
43
|
+
x402Version: number;
|
|
44
|
+
resource?: ResourceInfo;
|
|
45
|
+
accepted: PaymentRequirements;
|
|
46
|
+
payload: Payload;
|
|
47
|
+
extensions: object;
|
|
48
|
+
}
|
|
49
|
+
export interface VerifyResponse {
|
|
50
|
+
isValid: boolean;
|
|
51
|
+
payer?: string;
|
|
52
|
+
invalidReason?: string;
|
|
53
|
+
remainingBalanceSat?: string;
|
|
54
|
+
}
|
|
55
|
+
export interface X402PaymentResult {
|
|
56
|
+
success: boolean;
|
|
57
|
+
response?: {
|
|
58
|
+
status: number;
|
|
59
|
+
statusText: string;
|
|
60
|
+
headers: Record<string, string>;
|
|
61
|
+
data?: any;
|
|
62
|
+
};
|
|
63
|
+
error?: string;
|
|
64
|
+
txid?: string;
|
|
65
|
+
settlement?: {
|
|
66
|
+
success: boolean;
|
|
67
|
+
txid?: string;
|
|
68
|
+
error?: string;
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
export type ErrorCode = 'missing_authorization' | 'invalid_payload' | 'invalid_scheme' | 'invalid_network' | 'invalid_receiver_address' | 'invalid_exact_bch_payload_signature' | 'insufficient_utxo_balance' | 'utxo_not_found' | 'no_utxo_found_for_address' | 'unexpected_utxo_validation_error' | 'unexpected_verify_error' | 'unexpected_settle_error' | 'invalid_x402_version';
|
|
72
|
+
//# sourceMappingURL=x402.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"x402.d.ts","sourceRoot":"","sources":["../../src/types/x402.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,eAAO,MAAM,YAAY,+CAA+C,CAAA;AACxE,eAAO,MAAM,mBAAmB,4CAA4C,CAAA;AAC5E,eAAO,MAAM,mBAAmB,4EAA4E,CAAA;AAE5G,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAA;IACX,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,iBAAiB,EAAE,MAAM,CAAA;IACzB,KAAK,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAA;IACnB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,YAAY,CAAA;IACtB,OAAO,EAAE,mBAAmB,EAAE,CAAA;IAC9B,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IACnB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;CACtB;AAED,MAAM,WAAW,OAAO;IACtB,SAAS,EAAE,MAAM,CAAA;IACjB,aAAa,EAAE,aAAa,CAAA;CAC7B;AAED,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,EAAE,YAAY,CAAA;IACvB,QAAQ,EAAE,mBAAmB,CAAA;IAC7B,OAAO,EAAE,OAAO,CAAA;IAChB,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,mBAAmB,CAAC,EAAE,MAAM,CAAA;CAC7B;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAA;IAChB,QAAQ,CAAC,EAAE;QACT,MAAM,EAAE,MAAM,CAAA;QACd,UAAU,EAAE,MAAM,CAAA;QAClB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;QAC/B,IAAI,CAAC,EAAE,GAAG,CAAA;KACX,CAAA;IACD,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,UAAU,CAAC,EAAE;QACX,OAAO,EAAE,OAAO,CAAA;QAChB,IAAI,CAAC,EAAE,MAAM,CAAA;QACb,KAAK,CAAC,EAAE,MAAM,CAAA;KACf,CAAA;CACF;AAED,MAAM,MAAM,SAAS,GACjB,uBAAuB,GACvB,iBAAiB,GACjB,gBAAgB,GAChB,iBAAiB,GACjB,0BAA0B,GAC1B,qCAAqC,GACrC,2BAA2B,GAC3B,gBAAgB,GAChB,2BAA2B,GAC3B,kCAAkC,GAClC,yBAAyB,GACzB,yBAAyB,GACzB,sBAAsB,CAAA"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* x402 BCH type definitions
|
|
3
|
+
* Implements x402-bch v2.2 specification
|
|
4
|
+
* https://github.com/x402-bch/x402-bch/blob/master/specs/x402-bch-specification-v2.2.md
|
|
5
|
+
*/
|
|
6
|
+
export const BCH_ASSET_ID = '0x0000000000000000000000000000000000000001';
|
|
7
|
+
export const BCH_MAINNET_NETWORK = 'bip122:000000000000000000651ef99cb9fcbe';
|
|
8
|
+
export const BCH_CHIPNET_NETWORK = 'bip122:000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f';
|
|
9
|
+
//# sourceMappingURL=x402.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"x402.js","sourceRoot":"","sources":["../../src/types/x402.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,CAAC,MAAM,YAAY,GAAG,4CAA4C,CAAA;AACxE,MAAM,CAAC,MAAM,mBAAmB,GAAG,yCAAyC,CAAA;AAC5E,MAAM,CAAC,MAAM,mBAAmB,GAAG,yEAAyE,CAAA"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skill management utilities for AI assistant integration.
|
|
3
|
+
* Provides generic functions for installing/uninstalling/checking status
|
|
4
|
+
* of paytaca skill for various AI assistants.
|
|
5
|
+
*/
|
|
6
|
+
export interface AssistantConfig {
|
|
7
|
+
name: string;
|
|
8
|
+
skillsDir: string;
|
|
9
|
+
}
|
|
10
|
+
export declare const SUPPORTED_ASSISTANTS: AssistantConfig[];
|
|
11
|
+
export declare function getSkillSourcePath(): string;
|
|
12
|
+
export declare function getSkillDestPath(skillsDir: string): string;
|
|
13
|
+
export declare function installSkill(skillsDir: string, assistantName: string): void;
|
|
14
|
+
export declare function uninstallSkill(skillsDir: string, assistantName: string): void;
|
|
15
|
+
export declare function checkStatus(skillsDir: string, assistantName: string): void;
|
|
16
|
+
export declare function handleSkillAction(assistant: AssistantConfig, action: string): void;
|
|
17
|
+
//# sourceMappingURL=skill.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill.d.ts","sourceRoot":"","sources":["../../src/utils/skill.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAQH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,eAAO,MAAM,oBAAoB,EAAE,eAAe,EAGjD,CAAA;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAU3C;AAED,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,IAAI,CA4B3E;AAED,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,IAAI,CAgB7E;AAED,wBAAgB,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,IAAI,CAW1E;AAED,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,eAAe,EAC1B,MAAM,EAAE,MAAM,GACb,IAAI,CAeN"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skill management utilities for AI assistant integration.
|
|
3
|
+
* Provides generic functions for installing/uninstalling/checking status
|
|
4
|
+
* of paytaca skill for various AI assistants.
|
|
5
|
+
*/
|
|
6
|
+
import chalk from 'chalk';
|
|
7
|
+
import fs from 'fs';
|
|
8
|
+
import path from 'path';
|
|
9
|
+
import os from 'os';
|
|
10
|
+
import { fileURLToPath } from 'url';
|
|
11
|
+
export const SUPPORTED_ASSISTANTS = [
|
|
12
|
+
{ name: 'opencode', skillsDir: path.join(os.homedir(), '.config', 'opencode', 'skills') },
|
|
13
|
+
{ name: 'Claude Code', skillsDir: path.join(os.homedir(), '.claude', 'skills') },
|
|
14
|
+
];
|
|
15
|
+
export function getSkillSourcePath() {
|
|
16
|
+
try {
|
|
17
|
+
const modulePath = require.resolve('paytaca-cli');
|
|
18
|
+
const packageDir = path.dirname(modulePath);
|
|
19
|
+
return path.join(packageDir, 'skills', 'paytaca', 'SKILL.md');
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
const currentFilePath = fileURLToPath(import.meta.url);
|
|
23
|
+
const srcPath = path.dirname(currentFilePath);
|
|
24
|
+
return path.join(srcPath, '..', '..', 'skills', 'paytaca', 'SKILL.md');
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
export function getSkillDestPath(skillsDir) {
|
|
28
|
+
return path.join(skillsDir, 'paytaca', 'SKILL.md');
|
|
29
|
+
}
|
|
30
|
+
export function installSkill(skillsDir, assistantName) {
|
|
31
|
+
try {
|
|
32
|
+
const sourcePath = getSkillSourcePath();
|
|
33
|
+
const destDir = path.join(skillsDir, 'paytaca');
|
|
34
|
+
const destPath = getSkillDestPath(skillsDir);
|
|
35
|
+
if (!fs.existsSync(sourcePath)) {
|
|
36
|
+
console.log(chalk.red('Skill source file not found. Is paytaca-cli properly installed?'));
|
|
37
|
+
process.exit(1);
|
|
38
|
+
}
|
|
39
|
+
fs.mkdirSync(destDir, { recursive: true });
|
|
40
|
+
const content = fs.readFileSync(sourcePath, 'utf8');
|
|
41
|
+
fs.writeFileSync(destPath, content);
|
|
42
|
+
console.log(chalk.green(`\n✓ Skill installed successfully for ${assistantName}!\n`));
|
|
43
|
+
console.log(chalk.bold('What this does:'));
|
|
44
|
+
console.log(' When the AI assistant encounters HTTP 402 or calls x402-enabled APIs,');
|
|
45
|
+
console.log(' it will automatically use paytaca to handle payments.\n');
|
|
46
|
+
console.log(chalk.dim('Location: ') + destPath);
|
|
47
|
+
console.log(chalk.dim('Source: ') + sourcePath);
|
|
48
|
+
console.log();
|
|
49
|
+
console.log(`Restart ${assistantName} to load the new skill.\n`);
|
|
50
|
+
}
|
|
51
|
+
catch (err) {
|
|
52
|
+
console.log(chalk.red(`\nFailed to install skill: ${err.message}\n`));
|
|
53
|
+
process.exit(1);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
export function uninstallSkill(skillsDir, assistantName) {
|
|
57
|
+
try {
|
|
58
|
+
const destDir = path.join(skillsDir, 'paytaca');
|
|
59
|
+
const destPath = getSkillDestPath(skillsDir);
|
|
60
|
+
if (!fs.existsSync(destPath)) {
|
|
61
|
+
console.log(chalk.yellow('\nSkill is not installed.\n'));
|
|
62
|
+
process.exit(0);
|
|
63
|
+
}
|
|
64
|
+
fs.rmSync(destDir, { recursive: true });
|
|
65
|
+
console.log(chalk.green(`\n✓ Skill uninstalled for ${assistantName}!\n`));
|
|
66
|
+
}
|
|
67
|
+
catch (err) {
|
|
68
|
+
console.log(chalk.red(`\nFailed to uninstall skill: ${err.message}\n`));
|
|
69
|
+
process.exit(1);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
export function checkStatus(skillsDir, assistantName) {
|
|
73
|
+
const destPath = getSkillDestPath(skillsDir);
|
|
74
|
+
if (fs.existsSync(destPath)) {
|
|
75
|
+
console.log(chalk.green('\n✓ Paytaca skill is installed\n'));
|
|
76
|
+
console.log(chalk.dim('Location: ') + destPath);
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
console.log(chalk.yellow(`\n○ Paytaca skill is not installed for ${assistantName}\n`));
|
|
80
|
+
console.log(`Run: paytaca ${assistantName.toLowerCase()} install`);
|
|
81
|
+
console.log();
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
export function handleSkillAction(assistant, action) {
|
|
85
|
+
switch (action) {
|
|
86
|
+
case 'install':
|
|
87
|
+
installSkill(assistant.skillsDir, assistant.name);
|
|
88
|
+
break;
|
|
89
|
+
case 'uninstall':
|
|
90
|
+
uninstallSkill(assistant.skillsDir, assistant.name);
|
|
91
|
+
break;
|
|
92
|
+
case 'status':
|
|
93
|
+
checkStatus(assistant.skillsDir, assistant.name);
|
|
94
|
+
break;
|
|
95
|
+
default:
|
|
96
|
+
console.log(chalk.yellow(`Unknown action: ${action}`));
|
|
97
|
+
console.log('Use: install, uninstall, or status');
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=skill.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill.js","sourceRoot":"","sources":["../../src/utils/skill.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* x402 utility functions for BCH payments
|
|
3
|
+
* Implements x402-bch v2.2 specification
|
|
4
|
+
* https://github.com/x402-bch/x402-bch/blob/master/specs/x402-bch-specification-v2.2.md
|
|
5
|
+
*/
|
|
6
|
+
import { PaymentRequired, PaymentRequirements, PaymentPayload, Authorization, VerifyResponse, BCH_ASSET_ID, BCH_MAINNET_NETWORK, BCH_CHIPNET_NETWORK } from '../types/x402.js';
|
|
7
|
+
export { BCH_MAINNET_NETWORK, BCH_CHIPNET_NETWORK, BCH_ASSET_ID };
|
|
8
|
+
export declare function isBchNetwork(network: string): boolean;
|
|
9
|
+
export declare function isChipnetNetwork(network: string): boolean;
|
|
10
|
+
export declare function parsePaymentRequiredJson(body: any): PaymentRequired | null;
|
|
11
|
+
export declare function selectBchPaymentRequirements(requirements: PaymentRequired, clientNetwork: 'mainnet' | 'chipnet'): PaymentRequirements | null;
|
|
12
|
+
export declare function buildPaymentPayload(accepted: PaymentRequirements, resourceUrl: string, payer: string, txid: string, vout: number | null, amount: string | null): PaymentPayload;
|
|
13
|
+
export declare function buildAuthorization(accepted: PaymentRequirements, resourceUrl: string, payer: string, txid: string, vout: number | null, amount: string | null): Authorization;
|
|
14
|
+
export declare function signMessageBCH(message: string, privateKeyHex: string, compressed?: boolean): string;
|
|
15
|
+
export declare function signAuthorization(authorization: Authorization, signMessage: (message: string) => Promise<string>): Promise<string>;
|
|
16
|
+
export declare function parsePaymentResponse(data: any): VerifyResponse;
|
|
17
|
+
//# sourceMappingURL=x402.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"x402.d.ts","sourceRoot":"","sources":["../../src/utils/x402.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EACL,eAAe,EACf,mBAAmB,EACnB,cAAc,EACd,aAAa,EAEb,cAAc,EACd,YAAY,EACZ,mBAAmB,EACnB,mBAAmB,EACpB,MAAM,kBAAkB,CAAA;AAGzB,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,YAAY,EAAE,CAAA;AAEjE,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAErD;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAEzD;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,GAAG,GAAG,eAAe,GAAG,IAAI,CA6B1E;AAED,wBAAgB,4BAA4B,CAC1C,YAAY,EAAE,eAAe,EAC7B,aAAa,EAAE,SAAS,GAAG,SAAS,GACnC,mBAAmB,GAAG,IAAI,CAQ5B;AAED,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,mBAAmB,EAC7B,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,GAAG,IAAI,EACnB,MAAM,EAAE,MAAM,GAAG,IAAI,GACpB,cAAc,CAwBhB;AAED,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,mBAAmB,EAC7B,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,GAAG,IAAI,EACnB,MAAM,EAAE,MAAM,GAAG,IAAI,GACpB,aAAa,CASf;AAED,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,EACf,aAAa,EAAE,MAAM,EACrB,UAAU,GAAE,OAAc,GACzB,MAAM,CAUR;AAED,wBAAsB,iBAAiB,CACrC,aAAa,EAAE,aAAa,EAC5B,WAAW,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,GAChD,OAAO,CAAC,MAAM,CAAC,CAGjB;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,GAAG,GAAG,cAAc,CAiB9D"}
|