x402check 0.0.1
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/dist/index.cjs +1857 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +465 -0
- package/dist/index.d.cts.map +1 -0
- package/dist/index.d.ts +465 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.iife.js +5 -0
- package/dist/index.js +1831 -0
- package/dist/index.js.map +1 -0
- package/package.json +55 -0
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,465 @@
|
|
|
1
|
+
//#region src/types/config.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* Type definitions for all x402 config formats
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Config format discriminator
|
|
7
|
+
*/
|
|
8
|
+
type ConfigFormat = 'v2' | 'v1' | 'unknown';
|
|
9
|
+
/**
|
|
10
|
+
* HTTP resource definition
|
|
11
|
+
*/
|
|
12
|
+
interface Resource {
|
|
13
|
+
url: string;
|
|
14
|
+
method?: string | undefined;
|
|
15
|
+
headers?: Record<string, string> | undefined;
|
|
16
|
+
body?: string | undefined;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* V2 accepts array entry
|
|
20
|
+
*/
|
|
21
|
+
interface AcceptsEntry {
|
|
22
|
+
scheme: string;
|
|
23
|
+
network: string;
|
|
24
|
+
amount: string;
|
|
25
|
+
asset: string;
|
|
26
|
+
payTo: string;
|
|
27
|
+
maxTimeoutSeconds?: number | undefined;
|
|
28
|
+
extra?: Record<string, unknown> | undefined;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* x402 v2 config shape
|
|
32
|
+
*/
|
|
33
|
+
interface V2Config {
|
|
34
|
+
x402Version: 2;
|
|
35
|
+
accepts: AcceptsEntry[];
|
|
36
|
+
resource: Resource;
|
|
37
|
+
error?: string | undefined;
|
|
38
|
+
extensions?: Record<string, unknown> | undefined;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* V1 accepts array entry (different field names from v2)
|
|
42
|
+
*/
|
|
43
|
+
interface V1AcceptsEntry {
|
|
44
|
+
scheme: string;
|
|
45
|
+
network: string;
|
|
46
|
+
maxAmountRequired: string;
|
|
47
|
+
asset: string;
|
|
48
|
+
payTo: string;
|
|
49
|
+
maxTimeoutSeconds?: number | undefined;
|
|
50
|
+
extra?: Record<string, unknown> | undefined;
|
|
51
|
+
resource?: Resource | undefined;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* x402 v1 config shape
|
|
55
|
+
*/
|
|
56
|
+
interface V1Config {
|
|
57
|
+
x402Version: 1;
|
|
58
|
+
accepts: V1AcceptsEntry[];
|
|
59
|
+
error?: string | undefined;
|
|
60
|
+
extensions?: Record<string, unknown> | undefined;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Normalized config output (canonical v2 shape)
|
|
64
|
+
*/
|
|
65
|
+
interface NormalizedConfig {
|
|
66
|
+
x402Version: 2;
|
|
67
|
+
accepts: AcceptsEntry[];
|
|
68
|
+
resource?: Resource | undefined;
|
|
69
|
+
error?: string | undefined;
|
|
70
|
+
extensions?: Record<string, unknown> | undefined;
|
|
71
|
+
}
|
|
72
|
+
//#endregion
|
|
73
|
+
//#region src/types/errors.d.ts
|
|
74
|
+
/**
|
|
75
|
+
* Error and warning code vocabulary for x402check
|
|
76
|
+
*/
|
|
77
|
+
declare const ErrorCode: {
|
|
78
|
+
readonly INVALID_JSON: "INVALID_JSON";
|
|
79
|
+
readonly NOT_OBJECT: "NOT_OBJECT";
|
|
80
|
+
readonly UNKNOWN_FORMAT: "UNKNOWN_FORMAT";
|
|
81
|
+
readonly MISSING_VERSION: "MISSING_VERSION";
|
|
82
|
+
readonly INVALID_VERSION: "INVALID_VERSION";
|
|
83
|
+
readonly MISSING_ACCEPTS: "MISSING_ACCEPTS";
|
|
84
|
+
readonly EMPTY_ACCEPTS: "EMPTY_ACCEPTS";
|
|
85
|
+
readonly INVALID_ACCEPTS: "INVALID_ACCEPTS";
|
|
86
|
+
readonly MISSING_SCHEME: "MISSING_SCHEME";
|
|
87
|
+
readonly MISSING_NETWORK: "MISSING_NETWORK";
|
|
88
|
+
readonly INVALID_NETWORK_FORMAT: "INVALID_NETWORK_FORMAT";
|
|
89
|
+
readonly MISSING_AMOUNT: "MISSING_AMOUNT";
|
|
90
|
+
readonly INVALID_AMOUNT: "INVALID_AMOUNT";
|
|
91
|
+
readonly ZERO_AMOUNT: "ZERO_AMOUNT";
|
|
92
|
+
readonly MISSING_ASSET: "MISSING_ASSET";
|
|
93
|
+
readonly MISSING_PAY_TO: "MISSING_PAY_TO";
|
|
94
|
+
readonly MISSING_RESOURCE: "MISSING_RESOURCE";
|
|
95
|
+
readonly INVALID_URL: "INVALID_URL";
|
|
96
|
+
readonly INVALID_TIMEOUT: "INVALID_TIMEOUT";
|
|
97
|
+
readonly INVALID_EVM_ADDRESS: "INVALID_EVM_ADDRESS";
|
|
98
|
+
readonly BAD_EVM_CHECKSUM: "BAD_EVM_CHECKSUM";
|
|
99
|
+
readonly NO_EVM_CHECKSUM: "NO_EVM_CHECKSUM";
|
|
100
|
+
readonly INVALID_SOLANA_ADDRESS: "INVALID_SOLANA_ADDRESS";
|
|
101
|
+
readonly ADDRESS_NETWORK_MISMATCH: "ADDRESS_NETWORK_MISMATCH";
|
|
102
|
+
readonly UNKNOWN_NETWORK: "UNKNOWN_NETWORK";
|
|
103
|
+
readonly UNKNOWN_ASSET: "UNKNOWN_ASSET";
|
|
104
|
+
readonly LEGACY_FORMAT: "LEGACY_FORMAT";
|
|
105
|
+
readonly MISSING_MAX_TIMEOUT: "MISSING_MAX_TIMEOUT";
|
|
106
|
+
};
|
|
107
|
+
type ErrorCode = typeof ErrorCode[keyof typeof ErrorCode];
|
|
108
|
+
/**
|
|
109
|
+
* Human-readable error messages for all error codes
|
|
110
|
+
*/
|
|
111
|
+
declare const ErrorMessages: {
|
|
112
|
+
INVALID_JSON: string;
|
|
113
|
+
NOT_OBJECT: string;
|
|
114
|
+
UNKNOWN_FORMAT: string;
|
|
115
|
+
MISSING_VERSION: string;
|
|
116
|
+
INVALID_VERSION: string;
|
|
117
|
+
MISSING_ACCEPTS: string;
|
|
118
|
+
EMPTY_ACCEPTS: string;
|
|
119
|
+
INVALID_ACCEPTS: string;
|
|
120
|
+
MISSING_SCHEME: string;
|
|
121
|
+
MISSING_NETWORK: string;
|
|
122
|
+
INVALID_NETWORK_FORMAT: string;
|
|
123
|
+
MISSING_AMOUNT: string;
|
|
124
|
+
INVALID_AMOUNT: string;
|
|
125
|
+
ZERO_AMOUNT: string;
|
|
126
|
+
MISSING_ASSET: string;
|
|
127
|
+
MISSING_PAY_TO: string;
|
|
128
|
+
MISSING_RESOURCE: string;
|
|
129
|
+
INVALID_URL: string;
|
|
130
|
+
INVALID_TIMEOUT: string;
|
|
131
|
+
INVALID_EVM_ADDRESS: string;
|
|
132
|
+
BAD_EVM_CHECKSUM: string;
|
|
133
|
+
NO_EVM_CHECKSUM: string;
|
|
134
|
+
INVALID_SOLANA_ADDRESS: string;
|
|
135
|
+
ADDRESS_NETWORK_MISMATCH: string;
|
|
136
|
+
UNKNOWN_NETWORK: string;
|
|
137
|
+
UNKNOWN_ASSET: string;
|
|
138
|
+
LEGACY_FORMAT: string;
|
|
139
|
+
MISSING_MAX_TIMEOUT: string;
|
|
140
|
+
};
|
|
141
|
+
//#endregion
|
|
142
|
+
//#region src/types/validation.d.ts
|
|
143
|
+
/**
|
|
144
|
+
* Issue severity level
|
|
145
|
+
*/
|
|
146
|
+
type Severity = 'error' | 'warning';
|
|
147
|
+
/**
|
|
148
|
+
* Validation issue detail
|
|
149
|
+
*/
|
|
150
|
+
interface ValidationIssue {
|
|
151
|
+
code: ErrorCode;
|
|
152
|
+
field: string;
|
|
153
|
+
message: string;
|
|
154
|
+
severity: Severity;
|
|
155
|
+
fix?: string | undefined;
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Validation result with errors, warnings, and normalized config
|
|
159
|
+
*/
|
|
160
|
+
interface ValidationResult {
|
|
161
|
+
valid: boolean;
|
|
162
|
+
version: ConfigFormat;
|
|
163
|
+
errors: ValidationIssue[];
|
|
164
|
+
warnings: ValidationIssue[];
|
|
165
|
+
normalized: NormalizedConfig | null;
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Parsed input result (for parseInput utility)
|
|
169
|
+
*/
|
|
170
|
+
interface ParsedInput {
|
|
171
|
+
parsed: unknown;
|
|
172
|
+
error?: ValidationIssue | undefined;
|
|
173
|
+
}
|
|
174
|
+
//#endregion
|
|
175
|
+
//#region src/types/parse-input.d.ts
|
|
176
|
+
/**
|
|
177
|
+
* Parse input that may be either a JSON string or an object
|
|
178
|
+
* API-04: Accept string | object
|
|
179
|
+
*/
|
|
180
|
+
declare function parseInput(input: string | object): ParsedInput;
|
|
181
|
+
//#endregion
|
|
182
|
+
//#region src/registries/networks.d.ts
|
|
183
|
+
type NetworkType = 'evm' | 'solana' | 'stellar' | 'aptos';
|
|
184
|
+
interface NetworkInfo {
|
|
185
|
+
name: string;
|
|
186
|
+
type: NetworkType;
|
|
187
|
+
testnet: boolean;
|
|
188
|
+
}
|
|
189
|
+
declare const CAIP2_REGEX: RegExp;
|
|
190
|
+
declare const KNOWN_NETWORKS: {
|
|
191
|
+
readonly 'eip155:8453': {
|
|
192
|
+
readonly name: "Base";
|
|
193
|
+
readonly type: "evm";
|
|
194
|
+
readonly testnet: false;
|
|
195
|
+
};
|
|
196
|
+
readonly 'eip155:84532': {
|
|
197
|
+
readonly name: "Base Sepolia";
|
|
198
|
+
readonly type: "evm";
|
|
199
|
+
readonly testnet: true;
|
|
200
|
+
};
|
|
201
|
+
readonly 'eip155:43114': {
|
|
202
|
+
readonly name: "Avalanche C-Chain";
|
|
203
|
+
readonly type: "evm";
|
|
204
|
+
readonly testnet: false;
|
|
205
|
+
};
|
|
206
|
+
readonly 'eip155:43113': {
|
|
207
|
+
readonly name: "Avalanche Fuji";
|
|
208
|
+
readonly type: "evm";
|
|
209
|
+
readonly testnet: true;
|
|
210
|
+
};
|
|
211
|
+
readonly 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp': {
|
|
212
|
+
readonly name: "Solana Mainnet";
|
|
213
|
+
readonly type: "solana";
|
|
214
|
+
readonly testnet: false;
|
|
215
|
+
};
|
|
216
|
+
readonly 'solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1': {
|
|
217
|
+
readonly name: "Solana Devnet";
|
|
218
|
+
readonly type: "solana";
|
|
219
|
+
readonly testnet: true;
|
|
220
|
+
};
|
|
221
|
+
readonly 'solana:4uhcVJyU9pJkvQyS88uRDiswHXSCkY3z': {
|
|
222
|
+
readonly name: "Solana Testnet";
|
|
223
|
+
readonly type: "solana";
|
|
224
|
+
readonly testnet: true;
|
|
225
|
+
};
|
|
226
|
+
readonly 'stellar:pubnet': {
|
|
227
|
+
readonly name: "Stellar Mainnet";
|
|
228
|
+
readonly type: "stellar";
|
|
229
|
+
readonly testnet: false;
|
|
230
|
+
};
|
|
231
|
+
readonly 'stellar:testnet': {
|
|
232
|
+
readonly name: "Stellar Testnet";
|
|
233
|
+
readonly type: "stellar";
|
|
234
|
+
readonly testnet: true;
|
|
235
|
+
};
|
|
236
|
+
readonly 'aptos:1': {
|
|
237
|
+
readonly name: "Aptos Mainnet";
|
|
238
|
+
readonly type: "aptos";
|
|
239
|
+
readonly testnet: false;
|
|
240
|
+
};
|
|
241
|
+
readonly 'aptos:2': {
|
|
242
|
+
readonly name: "Aptos Testnet";
|
|
243
|
+
readonly type: "aptos";
|
|
244
|
+
readonly testnet: true;
|
|
245
|
+
};
|
|
246
|
+
};
|
|
247
|
+
declare function isValidCaip2(value: string): boolean;
|
|
248
|
+
declare function isKnownNetwork(caip2: string): boolean;
|
|
249
|
+
declare function getNetworkInfo(caip2: string): NetworkInfo | undefined;
|
|
250
|
+
declare function getNetworkNamespace(caip2: string): string | undefined;
|
|
251
|
+
//#endregion
|
|
252
|
+
//#region src/registries/assets.d.ts
|
|
253
|
+
interface AssetInfo {
|
|
254
|
+
symbol: string;
|
|
255
|
+
name: string;
|
|
256
|
+
decimals: number;
|
|
257
|
+
}
|
|
258
|
+
declare const KNOWN_ASSETS: {
|
|
259
|
+
readonly 'eip155:8453': {
|
|
260
|
+
readonly '0x833589fcd6edb6e08f4c7c32d4f71b54bda02913': {
|
|
261
|
+
readonly symbol: "USDC";
|
|
262
|
+
readonly name: "USD Coin";
|
|
263
|
+
readonly decimals: 6;
|
|
264
|
+
};
|
|
265
|
+
};
|
|
266
|
+
readonly 'eip155:84532': {
|
|
267
|
+
readonly '0x036cbd53842c5426634e7929541ec2318f3dcf7e': {
|
|
268
|
+
readonly symbol: "USDC";
|
|
269
|
+
readonly name: "USD Coin";
|
|
270
|
+
readonly decimals: 6;
|
|
271
|
+
};
|
|
272
|
+
};
|
|
273
|
+
readonly 'eip155:43114': {
|
|
274
|
+
readonly '0xb97ef9ef8734c71904d8002f8b6bc66dd9c48a6e': {
|
|
275
|
+
readonly symbol: "USDC";
|
|
276
|
+
readonly name: "USD Coin";
|
|
277
|
+
readonly decimals: 6;
|
|
278
|
+
};
|
|
279
|
+
};
|
|
280
|
+
readonly 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp': {
|
|
281
|
+
readonly EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v: {
|
|
282
|
+
readonly symbol: "USDC";
|
|
283
|
+
readonly name: "USD Coin";
|
|
284
|
+
readonly decimals: 6;
|
|
285
|
+
};
|
|
286
|
+
};
|
|
287
|
+
};
|
|
288
|
+
declare function isKnownAsset(network: string, address: string): boolean;
|
|
289
|
+
declare function getAssetInfo(network: string, address: string): AssetInfo | undefined;
|
|
290
|
+
//#endregion
|
|
291
|
+
//#region src/registries/simple-names.d.ts
|
|
292
|
+
declare const SIMPLE_NAME_TO_CAIP2: {
|
|
293
|
+
readonly base: "eip155:8453";
|
|
294
|
+
readonly 'base-sepolia': "eip155:84532";
|
|
295
|
+
readonly base_sepolia: "eip155:84532";
|
|
296
|
+
readonly avalanche: "eip155:43114";
|
|
297
|
+
readonly 'avalanche-fuji': "eip155:43113";
|
|
298
|
+
readonly solana: "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp";
|
|
299
|
+
readonly 'solana-devnet': "solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1";
|
|
300
|
+
readonly 'solana-testnet': "solana:4uhcVJyU9pJkvQyS88uRDiswHXSCkY3z";
|
|
301
|
+
readonly stellar: "stellar:pubnet";
|
|
302
|
+
readonly 'stellar-testnet': "stellar:testnet";
|
|
303
|
+
readonly aptos: "aptos:1";
|
|
304
|
+
};
|
|
305
|
+
declare function getCanonicalNetwork(name: string): string | undefined;
|
|
306
|
+
//#endregion
|
|
307
|
+
//#region src/detection/detect.d.ts
|
|
308
|
+
/**
|
|
309
|
+
* Detect the format of an x402 config
|
|
310
|
+
*
|
|
311
|
+
* @param input - JSON string or parsed object
|
|
312
|
+
* @returns ConfigFormat literal: 'v2' | 'v1' | 'unknown'
|
|
313
|
+
*
|
|
314
|
+
* Detection requires x402Version field:
|
|
315
|
+
* 1. v2: accepts array + x402Version: 2
|
|
316
|
+
* 2. v1: accepts array + x402Version: 1
|
|
317
|
+
* 3. unknown: anything else (including versionless configs)
|
|
318
|
+
*/
|
|
319
|
+
declare function detect(input: string | object): ConfigFormat;
|
|
320
|
+
//#endregion
|
|
321
|
+
//#region src/detection/normalize.d.ts
|
|
322
|
+
/**
|
|
323
|
+
* Normalize any x402 config format to canonical v2 shape
|
|
324
|
+
*
|
|
325
|
+
* @param input - JSON string or parsed object
|
|
326
|
+
* @returns NormalizedConfig or null if format is unknown/invalid
|
|
327
|
+
*
|
|
328
|
+
* Normalization rules:
|
|
329
|
+
* - v2: Pass through with new object (FMT-07)
|
|
330
|
+
* - v1: Map maxAmountRequired → amount, lift per-entry resource (FMT-06)
|
|
331
|
+
* - unknown: Return null
|
|
332
|
+
*
|
|
333
|
+
* All transformations preserve extensions and extra fields (FMT-08)
|
|
334
|
+
*/
|
|
335
|
+
declare function normalize(input: string | object): NormalizedConfig | null;
|
|
336
|
+
//#endregion
|
|
337
|
+
//#region src/crypto/keccak256.d.ts
|
|
338
|
+
/**
|
|
339
|
+
* Keccak-256 hash function wrapper
|
|
340
|
+
* Uses @noble/hashes for audited, tree-shakeable implementation
|
|
341
|
+
*/
|
|
342
|
+
/**
|
|
343
|
+
* Compute Keccak-256 hash (NOT SHA-3)
|
|
344
|
+
*
|
|
345
|
+
* @param input - String or Uint8Array to hash
|
|
346
|
+
* @returns Lowercase hex string (64 chars, no 0x prefix)
|
|
347
|
+
*/
|
|
348
|
+
declare function keccak256(input: string | Uint8Array): string;
|
|
349
|
+
//#endregion
|
|
350
|
+
//#region src/crypto/base58.d.ts
|
|
351
|
+
/**
|
|
352
|
+
* Base58 decoder wrapper
|
|
353
|
+
* Uses @scure/base for audited, tree-shakeable implementation
|
|
354
|
+
*/
|
|
355
|
+
/**
|
|
356
|
+
* Decode a Base58-encoded string to bytes
|
|
357
|
+
*
|
|
358
|
+
* Preserves leading zero bytes (represented as leading '1' characters)
|
|
359
|
+
*
|
|
360
|
+
* @param input - Base58 string
|
|
361
|
+
* @returns Decoded bytes
|
|
362
|
+
* @throws Error if input contains invalid Base58 characters
|
|
363
|
+
*/
|
|
364
|
+
declare function decodeBase58(input: string): Uint8Array;
|
|
365
|
+
//#endregion
|
|
366
|
+
//#region src/crypto/eip55.d.ts
|
|
367
|
+
/**
|
|
368
|
+
* EIP-55 mixed-case checksum address encoding
|
|
369
|
+
* Spec: https://eips.ethereum.org/EIPS/eip-55
|
|
370
|
+
*/
|
|
371
|
+
/**
|
|
372
|
+
* Convert an Ethereum address to EIP-55 checksummed format
|
|
373
|
+
*
|
|
374
|
+
* @param address - 42-character hex address (0x-prefixed)
|
|
375
|
+
* @returns Checksummed address with mixed case
|
|
376
|
+
*/
|
|
377
|
+
declare function toChecksumAddress(address: string): string;
|
|
378
|
+
/**
|
|
379
|
+
* Check if an address has valid EIP-55 checksum
|
|
380
|
+
*
|
|
381
|
+
* Returns false for all-lowercase or all-uppercase addresses
|
|
382
|
+
* (these are valid formats but do not match their checksummed version)
|
|
383
|
+
*
|
|
384
|
+
* @param address - Address to validate
|
|
385
|
+
* @returns True if checksum is valid
|
|
386
|
+
*/
|
|
387
|
+
declare function isValidChecksum(address: string): boolean;
|
|
388
|
+
//#endregion
|
|
389
|
+
//#region src/validation/evm-address.d.ts
|
|
390
|
+
/**
|
|
391
|
+
* Validate an EVM address format and checksum
|
|
392
|
+
*
|
|
393
|
+
* Returns errors for invalid format, warnings for checksum issues
|
|
394
|
+
*
|
|
395
|
+
* @param address - Address to validate
|
|
396
|
+
* @param field - Field path for error reporting
|
|
397
|
+
* @returns Array of validation issues (empty if valid)
|
|
398
|
+
*/
|
|
399
|
+
declare function validateEvmAddress(address: string, field: string): ValidationIssue[];
|
|
400
|
+
//#endregion
|
|
401
|
+
//#region src/validation/solana-address.d.ts
|
|
402
|
+
/**
|
|
403
|
+
* Validate a Solana address (Base58 encoded public key)
|
|
404
|
+
*
|
|
405
|
+
* Checks Base58 format and verifies decoded length is exactly 32 bytes
|
|
406
|
+
*
|
|
407
|
+
* @param address - Address to validate
|
|
408
|
+
* @param field - Field path for error reporting
|
|
409
|
+
* @returns Array of validation issues (empty if valid)
|
|
410
|
+
*/
|
|
411
|
+
declare function validateSolanaAddress(address: string, field: string): ValidationIssue[];
|
|
412
|
+
//#endregion
|
|
413
|
+
//#region src/validation/address.d.ts
|
|
414
|
+
/**
|
|
415
|
+
* Validate an address for a specific network
|
|
416
|
+
*
|
|
417
|
+
* Dispatches to appropriate chain-specific validator based on CAIP-2 namespace:
|
|
418
|
+
* - eip155:* → EVM address validation
|
|
419
|
+
* - solana:* → Solana address validation
|
|
420
|
+
* - stellar:*, aptos:* → Accept any string (deep validation deferred)
|
|
421
|
+
* - Unknown namespaces → Accept any string (registry warnings handled elsewhere)
|
|
422
|
+
*
|
|
423
|
+
* Cross-chain mismatches are caught naturally by dispatch:
|
|
424
|
+
* - EVM address (0x...) on Solana network → fails Solana Base58 validation
|
|
425
|
+
* - Solana address on EVM network → fails EVM 0x-prefix validation
|
|
426
|
+
*
|
|
427
|
+
* @param address - Address to validate
|
|
428
|
+
* @param network - CAIP-2 network identifier
|
|
429
|
+
* @param field - Field path for error reporting
|
|
430
|
+
* @returns Array of validation issues (empty if valid)
|
|
431
|
+
*/
|
|
432
|
+
declare function validateAddress(address: string, network: string, field: string): ValidationIssue[];
|
|
433
|
+
//#endregion
|
|
434
|
+
//#region src/validation/orchestrator.d.ts
|
|
435
|
+
/**
|
|
436
|
+
* Options for the validate() orchestrator
|
|
437
|
+
*/
|
|
438
|
+
interface ValidationOptions {
|
|
439
|
+
/** When true, all warnings are promoted to errors */
|
|
440
|
+
strict?: boolean | undefined;
|
|
441
|
+
}
|
|
442
|
+
/**
|
|
443
|
+
* Validate an x402 config through the full pipeline.
|
|
444
|
+
*
|
|
445
|
+
* Takes any input (JSON string or object), runs it through:
|
|
446
|
+
* 1. Structure validation (parse, object check, format detection)
|
|
447
|
+
* 2. Normalization to canonical v2 shape
|
|
448
|
+
* 3. Version, accepts, resource validation
|
|
449
|
+
* 4. Per-entry field, network, asset, amount, timeout, address validation
|
|
450
|
+
* 5. Legacy format warnings
|
|
451
|
+
* 6. Strict mode promotion (warnings -> errors)
|
|
452
|
+
*
|
|
453
|
+
* NEVER throws -- all invalid inputs produce structured error results.
|
|
454
|
+
*
|
|
455
|
+
* @param input - JSON string or parsed object to validate
|
|
456
|
+
* @param options - Validation options (e.g. strict mode)
|
|
457
|
+
* @returns Structured validation result
|
|
458
|
+
*/
|
|
459
|
+
declare function validate(input: string | object, options?: ValidationOptions | undefined): ValidationResult;
|
|
460
|
+
//#endregion
|
|
461
|
+
//#region src/index.d.ts
|
|
462
|
+
declare const VERSION: "0.0.1";
|
|
463
|
+
//#endregion
|
|
464
|
+
export { AcceptsEntry, AssetInfo, CAIP2_REGEX, ConfigFormat, ErrorCode, ErrorMessages, KNOWN_ASSETS, KNOWN_NETWORKS, NetworkInfo, NetworkType, NormalizedConfig, ParsedInput, Resource, SIMPLE_NAME_TO_CAIP2, Severity, V1AcceptsEntry, V1Config, V2Config, VERSION, ValidationIssue, type ValidationOptions, ValidationResult, decodeBase58, detect, getAssetInfo, getCanonicalNetwork, getNetworkInfo, getNetworkNamespace, isKnownAsset, isKnownNetwork, isValidCaip2, isValidChecksum, keccak256, normalize, parseInput, toChecksumAddress, validate, validateAddress, validateEvmAddress, validateSolanaAddress };
|
|
465
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/types/config.ts","../src/types/errors.ts","../src/types/validation.ts","../src/types/parse-input.ts","../src/registries/networks.ts","../src/registries/assets.ts","../src/registries/simple-names.ts","../src/detection/detect.ts","../src/detection/normalize.ts","../src/crypto/keccak256.ts","../src/crypto/base58.ts","../src/crypto/eip55.ts","../src/validation/evm-address.ts","../src/validation/solana-address.ts","../src/validation/address.ts","../src/validation/orchestrator.ts","../src/index.ts"],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
var x402Validate=(function(e){let t={INVALID_JSON:`INVALID_JSON`,NOT_OBJECT:`NOT_OBJECT`,UNKNOWN_FORMAT:`UNKNOWN_FORMAT`,MISSING_VERSION:`MISSING_VERSION`,INVALID_VERSION:`INVALID_VERSION`,MISSING_ACCEPTS:`MISSING_ACCEPTS`,EMPTY_ACCEPTS:`EMPTY_ACCEPTS`,INVALID_ACCEPTS:`INVALID_ACCEPTS`,MISSING_SCHEME:`MISSING_SCHEME`,MISSING_NETWORK:`MISSING_NETWORK`,INVALID_NETWORK_FORMAT:`INVALID_NETWORK_FORMAT`,MISSING_AMOUNT:`MISSING_AMOUNT`,INVALID_AMOUNT:`INVALID_AMOUNT`,ZERO_AMOUNT:`ZERO_AMOUNT`,MISSING_ASSET:`MISSING_ASSET`,MISSING_PAY_TO:`MISSING_PAY_TO`,MISSING_RESOURCE:`MISSING_RESOURCE`,INVALID_URL:`INVALID_URL`,INVALID_TIMEOUT:`INVALID_TIMEOUT`,INVALID_EVM_ADDRESS:`INVALID_EVM_ADDRESS`,BAD_EVM_CHECKSUM:`BAD_EVM_CHECKSUM`,NO_EVM_CHECKSUM:`NO_EVM_CHECKSUM`,INVALID_SOLANA_ADDRESS:`INVALID_SOLANA_ADDRESS`,ADDRESS_NETWORK_MISMATCH:`ADDRESS_NETWORK_MISMATCH`,UNKNOWN_NETWORK:`UNKNOWN_NETWORK`,UNKNOWN_ASSET:`UNKNOWN_ASSET`,LEGACY_FORMAT:`LEGACY_FORMAT`,MISSING_MAX_TIMEOUT:`MISSING_MAX_TIMEOUT`},n={INVALID_JSON:`Input is not valid JSON`,NOT_OBJECT:`Input must be an object`,UNKNOWN_FORMAT:`Missing required x402Version field (must be 1 or 2)`,MISSING_VERSION:`Missing required field: x402Version`,INVALID_VERSION:`Invalid x402Version value (must be 1 or 2)`,MISSING_ACCEPTS:`Missing required field: accepts`,EMPTY_ACCEPTS:`accepts array cannot be empty`,INVALID_ACCEPTS:`accepts must be an array`,MISSING_SCHEME:`Missing required field: scheme`,MISSING_NETWORK:`Missing required field: network`,INVALID_NETWORK_FORMAT:`Network must use CAIP-2 format (namespace:reference), e.g. eip155:8453`,MISSING_AMOUNT:`Missing required field: amount`,INVALID_AMOUNT:`Amount must be a numeric string in atomic units`,ZERO_AMOUNT:`Amount must be greater than zero`,MISSING_ASSET:`Missing required field: asset`,MISSING_PAY_TO:`Missing required field: payTo`,MISSING_RESOURCE:`Missing required field: resource`,INVALID_URL:`resource.url is not a valid URL format`,INVALID_TIMEOUT:`maxTimeoutSeconds must be a positive integer`,INVALID_EVM_ADDRESS:`Invalid EVM address format`,BAD_EVM_CHECKSUM:`EVM address has invalid checksum`,NO_EVM_CHECKSUM:`EVM address is all-lowercase with no checksum protection`,INVALID_SOLANA_ADDRESS:`Invalid Solana address format`,ADDRESS_NETWORK_MISMATCH:`Address format does not match network type`,UNKNOWN_NETWORK:`Network is not in the known registry -- config may still work but cannot be fully validated`,UNKNOWN_ASSET:`Asset is not in the known registry -- config may still work but cannot be fully validated`,LEGACY_FORMAT:`Config uses legacy flat format -- consider upgrading to x402 v2`,MISSING_MAX_TIMEOUT:`Consider adding maxTimeoutSeconds for better security`};function r(e){if(typeof e==`string`)try{return{parsed:JSON.parse(e)}}catch{return{parsed:null,error:{code:t.INVALID_JSON,field:`$`,message:n.INVALID_JSON,severity:`error`}}}return{parsed:e}}let i=/^[-a-z0-9]{3,8}:[-_a-zA-Z0-9]{1,32}$/,a={"eip155:8453":{name:`Base`,type:`evm`,testnet:!1},"eip155:84532":{name:`Base Sepolia`,type:`evm`,testnet:!0},"eip155:43114":{name:`Avalanche C-Chain`,type:`evm`,testnet:!1},"eip155:43113":{name:`Avalanche Fuji`,type:`evm`,testnet:!0},"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp":{name:`Solana Mainnet`,type:`solana`,testnet:!1},"solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1":{name:`Solana Devnet`,type:`solana`,testnet:!0},"solana:4uhcVJyU9pJkvQyS88uRDiswHXSCkY3z":{name:`Solana Testnet`,type:`solana`,testnet:!0},"stellar:pubnet":{name:`Stellar Mainnet`,type:`stellar`,testnet:!1},"stellar:testnet":{name:`Stellar Testnet`,type:`stellar`,testnet:!0},"aptos:1":{name:`Aptos Mainnet`,type:`aptos`,testnet:!1},"aptos:2":{name:`Aptos Testnet`,type:`aptos`,testnet:!0}};function o(e){return i.test(e)}function s(e){return e in a}function c(e){return a[e]}function l(e){if(!o(e))return;let t=e.indexOf(`:`);return t>0?e.substring(0,t):void 0}let u={"eip155:8453":{"0x833589fcd6edb6e08f4c7c32d4f71b54bda02913":{symbol:`USDC`,name:`USD Coin`,decimals:6}},"eip155:84532":{"0x036cbd53842c5426634e7929541ec2318f3dcf7e":{symbol:`USDC`,name:`USD Coin`,decimals:6}},"eip155:43114":{"0xb97ef9ef8734c71904d8002f8b6bc66dd9c48a6e":{symbol:`USDC`,name:`USD Coin`,decimals:6}},"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp":{EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v:{symbol:`USDC`,name:`USD Coin`,decimals:6}}};function d(e,t){let n=u[e];return n?(l(e)===`eip155`?t.toLowerCase():t)in n:!1}function ee(e,t){let n=u[e];if(n)return n[l(e)===`eip155`?t.toLowerCase():t]}let f={base:`eip155:8453`,"base-sepolia":`eip155:84532`,base_sepolia:`eip155:84532`,avalanche:`eip155:43114`,"avalanche-fuji":`eip155:43113`,solana:`solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp`,"solana-devnet":`solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1`,"solana-testnet":`solana:4uhcVJyU9pJkvQyS88uRDiswHXSCkY3z`,stellar:`stellar:pubnet`,"stellar-testnet":`stellar:testnet`,aptos:`aptos:1`};function p(e){return f[e.toLowerCase()]}function m(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function h(e){return`accepts`in e&&Array.isArray(e.accepts)}function te(e){return!m(e)||!h(e)?!1:`x402Version`in e&&e.x402Version===2}function ne(e){return!m(e)||!h(e)?!1:`x402Version`in e&&e.x402Version===1}function g(e){let{parsed:t,error:n}=r(e);return n?`unknown`:te(t)?`v2`:ne(t)?`v1`:`unknown`}function _(e){let{parsed:t,error:n}=r(e);if(n)return null;let i=g(t);switch(i){case`v2`:return re(t);case`v1`:return ie(t);case`unknown`:return null;default:return i}}function re(e){let t={x402Version:2,accepts:[...e.accepts],resource:e.resource};return e.error!==void 0&&(t.error=e.error),e.extensions!==void 0&&(t.extensions=e.extensions),t}function ie(e){let t,n={x402Version:2,accepts:e.accepts.map(e=>{e.resource&&!t&&(t=e.resource);let n={scheme:e.scheme,network:e.network,amount:e.maxAmountRequired,asset:e.asset,payTo:e.payTo};return e.maxTimeoutSeconds!==void 0&&(n.maxTimeoutSeconds=e.maxTimeoutSeconds),e.extra!==void 0&&(n.extra=e.extra),n})};return t!==void 0&&(n.resource=t),e.error!==void 0&&(n.error=e.error),e.extensions!==void 0&&(n.extensions=e.extensions),n}let v=BigInt(2**32-1),y=BigInt(32);function ae(e,t=!1){return t?{h:Number(e&v),l:Number(e>>y&v)}:{h:Number(e>>y&v)|0,l:Number(e&v)|0}}function oe(e,t=!1){let n=e.length,r=new Uint32Array(n),i=new Uint32Array(n);for(let a=0;a<n;a++){let{h:n,l:o}=ae(e[a],t);[r[a],i[a]]=[n,o]}return[r,i]}let se=(e,t,n)=>e<<n|t>>>32-n,ce=(e,t,n)=>t<<n|e>>>32-n,le=(e,t,n)=>t<<n-32|e>>>64-n,ue=(e,t,n)=>e<<n-32|t>>>64-n;
|
|
2
|
+
/*! noble-hashes - MIT License (c) 2022 Paul Miller (paulmillr.com) */
|
|
3
|
+
function de(e){return e instanceof Uint8Array||ArrayBuffer.isView(e)&&e.constructor.name===`Uint8Array`}function fe(e,t=``){if(!Number.isSafeInteger(e)||e<0){let n=t&&`"${t}" `;throw Error(`${n}expected integer >= 0, got ${e}`)}}function b(e,t,n=``){let r=de(e),i=e?.length,a=t!==void 0;if(!r||a&&i!==t){let o=n&&`"${n}" `,s=a?` of length ${t}`:``,c=r?`length=${i}`:`type=${typeof e}`;throw Error(o+`expected Uint8Array`+s+`, got `+c)}return e}function pe(e,t=!0){if(e.destroyed)throw Error(`Hash instance has been destroyed`);if(t&&e.finished)throw Error(`Hash#digest() has already been called`)}function me(e,t){b(e,void 0,`digestInto() output`);let n=t.outputLen;if(e.length<n)throw Error(`"digestInto() output" expected to be of length >=`+n)}function he(e){return new Uint32Array(e.buffer,e.byteOffset,Math.floor(e.byteLength/4))}function x(...e){for(let t=0;t<e.length;t++)e[t].fill(0)}let ge=new Uint8Array(new Uint32Array([287454020]).buffer)[0]===68;function _e(e){return e<<24&4278190080|e<<8&16711680|e>>>8&65280|e>>>24&255}function ve(e){for(let t=0;t<e.length;t++)e[t]=_e(e[t]);return e}let S=ge?e=>e:ve;typeof Uint8Array.from([]).toHex==`function`&&Uint8Array.fromHex;function ye(e,t={}){let n=(t,n)=>e(n).update(t).digest(),r=e(void 0);return n.outputLen=r.outputLen,n.blockLen=r.blockLen,n.create=t=>e(t),Object.assign(n,t),Object.freeze(n)}function C(e){"@babel/helpers - typeof";return C=typeof Symbol==`function`&&typeof Symbol.iterator==`symbol`?function(e){return typeof e}:function(e){return e&&typeof Symbol==`function`&&e.constructor===Symbol&&e!==Symbol.prototype?`symbol`:typeof e},C(e)}function be(e,t){if(C(e)!=`object`||!e)return e;var n=e[Symbol.toPrimitive];if(n!==void 0){var r=n.call(e,t||`default`);if(C(r)!=`object`)return r;throw TypeError(`@@toPrimitive must return a primitive value.`)}return(t===`string`?String:Number)(e)}function xe(e){var t=be(e,`string`);return C(t)==`symbol`?t:t+``}function w(e,t,n){return(t=xe(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}let Se=BigInt(0),T=BigInt(1),Ce=BigInt(2),we=BigInt(7),Te=BigInt(256),Ee=BigInt(113),E=[],D=[],O=[];for(let e=0,t=T,n=1,r=0;e<24;e++){[n,r]=[r,(2*n+3*r)%5],E.push(2*(5*r+n)),D.push((e+1)*(e+2)/2%64);let i=Se;for(let e=0;e<7;e++)t=(t<<T^(t>>we)*Ee)%Te,t&Ce&&(i^=T<<(T<<BigInt(e))-T);O.push(i)}let k=oe(O,!0),De=k[0],Oe=k[1],A=(e,t,n)=>n>32?le(e,t,n):se(e,t,n),j=(e,t,n)=>n>32?ue(e,t,n):ce(e,t,n);function ke(e,t=24){let n=new Uint32Array(10);for(let r=24-t;r<24;r++){for(let t=0;t<10;t++)n[t]=e[t]^e[t+10]^e[t+20]^e[t+30]^e[t+40];for(let t=0;t<10;t+=2){let r=(t+8)%10,i=(t+2)%10,a=n[i],o=n[i+1],s=A(a,o,1)^n[r],c=j(a,o,1)^n[r+1];for(let n=0;n<50;n+=10)e[t+n]^=s,e[t+n+1]^=c}let t=e[2],i=e[3];for(let n=0;n<24;n++){let r=D[n],a=A(t,i,r),o=j(t,i,r),s=E[n];t=e[s],i=e[s+1],e[s]=a,e[s+1]=o}for(let t=0;t<50;t+=10){for(let r=0;r<10;r++)n[r]=e[t+r];for(let r=0;r<10;r++)e[t+r]^=~n[(r+2)%10]&n[(r+4)%10]}e[0]^=De[r],e[1]^=Oe[r]}x(n)}var Ae=class e{constructor(e,t,n,r=!1,i=24){if(w(this,`state`,void 0),w(this,`pos`,0),w(this,`posOut`,0),w(this,`finished`,!1),w(this,`state32`,void 0),w(this,`destroyed`,!1),w(this,`blockLen`,void 0),w(this,`suffix`,void 0),w(this,`outputLen`,void 0),w(this,`enableXOF`,!1),w(this,`rounds`,void 0),this.blockLen=e,this.suffix=t,this.outputLen=n,this.enableXOF=r,this.rounds=i,fe(n,`outputLen`),!(0<e&&e<200))throw Error(`only keccak-f1600 function is supported`);this.state=new Uint8Array(200),this.state32=he(this.state)}clone(){return this._cloneInto()}keccak(){S(this.state32),ke(this.state32,this.rounds),S(this.state32),this.posOut=0,this.pos=0}update(e){pe(this),b(e);let{blockLen:t,state:n}=this,r=e.length;for(let i=0;i<r;){let a=Math.min(t-this.pos,r-i);for(let t=0;t<a;t++)n[this.pos++]^=e[i++];this.pos===t&&this.keccak()}return this}finish(){if(this.finished)return;this.finished=!0;let{state:e,suffix:t,pos:n,blockLen:r}=this;e[n]^=t,t&128&&n===r-1&&this.keccak(),e[r-1]^=128,this.keccak()}writeInto(e){pe(this,!1),b(e),this.finish();let t=this.state,{blockLen:n}=this;for(let r=0,i=e.length;r<i;){this.posOut>=n&&this.keccak();let a=Math.min(n-this.posOut,i-r);e.set(t.subarray(this.posOut,this.posOut+a),r),this.posOut+=a,r+=a}return e}xofInto(e){if(!this.enableXOF)throw Error(`XOF is not possible for this instance`);return this.writeInto(e)}xof(e){return fe(e),this.xofInto(new Uint8Array(e))}digestInto(e){if(me(e,this),this.finished)throw Error(`digest() was already called`);return this.writeInto(e),this.destroy(),e}digest(){return this.digestInto(new Uint8Array(this.outputLen))}destroy(){this.destroyed=!0,x(this.state)}_cloneInto(t){let{blockLen:n,suffix:r,outputLen:i,rounds:a,enableXOF:o}=this;return t||(t=new e(n,r,i,o,a)),t.state32.set(this.state32),t.pos=this.pos,t.posOut=this.posOut,t.finished=this.finished,t.rounds=a,t.suffix=r,t.outputLen=i,t.enableXOF=o,t.destroyed=this.destroyed,t}};let je=((e,t,n,r={})=>ye(()=>new Ae(t,e,n),r))(1,136,32);function M(e){let t=je(typeof e==`string`?new TextEncoder().encode(e):e);return Array.from(t).map(e=>e.toString(16).padStart(2,`0`)).join(``)}
|
|
4
|
+
/*! scure-base - MIT License (c) 2022 Paul Miller (paulmillr.com) */
|
|
5
|
+
function N(e){return e instanceof Uint8Array||ArrayBuffer.isView(e)&&e.constructor.name===`Uint8Array`}function P(e,t){return Array.isArray(t)?t.length===0?!0:e?t.every(e=>typeof e==`string`):t.every(e=>Number.isSafeInteger(e)):!1}function F(e){if(typeof e!=`function`)throw Error(`function expected`);return!0}function I(e,t){if(typeof t!=`string`)throw Error(`${e}: string expected`);return!0}function L(e){if(!Number.isSafeInteger(e))throw Error(`invalid integer: ${e}`)}function R(e){if(!Array.isArray(e))throw Error(`array expected`)}function z(e,t){if(!P(!0,t))throw Error(`${e}: array of strings expected`)}function B(e,t){if(!P(!1,t))throw Error(`${e}: array of numbers expected`)}function V(...e){let t=e=>e,n=(e,t)=>n=>e(t(n));return{encode:e.map(e=>e.encode).reduceRight(n,t),decode:e.map(e=>e.decode).reduce(n,t)}}function H(e){let t=typeof e==`string`?e.split(``):e,n=t.length;z(`alphabet`,t);let r=new Map(t.map((e,t)=>[e,t]));return{encode:r=>(R(r),r.map(r=>{if(!Number.isSafeInteger(r)||r<0||r>=n)throw Error(`alphabet.encode: digit index outside alphabet "${r}". Allowed: ${e}`);return t[r]})),decode:t=>(R(t),t.map(t=>{I(`alphabet.decode`,t);let n=r.get(t);if(n===void 0)throw Error(`Unknown letter: "${t}". Allowed: ${e}`);return n}))}}function U(e=``){return I(`join`,e),{encode:t=>(z(`join.decode`,t),t.join(e)),decode:t=>(I(`join.decode`,t),t.split(e))}}function W(e,t=`=`){return L(e),I(`padding`,t),{encode(n){for(z(`padding.encode`,n);n.length*e%8;)n.push(t);return n},decode(n){z(`padding.decode`,n);let r=n.length;if(r*e%8)throw Error(`padding: invalid, string should have whole number of bytes`);for(;r>0&&n[r-1]===t;r--)if((r-1)*e%8==0)throw Error(`padding: invalid, string has too much padding`);return n.slice(0,r)}}}function G(e){return F(e),{encode:e=>e,decode:t=>e(t)}}function K(e,t,n){if(t<2)throw Error(`convertRadix: invalid from=${t}, base cannot be less than 2`);if(n<2)throw Error(`convertRadix: invalid to=${n}, base cannot be less than 2`);if(R(e),!e.length)return[];let r=0,i=[],a=Array.from(e,e=>{if(L(e),e<0||e>=t)throw Error(`invalid integer: ${e}`);return e}),o=a.length;for(;;){let e=0,s=!0;for(let i=r;i<o;i++){let o=a[i],c=t*e,l=c+o;if(!Number.isSafeInteger(l)||c/t!==e||l-o!==c)throw Error(`convertRadix: carry overflow`);let u=l/n;e=l%n;let d=Math.floor(u);if(a[i]=d,!Number.isSafeInteger(d)||d*n+e!==l)throw Error(`convertRadix: carry overflow`);if(s)d?s=!1:r=i;else continue}if(i.push(e),s)break}for(let t=0;t<e.length-1&&e[t]===0;t++)i.push(0);return i.reverse()}let Me=(e,t)=>t===0?e:Me(t,e%t),q=(e,t)=>e+(t-Me(e,t)),J=(()=>{let e=[];for(let t=0;t<40;t++)e.push(2**t);return e})();function Y(e,t,n,r){if(R(e),t<=0||t>32)throw Error(`convertRadix2: wrong from=${t}`);if(n<=0||n>32)throw Error(`convertRadix2: wrong to=${n}`);if(q(t,n)>32)throw Error(`convertRadix2: carry overflow from=${t} to=${n} carryBits=${q(t,n)}`);let i=0,a=0,o=J[t],s=J[n]-1,c=[];for(let r of e){if(L(r),r>=o)throw Error(`convertRadix2: invalid data word=${r} from=${t}`);if(i=i<<t|r,a+t>32)throw Error(`convertRadix2: carry overflow pos=${a} from=${t}`);for(a+=t;a>=n;a-=n)c.push((i>>a-n&s)>>>0);let e=J[a];if(e===void 0)throw Error(`invalid carry`);i&=e-1}if(i=i<<n-a&s,!r&&a>=t)throw Error(`Excess padding`);if(!r&&i>0)throw Error(`Non-zero padding: ${i}`);return r&&a>0&&c.push(i>>>0),c}function Ne(e){return L(e),{encode:t=>{if(!N(t))throw Error(`radix.encode input should be Uint8Array`);return K(Array.from(t),256,e)},decode:t=>(B(`radix.decode`,t),Uint8Array.from(K(t,e,256)))}}function X(e,t=!1){if(L(e),e<=0||e>32)throw Error(`radix2: bits should be in (0..32]`);if(q(8,e)>32||q(e,8)>32)throw Error(`radix2: carry overflow`);return{encode:n=>{if(!N(n))throw Error(`radix2.encode input should be Uint8Array`);return Y(Array.from(n),8,e,!t)},decode:n=>(B(`radix2.decode`,n),Uint8Array.from(Y(n,e,8,t)))}}function Pe(e){return F(e),function(...t){try{return e.apply(null,t)}catch{}}}V(X(4),H(`0123456789ABCDEF`),U(``)),V(X(5),H(`ABCDEFGHIJKLMNOPQRSTUVWXYZ234567`),W(5),U(``)),V(X(5),H(`ABCDEFGHIJKLMNOPQRSTUVWXYZ234567`),U(``)),V(X(5),H(`0123456789ABCDEFGHIJKLMNOPQRSTUV`),W(5),U(``)),V(X(5),H(`0123456789ABCDEFGHIJKLMNOPQRSTUV`),U(``)),V(X(5),H(`0123456789ABCDEFGHJKMNPQRSTVWXYZ`),U(``),G(e=>e.toUpperCase().replace(/O/g,`0`).replace(/[IL]/g,`1`)));let Fe=typeof Uint8Array.from([]).toBase64==`function`&&typeof Uint8Array.fromBase64==`function`;Fe||V(X(6),H(`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/`),W(6),U(``)),V(X(6),H(`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/`),U(``)),Fe||V(X(6),H(`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_`),W(6),U(``)),V(X(6),H(`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_`),U(``));let Ie=(e=>V(Ne(58),H(e),U(``)))(`123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz`),Z=V(H(`qpzry9x8gf2tvdw0s3jn54khce6mua7l`),U(``)),Le=[996825010,642813549,513874426,1027748829,705979059];function Q(e){let t=e>>25,n=(e&33554431)<<5;for(let e=0;e<Le.length;e++)(t>>e&1)==1&&(n^=Le[e]);return n}function Re(e,t,n=1){let r=e.length,i=1;for(let t=0;t<r;t++){let n=e.charCodeAt(t);if(n<33||n>126)throw Error(`Invalid prefix (${e})`);i=Q(i)^n>>5}i=Q(i);for(let t=0;t<r;t++)i=Q(i)^e.charCodeAt(t)&31;for(let e of t)i=Q(i)^e;for(let e=0;e<6;e++)i=Q(i);return i^=n,Z.encode(Y([i%J[30]],30,5,!1))}function ze(e){let t=e===`bech32`?1:734539939,n=X(5),r=n.decode,i=n.encode,a=Pe(r);function o(e,n,r=90){I(`bech32.encode prefix`,e),N(n)&&(n=Array.from(n)),B(`bech32.encode`,n);let i=e.length;if(i===0)throw TypeError(`Invalid prefix length ${i}`);let a=i+7+n.length;if(r!==!1&&a>r)throw TypeError(`Length ${a} exceeds limit ${r}`);let o=e.toLowerCase(),s=Re(o,n,t);return`${o}1${Z.encode(n)}${s}`}function s(e,n=90){I(`bech32.decode input`,e);let r=e.length;if(r<8||n!==!1&&r>n)throw TypeError(`invalid string length: ${r} (${e}). Expected (8..${n})`);let i=e.toLowerCase();if(e!==i&&e!==e.toUpperCase())throw Error(`String must be lowercase or uppercase`);let a=i.lastIndexOf(`1`);if(a===0||a===-1)throw Error(`Letter "1" must be present between prefix and data only`);let o=i.slice(0,a),s=i.slice(a+1);if(s.length<6)throw Error(`Data must be at least 6 characters long`);let c=Z.decode(s).slice(0,-6),l=Re(o,c,t);if(!s.endsWith(l))throw Error(`Invalid checksum in ${e}: expected "${l}"`);return{prefix:o,words:c}}let c=Pe(s);function l(e){let{prefix:t,words:n}=s(e,!1);return{prefix:t,words:n,bytes:r(n)}}function u(e,t){return o(e,i(t))}return{encode:o,decode:s,encodeFromBytes:u,decodeToBytes:l,decodeUnsafe:c,fromWords:r,fromWordsUnsafe:a,toWords:i}}ze(`bech32`),ze(`bech32m`),typeof Uint8Array.from([]).toHex==`function`&&typeof Uint8Array.fromHex==`function`||V(X(4),H(`0123456789abcdef`),U(``),G(e=>{if(typeof e!=`string`||e.length%2!=0)throw TypeError(`hex.decode: expected string, got ${typeof e} with length ${e.length}`);return e.toLowerCase()}));function Be(e){try{return Ie.decode(e)}catch(e){let t=e instanceof Error?e.message:String(e);throw Error(`Invalid Base58: ${t}`)}}function $(e){let t=e.slice(2).toLowerCase(),n=M(t),r=`0x`;for(let e=0;e<t.length;e++){let i=t[e],a=n[e];!i||!a||(i>=`a`&&i<=`f`?r+=parseInt(a,16)>=8?i.toUpperCase():i:r+=i)}return r}function Ve(e){return e===$(e)}let He=/^0x[0-9a-fA-F]{40}$/;function Ue(e,n){if(!He.test(e))return[{code:t.INVALID_EVM_ADDRESS,field:n,message:`EVM address must be 42 hex characters with 0x prefix`,severity:`error`,fix:`Format: 0x followed by 40 hex digits (0-9, a-f, A-F)`}];let r=e.slice(2);return e===e.toLowerCase()&&/[a-f]/.test(r)?[{code:t.NO_EVM_CHECKSUM,field:n,message:`EVM address is all-lowercase with no checksum protection`,severity:`warning`,fix:`Use checksummed address to detect typos: ${$(e)}`}]:/^[0-9A-F]{40}$/.test(r)&&/[A-F]/.test(r)||/^[0-9]{40}$/.test(r)||Ve(e)?[]:[{code:t.BAD_EVM_CHECKSUM,field:n,message:`EVM address has invalid checksum (EIP-55)`,severity:`warning`,fix:`Expected: ${$(e)}`}]}let We=/^[1-9A-HJ-NP-Za-km-z]{32,44}$/;function Ge(e,n){if(!We.test(e))return[{code:t.INVALID_SOLANA_ADDRESS,field:n,message:`Solana address must be 32-44 Base58 characters`,severity:`error`,fix:`Valid characters: 1-9, A-H, J-N, P-Z, a-k, m-z (no 0, O, I, l)`}];try{let r=Be(e);if(r.length!==32)return[{code:t.INVALID_SOLANA_ADDRESS,field:n,message:`Solana address must decode to 32 bytes, got ${r.length}`,severity:`error`,fix:`Verify address is a valid Solana public key`}]}catch(e){return[{code:t.INVALID_SOLANA_ADDRESS,field:n,message:`Invalid Base58 encoding`,severity:`error`,fix:e instanceof Error?e.message:`Check Base58 encoding`}]}return[]}function Ke(e,t,n){let r=l(t);if(r===void 0)return[];switch(r){case`eip155`:return Ue(e,n);case`solana`:return Ge(e,n);case`stellar`:case`aptos`:return[];default:return[]}}function qe(e){let i=[],{parsed:a,error:o}=r(e);if(o)return{parsed:null,format:`unknown`,issues:[o]};if(!m(a))return i.push({code:t.NOT_OBJECT,field:`$`,message:n.NOT_OBJECT,severity:`error`}),{parsed:null,format:`unknown`,issues:i};let s=g(a);return s===`unknown`&&i.push({code:t.UNKNOWN_FORMAT,field:`$`,message:n.UNKNOWN_FORMAT,severity:`error`}),{parsed:a,format:s,issues:i}}function Je(e,r){let i=[],a=e.x402Version;return a!==1&&a!==2&&i.push({code:t.INVALID_VERSION,field:`x402Version`,message:n.INVALID_VERSION,severity:`error`}),i}function Ye(e,r){let i=[];return e.scheme||i.push({code:t.MISSING_SCHEME,field:`${r}.scheme`,message:n.MISSING_SCHEME,severity:`error`}),e.network||i.push({code:t.MISSING_NETWORK,field:`${r}.network`,message:n.MISSING_NETWORK,severity:`error`}),e.amount||i.push({code:t.MISSING_AMOUNT,field:`${r}.amount`,message:n.MISSING_AMOUNT,severity:`error`}),e.asset||i.push({code:t.MISSING_ASSET,field:`${r}.asset`,message:n.MISSING_ASSET,severity:`error`}),e.payTo||i.push({code:t.MISSING_PAY_TO,field:`${r}.payTo`,message:n.MISSING_PAY_TO,severity:`error`}),i}function Xe(e){let r=[];return Array.isArray(e.accepts)?(e.accepts.length===0&&r.push({code:t.EMPTY_ACCEPTS,field:`accepts`,message:n.EMPTY_ACCEPTS,severity:`error`}),r):(r.push({code:t.INVALID_ACCEPTS,field:`accepts`,message:n.INVALID_ACCEPTS,severity:`error`}),r)}function Ze(e,r){let i=[];if(!e.resource)return r===`v2`&&i.push({code:t.MISSING_RESOURCE,field:`resource`,message:n.MISSING_RESOURCE,severity:`warning`}),i;if(!e.resource.url)return i.push({code:t.MISSING_RESOURCE,field:`resource.url`,message:n.MISSING_RESOURCE,severity:`warning`}),i;try{new URL(e.resource.url)}catch{i.push({code:t.INVALID_URL,field:`resource.url`,message:`resource.url is not a valid URL format`,severity:`warning`})}return i}function Qe(e,r){let i=[];if(!e.network)return i;if(!o(e.network)){let a=p(e.network);return a?i.push({code:t.INVALID_NETWORK_FORMAT,field:`${r}.network`,message:n.INVALID_NETWORK_FORMAT,severity:`error`,fix:`Use '${a}' instead of '${e.network}'`}):i.push({code:t.INVALID_NETWORK_FORMAT,field:`${r}.network`,message:n.INVALID_NETWORK_FORMAT,severity:`error`}),i}return s(e.network)||i.push({code:t.UNKNOWN_NETWORK,field:`${r}.network`,message:n.UNKNOWN_NETWORK,severity:`warning`}),i}function $e(e,r){let i=[];return e.asset&&e.network&&o(e.network)&&!d(e.network,e.asset)&&i.push({code:t.UNKNOWN_ASSET,field:`${r}.asset`,message:n.UNKNOWN_ASSET,severity:`warning`}),i}function et(e,r){let i=[];return e.amount?/^\d+$/.test(e.amount)?(e.amount===`0`&&i.push({code:t.ZERO_AMOUNT,field:`${r}.amount`,message:n.ZERO_AMOUNT,severity:`error`}),i):(i.push({code:t.INVALID_AMOUNT,field:`${r}.amount`,message:n.INVALID_AMOUNT,severity:`error`}),i):i}function tt(e,r,i){let a=[];return e.maxTimeoutSeconds===void 0?(i===`v2`&&a.push({code:t.MISSING_MAX_TIMEOUT,field:`${r}.maxTimeoutSeconds`,message:n.MISSING_MAX_TIMEOUT,severity:`warning`}),a):typeof e.maxTimeoutSeconds!=`number`||!Number.isInteger(e.maxTimeoutSeconds)?(a.push({code:t.INVALID_TIMEOUT,field:`${r}.maxTimeoutSeconds`,message:n.INVALID_TIMEOUT,severity:`error`}),a):(e.maxTimeoutSeconds<=0&&a.push({code:t.INVALID_TIMEOUT,field:`${r}.maxTimeoutSeconds`,message:n.INVALID_TIMEOUT,severity:`error`}),a)}function nt(e,r,i){let a=[];return r===`v1`&&a.push({code:t.LEGACY_FORMAT,field:`$`,message:n.LEGACY_FORMAT,severity:`warning`,fix:`Upgrade to x402 v2 -- use amount instead of maxAmountRequired, add resource object`}),a}function rt(e,n){try{return it(e,n)}catch{return{valid:!1,version:`unknown`,errors:[{code:t.UNKNOWN_FORMAT,field:`$`,message:`Unexpected validation error`,severity:`error`}],warnings:[],normalized:null}}}function it(e,r){let i=qe(e);if(i.issues.length>0)return{valid:!1,version:i.format||`unknown`,errors:i.issues,warnings:[],normalized:null};let a=i.parsed,o=i.format,s=_(a);if(s===null)return{valid:!1,version:o,errors:[{code:t.UNKNOWN_FORMAT,field:`$`,message:n.UNKNOWN_FORMAT,severity:`error`}],warnings:[],normalized:null};let c=[],l=[];if(c.push(...Je(s,o)),c.push(...Xe(s)),l.push(...Ze(s,o)),Array.isArray(s.accepts)&&s.accepts.length>0)for(let e=0;e<s.accepts.length;e++){let t=s.accepts[e],n=`accepts[${e}]`;c.push(...Ye(t,n));for(let e of Qe(t,n))e.severity===`error`?c.push(e):l.push(e);l.push(...$e(t,n)),c.push(...et(t,n));for(let e of tt(t,n,o))e.severity===`error`?c.push(e):l.push(e);if(t.payTo&&t.network)for(let e of Ke(t.payTo,t.network,`${n}.payTo`))e.severity===`error`?c.push(e):l.push(e)}if(l.push(...nt(s,o,a)),r?.strict===!0){for(let e of l)c.push({...e,severity:`error`});l.length=0}return{valid:c.length===0,version:o,errors:c,warnings:l,normalized:s}}return e.CAIP2_REGEX=i,e.ErrorCode=t,e.ErrorMessages=n,e.KNOWN_ASSETS=u,e.KNOWN_NETWORKS=a,e.SIMPLE_NAME_TO_CAIP2=f,e.VERSION=`0.0.1`,e.decodeBase58=Be,e.detect=g,e.getAssetInfo=ee,e.getCanonicalNetwork=p,e.getNetworkInfo=c,e.getNetworkNamespace=l,e.isKnownAsset=d,e.isKnownNetwork=s,e.isValidCaip2=o,e.isValidChecksum=Ve,e.keccak256=M,e.normalize=_,e.parseInput=r,e.toChecksumAddress=$,e.validate=rt,e.validateAddress=Ke,e.validateEvmAddress=Ue,e.validateSolanaAddress=Ge,e})({});
|