@obbyx/x402-obyte 0.0.0-stage → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (128) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +65 -2
  3. package/dist/batch/client-store.d.ts +50 -0
  4. package/dist/batch/client-store.d.ts.map +1 -0
  5. package/dist/batch/client-store.js +93 -0
  6. package/dist/batch/client-store.js.map +1 -0
  7. package/dist/batch/client.d.ts +63 -0
  8. package/dist/batch/client.d.ts.map +1 -0
  9. package/dist/batch/client.js +226 -0
  10. package/dist/batch/client.js.map +1 -0
  11. package/dist/batch/facilitator.d.ts +73 -0
  12. package/dist/batch/facilitator.d.ts.map +1 -0
  13. package/dist/batch/facilitator.js +341 -0
  14. package/dist/batch/facilitator.js.map +1 -0
  15. package/dist/batch/gateway.d.ts +21 -0
  16. package/dist/batch/gateway.d.ts.map +1 -0
  17. package/dist/batch/gateway.js +2 -0
  18. package/dist/batch/gateway.js.map +1 -0
  19. package/dist/batch/requirements.d.ts +52 -0
  20. package/dist/batch/requirements.d.ts.map +1 -0
  21. package/dist/batch/requirements.js +80 -0
  22. package/dist/batch/requirements.js.map +1 -0
  23. package/dist/batch/store.d.ts +112 -0
  24. package/dist/batch/store.d.ts.map +1 -0
  25. package/dist/batch/store.js +198 -0
  26. package/dist/batch/store.js.map +1 -0
  27. package/dist/batch/watcher-protocol.d.ts +91 -0
  28. package/dist/batch/watcher-protocol.d.ts.map +1 -0
  29. package/dist/batch/watcher-protocol.js +82 -0
  30. package/dist/batch/watcher-protocol.js.map +1 -0
  31. package/dist/binding/binding.d.ts +32 -0
  32. package/dist/binding/binding.d.ts.map +1 -0
  33. package/dist/binding/binding.js +19 -0
  34. package/dist/binding/binding.js.map +1 -0
  35. package/dist/coins/composer.d.ts +58 -0
  36. package/dist/coins/composer.d.ts.map +1 -0
  37. package/dist/coins/composer.js +102 -0
  38. package/dist/coins/composer.js.map +1 -0
  39. package/dist/coins/index.d.ts +4 -0
  40. package/dist/coins/index.d.ts.map +1 -0
  41. package/dist/coins/index.js +4 -0
  42. package/dist/coins/index.js.map +1 -0
  43. package/dist/coins/reservations.d.ts +37 -0
  44. package/dist/coins/reservations.d.ts.map +1 -0
  45. package/dist/coins/reservations.js +102 -0
  46. package/dist/coins/reservations.js.map +1 -0
  47. package/dist/coins/selection.d.ts +42 -0
  48. package/dist/coins/selection.d.ts.map +1 -0
  49. package/dist/coins/selection.js +60 -0
  50. package/dist/coins/selection.js.map +1 -0
  51. package/dist/exact/client.d.ts +33 -0
  52. package/dist/exact/client.d.ts.map +1 -0
  53. package/dist/exact/client.js +93 -0
  54. package/dist/exact/client.js.map +1 -0
  55. package/dist/exact/facilitator-v1.d.ts +48 -0
  56. package/dist/exact/facilitator-v1.d.ts.map +1 -0
  57. package/dist/exact/facilitator-v1.js +81 -0
  58. package/dist/exact/facilitator-v1.js.map +1 -0
  59. package/dist/exact/facilitator.d.ts +94 -0
  60. package/dist/exact/facilitator.d.ts.map +1 -0
  61. package/dist/exact/facilitator.js +361 -0
  62. package/dist/exact/facilitator.js.map +1 -0
  63. package/dist/exact/finality.d.ts +18 -0
  64. package/dist/exact/finality.d.ts.map +1 -0
  65. package/dist/exact/finality.js +45 -0
  66. package/dist/exact/finality.js.map +1 -0
  67. package/dist/exact/ledger-checks.d.ts +15 -0
  68. package/dist/exact/ledger-checks.d.ts.map +1 -0
  69. package/dist/exact/ledger-checks.js +85 -0
  70. package/dist/exact/ledger-checks.js.map +1 -0
  71. package/dist/exact/reasons.d.ts +29 -0
  72. package/dist/exact/reasons.d.ts.map +1 -0
  73. package/dist/exact/reasons.js +21 -0
  74. package/dist/exact/reasons.js.map +1 -0
  75. package/dist/exact/requirements.d.ts +37 -0
  76. package/dist/exact/requirements.d.ts.map +1 -0
  77. package/dist/exact/requirements.js +80 -0
  78. package/dist/exact/requirements.js.map +1 -0
  79. package/dist/exact/store.d.ts +136 -0
  80. package/dist/exact/store.d.ts.map +1 -0
  81. package/dist/exact/store.js +217 -0
  82. package/dist/exact/store.js.map +1 -0
  83. package/dist/hub/heartbeat.d.ts +12 -0
  84. package/dist/hub/heartbeat.d.ts.map +1 -0
  85. package/dist/hub/heartbeat.js +17 -0
  86. package/dist/hub/heartbeat.js.map +1 -0
  87. package/dist/hub/hub-call.d.ts +20 -0
  88. package/dist/hub/hub-call.d.ts.map +1 -0
  89. package/dist/hub/hub-call.js +30 -0
  90. package/dist/hub/hub-call.js.map +1 -0
  91. package/dist/hub/schemas.d.ts +41 -0
  92. package/dist/hub/schemas.d.ts.map +1 -0
  93. package/dist/hub/schemas.js +71 -0
  94. package/dist/hub/schemas.js.map +1 -0
  95. package/dist/index.d.ts +19 -0
  96. package/dist/index.d.ts.map +1 -0
  97. package/dist/index.js +19 -0
  98. package/dist/index.js.map +1 -0
  99. package/dist/util/keyed-queue.d.ts +13 -0
  100. package/dist/util/keyed-queue.d.ts.map +1 -0
  101. package/dist/util/keyed-queue.js +25 -0
  102. package/dist/util/keyed-queue.js.map +1 -0
  103. package/package.json +51 -3
  104. package/src/batch/client-store.ts +167 -0
  105. package/src/batch/client.ts +317 -0
  106. package/src/batch/facilitator.ts +461 -0
  107. package/src/batch/gateway.ts +22 -0
  108. package/src/batch/requirements.ts +108 -0
  109. package/src/batch/store.ts +359 -0
  110. package/src/batch/watcher-protocol.ts +89 -0
  111. package/src/binding/binding.ts +50 -0
  112. package/src/coins/composer.ts +159 -0
  113. package/src/coins/index.ts +9 -0
  114. package/src/coins/reservations.ts +139 -0
  115. package/src/coins/selection.ts +93 -0
  116. package/src/exact/client.ts +144 -0
  117. package/src/exact/facilitator-v1.ts +137 -0
  118. package/src/exact/facilitator.ts +496 -0
  119. package/src/exact/finality.ts +56 -0
  120. package/src/exact/ledger-checks.ts +113 -0
  121. package/src/exact/reasons.ts +25 -0
  122. package/src/exact/requirements.ts +109 -0
  123. package/src/exact/store.ts +399 -0
  124. package/src/hub/heartbeat.ts +18 -0
  125. package/src/hub/hub-call.ts +46 -0
  126. package/src/hub/schemas.ts +89 -0
  127. package/src/index.ts +111 -0
  128. package/src/util/keyed-queue.ts +25 -0
@@ -0,0 +1,341 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { OBYTE_CAIP_FAMILY, getNetwork, networkKey, parseChannelDefinition, verifySignedPackage, } from '@obbyx/obyte';
3
+ import { moduleLogger, withLogContext } from '@obbyx/obyte/logger';
4
+ import { acceptedMatches, canonical } from '../exact/requirements.js';
5
+ import { hubCall } from '../hub/hub-call.js';
6
+ import { KeyedQueue } from '../util/keyed-queue.js';
7
+ import { parseStateVars } from '../hub/schemas.js';
8
+ import { BATCH_REASONS as R, BATCH_SCHEME, parseBatchRequirements, voucherMessageSchema, } from './requirements.js';
9
+ const fail = (reason, message) => ({ ok: false, reason, message });
10
+ export class BatchObyteFacilitator {
11
+ options;
12
+ scheme = BATCH_SCHEME;
13
+ caipFamily = OBYTE_CAIP_FAMILY;
14
+ log;
15
+ hubTimeoutMs;
16
+ ackTimeoutMs;
17
+ now;
18
+ /** Channel definitions are immutable: cache them. */
19
+ definitions = new Map();
20
+ /** One settle at a time per channel inside this process. */
21
+ /** One voucher at a time per channel inside this process (the DB enforces it across processes). */
22
+ channels = new KeyedQueue();
23
+ constructor(options) {
24
+ this.options = options;
25
+ this.log = moduleLogger(options.logger, 'x402.batch', { scheme: BATCH_SCHEME });
26
+ this.hubTimeoutMs = options.hubTimeoutMs ?? 15_000;
27
+ this.ackTimeoutMs = options.ackTimeoutMs ?? 5_000;
28
+ this.now = options.now ?? (() => Math.floor(Date.now() / 1000));
29
+ }
30
+ getExtra(network) {
31
+ return {
32
+ voucherManager: 'facilitator',
33
+ minTimeout: this.options.minChannelTimeoutSeconds,
34
+ assets: [...(this.options.allowedAssets.get(network) ?? [])],
35
+ };
36
+ }
37
+ /** The facilitator never signs channel triggers (ADR-0001). */
38
+ getSigners() {
39
+ return [];
40
+ }
41
+ async verify(payload, requirements) {
42
+ return withLogContext({ scheme: BATCH_SCHEME, network: requirements.network }, async () => {
43
+ const checked = await this.check(payload, requirements);
44
+ if (!checked.ok) {
45
+ this.log.info({ reason: checked.reason, detail: checked.message }, 'verify rejected');
46
+ return { isValid: false, invalidReason: checked.reason, invalidMessage: checked.message };
47
+ }
48
+ const c = checked.value;
49
+ const channelKey = this.channelKey(c.req.network.caip2, c.voucher.aa_address);
50
+ const existing = await this.options.store.commitmentByHash(c.packageHash);
51
+ if (existing === undefined) {
52
+ const channel = await this.options.store.channel(channelKey);
53
+ const committed = channel?.period === c.voucher.period ? channel.committed : 0n;
54
+ if (channel?.period === c.voucher.period && channel.pendingSeq !== null) {
55
+ return {
56
+ isValid: false,
57
+ invalidReason: R.busy,
58
+ invalidMessage: 'Another voucher is in flight',
59
+ };
60
+ }
61
+ if (BigInt(c.voucher.amount_spent) !== committed + c.req.amount) {
62
+ return {
63
+ isValid: false,
64
+ invalidReason: R.cumulative,
65
+ invalidMessage: `Expected amount_spent ${committed + c.req.amount}`,
66
+ extra: { chargedCumulativeAmount: committed.toString() },
67
+ };
68
+ }
69
+ }
70
+ return { isValid: true, payer: c.payer, extra: { channel: c.voucher.aa_address } };
71
+ });
72
+ }
73
+ async settle(payload, requirements) {
74
+ return withLogContext({ scheme: BATCH_SCHEME, network: requirements.network }, async () => {
75
+ const network = requirements.network;
76
+ const auth = await this.authenticate(payload, requirements);
77
+ const stored = auth.ok
78
+ ? await this.options.store.commitmentByHash(auth.value.packageHash)
79
+ : undefined;
80
+ const checked = auth.ok && stored === undefined ? await this.newVoucherChecks(auth.value) : auth;
81
+ if (!checked.ok) {
82
+ await this.emit({
83
+ key: `${requirements.network}:batch:${requirements.payTo}`,
84
+ kind: 'voucher_refused',
85
+ data: { reason: checked.reason, stage: 'verify' },
86
+ });
87
+ return failure(network, checked.reason, checked.message);
88
+ }
89
+ const c = checked.value;
90
+ const channelKey = this.channelKey(c.req.network.caip2, c.voucher.aa_address);
91
+ return withLogContext({ aa: c.voucher.aa_address, proofId: c.packageHash }, () => this.channels.run(channelKey, () => this.settleLocked(c, channelKey, network)));
92
+ });
93
+ }
94
+ async newVoucherChecks(a) {
95
+ const live = await this.liveChecks(a);
96
+ return live.ok ? { ok: true, value: { ...a, balance: live.value.balance } } : live;
97
+ }
98
+ async settleLocked(c, channelKey, network) {
99
+ const store = this.options.store;
100
+ let commitment = await store.commitmentByHash(c.packageHash);
101
+ if (commitment !== undefined && commitment.binding !== c.voucher.binding) {
102
+ return failure(network, 'invalid_payment_reused', 'This voucher is bound to another operation');
103
+ }
104
+ if (commitment === undefined) {
105
+ const appended = await store.appendPending({
106
+ channelKey,
107
+ network: c.req.network.caip2,
108
+ aa: c.voucher.aa_address,
109
+ payTo: c.req.payTo,
110
+ payer: c.payer,
111
+ asset: c.req.asset,
112
+ period: c.voucher.period,
113
+ amountSpent: BigInt(c.voucher.amount_spent),
114
+ paymentAmount: BigInt(c.voucher.payment_amount),
115
+ binding: c.voucher.binding,
116
+ packageHash: c.packageHash,
117
+ packageJson: c.packageJson,
118
+ });
119
+ if (!appended.ok) {
120
+ const reason = appended.reason === 'channel_busy'
121
+ ? R.busy
122
+ : appended.reason === 'period_mismatch'
123
+ ? R.period
124
+ : R.cumulative;
125
+ await this.emit({
126
+ key: channelKey,
127
+ kind: 'voucher_refused',
128
+ data: {
129
+ reason,
130
+ amountSpent: c.voucher.amount_spent,
131
+ committed: appended.committed.toString(),
132
+ },
133
+ });
134
+ return {
135
+ ...failure(network, reason, `Voucher rejected: ${appended.reason}`),
136
+ extra: { chargedCumulativeAmount: appended.committed.toString() },
137
+ };
138
+ }
139
+ commitment = appended.commitment;
140
+ await this.emit({
141
+ key: channelKey,
142
+ kind: 'voucher_pending',
143
+ data: {
144
+ seq: commitment.seq,
145
+ period: commitment.period,
146
+ amountSpent: commitment.amountSpent.toString(),
147
+ },
148
+ });
149
+ this.log.info({ seq: commitment.seq, amountSpent: commitment.amountSpent.toString() }, 'voucher pending');
150
+ }
151
+ if (commitment.state === 'pending') {
152
+ const delivered = await this.options.gateway.deliver(commitment, this.ackTimeoutMs);
153
+ if (delivered !== 'acked') {
154
+ // Stored here but not yet confirmed by the seller's watcher: the outcome
155
+ // is unknown to the client → settlement_pending (x402: non-empty
156
+ // transaction), retried with the SAME voucher. Distinct from the
157
+ // definite refusal `…_watcher_unavailable` at verification.
158
+ this.log.warn({ seq: commitment.seq }, 'watcher did not ack in time; voucher stays pending');
159
+ await this.emit({ key: channelKey, kind: 'ack_timeout', data: { seq: commitment.seq } });
160
+ return {
161
+ success: false,
162
+ errorReason: 'settlement_pending',
163
+ errorMessage: "Waiting for the seller's watcher to store this voucher; retry with the same voucher",
164
+ transaction: commitmentIdOf(network, commitment),
165
+ network,
166
+ payer: c.payer,
167
+ };
168
+ }
169
+ commitment =
170
+ (await store.commit(commitment.seq, {
171
+ payTo: commitment.payTo,
172
+ network: commitment.network,
173
+ })) ?? commitment;
174
+ this.log.info({ seq: commitment.seq }, 'voucher committed (watcher ack)');
175
+ await this.emit({
176
+ key: channelKey,
177
+ kind: 'voucher_committed',
178
+ data: {
179
+ seq: commitment.seq,
180
+ period: commitment.period,
181
+ amountSpent: commitment.amountSpent.toString(),
182
+ },
183
+ });
184
+ }
185
+ return this.success(network, c, commitment);
186
+ }
187
+ success(network, c, commitment) {
188
+ return {
189
+ success: true,
190
+ payer: c.payer,
191
+ network,
192
+ transaction: '',
193
+ amount: '',
194
+ extra: {
195
+ chargedAmount: commitment.paymentAmount.toString(),
196
+ commitmentId: commitmentIdOf(network, commitment),
197
+ channelState: {
198
+ channelId: commitment.aa,
199
+ period: commitment.period,
200
+ ...(c.balance === undefined ? {} : { balance: c.balance.toString() }),
201
+ chargedCumulativeAmount: commitment.amountSpent.toString(),
202
+ },
203
+ },
204
+ };
205
+ }
206
+ // --- verification -----------------------------------------------------------
207
+ /** Stateless checks: shape, signature, binding, price, the channel's on-chain parameters. */
208
+ async authenticate(payload, requirements) {
209
+ if (payload.x402Version !== 2)
210
+ return fail('invalid_x402_version', 'Only x402 v2 is supported here');
211
+ if (!acceptedMatches(payload, requirements)) {
212
+ return fail('invalid_payment_requirements', 'Accepted requirements differ from the server requirements');
213
+ }
214
+ const parsed = parseBatchRequirements(requirements);
215
+ if (!parsed.ok)
216
+ return fail(parsed.reason, parsed.message);
217
+ const req = parsed.value;
218
+ if (!this.options.allowedAssets.get(req.network.caip2)?.has(req.asset)) {
219
+ return fail('invalid_batch_settlement_obyte_asset', 'Asset is not accepted');
220
+ }
221
+ const client = this.options.clients.get(req.network.caip2);
222
+ if (client === undefined)
223
+ return fail('invalid_network', 'Network is not served');
224
+ // Voucher signature (bound to the network) and content.
225
+ const pkg = payload.payload['signedPackage'];
226
+ const verified = verifySignedPackage(pkg, { network: req.network });
227
+ if (!verified.ok)
228
+ return fail(R.signature, verified.message);
229
+ const voucher = voucherMessageSchema.safeParse(verified.value.message);
230
+ if (!voucher.success)
231
+ return fail(R.payload, `Invalid voucher: ${voucher.error.issues[0]?.message}`);
232
+ const v = voucher.data;
233
+ if (v.binding !== req.extra.binding)
234
+ return fail(R.binding, 'Voucher is bound to another operation');
235
+ if (BigInt(v.payment_amount) !== req.amount)
236
+ return fail(R.amount, 'payment_amount must equal the price');
237
+ // Channel binding: on-chain definition → payTo is party A, signer is party B.
238
+ const params = await this.channelParams(client, v.aa_address);
239
+ if (!params.ok)
240
+ return params;
241
+ const p = params.value;
242
+ if (p.addressA !== req.payTo || p.addressB !== verified.value.signer || p.asset !== req.asset) {
243
+ return fail(R.channelParams, 'Channel does not connect this payer to payTo in this asset');
244
+ }
245
+ const minTimeout = Math.max(this.options.minChannelTimeoutSeconds, req.extra.minTimeout);
246
+ if (p.timeout < minTimeout)
247
+ return fail(R.timeout, `Channel timeout must be at least ${minTimeout} s`);
248
+ const packageJson = canonical(pkg);
249
+ return {
250
+ ok: true,
251
+ value: {
252
+ req,
253
+ voucher: v,
254
+ payer: verified.value.signer,
255
+ channel: p,
256
+ packageJson,
257
+ packageHash: createHash('sha256').update(packageJson).digest('hex'),
258
+ },
259
+ };
260
+ }
261
+ /**
262
+ * Checks that depend on time and live state: offer validity, channel period,
263
+ * closing flag, confirmed deposit, the seller's watcher. Applied only to a
264
+ * NEW voucher: one already stored is re-delivered regardless, because its
265
+ * outcome is decided by the watcher's ack (refusing it now would report a
266
+ * definite failure for a voucher the seller may still redeem).
267
+ */
268
+ async liveChecks(c) {
269
+ const { req, voucher: v } = c;
270
+ if (req.extra.validUntil < this.now())
271
+ return fail(R.quoteExpired, 'The payment offer has expired');
272
+ const client = this.options.clients.get(req.network.caip2);
273
+ if (client === undefined)
274
+ return fail('invalid_network', 'Network is not served');
275
+ // Channel state: same period, not closing, enough confirmed deposit.
276
+ const vars = await hubCall(() => client.api.getAaStateVars({ address: v.aa_address }), this.hubTimeoutMs);
277
+ if (vars.kind !== 'ok')
278
+ return fail(R.ledger, `state vars: ${vars.error}`);
279
+ const state = parseStateVars(vars.value);
280
+ if (state === undefined)
281
+ return fail(R.ledger, 'state vars: malformed hub answer');
282
+ if (state['period'] !== v.period)
283
+ return fail(R.period, `Channel period is ${String(state['period'])}`);
284
+ if (state['close_initiated_by'] !== undefined)
285
+ return fail(R.closing, 'Channel is being closed');
286
+ const balance = BigInt(typeof state['balanceB'] === 'number' ? state['balanceB'] : 0);
287
+ if (BigInt(v.amount_spent) > balance)
288
+ return fail(R.balance, 'amount_spent exceeds the confirmed deposit');
289
+ // The seller's watcher must be able to defend the channel (fail-closed).
290
+ const health = this.options.gateway.health(req.payTo, req.network.caip2, v.aa_address);
291
+ if (!health.ok && health.closing === true)
292
+ return fail(R.closing, health.reason ?? 'The seller is closing this channel');
293
+ if (!health.ok)
294
+ return fail(R.watcher, health.reason ?? "The seller's watcher is not available");
295
+ return { ok: true, value: { balance } };
296
+ }
297
+ /** Full verification of a new voucher. */
298
+ async check(payload, requirements) {
299
+ const auth = await this.authenticate(payload, requirements);
300
+ if (!auth.ok)
301
+ return auth;
302
+ const live = await this.liveChecks(auth.value);
303
+ if (!live.ok)
304
+ return live;
305
+ return { ok: true, value: { ...auth.value, balance: live.value.balance } };
306
+ }
307
+ async channelParams(client, aa) {
308
+ const cached = this.definitions.get(aa);
309
+ if (cached !== undefined)
310
+ return { ok: true, value: cached };
311
+ const res = await hubCall(() => client.api.getDefinition(aa), this.hubTimeoutMs);
312
+ if (res.kind !== 'ok')
313
+ return fail(R.ledger, `definition: ${res.error}`);
314
+ if (res.value === null || res.value === undefined)
315
+ return fail(R.channel, 'Channel AA is not defined on the ledger');
316
+ const parsed = parseChannelDefinition(aa, res.value);
317
+ if (!parsed.ok)
318
+ return fail(R.channel, parsed.message);
319
+ this.definitions.set(aa, parsed.value);
320
+ return { ok: true, value: parsed.value };
321
+ }
322
+ /** The journal must never break a payment: failures are logged, not thrown. */
323
+ async emit(event) {
324
+ try {
325
+ await this.options.events?.(event);
326
+ }
327
+ catch (err) {
328
+ this.log.error({ err, kind: event.kind }, 'cannot write payment event');
329
+ }
330
+ }
331
+ channelKey(network, aa) {
332
+ return networkKey(getNetwork(network), 'aa', aa);
333
+ }
334
+ }
335
+ function commitmentIdOf(network, c) {
336
+ return `${network}:${c.aa}:${c.period}:${c.amountSpent}`;
337
+ }
338
+ function failure(network, reason, message) {
339
+ return { success: false, errorReason: reason, errorMessage: message, transaction: '', network };
340
+ }
341
+ //# sourceMappingURL=facilitator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"facilitator.js","sourceRoot":"","sources":["../../src/batch/facilitator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { CommitmentRow } from './store.js';
2
+ /**
3
+ * Port to the sellers' watchers (ADR-0003, synchronous durable ack).
4
+ *
5
+ * `deliver` resolves `acked` only after the seller's watcher confirmed it has
6
+ * durably stored the commitment; anything else is not an ack. The facilitator
7
+ * reports success to the resource server only after `acked` (fail-closed).
8
+ */
9
+ export interface WatcherHealth {
10
+ readonly ok: boolean;
11
+ readonly reason?: string;
12
+ /** The seller announced it is closing this channel: refuse new vouchers for it. */
13
+ readonly closing?: boolean;
14
+ }
15
+ export interface WatcherGateway {
16
+ /** Is a watcher for this seller connected, recent and funded for defensive triggers? */
17
+ health(payTo: string, network: string, aa?: string): WatcherHealth;
18
+ /** Pushes a commitment and waits for the durable ack (or times out). */
19
+ deliver(commitment: CommitmentRow, timeoutMs: number): Promise<'acked' | 'timeout'>;
20
+ }
21
+ //# sourceMappingURL=gateway.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gateway.d.ts","sourceRoot":"","sources":["../../src/batch/gateway.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD;;;;;;GAMG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,mFAAmF;IACnF,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,cAAc;IAC7B,wFAAwF;IACxF,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG,aAAa,CAAC;IACnE,wEAAwE;IACxE,OAAO,CAAC,UAAU,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC,CAAC;CACrF"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=gateway.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gateway.js","sourceRoot":"","sources":["../../src/batch/gateway.ts"],"names":[],"mappings":""}
@@ -0,0 +1,52 @@
1
+ import type { PaymentRequirements } from '@x402/core/types';
2
+ import { type ObyteNetwork, type Verdict } from '@obbyx/obyte';
3
+ import { z } from 'zod';
4
+ export declare const BATCH_SCHEME = "batch-settlement";
5
+ /** Error codes of the Obyte binding (`invalid_batch_settlement_obyte_*`). */
6
+ export declare const BATCH_REASONS: {
7
+ readonly payload: "invalid_batch_settlement_obyte_payload";
8
+ readonly signature: "invalid_batch_settlement_obyte_voucher_signature";
9
+ readonly channel: "invalid_batch_settlement_obyte_channel_not_found";
10
+ readonly channelParams: "invalid_batch_settlement_obyte_channel_params";
11
+ readonly timeout: "invalid_batch_settlement_obyte_channel_timeout";
12
+ readonly period: "invalid_batch_settlement_obyte_period_mismatch";
13
+ readonly closing: "invalid_batch_settlement_obyte_channel_closing";
14
+ readonly balance: "invalid_batch_settlement_obyte_cumulative_exceeds_balance";
15
+ readonly cumulative: "invalid_batch_settlement_obyte_cumulative_amount_mismatch";
16
+ readonly amount: "invalid_batch_settlement_obyte_payment_amount_mismatch";
17
+ readonly binding: "invalid_batch_settlement_obyte_binding_mismatch";
18
+ readonly busy: "invalid_batch_settlement_obyte_channel_busy";
19
+ readonly watcher: "invalid_batch_settlement_obyte_watcher_unavailable";
20
+ readonly ledger: "invalid_batch_settlement_obyte_ledger_unavailable";
21
+ readonly quoteExpired: "invalid_batch_settlement_obyte_quote_expired";
22
+ };
23
+ export declare const batchExtraSchema: z.ZodObject<{
24
+ binding: z.ZodString;
25
+ quoteId: z.ZodString;
26
+ validUntil: z.ZodNumber;
27
+ baseAa: z.ZodLiteral<"4IRUGAUUCAQ6QRQLG4SNOLOE6VW2STWZ">;
28
+ minTimeout: z.ZodNumber;
29
+ paymentFlow: z.ZodOptional<z.ZodEnum<{
30
+ authorization: "authorization";
31
+ upfront: "upfront";
32
+ }>>;
33
+ }, z.core.$strict>;
34
+ export type BatchExtra = z.infer<typeof batchExtraSchema>;
35
+ /** The voucher: a signed package as used by aa-channels-lib, plus our binding. */
36
+ export declare const voucherMessageSchema: z.ZodObject<{
37
+ aa_address: z.ZodString;
38
+ period: z.ZodNumber;
39
+ amount_spent: z.ZodNumber;
40
+ payment_amount: z.ZodNumber;
41
+ binding: z.ZodString;
42
+ }, z.core.$strict>;
43
+ export type VoucherMessage = z.infer<typeof voucherMessageSchema>;
44
+ export interface ParsedBatchRequirements {
45
+ readonly network: ObyteNetwork;
46
+ readonly asset: string;
47
+ readonly amount: bigint;
48
+ readonly payTo: string;
49
+ readonly extra: BatchExtra;
50
+ }
51
+ export declare function parseBatchRequirements(req: PaymentRequirements): Verdict<ParsedBatchRequirements>;
52
+ //# sourceMappingURL=requirements.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"requirements.d.ts","sourceRoot":"","sources":["../../src/batch/requirements.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAEL,KAAK,YAAY,EACjB,KAAK,OAAO,EAQb,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,YAAY,qBAAqB,CAAC;AAE/C,6EAA6E;AAC7E,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;CAgBhB,CAAC;AAEX,eAAO,MAAM,gBAAgB;;;;;;;;;;kBAiBlB,CAAC;AAEZ,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAE1D,kFAAkF;AAClF,eAAO,MAAM,oBAAoB;;;;;;kBAStB,CAAC;AAEZ,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAElE,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC;IAC/B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;CAC5B;AAED,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,mBAAmB,GAAG,OAAO,CAAC,uBAAuB,CAAC,CA4BjG"}
@@ -0,0 +1,80 @@
1
+ import { CHANNEL_BASE_AA, accept, getNetwork, isAddress, isAssetId, isObyteNetwork, parseAmount, reject, } from '@obbyx/obyte';
2
+ import { z } from 'zod';
3
+ export const BATCH_SCHEME = 'batch-settlement';
4
+ /** Error codes of the Obyte binding (`invalid_batch_settlement_obyte_*`). */
5
+ export const BATCH_REASONS = {
6
+ payload: 'invalid_batch_settlement_obyte_payload',
7
+ signature: 'invalid_batch_settlement_obyte_voucher_signature',
8
+ channel: 'invalid_batch_settlement_obyte_channel_not_found',
9
+ channelParams: 'invalid_batch_settlement_obyte_channel_params',
10
+ timeout: 'invalid_batch_settlement_obyte_channel_timeout',
11
+ period: 'invalid_batch_settlement_obyte_period_mismatch',
12
+ closing: 'invalid_batch_settlement_obyte_channel_closing',
13
+ balance: 'invalid_batch_settlement_obyte_cumulative_exceeds_balance',
14
+ cumulative: 'invalid_batch_settlement_obyte_cumulative_amount_mismatch',
15
+ amount: 'invalid_batch_settlement_obyte_payment_amount_mismatch',
16
+ binding: 'invalid_batch_settlement_obyte_binding_mismatch',
17
+ busy: 'invalid_batch_settlement_obyte_channel_busy',
18
+ watcher: 'invalid_batch_settlement_obyte_watcher_unavailable',
19
+ ledger: 'invalid_batch_settlement_obyte_ledger_unavailable',
20
+ quoteExpired: 'invalid_batch_settlement_obyte_quote_expired',
21
+ };
22
+ export const batchExtraSchema = z
23
+ .object({
24
+ binding: z.string().regex(/^[0-9a-f]{64}$/),
25
+ quoteId: z
26
+ .string()
27
+ .min(8)
28
+ .max(64)
29
+ .regex(/^[A-Za-z0-9_-]+$/),
30
+ validUntil: z.number().int().positive(),
31
+ baseAa: z.literal(CHANNEL_BASE_AA),
32
+ /** Minimum channel dispute window the seller accepts (seconds). */
33
+ minTimeout: z.number().int().positive(),
34
+ // x402 §6.1: Obyte supports the `upfront` flow (settle, then serve) and the
35
+ // default `authorization` flow; `escrow` and any asset transfer method
36
+ // (there is none on Obyte: the payer signs the transfer itself) are refused.
37
+ paymentFlow: z.enum(['authorization', 'upfront']).optional(),
38
+ })
39
+ .strict();
40
+ /** The voucher: a signed package as used by aa-channels-lib, plus our binding. */
41
+ export const voucherMessageSchema = z
42
+ .object({
43
+ aa_address: z.string(),
44
+ period: z.number().int().positive(),
45
+ // Safe integers only: a larger JSON number cannot be read back exactly.
46
+ amount_spent: z.number().int().positive().max(Number.MAX_SAFE_INTEGER),
47
+ payment_amount: z.number().int().positive().max(Number.MAX_SAFE_INTEGER),
48
+ binding: z.string().regex(/^[0-9a-f]{64}$/),
49
+ })
50
+ .strict();
51
+ export function parseBatchRequirements(req) {
52
+ if (req.scheme !== BATCH_SCHEME)
53
+ return reject('unsupported_scheme', 'Scheme is not batch-settlement');
54
+ if (!isObyteNetwork(req.network))
55
+ return reject('invalid_network', 'Not an Obyte network');
56
+ if (!isAssetId(req.asset) || !isAddress(req.payTo)) {
57
+ return reject('invalid_payment_requirements', 'Invalid asset or payTo');
58
+ }
59
+ let amount;
60
+ try {
61
+ amount = parseAmount(req.amount);
62
+ }
63
+ catch {
64
+ return reject('invalid_payment_requirements', 'Invalid amount');
65
+ }
66
+ if (amount <= 0n)
67
+ return reject('invalid_payment_requirements', 'Amount must be positive');
68
+ const extra = batchExtraSchema.safeParse(req.extra);
69
+ if (!extra.success) {
70
+ return reject('invalid_payment_requirements', `Invalid extra: ${extra.error.issues[0]?.message}`);
71
+ }
72
+ return accept({
73
+ network: getNetwork(req.network),
74
+ asset: req.asset,
75
+ amount,
76
+ payTo: req.payTo,
77
+ extra: extra.data,
78
+ });
79
+ }
80
+ //# sourceMappingURL=requirements.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"requirements.js","sourceRoot":"","sources":["../../src/batch/requirements.ts"],"names":[],"mappings":"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"}