@obul.ai/obulx 0.2.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 +105 -0
- package/dist/args.d.ts +19 -0
- package/dist/args.d.ts.map +1 -0
- package/dist/args.js +148 -0
- package/dist/args.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +45 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/lib.d.ts +44 -0
- package/dist/lib.d.ts.map +1 -0
- package/dist/lib.js +350 -0
- package/dist/lib.js.map +1 -0
- package/package.json +27 -0
package/README.md
ADDED
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
# @obul.ai/obulx
|
|
2
|
+
|
|
3
|
+
Obul x402 CLI and library.
|
|
4
|
+
|
|
5
|
+
## Install
|
|
6
|
+
```bash
|
|
7
|
+
npm install -g @obul.ai/obulx
|
|
8
|
+
```
|
|
9
|
+
|
|
10
|
+
## What It Does
|
|
11
|
+
`obulx` is a CLI for calling x402-protected endpoints. It supports:
|
|
12
|
+
- Proxy mode (via Obul proxy) API key auth.
|
|
13
|
+
- Direct x402 mode with a local private key for signing payments.
|
|
14
|
+
|
|
15
|
+
## CLI Usage
|
|
16
|
+
```bash
|
|
17
|
+
obulx [options] <url>
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## Key Parameters
|
|
21
|
+
- `--obul-proxy <BASE>`: Enables proxy mode and rewrites the URL as `BASE/{scheme}/{host}{path}?{query}`.
|
|
22
|
+
- `--network <NETWORK>`: Required for direct x402 mode. Repeatable or comma-separated.
|
|
23
|
+
- `--auto-approve-limit <N>`: Required for direct x402 mode. Integer string in token units.
|
|
24
|
+
- `--asset <ADDRESS>`: Optional in direct mode. Exact match (case-insensitive).
|
|
25
|
+
- `-X, --method <METHOD>`: HTTP method (default `GET`).
|
|
26
|
+
- `-d, --data <BODY>`: Raw request body. Defaults method to `POST` if method is not set.
|
|
27
|
+
- `-H, --header <NAME: VALUE>`: Add a request header (repeatable).
|
|
28
|
+
- `-v`: Show final response status and headers.
|
|
29
|
+
- `-vv`: Show final request + response.
|
|
30
|
+
- `-vvv`: Also show probe request + response in direct x402 mode.
|
|
31
|
+
|
|
32
|
+
## Environment Variables
|
|
33
|
+
- `OBUL_PROXY_URL`: Default proxy base when `--obul-proxy` is not set.
|
|
34
|
+
- `OBUL_API_KEY`: API key for proxy mode.
|
|
35
|
+
- `OBUL_X402_PRIVATE_KEY`: Private signing key for direct x402 mode.
|
|
36
|
+
|
|
37
|
+
## Examples
|
|
38
|
+
|
|
39
|
+
Proxy mode (API key):
|
|
40
|
+
```bash
|
|
41
|
+
export OBUL_PROXY_URL="https://proxy.devnet.obul.ai/proxy"
|
|
42
|
+
export OBUL_API_KEY="your-api-key"
|
|
43
|
+
|
|
44
|
+
obulx <x402-protected endpoint>
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
Proxy mode with custom headers:
|
|
48
|
+
```bash
|
|
49
|
+
obulx --obul-proxy https://proxy.devnet.obul.ai/proxy \
|
|
50
|
+
-H "Content-Type: application/json" \
|
|
51
|
+
-H "X-Custom: value" \
|
|
52
|
+
<x402-protected endpoint>
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
Direct x402 mode:
|
|
56
|
+
```bash
|
|
57
|
+
export OBUL_X402_PRIVATE_KEY="0x..."
|
|
58
|
+
|
|
59
|
+
obulx --network base --auto-approve-limit 1000 \
|
|
60
|
+
https://x402.example.com/resource
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
Direct mode with network priority and asset filter:
|
|
64
|
+
```bash
|
|
65
|
+
export OBUL_X402_PRIVATE_KEY="0x..."
|
|
66
|
+
|
|
67
|
+
obulx --network base,optimism --asset 0xA0b86991c6218b36c1d19d4a2e9eb0ce3606eb48 \
|
|
68
|
+
--auto-approve-limit 1000 \
|
|
69
|
+
https://x402.example.com/resource
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
Verbose output (final request + response):
|
|
73
|
+
```bash
|
|
74
|
+
obulx -vv --obul-proxy https://proxy.devnet.obul.ai/proxy \
|
|
75
|
+
<x402-protected endpoint>
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
Verbose output (probe + final in direct mode):
|
|
79
|
+
```bash
|
|
80
|
+
obulx -vvv --network base --auto-approve-limit 1000 \
|
|
81
|
+
https://x402.example.com/resource
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
## CLI
|
|
85
|
+
```bash
|
|
86
|
+
obulx --obul-proxy https://proxy.devnet.obul.ai/proxy \
|
|
87
|
+
-X POST -d '<x402 request body>' \
|
|
88
|
+
<x402-protected endpoint>
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
## Library
|
|
92
|
+
```ts
|
|
93
|
+
import { obulxFetch } from "@obul.ai/obulx"
|
|
94
|
+
|
|
95
|
+
const response = await obulxFetch({
|
|
96
|
+
url: "<x402-protected endpoint>",
|
|
97
|
+
method: "POST",
|
|
98
|
+
body: "...",
|
|
99
|
+
obulProxy: "https://proxy.devnet.obul.ai/proxy",
|
|
100
|
+
obulApiKey: process.env.OBUL_API_KEY,
|
|
101
|
+
verbose: 1
|
|
102
|
+
})
|
|
103
|
+
|
|
104
|
+
process.stdout.write(response.body)
|
|
105
|
+
```
|
package/dist/args.d.ts
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export type ParsedArgs = {
|
|
2
|
+
url?: string;
|
|
3
|
+
method?: string;
|
|
4
|
+
data?: string;
|
|
5
|
+
headers: Record<string, string>;
|
|
6
|
+
networks: string[];
|
|
7
|
+
asset?: string;
|
|
8
|
+
autoApproveLimit?: string;
|
|
9
|
+
obulProxy?: string;
|
|
10
|
+
obulAccessToken?: string;
|
|
11
|
+
obulApiKey?: string;
|
|
12
|
+
verbose: number;
|
|
13
|
+
help: boolean;
|
|
14
|
+
};
|
|
15
|
+
export declare const helpText = "obulx [options] <url>\n\nOptions:\n -X, --method <METHOD> HTTP method (default GET)\n -d, --data <BODY> request body; defaults method to POST if method not set\n -H, --header <NAME: VALUE> add a header (repeatable)\n --network <NETWORK> accepted network (repeatable or comma-separated)\n --asset <ADDRESS> required asset address (exact match, case-insensitive)\n --auto-approve-limit <N> auto-approve limit in token units, integer string\n --obul-proxy <BASE> proxy base, e.g. https://proxy.devnet.obul.ai/proxy\n --obul-access-token <TOK> JWT access token for proxy mode (overrides env)\n --obul-api-key <KEY> API key for proxy mode (overrides env)\n -v, --verbose print final response status/headers\n -vv also print x402 probe request/response when in direct mode\n -h, --help show usage\n";
|
|
16
|
+
export declare function parseNetworks(values: string[]): string[];
|
|
17
|
+
export declare function parseArgs(argv: string[]): ParsedArgs;
|
|
18
|
+
export declare function parseArgsWithDefaults(args: ParsedArgs): Required<Pick<ParsedArgs, "method" | "headers" | "networks" | "verbose">> & ParsedArgs;
|
|
19
|
+
//# sourceMappingURL=args.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"args.d.ts","sourceRoot":"","sources":["../src/args.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAAG;IACvB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC/B,QAAQ,EAAE,MAAM,EAAE,CAAA;IAClB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,OAAO,CAAA;CACd,CAAA;AAED,eAAO,MAAM,QAAQ,+6BAepB,CAAA;AAkBD,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAOxD;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CAuGpD;AAED,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,UAAU,GACf,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,CAAC,CAAC,GAAG,UAAU,CASxF"}
|
package/dist/args.js
ADDED
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
export const helpText = `obulx [options] <url>
|
|
2
|
+
|
|
3
|
+
Options:
|
|
4
|
+
-X, --method <METHOD> HTTP method (default GET)
|
|
5
|
+
-d, --data <BODY> request body; defaults method to POST if method not set
|
|
6
|
+
-H, --header <NAME: VALUE> add a header (repeatable)
|
|
7
|
+
--network <NETWORK> accepted network (repeatable or comma-separated)
|
|
8
|
+
--asset <ADDRESS> required asset address (exact match, case-insensitive)
|
|
9
|
+
--auto-approve-limit <N> auto-approve limit in token units, integer string
|
|
10
|
+
--obul-proxy <BASE> proxy base, e.g. https://proxy.devnet.obul.ai/proxy
|
|
11
|
+
--obul-access-token <TOK> JWT access token for proxy mode (overrides env)
|
|
12
|
+
--obul-api-key <KEY> API key for proxy mode (overrides env)
|
|
13
|
+
-v, --verbose print final response status/headers
|
|
14
|
+
-vv also print x402 probe request/response when in direct mode
|
|
15
|
+
-h, --help show usage
|
|
16
|
+
`;
|
|
17
|
+
function parseHeader(raw) {
|
|
18
|
+
const index = raw.indexOf(":");
|
|
19
|
+
if (index === -1) {
|
|
20
|
+
throw new Error(`Invalid header format: ${raw}`);
|
|
21
|
+
}
|
|
22
|
+
const name = raw.slice(0, index).trim();
|
|
23
|
+
const value = raw.slice(index + 1).trim();
|
|
24
|
+
if (!name)
|
|
25
|
+
throw new Error(`Invalid header name: ${raw}`);
|
|
26
|
+
return { name, value };
|
|
27
|
+
}
|
|
28
|
+
function addNetworks(target, value) {
|
|
29
|
+
const parts = value.split(",").map((part) => part.trim()).filter(Boolean);
|
|
30
|
+
target.push(...parts);
|
|
31
|
+
}
|
|
32
|
+
export function parseNetworks(values) {
|
|
33
|
+
const output = [];
|
|
34
|
+
for (const value of values) {
|
|
35
|
+
const parts = value.split(",").map((part) => part.trim()).filter(Boolean);
|
|
36
|
+
output.push(...parts);
|
|
37
|
+
}
|
|
38
|
+
return output;
|
|
39
|
+
}
|
|
40
|
+
export function parseArgs(argv) {
|
|
41
|
+
const result = {
|
|
42
|
+
headers: {},
|
|
43
|
+
networks: [],
|
|
44
|
+
verbose: 0,
|
|
45
|
+
help: false
|
|
46
|
+
};
|
|
47
|
+
const args = [...argv];
|
|
48
|
+
while (args.length > 0) {
|
|
49
|
+
const arg = args.shift();
|
|
50
|
+
if (!arg)
|
|
51
|
+
continue;
|
|
52
|
+
if (arg === "-h" || arg === "--help") {
|
|
53
|
+
result.help = true;
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
if (arg === "-v" || arg === "--verbose") {
|
|
57
|
+
result.verbose = Math.min(2, result.verbose + 1);
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
if (arg === "-vv") {
|
|
61
|
+
result.verbose = 2;
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
if (arg === "-X" || arg === "--method") {
|
|
65
|
+
const value = args.shift();
|
|
66
|
+
if (!value)
|
|
67
|
+
throw new Error("Missing value for --method");
|
|
68
|
+
result.method = value.toUpperCase();
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
if (arg === "-d" || arg === "--data") {
|
|
72
|
+
const value = args.shift();
|
|
73
|
+
if (value == null)
|
|
74
|
+
throw new Error("Missing value for --data");
|
|
75
|
+
result.data = value;
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
if (arg === "-H" || arg === "--header") {
|
|
79
|
+
const value = args.shift();
|
|
80
|
+
if (!value)
|
|
81
|
+
throw new Error("Missing value for --header");
|
|
82
|
+
const { name, value: headerValue } = parseHeader(value);
|
|
83
|
+
result.headers[name] = headerValue;
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
if (arg === "--network") {
|
|
87
|
+
const value = args.shift();
|
|
88
|
+
if (!value)
|
|
89
|
+
throw new Error("Missing value for --network");
|
|
90
|
+
addNetworks(result.networks, value);
|
|
91
|
+
continue;
|
|
92
|
+
}
|
|
93
|
+
if (arg === "--asset") {
|
|
94
|
+
const value = args.shift();
|
|
95
|
+
if (!value)
|
|
96
|
+
throw new Error("Missing value for --asset");
|
|
97
|
+
result.asset = value;
|
|
98
|
+
continue;
|
|
99
|
+
}
|
|
100
|
+
if (arg === "--auto-approve-limit") {
|
|
101
|
+
const value = args.shift();
|
|
102
|
+
if (!value)
|
|
103
|
+
throw new Error("Missing value for --auto-approve-limit");
|
|
104
|
+
result.autoApproveLimit = value;
|
|
105
|
+
continue;
|
|
106
|
+
}
|
|
107
|
+
if (arg === "--obul-proxy") {
|
|
108
|
+
const value = args.shift();
|
|
109
|
+
if (!value)
|
|
110
|
+
throw new Error("Missing value for --obul-proxy");
|
|
111
|
+
result.obulProxy = value;
|
|
112
|
+
continue;
|
|
113
|
+
}
|
|
114
|
+
if (arg === "--obul-access-token") {
|
|
115
|
+
const value = args.shift();
|
|
116
|
+
if (!value)
|
|
117
|
+
throw new Error("Missing value for --obul-access-token");
|
|
118
|
+
result.obulAccessToken = value;
|
|
119
|
+
continue;
|
|
120
|
+
}
|
|
121
|
+
if (arg === "--obul-api-key") {
|
|
122
|
+
const value = args.shift();
|
|
123
|
+
if (!value)
|
|
124
|
+
throw new Error("Missing value for --obul-api-key");
|
|
125
|
+
result.obulApiKey = value;
|
|
126
|
+
continue;
|
|
127
|
+
}
|
|
128
|
+
if (arg.startsWith("-")) {
|
|
129
|
+
throw new Error(`Unknown flag: ${arg}`);
|
|
130
|
+
}
|
|
131
|
+
if (result.url) {
|
|
132
|
+
throw new Error("Only one URL argument is allowed");
|
|
133
|
+
}
|
|
134
|
+
result.url = arg;
|
|
135
|
+
}
|
|
136
|
+
return result;
|
|
137
|
+
}
|
|
138
|
+
export function parseArgsWithDefaults(args) {
|
|
139
|
+
const method = args.method ?? (args.data ? "POST" : "GET");
|
|
140
|
+
const networks = parseNetworks(args.networks);
|
|
141
|
+
return {
|
|
142
|
+
...args,
|
|
143
|
+
method,
|
|
144
|
+
networks,
|
|
145
|
+
verbose: args.verbose ?? 0
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
//# sourceMappingURL=args.js.map
|
package/dist/args.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"args.js","sourceRoot":"","sources":["../src/args.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { obulxFetch } from "./lib.js";
|
|
3
|
+
import { helpText, parseArgs, parseArgsWithDefaults } from "./args.js";
|
|
4
|
+
async function main() {
|
|
5
|
+
try {
|
|
6
|
+
const parsed = parseArgs(process.argv.slice(2));
|
|
7
|
+
if (parsed.help) {
|
|
8
|
+
process.stderr.write(helpText);
|
|
9
|
+
process.exit(0);
|
|
10
|
+
}
|
|
11
|
+
if (!parsed.url) {
|
|
12
|
+
throw new Error("Missing URL");
|
|
13
|
+
}
|
|
14
|
+
const args = parseArgsWithDefaults(parsed);
|
|
15
|
+
if (!args.url) {
|
|
16
|
+
throw new Error("Missing URL");
|
|
17
|
+
}
|
|
18
|
+
const obulProxy = args.obulProxy ?? process.env.OBUL_PROXY_URL;
|
|
19
|
+
const obulAccessToken = args.obulAccessToken ?? process.env.OBUL_ACCESS_TOKEN;
|
|
20
|
+
const obulApiKey = args.obulApiKey ?? process.env.OBUL_API_KEY;
|
|
21
|
+
const privateKey = process.env.OBUL_X402_PRIVATE_KEY ?? process.env.PRIVATE_KEY;
|
|
22
|
+
const response = await obulxFetch({
|
|
23
|
+
url: args.url,
|
|
24
|
+
method: args.method,
|
|
25
|
+
headers: args.headers,
|
|
26
|
+
body: args.data,
|
|
27
|
+
networks: args.networks,
|
|
28
|
+
asset: args.asset,
|
|
29
|
+
autoApproveLimit: args.autoApproveLimit,
|
|
30
|
+
obulProxy,
|
|
31
|
+
obulAccessToken,
|
|
32
|
+
obulApiKey,
|
|
33
|
+
verbose: args.verbose,
|
|
34
|
+
privateKey
|
|
35
|
+
});
|
|
36
|
+
process.stdout.write(Buffer.from(response.body));
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
40
|
+
process.stderr.write(`${message}\n`);
|
|
41
|
+
process.exit(1);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
main();
|
|
45
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AACrC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAA;AAEtE,KAAK,UAAU,IAAI;IACjB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;QAC/C,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;YAChB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAA;YAC9B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,CAAA;QAChC,CAAC;QAED,MAAM,IAAI,GAAG,qBAAqB,CAAC,MAAM,CAAC,CAAA;QAC1C,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,CAAA;QAChC,CAAC;QACD,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,CAAA;QAC9D,MAAM,eAAe,GAAG,IAAI,CAAC,eAAe,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAA;QAC7E,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,CAAA;QAC9D,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,CAAA;QAE/E,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC;YAChC,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;YACvC,SAAS;YACT,eAAe;YACf,UAAU;YACV,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,UAAU;SACX,CAAC,CAAA;QAEF,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAA;IAClD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QACtE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,IAAI,CAAC,CAAA;QACpC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAA"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AACrC,YAAY,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA"}
|
package/dist/lib.d.ts
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
export type ObulxFetchOptions = {
|
|
2
|
+
url: string;
|
|
3
|
+
method?: string;
|
|
4
|
+
headers?: Record<string, string>;
|
|
5
|
+
body?: string;
|
|
6
|
+
networks?: string[];
|
|
7
|
+
asset?: string;
|
|
8
|
+
autoApproveLimit?: string;
|
|
9
|
+
obulProxy?: string;
|
|
10
|
+
obulAccessToken?: string;
|
|
11
|
+
obulApiKey?: string;
|
|
12
|
+
verbose?: number;
|
|
13
|
+
privateKey?: string;
|
|
14
|
+
fetch?: typeof fetch;
|
|
15
|
+
stderr?: NodeJS.WritableStream;
|
|
16
|
+
stdin?: NodeJS.ReadableStream;
|
|
17
|
+
};
|
|
18
|
+
export type ObulxResponse = {
|
|
19
|
+
status: number;
|
|
20
|
+
statusText: string;
|
|
21
|
+
headers: Record<string, string>;
|
|
22
|
+
body: Uint8Array;
|
|
23
|
+
url: string;
|
|
24
|
+
};
|
|
25
|
+
type PaymentRequirement = {
|
|
26
|
+
scheme?: string;
|
|
27
|
+
network?: string;
|
|
28
|
+
asset?: string;
|
|
29
|
+
amount?: string | number;
|
|
30
|
+
maxAmountRequired?: string | number;
|
|
31
|
+
[key: string]: unknown;
|
|
32
|
+
};
|
|
33
|
+
export declare function buildProxyUrl(base: string, target: URL): string;
|
|
34
|
+
export declare function applyProxyAuth(headers: Headers, options: {
|
|
35
|
+
obulAccessToken?: string;
|
|
36
|
+
obulApiKey?: string;
|
|
37
|
+
}): void;
|
|
38
|
+
export declare function selectPaymentRequirement(input: unknown, options: {
|
|
39
|
+
networks?: string[];
|
|
40
|
+
asset?: string;
|
|
41
|
+
}): PaymentRequirement;
|
|
42
|
+
export declare function obulxFetch(options: ObulxFetchOptions): Promise<ObulxResponse>;
|
|
43
|
+
export {};
|
|
44
|
+
//# sourceMappingURL=lib.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lib.d.ts","sourceRoot":"","sources":["../src/lib.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,iBAAiB,GAAG;IAC9B,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAChC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;IACnB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,KAAK,CAAC,EAAE,OAAO,KAAK,CAAA;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC,cAAc,CAAA;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC,cAAc,CAAA;CAC9B,CAAA;AAED,MAAM,MAAM,aAAa,GAAG;IAC1B,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC/B,IAAI,EAAE,UAAU,CAAA;IAChB,GAAG,EAAE,MAAM,CAAA;CACZ,CAAA;AAED,KAAK,kBAAkB,GAAG;IACxB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IACxB,iBAAiB,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IACnC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB,CAAA;AAYD,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,GAAG,MAAM,CAM/D;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE;IAAE,eAAe,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,QAgB1G;AAED,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,OAAO,EACd,OAAO,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAC/C,kBAAkB,CAwBpB;AAyPD,wBAAsB,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,aAAa,CAAC,CA6FnF"}
|
package/dist/lib.js
ADDED
|
@@ -0,0 +1,350 @@
|
|
|
1
|
+
import { wrapFetchWithPayment } from "x402-fetch";
|
|
2
|
+
import { privateKeyToAccount } from "viem/accounts";
|
|
3
|
+
const REDACTED = "<redacted>";
|
|
4
|
+
const DEFAULT_MAX_VALUE = 10n ** 30n;
|
|
5
|
+
export function buildProxyUrl(base, target) {
|
|
6
|
+
const trimmed = base.replace(/\/+$/, "");
|
|
7
|
+
const scheme = target.protocol.replace(":", "");
|
|
8
|
+
const host = target.host;
|
|
9
|
+
const path = target.pathname || "/";
|
|
10
|
+
return `${trimmed}/${scheme}/${host}${path}${target.search}`;
|
|
11
|
+
}
|
|
12
|
+
export function applyProxyAuth(headers, options) {
|
|
13
|
+
if (options.obulAccessToken) {
|
|
14
|
+
headers.set("Authorization", `Bearer ${options.obulAccessToken}`);
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
if (headers.get("authorization")) {
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
if (options.obulApiKey) {
|
|
21
|
+
headers.set("X-Obul-Api-Key", options.obulApiKey);
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
throw new Error("Missing proxy auth: set --obul-access-token, --obul-api-key, or OBUL_ACCESS_TOKEN/OBUL_API_KEY.");
|
|
25
|
+
}
|
|
26
|
+
export function selectPaymentRequirement(input, options) {
|
|
27
|
+
const requirements = normalizeRequirements(input);
|
|
28
|
+
if (requirements.length === 0) {
|
|
29
|
+
throw new Error("No payment requirements available");
|
|
30
|
+
}
|
|
31
|
+
const asset = options.asset?.toLowerCase();
|
|
32
|
+
const filteredByAsset = asset
|
|
33
|
+
? requirements.filter((req) => (req.asset ?? "").toString().toLowerCase() === asset)
|
|
34
|
+
: requirements;
|
|
35
|
+
if (asset && filteredByAsset.length === 0) {
|
|
36
|
+
throw new Error(`No payment requirements matched asset ${options.asset}`);
|
|
37
|
+
}
|
|
38
|
+
if (options.networks && options.networks.length > 0) {
|
|
39
|
+
for (const network of options.networks) {
|
|
40
|
+
const match = filteredByAsset.find((req) => matchesNetwork(req, network));
|
|
41
|
+
if (match)
|
|
42
|
+
return match;
|
|
43
|
+
}
|
|
44
|
+
throw new Error(`No payment requirements matched networks: ${options.networks.join(", ")}`);
|
|
45
|
+
}
|
|
46
|
+
return filteredByAsset[0];
|
|
47
|
+
}
|
|
48
|
+
function matchesNetwork(requirement, network) {
|
|
49
|
+
const target = network.toLowerCase();
|
|
50
|
+
const requirementNetwork = extractNetwork(requirement);
|
|
51
|
+
if (!requirementNetwork)
|
|
52
|
+
return false;
|
|
53
|
+
return requirementNetwork.toLowerCase() === target;
|
|
54
|
+
}
|
|
55
|
+
function extractNetwork(requirement) {
|
|
56
|
+
const network = requirement.network;
|
|
57
|
+
if (typeof network === "string")
|
|
58
|
+
return network;
|
|
59
|
+
if (typeof network === "number")
|
|
60
|
+
return String(network);
|
|
61
|
+
if (typeof network === "object" && network !== null) {
|
|
62
|
+
const value = network.id;
|
|
63
|
+
if (typeof value === "string")
|
|
64
|
+
return value;
|
|
65
|
+
if (typeof value === "number")
|
|
66
|
+
return String(value);
|
|
67
|
+
}
|
|
68
|
+
return undefined;
|
|
69
|
+
}
|
|
70
|
+
function normalizeRequirements(input) {
|
|
71
|
+
if (!input)
|
|
72
|
+
return [];
|
|
73
|
+
if (Array.isArray(input)) {
|
|
74
|
+
return input.flatMap((item) => normalizeRequirements(item));
|
|
75
|
+
}
|
|
76
|
+
if (typeof input !== "object")
|
|
77
|
+
return [];
|
|
78
|
+
const obj = input;
|
|
79
|
+
if ("paymentRequirements" in obj) {
|
|
80
|
+
return normalizeRequirements(obj.paymentRequirements);
|
|
81
|
+
}
|
|
82
|
+
if ("accepts" in obj) {
|
|
83
|
+
return normalizeRequirements(obj.accepts);
|
|
84
|
+
}
|
|
85
|
+
if ("paymentRequired" in obj) {
|
|
86
|
+
return normalizeRequirements(obj.paymentRequired);
|
|
87
|
+
}
|
|
88
|
+
if ("payment_required" in obj) {
|
|
89
|
+
return normalizeRequirements(obj.payment_required);
|
|
90
|
+
}
|
|
91
|
+
if ("requirements" in obj) {
|
|
92
|
+
return normalizeRequirements(obj.requirements);
|
|
93
|
+
}
|
|
94
|
+
if (looksLikeRequirement(obj)) {
|
|
95
|
+
return [obj];
|
|
96
|
+
}
|
|
97
|
+
return [];
|
|
98
|
+
}
|
|
99
|
+
function looksLikeRequirement(obj) {
|
|
100
|
+
return "scheme" in obj || "network" in obj || "asset" in obj || "amount" in obj;
|
|
101
|
+
}
|
|
102
|
+
function parseAmount(requirement) {
|
|
103
|
+
const value = requirement.amount ?? requirement.maxAmountRequired;
|
|
104
|
+
if (typeof value === "number" && Number.isFinite(value)) {
|
|
105
|
+
return { raw: String(value), number: value };
|
|
106
|
+
}
|
|
107
|
+
if (typeof value === "string") {
|
|
108
|
+
const trimmed = value.trim();
|
|
109
|
+
if (/^\d+$/.test(trimmed)) {
|
|
110
|
+
try {
|
|
111
|
+
return { raw: trimmed, bigint: BigInt(trimmed) };
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
return { raw: trimmed };
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
const asNumber = Number(trimmed);
|
|
118
|
+
if (Number.isFinite(asNumber)) {
|
|
119
|
+
return { raw: trimmed, number: asNumber };
|
|
120
|
+
}
|
|
121
|
+
return { raw: trimmed };
|
|
122
|
+
}
|
|
123
|
+
return { raw: "" };
|
|
124
|
+
}
|
|
125
|
+
function parseLimit(limit) {
|
|
126
|
+
if (limit == null)
|
|
127
|
+
return undefined;
|
|
128
|
+
if (!/^\d+$/.test(limit.trim())) {
|
|
129
|
+
throw new Error("--auto-approve-limit must be an integer string");
|
|
130
|
+
}
|
|
131
|
+
return BigInt(limit.trim());
|
|
132
|
+
}
|
|
133
|
+
function normalizePrivateKey(key) {
|
|
134
|
+
const trimmed = key.trim();
|
|
135
|
+
if (trimmed.startsWith("0x"))
|
|
136
|
+
return trimmed;
|
|
137
|
+
return `0x${trimmed}`;
|
|
138
|
+
}
|
|
139
|
+
async function confirmPayment(requirement, options) {
|
|
140
|
+
const isTTY = Boolean(options.stdin.isTTY);
|
|
141
|
+
if (!isTTY) {
|
|
142
|
+
throw new Error("Payment requires confirmation but stdin is not interactive");
|
|
143
|
+
}
|
|
144
|
+
const { stderr, stdin } = options;
|
|
145
|
+
const amount = parseAmount(requirement);
|
|
146
|
+
const displayAmount = amount.raw || "unknown";
|
|
147
|
+
const asset = requirement.asset ?? "unknown";
|
|
148
|
+
return new Promise((resolve) => {
|
|
149
|
+
stderr.write(`Approve payment of ${displayAmount} ${asset}? [y/N]: `);
|
|
150
|
+
let buffer = "";
|
|
151
|
+
const onData = (chunk) => {
|
|
152
|
+
buffer += chunk.toString();
|
|
153
|
+
if (!buffer.includes("\n"))
|
|
154
|
+
return;
|
|
155
|
+
cleanup();
|
|
156
|
+
const answer = buffer.trim().toLowerCase();
|
|
157
|
+
resolve(answer === "y" || answer === "yes");
|
|
158
|
+
};
|
|
159
|
+
const onEnd = () => {
|
|
160
|
+
cleanup();
|
|
161
|
+
resolve(false);
|
|
162
|
+
};
|
|
163
|
+
const cleanup = () => {
|
|
164
|
+
stdin.off("data", onData);
|
|
165
|
+
stdin.off("end", onEnd);
|
|
166
|
+
};
|
|
167
|
+
stdin.on("data", onData);
|
|
168
|
+
stdin.on("end", onEnd);
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
function redactHeaders(headers) {
|
|
172
|
+
const lines = [];
|
|
173
|
+
headers.forEach((value, key) => {
|
|
174
|
+
if (key.toLowerCase() === "authorization" || key.toLowerCase() === "x-obul-api-key") {
|
|
175
|
+
lines.push(`${key}: ${REDACTED}`);
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
lines.push(`${key}: ${value}`);
|
|
179
|
+
});
|
|
180
|
+
return lines;
|
|
181
|
+
}
|
|
182
|
+
function logResponse(res, stderr, label) {
|
|
183
|
+
const prefix = label ? `[${label}] ` : "";
|
|
184
|
+
stderr.write(`${prefix}${res.status} ${res.statusText}\n`);
|
|
185
|
+
for (const line of redactHeaders(res.headers)) {
|
|
186
|
+
stderr.write(`${prefix}${line}\n`);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
function logRequest(method, url, headers, stderr, label) {
|
|
190
|
+
const prefix = label ? `[${label}] ` : "";
|
|
191
|
+
stderr.write(`${prefix}${method.toUpperCase()} ${url}\n`);
|
|
192
|
+
for (const line of redactHeaders(headers)) {
|
|
193
|
+
stderr.write(`${prefix}${line}\n`);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
async function toResponseLike(response) {
|
|
197
|
+
const buffer = new Uint8Array(await response.arrayBuffer());
|
|
198
|
+
const headers = {};
|
|
199
|
+
response.headers.forEach((value, key) => {
|
|
200
|
+
headers[key] = value;
|
|
201
|
+
});
|
|
202
|
+
return {
|
|
203
|
+
status: response.status,
|
|
204
|
+
statusText: response.statusText,
|
|
205
|
+
headers,
|
|
206
|
+
body: buffer,
|
|
207
|
+
url: response.url
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
async function parsePaymentRequired(response) {
|
|
211
|
+
const header = response.headers.get("payment-required") ?? response.headers.get("x-payment-required");
|
|
212
|
+
if (header) {
|
|
213
|
+
const fromHeader = parsePaymentRequiredHeader(header);
|
|
214
|
+
if (fromHeader) {
|
|
215
|
+
return { raw: fromHeader, requirements: normalizeRequirements(fromHeader) };
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
try {
|
|
219
|
+
const body = await response.json();
|
|
220
|
+
return { raw: body, requirements: normalizeRequirements(body) };
|
|
221
|
+
}
|
|
222
|
+
catch {
|
|
223
|
+
return { raw: undefined, requirements: [] };
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
function parsePaymentRequiredHeader(header) {
|
|
227
|
+
const trimmed = header.trim();
|
|
228
|
+
if (!trimmed)
|
|
229
|
+
return undefined;
|
|
230
|
+
try {
|
|
231
|
+
return JSON.parse(trimmed);
|
|
232
|
+
}
|
|
233
|
+
catch {
|
|
234
|
+
try {
|
|
235
|
+
const decoded = Buffer.from(trimmed, "base64").toString("utf8");
|
|
236
|
+
return JSON.parse(decoded);
|
|
237
|
+
}
|
|
238
|
+
catch {
|
|
239
|
+
return undefined;
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
function createProbeFetch(fetcher, probe) {
|
|
244
|
+
let used = false;
|
|
245
|
+
return async (input, init) => {
|
|
246
|
+
if (!used) {
|
|
247
|
+
used = true;
|
|
248
|
+
return probe;
|
|
249
|
+
}
|
|
250
|
+
return fetcher(input, init);
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
function pickMatchingRequirement(requirements, selected) {
|
|
254
|
+
if (requirements.length === 0) {
|
|
255
|
+
throw new Error("No payment requirements available");
|
|
256
|
+
}
|
|
257
|
+
const selectedAmount = selected.amount ?? selected.maxAmountRequired;
|
|
258
|
+
const matches = requirements.filter((req) => {
|
|
259
|
+
const sameNetwork = selected.network ? matchesNetwork(req, selected.network) : true;
|
|
260
|
+
const sameAsset = selected.asset
|
|
261
|
+
? (req.asset ?? "").toString().toLowerCase() === selected.asset.toString().toLowerCase()
|
|
262
|
+
: true;
|
|
263
|
+
const reqAmount = req.amount ?? req.maxAmountRequired;
|
|
264
|
+
const sameAmount = selectedAmount != null ? String(reqAmount ?? "") === String(selectedAmount) : true;
|
|
265
|
+
return sameNetwork && sameAsset && sameAmount;
|
|
266
|
+
});
|
|
267
|
+
return matches[0] ?? requirements[0];
|
|
268
|
+
}
|
|
269
|
+
export async function obulxFetch(options) {
|
|
270
|
+
const fetcher = options.fetch ?? globalThis.fetch;
|
|
271
|
+
if (!fetcher) {
|
|
272
|
+
throw new Error("fetch is not available in this environment");
|
|
273
|
+
}
|
|
274
|
+
const stderr = options.stderr ?? process.stderr;
|
|
275
|
+
const stdin = options.stdin ?? process.stdin;
|
|
276
|
+
const method = options.method ?? (options.body ? "POST" : "GET");
|
|
277
|
+
const headers = new Headers(options.headers ?? {});
|
|
278
|
+
const verbose = options.verbose ?? 0;
|
|
279
|
+
const requestUrl = new URL(options.url);
|
|
280
|
+
const init = {
|
|
281
|
+
method,
|
|
282
|
+
headers,
|
|
283
|
+
body: options.body
|
|
284
|
+
};
|
|
285
|
+
if (options.obulProxy) {
|
|
286
|
+
const proxyUrl = buildProxyUrl(options.obulProxy, requestUrl);
|
|
287
|
+
applyProxyAuth(headers, { obulAccessToken: options.obulAccessToken, obulApiKey: options.obulApiKey });
|
|
288
|
+
const response = await fetcher(proxyUrl, init);
|
|
289
|
+
if (verbose >= 1) {
|
|
290
|
+
logResponse(response, stderr);
|
|
291
|
+
}
|
|
292
|
+
return toResponseLike(response);
|
|
293
|
+
}
|
|
294
|
+
if (!options.networks || options.networks.length === 0) {
|
|
295
|
+
throw new Error("--network is required for direct x402 mode");
|
|
296
|
+
}
|
|
297
|
+
const limit = parseLimit(options.autoApproveLimit);
|
|
298
|
+
if (!limit) {
|
|
299
|
+
throw new Error("--auto-approve-limit is required for direct x402 mode");
|
|
300
|
+
}
|
|
301
|
+
const privateKey = options.privateKey;
|
|
302
|
+
if (!privateKey) {
|
|
303
|
+
throw new Error("Missing private key: set OBUL_X402_PRIVATE_KEY or PRIVATE_KEY");
|
|
304
|
+
}
|
|
305
|
+
const probe = await fetcher(requestUrl.toString(), init);
|
|
306
|
+
if (verbose >= 2) {
|
|
307
|
+
logRequest(method, requestUrl.toString(), headers, stderr, "probe request");
|
|
308
|
+
logResponse(probe, stderr, "probe response");
|
|
309
|
+
}
|
|
310
|
+
if (probe.status !== 402) {
|
|
311
|
+
if (verbose >= 1) {
|
|
312
|
+
logResponse(probe, stderr);
|
|
313
|
+
}
|
|
314
|
+
return toResponseLike(probe);
|
|
315
|
+
}
|
|
316
|
+
const parsed = await parsePaymentRequired(probe.clone());
|
|
317
|
+
if (parsed.requirements.length === 0) {
|
|
318
|
+
throw new Error("Received 402 but could not parse payment requirements");
|
|
319
|
+
}
|
|
320
|
+
const selected = selectPaymentRequirement(parsed.raw ?? parsed.requirements, {
|
|
321
|
+
networks: options.networks,
|
|
322
|
+
asset: options.asset
|
|
323
|
+
});
|
|
324
|
+
const amount = parseAmount(selected);
|
|
325
|
+
if (amount.bigint != null) {
|
|
326
|
+
if (amount.bigint > limit) {
|
|
327
|
+
const approved = await confirmPayment(selected, { stderr, stdin });
|
|
328
|
+
if (!approved)
|
|
329
|
+
throw new Error("Payment declined");
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
else if (amount.number != null) {
|
|
333
|
+
const limitNumber = Number(limit);
|
|
334
|
+
if (Number.isFinite(limitNumber) && amount.number > limitNumber) {
|
|
335
|
+
const approved = await confirmPayment(selected, { stderr, stdin });
|
|
336
|
+
if (!approved)
|
|
337
|
+
throw new Error("Payment declined");
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
const account = privateKeyToAccount(normalizePrivateKey(privateKey));
|
|
341
|
+
const fetchWithProbe = createProbeFetch(fetcher, probe);
|
|
342
|
+
const selector = (requirements) => pickMatchingRequirement(requirements, selected);
|
|
343
|
+
const fetchWithPayment = wrapFetchWithPayment(fetchWithProbe, account, DEFAULT_MAX_VALUE, selector);
|
|
344
|
+
const paidResponse = await fetchWithPayment(requestUrl.toString(), init);
|
|
345
|
+
if (verbose >= 1) {
|
|
346
|
+
logResponse(paidResponse, stderr);
|
|
347
|
+
}
|
|
348
|
+
return toResponseLike(paidResponse);
|
|
349
|
+
}
|
|
350
|
+
//# sourceMappingURL=lib.js.map
|
package/dist/lib.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lib.js","sourceRoot":"","sources":["../src/lib.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@obul.ai/obulx",
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"description": "Obul x402 CLI and library.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"bin": {
|
|
9
|
+
"obulx": "dist/cli.js"
|
|
10
|
+
},
|
|
11
|
+
"files": [
|
|
12
|
+
"dist",
|
|
13
|
+
"README.md"
|
|
14
|
+
],
|
|
15
|
+
"sideEffects": false,
|
|
16
|
+
"scripts": {
|
|
17
|
+
"build": "tsc -p tsconfig.json",
|
|
18
|
+
"typecheck": "tsc -p tsconfig.json --noEmit"
|
|
19
|
+
},
|
|
20
|
+
"dependencies": {
|
|
21
|
+
"x402-fetch": "^0.6.0",
|
|
22
|
+
"viem": "^2.21.26"
|
|
23
|
+
},
|
|
24
|
+
"devDependencies": {
|
|
25
|
+
"@types/node": "^20.11.30"
|
|
26
|
+
}
|
|
27
|
+
}
|