paytaca-cli 0.1.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 +91 -12
- package/dist/commands/address.d.ts +2 -0
- package/dist/commands/address.d.ts.map +1 -1
- package/dist/commands/address.js +19 -4
- package/dist/commands/address.js.map +1 -1
- package/dist/commands/balance.d.ts +2 -0
- package/dist/commands/balance.d.ts.map +1 -1
- package/dist/commands/balance.js +58 -12
- package/dist/commands/balance.js.map +1 -1
- 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/history.d.ts +2 -0
- package/dist/commands/history.d.ts.map +1 -1
- package/dist/commands/history.js +40 -7
- package/dist/commands/history.js.map +1 -1
- 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/commands/receive.d.ts +9 -1
- package/dist/commands/receive.d.ts.map +1 -1
- package/dist/commands/receive.js +117 -8
- package/dist/commands/receive.js.map +1 -1
- package/dist/commands/token.d.ts +16 -0
- package/dist/commands/token.d.ts.map +1 -0
- package/dist/commands/token.js +351 -0
- package/dist/commands/token.js.map +1 -0
- package/dist/index.d.ts +2 -2
- package/dist/index.js +13 -3
- 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/bch.d.ts +110 -3
- package/dist/wallet/bch.d.ts.map +1 -1
- package/dist/wallet/bch.js +214 -2
- package/dist/wallet/bch.js.map +1 -1
- package/dist/wallet/keys.d.ts +8 -0
- package/dist/wallet/keys.d.ts.map +1 -1
- package/dist/wallet/keys.js +10 -0
- package/dist/wallet/keys.js.map +1 -1
- 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 +8 -2
- package/skills/paytaca/SKILL.md +123 -0
|
@@ -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"}
|
|
@@ -0,0 +1,119 @@
|
|
|
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 crypto from 'crypto';
|
|
7
|
+
import { BCH_ASSET_ID, BCH_MAINNET_NETWORK, BCH_CHIPNET_NETWORK, } from '../types/x402.js';
|
|
8
|
+
import { secp256k1 } from '@bitauth/libauth';
|
|
9
|
+
export { BCH_MAINNET_NETWORK, BCH_CHIPNET_NETWORK, BCH_ASSET_ID };
|
|
10
|
+
export function isBchNetwork(network) {
|
|
11
|
+
return network === BCH_MAINNET_NETWORK || network === BCH_CHIPNET_NETWORK;
|
|
12
|
+
}
|
|
13
|
+
export function isChipnetNetwork(network) {
|
|
14
|
+
return network === BCH_CHIPNET_NETWORK;
|
|
15
|
+
}
|
|
16
|
+
export function parsePaymentRequiredJson(body) {
|
|
17
|
+
if (!body || typeof body !== 'object')
|
|
18
|
+
return null;
|
|
19
|
+
if (body.x402Version !== 2)
|
|
20
|
+
return null;
|
|
21
|
+
const pr = {
|
|
22
|
+
x402Version: body.x402Version,
|
|
23
|
+
error: body.error,
|
|
24
|
+
resource: body.resource || { url: '' },
|
|
25
|
+
accepts: [],
|
|
26
|
+
extensions: body.extensions || {},
|
|
27
|
+
};
|
|
28
|
+
if (Array.isArray(body.accepts)) {
|
|
29
|
+
for (const accept of body.accepts) {
|
|
30
|
+
if (accept.scheme && accept.network && accept.payTo) {
|
|
31
|
+
pr.accepts.push({
|
|
32
|
+
scheme: accept.scheme,
|
|
33
|
+
network: accept.network,
|
|
34
|
+
amount: accept.amount,
|
|
35
|
+
asset: accept.asset || BCH_ASSET_ID,
|
|
36
|
+
payTo: accept.payTo,
|
|
37
|
+
maxTimeoutSeconds: accept.maxTimeoutSeconds || 60,
|
|
38
|
+
extra: accept.extra || {},
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return pr;
|
|
44
|
+
}
|
|
45
|
+
export function selectBchPaymentRequirements(requirements, clientNetwork) {
|
|
46
|
+
const clientNetworkId = clientNetwork === 'chipnet' ? BCH_CHIPNET_NETWORK : BCH_MAINNET_NETWORK;
|
|
47
|
+
for (const accept of requirements.accepts) {
|
|
48
|
+
if (accept.scheme === 'utxo' && accept.network === clientNetworkId) {
|
|
49
|
+
return accept;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
export function buildPaymentPayload(accepted, resourceUrl, payer, txid, vout, amount) {
|
|
55
|
+
const resource = {
|
|
56
|
+
url: resourceUrl,
|
|
57
|
+
description: '',
|
|
58
|
+
mimeType: 'application/json',
|
|
59
|
+
};
|
|
60
|
+
return {
|
|
61
|
+
x402Version: 2,
|
|
62
|
+
resource,
|
|
63
|
+
accepted,
|
|
64
|
+
payload: {
|
|
65
|
+
signature: '',
|
|
66
|
+
authorization: {
|
|
67
|
+
from: payer,
|
|
68
|
+
to: accepted.payTo,
|
|
69
|
+
value: accepted.amount,
|
|
70
|
+
txid,
|
|
71
|
+
vout,
|
|
72
|
+
amount,
|
|
73
|
+
},
|
|
74
|
+
},
|
|
75
|
+
extensions: {},
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
export function buildAuthorization(accepted, resourceUrl, payer, txid, vout, amount) {
|
|
79
|
+
return {
|
|
80
|
+
from: payer,
|
|
81
|
+
to: accepted.payTo,
|
|
82
|
+
value: accepted.amount,
|
|
83
|
+
txid,
|
|
84
|
+
vout,
|
|
85
|
+
amount,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
export function signMessageBCH(message, privateKeyHex, compressed = true) {
|
|
89
|
+
const prefix = '\x18Bitcoin Signed Message:\n';
|
|
90
|
+
const messageBytes = Buffer.from(message, 'utf8');
|
|
91
|
+
const prefixBytes = Buffer.from(prefix, 'utf8');
|
|
92
|
+
const lengthByte = Buffer.from([messageBytes.length]);
|
|
93
|
+
const prefixedMessage = Buffer.concat([prefixBytes, lengthByte, messageBytes]);
|
|
94
|
+
const hash = crypto.createHash('sha256').update(crypto.createHash('sha256').update(prefixedMessage).digest()).digest();
|
|
95
|
+
const privateKey = Buffer.from(privateKeyHex, 'hex');
|
|
96
|
+
const signature = secp256k1.signMessageHashDER(hash, privateKey);
|
|
97
|
+
return Buffer.from(signature).toString('base64');
|
|
98
|
+
}
|
|
99
|
+
export async function signAuthorization(authorization, signMessage) {
|
|
100
|
+
const message = JSON.stringify(authorization);
|
|
101
|
+
return signMessage(message);
|
|
102
|
+
}
|
|
103
|
+
export function parsePaymentResponse(data) {
|
|
104
|
+
if (!data)
|
|
105
|
+
return { isValid: false, invalidReason: 'no_response_data' };
|
|
106
|
+
if (typeof data.isValid === 'boolean') {
|
|
107
|
+
return {
|
|
108
|
+
isValid: data.isValid,
|
|
109
|
+
payer: data.payer,
|
|
110
|
+
invalidReason: data.invalidReason,
|
|
111
|
+
remainingBalanceSat: data.remainingBalanceSat,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
if (data.error) {
|
|
115
|
+
return { isValid: false, invalidReason: data.error };
|
|
116
|
+
}
|
|
117
|
+
return { isValid: false, invalidReason: 'unknown_response_format' };
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=x402.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"x402.js","sourceRoot":"","sources":["../../src/utils/x402.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,MAAM,MAAM,QAAQ,CAAA;AAC3B,OAAO,EAOL,YAAY,EACZ,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAE5C,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,YAAY,EAAE,CAAA;AAEjE,MAAM,UAAU,YAAY,CAAC,OAAe;IAC1C,OAAO,OAAO,KAAK,mBAAmB,IAAI,OAAO,KAAK,mBAAmB,CAAA;AAC3E,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,OAAe;IAC9C,OAAO,OAAO,KAAK,mBAAmB,CAAA;AACxC,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,IAAS;IAChD,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAA;IAClD,IAAI,IAAI,CAAC,WAAW,KAAK,CAAC;QAAE,OAAO,IAAI,CAAA;IAEvC,MAAM,EAAE,GAAoB;QAC1B,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE;QACtC,OAAO,EAAE,EAAE;QACX,UAAU,EAAE,IAAI,CAAC,UAAU,IAAI,EAAE;KAClC,CAAA;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAChC,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAClC,IAAI,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;gBACpD,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;oBACd,MAAM,EAAE,MAAM,CAAC,MAAM;oBACrB,OAAO,EAAE,MAAM,CAAC,OAAO;oBACvB,MAAM,EAAE,MAAM,CAAC,MAAM;oBACrB,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,YAAY;oBACnC,KAAK,EAAE,MAAM,CAAC,KAAK;oBACnB,iBAAiB,EAAE,MAAM,CAAC,iBAAiB,IAAI,EAAE;oBACjD,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,EAAE;iBAC1B,CAAC,CAAA;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,EAAE,CAAA;AACX,CAAC;AAED,MAAM,UAAU,4BAA4B,CAC1C,YAA6B,EAC7B,aAAoC;IAEpC,MAAM,eAAe,GAAG,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,mBAAmB,CAAA;IAC/F,KAAK,MAAM,MAAM,IAAI,YAAY,CAAC,OAAO,EAAE,CAAC;QAC1C,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM,IAAI,MAAM,CAAC,OAAO,KAAK,eAAe,EAAE,CAAC;YACnE,OAAO,MAAM,CAAA;QACf,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,QAA6B,EAC7B,WAAmB,EACnB,KAAa,EACb,IAAY,EACZ,IAAmB,EACnB,MAAqB;IAErB,MAAM,QAAQ,GAAiB;QAC7B,GAAG,EAAE,WAAW;QAChB,WAAW,EAAE,EAAE;QACf,QAAQ,EAAE,kBAAkB;KAC7B,CAAA;IAED,OAAO;QACL,WAAW,EAAE,CAAC;QACd,QAAQ;QACR,QAAQ;QACR,OAAO,EAAE;YACP,SAAS,EAAE,EAAE;YACb,aAAa,EAAE;gBACb,IAAI,EAAE,KAAK;gBACX,EAAE,EAAE,QAAQ,CAAC,KAAK;gBAClB,KAAK,EAAE,QAAQ,CAAC,MAAM;gBACtB,IAAI;gBACJ,IAAI;gBACJ,MAAM;aACP;SACF;QACD,UAAU,EAAE,EAAE;KACf,CAAA;AACH,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,QAA6B,EAC7B,WAAmB,EACnB,KAAa,EACb,IAAY,EACZ,IAAmB,EACnB,MAAqB;IAErB,OAAO;QACL,IAAI,EAAE,KAAK;QACX,EAAE,EAAE,QAAQ,CAAC,KAAK;QAClB,KAAK,EAAE,QAAQ,CAAC,MAAM;QACtB,IAAI;QACJ,IAAI;QACJ,MAAM;KACP,CAAA;AACH,CAAC;AAED,MAAM,UAAU,cAAc,CAC5B,OAAe,EACf,aAAqB,EACrB,aAAsB,IAAI;IAE1B,MAAM,MAAM,GAAG,+BAA+B,CAAA;IAC9C,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;IACjD,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC/C,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAA;IACrD,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC,CAAA;IAC9E,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAA;IACtH,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,KAAK,CAAC,CAAA;IACpD,MAAM,SAAS,GAAG,SAAS,CAAC,kBAAkB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAA;IAChE,OAAO,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;AAClD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,aAA4B,EAC5B,WAAiD;IAEjD,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,CAAA;IAC7C,OAAO,WAAW,CAAC,OAAO,CAAC,CAAA;AAC7B,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,IAAS;IAC5C,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,kBAAkB,EAAE,CAAA;IAEvE,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QACtC,OAAO;YACL,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,mBAAmB,EAAE,IAAI,CAAC,mBAAmB;SAC9C,CAAA;IACH,CAAC;IAED,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,CAAC,KAAK,EAAE,CAAA;IACtD,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,yBAAyB,EAAE,CAAA;AACrE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"x402.test.d.ts","sourceRoot":"","sources":["../../src/utils/x402.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { parsePaymentRequiredJson, selectBchPaymentRequirements, buildPaymentPayload, buildAuthorization, parsePaymentResponse, isBchNetwork, isChipnetNetwork, BCH_MAINNET_NETWORK, BCH_CHIPNET_NETWORK, BCH_ASSET_ID, } from './x402.js';
|
|
3
|
+
describe('x402 parsing', () => {
|
|
4
|
+
describe('parsePaymentRequiredJson', () => {
|
|
5
|
+
it('should parse valid PaymentRequired JSON', () => {
|
|
6
|
+
const input = {
|
|
7
|
+
x402Version: 2,
|
|
8
|
+
error: 'Payment required',
|
|
9
|
+
resource: { url: 'https://api.example.com/data' },
|
|
10
|
+
accepts: [
|
|
11
|
+
{
|
|
12
|
+
scheme: 'utxo',
|
|
13
|
+
network: BCH_MAINNET_NETWORK,
|
|
14
|
+
amount: '1000',
|
|
15
|
+
asset: BCH_ASSET_ID,
|
|
16
|
+
payTo: 'bitcoincash:qp2f5j6q3fj5gjwgk8rkq8xrk8q8q8q8q8q8q8q8q',
|
|
17
|
+
maxTimeoutSeconds: 300,
|
|
18
|
+
extra: {},
|
|
19
|
+
},
|
|
20
|
+
],
|
|
21
|
+
extensions: {},
|
|
22
|
+
};
|
|
23
|
+
const result = parsePaymentRequiredJson(input);
|
|
24
|
+
expect(result).not.toBeNull();
|
|
25
|
+
expect(result.x402Version).toBe(2);
|
|
26
|
+
expect(result.error).toBe('Payment required');
|
|
27
|
+
expect(result.resource.url).toBe('https://api.example.com/data');
|
|
28
|
+
expect(result.accepts).toHaveLength(1);
|
|
29
|
+
expect(result.accepts[0].scheme).toBe('utxo');
|
|
30
|
+
expect(result.accepts[0].amount).toBe('1000');
|
|
31
|
+
});
|
|
32
|
+
it('should return null for null input', () => {
|
|
33
|
+
expect(parsePaymentRequiredJson(null)).toBeNull();
|
|
34
|
+
});
|
|
35
|
+
it('should return null for non-object input', () => {
|
|
36
|
+
expect(parsePaymentRequiredJson('string')).toBeNull();
|
|
37
|
+
expect(parsePaymentRequiredJson(123)).toBeNull();
|
|
38
|
+
});
|
|
39
|
+
it('should return null for wrong x402Version', () => {
|
|
40
|
+
const input = { x402Version: 1, accepts: [] };
|
|
41
|
+
expect(parsePaymentRequiredJson(input)).toBeNull();
|
|
42
|
+
});
|
|
43
|
+
it('should use default values for missing optional fields', () => {
|
|
44
|
+
const input = {
|
|
45
|
+
x402Version: 2,
|
|
46
|
+
resource: {},
|
|
47
|
+
accepts: [
|
|
48
|
+
{
|
|
49
|
+
scheme: 'utxo',
|
|
50
|
+
network: BCH_MAINNET_NETWORK,
|
|
51
|
+
payTo: 'bitcoincash:qp2f5j6q3fj5gjwgk8rkq8xrk8q8q8q8q8q8q8q8',
|
|
52
|
+
},
|
|
53
|
+
],
|
|
54
|
+
};
|
|
55
|
+
const result = parsePaymentRequiredJson(input);
|
|
56
|
+
expect(result).not.toBeNull();
|
|
57
|
+
expect(result.accepts[0].asset).toBe(BCH_ASSET_ID);
|
|
58
|
+
expect(result.accepts[0].maxTimeoutSeconds).toBe(60);
|
|
59
|
+
});
|
|
60
|
+
it('should filter out invalid accepts entries', () => {
|
|
61
|
+
const input = {
|
|
62
|
+
x402Version: 2,
|
|
63
|
+
resource: { url: 'https://api.example.com' },
|
|
64
|
+
accepts: [
|
|
65
|
+
{ scheme: 'utxo', network: BCH_MAINNET_NETWORK, payTo: 'valid1' },
|
|
66
|
+
{ scheme: 'invalid' },
|
|
67
|
+
{ network: BCH_MAINNET_NETWORK, payTo: 'missing-scheme' },
|
|
68
|
+
{ scheme: 'utxo', payTo: 'missing-network' },
|
|
69
|
+
{ scheme: 'utxo', network: BCH_MAINNET_NETWORK },
|
|
70
|
+
],
|
|
71
|
+
};
|
|
72
|
+
const result = parsePaymentRequiredJson(input);
|
|
73
|
+
expect(result.accepts).toHaveLength(1);
|
|
74
|
+
expect(result.accepts[0].payTo).toBe('valid1');
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
describe('selectBchPaymentRequirements', () => {
|
|
78
|
+
const paymentRequired = {
|
|
79
|
+
x402Version: 2,
|
|
80
|
+
resource: { url: 'https://api.example.com' },
|
|
81
|
+
accepts: [
|
|
82
|
+
{
|
|
83
|
+
scheme: 'utxo',
|
|
84
|
+
network: BCH_MAINNET_NETWORK,
|
|
85
|
+
amount: '1000',
|
|
86
|
+
asset: BCH_ASSET_ID,
|
|
87
|
+
payTo: 'bitcoincash:mainnet-address',
|
|
88
|
+
maxTimeoutSeconds: 300,
|
|
89
|
+
extra: {},
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
scheme: 'utxo',
|
|
93
|
+
network: BCH_CHIPNET_NETWORK,
|
|
94
|
+
amount: '1000',
|
|
95
|
+
asset: BCH_ASSET_ID,
|
|
96
|
+
payTo: 'bitcoincash:chipnet-address',
|
|
97
|
+
maxTimeoutSeconds: 300,
|
|
98
|
+
extra: {},
|
|
99
|
+
},
|
|
100
|
+
],
|
|
101
|
+
extensions: {},
|
|
102
|
+
};
|
|
103
|
+
it('should select mainnet requirements for mainnet client', () => {
|
|
104
|
+
const result = selectBchPaymentRequirements(paymentRequired, 'mainnet');
|
|
105
|
+
expect(result).not.toBeNull();
|
|
106
|
+
expect(result.network).toBe(BCH_MAINNET_NETWORK);
|
|
107
|
+
expect(result.payTo).toBe('bitcoincash:mainnet-address');
|
|
108
|
+
});
|
|
109
|
+
it('should select chipnet requirements for chipnet client', () => {
|
|
110
|
+
const result = selectBchPaymentRequirements(paymentRequired, 'chipnet');
|
|
111
|
+
expect(result).not.toBeNull();
|
|
112
|
+
expect(result.network).toBe(BCH_CHIPNET_NETWORK);
|
|
113
|
+
expect(result.payTo).toBe('bitcoincash:chipnet-address');
|
|
114
|
+
});
|
|
115
|
+
it('should return null when no matching network', () => {
|
|
116
|
+
const emptyAccepts = { ...paymentRequired, accepts: [paymentRequired.accepts[0]] };
|
|
117
|
+
const result = selectBchPaymentRequirements(emptyAccepts, 'chipnet');
|
|
118
|
+
expect(result).toBeNull();
|
|
119
|
+
});
|
|
120
|
+
});
|
|
121
|
+
});
|
|
122
|
+
describe('x402 building', () => {
|
|
123
|
+
describe('buildPaymentPayload', () => {
|
|
124
|
+
it('should build a valid PaymentPayload', () => {
|
|
125
|
+
const accepted = {
|
|
126
|
+
scheme: 'utxo',
|
|
127
|
+
network: BCH_MAINNET_NETWORK,
|
|
128
|
+
amount: '1000',
|
|
129
|
+
asset: BCH_ASSET_ID,
|
|
130
|
+
payTo: 'bitcoincash:qp2f5j6q3fj5gjwgk8rkq8xrk8q8q8q8q8q8q8q8',
|
|
131
|
+
maxTimeoutSeconds: 300,
|
|
132
|
+
extra: {},
|
|
133
|
+
};
|
|
134
|
+
const result = buildPaymentPayload(accepted, 'https://api.example.com/data', 'bitcoincash:payer-address', 'abc123txid', 0, '1000');
|
|
135
|
+
expect(result.x402Version).toBe(2);
|
|
136
|
+
expect(result.resource.url).toBe('https://api.example.com/data');
|
|
137
|
+
expect(result.accepted).toBe(accepted);
|
|
138
|
+
expect(result.payload.authorization.from).toBe('bitcoincash:payer-address');
|
|
139
|
+
expect(result.payload.authorization.to).toBe(accepted.payTo);
|
|
140
|
+
expect(result.payload.authorization.txid).toBe('abc123txid');
|
|
141
|
+
expect(result.payload.signature).toBe('');
|
|
142
|
+
});
|
|
143
|
+
});
|
|
144
|
+
describe('buildAuthorization', () => {
|
|
145
|
+
it('should build a valid Authorization', () => {
|
|
146
|
+
const accepted = {
|
|
147
|
+
scheme: 'utxo',
|
|
148
|
+
network: BCH_MAINNET_NETWORK,
|
|
149
|
+
amount: '1000',
|
|
150
|
+
asset: BCH_ASSET_ID,
|
|
151
|
+
payTo: 'bitcoincash:qp2f5j6q3fj5gjwgk8rkq8xrk8q8q8q8q8q8q8q8',
|
|
152
|
+
maxTimeoutSeconds: 300,
|
|
153
|
+
extra: {},
|
|
154
|
+
};
|
|
155
|
+
const result = buildAuthorization(accepted, 'https://api.example.com/data', 'bitcoincash:payer-address', 'abc123txid', 0, '1000');
|
|
156
|
+
expect(result.from).toBe('bitcoincash:payer-address');
|
|
157
|
+
expect(result.to).toBe(accepted.payTo);
|
|
158
|
+
expect(result.txid).toBe('abc123txid');
|
|
159
|
+
expect(result.vout).toBe(0);
|
|
160
|
+
expect(result.amount).toBe('1000');
|
|
161
|
+
});
|
|
162
|
+
});
|
|
163
|
+
});
|
|
164
|
+
describe('parsePaymentResponse', () => {
|
|
165
|
+
it('should parse valid isValid response', () => {
|
|
166
|
+
const data = {
|
|
167
|
+
isValid: true,
|
|
168
|
+
payer: 'bitcoincash:abc123',
|
|
169
|
+
remainingBalanceSat: '1000000',
|
|
170
|
+
};
|
|
171
|
+
const result = parsePaymentResponse(data);
|
|
172
|
+
expect(result.isValid).toBe(true);
|
|
173
|
+
expect(result.payer).toBe('bitcoincash:abc123');
|
|
174
|
+
expect(result.remainingBalanceSat).toBe('1000000');
|
|
175
|
+
});
|
|
176
|
+
it('should parse error response', () => {
|
|
177
|
+
const data = { error: 'Invalid signature' };
|
|
178
|
+
const result = parsePaymentResponse(data);
|
|
179
|
+
expect(result.isValid).toBe(false);
|
|
180
|
+
expect(result.invalidReason).toBe('Invalid signature');
|
|
181
|
+
});
|
|
182
|
+
it('should return no_response_data for null input', () => {
|
|
183
|
+
const result = parsePaymentResponse(null);
|
|
184
|
+
expect(result.isValid).toBe(false);
|
|
185
|
+
expect(result.invalidReason).toBe('no_response_data');
|
|
186
|
+
});
|
|
187
|
+
it('should return unknown_response_format for unrecognized data', () => {
|
|
188
|
+
const data = { some: 'unknown', format: true };
|
|
189
|
+
const result = parsePaymentResponse(data);
|
|
190
|
+
expect(result.isValid).toBe(false);
|
|
191
|
+
expect(result.invalidReason).toBe('unknown_response_format');
|
|
192
|
+
});
|
|
193
|
+
});
|
|
194
|
+
describe('network helpers', () => {
|
|
195
|
+
describe('isBchNetwork', () => {
|
|
196
|
+
it('should return true for mainnet', () => {
|
|
197
|
+
expect(isBchNetwork(BCH_MAINNET_NETWORK)).toBe(true);
|
|
198
|
+
});
|
|
199
|
+
it('should return true for chipnet', () => {
|
|
200
|
+
expect(isBchNetwork(BCH_CHIPNET_NETWORK)).toBe(true);
|
|
201
|
+
});
|
|
202
|
+
it('should return false for other networks', () => {
|
|
203
|
+
expect(isBchNetwork('bitcoin')).toBe(false);
|
|
204
|
+
expect(isBchNetwork('litecoin')).toBe(false);
|
|
205
|
+
});
|
|
206
|
+
});
|
|
207
|
+
describe('isChipnetNetwork', () => {
|
|
208
|
+
it('should return true for chipnet', () => {
|
|
209
|
+
expect(isChipnetNetwork(BCH_CHIPNET_NETWORK)).toBe(true);
|
|
210
|
+
});
|
|
211
|
+
it('should return false for mainnet', () => {
|
|
212
|
+
expect(isChipnetNetwork(BCH_MAINNET_NETWORK)).toBe(false);
|
|
213
|
+
});
|
|
214
|
+
});
|
|
215
|
+
});
|
|
216
|
+
//# sourceMappingURL=x402.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"x402.test.js","sourceRoot":"","sources":["../../src/utils/x402.test.ts"],"names":[],"mappings":"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"}
|