@auteng/agent-utils 0.4.0 → 1.0.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 +9 -114
- package/dist/index.d.mts +8 -73
- package/dist/index.d.ts +8 -73
- package/dist/index.js +17 -259
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +17 -257
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
# @auteng/agent-utils
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
x402 payments and sandboxed compute for autonomous AI agents. Discover, probe, and pay for x402-enabled services, and run sandboxed compute — all with USDC on Base.
|
|
4
|
+
|
|
5
|
+
> **Wallet management** has moved to [`@auteng/pocket-money`](https://www.npmjs.com/package/@auteng/pocket-money). This package focuses on x402 protocol tools and compute. Agents can use any wallet — pocket-money, Coinbase Agentic Wallet, viem, ethers, or raw key management.
|
|
4
6
|
|
|
5
7
|
## Install
|
|
6
8
|
|
|
@@ -11,23 +13,16 @@ npm install @auteng/agent-utils
|
|
|
11
13
|
## Quick Start
|
|
12
14
|
|
|
13
15
|
```typescript
|
|
14
|
-
import {
|
|
16
|
+
import { x402, compute } from '@auteng/agent-utils';
|
|
15
17
|
|
|
16
18
|
// Probe any URL to check if it's x402-enabled
|
|
17
19
|
const info = await x402.probe('https://api.example.com/generate');
|
|
18
20
|
console.log(info.price); // "$0.05 USDC on Base"
|
|
19
|
-
|
|
20
|
-
// Create a wallet and pay for it
|
|
21
|
-
const w = await wallet.create({ name: "my-task" });
|
|
22
|
-
const res = await w.fetch('https://api.example.com/generate', {
|
|
23
|
-
method: 'POST',
|
|
24
|
-
body: JSON.stringify({ prompt: 'hello' }),
|
|
25
|
-
});
|
|
26
21
|
```
|
|
27
22
|
|
|
28
23
|
## x402 — Discover & Inspect Services
|
|
29
24
|
|
|
30
|
-
Standalone functions for working with x402 services.
|
|
25
|
+
Standalone functions for working with x402 services.
|
|
31
26
|
|
|
32
27
|
### Probe a URL
|
|
33
28
|
|
|
@@ -68,74 +63,18 @@ x402.formatPrice("2000", "0x833589f...", "eip155:8453", { short: true });
|
|
|
68
63
|
// → "$0.002 USDC"
|
|
69
64
|
```
|
|
70
65
|
|
|
71
|
-
## Wallets
|
|
72
|
-
|
|
73
|
-
Each wallet is an independent keypair with its own address and balance. Create as many as you need — one per task, one per month, one per budget.
|
|
74
|
-
|
|
75
|
-
```typescript
|
|
76
|
-
import { wallet } from '@auteng/agent-utils';
|
|
77
|
-
|
|
78
|
-
const monthly = await wallet.create({ name: "feb-2026" });
|
|
79
|
-
const task = await wallet.create({ name: "data-pipeline" });
|
|
80
|
-
```
|
|
81
|
-
|
|
82
|
-
Wallets are persisted at `.auteng/wallets/<name>.json`. Creating a wallet that already exists loads it from disk.
|
|
83
|
-
|
|
84
|
-
### Check balance
|
|
85
|
-
|
|
86
|
-
```typescript
|
|
87
|
-
const balance = await monthly.checkBalance();
|
|
88
|
-
// Returns USDC in minor units (6 decimals)
|
|
89
|
-
// 10_000000n = $10.00 USDC
|
|
90
|
-
```
|
|
91
|
-
|
|
92
|
-
### Wait for funding
|
|
93
|
-
|
|
94
|
-
```typescript
|
|
95
|
-
await monthly.waitForFunding(10_000000n);
|
|
96
|
-
// Polls Base every 10s until >= $10 USDC is available
|
|
97
|
-
```
|
|
98
|
-
|
|
99
|
-
### Pay any x402 service
|
|
100
|
-
|
|
101
|
-
Drop-in `fetch()` replacement that handles x402 payments automatically:
|
|
102
|
-
|
|
103
|
-
```typescript
|
|
104
|
-
const res = await monthly.fetch('https://any-x402-service.com/api', {
|
|
105
|
-
method: 'POST',
|
|
106
|
-
headers: { 'Content-Type': 'application/json' },
|
|
107
|
-
body: JSON.stringify({ prompt: 'hello' }),
|
|
108
|
-
});
|
|
109
|
-
```
|
|
110
|
-
|
|
111
|
-
If the server returns `402 Payment Required`, the library signs an EIP-3009 authorization and retries with payment headers. No gas needed.
|
|
112
|
-
|
|
113
|
-
### Retrieve and list wallets
|
|
114
|
-
|
|
115
|
-
```typescript
|
|
116
|
-
const w = wallet.get("feb-2026"); // load by name
|
|
117
|
-
const all = wallet.list(); // list all wallets
|
|
118
|
-
|
|
119
|
-
for (const w of all) {
|
|
120
|
-
const bal = await w.checkBalance();
|
|
121
|
-
console.log(`${w.name}: ${w.address} — ${bal} USDC`);
|
|
122
|
-
}
|
|
123
|
-
```
|
|
124
|
-
|
|
125
66
|
## Compute (AutEng)
|
|
126
67
|
|
|
127
|
-
Convenience wrapper for AutEng's x402 sandboxed compute service:
|
|
68
|
+
Convenience wrapper for AutEng's x402 sandboxed compute service. Accepts any object with a `fetch()` method as the wallet:
|
|
128
69
|
|
|
129
70
|
```typescript
|
|
130
|
-
import {
|
|
131
|
-
|
|
132
|
-
const w = await wallet.create({ name: "compute-budget" });
|
|
71
|
+
import { compute } from '@auteng/agent-utils';
|
|
133
72
|
|
|
134
73
|
const result = await compute.run({
|
|
135
74
|
code: 'print("hello world")',
|
|
136
75
|
stack: 'python', // 'python' | 'node'
|
|
137
76
|
size: 'small', // 'small' | 'med' | 'large'
|
|
138
|
-
wallet:
|
|
77
|
+
wallet: myWallet, // any object with fetch()
|
|
139
78
|
});
|
|
140
79
|
console.log(result.stdout); // "hello world\n"
|
|
141
80
|
```
|
|
@@ -152,56 +91,12 @@ console.log(result.stdout); // "hello world\n"
|
|
|
152
91
|
compute.pricing(); // returns full pricing table
|
|
153
92
|
```
|
|
154
93
|
|
|
155
|
-
## Demo
|
|
156
|
-
|
|
157
|
-
Run the included demo to see wallet creation, funding, and compute in action:
|
|
158
|
-
|
|
159
|
-
```bash
|
|
160
|
-
node demo.mjs
|
|
161
|
-
```
|
|
162
|
-
|
|
163
|
-
```
|
|
164
|
-
────────────────────────────────────────────────────────
|
|
165
|
-
POCKET MONEY DEMO — autonomous compute with x402
|
|
166
|
-
────────────────────────────────────────────────────────
|
|
167
|
-
|
|
168
|
-
Compute pricing:
|
|
169
|
-
small → $0.002 base + $0.00005/s (2 vCPU, 1GB RAM)
|
|
170
|
-
med → $0.008 base + $0.00012/s (4 vCPU, 4GB RAM)
|
|
171
|
-
large → $0.03 base + $0.00025/s (8 vCPU, 16GB RAM)
|
|
172
|
-
|
|
173
|
-
Wallet: "demo-compute"
|
|
174
|
-
Address: 0x9cc8...e18
|
|
175
|
-
Balance: $0.0000
|
|
176
|
-
────────────────────────────────────────────────────────
|
|
177
|
-
|
|
178
|
-
Waiting for funds...
|
|
179
|
-
Funded! New balance: $1.0000
|
|
180
|
-
────────────────────────────────────────────────────────
|
|
181
|
-
|
|
182
|
-
Running compute jobs...
|
|
183
|
-
|
|
184
|
-
▸ Python — Fibonacci
|
|
185
|
-
fib(50) = 12586269025
|
|
186
|
-
|
|
187
|
-
▸ Python — System info
|
|
188
|
-
Python 3.12.12, Linux 6.1.158, x86_64, 2 CPUs
|
|
189
|
-
|
|
190
|
-
▸ Node — UUID generation
|
|
191
|
-
f8b260ec-2dea-401b-b807-544f366a8588
|
|
192
|
-
...
|
|
193
|
-
|
|
194
|
-
Spent: $0.0020
|
|
195
|
-
────────────────────────────────────────────────────────
|
|
196
|
-
Done!
|
|
197
|
-
```
|
|
198
|
-
|
|
199
94
|
## Development
|
|
200
95
|
|
|
201
96
|
```bash
|
|
202
97
|
npm install # install dependencies
|
|
203
98
|
npm run build # build CJS/ESM/DTS to dist/
|
|
204
|
-
npm test # run
|
|
99
|
+
npm test # run tests
|
|
205
100
|
npm run test:watch # run tests in watch mode
|
|
206
101
|
```
|
|
207
102
|
|
package/dist/index.d.mts
CHANGED
|
@@ -1,82 +1,16 @@
|
|
|
1
|
-
import { PrivateKeyAccount } from 'viem';
|
|
2
|
-
|
|
3
|
-
type Network = "base" | "base-sepolia";
|
|
4
|
-
interface CreateWalletOptions {
|
|
5
|
-
/** Wallet identifier. Default: "default" */
|
|
6
|
-
name?: string;
|
|
7
|
-
/** Network to use. Default: `base` */
|
|
8
|
-
network?: Network;
|
|
9
|
-
/** Custom RPC endpoint. Default: public Base RPC */
|
|
10
|
-
rpcUrl?: string;
|
|
11
|
-
/** Base directory for wallet storage. Default: ".auteng/wallets" */
|
|
12
|
-
walletsDir?: string;
|
|
13
|
-
}
|
|
14
|
-
/** @deprecated Use CreateWalletOptions instead */
|
|
15
|
-
type WalletConfig = CreateWalletOptions;
|
|
16
|
-
interface WaitForFundingOptions {
|
|
17
|
-
/** Poll interval in milliseconds. Default: 10000 (10s) */
|
|
18
|
-
pollInterval?: number;
|
|
19
|
-
/** Timeout in milliseconds. Default: none (waits forever) */
|
|
20
|
-
timeout?: number;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
declare class Wallet {
|
|
24
|
-
readonly name: string;
|
|
25
|
-
readonly address: `0x${string}`;
|
|
26
|
-
readonly network: Network;
|
|
27
|
-
private _account;
|
|
28
|
-
private _privateKey;
|
|
29
|
-
private _rpcUrl;
|
|
30
|
-
private _paymentFetch;
|
|
31
|
-
constructor(params: {
|
|
32
|
-
name: string;
|
|
33
|
-
account: PrivateKeyAccount;
|
|
34
|
-
privateKey: `0x${string}`;
|
|
35
|
-
network: Network;
|
|
36
|
-
rpcUrl?: string;
|
|
37
|
-
paymentFetch: typeof globalThis.fetch;
|
|
38
|
-
});
|
|
39
|
-
/** Check USDC balance on Base. Returns balance in minor units (6 decimals). */
|
|
40
|
-
checkBalance(): Promise<bigint>;
|
|
41
|
-
/**
|
|
42
|
-
* Poll until USDC balance >= minAmount.
|
|
43
|
-
* @param minAmount - minimum USDC balance in minor units (6 decimals)
|
|
44
|
-
*/
|
|
45
|
-
waitForFunding(minAmount: bigint, opts?: WaitForFundingOptions): Promise<void>;
|
|
46
|
-
/**
|
|
47
|
-
* Drop-in `fetch()` replacement that handles x402 payments automatically.
|
|
48
|
-
* If the server returns 402, the library signs an EIP-3009 authorization
|
|
49
|
-
* and retries the request with payment headers.
|
|
50
|
-
*/
|
|
51
|
-
fetch(input: string | URL | Request, init?: RequestInit): Promise<Response>;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
declare const wallet: {
|
|
55
|
-
/**
|
|
56
|
-
* Create a new named wallet or load an existing one from disk.
|
|
57
|
-
* Idempotent: if a wallet with this name already exists, returns it.
|
|
58
|
-
*/
|
|
59
|
-
create(opts?: CreateWalletOptions): Promise<Wallet>;
|
|
60
|
-
/**
|
|
61
|
-
* Retrieve a previously-created wallet by name.
|
|
62
|
-
* Loads from disk if not in memory. Throws if not found.
|
|
63
|
-
*/
|
|
64
|
-
get(name: string): Wallet;
|
|
65
|
-
/** List all persisted wallets. */
|
|
66
|
-
list(): Wallet[];
|
|
67
|
-
/** @internal Clear in-memory cache and reset wallets dir. For testing only. */
|
|
68
|
-
_reset(): void;
|
|
69
|
-
};
|
|
70
|
-
|
|
71
1
|
type Stack = "python" | "node";
|
|
72
2
|
type Size = "small" | "med" | "large";
|
|
3
|
+
/** Any object with a fetch method — pocket-money Wallet, custom wrapper, etc. */
|
|
4
|
+
interface ComputeWallet {
|
|
5
|
+
fetch(input: string | URL | Request, init?: RequestInit): Promise<Response>;
|
|
6
|
+
}
|
|
73
7
|
interface ComputeRequest {
|
|
74
8
|
/** The code to execute */
|
|
75
9
|
code: string;
|
|
76
10
|
/** Runtime stack: 'python' (3.14) or 'node' (24 LTS) */
|
|
77
11
|
stack: Stack;
|
|
78
|
-
/** The wallet to pay from */
|
|
79
|
-
wallet:
|
|
12
|
+
/** The wallet to pay from — any object with a fetch() method */
|
|
13
|
+
wallet: ComputeWallet;
|
|
80
14
|
/** Sandbox size. Default: 'small' */
|
|
81
15
|
size?: Size;
|
|
82
16
|
/** Execution timeout in seconds. Default: per-size default */
|
|
@@ -114,6 +48,7 @@ declare const compute: {
|
|
|
114
48
|
setEndpoint(url: string): void;
|
|
115
49
|
};
|
|
116
50
|
|
|
51
|
+
type Network = "base" | "base-sepolia";
|
|
117
52
|
/** A single accepted payment option from a 402 response. */
|
|
118
53
|
interface PaymentOption {
|
|
119
54
|
scheme: string;
|
|
@@ -230,4 +165,4 @@ declare const x402: {
|
|
|
230
165
|
formatPrice: typeof formatPrice;
|
|
231
166
|
};
|
|
232
167
|
|
|
233
|
-
export { type BazaarService, type ComputeRequest, type ComputeResponse, type
|
|
168
|
+
export { type BazaarService, type ComputeRequest, type ComputeResponse, type ComputeWallet, type DiscoverOptions, type DiscoverResult, type FormatPriceOptions, type Network, type PaymentOption, type PaymentRequiredResponse, type PricingTier, type ProbeOptions, type ProbeResult, type Size, type Stack, compute, x402 };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,82 +1,16 @@
|
|
|
1
|
-
import { PrivateKeyAccount } from 'viem';
|
|
2
|
-
|
|
3
|
-
type Network = "base" | "base-sepolia";
|
|
4
|
-
interface CreateWalletOptions {
|
|
5
|
-
/** Wallet identifier. Default: "default" */
|
|
6
|
-
name?: string;
|
|
7
|
-
/** Network to use. Default: `base` */
|
|
8
|
-
network?: Network;
|
|
9
|
-
/** Custom RPC endpoint. Default: public Base RPC */
|
|
10
|
-
rpcUrl?: string;
|
|
11
|
-
/** Base directory for wallet storage. Default: ".auteng/wallets" */
|
|
12
|
-
walletsDir?: string;
|
|
13
|
-
}
|
|
14
|
-
/** @deprecated Use CreateWalletOptions instead */
|
|
15
|
-
type WalletConfig = CreateWalletOptions;
|
|
16
|
-
interface WaitForFundingOptions {
|
|
17
|
-
/** Poll interval in milliseconds. Default: 10000 (10s) */
|
|
18
|
-
pollInterval?: number;
|
|
19
|
-
/** Timeout in milliseconds. Default: none (waits forever) */
|
|
20
|
-
timeout?: number;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
declare class Wallet {
|
|
24
|
-
readonly name: string;
|
|
25
|
-
readonly address: `0x${string}`;
|
|
26
|
-
readonly network: Network;
|
|
27
|
-
private _account;
|
|
28
|
-
private _privateKey;
|
|
29
|
-
private _rpcUrl;
|
|
30
|
-
private _paymentFetch;
|
|
31
|
-
constructor(params: {
|
|
32
|
-
name: string;
|
|
33
|
-
account: PrivateKeyAccount;
|
|
34
|
-
privateKey: `0x${string}`;
|
|
35
|
-
network: Network;
|
|
36
|
-
rpcUrl?: string;
|
|
37
|
-
paymentFetch: typeof globalThis.fetch;
|
|
38
|
-
});
|
|
39
|
-
/** Check USDC balance on Base. Returns balance in minor units (6 decimals). */
|
|
40
|
-
checkBalance(): Promise<bigint>;
|
|
41
|
-
/**
|
|
42
|
-
* Poll until USDC balance >= minAmount.
|
|
43
|
-
* @param minAmount - minimum USDC balance in minor units (6 decimals)
|
|
44
|
-
*/
|
|
45
|
-
waitForFunding(minAmount: bigint, opts?: WaitForFundingOptions): Promise<void>;
|
|
46
|
-
/**
|
|
47
|
-
* Drop-in `fetch()` replacement that handles x402 payments automatically.
|
|
48
|
-
* If the server returns 402, the library signs an EIP-3009 authorization
|
|
49
|
-
* and retries the request with payment headers.
|
|
50
|
-
*/
|
|
51
|
-
fetch(input: string | URL | Request, init?: RequestInit): Promise<Response>;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
declare const wallet: {
|
|
55
|
-
/**
|
|
56
|
-
* Create a new named wallet or load an existing one from disk.
|
|
57
|
-
* Idempotent: if a wallet with this name already exists, returns it.
|
|
58
|
-
*/
|
|
59
|
-
create(opts?: CreateWalletOptions): Promise<Wallet>;
|
|
60
|
-
/**
|
|
61
|
-
* Retrieve a previously-created wallet by name.
|
|
62
|
-
* Loads from disk if not in memory. Throws if not found.
|
|
63
|
-
*/
|
|
64
|
-
get(name: string): Wallet;
|
|
65
|
-
/** List all persisted wallets. */
|
|
66
|
-
list(): Wallet[];
|
|
67
|
-
/** @internal Clear in-memory cache and reset wallets dir. For testing only. */
|
|
68
|
-
_reset(): void;
|
|
69
|
-
};
|
|
70
|
-
|
|
71
1
|
type Stack = "python" | "node";
|
|
72
2
|
type Size = "small" | "med" | "large";
|
|
3
|
+
/** Any object with a fetch method — pocket-money Wallet, custom wrapper, etc. */
|
|
4
|
+
interface ComputeWallet {
|
|
5
|
+
fetch(input: string | URL | Request, init?: RequestInit): Promise<Response>;
|
|
6
|
+
}
|
|
73
7
|
interface ComputeRequest {
|
|
74
8
|
/** The code to execute */
|
|
75
9
|
code: string;
|
|
76
10
|
/** Runtime stack: 'python' (3.14) or 'node' (24 LTS) */
|
|
77
11
|
stack: Stack;
|
|
78
|
-
/** The wallet to pay from */
|
|
79
|
-
wallet:
|
|
12
|
+
/** The wallet to pay from — any object with a fetch() method */
|
|
13
|
+
wallet: ComputeWallet;
|
|
80
14
|
/** Sandbox size. Default: 'small' */
|
|
81
15
|
size?: Size;
|
|
82
16
|
/** Execution timeout in seconds. Default: per-size default */
|
|
@@ -114,6 +48,7 @@ declare const compute: {
|
|
|
114
48
|
setEndpoint(url: string): void;
|
|
115
49
|
};
|
|
116
50
|
|
|
51
|
+
type Network = "base" | "base-sepolia";
|
|
117
52
|
/** A single accepted payment option from a 402 response. */
|
|
118
53
|
interface PaymentOption {
|
|
119
54
|
scheme: string;
|
|
@@ -230,4 +165,4 @@ declare const x402: {
|
|
|
230
165
|
formatPrice: typeof formatPrice;
|
|
231
166
|
};
|
|
232
167
|
|
|
233
|
-
export { type BazaarService, type ComputeRequest, type ComputeResponse, type
|
|
168
|
+
export { type BazaarService, type ComputeRequest, type ComputeResponse, type ComputeWallet, type DiscoverOptions, type DiscoverResult, type FormatPriceOptions, type Network, type PaymentOption, type PaymentRequiredResponse, type PricingTier, type ProbeOptions, type ProbeResult, type Size, type Stack, compute, x402 };
|
package/dist/index.js
CHANGED
|
@@ -20,260 +20,11 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
20
20
|
// src/index.ts
|
|
21
21
|
var index_exports = {};
|
|
22
22
|
__export(index_exports, {
|
|
23
|
-
Wallet: () => Wallet,
|
|
24
23
|
compute: () => compute,
|
|
25
|
-
wallet: () => wallet,
|
|
26
24
|
x402: () => x402
|
|
27
25
|
});
|
|
28
26
|
module.exports = __toCommonJS(index_exports);
|
|
29
27
|
|
|
30
|
-
// src/wallet/index.ts
|
|
31
|
-
var import_node_path2 = require("path");
|
|
32
|
-
|
|
33
|
-
// src/wallet/keypair.ts
|
|
34
|
-
var import_accounts = require("viem/accounts");
|
|
35
|
-
function createKeypair() {
|
|
36
|
-
const privateKey = (0, import_accounts.generatePrivateKey)();
|
|
37
|
-
const account = (0, import_accounts.privateKeyToAccount)(privateKey);
|
|
38
|
-
return { privateKey, account };
|
|
39
|
-
}
|
|
40
|
-
function loadKeypair(privateKey) {
|
|
41
|
-
const account = (0, import_accounts.privateKeyToAccount)(privateKey);
|
|
42
|
-
return { account };
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
// src/wallet/storage.ts
|
|
46
|
-
var import_node_fs = require("fs");
|
|
47
|
-
var import_node_path = require("path");
|
|
48
|
-
var VALID_NAME = /^[a-z0-9_-]+$/;
|
|
49
|
-
function validateWalletName(name) {
|
|
50
|
-
if (!VALID_NAME.test(name)) {
|
|
51
|
-
throw new Error(`Invalid wallet name "${name}". Use lowercase letters, numbers, hyphens, and underscores only.`);
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
function readWalletFile(path) {
|
|
55
|
-
if (!(0, import_node_fs.existsSync)(path)) return null;
|
|
56
|
-
const raw = (0, import_node_fs.readFileSync)(path, "utf-8");
|
|
57
|
-
return JSON.parse(raw);
|
|
58
|
-
}
|
|
59
|
-
function writeWalletFile(path, data) {
|
|
60
|
-
(0, import_node_fs.mkdirSync)((0, import_node_path.dirname)(path), { recursive: true });
|
|
61
|
-
(0, import_node_fs.writeFileSync)(path, JSON.stringify(data, null, 2) + "\n", {
|
|
62
|
-
mode: 384
|
|
63
|
-
});
|
|
64
|
-
}
|
|
65
|
-
function listWalletFiles(dir) {
|
|
66
|
-
const resolved = (0, import_node_path.resolve)(dir);
|
|
67
|
-
if (!(0, import_node_fs.existsSync)(resolved)) return [];
|
|
68
|
-
return (0, import_node_fs.readdirSync)(resolved).filter((f) => f.endsWith(".json")).map((f) => f.replace(/\.json$/, ""));
|
|
69
|
-
}
|
|
70
|
-
function migrateLegacyWallet(walletsDir) {
|
|
71
|
-
const legacyPath = (0, import_node_path.resolve)(walletsDir, "..", "wallet.json");
|
|
72
|
-
const newPath = (0, import_node_path.join)((0, import_node_path.resolve)(walletsDir), "default.json");
|
|
73
|
-
if ((0, import_node_fs.existsSync)(legacyPath) && !(0, import_node_fs.existsSync)(newPath)) {
|
|
74
|
-
const data = readWalletFile(legacyPath);
|
|
75
|
-
if (data) {
|
|
76
|
-
(0, import_node_fs.mkdirSync)((0, import_node_path.resolve)(walletsDir), { recursive: true });
|
|
77
|
-
(0, import_node_fs.copyFileSync)(legacyPath, newPath);
|
|
78
|
-
return data;
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
return null;
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
// src/x402/payment-fetch.ts
|
|
85
|
-
var import_client = require("@x402/core/client");
|
|
86
|
-
var import_client2 = require("@x402/evm/exact/client");
|
|
87
|
-
var import_evm = require("@x402/evm");
|
|
88
|
-
var import_fetch = require("@x402/fetch");
|
|
89
|
-
var import_accounts2 = require("viem/accounts");
|
|
90
|
-
var import_viem = require("viem");
|
|
91
|
-
var import_chains = require("viem/chains");
|
|
92
|
-
function createPaymentFetch(privateKey, network = "base", rpcUrl) {
|
|
93
|
-
const account = (0, import_accounts2.privateKeyToAccount)(privateKey);
|
|
94
|
-
const chain = network === "base" ? import_chains.base : import_chains.baseSepolia;
|
|
95
|
-
const publicClient = (0, import_viem.createPublicClient)({
|
|
96
|
-
chain,
|
|
97
|
-
transport: (0, import_viem.http)(rpcUrl)
|
|
98
|
-
});
|
|
99
|
-
const signer = (0, import_evm.toClientEvmSigner)(account, publicClient);
|
|
100
|
-
const client = new import_client.x402Client();
|
|
101
|
-
(0, import_client2.registerExactEvmScheme)(client, { signer });
|
|
102
|
-
return (0, import_fetch.wrapFetchWithPayment)(fetch, client);
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
// src/wallet/types.ts
|
|
106
|
-
var NETWORK_CONFIG = {
|
|
107
|
-
base: {
|
|
108
|
-
chainId: 8453,
|
|
109
|
-
usdcAddress: "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
|
|
110
|
-
rpcUrl: "https://mainnet.base.org"
|
|
111
|
-
},
|
|
112
|
-
"base-sepolia": {
|
|
113
|
-
chainId: 84532,
|
|
114
|
-
usdcAddress: "0x036CbD53842c5426634e7929541eC2318f3dCF7e",
|
|
115
|
-
rpcUrl: "https://sepolia.base.org"
|
|
116
|
-
}
|
|
117
|
-
};
|
|
118
|
-
|
|
119
|
-
// src/wallet/balance.ts
|
|
120
|
-
async function getUsdcBalance(address, network, rpcUrl) {
|
|
121
|
-
const config = NETWORK_CONFIG[network];
|
|
122
|
-
const url = rpcUrl ?? config.rpcUrl;
|
|
123
|
-
const paddedAddress = address.slice(2).toLowerCase().padStart(64, "0");
|
|
124
|
-
const data = `0x70a08231${paddedAddress}`;
|
|
125
|
-
const res = await fetch(url, {
|
|
126
|
-
method: "POST",
|
|
127
|
-
headers: { "Content-Type": "application/json" },
|
|
128
|
-
body: JSON.stringify({
|
|
129
|
-
jsonrpc: "2.0",
|
|
130
|
-
id: 1,
|
|
131
|
-
method: "eth_call",
|
|
132
|
-
params: [{ to: config.usdcAddress, data }, "latest"]
|
|
133
|
-
})
|
|
134
|
-
});
|
|
135
|
-
const json = await res.json();
|
|
136
|
-
if (json.error) {
|
|
137
|
-
throw new Error(`RPC error: ${JSON.stringify(json.error)}`);
|
|
138
|
-
}
|
|
139
|
-
return BigInt(json.result ?? "0x0");
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
// src/wallet/wallet.ts
|
|
143
|
-
var Wallet = class {
|
|
144
|
-
name;
|
|
145
|
-
address;
|
|
146
|
-
network;
|
|
147
|
-
_account;
|
|
148
|
-
_privateKey;
|
|
149
|
-
_rpcUrl;
|
|
150
|
-
_paymentFetch;
|
|
151
|
-
constructor(params) {
|
|
152
|
-
this.name = params.name;
|
|
153
|
-
this._account = params.account;
|
|
154
|
-
this._privateKey = params.privateKey;
|
|
155
|
-
this.address = params.account.address;
|
|
156
|
-
this.network = params.network;
|
|
157
|
-
this._rpcUrl = params.rpcUrl;
|
|
158
|
-
this._paymentFetch = params.paymentFetch;
|
|
159
|
-
}
|
|
160
|
-
/** Check USDC balance on Base. Returns balance in minor units (6 decimals). */
|
|
161
|
-
async checkBalance() {
|
|
162
|
-
return getUsdcBalance(this._account.address, this.network, this._rpcUrl);
|
|
163
|
-
}
|
|
164
|
-
/**
|
|
165
|
-
* Poll until USDC balance >= minAmount.
|
|
166
|
-
* @param minAmount - minimum USDC balance in minor units (6 decimals)
|
|
167
|
-
*/
|
|
168
|
-
async waitForFunding(minAmount, opts) {
|
|
169
|
-
const interval = opts?.pollInterval ?? 1e4;
|
|
170
|
-
const deadline = opts?.timeout ? Date.now() + opts.timeout : null;
|
|
171
|
-
while (true) {
|
|
172
|
-
const balance = await getUsdcBalance(this._account.address, this.network, this._rpcUrl);
|
|
173
|
-
if (balance >= minAmount) return;
|
|
174
|
-
if (deadline && Date.now() >= deadline) {
|
|
175
|
-
throw new Error(`Funding timeout: balance ${balance} < required ${minAmount}`);
|
|
176
|
-
}
|
|
177
|
-
await new Promise((r) => setTimeout(r, interval));
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
/**
|
|
181
|
-
* Drop-in `fetch()` replacement that handles x402 payments automatically.
|
|
182
|
-
* If the server returns 402, the library signs an EIP-3009 authorization
|
|
183
|
-
* and retries the request with payment headers.
|
|
184
|
-
*/
|
|
185
|
-
async fetch(input, init) {
|
|
186
|
-
return this._paymentFetch(input, init);
|
|
187
|
-
}
|
|
188
|
-
};
|
|
189
|
-
|
|
190
|
-
// src/wallet/index.ts
|
|
191
|
-
var DEFAULT_WALLETS_DIR = ".auteng/wallets";
|
|
192
|
-
var _wallets = /* @__PURE__ */ new Map();
|
|
193
|
-
var _walletsDir = (0, import_node_path2.resolve)(DEFAULT_WALLETS_DIR);
|
|
194
|
-
var wallet = {
|
|
195
|
-
/**
|
|
196
|
-
* Create a new named wallet or load an existing one from disk.
|
|
197
|
-
* Idempotent: if a wallet with this name already exists, returns it.
|
|
198
|
-
*/
|
|
199
|
-
async create(opts) {
|
|
200
|
-
const name = opts?.name ?? "default";
|
|
201
|
-
validateWalletName(name);
|
|
202
|
-
if (_wallets.has(name)) return _wallets.get(name);
|
|
203
|
-
const dir = (0, import_node_path2.resolve)(opts?.walletsDir ?? DEFAULT_WALLETS_DIR);
|
|
204
|
-
_walletsDir = dir;
|
|
205
|
-
const filePath = (0, import_node_path2.join)(dir, `${name}.json`);
|
|
206
|
-
const network = opts?.network ?? "base";
|
|
207
|
-
const rpcUrl = opts?.rpcUrl;
|
|
208
|
-
let existing = readWalletFile(filePath);
|
|
209
|
-
if (!existing && name === "default") {
|
|
210
|
-
existing = migrateLegacyWallet(dir);
|
|
211
|
-
}
|
|
212
|
-
let privateKey;
|
|
213
|
-
let account;
|
|
214
|
-
if (existing) {
|
|
215
|
-
privateKey = existing.privateKey;
|
|
216
|
-
account = loadKeypair(existing.privateKey).account;
|
|
217
|
-
} else {
|
|
218
|
-
const kp = createKeypair();
|
|
219
|
-
privateKey = kp.privateKey;
|
|
220
|
-
account = kp.account;
|
|
221
|
-
writeWalletFile(filePath, {
|
|
222
|
-
privateKey,
|
|
223
|
-
address: account.address,
|
|
224
|
-
network
|
|
225
|
-
});
|
|
226
|
-
}
|
|
227
|
-
const effectiveNetwork = existing?.network ?? network;
|
|
228
|
-
const paymentFetch = createPaymentFetch(privateKey, effectiveNetwork, rpcUrl);
|
|
229
|
-
const w = new Wallet({
|
|
230
|
-
name,
|
|
231
|
-
account,
|
|
232
|
-
privateKey,
|
|
233
|
-
network: effectiveNetwork,
|
|
234
|
-
rpcUrl,
|
|
235
|
-
paymentFetch
|
|
236
|
-
});
|
|
237
|
-
_wallets.set(name, w);
|
|
238
|
-
return w;
|
|
239
|
-
},
|
|
240
|
-
/**
|
|
241
|
-
* Retrieve a previously-created wallet by name.
|
|
242
|
-
* Loads from disk if not in memory. Throws if not found.
|
|
243
|
-
*/
|
|
244
|
-
get(name) {
|
|
245
|
-
validateWalletName(name);
|
|
246
|
-
if (_wallets.has(name)) return _wallets.get(name);
|
|
247
|
-
const filePath = (0, import_node_path2.join)(_walletsDir, `${name}.json`);
|
|
248
|
-
const data = readWalletFile(filePath);
|
|
249
|
-
if (!data) throw new Error(`Wallet "${name}" not found`);
|
|
250
|
-
const { account } = loadKeypair(data.privateKey);
|
|
251
|
-
const paymentFetch = createPaymentFetch(data.privateKey, data.network);
|
|
252
|
-
const w = new Wallet({
|
|
253
|
-
name,
|
|
254
|
-
account,
|
|
255
|
-
privateKey: data.privateKey,
|
|
256
|
-
network: data.network,
|
|
257
|
-
paymentFetch
|
|
258
|
-
});
|
|
259
|
-
_wallets.set(name, w);
|
|
260
|
-
return w;
|
|
261
|
-
},
|
|
262
|
-
/** List all persisted wallets. */
|
|
263
|
-
list() {
|
|
264
|
-
const names = listWalletFiles(_walletsDir);
|
|
265
|
-
return names.map((n) => {
|
|
266
|
-
if (_wallets.has(n)) return _wallets.get(n);
|
|
267
|
-
return wallet.get(n);
|
|
268
|
-
});
|
|
269
|
-
},
|
|
270
|
-
/** @internal Clear in-memory cache and reset wallets dir. For testing only. */
|
|
271
|
-
_reset() {
|
|
272
|
-
_wallets.clear();
|
|
273
|
-
_walletsDir = (0, import_node_path2.resolve)(DEFAULT_WALLETS_DIR);
|
|
274
|
-
}
|
|
275
|
-
};
|
|
276
|
-
|
|
277
28
|
// src/compute/index.ts
|
|
278
29
|
var DEFAULT_ENDPOINT = "https://x402.auteng.ai/api/x402/compute";
|
|
279
30
|
var _endpoint = DEFAULT_ENDPOINT;
|
|
@@ -351,6 +102,15 @@ var compute = {
|
|
|
351
102
|
}
|
|
352
103
|
};
|
|
353
104
|
|
|
105
|
+
// src/x402/payment-fetch.ts
|
|
106
|
+
var import_client = require("@x402/core/client");
|
|
107
|
+
var import_client2 = require("@x402/evm/exact/client");
|
|
108
|
+
var import_evm = require("@x402/evm");
|
|
109
|
+
var import_fetch = require("@x402/fetch");
|
|
110
|
+
var import_accounts = require("viem/accounts");
|
|
111
|
+
var import_viem = require("viem");
|
|
112
|
+
var import_chains = require("viem/chains");
|
|
113
|
+
|
|
354
114
|
// src/x402/format.ts
|
|
355
115
|
var KNOWN_ASSETS = {
|
|
356
116
|
// USDC on Base mainnet
|
|
@@ -361,7 +121,7 @@ var KNOWN_ASSETS = {
|
|
|
361
121
|
var NETWORK_NAMES = {
|
|
362
122
|
"eip155:8453": "Base",
|
|
363
123
|
"eip155:84532": "Base Sepolia",
|
|
364
|
-
|
|
124
|
+
base: "Base",
|
|
365
125
|
"base-sepolia": "Base Sepolia"
|
|
366
126
|
};
|
|
367
127
|
function formatPrice(amount, asset, network, options) {
|
|
@@ -430,10 +190,12 @@ function normalizePaymentRequired(raw) {
|
|
|
430
190
|
description: firstAccept.description ?? raw.resource?.description,
|
|
431
191
|
mimeType: firstAccept.mimeType ?? raw.resource?.mimeType
|
|
432
192
|
},
|
|
433
|
-
accepts: raw.accepts.map(
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
193
|
+
accepts: raw.accepts.map(
|
|
194
|
+
(a) => normalizeAccept({
|
|
195
|
+
...a,
|
|
196
|
+
amount: a.maxAmountRequired
|
|
197
|
+
})
|
|
198
|
+
),
|
|
437
199
|
extensions: raw.extensions ?? void 0
|
|
438
200
|
};
|
|
439
201
|
}
|
|
@@ -491,9 +253,7 @@ function normalizeBazaarItem(item) {
|
|
|
491
253
|
extra: accept.extra ?? void 0
|
|
492
254
|
};
|
|
493
255
|
});
|
|
494
|
-
const cheapest = normalizedAccepts.reduce(
|
|
495
|
-
(min, a) => BigInt(a.amount) < BigInt(min.amount) ? a : min
|
|
496
|
-
);
|
|
256
|
+
const cheapest = normalizedAccepts.reduce((min, a) => BigInt(a.amount) < BigInt(min.amount) ? a : min);
|
|
497
257
|
const price = formatPrice(cheapest.amount, cheapest.asset, cheapest.network);
|
|
498
258
|
const firstAccept = accepts[0];
|
|
499
259
|
const description = item.description ?? item.resource?.description ?? firstAccept?.description ?? item.metadata?.description ?? null;
|
|
@@ -515,9 +275,7 @@ var x402 = {
|
|
|
515
275
|
};
|
|
516
276
|
// Annotate the CommonJS export names for ESM import in node:
|
|
517
277
|
0 && (module.exports = {
|
|
518
|
-
Wallet,
|
|
519
278
|
compute,
|
|
520
|
-
wallet,
|
|
521
279
|
x402
|
|
522
280
|
});
|
|
523
281
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/wallet/index.ts","../src/wallet/keypair.ts","../src/wallet/storage.ts","../src/x402/payment-fetch.ts","../src/wallet/types.ts","../src/wallet/balance.ts","../src/wallet/wallet.ts","../src/compute/index.ts","../src/x402/format.ts","../src/x402/probe.ts","../src/x402/discover.ts","../src/x402/index.ts"],"sourcesContent":["export { wallet } from \"./wallet/index.js\"\nexport { Wallet } from \"./wallet/wallet.js\"\nexport { compute } from \"./compute/index.js\"\nexport { x402 } from \"./x402/index.js\"\n\nexport type { CreateWalletOptions, WalletConfig, WaitForFundingOptions, Network } from \"./wallet/types.js\"\nexport type { ComputeRequest, ComputeResponse, PricingTier, Stack, Size } from \"./compute/types.js\"\nexport type {\n ProbeResult,\n ProbeOptions,\n PaymentRequiredResponse,\n PaymentOption,\n BazaarService,\n DiscoverResult,\n DiscoverOptions,\n FormatPriceOptions,\n} from \"./x402/types.js\"\n","import { join, resolve } from \"node:path\"\nimport { createKeypair, loadKeypair } from \"./keypair.js\"\nimport { readWalletFile, writeWalletFile, listWalletFiles, migrateLegacyWallet, validateWalletName } from \"./storage.js\"\nimport { createPaymentFetch } from \"../x402/payment-fetch.js\"\nimport { Wallet } from \"./wallet.js\"\nimport type { CreateWalletOptions } from \"./types.js\"\n\nconst DEFAULT_WALLETS_DIR = \".auteng/wallets\"\n\nconst _wallets = new Map<string, Wallet>()\nlet _walletsDir = resolve(DEFAULT_WALLETS_DIR)\n\nexport const wallet = {\n /**\n * Create a new named wallet or load an existing one from disk.\n * Idempotent: if a wallet with this name already exists, returns it.\n */\n async create(opts?: CreateWalletOptions): Promise<Wallet> {\n const name = opts?.name ?? \"default\"\n validateWalletName(name)\n\n if (_wallets.has(name)) return _wallets.get(name)!\n\n const dir = resolve(opts?.walletsDir ?? DEFAULT_WALLETS_DIR)\n _walletsDir = dir\n const filePath = join(dir, `${name}.json`)\n const network = opts?.network ?? \"base\"\n const rpcUrl = opts?.rpcUrl\n\n let existing = readWalletFile(filePath)\n\n if (!existing && name === \"default\") {\n existing = migrateLegacyWallet(dir)\n }\n\n let privateKey: `0x${string}`\n let account: ReturnType<typeof loadKeypair>[\"account\"]\n\n if (existing) {\n privateKey = existing.privateKey\n account = loadKeypair(existing.privateKey).account\n } else {\n const kp = createKeypair()\n privateKey = kp.privateKey\n account = kp.account\n writeWalletFile(filePath, {\n privateKey,\n address: account.address,\n network,\n })\n }\n\n const effectiveNetwork = existing?.network ?? network\n const paymentFetch = createPaymentFetch(privateKey, effectiveNetwork, rpcUrl)\n const w = new Wallet({\n name,\n account,\n privateKey,\n network: effectiveNetwork,\n rpcUrl,\n paymentFetch,\n })\n _wallets.set(name, w)\n return w\n },\n\n /**\n * Retrieve a previously-created wallet by name.\n * Loads from disk if not in memory. Throws if not found.\n */\n get(name: string): Wallet {\n validateWalletName(name)\n\n if (_wallets.has(name)) return _wallets.get(name)!\n\n const filePath = join(_walletsDir, `${name}.json`)\n const data = readWalletFile(filePath)\n if (!data) throw new Error(`Wallet \"${name}\" not found`)\n\n const { account } = loadKeypair(data.privateKey)\n const paymentFetch = createPaymentFetch(data.privateKey, data.network)\n const w = new Wallet({\n name,\n account,\n privateKey: data.privateKey,\n network: data.network,\n paymentFetch,\n })\n _wallets.set(name, w)\n return w\n },\n\n /** List all persisted wallets. */\n list(): Wallet[] {\n const names = listWalletFiles(_walletsDir)\n return names.map((n) => {\n if (_wallets.has(n)) return _wallets.get(n)!\n return wallet.get(n)\n })\n },\n\n /** @internal Clear in-memory cache and reset wallets dir. For testing only. */\n _reset(): void {\n _wallets.clear()\n _walletsDir = resolve(DEFAULT_WALLETS_DIR)\n },\n}\n","import { generatePrivateKey, privateKeyToAccount } from \"viem/accounts\"\nimport type { PrivateKeyAccount } from \"viem\"\n\nexport function createKeypair(): {\n privateKey: `0x${string}`\n account: PrivateKeyAccount\n} {\n const privateKey = generatePrivateKey()\n const account = privateKeyToAccount(privateKey)\n return { privateKey, account }\n}\n\nexport function loadKeypair(privateKey: `0x${string}`): {\n account: PrivateKeyAccount\n} {\n const account = privateKeyToAccount(privateKey)\n return { account }\n}\n","import { mkdirSync, readFileSync, writeFileSync, existsSync, readdirSync, copyFileSync } from \"node:fs\"\nimport { dirname, join, resolve } from \"node:path\"\nimport type { WalletFile } from \"./types.js\"\n\nconst VALID_NAME = /^[a-z0-9_-]+$/\n\nexport function validateWalletName(name: string): void {\n if (!VALID_NAME.test(name)) {\n throw new Error(`Invalid wallet name \"${name}\". Use lowercase letters, numbers, hyphens, and underscores only.`)\n }\n}\n\nexport function readWalletFile(path: string): WalletFile | null {\n if (!existsSync(path)) return null\n const raw = readFileSync(path, \"utf-8\")\n return JSON.parse(raw) as WalletFile\n}\n\nexport function writeWalletFile(path: string, data: WalletFile): void {\n mkdirSync(dirname(path), { recursive: true })\n writeFileSync(path, JSON.stringify(data, null, 2) + \"\\n\", {\n mode: 0o600,\n })\n}\n\nexport function listWalletFiles(dir: string): string[] {\n const resolved = resolve(dir)\n if (!existsSync(resolved)) return []\n return readdirSync(resolved)\n .filter((f) => f.endsWith(\".json\"))\n .map((f) => f.replace(/\\.json$/, \"\"))\n}\n\nexport function migrateLegacyWallet(walletsDir: string): WalletFile | null {\n const legacyPath = resolve(walletsDir, \"..\", \"wallet.json\")\n const newPath = join(resolve(walletsDir), \"default.json\")\n if (existsSync(legacyPath) && !existsSync(newPath)) {\n const data = readWalletFile(legacyPath)\n if (data) {\n mkdirSync(resolve(walletsDir), { recursive: true })\n copyFileSync(legacyPath, newPath)\n return data\n }\n }\n return null\n}\n","import { x402Client } from \"@x402/core/client\"\nimport { registerExactEvmScheme } from \"@x402/evm/exact/client\"\nimport { toClientEvmSigner } from \"@x402/evm\"\nimport { wrapFetchWithPayment } from \"@x402/fetch\"\nimport { privateKeyToAccount } from \"viem/accounts\"\nimport { createPublicClient, http } from \"viem\"\nimport { base, baseSepolia } from \"viem/chains\"\nimport type { Network } from \"../wallet/types.js\"\n\n/**\n * Create a fetch function that automatically handles x402 payments.\n * When the server returns 402, the SDK signs an EIP-3009 authorization\n * using the provided private key and retries with payment headers.\n */\nexport function createPaymentFetch(\n privateKey: `0x${string}`,\n network: Network = \"base\",\n rpcUrl?: string\n): typeof globalThis.fetch {\n const account = privateKeyToAccount(privateKey)\n const chain = network === \"base\" ? base : baseSepolia\n const publicClient = createPublicClient({\n chain,\n transport: http(rpcUrl),\n })\n const signer = toClientEvmSigner(account, publicClient)\n\n const client = new x402Client()\n registerExactEvmScheme(client, { signer })\n return wrapFetchWithPayment(fetch, client)\n}\n","export type Network = \"base\" | \"base-sepolia\"\n\nexport interface CreateWalletOptions {\n /** Wallet identifier. Default: \"default\" */\n name?: string\n /** Network to use. Default: `base` */\n network?: Network\n /** Custom RPC endpoint. Default: public Base RPC */\n rpcUrl?: string\n /** Base directory for wallet storage. Default: \".auteng/wallets\" */\n walletsDir?: string\n}\n\n/** @deprecated Use CreateWalletOptions instead */\nexport type WalletConfig = CreateWalletOptions\n\nexport interface WalletFile {\n privateKey: `0x${string}`\n address: `0x${string}`\n network: Network\n}\n\nexport interface WaitForFundingOptions {\n /** Poll interval in milliseconds. Default: 10000 (10s) */\n pollInterval?: number\n /** Timeout in milliseconds. Default: none (waits forever) */\n timeout?: number\n}\n\nexport const NETWORK_CONFIG: Record<Network, { chainId: number; usdcAddress: `0x${string}`; rpcUrl: string }> = {\n base: {\n chainId: 8453,\n usdcAddress: \"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\",\n rpcUrl: \"https://mainnet.base.org\",\n },\n \"base-sepolia\": {\n chainId: 84532,\n usdcAddress: \"0x036CbD53842c5426634e7929541eC2318f3dCF7e\",\n rpcUrl: \"https://sepolia.base.org\",\n },\n}\n","import type { Network } from \"./types.js\"\nimport { NETWORK_CONFIG } from \"./types.js\"\n\n/**\n * Read USDC balance for `address` via a direct `eth_call` to the USDC\n * contract's `balanceOf(address)` function. No viem client needed — just\n * a plain JSON-RPC POST.\n */\nexport async function getUsdcBalance(address: `0x${string}`, network: Network, rpcUrl?: string): Promise<bigint> {\n const config = NETWORK_CONFIG[network]\n const url = rpcUrl ?? config.rpcUrl\n\n // balanceOf(address) selector = 0x70a08231\n const paddedAddress = address.slice(2).toLowerCase().padStart(64, \"0\")\n const data = `0x70a08231${paddedAddress}`\n\n const res = await fetch(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n jsonrpc: \"2.0\",\n id: 1,\n method: \"eth_call\",\n params: [{ to: config.usdcAddress, data }, \"latest\"],\n }),\n })\n\n const json = (await res.json()) as { result?: string; error?: unknown }\n if (json.error) {\n throw new Error(`RPC error: ${JSON.stringify(json.error)}`)\n }\n return BigInt(json.result ?? \"0x0\")\n}\n","import type { PrivateKeyAccount } from \"viem\"\nimport { getUsdcBalance } from \"./balance.js\"\nimport type { Network, WaitForFundingOptions } from \"./types.js\"\n\nexport class Wallet {\n readonly name: string\n readonly address: `0x${string}`\n readonly network: Network\n\n private _account: PrivateKeyAccount\n private _privateKey: `0x${string}`\n private _rpcUrl: string | undefined\n private _paymentFetch: typeof globalThis.fetch\n\n constructor(params: {\n name: string\n account: PrivateKeyAccount\n privateKey: `0x${string}`\n network: Network\n rpcUrl?: string\n paymentFetch: typeof globalThis.fetch\n }) {\n this.name = params.name\n this._account = params.account\n this._privateKey = params.privateKey\n this.address = params.account.address\n this.network = params.network\n this._rpcUrl = params.rpcUrl\n this._paymentFetch = params.paymentFetch\n }\n\n /** Check USDC balance on Base. Returns balance in minor units (6 decimals). */\n async checkBalance(): Promise<bigint> {\n return getUsdcBalance(this._account.address, this.network, this._rpcUrl)\n }\n\n /**\n * Poll until USDC balance >= minAmount.\n * @param minAmount - minimum USDC balance in minor units (6 decimals)\n */\n async waitForFunding(minAmount: bigint, opts?: WaitForFundingOptions): Promise<void> {\n const interval = opts?.pollInterval ?? 10_000\n const deadline = opts?.timeout ? Date.now() + opts.timeout : null\n\n while (true) {\n const balance = await getUsdcBalance(this._account.address, this.network, this._rpcUrl)\n if (balance >= minAmount) return\n\n if (deadline && Date.now() >= deadline) {\n throw new Error(`Funding timeout: balance ${balance} < required ${minAmount}`)\n }\n\n await new Promise((r) => setTimeout(r, interval))\n }\n }\n\n /**\n * Drop-in `fetch()` replacement that handles x402 payments automatically.\n * If the server returns 402, the library signs an EIP-3009 authorization\n * and retries the request with payment headers.\n */\n async fetch(input: string | URL | Request, init?: RequestInit): Promise<Response> {\n return this._paymentFetch(input, init)\n }\n}\n","import type { ComputeRequest, ComputeResponse, PricingTier, Size } from \"./types.js\"\n\nconst DEFAULT_ENDPOINT = \"https://x402.auteng.ai/api/x402/compute\"\n\nlet _endpoint = DEFAULT_ENDPOINT\n\nconst PRICING: Record<Size, PricingTier> = {\n small: {\n vcpu: 2,\n ram_gb: 1,\n default_timeout_s: 30,\n max_timeout_s: 300,\n base_price_usd: 0.002,\n per_second_usd: 0.00005,\n },\n med: {\n vcpu: 4,\n ram_gb: 4,\n default_timeout_s: 60,\n max_timeout_s: 600,\n base_price_usd: 0.008,\n per_second_usd: 0.00012,\n },\n large: {\n vcpu: 8,\n ram_gb: 16,\n default_timeout_s: 120,\n max_timeout_s: 3600,\n base_price_usd: 0.03,\n per_second_usd: 0.00025,\n },\n}\n\nexport const compute = {\n /**\n * Execute sandboxed code via AutEng's x402 compute endpoint.\n * Payment is handled automatically via the wallet's x402 layer.\n */\n async run(request: ComputeRequest): Promise<ComputeResponse> {\n if (!request.code) {\n throw new Error(\"compute.run: 'code' is required\")\n }\n if (!request.stack) {\n throw new Error(\"compute.run: 'stack' is required\")\n }\n\n const body = {\n code: request.code,\n stack: request.stack,\n size: request.size ?? \"small\",\n ...(request.timeout_seconds != null && {\n timeout_seconds: request.timeout_seconds,\n }),\n ...(request.files != null && { files: request.files }),\n }\n\n if (!request.wallet) {\n throw new Error(\"compute.run: 'wallet' is required\")\n }\n\n const response = await request.wallet.fetch(_endpoint, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n })\n\n if (!response.ok) {\n const text = await response.text().catch(() => \"\")\n throw new Error(`Compute request failed (${response.status}): ${text}`)\n }\n\n return (await response.json()) as ComputeResponse\n },\n\n /** Returns the pricing table for all compute sizes. */\n pricing(): Record<Size, PricingTier> {\n return { ...PRICING }\n },\n\n /**\n * Override the compute endpoint URL.\n * Default: https://x402.auteng.ai/api/x402/compute\n */\n setEndpoint(url: string): void {\n _endpoint = url\n },\n}\n","import type { FormatPriceOptions } from \"./types.js\"\n\nconst KNOWN_ASSETS: Record<string, { symbol: string; decimals: number; prefix: string }> = {\n // USDC on Base mainnet\n \"0x833589fcd6edb6e08f4c7c32d4f71b54bda02913\": { symbol: \"USDC\", decimals: 6, prefix: \"$\" },\n // USDC on Base Sepolia\n \"0x036cbd53842c5426634e7929541ec2318f3dcf7e\": { symbol: \"USDC\", decimals: 6, prefix: \"$\" },\n}\n\nconst NETWORK_NAMES: Record<string, string> = {\n \"eip155:8453\": \"Base\",\n \"eip155:84532\": \"Base Sepolia\",\n \"base\": \"Base\",\n \"base-sepolia\": \"Base Sepolia\",\n}\n\n/**\n * Format a raw x402 price into a human-readable string.\n *\n * Knows about common assets (USDC on Base = 6 decimals, $-prefixed)\n * and falls back to raw display for unknown assets.\n *\n * @example\n * formatPrice(\"2000\", \"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\", \"eip155:8453\")\n * // → \"$0.002 USDC on Base\"\n */\nexport function formatPrice(\n amount: string,\n asset: string,\n network: string,\n options?: FormatPriceOptions,\n): string {\n const known = KNOWN_ASSETS[asset.toLowerCase()]\n const networkName = NETWORK_NAMES[network]\n\n if (known) {\n const value = Number(amount) / 10 ** known.decimals\n const formatted = `${known.prefix}${value} ${known.symbol}`\n if (options?.short || !networkName) return formatted\n return `${formatted} on ${networkName}`\n }\n\n // Unknown asset — show raw\n const shortAsset = `${asset.slice(0, 6)}...${asset.slice(-4)}`\n const raw = `${amount} ${shortAsset}`\n if (options?.short || !networkName) return raw\n return `${raw} on ${networkName}`\n}\n","import type { ProbeResult, ProbeOptions, PaymentRequiredResponse, PaymentOption } from \"./types.js\"\nimport { formatPrice } from \"./format.js\"\n\n/**\n * Check if a URL is x402-enabled and see what it costs, without paying.\n *\n * Sends a request to the URL. If the server returns 402 Payment Required,\n * parses the payment requirements and returns a structured result with\n * human-readable pricing. Non-402 responses return `{ enabled: false }`.\n *\n * No wallet needed — this is a read-only inspection.\n */\nexport async function probe(url: string, options?: ProbeOptions): Promise<ProbeResult> {\n const res = await fetch(url, {\n method: options?.method ?? \"GET\",\n headers: options?.headers,\n body: options?.body,\n signal: options?.signal,\n })\n\n if (res.status !== 402) {\n return { enabled: false, url, status: res.status, price: null, paymentRequired: null }\n }\n\n let raw: unknown\n try {\n raw = await res.json()\n } catch {\n return { enabled: false, url, status: 402, price: null, paymentRequired: null }\n }\n\n const paymentRequired = normalizePaymentRequired(raw)\n if (!paymentRequired || paymentRequired.accepts.length === 0) {\n return { enabled: false, url, status: 402, price: null, paymentRequired: null }\n }\n\n const first = paymentRequired.accepts[0]\n const price = formatPrice(first.amount, first.asset, first.network)\n\n return { enabled: true, url, status: 402, price, paymentRequired }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction normalizePaymentRequired(raw: any): PaymentRequiredResponse | null {\n if (!raw || typeof raw !== \"object\" || !Array.isArray(raw.accepts) || raw.accepts.length === 0) {\n return null\n }\n\n const firstAccept = raw.accepts[0]\n\n // Determine if v2 (has top-level resource object and accepts[].amount)\n // or v1 (has accepts[].maxAmountRequired and inline resource/description)\n const isV2 = typeof firstAccept.amount === \"string\" && raw.resource && typeof raw.resource === \"object\"\n\n if (isV2) {\n return {\n x402Version: raw.x402Version ?? 2,\n resource: {\n url: raw.resource.url ?? \"\",\n description: raw.resource.description,\n mimeType: raw.resource.mimeType,\n },\n accepts: raw.accepts.map(normalizeAccept),\n extensions: raw.extensions ?? undefined,\n }\n }\n\n // v1 shape: maxAmountRequired, inline resource/description on each accept\n if (typeof firstAccept.maxAmountRequired === \"string\") {\n return {\n x402Version: raw.x402Version ?? 1,\n resource: {\n url: firstAccept.resource ?? raw.resource?.url ?? \"\",\n description: firstAccept.description ?? raw.resource?.description,\n mimeType: firstAccept.mimeType ?? raw.resource?.mimeType,\n },\n accepts: raw.accepts.map((a: Record<string, unknown>) => normalizeAccept({\n ...a,\n amount: a.maxAmountRequired,\n })),\n extensions: raw.extensions ?? undefined,\n }\n }\n\n return null\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction normalizeAccept(a: any): PaymentOption {\n return {\n scheme: a.scheme ?? \"exact\",\n network: a.network ?? \"\",\n asset: a.asset ?? \"\",\n amount: String(a.amount ?? a.maxAmountRequired ?? \"0\"),\n payTo: a.payTo ?? \"\",\n maxTimeoutSeconds: a.maxTimeoutSeconds ?? 0,\n extra: a.extra ?? undefined,\n }\n}\n","import type { DiscoverResult, DiscoverOptions, BazaarService, PaymentOption } from \"./types.js\"\nimport { formatPrice } from \"./format.js\"\n\nconst DEFAULT_BAZAAR_URL = \"https://api.cdp.coinbase.com/platform/v2/x402/discovery/resources\"\n\n/**\n * Query the Bazaar registry to find available x402 services.\n *\n * Fetches from the Coinbase CDP Bazaar discovery endpoint and returns\n * a normalized list of services with human-readable pricing.\n *\n * No wallet or authentication needed.\n */\nexport async function discover(options?: DiscoverOptions): Promise<DiscoverResult> {\n const baseUrl = options?.bazaarUrl ?? DEFAULT_BAZAAR_URL\n const params = new URLSearchParams()\n if (options?.limit != null) params.set(\"limit\", String(options.limit))\n if (options?.offset != null) params.set(\"offset\", String(options.offset))\n\n const url = params.toString() ? `${baseUrl}?${params}` : baseUrl\n\n const res = await fetch(url, {\n headers: { Accept: \"application/json\" },\n signal: options?.signal,\n })\n\n if (!res.ok) {\n const text = await res.text().catch(() => \"\")\n throw new Error(`Bazaar request failed (${res.status}): ${text}`)\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const json = (await res.json()) as any\n\n // The Bazaar response has an `items` array (or `resources`)\n const items: unknown[] = json.items ?? json.resources ?? []\n\n const services: BazaarService[] = items.map(normalizeBazaarItem).filter(Boolean) as BazaarService[]\n\n return {\n services,\n total: json.total ?? json.totalCount ?? services.length,\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction normalizeBazaarItem(item: any): BazaarService | null {\n if (!item || typeof item !== \"object\") return null\n\n const accepts: unknown[] = item.accepts ?? []\n if (accepts.length === 0) return null\n\n const normalizedAccepts: PaymentOption[] = accepts.map((a: unknown) => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const accept = a as any\n return {\n scheme: accept.scheme ?? \"exact\",\n network: accept.network ?? \"\",\n asset: accept.asset ?? \"\",\n amount: String(accept.amount ?? accept.maxAmountRequired ?? \"0\"),\n payTo: accept.payTo ?? \"\",\n maxTimeoutSeconds: accept.maxTimeoutSeconds ?? 0,\n extra: accept.extra ?? undefined,\n }\n })\n\n // Find cheapest option for display price\n const cheapest = normalizedAccepts.reduce((min, a) =>\n BigInt(a.amount) < BigInt(min.amount) ? a : min\n )\n const price = formatPrice(cheapest.amount, cheapest.asset, cheapest.network)\n\n // Extract description from various possible locations\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const firstAccept = accepts[0] as any\n const description: string | null =\n item.description ??\n item.resource?.description ??\n firstAccept?.description ??\n item.metadata?.description ??\n null\n\n // Extract URL\n const url: string =\n item.url ??\n item.resource?.url ??\n (typeof item.resource === \"string\" ? item.resource : null) ??\n firstAccept?.resource ??\n \"\"\n\n return {\n url,\n description,\n price,\n accepts: normalizedAccepts,\n metadata: item.metadata ?? {},\n }\n}\n","// Internal — used by wallet module\nexport { createPaymentFetch } from \"./payment-fetch.js\"\n\n// Public x402 convenience functions\nimport { probe } from \"./probe.js\"\nimport { discover } from \"./discover.js\"\nimport { formatPrice } from \"./format.js\"\n\nexport const x402 = {\n probe,\n discover,\n formatPrice,\n}\n\nexport type {\n ProbeResult,\n ProbeOptions,\n PaymentRequiredResponse,\n PaymentOption,\n BazaarService,\n DiscoverResult,\n DiscoverOptions,\n FormatPriceOptions,\n} from \"./types.js\"\n"],"mappings":"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","names":["import_node_path","import_client","import_accounts"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/compute/index.ts","../src/x402/payment-fetch.ts","../src/x402/format.ts","../src/x402/probe.ts","../src/x402/discover.ts","../src/x402/index.ts"],"sourcesContent":["export { compute } from \"./compute/index.js\"\nexport { x402 } from \"./x402/index.js\"\n\nexport type { ComputeRequest, ComputeResponse, ComputeWallet, PricingTier, Stack, Size } from \"./compute/types.js\"\nexport type {\n Network,\n ProbeResult,\n ProbeOptions,\n PaymentRequiredResponse,\n PaymentOption,\n BazaarService,\n DiscoverResult,\n DiscoverOptions,\n FormatPriceOptions,\n} from \"./x402/types.js\"\n","import type { ComputeRequest, ComputeResponse, PricingTier, Size } from \"./types.js\"\n\nconst DEFAULT_ENDPOINT = \"https://x402.auteng.ai/api/x402/compute\"\n\nlet _endpoint = DEFAULT_ENDPOINT\n\nconst PRICING: Record<Size, PricingTier> = {\n small: {\n vcpu: 2,\n ram_gb: 1,\n default_timeout_s: 30,\n max_timeout_s: 300,\n base_price_usd: 0.002,\n per_second_usd: 0.00005,\n },\n med: {\n vcpu: 4,\n ram_gb: 4,\n default_timeout_s: 60,\n max_timeout_s: 600,\n base_price_usd: 0.008,\n per_second_usd: 0.00012,\n },\n large: {\n vcpu: 8,\n ram_gb: 16,\n default_timeout_s: 120,\n max_timeout_s: 3600,\n base_price_usd: 0.03,\n per_second_usd: 0.00025,\n },\n}\n\nexport const compute = {\n /**\n * Execute sandboxed code via AutEng's x402 compute endpoint.\n * Payment is handled automatically via the wallet's x402 layer.\n */\n async run(request: ComputeRequest): Promise<ComputeResponse> {\n if (!request.code) {\n throw new Error(\"compute.run: 'code' is required\")\n }\n if (!request.stack) {\n throw new Error(\"compute.run: 'stack' is required\")\n }\n\n const body = {\n code: request.code,\n stack: request.stack,\n size: request.size ?? \"small\",\n ...(request.timeout_seconds != null && {\n timeout_seconds: request.timeout_seconds,\n }),\n ...(request.files != null && { files: request.files }),\n }\n\n if (!request.wallet) {\n throw new Error(\"compute.run: 'wallet' is required\")\n }\n\n const response = await request.wallet.fetch(_endpoint, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n })\n\n if (!response.ok) {\n const text = await response.text().catch(() => \"\")\n throw new Error(`Compute request failed (${response.status}): ${text}`)\n }\n\n return (await response.json()) as ComputeResponse\n },\n\n /** Returns the pricing table for all compute sizes. */\n pricing(): Record<Size, PricingTier> {\n return { ...PRICING }\n },\n\n /**\n * Override the compute endpoint URL.\n * Default: https://x402.auteng.ai/api/x402/compute\n */\n setEndpoint(url: string): void {\n _endpoint = url\n },\n}\n","import { x402Client } from \"@x402/core/client\"\nimport { registerExactEvmScheme } from \"@x402/evm/exact/client\"\nimport { toClientEvmSigner } from \"@x402/evm\"\nimport { wrapFetchWithPayment } from \"@x402/fetch\"\nimport { privateKeyToAccount } from \"viem/accounts\"\nimport { createPublicClient, http } from \"viem\"\nimport { base, baseSepolia } from \"viem/chains\"\nimport type { Network } from \"./types.js\"\n\n/**\n * Create a fetch function that automatically handles x402 payments.\n * When the server returns 402, the SDK signs an EIP-3009 authorization\n * using the provided private key and retries with payment headers.\n */\nexport function createPaymentFetch(\n privateKey: `0x${string}`,\n network: Network = \"base\",\n rpcUrl?: string\n): typeof globalThis.fetch {\n const account = privateKeyToAccount(privateKey)\n const chain = network === \"base\" ? base : baseSepolia\n const publicClient = createPublicClient({\n chain,\n transport: http(rpcUrl),\n })\n const signer = toClientEvmSigner(account, publicClient)\n\n const client = new x402Client()\n registerExactEvmScheme(client, { signer })\n return wrapFetchWithPayment(fetch, client)\n}\n","import type { FormatPriceOptions } from \"./types.js\"\n\nconst KNOWN_ASSETS: Record<string, { symbol: string; decimals: number; prefix: string }> = {\n // USDC on Base mainnet\n \"0x833589fcd6edb6e08f4c7c32d4f71b54bda02913\": { symbol: \"USDC\", decimals: 6, prefix: \"$\" },\n // USDC on Base Sepolia\n \"0x036cbd53842c5426634e7929541ec2318f3dcf7e\": { symbol: \"USDC\", decimals: 6, prefix: \"$\" },\n}\n\nconst NETWORK_NAMES: Record<string, string> = {\n \"eip155:8453\": \"Base\",\n \"eip155:84532\": \"Base Sepolia\",\n base: \"Base\",\n \"base-sepolia\": \"Base Sepolia\",\n}\n\n/**\n * Format a raw x402 price into a human-readable string.\n *\n * Knows about common assets (USDC on Base = 6 decimals, $-prefixed)\n * and falls back to raw display for unknown assets.\n *\n * @example\n * formatPrice(\"2000\", \"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\", \"eip155:8453\")\n * // → \"$0.002 USDC on Base\"\n */\nexport function formatPrice(amount: string, asset: string, network: string, options?: FormatPriceOptions): string {\n const known = KNOWN_ASSETS[asset.toLowerCase()]\n const networkName = NETWORK_NAMES[network]\n\n if (known) {\n const value = Number(amount) / 10 ** known.decimals\n const formatted = `${known.prefix}${value} ${known.symbol}`\n if (options?.short || !networkName) return formatted\n return `${formatted} on ${networkName}`\n }\n\n // Unknown asset — show raw\n const shortAsset = `${asset.slice(0, 6)}...${asset.slice(-4)}`\n const raw = `${amount} ${shortAsset}`\n if (options?.short || !networkName) return raw\n return `${raw} on ${networkName}`\n}\n","import type { ProbeResult, ProbeOptions, PaymentRequiredResponse, PaymentOption } from \"./types.js\"\nimport { formatPrice } from \"./format.js\"\n\n/**\n * Check if a URL is x402-enabled and see what it costs, without paying.\n *\n * Sends a request to the URL. If the server returns 402 Payment Required,\n * parses the payment requirements and returns a structured result with\n * human-readable pricing. Non-402 responses return `{ enabled: false }`.\n *\n * No wallet needed — this is a read-only inspection.\n */\nexport async function probe(url: string, options?: ProbeOptions): Promise<ProbeResult> {\n const res = await fetch(url, {\n method: options?.method ?? \"GET\",\n headers: options?.headers,\n body: options?.body,\n signal: options?.signal,\n })\n\n if (res.status !== 402) {\n return { enabled: false, url, status: res.status, price: null, paymentRequired: null }\n }\n\n let raw: unknown\n try {\n raw = await res.json()\n } catch {\n return { enabled: false, url, status: 402, price: null, paymentRequired: null }\n }\n\n const paymentRequired = normalizePaymentRequired(raw)\n if (!paymentRequired || paymentRequired.accepts.length === 0) {\n return { enabled: false, url, status: 402, price: null, paymentRequired: null }\n }\n\n const first = paymentRequired.accepts[0]\n const price = formatPrice(first.amount, first.asset, first.network)\n\n return { enabled: true, url, status: 402, price, paymentRequired }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction normalizePaymentRequired(raw: any): PaymentRequiredResponse | null {\n if (!raw || typeof raw !== \"object\" || !Array.isArray(raw.accepts) || raw.accepts.length === 0) {\n return null\n }\n\n const firstAccept = raw.accepts[0]\n\n // Determine if v2 (has top-level resource object and accepts[].amount)\n // or v1 (has accepts[].maxAmountRequired and inline resource/description)\n const isV2 = typeof firstAccept.amount === \"string\" && raw.resource && typeof raw.resource === \"object\"\n\n if (isV2) {\n return {\n x402Version: raw.x402Version ?? 2,\n resource: {\n url: raw.resource.url ?? \"\",\n description: raw.resource.description,\n mimeType: raw.resource.mimeType,\n },\n accepts: raw.accepts.map(normalizeAccept),\n extensions: raw.extensions ?? undefined,\n }\n }\n\n // v1 shape: maxAmountRequired, inline resource/description on each accept\n if (typeof firstAccept.maxAmountRequired === \"string\") {\n return {\n x402Version: raw.x402Version ?? 1,\n resource: {\n url: firstAccept.resource ?? raw.resource?.url ?? \"\",\n description: firstAccept.description ?? raw.resource?.description,\n mimeType: firstAccept.mimeType ?? raw.resource?.mimeType,\n },\n accepts: raw.accepts.map((a: Record<string, unknown>) =>\n normalizeAccept({\n ...a,\n amount: a.maxAmountRequired,\n })\n ),\n extensions: raw.extensions ?? undefined,\n }\n }\n\n return null\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction normalizeAccept(a: any): PaymentOption {\n return {\n scheme: a.scheme ?? \"exact\",\n network: a.network ?? \"\",\n asset: a.asset ?? \"\",\n amount: String(a.amount ?? a.maxAmountRequired ?? \"0\"),\n payTo: a.payTo ?? \"\",\n maxTimeoutSeconds: a.maxTimeoutSeconds ?? 0,\n extra: a.extra ?? undefined,\n }\n}\n","import type { DiscoverResult, DiscoverOptions, BazaarService, PaymentOption } from \"./types.js\"\nimport { formatPrice } from \"./format.js\"\n\nconst DEFAULT_BAZAAR_URL = \"https://api.cdp.coinbase.com/platform/v2/x402/discovery/resources\"\n\n/**\n * Query the Bazaar registry to find available x402 services.\n *\n * Fetches from the Coinbase CDP Bazaar discovery endpoint and returns\n * a normalized list of services with human-readable pricing.\n *\n * No wallet or authentication needed.\n */\nexport async function discover(options?: DiscoverOptions): Promise<DiscoverResult> {\n const baseUrl = options?.bazaarUrl ?? DEFAULT_BAZAAR_URL\n const params = new URLSearchParams()\n if (options?.limit != null) params.set(\"limit\", String(options.limit))\n if (options?.offset != null) params.set(\"offset\", String(options.offset))\n\n const url = params.toString() ? `${baseUrl}?${params}` : baseUrl\n\n const res = await fetch(url, {\n headers: { Accept: \"application/json\" },\n signal: options?.signal,\n })\n\n if (!res.ok) {\n const text = await res.text().catch(() => \"\")\n throw new Error(`Bazaar request failed (${res.status}): ${text}`)\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const json = (await res.json()) as any\n\n // The Bazaar response has an `items` array (or `resources`)\n const items: unknown[] = json.items ?? json.resources ?? []\n\n const services: BazaarService[] = items.map(normalizeBazaarItem).filter(Boolean) as BazaarService[]\n\n return {\n services,\n total: json.total ?? json.totalCount ?? services.length,\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction normalizeBazaarItem(item: any): BazaarService | null {\n if (!item || typeof item !== \"object\") return null\n\n const accepts: unknown[] = item.accepts ?? []\n if (accepts.length === 0) return null\n\n const normalizedAccepts: PaymentOption[] = accepts.map((a: unknown) => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const accept = a as any\n return {\n scheme: accept.scheme ?? \"exact\",\n network: accept.network ?? \"\",\n asset: accept.asset ?? \"\",\n amount: String(accept.amount ?? accept.maxAmountRequired ?? \"0\"),\n payTo: accept.payTo ?? \"\",\n maxTimeoutSeconds: accept.maxTimeoutSeconds ?? 0,\n extra: accept.extra ?? undefined,\n }\n })\n\n // Find cheapest option for display price\n const cheapest = normalizedAccepts.reduce((min, a) => (BigInt(a.amount) < BigInt(min.amount) ? a : min))\n const price = formatPrice(cheapest.amount, cheapest.asset, cheapest.network)\n\n // Extract description from various possible locations\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const firstAccept = accepts[0] as any\n const description: string | null =\n item.description ?? item.resource?.description ?? firstAccept?.description ?? item.metadata?.description ?? null\n\n // Extract URL\n const url: string =\n item.url ??\n item.resource?.url ??\n (typeof item.resource === \"string\" ? item.resource : null) ??\n firstAccept?.resource ??\n \"\"\n\n return {\n url,\n description,\n price,\n accepts: normalizedAccepts,\n metadata: item.metadata ?? {},\n }\n}\n","// Create a payment-wrapped fetch from a private key + network\nexport { createPaymentFetch } from \"./payment-fetch.js\"\n\n// Public x402 convenience functions\nimport { probe } from \"./probe.js\"\nimport { discover } from \"./discover.js\"\nimport { formatPrice } from \"./format.js\"\n\nexport const x402 = {\n probe,\n discover,\n formatPrice,\n}\n\nexport type {\n ProbeResult,\n ProbeOptions,\n PaymentRequiredResponse,\n PaymentOption,\n BazaarService,\n DiscoverResult,\n DiscoverOptions,\n FormatPriceOptions,\n} from \"./types.js\"\n"],"mappings":"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","names":["import_client"]}
|
package/dist/index.mjs
CHANGED
|
@@ -1,250 +1,3 @@
|
|
|
1
|
-
// src/wallet/index.ts
|
|
2
|
-
import { join as join2, resolve as resolve2 } from "path";
|
|
3
|
-
|
|
4
|
-
// src/wallet/keypair.ts
|
|
5
|
-
import { generatePrivateKey, privateKeyToAccount } from "viem/accounts";
|
|
6
|
-
function createKeypair() {
|
|
7
|
-
const privateKey = generatePrivateKey();
|
|
8
|
-
const account = privateKeyToAccount(privateKey);
|
|
9
|
-
return { privateKey, account };
|
|
10
|
-
}
|
|
11
|
-
function loadKeypair(privateKey) {
|
|
12
|
-
const account = privateKeyToAccount(privateKey);
|
|
13
|
-
return { account };
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
// src/wallet/storage.ts
|
|
17
|
-
import { mkdirSync, readFileSync, writeFileSync, existsSync, readdirSync, copyFileSync } from "fs";
|
|
18
|
-
import { dirname, join, resolve } from "path";
|
|
19
|
-
var VALID_NAME = /^[a-z0-9_-]+$/;
|
|
20
|
-
function validateWalletName(name) {
|
|
21
|
-
if (!VALID_NAME.test(name)) {
|
|
22
|
-
throw new Error(`Invalid wallet name "${name}". Use lowercase letters, numbers, hyphens, and underscores only.`);
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
function readWalletFile(path) {
|
|
26
|
-
if (!existsSync(path)) return null;
|
|
27
|
-
const raw = readFileSync(path, "utf-8");
|
|
28
|
-
return JSON.parse(raw);
|
|
29
|
-
}
|
|
30
|
-
function writeWalletFile(path, data) {
|
|
31
|
-
mkdirSync(dirname(path), { recursive: true });
|
|
32
|
-
writeFileSync(path, JSON.stringify(data, null, 2) + "\n", {
|
|
33
|
-
mode: 384
|
|
34
|
-
});
|
|
35
|
-
}
|
|
36
|
-
function listWalletFiles(dir) {
|
|
37
|
-
const resolved = resolve(dir);
|
|
38
|
-
if (!existsSync(resolved)) return [];
|
|
39
|
-
return readdirSync(resolved).filter((f) => f.endsWith(".json")).map((f) => f.replace(/\.json$/, ""));
|
|
40
|
-
}
|
|
41
|
-
function migrateLegacyWallet(walletsDir) {
|
|
42
|
-
const legacyPath = resolve(walletsDir, "..", "wallet.json");
|
|
43
|
-
const newPath = join(resolve(walletsDir), "default.json");
|
|
44
|
-
if (existsSync(legacyPath) && !existsSync(newPath)) {
|
|
45
|
-
const data = readWalletFile(legacyPath);
|
|
46
|
-
if (data) {
|
|
47
|
-
mkdirSync(resolve(walletsDir), { recursive: true });
|
|
48
|
-
copyFileSync(legacyPath, newPath);
|
|
49
|
-
return data;
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
return null;
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
// src/x402/payment-fetch.ts
|
|
56
|
-
import { x402Client } from "@x402/core/client";
|
|
57
|
-
import { registerExactEvmScheme } from "@x402/evm/exact/client";
|
|
58
|
-
import { toClientEvmSigner } from "@x402/evm";
|
|
59
|
-
import { wrapFetchWithPayment } from "@x402/fetch";
|
|
60
|
-
import { privateKeyToAccount as privateKeyToAccount2 } from "viem/accounts";
|
|
61
|
-
import { createPublicClient, http } from "viem";
|
|
62
|
-
import { base, baseSepolia } from "viem/chains";
|
|
63
|
-
function createPaymentFetch(privateKey, network = "base", rpcUrl) {
|
|
64
|
-
const account = privateKeyToAccount2(privateKey);
|
|
65
|
-
const chain = network === "base" ? base : baseSepolia;
|
|
66
|
-
const publicClient = createPublicClient({
|
|
67
|
-
chain,
|
|
68
|
-
transport: http(rpcUrl)
|
|
69
|
-
});
|
|
70
|
-
const signer = toClientEvmSigner(account, publicClient);
|
|
71
|
-
const client = new x402Client();
|
|
72
|
-
registerExactEvmScheme(client, { signer });
|
|
73
|
-
return wrapFetchWithPayment(fetch, client);
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
// src/wallet/types.ts
|
|
77
|
-
var NETWORK_CONFIG = {
|
|
78
|
-
base: {
|
|
79
|
-
chainId: 8453,
|
|
80
|
-
usdcAddress: "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
|
|
81
|
-
rpcUrl: "https://mainnet.base.org"
|
|
82
|
-
},
|
|
83
|
-
"base-sepolia": {
|
|
84
|
-
chainId: 84532,
|
|
85
|
-
usdcAddress: "0x036CbD53842c5426634e7929541eC2318f3dCF7e",
|
|
86
|
-
rpcUrl: "https://sepolia.base.org"
|
|
87
|
-
}
|
|
88
|
-
};
|
|
89
|
-
|
|
90
|
-
// src/wallet/balance.ts
|
|
91
|
-
async function getUsdcBalance(address, network, rpcUrl) {
|
|
92
|
-
const config = NETWORK_CONFIG[network];
|
|
93
|
-
const url = rpcUrl ?? config.rpcUrl;
|
|
94
|
-
const paddedAddress = address.slice(2).toLowerCase().padStart(64, "0");
|
|
95
|
-
const data = `0x70a08231${paddedAddress}`;
|
|
96
|
-
const res = await fetch(url, {
|
|
97
|
-
method: "POST",
|
|
98
|
-
headers: { "Content-Type": "application/json" },
|
|
99
|
-
body: JSON.stringify({
|
|
100
|
-
jsonrpc: "2.0",
|
|
101
|
-
id: 1,
|
|
102
|
-
method: "eth_call",
|
|
103
|
-
params: [{ to: config.usdcAddress, data }, "latest"]
|
|
104
|
-
})
|
|
105
|
-
});
|
|
106
|
-
const json = await res.json();
|
|
107
|
-
if (json.error) {
|
|
108
|
-
throw new Error(`RPC error: ${JSON.stringify(json.error)}`);
|
|
109
|
-
}
|
|
110
|
-
return BigInt(json.result ?? "0x0");
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
// src/wallet/wallet.ts
|
|
114
|
-
var Wallet = class {
|
|
115
|
-
name;
|
|
116
|
-
address;
|
|
117
|
-
network;
|
|
118
|
-
_account;
|
|
119
|
-
_privateKey;
|
|
120
|
-
_rpcUrl;
|
|
121
|
-
_paymentFetch;
|
|
122
|
-
constructor(params) {
|
|
123
|
-
this.name = params.name;
|
|
124
|
-
this._account = params.account;
|
|
125
|
-
this._privateKey = params.privateKey;
|
|
126
|
-
this.address = params.account.address;
|
|
127
|
-
this.network = params.network;
|
|
128
|
-
this._rpcUrl = params.rpcUrl;
|
|
129
|
-
this._paymentFetch = params.paymentFetch;
|
|
130
|
-
}
|
|
131
|
-
/** Check USDC balance on Base. Returns balance in minor units (6 decimals). */
|
|
132
|
-
async checkBalance() {
|
|
133
|
-
return getUsdcBalance(this._account.address, this.network, this._rpcUrl);
|
|
134
|
-
}
|
|
135
|
-
/**
|
|
136
|
-
* Poll until USDC balance >= minAmount.
|
|
137
|
-
* @param minAmount - minimum USDC balance in minor units (6 decimals)
|
|
138
|
-
*/
|
|
139
|
-
async waitForFunding(minAmount, opts) {
|
|
140
|
-
const interval = opts?.pollInterval ?? 1e4;
|
|
141
|
-
const deadline = opts?.timeout ? Date.now() + opts.timeout : null;
|
|
142
|
-
while (true) {
|
|
143
|
-
const balance = await getUsdcBalance(this._account.address, this.network, this._rpcUrl);
|
|
144
|
-
if (balance >= minAmount) return;
|
|
145
|
-
if (deadline && Date.now() >= deadline) {
|
|
146
|
-
throw new Error(`Funding timeout: balance ${balance} < required ${minAmount}`);
|
|
147
|
-
}
|
|
148
|
-
await new Promise((r) => setTimeout(r, interval));
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
/**
|
|
152
|
-
* Drop-in `fetch()` replacement that handles x402 payments automatically.
|
|
153
|
-
* If the server returns 402, the library signs an EIP-3009 authorization
|
|
154
|
-
* and retries the request with payment headers.
|
|
155
|
-
*/
|
|
156
|
-
async fetch(input, init) {
|
|
157
|
-
return this._paymentFetch(input, init);
|
|
158
|
-
}
|
|
159
|
-
};
|
|
160
|
-
|
|
161
|
-
// src/wallet/index.ts
|
|
162
|
-
var DEFAULT_WALLETS_DIR = ".auteng/wallets";
|
|
163
|
-
var _wallets = /* @__PURE__ */ new Map();
|
|
164
|
-
var _walletsDir = resolve2(DEFAULT_WALLETS_DIR);
|
|
165
|
-
var wallet = {
|
|
166
|
-
/**
|
|
167
|
-
* Create a new named wallet or load an existing one from disk.
|
|
168
|
-
* Idempotent: if a wallet with this name already exists, returns it.
|
|
169
|
-
*/
|
|
170
|
-
async create(opts) {
|
|
171
|
-
const name = opts?.name ?? "default";
|
|
172
|
-
validateWalletName(name);
|
|
173
|
-
if (_wallets.has(name)) return _wallets.get(name);
|
|
174
|
-
const dir = resolve2(opts?.walletsDir ?? DEFAULT_WALLETS_DIR);
|
|
175
|
-
_walletsDir = dir;
|
|
176
|
-
const filePath = join2(dir, `${name}.json`);
|
|
177
|
-
const network = opts?.network ?? "base";
|
|
178
|
-
const rpcUrl = opts?.rpcUrl;
|
|
179
|
-
let existing = readWalletFile(filePath);
|
|
180
|
-
if (!existing && name === "default") {
|
|
181
|
-
existing = migrateLegacyWallet(dir);
|
|
182
|
-
}
|
|
183
|
-
let privateKey;
|
|
184
|
-
let account;
|
|
185
|
-
if (existing) {
|
|
186
|
-
privateKey = existing.privateKey;
|
|
187
|
-
account = loadKeypair(existing.privateKey).account;
|
|
188
|
-
} else {
|
|
189
|
-
const kp = createKeypair();
|
|
190
|
-
privateKey = kp.privateKey;
|
|
191
|
-
account = kp.account;
|
|
192
|
-
writeWalletFile(filePath, {
|
|
193
|
-
privateKey,
|
|
194
|
-
address: account.address,
|
|
195
|
-
network
|
|
196
|
-
});
|
|
197
|
-
}
|
|
198
|
-
const effectiveNetwork = existing?.network ?? network;
|
|
199
|
-
const paymentFetch = createPaymentFetch(privateKey, effectiveNetwork, rpcUrl);
|
|
200
|
-
const w = new Wallet({
|
|
201
|
-
name,
|
|
202
|
-
account,
|
|
203
|
-
privateKey,
|
|
204
|
-
network: effectiveNetwork,
|
|
205
|
-
rpcUrl,
|
|
206
|
-
paymentFetch
|
|
207
|
-
});
|
|
208
|
-
_wallets.set(name, w);
|
|
209
|
-
return w;
|
|
210
|
-
},
|
|
211
|
-
/**
|
|
212
|
-
* Retrieve a previously-created wallet by name.
|
|
213
|
-
* Loads from disk if not in memory. Throws if not found.
|
|
214
|
-
*/
|
|
215
|
-
get(name) {
|
|
216
|
-
validateWalletName(name);
|
|
217
|
-
if (_wallets.has(name)) return _wallets.get(name);
|
|
218
|
-
const filePath = join2(_walletsDir, `${name}.json`);
|
|
219
|
-
const data = readWalletFile(filePath);
|
|
220
|
-
if (!data) throw new Error(`Wallet "${name}" not found`);
|
|
221
|
-
const { account } = loadKeypair(data.privateKey);
|
|
222
|
-
const paymentFetch = createPaymentFetch(data.privateKey, data.network);
|
|
223
|
-
const w = new Wallet({
|
|
224
|
-
name,
|
|
225
|
-
account,
|
|
226
|
-
privateKey: data.privateKey,
|
|
227
|
-
network: data.network,
|
|
228
|
-
paymentFetch
|
|
229
|
-
});
|
|
230
|
-
_wallets.set(name, w);
|
|
231
|
-
return w;
|
|
232
|
-
},
|
|
233
|
-
/** List all persisted wallets. */
|
|
234
|
-
list() {
|
|
235
|
-
const names = listWalletFiles(_walletsDir);
|
|
236
|
-
return names.map((n) => {
|
|
237
|
-
if (_wallets.has(n)) return _wallets.get(n);
|
|
238
|
-
return wallet.get(n);
|
|
239
|
-
});
|
|
240
|
-
},
|
|
241
|
-
/** @internal Clear in-memory cache and reset wallets dir. For testing only. */
|
|
242
|
-
_reset() {
|
|
243
|
-
_wallets.clear();
|
|
244
|
-
_walletsDir = resolve2(DEFAULT_WALLETS_DIR);
|
|
245
|
-
}
|
|
246
|
-
};
|
|
247
|
-
|
|
248
1
|
// src/compute/index.ts
|
|
249
2
|
var DEFAULT_ENDPOINT = "https://x402.auteng.ai/api/x402/compute";
|
|
250
3
|
var _endpoint = DEFAULT_ENDPOINT;
|
|
@@ -322,6 +75,15 @@ var compute = {
|
|
|
322
75
|
}
|
|
323
76
|
};
|
|
324
77
|
|
|
78
|
+
// src/x402/payment-fetch.ts
|
|
79
|
+
import { x402Client } from "@x402/core/client";
|
|
80
|
+
import { registerExactEvmScheme } from "@x402/evm/exact/client";
|
|
81
|
+
import { toClientEvmSigner } from "@x402/evm";
|
|
82
|
+
import { wrapFetchWithPayment } from "@x402/fetch";
|
|
83
|
+
import { privateKeyToAccount } from "viem/accounts";
|
|
84
|
+
import { createPublicClient, http } from "viem";
|
|
85
|
+
import { base, baseSepolia } from "viem/chains";
|
|
86
|
+
|
|
325
87
|
// src/x402/format.ts
|
|
326
88
|
var KNOWN_ASSETS = {
|
|
327
89
|
// USDC on Base mainnet
|
|
@@ -332,7 +94,7 @@ var KNOWN_ASSETS = {
|
|
|
332
94
|
var NETWORK_NAMES = {
|
|
333
95
|
"eip155:8453": "Base",
|
|
334
96
|
"eip155:84532": "Base Sepolia",
|
|
335
|
-
|
|
97
|
+
base: "Base",
|
|
336
98
|
"base-sepolia": "Base Sepolia"
|
|
337
99
|
};
|
|
338
100
|
function formatPrice(amount, asset, network, options) {
|
|
@@ -401,10 +163,12 @@ function normalizePaymentRequired(raw) {
|
|
|
401
163
|
description: firstAccept.description ?? raw.resource?.description,
|
|
402
164
|
mimeType: firstAccept.mimeType ?? raw.resource?.mimeType
|
|
403
165
|
},
|
|
404
|
-
accepts: raw.accepts.map(
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
166
|
+
accepts: raw.accepts.map(
|
|
167
|
+
(a) => normalizeAccept({
|
|
168
|
+
...a,
|
|
169
|
+
amount: a.maxAmountRequired
|
|
170
|
+
})
|
|
171
|
+
),
|
|
408
172
|
extensions: raw.extensions ?? void 0
|
|
409
173
|
};
|
|
410
174
|
}
|
|
@@ -462,9 +226,7 @@ function normalizeBazaarItem(item) {
|
|
|
462
226
|
extra: accept.extra ?? void 0
|
|
463
227
|
};
|
|
464
228
|
});
|
|
465
|
-
const cheapest = normalizedAccepts.reduce(
|
|
466
|
-
(min, a) => BigInt(a.amount) < BigInt(min.amount) ? a : min
|
|
467
|
-
);
|
|
229
|
+
const cheapest = normalizedAccepts.reduce((min, a) => BigInt(a.amount) < BigInt(min.amount) ? a : min);
|
|
468
230
|
const price = formatPrice(cheapest.amount, cheapest.asset, cheapest.network);
|
|
469
231
|
const firstAccept = accepts[0];
|
|
470
232
|
const description = item.description ?? item.resource?.description ?? firstAccept?.description ?? item.metadata?.description ?? null;
|
|
@@ -485,9 +247,7 @@ var x402 = {
|
|
|
485
247
|
formatPrice
|
|
486
248
|
};
|
|
487
249
|
export {
|
|
488
|
-
Wallet,
|
|
489
250
|
compute,
|
|
490
|
-
wallet,
|
|
491
251
|
x402
|
|
492
252
|
};
|
|
493
253
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/wallet/index.ts","../src/wallet/keypair.ts","../src/wallet/storage.ts","../src/x402/payment-fetch.ts","../src/wallet/types.ts","../src/wallet/balance.ts","../src/wallet/wallet.ts","../src/compute/index.ts","../src/x402/format.ts","../src/x402/probe.ts","../src/x402/discover.ts","../src/x402/index.ts"],"sourcesContent":["import { join, resolve } from \"node:path\"\nimport { createKeypair, loadKeypair } from \"./keypair.js\"\nimport { readWalletFile, writeWalletFile, listWalletFiles, migrateLegacyWallet, validateWalletName } from \"./storage.js\"\nimport { createPaymentFetch } from \"../x402/payment-fetch.js\"\nimport { Wallet } from \"./wallet.js\"\nimport type { CreateWalletOptions } from \"./types.js\"\n\nconst DEFAULT_WALLETS_DIR = \".auteng/wallets\"\n\nconst _wallets = new Map<string, Wallet>()\nlet _walletsDir = resolve(DEFAULT_WALLETS_DIR)\n\nexport const wallet = {\n /**\n * Create a new named wallet or load an existing one from disk.\n * Idempotent: if a wallet with this name already exists, returns it.\n */\n async create(opts?: CreateWalletOptions): Promise<Wallet> {\n const name = opts?.name ?? \"default\"\n validateWalletName(name)\n\n if (_wallets.has(name)) return _wallets.get(name)!\n\n const dir = resolve(opts?.walletsDir ?? DEFAULT_WALLETS_DIR)\n _walletsDir = dir\n const filePath = join(dir, `${name}.json`)\n const network = opts?.network ?? \"base\"\n const rpcUrl = opts?.rpcUrl\n\n let existing = readWalletFile(filePath)\n\n if (!existing && name === \"default\") {\n existing = migrateLegacyWallet(dir)\n }\n\n let privateKey: `0x${string}`\n let account: ReturnType<typeof loadKeypair>[\"account\"]\n\n if (existing) {\n privateKey = existing.privateKey\n account = loadKeypair(existing.privateKey).account\n } else {\n const kp = createKeypair()\n privateKey = kp.privateKey\n account = kp.account\n writeWalletFile(filePath, {\n privateKey,\n address: account.address,\n network,\n })\n }\n\n const effectiveNetwork = existing?.network ?? network\n const paymentFetch = createPaymentFetch(privateKey, effectiveNetwork, rpcUrl)\n const w = new Wallet({\n name,\n account,\n privateKey,\n network: effectiveNetwork,\n rpcUrl,\n paymentFetch,\n })\n _wallets.set(name, w)\n return w\n },\n\n /**\n * Retrieve a previously-created wallet by name.\n * Loads from disk if not in memory. Throws if not found.\n */\n get(name: string): Wallet {\n validateWalletName(name)\n\n if (_wallets.has(name)) return _wallets.get(name)!\n\n const filePath = join(_walletsDir, `${name}.json`)\n const data = readWalletFile(filePath)\n if (!data) throw new Error(`Wallet \"${name}\" not found`)\n\n const { account } = loadKeypair(data.privateKey)\n const paymentFetch = createPaymentFetch(data.privateKey, data.network)\n const w = new Wallet({\n name,\n account,\n privateKey: data.privateKey,\n network: data.network,\n paymentFetch,\n })\n _wallets.set(name, w)\n return w\n },\n\n /** List all persisted wallets. */\n list(): Wallet[] {\n const names = listWalletFiles(_walletsDir)\n return names.map((n) => {\n if (_wallets.has(n)) return _wallets.get(n)!\n return wallet.get(n)\n })\n },\n\n /** @internal Clear in-memory cache and reset wallets dir. For testing only. */\n _reset(): void {\n _wallets.clear()\n _walletsDir = resolve(DEFAULT_WALLETS_DIR)\n },\n}\n","import { generatePrivateKey, privateKeyToAccount } from \"viem/accounts\"\nimport type { PrivateKeyAccount } from \"viem\"\n\nexport function createKeypair(): {\n privateKey: `0x${string}`\n account: PrivateKeyAccount\n} {\n const privateKey = generatePrivateKey()\n const account = privateKeyToAccount(privateKey)\n return { privateKey, account }\n}\n\nexport function loadKeypair(privateKey: `0x${string}`): {\n account: PrivateKeyAccount\n} {\n const account = privateKeyToAccount(privateKey)\n return { account }\n}\n","import { mkdirSync, readFileSync, writeFileSync, existsSync, readdirSync, copyFileSync } from \"node:fs\"\nimport { dirname, join, resolve } from \"node:path\"\nimport type { WalletFile } from \"./types.js\"\n\nconst VALID_NAME = /^[a-z0-9_-]+$/\n\nexport function validateWalletName(name: string): void {\n if (!VALID_NAME.test(name)) {\n throw new Error(`Invalid wallet name \"${name}\". Use lowercase letters, numbers, hyphens, and underscores only.`)\n }\n}\n\nexport function readWalletFile(path: string): WalletFile | null {\n if (!existsSync(path)) return null\n const raw = readFileSync(path, \"utf-8\")\n return JSON.parse(raw) as WalletFile\n}\n\nexport function writeWalletFile(path: string, data: WalletFile): void {\n mkdirSync(dirname(path), { recursive: true })\n writeFileSync(path, JSON.stringify(data, null, 2) + \"\\n\", {\n mode: 0o600,\n })\n}\n\nexport function listWalletFiles(dir: string): string[] {\n const resolved = resolve(dir)\n if (!existsSync(resolved)) return []\n return readdirSync(resolved)\n .filter((f) => f.endsWith(\".json\"))\n .map((f) => f.replace(/\\.json$/, \"\"))\n}\n\nexport function migrateLegacyWallet(walletsDir: string): WalletFile | null {\n const legacyPath = resolve(walletsDir, \"..\", \"wallet.json\")\n const newPath = join(resolve(walletsDir), \"default.json\")\n if (existsSync(legacyPath) && !existsSync(newPath)) {\n const data = readWalletFile(legacyPath)\n if (data) {\n mkdirSync(resolve(walletsDir), { recursive: true })\n copyFileSync(legacyPath, newPath)\n return data\n }\n }\n return null\n}\n","import { x402Client } from \"@x402/core/client\"\nimport { registerExactEvmScheme } from \"@x402/evm/exact/client\"\nimport { toClientEvmSigner } from \"@x402/evm\"\nimport { wrapFetchWithPayment } from \"@x402/fetch\"\nimport { privateKeyToAccount } from \"viem/accounts\"\nimport { createPublicClient, http } from \"viem\"\nimport { base, baseSepolia } from \"viem/chains\"\nimport type { Network } from \"../wallet/types.js\"\n\n/**\n * Create a fetch function that automatically handles x402 payments.\n * When the server returns 402, the SDK signs an EIP-3009 authorization\n * using the provided private key and retries with payment headers.\n */\nexport function createPaymentFetch(\n privateKey: `0x${string}`,\n network: Network = \"base\",\n rpcUrl?: string\n): typeof globalThis.fetch {\n const account = privateKeyToAccount(privateKey)\n const chain = network === \"base\" ? base : baseSepolia\n const publicClient = createPublicClient({\n chain,\n transport: http(rpcUrl),\n })\n const signer = toClientEvmSigner(account, publicClient)\n\n const client = new x402Client()\n registerExactEvmScheme(client, { signer })\n return wrapFetchWithPayment(fetch, client)\n}\n","export type Network = \"base\" | \"base-sepolia\"\n\nexport interface CreateWalletOptions {\n /** Wallet identifier. Default: \"default\" */\n name?: string\n /** Network to use. Default: `base` */\n network?: Network\n /** Custom RPC endpoint. Default: public Base RPC */\n rpcUrl?: string\n /** Base directory for wallet storage. Default: \".auteng/wallets\" */\n walletsDir?: string\n}\n\n/** @deprecated Use CreateWalletOptions instead */\nexport type WalletConfig = CreateWalletOptions\n\nexport interface WalletFile {\n privateKey: `0x${string}`\n address: `0x${string}`\n network: Network\n}\n\nexport interface WaitForFundingOptions {\n /** Poll interval in milliseconds. Default: 10000 (10s) */\n pollInterval?: number\n /** Timeout in milliseconds. Default: none (waits forever) */\n timeout?: number\n}\n\nexport const NETWORK_CONFIG: Record<Network, { chainId: number; usdcAddress: `0x${string}`; rpcUrl: string }> = {\n base: {\n chainId: 8453,\n usdcAddress: \"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\",\n rpcUrl: \"https://mainnet.base.org\",\n },\n \"base-sepolia\": {\n chainId: 84532,\n usdcAddress: \"0x036CbD53842c5426634e7929541eC2318f3dCF7e\",\n rpcUrl: \"https://sepolia.base.org\",\n },\n}\n","import type { Network } from \"./types.js\"\nimport { NETWORK_CONFIG } from \"./types.js\"\n\n/**\n * Read USDC balance for `address` via a direct `eth_call` to the USDC\n * contract's `balanceOf(address)` function. No viem client needed — just\n * a plain JSON-RPC POST.\n */\nexport async function getUsdcBalance(address: `0x${string}`, network: Network, rpcUrl?: string): Promise<bigint> {\n const config = NETWORK_CONFIG[network]\n const url = rpcUrl ?? config.rpcUrl\n\n // balanceOf(address) selector = 0x70a08231\n const paddedAddress = address.slice(2).toLowerCase().padStart(64, \"0\")\n const data = `0x70a08231${paddedAddress}`\n\n const res = await fetch(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n jsonrpc: \"2.0\",\n id: 1,\n method: \"eth_call\",\n params: [{ to: config.usdcAddress, data }, \"latest\"],\n }),\n })\n\n const json = (await res.json()) as { result?: string; error?: unknown }\n if (json.error) {\n throw new Error(`RPC error: ${JSON.stringify(json.error)}`)\n }\n return BigInt(json.result ?? \"0x0\")\n}\n","import type { PrivateKeyAccount } from \"viem\"\nimport { getUsdcBalance } from \"./balance.js\"\nimport type { Network, WaitForFundingOptions } from \"./types.js\"\n\nexport class Wallet {\n readonly name: string\n readonly address: `0x${string}`\n readonly network: Network\n\n private _account: PrivateKeyAccount\n private _privateKey: `0x${string}`\n private _rpcUrl: string | undefined\n private _paymentFetch: typeof globalThis.fetch\n\n constructor(params: {\n name: string\n account: PrivateKeyAccount\n privateKey: `0x${string}`\n network: Network\n rpcUrl?: string\n paymentFetch: typeof globalThis.fetch\n }) {\n this.name = params.name\n this._account = params.account\n this._privateKey = params.privateKey\n this.address = params.account.address\n this.network = params.network\n this._rpcUrl = params.rpcUrl\n this._paymentFetch = params.paymentFetch\n }\n\n /** Check USDC balance on Base. Returns balance in minor units (6 decimals). */\n async checkBalance(): Promise<bigint> {\n return getUsdcBalance(this._account.address, this.network, this._rpcUrl)\n }\n\n /**\n * Poll until USDC balance >= minAmount.\n * @param minAmount - minimum USDC balance in minor units (6 decimals)\n */\n async waitForFunding(minAmount: bigint, opts?: WaitForFundingOptions): Promise<void> {\n const interval = opts?.pollInterval ?? 10_000\n const deadline = opts?.timeout ? Date.now() + opts.timeout : null\n\n while (true) {\n const balance = await getUsdcBalance(this._account.address, this.network, this._rpcUrl)\n if (balance >= minAmount) return\n\n if (deadline && Date.now() >= deadline) {\n throw new Error(`Funding timeout: balance ${balance} < required ${minAmount}`)\n }\n\n await new Promise((r) => setTimeout(r, interval))\n }\n }\n\n /**\n * Drop-in `fetch()` replacement that handles x402 payments automatically.\n * If the server returns 402, the library signs an EIP-3009 authorization\n * and retries the request with payment headers.\n */\n async fetch(input: string | URL | Request, init?: RequestInit): Promise<Response> {\n return this._paymentFetch(input, init)\n }\n}\n","import type { ComputeRequest, ComputeResponse, PricingTier, Size } from \"./types.js\"\n\nconst DEFAULT_ENDPOINT = \"https://x402.auteng.ai/api/x402/compute\"\n\nlet _endpoint = DEFAULT_ENDPOINT\n\nconst PRICING: Record<Size, PricingTier> = {\n small: {\n vcpu: 2,\n ram_gb: 1,\n default_timeout_s: 30,\n max_timeout_s: 300,\n base_price_usd: 0.002,\n per_second_usd: 0.00005,\n },\n med: {\n vcpu: 4,\n ram_gb: 4,\n default_timeout_s: 60,\n max_timeout_s: 600,\n base_price_usd: 0.008,\n per_second_usd: 0.00012,\n },\n large: {\n vcpu: 8,\n ram_gb: 16,\n default_timeout_s: 120,\n max_timeout_s: 3600,\n base_price_usd: 0.03,\n per_second_usd: 0.00025,\n },\n}\n\nexport const compute = {\n /**\n * Execute sandboxed code via AutEng's x402 compute endpoint.\n * Payment is handled automatically via the wallet's x402 layer.\n */\n async run(request: ComputeRequest): Promise<ComputeResponse> {\n if (!request.code) {\n throw new Error(\"compute.run: 'code' is required\")\n }\n if (!request.stack) {\n throw new Error(\"compute.run: 'stack' is required\")\n }\n\n const body = {\n code: request.code,\n stack: request.stack,\n size: request.size ?? \"small\",\n ...(request.timeout_seconds != null && {\n timeout_seconds: request.timeout_seconds,\n }),\n ...(request.files != null && { files: request.files }),\n }\n\n if (!request.wallet) {\n throw new Error(\"compute.run: 'wallet' is required\")\n }\n\n const response = await request.wallet.fetch(_endpoint, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n })\n\n if (!response.ok) {\n const text = await response.text().catch(() => \"\")\n throw new Error(`Compute request failed (${response.status}): ${text}`)\n }\n\n return (await response.json()) as ComputeResponse\n },\n\n /** Returns the pricing table for all compute sizes. */\n pricing(): Record<Size, PricingTier> {\n return { ...PRICING }\n },\n\n /**\n * Override the compute endpoint URL.\n * Default: https://x402.auteng.ai/api/x402/compute\n */\n setEndpoint(url: string): void {\n _endpoint = url\n },\n}\n","import type { FormatPriceOptions } from \"./types.js\"\n\nconst KNOWN_ASSETS: Record<string, { symbol: string; decimals: number; prefix: string }> = {\n // USDC on Base mainnet\n \"0x833589fcd6edb6e08f4c7c32d4f71b54bda02913\": { symbol: \"USDC\", decimals: 6, prefix: \"$\" },\n // USDC on Base Sepolia\n \"0x036cbd53842c5426634e7929541ec2318f3dcf7e\": { symbol: \"USDC\", decimals: 6, prefix: \"$\" },\n}\n\nconst NETWORK_NAMES: Record<string, string> = {\n \"eip155:8453\": \"Base\",\n \"eip155:84532\": \"Base Sepolia\",\n \"base\": \"Base\",\n \"base-sepolia\": \"Base Sepolia\",\n}\n\n/**\n * Format a raw x402 price into a human-readable string.\n *\n * Knows about common assets (USDC on Base = 6 decimals, $-prefixed)\n * and falls back to raw display for unknown assets.\n *\n * @example\n * formatPrice(\"2000\", \"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\", \"eip155:8453\")\n * // → \"$0.002 USDC on Base\"\n */\nexport function formatPrice(\n amount: string,\n asset: string,\n network: string,\n options?: FormatPriceOptions,\n): string {\n const known = KNOWN_ASSETS[asset.toLowerCase()]\n const networkName = NETWORK_NAMES[network]\n\n if (known) {\n const value = Number(amount) / 10 ** known.decimals\n const formatted = `${known.prefix}${value} ${known.symbol}`\n if (options?.short || !networkName) return formatted\n return `${formatted} on ${networkName}`\n }\n\n // Unknown asset — show raw\n const shortAsset = `${asset.slice(0, 6)}...${asset.slice(-4)}`\n const raw = `${amount} ${shortAsset}`\n if (options?.short || !networkName) return raw\n return `${raw} on ${networkName}`\n}\n","import type { ProbeResult, ProbeOptions, PaymentRequiredResponse, PaymentOption } from \"./types.js\"\nimport { formatPrice } from \"./format.js\"\n\n/**\n * Check if a URL is x402-enabled and see what it costs, without paying.\n *\n * Sends a request to the URL. If the server returns 402 Payment Required,\n * parses the payment requirements and returns a structured result with\n * human-readable pricing. Non-402 responses return `{ enabled: false }`.\n *\n * No wallet needed — this is a read-only inspection.\n */\nexport async function probe(url: string, options?: ProbeOptions): Promise<ProbeResult> {\n const res = await fetch(url, {\n method: options?.method ?? \"GET\",\n headers: options?.headers,\n body: options?.body,\n signal: options?.signal,\n })\n\n if (res.status !== 402) {\n return { enabled: false, url, status: res.status, price: null, paymentRequired: null }\n }\n\n let raw: unknown\n try {\n raw = await res.json()\n } catch {\n return { enabled: false, url, status: 402, price: null, paymentRequired: null }\n }\n\n const paymentRequired = normalizePaymentRequired(raw)\n if (!paymentRequired || paymentRequired.accepts.length === 0) {\n return { enabled: false, url, status: 402, price: null, paymentRequired: null }\n }\n\n const first = paymentRequired.accepts[0]\n const price = formatPrice(first.amount, first.asset, first.network)\n\n return { enabled: true, url, status: 402, price, paymentRequired }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction normalizePaymentRequired(raw: any): PaymentRequiredResponse | null {\n if (!raw || typeof raw !== \"object\" || !Array.isArray(raw.accepts) || raw.accepts.length === 0) {\n return null\n }\n\n const firstAccept = raw.accepts[0]\n\n // Determine if v2 (has top-level resource object and accepts[].amount)\n // or v1 (has accepts[].maxAmountRequired and inline resource/description)\n const isV2 = typeof firstAccept.amount === \"string\" && raw.resource && typeof raw.resource === \"object\"\n\n if (isV2) {\n return {\n x402Version: raw.x402Version ?? 2,\n resource: {\n url: raw.resource.url ?? \"\",\n description: raw.resource.description,\n mimeType: raw.resource.mimeType,\n },\n accepts: raw.accepts.map(normalizeAccept),\n extensions: raw.extensions ?? undefined,\n }\n }\n\n // v1 shape: maxAmountRequired, inline resource/description on each accept\n if (typeof firstAccept.maxAmountRequired === \"string\") {\n return {\n x402Version: raw.x402Version ?? 1,\n resource: {\n url: firstAccept.resource ?? raw.resource?.url ?? \"\",\n description: firstAccept.description ?? raw.resource?.description,\n mimeType: firstAccept.mimeType ?? raw.resource?.mimeType,\n },\n accepts: raw.accepts.map((a: Record<string, unknown>) => normalizeAccept({\n ...a,\n amount: a.maxAmountRequired,\n })),\n extensions: raw.extensions ?? undefined,\n }\n }\n\n return null\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction normalizeAccept(a: any): PaymentOption {\n return {\n scheme: a.scheme ?? \"exact\",\n network: a.network ?? \"\",\n asset: a.asset ?? \"\",\n amount: String(a.amount ?? a.maxAmountRequired ?? \"0\"),\n payTo: a.payTo ?? \"\",\n maxTimeoutSeconds: a.maxTimeoutSeconds ?? 0,\n extra: a.extra ?? undefined,\n }\n}\n","import type { DiscoverResult, DiscoverOptions, BazaarService, PaymentOption } from \"./types.js\"\nimport { formatPrice } from \"./format.js\"\n\nconst DEFAULT_BAZAAR_URL = \"https://api.cdp.coinbase.com/platform/v2/x402/discovery/resources\"\n\n/**\n * Query the Bazaar registry to find available x402 services.\n *\n * Fetches from the Coinbase CDP Bazaar discovery endpoint and returns\n * a normalized list of services with human-readable pricing.\n *\n * No wallet or authentication needed.\n */\nexport async function discover(options?: DiscoverOptions): Promise<DiscoverResult> {\n const baseUrl = options?.bazaarUrl ?? DEFAULT_BAZAAR_URL\n const params = new URLSearchParams()\n if (options?.limit != null) params.set(\"limit\", String(options.limit))\n if (options?.offset != null) params.set(\"offset\", String(options.offset))\n\n const url = params.toString() ? `${baseUrl}?${params}` : baseUrl\n\n const res = await fetch(url, {\n headers: { Accept: \"application/json\" },\n signal: options?.signal,\n })\n\n if (!res.ok) {\n const text = await res.text().catch(() => \"\")\n throw new Error(`Bazaar request failed (${res.status}): ${text}`)\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const json = (await res.json()) as any\n\n // The Bazaar response has an `items` array (or `resources`)\n const items: unknown[] = json.items ?? json.resources ?? []\n\n const services: BazaarService[] = items.map(normalizeBazaarItem).filter(Boolean) as BazaarService[]\n\n return {\n services,\n total: json.total ?? json.totalCount ?? services.length,\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction normalizeBazaarItem(item: any): BazaarService | null {\n if (!item || typeof item !== \"object\") return null\n\n const accepts: unknown[] = item.accepts ?? []\n if (accepts.length === 0) return null\n\n const normalizedAccepts: PaymentOption[] = accepts.map((a: unknown) => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const accept = a as any\n return {\n scheme: accept.scheme ?? \"exact\",\n network: accept.network ?? \"\",\n asset: accept.asset ?? \"\",\n amount: String(accept.amount ?? accept.maxAmountRequired ?? \"0\"),\n payTo: accept.payTo ?? \"\",\n maxTimeoutSeconds: accept.maxTimeoutSeconds ?? 0,\n extra: accept.extra ?? undefined,\n }\n })\n\n // Find cheapest option for display price\n const cheapest = normalizedAccepts.reduce((min, a) =>\n BigInt(a.amount) < BigInt(min.amount) ? a : min\n )\n const price = formatPrice(cheapest.amount, cheapest.asset, cheapest.network)\n\n // Extract description from various possible locations\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const firstAccept = accepts[0] as any\n const description: string | null =\n item.description ??\n item.resource?.description ??\n firstAccept?.description ??\n item.metadata?.description ??\n null\n\n // Extract URL\n const url: string =\n item.url ??\n item.resource?.url ??\n (typeof item.resource === \"string\" ? item.resource : null) ??\n firstAccept?.resource ??\n \"\"\n\n return {\n url,\n description,\n price,\n accepts: normalizedAccepts,\n metadata: item.metadata ?? {},\n }\n}\n","// Internal — used by wallet module\nexport { createPaymentFetch } from \"./payment-fetch.js\"\n\n// Public x402 convenience functions\nimport { probe } from \"./probe.js\"\nimport { discover } from \"./discover.js\"\nimport { formatPrice } from \"./format.js\"\n\nexport const x402 = {\n probe,\n discover,\n formatPrice,\n}\n\nexport type {\n ProbeResult,\n ProbeOptions,\n PaymentRequiredResponse,\n PaymentOption,\n BazaarService,\n DiscoverResult,\n DiscoverOptions,\n FormatPriceOptions,\n} from \"./types.js\"\n"],"mappings":"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","names":["join","resolve","privateKeyToAccount","resolve","join"]}
|
|
1
|
+
{"version":3,"sources":["../src/compute/index.ts","../src/x402/payment-fetch.ts","../src/x402/format.ts","../src/x402/probe.ts","../src/x402/discover.ts","../src/x402/index.ts"],"sourcesContent":["import type { ComputeRequest, ComputeResponse, PricingTier, Size } from \"./types.js\"\n\nconst DEFAULT_ENDPOINT = \"https://x402.auteng.ai/api/x402/compute\"\n\nlet _endpoint = DEFAULT_ENDPOINT\n\nconst PRICING: Record<Size, PricingTier> = {\n small: {\n vcpu: 2,\n ram_gb: 1,\n default_timeout_s: 30,\n max_timeout_s: 300,\n base_price_usd: 0.002,\n per_second_usd: 0.00005,\n },\n med: {\n vcpu: 4,\n ram_gb: 4,\n default_timeout_s: 60,\n max_timeout_s: 600,\n base_price_usd: 0.008,\n per_second_usd: 0.00012,\n },\n large: {\n vcpu: 8,\n ram_gb: 16,\n default_timeout_s: 120,\n max_timeout_s: 3600,\n base_price_usd: 0.03,\n per_second_usd: 0.00025,\n },\n}\n\nexport const compute = {\n /**\n * Execute sandboxed code via AutEng's x402 compute endpoint.\n * Payment is handled automatically via the wallet's x402 layer.\n */\n async run(request: ComputeRequest): Promise<ComputeResponse> {\n if (!request.code) {\n throw new Error(\"compute.run: 'code' is required\")\n }\n if (!request.stack) {\n throw new Error(\"compute.run: 'stack' is required\")\n }\n\n const body = {\n code: request.code,\n stack: request.stack,\n size: request.size ?? \"small\",\n ...(request.timeout_seconds != null && {\n timeout_seconds: request.timeout_seconds,\n }),\n ...(request.files != null && { files: request.files }),\n }\n\n if (!request.wallet) {\n throw new Error(\"compute.run: 'wallet' is required\")\n }\n\n const response = await request.wallet.fetch(_endpoint, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n })\n\n if (!response.ok) {\n const text = await response.text().catch(() => \"\")\n throw new Error(`Compute request failed (${response.status}): ${text}`)\n }\n\n return (await response.json()) as ComputeResponse\n },\n\n /** Returns the pricing table for all compute sizes. */\n pricing(): Record<Size, PricingTier> {\n return { ...PRICING }\n },\n\n /**\n * Override the compute endpoint URL.\n * Default: https://x402.auteng.ai/api/x402/compute\n */\n setEndpoint(url: string): void {\n _endpoint = url\n },\n}\n","import { x402Client } from \"@x402/core/client\"\nimport { registerExactEvmScheme } from \"@x402/evm/exact/client\"\nimport { toClientEvmSigner } from \"@x402/evm\"\nimport { wrapFetchWithPayment } from \"@x402/fetch\"\nimport { privateKeyToAccount } from \"viem/accounts\"\nimport { createPublicClient, http } from \"viem\"\nimport { base, baseSepolia } from \"viem/chains\"\nimport type { Network } from \"./types.js\"\n\n/**\n * Create a fetch function that automatically handles x402 payments.\n * When the server returns 402, the SDK signs an EIP-3009 authorization\n * using the provided private key and retries with payment headers.\n */\nexport function createPaymentFetch(\n privateKey: `0x${string}`,\n network: Network = \"base\",\n rpcUrl?: string\n): typeof globalThis.fetch {\n const account = privateKeyToAccount(privateKey)\n const chain = network === \"base\" ? base : baseSepolia\n const publicClient = createPublicClient({\n chain,\n transport: http(rpcUrl),\n })\n const signer = toClientEvmSigner(account, publicClient)\n\n const client = new x402Client()\n registerExactEvmScheme(client, { signer })\n return wrapFetchWithPayment(fetch, client)\n}\n","import type { FormatPriceOptions } from \"./types.js\"\n\nconst KNOWN_ASSETS: Record<string, { symbol: string; decimals: number; prefix: string }> = {\n // USDC on Base mainnet\n \"0x833589fcd6edb6e08f4c7c32d4f71b54bda02913\": { symbol: \"USDC\", decimals: 6, prefix: \"$\" },\n // USDC on Base Sepolia\n \"0x036cbd53842c5426634e7929541ec2318f3dcf7e\": { symbol: \"USDC\", decimals: 6, prefix: \"$\" },\n}\n\nconst NETWORK_NAMES: Record<string, string> = {\n \"eip155:8453\": \"Base\",\n \"eip155:84532\": \"Base Sepolia\",\n base: \"Base\",\n \"base-sepolia\": \"Base Sepolia\",\n}\n\n/**\n * Format a raw x402 price into a human-readable string.\n *\n * Knows about common assets (USDC on Base = 6 decimals, $-prefixed)\n * and falls back to raw display for unknown assets.\n *\n * @example\n * formatPrice(\"2000\", \"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\", \"eip155:8453\")\n * // → \"$0.002 USDC on Base\"\n */\nexport function formatPrice(amount: string, asset: string, network: string, options?: FormatPriceOptions): string {\n const known = KNOWN_ASSETS[asset.toLowerCase()]\n const networkName = NETWORK_NAMES[network]\n\n if (known) {\n const value = Number(amount) / 10 ** known.decimals\n const formatted = `${known.prefix}${value} ${known.symbol}`\n if (options?.short || !networkName) return formatted\n return `${formatted} on ${networkName}`\n }\n\n // Unknown asset — show raw\n const shortAsset = `${asset.slice(0, 6)}...${asset.slice(-4)}`\n const raw = `${amount} ${shortAsset}`\n if (options?.short || !networkName) return raw\n return `${raw} on ${networkName}`\n}\n","import type { ProbeResult, ProbeOptions, PaymentRequiredResponse, PaymentOption } from \"./types.js\"\nimport { formatPrice } from \"./format.js\"\n\n/**\n * Check if a URL is x402-enabled and see what it costs, without paying.\n *\n * Sends a request to the URL. If the server returns 402 Payment Required,\n * parses the payment requirements and returns a structured result with\n * human-readable pricing. Non-402 responses return `{ enabled: false }`.\n *\n * No wallet needed — this is a read-only inspection.\n */\nexport async function probe(url: string, options?: ProbeOptions): Promise<ProbeResult> {\n const res = await fetch(url, {\n method: options?.method ?? \"GET\",\n headers: options?.headers,\n body: options?.body,\n signal: options?.signal,\n })\n\n if (res.status !== 402) {\n return { enabled: false, url, status: res.status, price: null, paymentRequired: null }\n }\n\n let raw: unknown\n try {\n raw = await res.json()\n } catch {\n return { enabled: false, url, status: 402, price: null, paymentRequired: null }\n }\n\n const paymentRequired = normalizePaymentRequired(raw)\n if (!paymentRequired || paymentRequired.accepts.length === 0) {\n return { enabled: false, url, status: 402, price: null, paymentRequired: null }\n }\n\n const first = paymentRequired.accepts[0]\n const price = formatPrice(first.amount, first.asset, first.network)\n\n return { enabled: true, url, status: 402, price, paymentRequired }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction normalizePaymentRequired(raw: any): PaymentRequiredResponse | null {\n if (!raw || typeof raw !== \"object\" || !Array.isArray(raw.accepts) || raw.accepts.length === 0) {\n return null\n }\n\n const firstAccept = raw.accepts[0]\n\n // Determine if v2 (has top-level resource object and accepts[].amount)\n // or v1 (has accepts[].maxAmountRequired and inline resource/description)\n const isV2 = typeof firstAccept.amount === \"string\" && raw.resource && typeof raw.resource === \"object\"\n\n if (isV2) {\n return {\n x402Version: raw.x402Version ?? 2,\n resource: {\n url: raw.resource.url ?? \"\",\n description: raw.resource.description,\n mimeType: raw.resource.mimeType,\n },\n accepts: raw.accepts.map(normalizeAccept),\n extensions: raw.extensions ?? undefined,\n }\n }\n\n // v1 shape: maxAmountRequired, inline resource/description on each accept\n if (typeof firstAccept.maxAmountRequired === \"string\") {\n return {\n x402Version: raw.x402Version ?? 1,\n resource: {\n url: firstAccept.resource ?? raw.resource?.url ?? \"\",\n description: firstAccept.description ?? raw.resource?.description,\n mimeType: firstAccept.mimeType ?? raw.resource?.mimeType,\n },\n accepts: raw.accepts.map((a: Record<string, unknown>) =>\n normalizeAccept({\n ...a,\n amount: a.maxAmountRequired,\n })\n ),\n extensions: raw.extensions ?? undefined,\n }\n }\n\n return null\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction normalizeAccept(a: any): PaymentOption {\n return {\n scheme: a.scheme ?? \"exact\",\n network: a.network ?? \"\",\n asset: a.asset ?? \"\",\n amount: String(a.amount ?? a.maxAmountRequired ?? \"0\"),\n payTo: a.payTo ?? \"\",\n maxTimeoutSeconds: a.maxTimeoutSeconds ?? 0,\n extra: a.extra ?? undefined,\n }\n}\n","import type { DiscoverResult, DiscoverOptions, BazaarService, PaymentOption } from \"./types.js\"\nimport { formatPrice } from \"./format.js\"\n\nconst DEFAULT_BAZAAR_URL = \"https://api.cdp.coinbase.com/platform/v2/x402/discovery/resources\"\n\n/**\n * Query the Bazaar registry to find available x402 services.\n *\n * Fetches from the Coinbase CDP Bazaar discovery endpoint and returns\n * a normalized list of services with human-readable pricing.\n *\n * No wallet or authentication needed.\n */\nexport async function discover(options?: DiscoverOptions): Promise<DiscoverResult> {\n const baseUrl = options?.bazaarUrl ?? DEFAULT_BAZAAR_URL\n const params = new URLSearchParams()\n if (options?.limit != null) params.set(\"limit\", String(options.limit))\n if (options?.offset != null) params.set(\"offset\", String(options.offset))\n\n const url = params.toString() ? `${baseUrl}?${params}` : baseUrl\n\n const res = await fetch(url, {\n headers: { Accept: \"application/json\" },\n signal: options?.signal,\n })\n\n if (!res.ok) {\n const text = await res.text().catch(() => \"\")\n throw new Error(`Bazaar request failed (${res.status}): ${text}`)\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const json = (await res.json()) as any\n\n // The Bazaar response has an `items` array (or `resources`)\n const items: unknown[] = json.items ?? json.resources ?? []\n\n const services: BazaarService[] = items.map(normalizeBazaarItem).filter(Boolean) as BazaarService[]\n\n return {\n services,\n total: json.total ?? json.totalCount ?? services.length,\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction normalizeBazaarItem(item: any): BazaarService | null {\n if (!item || typeof item !== \"object\") return null\n\n const accepts: unknown[] = item.accepts ?? []\n if (accepts.length === 0) return null\n\n const normalizedAccepts: PaymentOption[] = accepts.map((a: unknown) => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const accept = a as any\n return {\n scheme: accept.scheme ?? \"exact\",\n network: accept.network ?? \"\",\n asset: accept.asset ?? \"\",\n amount: String(accept.amount ?? accept.maxAmountRequired ?? \"0\"),\n payTo: accept.payTo ?? \"\",\n maxTimeoutSeconds: accept.maxTimeoutSeconds ?? 0,\n extra: accept.extra ?? undefined,\n }\n })\n\n // Find cheapest option for display price\n const cheapest = normalizedAccepts.reduce((min, a) => (BigInt(a.amount) < BigInt(min.amount) ? a : min))\n const price = formatPrice(cheapest.amount, cheapest.asset, cheapest.network)\n\n // Extract description from various possible locations\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const firstAccept = accepts[0] as any\n const description: string | null =\n item.description ?? item.resource?.description ?? firstAccept?.description ?? item.metadata?.description ?? null\n\n // Extract URL\n const url: string =\n item.url ??\n item.resource?.url ??\n (typeof item.resource === \"string\" ? item.resource : null) ??\n firstAccept?.resource ??\n \"\"\n\n return {\n url,\n description,\n price,\n accepts: normalizedAccepts,\n metadata: item.metadata ?? {},\n }\n}\n","// Create a payment-wrapped fetch from a private key + network\nexport { createPaymentFetch } from \"./payment-fetch.js\"\n\n// Public x402 convenience functions\nimport { probe } from \"./probe.js\"\nimport { discover } from \"./discover.js\"\nimport { formatPrice } from \"./format.js\"\n\nexport const x402 = {\n probe,\n discover,\n formatPrice,\n}\n\nexport type {\n ProbeResult,\n ProbeOptions,\n PaymentRequiredResponse,\n PaymentOption,\n BazaarService,\n DiscoverResult,\n DiscoverOptions,\n FormatPriceOptions,\n} from \"./types.js\"\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@auteng/agent-utils",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "x402 payments and sandboxed compute for autonomous AI agents",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"module": "dist/index.mjs",
|
|
7
7
|
"types": "dist/index.d.ts",
|