@devlab.group/agent-commerce 2.1.0 → 2.2.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/README.md +35 -5
- package/dist/ap2.js +3 -3
- package/dist/{chunk-LZS5BL3W.js → chunk-2DAJAJI7.js} +23 -5
- package/dist/chunk-2DAJAJI7.js.map +1 -0
- package/dist/{chunk-UHMYRV3J.js → chunk-BNUD4RBN.js} +22 -7
- package/dist/chunk-BNUD4RBN.js.map +1 -0
- package/dist/{chunk-IFGRCXME.js → chunk-REBY2IEP.js} +24 -20
- package/dist/chunk-REBY2IEP.js.map +1 -0
- package/dist/{chunk-SY6GUYSQ.js → chunk-XYHDQ22D.js} +3 -3
- package/dist/{chunk-SY6GUYSQ.js.map → chunk-XYHDQ22D.js.map} +1 -1
- package/dist/cli/ap2-HLBIUSTK.js +678 -0
- package/dist/cli/ap2-HLBIUSTK.js.map +1 -0
- package/dist/cli/chunk-2LN5PO5I.js +1352 -0
- package/dist/cli/chunk-2LN5PO5I.js.map +1 -0
- package/dist/cli/chunk-3EQBCFZY.js +53 -0
- package/dist/cli/chunk-3EQBCFZY.js.map +1 -0
- package/dist/cli/chunk-3M6U7ILB.js +8 -0
- package/dist/cli/chunk-3M6U7ILB.js.map +1 -0
- package/dist/cli/chunk-3MGAJ5FX.js +70 -0
- package/dist/cli/chunk-3MGAJ5FX.js.map +1 -0
- package/dist/cli/chunk-5K4XEAZV.js +113 -0
- package/dist/cli/chunk-5K4XEAZV.js.map +1 -0
- package/dist/cli/chunk-AA3FIEAR.js +27 -0
- package/dist/cli/chunk-AA3FIEAR.js.map +1 -0
- package/dist/cli/chunk-FHCFR2GS.js +17 -0
- package/dist/cli/chunk-FHCFR2GS.js.map +1 -0
- package/dist/cli/chunk-ILUYEQSV.js +1744 -0
- package/dist/cli/chunk-ILUYEQSV.js.map +1 -0
- package/dist/cli/chunk-KTV52MCU.js +338 -0
- package/dist/cli/chunk-KTV52MCU.js.map +1 -0
- package/dist/cli/chunk-OSTCU6ZK.js +44 -0
- package/dist/cli/chunk-OSTCU6ZK.js.map +1 -0
- package/dist/cli/chunk-OZ4LAWBK.js +256 -0
- package/dist/cli/chunk-OZ4LAWBK.js.map +1 -0
- package/dist/cli/chunk-QQ3WY5L3.js +271 -0
- package/dist/cli/chunk-QQ3WY5L3.js.map +1 -0
- package/dist/cli/chunk-QY3K6PEQ.js +8 -0
- package/dist/cli/chunk-QY3K6PEQ.js.map +1 -0
- package/dist/cli/chunk-QZ6TOMX6.js +1413 -0
- package/dist/cli/chunk-QZ6TOMX6.js.map +1 -0
- package/dist/cli/chunk-SNM3OVCY.js +625 -0
- package/dist/cli/chunk-SNM3OVCY.js.map +1 -0
- package/dist/cli/chunk-SPAYKVUP.js +118 -0
- package/dist/cli/chunk-SPAYKVUP.js.map +1 -0
- package/dist/cli/chunk-TPC4EJLT.js +11 -0
- package/dist/cli/chunk-TPC4EJLT.js.map +1 -0
- package/dist/cli/config-VYAJGZXE.js +11 -0
- package/dist/cli/config-VYAJGZXE.js.map +1 -0
- package/dist/cli/index.js +150 -3627
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/mcp-HFD7ZNCQ.js +559 -0
- package/dist/cli/mcp-HFD7ZNCQ.js.map +1 -0
- package/dist/cli/near-5AY3HWYF.js +58 -0
- package/dist/cli/near-5AY3HWYF.js.map +1 -0
- package/dist/cli/provider-JV5HCQGR.js +396 -0
- package/dist/cli/provider-JV5HCQGR.js.map +1 -0
- package/dist/cli/run-WV44B62Y.js +7301 -0
- package/dist/cli/run-WV44B62Y.js.map +1 -0
- package/dist/cli/svm-3MMYFPC7.js +33 -0
- package/dist/cli/svm-3MMYFPC7.js.map +1 -0
- package/dist/cli/x402-NADFV5CD.js +96 -0
- package/dist/cli/x402-NADFV5CD.js.map +1 -0
- package/dist/index.d.ts +12 -3
- package/dist/index.js +82 -11
- package/dist/index.js.map +1 -1
- package/dist/mcp.js +6 -16
- package/dist/mcp.js.map +1 -1
- package/dist/mpp.js +3 -3
- package/dist/{networks-olfflCI_.d.ts → networks-DTWRlj-K.d.ts} +2 -2
- package/dist/x402.d.ts +7 -2
- package/dist/x402.js +4 -4
- package/package.json +2 -2
- package/dist/chunk-IFGRCXME.js.map +0 -1
- package/dist/chunk-LZS5BL3W.js.map +0 -1
- package/dist/chunk-UHMYRV3J.js.map +0 -1
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
import { CommerceError } from './chunk-QQ3WY5L3.js';
|
|
2
|
+
|
|
3
|
+
// src/core/execution/settlement-order.ts
|
|
4
|
+
var SETTLE_AFTER_BACKEND_METADATA_KEY = "settleAfterBackend";
|
|
5
|
+
var REUSE_REJECTED_AUTHORIZATION_METADATA_KEY = "reuseRejectedAuthorization";
|
|
6
|
+
|
|
7
|
+
// src/payments/x402/networks.ts
|
|
8
|
+
var LOCAL_CHAIN_ID = 31337;
|
|
9
|
+
var usdc = (address, name) => ({ symbol: "USDC", address, name, version: "2", decimals: 6 });
|
|
10
|
+
var PROFILES = [
|
|
11
|
+
{
|
|
12
|
+
family: "evm",
|
|
13
|
+
id: `eip155:${LOCAL_CHAIN_ID}`,
|
|
14
|
+
chainId: LOCAL_CHAIN_ID,
|
|
15
|
+
displayName: "Local Anvil",
|
|
16
|
+
kind: "testnet",
|
|
17
|
+
local: true
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
family: "evm",
|
|
21
|
+
id: "eip155:84532",
|
|
22
|
+
chainId: 84532,
|
|
23
|
+
displayName: "Base Sepolia",
|
|
24
|
+
kind: "testnet",
|
|
25
|
+
canonicalAsset: usdc("0x036CbD53842c5426634e7929541eC2318f3dCF7e", "USDC")
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
family: "evm",
|
|
29
|
+
id: "eip155:8453",
|
|
30
|
+
chainId: 8453,
|
|
31
|
+
displayName: "Base",
|
|
32
|
+
kind: "mainnet",
|
|
33
|
+
canonicalAsset: usdc("0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913", "USD Coin")
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
family: "evm",
|
|
37
|
+
id: "eip155:1",
|
|
38
|
+
chainId: 1,
|
|
39
|
+
displayName: "Ethereum",
|
|
40
|
+
kind: "mainnet",
|
|
41
|
+
canonicalAsset: usdc("0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", "USD Coin")
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
family: "evm",
|
|
45
|
+
id: "eip155:137",
|
|
46
|
+
chainId: 137,
|
|
47
|
+
displayName: "Polygon",
|
|
48
|
+
kind: "mainnet",
|
|
49
|
+
canonicalAsset: usdc("0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359", "USD Coin")
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
family: "evm",
|
|
53
|
+
id: "eip155:42161",
|
|
54
|
+
chainId: 42161,
|
|
55
|
+
displayName: "Arbitrum One",
|
|
56
|
+
kind: "mainnet",
|
|
57
|
+
canonicalAsset: usdc("0xaf88d065e77c8cC2239327C5EDb3A432268e5831", "USD Coin")
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
family: "evm",
|
|
61
|
+
id: "eip155:421614",
|
|
62
|
+
chainId: 421614,
|
|
63
|
+
displayName: "Arbitrum Sepolia",
|
|
64
|
+
kind: "testnet",
|
|
65
|
+
canonicalAsset: usdc("0x75faf114eafb1BDbe2F0316DF893fd58CE46AA4d", "USD Coin")
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
family: "evm",
|
|
69
|
+
id: "eip155:43114",
|
|
70
|
+
chainId: 43114,
|
|
71
|
+
displayName: "Avalanche C-Chain",
|
|
72
|
+
kind: "mainnet",
|
|
73
|
+
canonicalAsset: usdc("0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E", "USD Coin")
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
family: "svm",
|
|
77
|
+
id: "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp",
|
|
78
|
+
displayName: "Solana",
|
|
79
|
+
kind: "mainnet",
|
|
80
|
+
canonicalAsset: {
|
|
81
|
+
symbol: "USDC",
|
|
82
|
+
address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
|
|
83
|
+
decimals: 6
|
|
84
|
+
}
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
family: "svm",
|
|
88
|
+
id: "solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1",
|
|
89
|
+
displayName: "Solana Devnet",
|
|
90
|
+
kind: "testnet",
|
|
91
|
+
canonicalAsset: {
|
|
92
|
+
symbol: "USDC",
|
|
93
|
+
address: "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU",
|
|
94
|
+
decimals: 6
|
|
95
|
+
}
|
|
96
|
+
},
|
|
97
|
+
// NEAR's USDC contracts are implicit accounts: 64 lowercase hex characters
|
|
98
|
+
{
|
|
99
|
+
family: "near",
|
|
100
|
+
id: "near:mainnet",
|
|
101
|
+
displayName: "NEAR",
|
|
102
|
+
kind: "mainnet",
|
|
103
|
+
canonicalAsset: {
|
|
104
|
+
symbol: "USDC",
|
|
105
|
+
address: "17208628f84f5d6ad33f0da3bbbeb27ffcb398eac501a31bd6ad2011e36133a1",
|
|
106
|
+
decimals: 6
|
|
107
|
+
}
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
family: "near",
|
|
111
|
+
id: "near:testnet",
|
|
112
|
+
displayName: "NEAR Testnet",
|
|
113
|
+
kind: "testnet",
|
|
114
|
+
canonicalAsset: {
|
|
115
|
+
symbol: "USDC",
|
|
116
|
+
address: "3e2210e1184b45b64c8a434c0a7e7b23cc04ea7eb7a6c3c32520d03d4afcb8af",
|
|
117
|
+
decimals: 6
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
];
|
|
121
|
+
var BY_ID = new Map(PROFILES.map((profile) => [profile.id, profile]));
|
|
122
|
+
var SUPPORTED_NETWORK_IDS = PROFILES.filter(
|
|
123
|
+
(p) => p.family === "evm"
|
|
124
|
+
).map((p) => p.id);
|
|
125
|
+
var EVM_NETWORK_ID = /^eip155:([1-9]\d{0,15})$/;
|
|
126
|
+
function invalid(message, path) {
|
|
127
|
+
return new CommerceError("CONFIG_INVALID", message, { details: { path } });
|
|
128
|
+
}
|
|
129
|
+
function findX402Network(id, custom) {
|
|
130
|
+
const builtIn = BY_ID.get(id);
|
|
131
|
+
if (builtIn) return builtIn;
|
|
132
|
+
const declared = custom?.[id];
|
|
133
|
+
const chainId = Number(EVM_NETWORK_ID.exec(id)?.[1]);
|
|
134
|
+
if (!declared || !Number.isSafeInteger(chainId)) return void 0;
|
|
135
|
+
return {
|
|
136
|
+
family: "evm",
|
|
137
|
+
id,
|
|
138
|
+
chainId,
|
|
139
|
+
displayName: declared.displayName,
|
|
140
|
+
kind: declared.kind
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
function requireX402Network(id, path, custom) {
|
|
144
|
+
const network = findX402Network(id, custom);
|
|
145
|
+
if (!network) {
|
|
146
|
+
throw new CommerceError(
|
|
147
|
+
"CONFIG_INVALID",
|
|
148
|
+
`${path}: "${id}" is not a known network. Built-in CAIP-2 identifiers: ${PROFILES.map((p) => p.id).join(", ")}. Declare another EVM network under payments.x402.networks with its kind and displayName.`,
|
|
149
|
+
{ details: { path, network: id } }
|
|
150
|
+
);
|
|
151
|
+
}
|
|
152
|
+
return network;
|
|
153
|
+
}
|
|
154
|
+
function validateCustomNetworks(custom, path) {
|
|
155
|
+
for (const id of Object.keys(custom)) {
|
|
156
|
+
const at = `${path}.${id}`;
|
|
157
|
+
if (BY_ID.has(id)) {
|
|
158
|
+
throw invalid(
|
|
159
|
+
`${at}: "${id}" is a built-in network and cannot be redeclared; remove this entry`,
|
|
160
|
+
at
|
|
161
|
+
);
|
|
162
|
+
}
|
|
163
|
+
if (!findX402Network(id, custom)) {
|
|
164
|
+
throw invalid(
|
|
165
|
+
`${at}: "${id}" is not an EVM CAIP-2 identifier ("eip155:" followed by a positive chain id below 2^53). Only EVM networks can be declared.`,
|
|
166
|
+
at
|
|
167
|
+
);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
function resolveDeploymentMode(profile) {
|
|
172
|
+
return profile.local ? "local" : profile.kind;
|
|
173
|
+
}
|
|
174
|
+
var LIVE_MAINNET_BANNER = "LIVE MAINNET MODE - REAL FUNDS";
|
|
175
|
+
function describeDeploymentMode(mode) {
|
|
176
|
+
return mode === "mainnet" ? LIVE_MAINNET_BANNER : mode.toUpperCase();
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
// src/payments/x402/addresses.ts
|
|
180
|
+
var EVM_ADDRESS = /^0x[0-9a-fA-F]{40}$/;
|
|
181
|
+
var EVM_ZERO = /^0x0{40}$/i;
|
|
182
|
+
var isEvmAddress = (value) => typeof value === "string" && EVM_ADDRESS.test(value);
|
|
183
|
+
var isEvmZeroAddress = (value) => EVM_ZERO.test(value);
|
|
184
|
+
var BASE58_ALPHABET = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";
|
|
185
|
+
var SOLANA_ADDRESS = /^[1-9A-HJ-NP-Za-km-z]{32,44}$/;
|
|
186
|
+
var SOLANA_ZERO = "11111111111111111111111111111111";
|
|
187
|
+
var EVM_TRANSACTION_HASH = /^0x[0-9a-fA-F]{64}$/;
|
|
188
|
+
var SOLANA_SIGNATURE = /^[1-9A-HJ-NP-Za-km-z]{64,88}$/;
|
|
189
|
+
var NEAR_ACCOUNT_ID = /^(([a-z\d]+[-_])*[a-z\d]+\.)*([a-z\d]+[-_])*[a-z\d]+$/;
|
|
190
|
+
var NEAR_TRANSACTION_HASH = /^[1-9A-HJ-NP-Za-km-z]{32,44}$/;
|
|
191
|
+
function normalizeAddress(network, value) {
|
|
192
|
+
switch (network.family) {
|
|
193
|
+
case "evm":
|
|
194
|
+
return isEvmAddress(value) ? value : void 0;
|
|
195
|
+
case "svm":
|
|
196
|
+
return SOLANA_ADDRESS.test(value) && base58ByteLength(value) === 32 ? value : void 0;
|
|
197
|
+
case "near":
|
|
198
|
+
return value.length >= 2 && value.length <= 64 && NEAR_ACCOUNT_ID.test(value) ? value : void 0;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
function isBurnAddress(network, wireAddress) {
|
|
202
|
+
switch (network.family) {
|
|
203
|
+
case "evm":
|
|
204
|
+
return isEvmZeroAddress(wireAddress);
|
|
205
|
+
case "svm":
|
|
206
|
+
return wireAddress === SOLANA_ZERO;
|
|
207
|
+
case "near":
|
|
208
|
+
return false;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
function sameAddress(network, a, b) {
|
|
212
|
+
return network.family === "evm" ? a.toLowerCase() === b.toLowerCase() : a === b;
|
|
213
|
+
}
|
|
214
|
+
function isTransactionReference(network, value) {
|
|
215
|
+
switch (network.family) {
|
|
216
|
+
case "evm":
|
|
217
|
+
return EVM_TRANSACTION_HASH.test(value);
|
|
218
|
+
case "svm":
|
|
219
|
+
return SOLANA_SIGNATURE.test(value) && base58ByteLength(value) === 64;
|
|
220
|
+
case "near":
|
|
221
|
+
return NEAR_TRANSACTION_HASH.test(value) && base58ByteLength(value) === 32;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
function base58ByteLength(value) {
|
|
225
|
+
let n = 0n;
|
|
226
|
+
for (const char of value) n = n * 58n + BigInt(BASE58_ALPHABET.indexOf(char));
|
|
227
|
+
const leadingZeros = value.length - value.replace(/^1+/, "").length;
|
|
228
|
+
return leadingZeros + (n === 0n ? 0 : Math.ceil(n.toString(16).length / 2));
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
// src/payments/x402/payment-flow.ts
|
|
232
|
+
var X402_PAYMENT_FLOWS = ["authorization", "upfront"];
|
|
233
|
+
var X402_DEFAULT_PAYMENT_FLOW = "authorization";
|
|
234
|
+
|
|
235
|
+
// src/payments/x402/local-chain/accounts.ts
|
|
236
|
+
var ANVIL_WELL_KNOWN_ACCOUNTS = [
|
|
237
|
+
{
|
|
238
|
+
address: "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266",
|
|
239
|
+
privateKey: "0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80"
|
|
240
|
+
},
|
|
241
|
+
{
|
|
242
|
+
address: "0x70997970C51812dc3A010C7d01b50e0d17dc79C8",
|
|
243
|
+
privateKey: "0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d"
|
|
244
|
+
},
|
|
245
|
+
{
|
|
246
|
+
address: "0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC",
|
|
247
|
+
privateKey: "0x5de4111afa1a4b94908f83103eb1f1706367c2e68ca870fc3fb9a804cdab365a"
|
|
248
|
+
}
|
|
249
|
+
];
|
|
250
|
+
ANVIL_WELL_KNOWN_ACCOUNTS[0];
|
|
251
|
+
ANVIL_WELL_KNOWN_ACCOUNTS[1];
|
|
252
|
+
ANVIL_WELL_KNOWN_ACCOUNTS[2];
|
|
253
|
+
|
|
254
|
+
export { ANVIL_WELL_KNOWN_ACCOUNTS, LOCAL_CHAIN_ID, REUSE_REJECTED_AUTHORIZATION_METADATA_KEY, SETTLE_AFTER_BACKEND_METADATA_KEY, SUPPORTED_NETWORK_IDS, X402_DEFAULT_PAYMENT_FLOW, X402_PAYMENT_FLOWS, describeDeploymentMode, findX402Network, isBurnAddress, isEvmAddress, isEvmZeroAddress, isTransactionReference, normalizeAddress, requireX402Network, resolveDeploymentMode, sameAddress, validateCustomNetworks };
|
|
255
|
+
//# sourceMappingURL=chunk-OZ4LAWBK.js.map
|
|
256
|
+
//# sourceMappingURL=chunk-OZ4LAWBK.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/core/execution/settlement-order.ts","../../src/payments/x402/networks.ts","../../src/payments/x402/addresses.ts","../../src/payments/x402/payment-flow.ts","../../src/payments/x402/local-chain/accounts.ts"],"names":[],"mappings":"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","file":"chunk-OZ4LAWBK.js","sourcesContent":["/**\n * Set on a payment requirement to run the backend before settlement.\n * The pipeline settles first unless this metadata value is `true`.\n */\nexport const SETTLE_AFTER_BACKEND_METADATA_KEY = 'settleAfterBackend';\n\n/**\n * Set to `true` when the rail permits presenting an authorization again after\n * its attempt was rejected, which settled nothing; the chain still spends each\n * nonce once. The pipeline lets retries reclaim the rejected attempt;\n * otherwise, it refuses them as replays.\n */\nexport const REUSE_REJECTED_AUTHORIZATION_METADATA_KEY = 'reuseRejectedAuthorization';\n","/**\n * Network profiles: family, display name, environment, EVM chain ID and\n * default stablecoin. Config load rejects unknown IDs; parsing an EVM chain\n * ID cannot establish whether it is mainnet. Merchants must declare custom\n * EVM networks under `payments.x402.networks`; built-ins cannot be redeclared.\n *\n * Profiles copy SDK asset defaults to keep config load and the CLI SDK-free.\n * Tests compare each profile with the pinned SDK tables.\n *\n * The local Anvil chain has a profile of its own, `eip155:31337` (Anvil's\n * default chain id), so the network alone tells a local deployment from a\n * public one. Local health checks still require an Anvil response, because an\n * RPC endpoint can report any chain id.\n */\nimport { CommerceError } from '../../core';\n\n/** Chain id of the local Anvil dev chain, Anvil's default */\nexport const LOCAL_CHAIN_ID = 31337;\n\nexport type X402NetworkFamily = 'evm' | 'svm' | 'near';\n\nexport type NetworkKind = 'testnet' | 'mainnet';\n\n/** An EVM network the x402 provider can settle on */\nexport interface NetworkProfile {\n /** CAIP-2 identifier, e.g. `eip155:84532` */\n readonly id: string;\n /** Signed into the buyer's EIP-712 domain */\n readonly chainId: number;\n readonly displayName: string;\n readonly kind: NetworkKind;\n /** The local Anvil dev chain, where the in-process facilitator runs */\n readonly local?: boolean;\n /**\n * Default USDC deployment and EIP-712 domain. EVM offers may name another\n * token; the local chain has no default and requires explicit token metadata.\n *\n * `name` is the signed EIP-712 domain name, not the symbol, and deployments\n * differ: `\"USDC\"` on Base Sepolia, `\"USD Coin\"` on Base.\n */\n readonly canonicalAsset?: {\n readonly symbol: string;\n readonly address: string;\n readonly name: string;\n readonly version: string;\n readonly decimals: number;\n };\n}\n\ninterface NonEvmNetwork<F extends X402NetworkFamily> {\n readonly family: F;\n readonly id: string;\n readonly displayName: string;\n readonly kind: NetworkKind;\n /** Solana mint or NEAR NEP-141 contract account, with no EIP-712 domain */\n readonly canonicalAsset: {\n readonly symbol: string;\n readonly address: string;\n readonly decimals: number;\n };\n}\n\nexport type X402Network =\n | (NetworkProfile & { readonly family: 'evm' })\n | NonEvmNetwork<'svm'>\n | NonEvmNetwork<'near'>;\n\n/** A merchant-declared EVM network, from `payments.x402.networks` */\nexport interface CustomNetworkDeclaration {\n readonly kind: NetworkKind;\n readonly displayName: string;\n}\n\nexport type CustomNetworks = Readonly<Record<string, CustomNetworkDeclaration>>;\n\nconst usdc = (address: string, name: string) =>\n ({ symbol: 'USDC', address, name, version: '2', decimals: 6 }) as const;\n\nconst PROFILES: readonly X402Network[] = [\n {\n family: 'evm',\n id: `eip155:${LOCAL_CHAIN_ID}`,\n chainId: LOCAL_CHAIN_ID,\n displayName: 'Local Anvil',\n kind: 'testnet',\n local: true,\n },\n {\n family: 'evm',\n id: 'eip155:84532',\n chainId: 84532,\n displayName: 'Base Sepolia',\n kind: 'testnet',\n canonicalAsset: usdc('0x036CbD53842c5426634e7929541eC2318f3dCF7e', 'USDC'),\n },\n {\n family: 'evm',\n id: 'eip155:8453',\n chainId: 8453,\n displayName: 'Base',\n kind: 'mainnet',\n canonicalAsset: usdc('0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913', 'USD Coin'),\n },\n {\n family: 'evm',\n id: 'eip155:1',\n chainId: 1,\n displayName: 'Ethereum',\n kind: 'mainnet',\n canonicalAsset: usdc('0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48', 'USD Coin'),\n },\n {\n family: 'evm',\n id: 'eip155:137',\n chainId: 137,\n displayName: 'Polygon',\n kind: 'mainnet',\n canonicalAsset: usdc('0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359', 'USD Coin'),\n },\n {\n family: 'evm',\n id: 'eip155:42161',\n chainId: 42161,\n displayName: 'Arbitrum One',\n kind: 'mainnet',\n canonicalAsset: usdc('0xaf88d065e77c8cC2239327C5EDb3A432268e5831', 'USD Coin'),\n },\n {\n family: 'evm',\n id: 'eip155:421614',\n chainId: 421614,\n displayName: 'Arbitrum Sepolia',\n kind: 'testnet',\n canonicalAsset: usdc('0x75faf114eafb1BDbe2F0316DF893fd58CE46AA4d', 'USD Coin'),\n },\n {\n family: 'evm',\n id: 'eip155:43114',\n chainId: 43114,\n displayName: 'Avalanche C-Chain',\n kind: 'mainnet',\n canonicalAsset: usdc('0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E', 'USD Coin'),\n },\n {\n family: 'svm',\n id: 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp',\n displayName: 'Solana',\n kind: 'mainnet',\n canonicalAsset: {\n symbol: 'USDC',\n address: 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v',\n decimals: 6,\n },\n },\n {\n family: 'svm',\n id: 'solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1',\n displayName: 'Solana Devnet',\n kind: 'testnet',\n canonicalAsset: {\n symbol: 'USDC',\n address: '4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU',\n decimals: 6,\n },\n },\n // NEAR's USDC contracts are implicit accounts: 64 lowercase hex characters\n {\n family: 'near',\n id: 'near:mainnet',\n displayName: 'NEAR',\n kind: 'mainnet',\n canonicalAsset: {\n symbol: 'USDC',\n address: '17208628f84f5d6ad33f0da3bbbeb27ffcb398eac501a31bd6ad2011e36133a1',\n decimals: 6,\n },\n },\n {\n family: 'near',\n id: 'near:testnet',\n displayName: 'NEAR Testnet',\n kind: 'testnet',\n canonicalAsset: {\n symbol: 'USDC',\n address: '3e2210e1184b45b64c8a434c0a7e7b23cc04ea7eb7a6c3c32520d03d4afcb8af',\n decimals: 6,\n },\n },\n];\n\nconst BY_ID = new Map(PROFILES.map((profile) => [profile.id, profile]));\n\n/** Built-in networks of every family, for tests and diagnostics */\nexport const BUILT_IN_NETWORKS: readonly X402Network[] = PROFILES;\n\n/** The built-in EVM networks the x402 provider settles on without a declaration */\nexport const SUPPORTED_NETWORK_IDS: readonly string[] = PROFILES.filter(\n (p) => p.family === 'evm',\n).map((p) => p.id);\n\n// A chain id viem and EIP-712 can carry as a JS number\nconst EVM_NETWORK_ID = /^eip155:([1-9]\\d{0,15})$/;\n\nfunction invalid(message: string, path: string): CommerceError {\n return new CommerceError('CONFIG_INVALID', message, { details: { path } });\n}\n\n/** Built-in EVM profile for callers using the original network interface */\nexport function findNetworkProfile(id: string): NetworkProfile | undefined {\n const profile = BY_ID.get(id);\n return profile?.family === 'evm' ? profile : undefined;\n}\n\n/** A built-in network of any family, or a declared custom EVM network */\nexport function findX402Network(id: string, custom?: CustomNetworks): X402Network | undefined {\n const builtIn = BY_ID.get(id);\n if (builtIn) return builtIn;\n const declared = custom?.[id];\n const chainId = Number(EVM_NETWORK_ID.exec(id)?.[1]);\n if (!declared || !Number.isSafeInteger(chainId)) return undefined;\n return {\n family: 'evm',\n id,\n chainId,\n displayName: declared.displayName,\n kind: declared.kind,\n };\n}\n\nexport function requireX402Network(id: string, path: string, custom?: CustomNetworks): X402Network {\n const network = findX402Network(id, custom);\n if (!network) {\n throw new CommerceError(\n 'CONFIG_INVALID',\n `${path}: \"${id}\" is not a known network. Built-in CAIP-2 identifiers: ${PROFILES.map((p) => p.id).join(', ')}. Declare another EVM network under payments.x402.networks with its kind and displayName.`,\n { details: { path, network: id } },\n );\n }\n return network;\n}\n\n/**\n * Allows only new `eip155` networks in `payments.x402.networks`. Redeclaring\n * built-ins could relabel mainnet as testnet; Solana and NEAR IDs are SDK-fixed.\n */\nexport function validateCustomNetworks(custom: CustomNetworks, path: string): void {\n for (const id of Object.keys(custom)) {\n const at = `${path}.${id}`;\n if (BY_ID.has(id)) {\n throw invalid(\n `${at}: \"${id}\" is a built-in network and cannot be redeclared; remove this entry`,\n at,\n );\n }\n if (!findX402Network(id, custom)) {\n throw invalid(\n `${at}: \"${id}\" is not an EVM CAIP-2 identifier (\"eip155:\" followed by a positive chain id below 2^53). Only EVM networks can be declared.`,\n at,\n );\n }\n }\n}\n\n/** What a deployment is: the local dev chain, or a public testnet or mainnet */\nexport type DeploymentMode = 'local' | 'testnet' | 'mainnet';\n\nexport function resolveDeploymentMode(profile: {\n readonly kind: NetworkKind;\n readonly local?: boolean;\n}): DeploymentMode {\n return profile.local ? 'local' : profile.kind;\n}\n\n// The banner an operator must not miss. Printed for mainnet only\nconst LIVE_MAINNET_BANNER = 'LIVE MAINNET MODE - REAL FUNDS';\n\nexport function describeDeploymentMode(mode: DeploymentMode): string {\n return mode === 'mainnet' ? LIVE_MAINNET_BANNER : mode.toUpperCase();\n}\n","/**\n * SDK-free address checks for config load and the CLI. EVM addresses compare\n * without case; Solana keys and NEAR account IDs compare exactly.\n */\nimport type { X402Network } from './networks';\n\n// `0x` + 40 hex characters. Config load cannot check the EIP-55 checksum,\n// which needs keccak-256; the x402 and MPP providers refuse a mixed-case\n// address whose checksum is wrong when they start.\nconst EVM_ADDRESS = /^0x[0-9a-fA-F]{40}$/;\nconst EVM_ZERO = /^0x0{40}$/i;\n\n/** `0x` followed by 40 hex characters, in any case */\nexport const isEvmAddress = (value: unknown): value is `0x${string}` =>\n typeof value === 'string' && EVM_ADDRESS.test(value);\n\n/** The EVM zero address, in any case */\nexport const isEvmZeroAddress = (value: string): boolean => EVM_ZERO.test(value);\n\nconst BASE58_ALPHABET = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';\n// A 32-byte key is 32 to 44 base58 characters\nconst SOLANA_ADDRESS = /^[1-9A-HJ-NP-Za-km-z]{32,44}$/;\n// The all-zero key, which is the System Program and owns nothing recoverable\nconst SOLANA_ZERO = '11111111111111111111111111111111';\nconst EVM_TRANSACTION_HASH = /^0x[0-9a-fA-F]{64}$/;\n// A 64-byte Ed25519 signature is at most 88 base58 characters\nconst SOLANA_SIGNATURE = /^[1-9A-HJ-NP-Za-km-z]{64,88}$/;\n\n// nearcore's account ID rule: 2 to 64 characters, lowercase alphanumeric runs\n// joined by single \"-\", \"_\" or \".\"; implicit accounts are 64 hex characters\nconst NEAR_ACCOUNT_ID = /^(([a-z\\d]+[-_])*[a-z\\d]+\\.)*([a-z\\d]+[-_])*[a-z\\d]+$/;\n// A transaction hash: 32 bytes in base58\nconst NEAR_TRANSACTION_HASH = /^[1-9A-HJ-NP-Za-km-z]{32,44}$/;\n\n/**\n * Returns the family's wire address or `undefined`. NEAR uses named or\n * implicit account IDs; a `.near` suffix does not identify the network.\n */\nexport function normalizeAddress(network: X402Network, value: string): string | undefined {\n switch (network.family) {\n case 'evm':\n return isEvmAddress(value) ? value : undefined;\n case 'svm':\n return SOLANA_ADDRESS.test(value) && base58ByteLength(value) === 32 ? value : undefined;\n case 'near':\n return value.length >= 2 && value.length <= 64 && NEAR_ACCOUNT_ID.test(value)\n ? value\n : undefined;\n }\n}\n\n/**\n * An address funds cannot be recovered from: the zero address of its family.\n * NEAR has no zero account.\n */\nexport function isBurnAddress(network: X402Network, wireAddress: string): boolean {\n switch (network.family) {\n case 'evm':\n return isEvmZeroAddress(wireAddress);\n case 'svm':\n return wireAddress === SOLANA_ZERO;\n case 'near':\n return false;\n }\n}\n\n/** Compare EVM addresses case-insensitively, Solana keys and NEAR account IDs exactly */\nexport function sameAddress(network: X402Network, a: string, b: string): boolean {\n return network.family === 'evm' ? a.toLowerCase() === b.toLowerCase() : a === b;\n}\n\n/**\n * A settlement reference in its family's form: an EVM transaction hash, a\n * Solana transaction signature or a NEAR transaction hash\n */\nexport function isTransactionReference(network: X402Network, value: string): boolean {\n switch (network.family) {\n case 'evm':\n return EVM_TRANSACTION_HASH.test(value);\n case 'svm':\n return SOLANA_SIGNATURE.test(value) && base58ByteLength(value) === 64;\n case 'near':\n return NEAR_TRANSACTION_HASH.test(value) && base58ByteLength(value) === 32;\n }\n}\n\nfunction base58ByteLength(value: string): number {\n let n = 0n;\n for (const char of value) n = n * 58n + BigInt(BASE58_ALPHABET.indexOf(char));\n // Each leading '1' encodes one leading zero byte\n const leadingZeros = value.length - value.replace(/^1+/, '').length;\n return leadingZeros + (n === 0n ? 0 : Math.ceil(n.toString(16).length / 2));\n}\n","/**\n * x402 exact-scheme flows, shared by the config loader and CLI.\n * The default `authorization` flow settles after a successful backend call;\n * `upfront` settles first.\n */\nexport const X402_PAYMENT_FLOWS = ['authorization', 'upfront'] as const;\n\nexport type X402PaymentFlow = (typeof X402_PAYMENT_FLOWS)[number];\n\nexport const X402_DEFAULT_PAYMENT_FLOW: X402PaymentFlow = 'authorization';\n","/**\n * Anvil's well-known development accounts.\n *\n * LOCAL DEVELOPMENT ONLY - DO NOT FUND. The keys come from Foundry's public\n * default mnemonic (\"test test ... junk\"), so value sent to these addresses on\n * a real network can be taken by anyone.\n *\n * Index layout on the local demo chain:\n * 0 - deployer and local facilitator signer (pays gas, broadcasts settlement)\n * 1 - merchant settlement destination (`payTo`)\n * 2 - buyer (signs EIP-3009 authorizations; never held by the gateway)\n */\nexport interface AnvilWellKnownAccount {\n readonly address: `0x${string}`;\n readonly privateKey: `0x${string}`;\n}\n\n/** A fixed-length tuple, so indexing by the layout above is typed */\nexport const ANVIL_WELL_KNOWN_ACCOUNTS: readonly [\n AnvilWellKnownAccount,\n AnvilWellKnownAccount,\n AnvilWellKnownAccount,\n] = [\n {\n address: '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266',\n privateKey: '0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80',\n },\n {\n address: '0x70997970C51812dc3A010C7d01b50e0d17dc79C8',\n privateKey: '0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d',\n },\n {\n address: '0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC',\n privateKey: '0x5de4111afa1a4b94908f83103eb1f1706367c2e68ca870fc3fb9a804cdab365a',\n },\n];\n\nexport const LOCAL_FACILITATOR_ACCOUNT = ANVIL_WELL_KNOWN_ACCOUNTS[0];\nexport const LOCAL_MERCHANT_ACCOUNT = ANVIL_WELL_KNOWN_ACCOUNTS[1];\nexport const LOCAL_BUYER_ACCOUNT = ANVIL_WELL_KNOWN_ACCOUNTS[2];\n\n/** Label printed wherever a dev key appears in output, logs or manifests */\nexport const DEV_KEY_LABEL = 'LOCAL DEVELOPMENT ONLY - DO NOT FUND';\n"]}
|
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
import { isRecord } from './chunk-3M6U7ILB.js';
|
|
2
|
+
|
|
3
|
+
// src/core/errors/codes.ts
|
|
4
|
+
var COMMERCE_ERROR_HTTP_STATUS = {
|
|
5
|
+
CONFIG_INVALID: 500,
|
|
6
|
+
RESOURCE_NOT_FOUND: 404,
|
|
7
|
+
INPUT_INVALID: 400,
|
|
8
|
+
PAYMENT_REQUIRED: 402,
|
|
9
|
+
PAYMENT_INVALID: 402,
|
|
10
|
+
PAYMENT_REPLAYED: 409,
|
|
11
|
+
PAYMENT_PROVIDER_UNAVAILABLE: 503,
|
|
12
|
+
PAYMENT_SETTLEMENT_FAILED: 502,
|
|
13
|
+
// 403, not 402: a 402 tells a client to pay and retry, which cannot fix a
|
|
14
|
+
// missing or rejected mandate, and a client that auto-pays on 402 would be
|
|
15
|
+
// charged for a request that was never going to be delivered
|
|
16
|
+
AUTHORIZATION_REQUIRED: 403,
|
|
17
|
+
AUTHORIZATION_INVALID: 403,
|
|
18
|
+
AUTHORIZATION_REPLAYED: 409,
|
|
19
|
+
AUTHORIZATION_PROVIDER_UNAVAILABLE: 503,
|
|
20
|
+
BACKEND_TIMEOUT: 504,
|
|
21
|
+
BACKEND_ERROR: 502,
|
|
22
|
+
PROTOCOL_UNSUPPORTED: 501,
|
|
23
|
+
GATEWAY_BUSY: 503,
|
|
24
|
+
STORAGE_ERROR: 500,
|
|
25
|
+
INTERNAL_ERROR: 500
|
|
26
|
+
};
|
|
27
|
+
var RETRYABLE_ERROR_CODES = /* @__PURE__ */ new Set([
|
|
28
|
+
"PAYMENT_PROVIDER_UNAVAILABLE",
|
|
29
|
+
// The verifier or replay store was unreachable, so the mandate got no
|
|
30
|
+
// verdict. The same proof can verify once the outage clears.
|
|
31
|
+
"AUTHORIZATION_PROVIDER_UNAVAILABLE",
|
|
32
|
+
"BACKEND_TIMEOUT",
|
|
33
|
+
// Load shedding is transient: the caller should back off and try again.
|
|
34
|
+
// Clients act on this flag, and leaving it out would make a momentary
|
|
35
|
+
// throttle look like a permanent failure.
|
|
36
|
+
"GATEWAY_BUSY"
|
|
37
|
+
]);
|
|
38
|
+
|
|
39
|
+
// src/core/errors/commerce-error.ts
|
|
40
|
+
var CommerceError = class _CommerceError extends Error {
|
|
41
|
+
code;
|
|
42
|
+
httpStatus;
|
|
43
|
+
retryable;
|
|
44
|
+
details;
|
|
45
|
+
requestId;
|
|
46
|
+
resourceId;
|
|
47
|
+
constructor(code, message, options = {}) {
|
|
48
|
+
super(message, options.cause !== void 0 ? { cause: options.cause } : void 0);
|
|
49
|
+
this.name = "CommerceError";
|
|
50
|
+
this.code = code;
|
|
51
|
+
this.httpStatus = options.httpStatus ?? COMMERCE_ERROR_HTTP_STATUS[code];
|
|
52
|
+
this.retryable = RETRYABLE_ERROR_CODES.has(code);
|
|
53
|
+
if (options.details !== void 0) this.details = options.details;
|
|
54
|
+
if (options.requestId !== void 0) this.requestId = options.requestId;
|
|
55
|
+
if (options.resourceId !== void 0) this.resourceId = options.resourceId;
|
|
56
|
+
Error.captureStackTrace?.(this, _CommerceError);
|
|
57
|
+
}
|
|
58
|
+
/** Non-secret, client-safe representation. `cause` is never included */
|
|
59
|
+
toInfo() {
|
|
60
|
+
return {
|
|
61
|
+
code: this.code,
|
|
62
|
+
message: this.message,
|
|
63
|
+
httpStatus: this.httpStatus,
|
|
64
|
+
retryable: this.retryable,
|
|
65
|
+
...this.requestId !== void 0 ? { requestId: this.requestId } : {},
|
|
66
|
+
...this.resourceId !== void 0 ? { resourceId: this.resourceId } : {},
|
|
67
|
+
...this.details !== void 0 ? { details: this.details } : {}
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
};
|
|
71
|
+
function isCommerceError(value) {
|
|
72
|
+
return value instanceof CommerceError;
|
|
73
|
+
}
|
|
74
|
+
function toCommerceError(value, fallbackCode = "INTERNAL_ERROR", fallbackMessage = "Unexpected internal error") {
|
|
75
|
+
if (isCommerceError(value)) return value;
|
|
76
|
+
return new CommerceError(fallbackCode, fallbackMessage, { cause: value });
|
|
77
|
+
}
|
|
78
|
+
function describeError(error) {
|
|
79
|
+
if (error instanceof Error) return { message: error.message, name: error.name };
|
|
80
|
+
return { message: String(error) };
|
|
81
|
+
}
|
|
82
|
+
function redactedErrorText(value) {
|
|
83
|
+
const text = value instanceof Error ? `${value.name}: ${value.message}` : String(value);
|
|
84
|
+
return text.replace(/\b[a-z][a-z\d+.-]*:\/\/[^\s"'<>]+/gi, (match) => {
|
|
85
|
+
try {
|
|
86
|
+
const url = new URL(match);
|
|
87
|
+
return `${url.protocol}//${url.host}`;
|
|
88
|
+
} catch {
|
|
89
|
+
return "[unparseable URL]";
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
var MAX_LOGGED_CAUSES = 5;
|
|
94
|
+
function toLogInfo(value) {
|
|
95
|
+
const error = toCommerceError(value);
|
|
96
|
+
const cause = [];
|
|
97
|
+
let current = error.cause;
|
|
98
|
+
while (current !== void 0 && cause.length < MAX_LOGGED_CAUSES) {
|
|
99
|
+
cause.push(redactedErrorText(current));
|
|
100
|
+
current = current instanceof Error ? current.cause : void 0;
|
|
101
|
+
}
|
|
102
|
+
return cause.length > 0 ? { ...error.toInfo(), cause } : error.toInfo();
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// src/core/interfaces/runtime.ts
|
|
106
|
+
var systemClock = {
|
|
107
|
+
now: () => /* @__PURE__ */ new Date(),
|
|
108
|
+
nowIso: () => (/* @__PURE__ */ new Date()).toISOString(),
|
|
109
|
+
monotonicMs: () => performance.now()
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
// src/core/domain/common.ts
|
|
113
|
+
var PROTOCOL_NAME_KEYS = {
|
|
114
|
+
http: true,
|
|
115
|
+
mcp: true,
|
|
116
|
+
a2a: true,
|
|
117
|
+
acp: true
|
|
118
|
+
};
|
|
119
|
+
var PROTOCOL_NAMES = Object.keys(
|
|
120
|
+
PROTOCOL_NAME_KEYS
|
|
121
|
+
);
|
|
122
|
+
var PAYMENT_METHOD_NAME_KEYS = { x402: true, mpp: true };
|
|
123
|
+
var PAYMENT_METHOD_NAMES = Object.keys(
|
|
124
|
+
PAYMENT_METHOD_NAME_KEYS
|
|
125
|
+
);
|
|
126
|
+
|
|
127
|
+
// src/core/domain/resource.ts
|
|
128
|
+
var DEFAULT_BACKEND_TIMEOUT_MS = 1e4;
|
|
129
|
+
|
|
130
|
+
// src/core/domain/wire.ts
|
|
131
|
+
var PAYMENT_INPUT_FIELD = "_payment";
|
|
132
|
+
var PAYMENT_HEADER = "payment-signature";
|
|
133
|
+
var PAYMENT_RESPONSE_HEADER = "payment-response";
|
|
134
|
+
var AUTHORIZATION_INPUT_FIELD = "_authorization";
|
|
135
|
+
var RESERVED_INPUT_FIELDS = [
|
|
136
|
+
PAYMENT_INPUT_FIELD,
|
|
137
|
+
AUTHORIZATION_INPUT_FIELD
|
|
138
|
+
];
|
|
139
|
+
var AUTHORIZATION_HEADER = "agent-authorization";
|
|
140
|
+
var MAX_AUTHORIZATION_HEADER_BYTES = 8192;
|
|
141
|
+
var PAYMENT_REQUIRED_HEADER = "payment-required";
|
|
142
|
+
var DELIVERY_SUMMARY_META_KEY = "agent-commerce/delivery";
|
|
143
|
+
function toDeliverySummary(outcome) {
|
|
144
|
+
const p = outcome.payment;
|
|
145
|
+
return {
|
|
146
|
+
requestId: outcome.requestId,
|
|
147
|
+
resourceId: outcome.resourceId,
|
|
148
|
+
receiptId: outcome.receipt.id,
|
|
149
|
+
deliveredAt: outcome.receipt.deliveredAt,
|
|
150
|
+
...p !== void 0 ? {
|
|
151
|
+
payment: {
|
|
152
|
+
status: p.status,
|
|
153
|
+
amount: p.amount,
|
|
154
|
+
currency: p.currency,
|
|
155
|
+
...p.externalReference !== void 0 ? { externalReference: p.externalReference } : {},
|
|
156
|
+
...p.network !== void 0 ? { network: p.network } : {}
|
|
157
|
+
}
|
|
158
|
+
} : {}
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
function toPaymentRequiredEnvelope(outcome) {
|
|
162
|
+
const r = outcome.requirement;
|
|
163
|
+
return {
|
|
164
|
+
status: "payment-required",
|
|
165
|
+
code: "PAYMENT_REQUIRED",
|
|
166
|
+
requestId: outcome.requestId,
|
|
167
|
+
resourceId: outcome.resourceId,
|
|
168
|
+
message: `Payment of ${r.amount} ${r.currency} is required for resource "${outcome.resourceId}". Retry with a ${r.provider} payment proof.`,
|
|
169
|
+
payment: {
|
|
170
|
+
provider: r.provider,
|
|
171
|
+
version: r.challenge.version,
|
|
172
|
+
amount: r.amount,
|
|
173
|
+
currency: r.currency,
|
|
174
|
+
...r.destination !== void 0 ? { destination: r.destination } : {},
|
|
175
|
+
...r.network !== void 0 ? { network: r.network } : {},
|
|
176
|
+
...r.asset !== void 0 ? { asset: r.asset } : {},
|
|
177
|
+
...r.expiresAt !== void 0 ? { expiresAt: r.expiresAt } : {},
|
|
178
|
+
accepts: r.challenge.accepts,
|
|
179
|
+
...r.challenge.envelope !== void 0 ? { envelope: r.challenge.envelope } : {}
|
|
180
|
+
},
|
|
181
|
+
...outcome.authorization !== void 0 && outcome.authorization.length > 0 ? { authorization: { required: outcome.authorization } } : {}
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
function toErrorEnvelope(error) {
|
|
185
|
+
const info = error.toInfo();
|
|
186
|
+
return {
|
|
187
|
+
status: "error",
|
|
188
|
+
code: info.code,
|
|
189
|
+
message: info.message,
|
|
190
|
+
retryable: info.retryable,
|
|
191
|
+
...info.requestId !== void 0 ? { requestId: info.requestId } : {},
|
|
192
|
+
...info.resourceId !== void 0 ? { resourceId: info.resourceId } : {},
|
|
193
|
+
...info.details !== void 0 ? { details: info.details } : {}
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
function parseAuthorizationSubmission(value, requestId) {
|
|
197
|
+
if (value === void 0 || value === null) return void 0;
|
|
198
|
+
const fail = (detail) => {
|
|
199
|
+
throw new CommerceError("AUTHORIZATION_INVALID", `Malformed authorization: ${detail}`, {
|
|
200
|
+
...requestId !== void 0 ? { requestId } : {}
|
|
201
|
+
});
|
|
202
|
+
};
|
|
203
|
+
if (!isRecord(value)) {
|
|
204
|
+
return fail(`expected an object with "method" and "payload", got ${typeof value}`);
|
|
205
|
+
}
|
|
206
|
+
const method = value["method"];
|
|
207
|
+
const payload = value["payload"];
|
|
208
|
+
if (method !== "ap2") {
|
|
209
|
+
fail(`unsupported method ${typeof method === "string" ? `"${method}"` : typeof method}`);
|
|
210
|
+
}
|
|
211
|
+
if (typeof payload !== "string" || payload.length === 0) {
|
|
212
|
+
fail('"payload" must be a non-empty string');
|
|
213
|
+
}
|
|
214
|
+
return { method: "ap2", payload };
|
|
215
|
+
}
|
|
216
|
+
function parseAuthorizationHeader(raw, requestId) {
|
|
217
|
+
const value = Array.isArray(raw) ? raw[0] : raw;
|
|
218
|
+
if (value === void 0 || value.length === 0) return void 0;
|
|
219
|
+
const fail = (detail) => {
|
|
220
|
+
throw new CommerceError("AUTHORIZATION_INVALID", `Malformed authorization: ${detail}`, {
|
|
221
|
+
...requestId !== void 0 ? { requestId } : {}
|
|
222
|
+
});
|
|
223
|
+
};
|
|
224
|
+
if (Buffer.byteLength(value, "utf8") > MAX_AUTHORIZATION_HEADER_BYTES) {
|
|
225
|
+
fail(`header exceeds the ${MAX_AUTHORIZATION_HEADER_BYTES}-byte limit`);
|
|
226
|
+
}
|
|
227
|
+
let decoded;
|
|
228
|
+
try {
|
|
229
|
+
decoded = JSON.parse(Buffer.from(value, "base64url").toString("utf8"));
|
|
230
|
+
} catch {
|
|
231
|
+
fail("header is not base64url-encoded JSON");
|
|
232
|
+
}
|
|
233
|
+
return parseAuthorizationSubmission(decoded, requestId);
|
|
234
|
+
}
|
|
235
|
+
function extractReservedInputFields(rawInput, resource, requestId) {
|
|
236
|
+
const {
|
|
237
|
+
[PAYMENT_INPUT_FIELD]: paymentValue,
|
|
238
|
+
[AUTHORIZATION_INPUT_FIELD]: authorizationValue,
|
|
239
|
+
...input
|
|
240
|
+
} = rawInput;
|
|
241
|
+
const method = resource?.paymentMethods[0];
|
|
242
|
+
const payment = typeof paymentValue === "string" && paymentValue.length > 0 && method !== void 0 ? { method, payload: paymentValue } : void 0;
|
|
243
|
+
const authorization = parseAuthorizationSubmission(authorizationValue, requestId);
|
|
244
|
+
return {
|
|
245
|
+
input,
|
|
246
|
+
...payment !== void 0 ? { payment } : {},
|
|
247
|
+
...authorization !== void 0 ? { authorization } : {}
|
|
248
|
+
};
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
// src/core/interfaces/logger.ts
|
|
252
|
+
var NOOP_LOGGER = {
|
|
253
|
+
debug: () => {
|
|
254
|
+
},
|
|
255
|
+
info: () => {
|
|
256
|
+
},
|
|
257
|
+
warn: () => {
|
|
258
|
+
},
|
|
259
|
+
error: () => {
|
|
260
|
+
},
|
|
261
|
+
child: () => NOOP_LOGGER
|
|
262
|
+
};
|
|
263
|
+
|
|
264
|
+
// src/core/interfaces/protocol-adapter.ts
|
|
265
|
+
function isHttpProtocolAdapter(adapter) {
|
|
266
|
+
return typeof adapter.handleHttp === "function";
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
export { AUTHORIZATION_HEADER, AUTHORIZATION_INPUT_FIELD, CommerceError, DEFAULT_BACKEND_TIMEOUT_MS, DELIVERY_SUMMARY_META_KEY, NOOP_LOGGER, PAYMENT_HEADER, PAYMENT_INPUT_FIELD, PAYMENT_METHOD_NAMES, PAYMENT_REQUIRED_HEADER, PAYMENT_RESPONSE_HEADER, PROTOCOL_NAMES, RESERVED_INPUT_FIELDS, describeError, extractReservedInputFields, isCommerceError, isHttpProtocolAdapter, parseAuthorizationHeader, parseAuthorizationSubmission, redactedErrorText, systemClock, toCommerceError, toDeliverySummary, toErrorEnvelope, toLogInfo, toPaymentRequiredEnvelope };
|
|
270
|
+
//# sourceMappingURL=chunk-QQ3WY5L3.js.map
|
|
271
|
+
//# sourceMappingURL=chunk-QQ3WY5L3.js.map
|