@aifinpay/agent 1.8.4 → 2.0.0-rc.13

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.
Files changed (93) hide show
  1. package/PAYMENT_RECEIPTS.md +110 -0
  2. package/README.md +93 -35
  3. package/dist/agent.d.ts +6 -1
  4. package/dist/agent.d.ts.map +1 -1
  5. package/dist/agent.js +50 -12
  6. package/dist/agent.js.map +1 -1
  7. package/dist/agentHistory.d.ts +15 -0
  8. package/dist/agentHistory.d.ts.map +1 -0
  9. package/dist/agentHistory.js +47 -0
  10. package/dist/agentHistory.js.map +1 -0
  11. package/dist/agentPassport.d.ts +95 -0
  12. package/dist/agentPassport.d.ts.map +1 -0
  13. package/dist/agentPassport.js +177 -0
  14. package/dist/agentPassport.js.map +1 -0
  15. package/dist/aifp1.d.ts +135 -8
  16. package/dist/aifp1.d.ts.map +1 -1
  17. package/dist/aifp1.js +317 -50
  18. package/dist/aifp1.js.map +1 -1
  19. package/dist/apiUrl.d.ts +3 -0
  20. package/dist/apiUrl.d.ts.map +1 -0
  21. package/dist/apiUrl.js +8 -0
  22. package/dist/apiUrl.js.map +1 -0
  23. package/dist/chains.d.ts +4 -0
  24. package/dist/chains.d.ts.map +1 -0
  25. package/dist/chains.js +24 -0
  26. package/dist/chains.js.map +1 -0
  27. package/dist/deploymentResolver.d.ts +87 -0
  28. package/dist/deploymentResolver.d.ts.map +1 -0
  29. package/dist/deploymentResolver.js +145 -0
  30. package/dist/deploymentResolver.js.map +1 -0
  31. package/dist/facilitators/aifinpay.d.ts +4 -5
  32. package/dist/facilitators/aifinpay.d.ts.map +1 -1
  33. package/dist/facilitators/aifinpay.js +49 -19
  34. package/dist/facilitators/aifinpay.js.map +1 -1
  35. package/dist/facilitators/base.d.ts +12 -1
  36. package/dist/facilitators/base.d.ts.map +1 -1
  37. package/dist/facilitators/detect.d.ts +3 -3
  38. package/dist/facilitators/detect.d.ts.map +1 -1
  39. package/dist/facilitators/detect.js +3 -22
  40. package/dist/facilitators/detect.js.map +1 -1
  41. package/dist/facilitators/standard-x402.d.ts +4 -8
  42. package/dist/facilitators/standard-x402.d.ts.map +1 -1
  43. package/dist/facilitators/standard-x402.js +218 -92
  44. package/dist/facilitators/standard-x402.js.map +1 -1
  45. package/dist/index.d.ts +24 -18
  46. package/dist/index.d.ts.map +1 -1
  47. package/dist/index.js +22 -34
  48. package/dist/index.js.map +1 -1
  49. package/dist/localIdentity.d.ts +17 -0
  50. package/dist/localIdentity.d.ts.map +1 -0
  51. package/dist/localIdentity.js +81 -0
  52. package/dist/localIdentity.js.map +1 -0
  53. package/dist/settlement.d.ts +198 -0
  54. package/dist/settlement.d.ts.map +1 -0
  55. package/dist/settlement.js +429 -0
  56. package/dist/settlement.js.map +1 -0
  57. package/dist/settlementHttp.d.ts +10 -0
  58. package/dist/settlementHttp.d.ts.map +1 -0
  59. package/dist/settlementHttp.js +70 -0
  60. package/dist/settlementHttp.js.map +1 -0
  61. package/dist/settlementV14.d.ts +136 -0
  62. package/dist/settlementV14.d.ts.map +1 -0
  63. package/dist/settlementV14.js +170 -0
  64. package/dist/settlementV14.js.map +1 -0
  65. package/dist/solanaDeploymentResolver.d.ts +90 -0
  66. package/dist/solanaDeploymentResolver.d.ts.map +1 -0
  67. package/dist/solanaDeploymentResolver.js +143 -0
  68. package/dist/solanaDeploymentResolver.js.map +1 -0
  69. package/dist/solanaV14Deployments.generated.d.ts +35 -0
  70. package/dist/solanaV14Deployments.generated.d.ts.map +1 -0
  71. package/dist/solanaV14Deployments.generated.js +61 -0
  72. package/dist/solanaV14Deployments.generated.js.map +1 -0
  73. package/dist/splitterRoutes.d.ts +120 -0
  74. package/dist/splitterRoutes.d.ts.map +1 -0
  75. package/dist/splitterRoutes.generated.d.ts +22 -0
  76. package/dist/splitterRoutes.generated.d.ts.map +1 -0
  77. package/dist/splitterRoutes.generated.js +459 -0
  78. package/dist/splitterRoutes.generated.js.map +1 -0
  79. package/dist/splitterRoutes.js +73 -0
  80. package/dist/splitterRoutes.js.map +1 -0
  81. package/dist/unifiedAgent.d.ts +28 -18
  82. package/dist/unifiedAgent.d.ts.map +1 -1
  83. package/dist/unifiedAgent.js +85 -325
  84. package/dist/unifiedAgent.js.map +1 -1
  85. package/dist/v14Deployments.generated.d.ts +53 -0
  86. package/dist/v14Deployments.generated.d.ts.map +1 -0
  87. package/dist/v14Deployments.generated.js +89 -0
  88. package/dist/v14Deployments.generated.js.map +1 -0
  89. package/dist/wallet.d.ts +11 -52
  90. package/dist/wallet.d.ts.map +1 -1
  91. package/dist/wallet.js +27 -51
  92. package/dist/wallet.js.map +1 -1
  93. package/package.json +7 -4
@@ -0,0 +1,429 @@
1
+ import { keccak256, stringToHex, } from "viem";
2
+ import { settlementHttp } from "./settlementHttp.js";
3
+ export class SettlementProtocolError extends Error {
4
+ code;
5
+ constructor(message, code = "settlement_protocol_error") {
6
+ super(message);
7
+ this.code = code;
8
+ this.name = "SettlementProtocolError";
9
+ }
10
+ }
11
+ /** Broadcast succeeded but confirmation is unknown. Keep this hash and check
12
+ * it before retrying; a timeout is not evidence that no money moved. */
13
+ export class SettlementConfirmationPendingError extends SettlementProtocolError {
14
+ txHash;
15
+ stage;
16
+ constructor(txHash, stage) {
17
+ super(`transaction ${txHash} was broadcast but confirmation is unavailable; recover this transaction before retrying`, "confirmation_pending");
18
+ this.txHash = txHash;
19
+ this.stage = stage;
20
+ this.name = "SettlementConfirmationPendingError";
21
+ }
22
+ }
23
+ const CHAIN_IDS = {
24
+ amoy: 80002,
25
+ polygon: 137,
26
+ avalanche: 43114,
27
+ arbitrum: 42161,
28
+ bnb: 56,
29
+ base: 8453,
30
+ unichain: 130,
31
+ optimism: 10,
32
+ botchain: 677,
33
+ xrplevm: 1440000,
34
+ };
35
+ const NATIVE_ASSETS = {
36
+ polygon: "POL", amoy: "POL", avalanche: "AVAX", arbitrum: "ETH", bnb: "BNB",
37
+ base: "ETH", unichain: "ETH", optimism: "ETH", botchain: "BOT", xrplevm: "XRP",
38
+ };
39
+ const EXPECTED_BPS = {
40
+ "AIFP-1": { treasury: 100, creator: 0 },
41
+ "AIFP-2": { treasury: 0, creator: 0 },
42
+ };
43
+ const ZERO = "0x0000000000000000000000000000000000000000";
44
+ const ADDRESS_RE = /^0x[0-9a-fA-F]{40}$/;
45
+ const HASH_RE = /^0x[0-9a-fA-F]{64}$/;
46
+ const lc = (value) => value.toLowerCase();
47
+ const PROFILE_ABI = [
48
+ { type: "function", name: "treasuryBps", stateMutability: "view", inputs: [], outputs: [{ type: "uint256" }] },
49
+ { type: "function", name: "ipCreatorBps", stateMutability: "view", inputs: [], outputs: [{ type: "uint256" }] },
50
+ ];
51
+ const V13_ABI = [
52
+ {
53
+ type: "function", name: "payNative", stateMutability: "payable",
54
+ inputs: [{ type: "tuple", name: "p", components: [
55
+ { type: "bytes32", name: "paymentId" },
56
+ { type: "address", name: "merchant" },
57
+ { type: "uint256", name: "grossAmount" },
58
+ { type: "address", name: "ipCreator" },
59
+ { type: "uint256", name: "validUntil" },
60
+ { type: "string", name: "orderId" },
61
+ ] }], outputs: [],
62
+ },
63
+ {
64
+ type: "function", name: "payStable", stateMutability: "nonpayable",
65
+ inputs: [{ type: "tuple", name: "p", components: [
66
+ { type: "bytes32", name: "paymentId" },
67
+ { type: "address", name: "token" },
68
+ { type: "uint256", name: "grossAmount" },
69
+ { type: "address", name: "merchant" },
70
+ { type: "address", name: "ipCreator" },
71
+ { type: "uint256", name: "validUntil" },
72
+ { type: "string", name: "orderId" },
73
+ ] }], outputs: [],
74
+ },
75
+ ];
76
+ const ERC20_ABI = [
77
+ { type: "function", name: "allowance", stateMutability: "view", inputs: [{ type: "address", name: "owner" }, { type: "address", name: "spender" }], outputs: [{ type: "uint256" }] },
78
+ { type: "function", name: "approve", stateMutability: "nonpayable", inputs: [{ type: "address", name: "spender" }, { type: "uint256", name: "amount" }], outputs: [{ type: "bool" }] },
79
+ ];
80
+ function asJsonRecord(value) {
81
+ if (!value || typeof value !== "object" || Array.isArray(value)) {
82
+ throw new SettlementProtocolError("settlement API returned a non-object JSON document");
83
+ }
84
+ return value;
85
+ }
86
+ function responseJson(response, text) {
87
+ let json;
88
+ try {
89
+ json = JSON.parse(text);
90
+ }
91
+ catch {
92
+ throw new SettlementProtocolError(`settlement API ${response.status}: non-JSON response`);
93
+ }
94
+ const rec = asJsonRecord(json);
95
+ if (!response.ok) {
96
+ const detail = typeof rec.detail === "string" ? rec.detail
97
+ : typeof rec.reason === "string" ? rec.reason
98
+ : typeof rec.error === "string" ? rec.error
99
+ : `HTTP ${response.status}`;
100
+ throw new SettlementProtocolError(detail, typeof rec.error === "string" ? rec.error : "settlement_http_error");
101
+ }
102
+ return rec;
103
+ }
104
+ function expectedBreakdown(route, gross) {
105
+ const bps = EXPECTED_BPS[route];
106
+ const treasury = gross * BigInt(bps.treasury) / 10000n;
107
+ const creator = gross * BigInt(bps.creator) / 10000n;
108
+ if (bps.treasury > 0 && treasury === 0n) {
109
+ throw new SettlementProtocolError("AIFP-1 gross amount is too small for the 1% protocol fee", "amount_too_small");
110
+ }
111
+ const merchant = gross - treasury - creator;
112
+ if (merchant <= 0n) {
113
+ throw new SettlementProtocolError("settlement leaves no merchant amount", "amount_too_small");
114
+ }
115
+ return { gross, merchant, treasury, creator };
116
+ }
117
+ function isStableInvoice(invoice) {
118
+ return invoice.transaction.kind === "evm_erc20_then_contract_call"
119
+ && "token" in invoice
120
+ && invoice.token !== undefined;
121
+ }
122
+ function assertCommonCallBinding(invoice, args) {
123
+ if (lc(args.paymentId) !== lc(invoice.payment_id)) {
124
+ throw new SettlementProtocolError("transaction paymentId does not match invoice", "calldata_mismatch");
125
+ }
126
+ if (lc(args.merchant) !== lc(invoice.merchant_wallet)) {
127
+ throw new SettlementProtocolError("transaction merchant does not match invoice", "calldata_mismatch");
128
+ }
129
+ if (lc(args.ipCreator) !== ZERO) {
130
+ throw new SettlementProtocolError("production creator address must be zero", "calldata_mismatch");
131
+ }
132
+ if (args.validUntil !== invoice.valid_until) {
133
+ throw new SettlementProtocolError("transaction validUntil does not match invoice", "calldata_mismatch");
134
+ }
135
+ if (args.orderId !== invoice.order_id) {
136
+ throw new SettlementProtocolError("transaction orderId does not match invoice", "calldata_mismatch");
137
+ }
138
+ }
139
+ /** Strictly validate an invoice before any wallet signs. */
140
+ export function validateSettlementInvoice(invoice) {
141
+ if (!(invoice.route_class in EXPECTED_BPS))
142
+ throw new SettlementProtocolError("unknown route_class");
143
+ if (!(invoice.chain in CHAIN_IDS))
144
+ throw new SettlementProtocolError("unknown EVM settlement chain");
145
+ if (invoice.chain_id !== CHAIN_IDS[invoice.chain])
146
+ throw new SettlementProtocolError("chain_id does not match chain");
147
+ if (invoice.splitter_version !== "1.3")
148
+ throw new SettlementProtocolError("only B2BSplitter v1.3 is signable");
149
+ if (!ADDRESS_RE.test(invoice.splitter) || lc(invoice.splitter) === ZERO)
150
+ throw new SettlementProtocolError("invalid splitter address");
151
+ if (!HASH_RE.test(invoice.runtime_code_hash))
152
+ throw new SettlementProtocolError("invalid runtime_code_hash");
153
+ if (!ADDRESS_RE.test(invoice.merchant_wallet) || lc(invoice.merchant_wallet) === ZERO)
154
+ throw new SettlementProtocolError("invalid merchant_wallet");
155
+ if (!HASH_RE.test(invoice.payment_id))
156
+ throw new SettlementProtocolError("invalid payment_id");
157
+ if (typeof invoice.order_id !== "string" || !invoice.order_id.trim() || new TextEncoder().encode(invoice.order_id).length > 256) {
158
+ throw new SettlementProtocolError("order_id must contain 1..256 UTF-8 bytes");
159
+ }
160
+ if (lc(invoice.payment_id) !== keccak256(stringToHex(invoice.order_id)).toLowerCase()) {
161
+ throw new SettlementProtocolError("payment_id must be keccak256(order_id); refusing a replayable invoice", "payment_id_mismatch");
162
+ }
163
+ if (invoice.fee_on_top !== false || invoice.settlement_semantics !== "gross-inclusive") {
164
+ throw new SettlementProtocolError("fee-on-top or non-gross settlement is not supported");
165
+ }
166
+ const now = Math.floor(Date.now() / 1000);
167
+ if (!Number.isInteger(invoice.valid_until) || invoice.valid_until <= now) {
168
+ throw new SettlementProtocolError("invoice is expired or has invalid valid_until", "invoice_expired");
169
+ }
170
+ if (invoice.valid_until > now + 20 * 60 + 5) {
171
+ throw new SettlementProtocolError("invoice lifetime exceeds the 20-minute safety bound");
172
+ }
173
+ for (const amount of [invoice.breakdown.gross_amount, invoice.breakdown.merchant_amount,
174
+ invoice.breakdown.protocol_fee_amount, invoice.breakdown.creator_amount]) {
175
+ if (typeof amount !== "string" || !/^(0|[1-9][0-9]{0,77})$/.test(amount) || BigInt(amount) >= 2n ** 256n) {
176
+ throw new SettlementProtocolError("invoice amount must be a decimal uint256", "invalid_amount");
177
+ }
178
+ }
179
+ const gross = BigInt(invoice.breakdown.gross_amount);
180
+ const expected = expectedBreakdown(invoice.route_class, gross);
181
+ const bps = EXPECTED_BPS[invoice.route_class];
182
+ if (invoice.breakdown.protocol_fee_bps !== bps.treasury || invoice.breakdown.creator_bps !== bps.creator) {
183
+ throw new SettlementProtocolError("invoice bps do not match the canonical route profile");
184
+ }
185
+ if (BigInt(invoice.breakdown.merchant_amount) !== expected.merchant
186
+ || BigInt(invoice.breakdown.protocol_fee_amount) !== expected.treasury
187
+ || BigInt(invoice.breakdown.creator_amount) !== expected.creator) {
188
+ throw new SettlementProtocolError("invoice breakdown does not match canonical gross split");
189
+ }
190
+ if (isStableInvoice(invoice)) {
191
+ if (!["USDC", "USDT"].includes(invoice.asset) || !Number.isInteger(invoice.token.decimals) || invoice.token.decimals < 0 || invoice.token.decimals > 18) {
192
+ throw new SettlementProtocolError("invalid stable asset identity");
193
+ }
194
+ if (!ADDRESS_RE.test(invoice.token.address) || lc(invoice.token.address) === ZERO) {
195
+ throw new SettlementProtocolError("invalid stable token address");
196
+ }
197
+ if (lc(invoice.transaction.approve.token) !== lc(invoice.token.address)
198
+ || lc(invoice.transaction.approve.spender) !== lc(invoice.splitter)
199
+ || BigInt(invoice.transaction.approve.amount) !== gross) {
200
+ throw new SettlementProtocolError("stable approval does not match invoice");
201
+ }
202
+ if (invoice.transaction.settle.function !== "payStable((bytes32,address,uint256,address,address,uint256,string))") {
203
+ throw new SettlementProtocolError("unexpected stable v1.3 function signature");
204
+ }
205
+ if (lc(invoice.transaction.settle.args.token) !== lc(invoice.token.address)
206
+ || BigInt(invoice.transaction.settle.args.grossAmount) !== gross
207
+ || invoice.transaction.settle.value !== "0") {
208
+ throw new SettlementProtocolError("stable settlement token/gross/value mismatch");
209
+ }
210
+ assertCommonCallBinding(invoice, invoice.transaction.settle.args);
211
+ return;
212
+ }
213
+ if (invoice.asset !== NATIVE_ASSETS[invoice.chain])
214
+ throw new SettlementProtocolError("native asset does not match the requested chain");
215
+ if (invoice.transaction.function !== "payNative((bytes32,address,uint256,address,uint256,string))") {
216
+ throw new SettlementProtocolError("unexpected native v1.3 function signature");
217
+ }
218
+ if (BigInt(invoice.transaction.value) !== gross || BigInt(invoice.transaction.args.grossAmount) !== gross) {
219
+ throw new SettlementProtocolError("native tx value/gross amount mismatch");
220
+ }
221
+ assertCommonCallBinding(invoice, invoice.transaction.args);
222
+ }
223
+ /** Verify that a backend invoice matches an independently trusted release pin. */
224
+ export function validateTrustedSettlementRoutePin(invoice, pin) {
225
+ validateSettlementInvoice(invoice);
226
+ if ((pin.chain === "amoy") !== (pin.testnet === true)) {
227
+ throw new SettlementProtocolError("testnet signing requires an explicit matching testnet pin", "trusted_pin_invalid");
228
+ }
229
+ if (isStableInvoice(invoice)) {
230
+ const asset = pin.stable_assets?.[invoice.asset];
231
+ if (!asset || lc(asset.address) !== lc(invoice.token.address) || asset.decimals !== invoice.token.decimals) {
232
+ throw new SettlementProtocolError("stable asset does not match the independent token pin", "trusted_asset_mismatch");
233
+ }
234
+ }
235
+ if (!(pin.chain in CHAIN_IDS) || pin.chain_id !== CHAIN_IDS[pin.chain]) {
236
+ throw new SettlementProtocolError("trusted route pin has an invalid chain binding", "trusted_pin_invalid");
237
+ }
238
+ if (pin.splitter_version !== "1.3") {
239
+ throw new SettlementProtocolError("trusted route pin is not v1.3", "trusted_pin_invalid");
240
+ }
241
+ if (!ADDRESS_RE.test(pin.splitter) || lc(pin.splitter) === ZERO || !HASH_RE.test(pin.runtime_code_hash)) {
242
+ throw new SettlementProtocolError("trusted route pin has invalid address/hash", "trusted_pin_invalid");
243
+ }
244
+ if (pin.route_class !== invoice.route_class
245
+ || pin.chain !== invoice.chain
246
+ || pin.chain_id !== invoice.chain_id
247
+ || pin.splitter_version !== invoice.splitter_version
248
+ || lc(pin.splitter) !== lc(invoice.splitter)
249
+ || lc(pin.runtime_code_hash) !== lc(invoice.runtime_code_hash)) {
250
+ throw new SettlementProtocolError("backend invoice route does not match the independently trusted deployment pin", "trusted_pin_mismatch");
251
+ }
252
+ }
253
+ export class SettlementClient {
254
+ baseUrl;
255
+ fetchImpl;
256
+ timeoutMs;
257
+ constructor(options = {}) {
258
+ const opts = typeof options === "string" ? { baseUrl: options } : options;
259
+ const base = new URL(opts.baseUrl ?? "https://aifinpay.io");
260
+ if (!["http:", "https:"].includes(base.protocol) || base.username || base.password || base.search || base.hash) {
261
+ throw new SettlementProtocolError("invalid settlement API base URL");
262
+ }
263
+ this.baseUrl = base.toString().replace(/\/+$/, "");
264
+ this.fetchImpl = opts.fetchImpl ?? globalThis.fetch;
265
+ this.timeoutMs = opts.timeoutMs ?? 15_000;
266
+ if (!Number.isSafeInteger(this.timeoutMs) || this.timeoutMs <= 0 || this.timeoutMs > 2_147_483_647) {
267
+ throw new SettlementProtocolError("timeoutMs must be a positive timer duration");
268
+ }
269
+ }
270
+ async request(path, init) {
271
+ const url = `${this.baseUrl}${path}`;
272
+ const { response, text } = await settlementHttp(this.fetchImpl, url, init, this.timeoutMs);
273
+ return responseJson(response, text);
274
+ }
275
+ async routes(routeClass) {
276
+ const q = routeClass ? `?route_class=${encodeURIComponent(routeClass)}` : "";
277
+ const rec = await this.request(`/v1/settlement/routes${q}`);
278
+ if (!Array.isArray(rec.routes)) {
279
+ throw new SettlementProtocolError("routes response has no routes array");
280
+ }
281
+ return rec.routes;
282
+ }
283
+ async invoice(input) {
284
+ const rec = await this.request("/v1/settlement/invoice", {
285
+ method: "POST",
286
+ headers: { "content-type": "application/json" },
287
+ body: JSON.stringify({ ...input, gross_amount: String(input.gross_amount) }),
288
+ });
289
+ const invoice = rec;
290
+ validateSettlementInvoice(invoice);
291
+ const recipient = input.merchant_wallet ?? input.provider_wallet;
292
+ if (invoice.route_class !== input.route_class || invoice.chain !== input.chain || invoice.asset !== input.asset.toUpperCase()
293
+ || BigInt(invoice.breakdown.gross_amount) !== BigInt(input.gross_amount) || invoice.order_id !== input.order_id
294
+ || !recipient || lc(invoice.merchant_wallet) !== lc(recipient)
295
+ || (input.valid_until !== undefined && invoice.valid_until !== input.valid_until)) {
296
+ throw new SettlementProtocolError("invoice differs from the requested payment", "invoice_request_mismatch");
297
+ }
298
+ return invoice;
299
+ }
300
+ }
301
+ /** Verify trusted deployment evidence against chain immediately before signing. */
302
+ export async function verifySettlementRouteOnChain(invoice, publicClient, trustedPin) {
303
+ validateTrustedSettlementRoutePin(invoice, trustedPin);
304
+ const actualChainId = await publicClient.getChainId();
305
+ if (actualChainId !== trustedPin.chain_id) {
306
+ throw new SettlementProtocolError(`connected RPC chainId ${actualChainId} != trusted pin ${trustedPin.chain_id}`, "wrong_chain");
307
+ }
308
+ const code = await publicClient.getBytecode({ address: trustedPin.splitter });
309
+ if (!code || code === "0x") {
310
+ throw new SettlementProtocolError("trusted splitter has no runtime bytecode", "route_not_deployed");
311
+ }
312
+ if (lc(keccak256(code)) !== lc(trustedPin.runtime_code_hash)) {
313
+ throw new SettlementProtocolError("trusted splitter runtime bytecode hash mismatch", "runtime_hash_mismatch");
314
+ }
315
+ const [treasuryBps, creatorBps] = await Promise.all([
316
+ publicClient.readContract({ address: trustedPin.splitter, abi: PROFILE_ABI, functionName: "treasuryBps" }),
317
+ publicClient.readContract({ address: trustedPin.splitter, abi: PROFILE_ABI, functionName: "ipCreatorBps" }),
318
+ ]);
319
+ const expected = EXPECTED_BPS[trustedPin.route_class];
320
+ if (Number(treasuryBps) !== expected.treasury || Number(creatorBps) !== expected.creator) {
321
+ throw new SettlementProtocolError("on-chain route economics do not match trusted route class", "profile_mismatch");
322
+ }
323
+ }
324
+ async function waitSuccess(publicClient, hash, stage = "settlement") {
325
+ let receipt;
326
+ try {
327
+ receipt = await publicClient.waitForTransactionReceipt({ hash });
328
+ }
329
+ catch {
330
+ throw new SettlementConfirmationPendingError(hash, stage);
331
+ }
332
+ if (receipt.status !== "success") {
333
+ throw new SettlementProtocolError(`transaction ${hash} reverted`, "transaction_reverted");
334
+ }
335
+ return receipt.blockNumber;
336
+ }
337
+ /** Execute a v1.3 invoice only after matching an independent trusted route pin. */
338
+ export async function executeSettlementInvoice(invoice, walletClient, publicClient, trustedPin) {
339
+ await verifySettlementRouteOnChain(invoice, publicClient, trustedPin);
340
+ const account = walletClient.account;
341
+ if (!account) {
342
+ throw new SettlementProtocolError("walletClient has no signing account", "signer_missing");
343
+ }
344
+ const walletChainId = await walletClient.getChainId();
345
+ if (walletChainId !== trustedPin.chain_id || walletClient.chain?.id !== trustedPin.chain_id) {
346
+ throw new SettlementProtocolError(`wallet chainId ${walletChainId} != trusted pin ${trustedPin.chain_id}`, "wrong_chain");
347
+ }
348
+ const approvalTxs = [];
349
+ let settlementTx;
350
+ if (isStableInvoice(invoice)) {
351
+ const gross = BigInt(invoice.transaction.approve.amount);
352
+ const allowance = await publicClient.readContract({
353
+ address: invoice.token.address,
354
+ abi: ERC20_ABI,
355
+ functionName: "allowance",
356
+ args: [account.address, trustedPin.splitter],
357
+ });
358
+ if (allowance < gross) {
359
+ if (allowance > 0n) {
360
+ const reset = await walletClient.writeContract({
361
+ address: invoice.token.address,
362
+ abi: ERC20_ABI,
363
+ functionName: "approve",
364
+ args: [trustedPin.splitter, 0n],
365
+ account,
366
+ chain: walletClient.chain,
367
+ });
368
+ approvalTxs.push(reset);
369
+ await waitSuccess(publicClient, reset, "approval");
370
+ }
371
+ const approve = await walletClient.writeContract({
372
+ address: invoice.token.address,
373
+ abi: ERC20_ABI,
374
+ functionName: "approve",
375
+ args: [trustedPin.splitter, gross],
376
+ account,
377
+ chain: walletClient.chain,
378
+ });
379
+ approvalTxs.push(approve);
380
+ await waitSuccess(publicClient, approve, "approval");
381
+ }
382
+ settlementTx = await walletClient.writeContract({
383
+ address: trustedPin.splitter,
384
+ abi: V13_ABI,
385
+ functionName: "payStable",
386
+ args: [{
387
+ paymentId: invoice.transaction.settle.args.paymentId,
388
+ token: invoice.transaction.settle.args.token,
389
+ grossAmount: BigInt(invoice.transaction.settle.args.grossAmount),
390
+ merchant: invoice.transaction.settle.args.merchant,
391
+ ipCreator: invoice.transaction.settle.args.ipCreator,
392
+ validUntil: BigInt(invoice.transaction.settle.args.validUntil),
393
+ orderId: invoice.transaction.settle.args.orderId,
394
+ }],
395
+ account,
396
+ chain: walletClient.chain,
397
+ });
398
+ }
399
+ else {
400
+ settlementTx = await walletClient.writeContract({
401
+ address: trustedPin.splitter,
402
+ abi: V13_ABI,
403
+ functionName: "payNative",
404
+ args: [{
405
+ paymentId: invoice.transaction.args.paymentId,
406
+ merchant: invoice.transaction.args.merchant,
407
+ grossAmount: BigInt(invoice.transaction.args.grossAmount),
408
+ ipCreator: invoice.transaction.args.ipCreator,
409
+ validUntil: BigInt(invoice.transaction.args.validUntil),
410
+ orderId: invoice.transaction.args.orderId,
411
+ }],
412
+ value: BigInt(invoice.transaction.value),
413
+ account,
414
+ chain: walletClient.chain,
415
+ });
416
+ }
417
+ const blockNumber = await waitSuccess(publicClient, settlementTx);
418
+ return {
419
+ route_class: invoice.route_class,
420
+ chain: invoice.chain,
421
+ payment_id: invoice.payment_id,
422
+ approval_txs: approvalTxs,
423
+ settlement_tx: settlementTx,
424
+ block_number: blockNumber,
425
+ };
426
+ }
427
+ export const SETTLEMENT_CHAIN_IDS = Object.freeze({ ...CHAIN_IDS });
428
+ export const SETTLEMENT_EXPECTED_BPS = Object.freeze({ ...EXPECTED_BPS });
429
+ //# sourceMappingURL=settlement.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settlement.js","sourceRoot":"","sources":["../src/settlement.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /** Bounded transport for payment API requests, including response body reads. */
2
+ export declare class SettlementHttpError extends Error {
3
+ readonly code: string;
4
+ constructor(message: string, code: string);
5
+ }
6
+ export declare function settlementHttp(fetchImpl: typeof fetch, url: string, init?: RequestInit, timeoutMs?: number): Promise<{
7
+ response: Response;
8
+ text: string;
9
+ }>;
10
+ //# sourceMappingURL=settlementHttp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settlementHttp.d.ts","sourceRoot":"","sources":["../src/settlementHttp.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,qBAAa,mBAAoB,SAAQ,KAAK;IACf,QAAQ,CAAC,IAAI,EAAE,MAAM;gBAAtC,OAAO,EAAE,MAAM,EAAW,IAAI,EAAE,MAAM;CAInD;AAED,wBAAsB,cAAc,CAClC,SAAS,EAAE,OAAO,KAAK,EACvB,GAAG,EAAE,MAAM,EACX,IAAI,GAAE,WAAgB,EACtB,SAAS,SAAS,GACjB,OAAO,CAAC;IAAE,QAAQ,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAiD/C"}
@@ -0,0 +1,70 @@
1
+ /** Bounded transport for payment API requests, including response body reads. */
2
+ export class SettlementHttpError extends Error {
3
+ code;
4
+ constructor(message, code) {
5
+ super(message);
6
+ this.code = code;
7
+ this.name = "SettlementHttpError";
8
+ }
9
+ }
10
+ export async function settlementHttp(fetchImpl, url, init = {}, timeoutMs = 15_000) {
11
+ if (!Number.isSafeInteger(timeoutMs) || timeoutMs <= 0 || timeoutMs > 2_147_483_647) {
12
+ throw new SettlementHttpError("invalid payment API timeout", "invalid_timeout");
13
+ }
14
+ const controller = new AbortController();
15
+ let timer;
16
+ const deadline = new Promise((_resolve, reject) => {
17
+ timer = setTimeout(() => {
18
+ const error = new SettlementHttpError("settlement API timed out", "request_timeout");
19
+ controller.abort(error);
20
+ reject(error);
21
+ }, timeoutMs);
22
+ });
23
+ const operation = async () => {
24
+ const response = await fetchImpl(url, { ...init, redirect: "error", signal: controller.signal });
25
+ if (response.redirected || (response.url && response.url !== url) || (response.status >= 300 && response.status < 400)) {
26
+ void response.body?.cancel().catch(() => { });
27
+ throw new SettlementHttpError("settlement API redirect refused", "redirect_refused");
28
+ }
29
+ const reader = response.body?.getReader();
30
+ const chunks = [];
31
+ let size = 0;
32
+ if (reader) {
33
+ const cancel = () => { void reader.cancel().catch(() => { }); };
34
+ controller.signal.addEventListener("abort", cancel, { once: true });
35
+ try {
36
+ if (controller.signal.aborted)
37
+ throw controller.signal.reason;
38
+ for (;;) {
39
+ const { done, value } = await reader.read();
40
+ if (done)
41
+ break;
42
+ size += value.byteLength;
43
+ if (size > 1_048_576 || controller.signal.aborted) {
44
+ void reader.cancel().catch(() => { });
45
+ throw new SettlementHttpError("payment API response exceeded its limit", "response_limit");
46
+ }
47
+ chunks.push(value);
48
+ }
49
+ }
50
+ finally {
51
+ controller.signal.removeEventListener("abort", cancel);
52
+ reader.releaseLock();
53
+ }
54
+ }
55
+ const body = new Uint8Array(size);
56
+ let offset = 0;
57
+ for (const chunk of chunks) {
58
+ body.set(chunk, offset);
59
+ offset += chunk.byteLength;
60
+ }
61
+ return { response, text: new TextDecoder().decode(body) };
62
+ };
63
+ try {
64
+ return await Promise.race([operation(), deadline]);
65
+ }
66
+ finally {
67
+ clearTimeout(timer);
68
+ }
69
+ }
70
+ //# sourceMappingURL=settlementHttp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settlementHttp.js","sourceRoot":"","sources":["../src/settlementHttp.ts"],"names":[],"mappings":"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"}