@bankofai/x402 0.5.9 → 0.6.0-beta.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 (211) hide show
  1. package/dist/client/x402Client.js +1 -1
  2. package/dist/client/x402Client.js.map +1 -1
  3. package/dist/errors.d.ts +8 -0
  4. package/dist/errors.d.ts.map +1 -1
  5. package/dist/errors.js +13 -0
  6. package/dist/errors.js.map +1 -1
  7. package/dist/facilitator/client.d.ts +77 -0
  8. package/dist/facilitator/client.d.ts.map +1 -0
  9. package/dist/facilitator/client.js +130 -0
  10. package/dist/facilitator/client.js.map +1 -0
  11. package/dist/facilitator/index.d.ts +14 -0
  12. package/dist/facilitator/index.d.ts.map +1 -0
  13. package/dist/facilitator/index.js +12 -0
  14. package/dist/facilitator/index.js.map +1 -0
  15. package/dist/facilitator/x402Facilitator.d.ts +97 -0
  16. package/dist/facilitator/x402Facilitator.d.ts.map +1 -0
  17. package/dist/facilitator/x402Facilitator.js +212 -0
  18. package/dist/facilitator/x402Facilitator.js.map +1 -0
  19. package/dist/http/client.d.ts +66 -17
  20. package/dist/http/client.d.ts.map +1 -1
  21. package/dist/http/client.js +90 -31
  22. package/dist/http/client.js.map +1 -1
  23. package/dist/index.d.ts +4 -1
  24. package/dist/index.d.ts.map +1 -1
  25. package/dist/index.js +7 -1
  26. package/dist/index.js.map +1 -1
  27. package/dist/mechanisms/_base/index.d.ts +19 -0
  28. package/dist/mechanisms/_base/index.d.ts.map +1 -0
  29. package/dist/mechanisms/_base/index.js +17 -0
  30. package/dist/mechanisms/_base/index.js.map +1 -0
  31. package/dist/mechanisms/_exact_base/adapter.d.ts +23 -0
  32. package/dist/mechanisms/_exact_base/adapter.d.ts.map +1 -0
  33. package/dist/mechanisms/_exact_base/adapter.js +9 -0
  34. package/dist/mechanisms/_exact_base/adapter.js.map +1 -0
  35. package/dist/mechanisms/_exact_base/evmAdapter.d.ts +10 -0
  36. package/dist/mechanisms/_exact_base/evmAdapter.d.ts.map +1 -0
  37. package/dist/mechanisms/_exact_base/evmAdapter.js +28 -0
  38. package/dist/mechanisms/_exact_base/evmAdapter.js.map +1 -0
  39. package/dist/mechanisms/_exact_base/facilitator.d.ts +46 -0
  40. package/dist/mechanisms/_exact_base/facilitator.d.ts.map +1 -0
  41. package/dist/mechanisms/_exact_base/facilitator.js +87 -0
  42. package/dist/mechanisms/_exact_base/facilitator.js.map +1 -0
  43. package/dist/mechanisms/_exact_base/index.d.ts +12 -0
  44. package/dist/mechanisms/_exact_base/index.d.ts.map +1 -0
  45. package/dist/mechanisms/_exact_base/index.js +10 -0
  46. package/dist/mechanisms/_exact_base/index.js.map +1 -0
  47. package/dist/mechanisms/_exact_base/server.d.ts +40 -0
  48. package/dist/mechanisms/_exact_base/server.d.ts.map +1 -0
  49. package/dist/mechanisms/_exact_base/server.js +62 -0
  50. package/dist/mechanisms/_exact_base/server.js.map +1 -0
  51. package/dist/mechanisms/_exact_base/tronAdapter.d.ts +11 -0
  52. package/dist/mechanisms/_exact_base/tronAdapter.d.ts.map +1 -0
  53. package/dist/mechanisms/_exact_base/tronAdapter.js +48 -0
  54. package/dist/mechanisms/_exact_base/tronAdapter.js.map +1 -0
  55. package/dist/mechanisms/{nativeExact.d.ts → _exact_base/types.d.ts} +4 -4
  56. package/dist/mechanisms/_exact_base/types.d.ts.map +1 -0
  57. package/dist/mechanisms/{nativeExact.js → _exact_base/types.js} +1 -1
  58. package/dist/mechanisms/_exact_base/types.js.map +1 -0
  59. package/dist/mechanisms/_exact_permit_base/facilitator.d.ts +44 -0
  60. package/dist/mechanisms/_exact_permit_base/facilitator.d.ts.map +1 -0
  61. package/dist/mechanisms/_exact_permit_base/facilitator.js +65 -0
  62. package/dist/mechanisms/_exact_permit_base/facilitator.js.map +1 -0
  63. package/dist/mechanisms/_exact_permit_base/index.d.ts +8 -0
  64. package/dist/mechanisms/_exact_permit_base/index.d.ts.map +1 -0
  65. package/dist/mechanisms/_exact_permit_base/index.js +7 -0
  66. package/dist/mechanisms/_exact_permit_base/index.js.map +1 -0
  67. package/dist/mechanisms/_exact_permit_base/server.d.ts +31 -0
  68. package/dist/mechanisms/_exact_permit_base/server.d.ts.map +1 -0
  69. package/dist/mechanisms/_exact_permit_base/server.js +53 -0
  70. package/dist/mechanisms/_exact_permit_base/server.js.map +1 -0
  71. package/dist/mechanisms/{nativeExactEvm.d.ts → evm/exact/client.d.ts} +2 -2
  72. package/dist/mechanisms/evm/exact/client.d.ts.map +1 -0
  73. package/dist/mechanisms/{nativeExactEvm.js → evm/exact/client.js} +4 -4
  74. package/dist/mechanisms/evm/exact/client.js.map +1 -0
  75. package/dist/mechanisms/evm/exact/facilitator.d.ts +20 -0
  76. package/dist/mechanisms/evm/exact/facilitator.d.ts.map +1 -0
  77. package/dist/mechanisms/evm/exact/facilitator.js +28 -0
  78. package/dist/mechanisms/evm/exact/facilitator.js.map +1 -0
  79. package/dist/mechanisms/evm/exact/index.d.ts +4 -0
  80. package/dist/mechanisms/evm/exact/index.d.ts.map +1 -0
  81. package/dist/mechanisms/evm/exact/index.js +4 -0
  82. package/dist/mechanisms/evm/exact/index.js.map +1 -0
  83. package/dist/mechanisms/evm/exact/server.d.ts +19 -0
  84. package/dist/mechanisms/evm/exact/server.d.ts.map +1 -0
  85. package/dist/mechanisms/evm/exact/server.js +23 -0
  86. package/dist/mechanisms/evm/exact/server.js.map +1 -0
  87. package/dist/mechanisms/{exactEvm.d.ts → evm/exact_permit/client.d.ts} +2 -2
  88. package/dist/mechanisms/evm/exact_permit/client.d.ts.map +1 -0
  89. package/dist/mechanisms/{exactEvm.js → evm/exact_permit/client.js} +2 -2
  90. package/dist/mechanisms/evm/exact_permit/client.js.map +1 -0
  91. package/dist/mechanisms/evm/exact_permit/facilitator.d.ts +18 -0
  92. package/dist/mechanisms/evm/exact_permit/facilitator.d.ts.map +1 -0
  93. package/dist/mechanisms/evm/exact_permit/facilitator.js +25 -0
  94. package/dist/mechanisms/evm/exact_permit/facilitator.js.map +1 -0
  95. package/dist/mechanisms/evm/exact_permit/index.d.ts +4 -0
  96. package/dist/mechanisms/evm/exact_permit/index.d.ts.map +1 -0
  97. package/dist/mechanisms/evm/exact_permit/index.js +4 -0
  98. package/dist/mechanisms/evm/exact_permit/index.js.map +1 -0
  99. package/dist/mechanisms/evm/exact_permit/server.d.ts +11 -0
  100. package/dist/mechanisms/evm/exact_permit/server.d.ts.map +1 -0
  101. package/dist/mechanisms/evm/exact_permit/server.js +16 -0
  102. package/dist/mechanisms/evm/exact_permit/server.js.map +1 -0
  103. package/dist/mechanisms/index.d.ts +27 -7
  104. package/dist/mechanisms/index.d.ts.map +1 -1
  105. package/dist/mechanisms/index.js +27 -11
  106. package/dist/mechanisms/index.js.map +1 -1
  107. package/dist/mechanisms/{nativeExactTron.d.ts → tron/exact/client.d.ts} +2 -2
  108. package/dist/mechanisms/tron/exact/client.d.ts.map +1 -0
  109. package/dist/mechanisms/{nativeExactTron.js → tron/exact/client.js} +4 -4
  110. package/dist/mechanisms/tron/exact/client.js.map +1 -0
  111. package/dist/mechanisms/tron/exact/facilitator.d.ts +17 -0
  112. package/dist/mechanisms/tron/exact/facilitator.d.ts.map +1 -0
  113. package/dist/mechanisms/tron/exact/facilitator.js +25 -0
  114. package/dist/mechanisms/tron/exact/facilitator.js.map +1 -0
  115. package/dist/mechanisms/tron/exact/index.d.ts +4 -0
  116. package/dist/mechanisms/tron/exact/index.d.ts.map +1 -0
  117. package/dist/mechanisms/tron/exact/index.js +4 -0
  118. package/dist/mechanisms/tron/exact/index.js.map +1 -0
  119. package/dist/mechanisms/tron/exact/server.d.ts +18 -0
  120. package/dist/mechanisms/tron/exact/server.d.ts.map +1 -0
  121. package/dist/mechanisms/tron/exact/server.js +22 -0
  122. package/dist/mechanisms/tron/exact/server.js.map +1 -0
  123. package/dist/mechanisms/{exactGasfree.d.ts → tron/exact_gasfree/client.d.ts} +3 -3
  124. package/dist/mechanisms/tron/exact_gasfree/client.d.ts.map +1 -0
  125. package/dist/mechanisms/{exactGasfree.js → tron/exact_gasfree/client.js} +4 -4
  126. package/dist/mechanisms/tron/exact_gasfree/client.js.map +1 -0
  127. package/dist/mechanisms/tron/exact_gasfree/facilitator.d.ts +38 -0
  128. package/dist/mechanisms/tron/exact_gasfree/facilitator.d.ts.map +1 -0
  129. package/dist/mechanisms/tron/exact_gasfree/facilitator.js +71 -0
  130. package/dist/mechanisms/tron/exact_gasfree/facilitator.js.map +1 -0
  131. package/dist/mechanisms/tron/exact_gasfree/index.d.ts +5 -0
  132. package/dist/mechanisms/tron/exact_gasfree/index.d.ts.map +1 -0
  133. package/dist/mechanisms/tron/exact_gasfree/index.js +4 -0
  134. package/dist/mechanisms/tron/exact_gasfree/index.js.map +1 -0
  135. package/dist/mechanisms/tron/exact_gasfree/server.d.ts +23 -0
  136. package/dist/mechanisms/tron/exact_gasfree/server.d.ts.map +1 -0
  137. package/dist/mechanisms/tron/exact_gasfree/server.js +43 -0
  138. package/dist/mechanisms/tron/exact_gasfree/server.js.map +1 -0
  139. package/dist/mechanisms/{exact.d.ts → tron/exact_permit/client.d.ts} +2 -2
  140. package/dist/mechanisms/tron/exact_permit/client.d.ts.map +1 -0
  141. package/dist/mechanisms/{exact.js → tron/exact_permit/client.js} +2 -2
  142. package/dist/mechanisms/tron/exact_permit/client.js.map +1 -0
  143. package/dist/mechanisms/tron/exact_permit/facilitator.d.ts +17 -0
  144. package/dist/mechanisms/tron/exact_permit/facilitator.d.ts.map +1 -0
  145. package/dist/mechanisms/tron/exact_permit/facilitator.js +24 -0
  146. package/dist/mechanisms/tron/exact_permit/facilitator.js.map +1 -0
  147. package/dist/mechanisms/tron/exact_permit/index.d.ts +4 -0
  148. package/dist/mechanisms/tron/exact_permit/index.d.ts.map +1 -0
  149. package/dist/mechanisms/tron/exact_permit/index.js +4 -0
  150. package/dist/mechanisms/tron/exact_permit/index.js.map +1 -0
  151. package/dist/mechanisms/tron/exact_permit/server.d.ts +11 -0
  152. package/dist/mechanisms/tron/exact_permit/server.d.ts.map +1 -0
  153. package/dist/mechanisms/tron/exact_permit/server.js +22 -0
  154. package/dist/mechanisms/tron/exact_permit/server.js.map +1 -0
  155. package/dist/middleware/core.d.ts +75 -0
  156. package/dist/middleware/core.d.ts.map +1 -0
  157. package/dist/middleware/core.js +132 -0
  158. package/dist/middleware/core.js.map +1 -0
  159. package/dist/middleware/express.d.ts +40 -0
  160. package/dist/middleware/express.d.ts.map +1 -0
  161. package/dist/middleware/express.js +83 -0
  162. package/dist/middleware/express.js.map +1 -0
  163. package/dist/middleware/hono.d.ts +43 -0
  164. package/dist/middleware/hono.d.ts.map +1 -0
  165. package/dist/middleware/hono.js +72 -0
  166. package/dist/middleware/hono.js.map +1 -0
  167. package/dist/middleware/index.d.ts +12 -0
  168. package/dist/middleware/index.d.ts.map +1 -0
  169. package/dist/middleware/index.js +11 -0
  170. package/dist/middleware/index.js.map +1 -0
  171. package/dist/server/index.d.ts +12 -0
  172. package/dist/server/index.d.ts.map +1 -0
  173. package/dist/server/index.js +10 -0
  174. package/dist/server/index.js.map +1 -0
  175. package/dist/server/types.d.ts +78 -0
  176. package/dist/server/types.d.ts.map +1 -0
  177. package/dist/server/types.js +12 -0
  178. package/dist/server/types.js.map +1 -0
  179. package/dist/server/x402Server.d.ts +115 -0
  180. package/dist/server/x402Server.d.ts.map +1 -0
  181. package/dist/server/x402Server.js +318 -0
  182. package/dist/server/x402Server.js.map +1 -0
  183. package/dist/tokens.d.ts +29 -0
  184. package/dist/tokens.d.ts.map +1 -1
  185. package/dist/tokens.js +44 -0
  186. package/dist/tokens.js.map +1 -1
  187. package/dist/utils/encoding.d.ts +7 -0
  188. package/dist/utils/encoding.d.ts.map +1 -1
  189. package/dist/utils/encoding.js +15 -0
  190. package/dist/utils/encoding.js.map +1 -1
  191. package/dist/utils/index.d.ts +1 -1
  192. package/dist/utils/index.d.ts.map +1 -1
  193. package/dist/utils/index.js +1 -1
  194. package/dist/utils/index.js.map +1 -1
  195. package/dist/utils/tx_verification.d.ts +113 -0
  196. package/dist/utils/tx_verification.d.ts.map +1 -0
  197. package/dist/utils/tx_verification.js +98 -0
  198. package/dist/utils/tx_verification.js.map +1 -0
  199. package/package.json +15 -2
  200. package/dist/mechanisms/exact.d.ts.map +0 -1
  201. package/dist/mechanisms/exact.js.map +0 -1
  202. package/dist/mechanisms/exactEvm.d.ts.map +0 -1
  203. package/dist/mechanisms/exactEvm.js.map +0 -1
  204. package/dist/mechanisms/exactGasfree.d.ts.map +0 -1
  205. package/dist/mechanisms/exactGasfree.js.map +0 -1
  206. package/dist/mechanisms/nativeExact.d.ts.map +0 -1
  207. package/dist/mechanisms/nativeExact.js.map +0 -1
  208. package/dist/mechanisms/nativeExactEvm.d.ts.map +0 -1
  209. package/dist/mechanisms/nativeExactEvm.js.map +0 -1
  210. package/dist/mechanisms/nativeExactTron.d.ts.map +0 -1
  211. package/dist/mechanisms/nativeExactTron.js.map +0 -1
@@ -0,0 +1,318 @@
1
+ /**
2
+ * X402Server — TypeScript port of `bankofai.x402.server.X402Server`.
3
+ *
4
+ * High-level server orchestration:
5
+ * - Registry of {@link ServerMechanism}s keyed by `(network, scheme)`
6
+ * - Build {@link PaymentRequirements} from {@link ResourceConfig} via `parsePrice`
7
+ * + optional facilitator `feeQuote` enrichment for permit-style schemes
8
+ * - Anti-tamper validation of incoming `PaymentPayload` against server's
9
+ * original requirements
10
+ * - Delegates `/verify` and `/settle` to a {@link FacilitatorClient}
11
+ *
12
+ * This sits **above** the framework-agnostic {@link processX402Request} core
13
+ * (see `src/middleware/core.ts`). Framework middleware (Hono / Express)
14
+ * can be wired against either:
15
+ * - Raw `accepts[]` + `FacilitatorClient` (lower-level, `processX402Request`)
16
+ * - `X402Server` + `ResourceConfig[]` (higher-level, this file)
17
+ */
18
+ import { getAddress, isAddress } from 'viem';
19
+ import { parsePrice } from '../tokens.js';
20
+ import { generatePaymentId } from '../utils/index.js';
21
+ import { PAYMENT_ONLY } from './types.js';
22
+ /**
23
+ * Default {@link ServerMechanism} that delegates `parsePrice` to the token
24
+ * registry and applies a no-op `enhancePaymentRequirements`. Useful when a
25
+ * chain/scheme needs no scheme-specific enrichment.
26
+ */
27
+ export class DefaultServerMechanism {
28
+ schemeName;
29
+ constructor(schemeName) {
30
+ this.schemeName = schemeName;
31
+ }
32
+ scheme() {
33
+ return this.schemeName;
34
+ }
35
+ async parsePrice(price, network) {
36
+ return parsePrice(price, network);
37
+ }
38
+ async enhancePaymentRequirements(requirements, _deliveryMode) {
39
+ return requirements;
40
+ }
41
+ validatePaymentRequirements(_requirements) {
42
+ return true;
43
+ }
44
+ }
45
+ /**
46
+ * Core server orchestration. One instance per resource server.
47
+ *
48
+ * @example
49
+ * ```ts
50
+ * const facilitator = new FacilitatorClient({ baseUrl: 'https://fac.example' });
51
+ * const server = new X402Server()
52
+ * .register('tron:nile', new DefaultServerMechanism('exact_permit'))
53
+ * .setFacilitator(facilitator);
54
+ *
55
+ * const accepts = await server.buildPaymentRequirements([
56
+ * { scheme: 'exact_permit', network: 'tron:nile', price: '1 USDT', payTo: 'T...' },
57
+ * ]);
58
+ * const challenge = server.createPaymentRequiredResponse(accepts);
59
+ * ```
60
+ */
61
+ export class X402Server {
62
+ /** network → scheme → mechanism */
63
+ mechanisms = new Map();
64
+ facilitator = null;
65
+ /** Register a {@link ServerMechanism} for one network. Chainable. */
66
+ register(network, mechanism) {
67
+ const scheme = mechanism.scheme();
68
+ let byScheme = this.mechanisms.get(network);
69
+ if (!byScheme) {
70
+ byScheme = new Map();
71
+ this.mechanisms.set(network, byScheme);
72
+ }
73
+ byScheme.set(scheme, mechanism);
74
+ return this;
75
+ }
76
+ /** Set the facilitator client. Required before {@link verifyPayment} / {@link settlePayment}. */
77
+ setFacilitator(client) {
78
+ this.facilitator = client;
79
+ return this;
80
+ }
81
+ /**
82
+ * Turn a list of {@link ResourceConfig} into ready-to-serve {@link PaymentRequirements}.
83
+ *
84
+ * Pipeline per config:
85
+ * 1. Find mechanism by `(network, scheme)`; throw if not registered.
86
+ * 2. Parse `price` → asset + amount via mechanism.
87
+ * 3. Build initial `PaymentRequirements`.
88
+ * 4. Let mechanism `enhancePaymentRequirements` attach extras (token name/version, etc.).
89
+ * 5. Normalize EVM addresses via checksum.
90
+ *
91
+ * If a facilitator is configured, permit-style requirements (`scheme !== 'exact'`)
92
+ * get enriched with `extra.fee` from `/fee/quote`. Unsupported (network, scheme, asset)
93
+ * tuples returned by the facilitator are silently dropped from the result.
94
+ *
95
+ * Mirrors Python `X402Server.build_payment_requirements`.
96
+ */
97
+ async buildPaymentRequirements(configs) {
98
+ const built = [];
99
+ for (const config of configs) {
100
+ const mechanism = this.findMechanism(config.network, config.scheme);
101
+ if (!mechanism) {
102
+ throw new Error(`No ServerMechanism registered for network=${config.network}, scheme=${config.scheme}`);
103
+ }
104
+ const assetInfo = await mechanism.parsePrice(config.price, config.network);
105
+ let requirements = {
106
+ scheme: config.scheme,
107
+ network: config.network,
108
+ amount: assetInfo.amount,
109
+ asset: assetInfo.asset,
110
+ payTo: config.payTo,
111
+ maxTimeoutSeconds: config.validFor ?? 3600,
112
+ };
113
+ requirements = await mechanism.enhancePaymentRequirements(requirements, config.deliveryMode ?? PAYMENT_ONLY);
114
+ requirements = this.normalizeEvmRequirements(requirements);
115
+ built.push(requirements);
116
+ }
117
+ if (!this.facilitator) {
118
+ throw new Error('Facilitator is not set (call setFacilitator first)');
119
+ }
120
+ // Split: exact doesn't need fee quote; everything else (permit-style) does.
121
+ const exactReqs = built.filter((r) => r.scheme === 'exact');
122
+ const permitReqs = built.filter((r) => r.scheme !== 'exact');
123
+ const supported = [...exactReqs];
124
+ if (permitReqs.length > 0) {
125
+ const quotes = await this.facilitator.feeQuote(permitReqs);
126
+ const quoteMap = new Map();
127
+ for (const q of quotes) {
128
+ quoteMap.set(`${q.scheme}|${q.network}|${q.asset}`, q);
129
+ }
130
+ for (const req of permitReqs) {
131
+ const quote = quoteMap.get(`${req.scheme}|${req.network}|${req.asset}`);
132
+ if (!quote) {
133
+ // Facilitator can't quote this (unsupported token / scheme). Silently skip.
134
+ continue;
135
+ }
136
+ const enriched = {
137
+ ...req,
138
+ extra: {
139
+ ...(req.extra ?? {}),
140
+ fee: {
141
+ ...quote.fee,
142
+ facilitatorId: this.facilitator.facilitatorId,
143
+ },
144
+ },
145
+ };
146
+ supported.push(this.normalizeEvmRequirements(enriched));
147
+ }
148
+ }
149
+ return supported;
150
+ }
151
+ /**
152
+ * Build the 402 PaymentRequired challenge body. The facilitator is not
153
+ * consulted here — the caller has already obtained `requirements` via
154
+ * {@link buildPaymentRequirements} or constructed them by hand.
155
+ */
156
+ createPaymentRequiredResponse(requirements, options = {}) {
157
+ const now = Math.floor(Date.now() / 1000);
158
+ const validBefore = options.validBefore ?? now + 3600;
159
+ const validAfter = options.validAfter ?? now;
160
+ return {
161
+ x402Version: 2,
162
+ error: 'Payment required',
163
+ ...(options.resource ? { resource: options.resource } : {}),
164
+ accepts: requirements,
165
+ extensions: {
166
+ paymentPermitContext: {
167
+ meta: {
168
+ kind: PAYMENT_ONLY,
169
+ paymentId: options.paymentId ?? generatePaymentId(),
170
+ nonce: options.nonce ?? generateNonce(),
171
+ validAfter,
172
+ validBefore,
173
+ },
174
+ },
175
+ },
176
+ };
177
+ }
178
+ /**
179
+ * Anti-tamper validation + optional server-side signature check, then
180
+ * delegate to the facilitator. Mirrors Python `verify_payment`.
181
+ */
182
+ async verifyPayment(payload, requirements) {
183
+ if (!this.validatePayloadMatchesRequirements(payload, requirements)) {
184
+ return { isValid: false, invalidReason: 'payload_mismatch' };
185
+ }
186
+ const mechanism = this.findMechanism(requirements.network, requirements.scheme);
187
+ if (mechanism?.verifySignature) {
188
+ const permit = payload.payload.paymentPermit ?? null;
189
+ const signature = payload.payload.signature;
190
+ const ok = await mechanism.verifySignature(permit, signature, requirements.network);
191
+ if (!ok) {
192
+ return { isValid: false, invalidReason: 'invalid_signature_server' };
193
+ }
194
+ }
195
+ if (!this.facilitator) {
196
+ return { isValid: false, invalidReason: 'no_facilitator' };
197
+ }
198
+ return this.facilitator.verify(payload, requirements);
199
+ }
200
+ /** Delegate settlement to the facilitator. Mirrors Python `settle_payment`. */
201
+ async settlePayment(payload, requirements) {
202
+ if (!this.facilitator) {
203
+ return {
204
+ success: false,
205
+ network: requirements.network,
206
+ errorReason: 'no_facilitator',
207
+ };
208
+ }
209
+ return this.facilitator.settle(payload, requirements);
210
+ }
211
+ /**
212
+ * Anti-tampering: the client's `payload.accepted` must match server's
213
+ * canonical `requirements`, and the embedded authorization / permit must
214
+ * point at the right asset / payTo / amount.
215
+ *
216
+ * Two flavors:
217
+ * - `exact` (ERC-3009): inspects `payload.payload.authorization`
218
+ * - other (permit-style): inspects `payload.payload.paymentPermit`
219
+ */
220
+ validatePayloadMatchesRequirements(payload, requirements) {
221
+ if (requirements.scheme === 'exact') {
222
+ const auth = payload.payload.authorization ??
223
+ (payload.extensions ?? {})['transferAuthorization'];
224
+ if (!auth)
225
+ return false;
226
+ if (payload.accepted) {
227
+ if (payload.accepted.asset !== requirements.asset)
228
+ return false;
229
+ if (payload.accepted.network !== requirements.network)
230
+ return false;
231
+ }
232
+ try {
233
+ if (BigInt(String(auth.value)) < BigInt(requirements.amount))
234
+ return false;
235
+ }
236
+ catch {
237
+ return false;
238
+ }
239
+ if (String(auth.to).toLowerCase() !== String(requirements.payTo).toLowerCase()) {
240
+ return false;
241
+ }
242
+ const now = Math.floor(Date.now() / 1000);
243
+ try {
244
+ const validBefore = BigInt(String(auth.validBefore ?? '0'));
245
+ const validAfter = BigInt(String(auth.validAfter ?? now));
246
+ if (validBefore < BigInt(now))
247
+ return false;
248
+ if (validAfter > BigInt(now))
249
+ return false;
250
+ }
251
+ catch {
252
+ return false;
253
+ }
254
+ return true;
255
+ }
256
+ const permit = payload.payload.paymentPermit;
257
+ if (!permit)
258
+ return false;
259
+ if (permit.payment.payToken !== requirements.asset)
260
+ return false;
261
+ if (permit.payment.payTo !== requirements.payTo)
262
+ return false;
263
+ try {
264
+ if (BigInt(permit.payment.payAmount) < BigInt(requirements.amount))
265
+ return false;
266
+ }
267
+ catch {
268
+ return false;
269
+ }
270
+ return true;
271
+ }
272
+ findMechanism(network, scheme) {
273
+ return this.mechanisms.get(network)?.get(scheme) ?? null;
274
+ }
275
+ normalizeEvmRequirements(reqs) {
276
+ if (!reqs.network.startsWith('eip155:')) {
277
+ return reqs;
278
+ }
279
+ return {
280
+ ...reqs,
281
+ asset: checksumOrThrow(reqs.asset, 'asset'),
282
+ payTo: checksumOrThrow(reqs.payTo, 'payTo'),
283
+ extra: reqs.extra
284
+ ? {
285
+ ...reqs.extra,
286
+ ...(reqs.extra.fee
287
+ ? {
288
+ fee: {
289
+ ...reqs.extra.fee,
290
+ feeTo: checksumOrThrow(reqs.extra.fee.feeTo, 'extra.fee.feeTo'),
291
+ ...(reqs.extra.fee.caller
292
+ ? { caller: checksumOrThrow(reqs.extra.fee.caller, 'extra.fee.caller') }
293
+ : {}),
294
+ },
295
+ }
296
+ : {}),
297
+ }
298
+ : reqs.extra,
299
+ };
300
+ }
301
+ }
302
+ function checksumOrThrow(address, field) {
303
+ if (!isAddress(address, { strict: false })) {
304
+ throw new Error(`Invalid EVM address for ${field}: ${address}`);
305
+ }
306
+ return getAddress(address);
307
+ }
308
+ function generateNonce() {
309
+ // 16 random bytes, decimal-encoded — matches Python's str(uuid.uuid4().int) shape.
310
+ const bytes = new Uint8Array(16);
311
+ crypto.getRandomValues(bytes);
312
+ let nonce = 0n;
313
+ for (const byte of bytes) {
314
+ nonce = (nonce << 8n) | BigInt(byte);
315
+ }
316
+ return nonce.toString();
317
+ }
318
+ //# sourceMappingURL=x402Server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"x402Server.js","sourceRoot":"","sources":["../../src/server/x402Server.ts"],"names":[],"mappings":"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"}
package/dist/tokens.d.ts CHANGED
@@ -16,4 +16,33 @@ export declare function findByAddress(network: string, address: string): TokenIn
16
16
  export declare function getNetworkTokens(network: string): Record<string, TokenInfo>;
17
17
  /** Register a custom token */
18
18
  export declare function registerToken(network: string, token: TokenInfo): void;
19
+ /** Parsed asset amount returned by {@link parsePrice}. */
20
+ export interface AssetAmount {
21
+ /** Amount in smallest unit (e.g. "1000000" for 1 USDT with 6 decimals). */
22
+ amount: string;
23
+ /** Token contract address on the network. */
24
+ asset: string;
25
+ /** Token decimals. */
26
+ decimals: number;
27
+ /** Token symbol (e.g. "USDT"). */
28
+ symbol: string;
29
+ /** Token display name. */
30
+ name: string;
31
+ /** EIP-712 / TIP-712 contract version (for permit) when applicable. */
32
+ version?: string;
33
+ }
34
+ /**
35
+ * Parse a human-readable price string into a typed asset amount.
36
+ *
37
+ * @param price - `"<decimal-amount> <symbol>"` (e.g. `"1.25 USDT"` or `"100 USDC"`).
38
+ * Whitespace-tolerant. `<symbol>` lookup is case-insensitive.
39
+ * @param network - CAIP-2 network identifier (e.g. `"tron:nile"`, `"eip155:97"`).
40
+ *
41
+ * @throws if the price format is invalid, the amount cannot be parsed,
42
+ * the token is not registered on `network`, or the amount has more
43
+ * decimal places than the token supports.
44
+ *
45
+ * Mirrors `bankofai.x402.tokens.TokenRegistry.parse_price`.
46
+ */
47
+ export declare function parsePrice(price: string, network: string): AssetAmount;
19
48
  //# sourceMappingURL=tokens.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../src/tokens.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAkFD,2CAA2C;AAC3C,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAE/E;AAED,sDAAsD;AACtD,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAKrF;AAED,mCAAmC;AACnC,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAE3E;AAED,8BAA8B;AAC9B,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,GAAG,IAAI,CAKrE"}
1
+ {"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../src/tokens.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAkFD,2CAA2C;AAC3C,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAE/E;AAED,sDAAsD;AACtD,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAKrF;AAED,mCAAmC;AACnC,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAE3E;AAED,8BAA8B;AAC9B,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,GAAG,IAAI,CAKrE;AAED,0DAA0D;AAC1D,MAAM,WAAW,WAAW;IAC1B,2EAA2E;IAC3E,MAAM,EAAE,MAAM,CAAC;IACf,6CAA6C;IAC7C,KAAK,EAAE,MAAM,CAAC;IACd,sBAAsB;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,kCAAkC;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,0BAA0B;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,uEAAuE;IACvE,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,WAAW,CAsCtE"}
package/dist/tokens.js CHANGED
@@ -103,4 +103,48 @@ export function registerToken(network, token) {
103
103
  }
104
104
  TOKENS[network][token.symbol.toUpperCase()] = token;
105
105
  }
106
+ /**
107
+ * Parse a human-readable price string into a typed asset amount.
108
+ *
109
+ * @param price - `"<decimal-amount> <symbol>"` (e.g. `"1.25 USDT"` or `"100 USDC"`).
110
+ * Whitespace-tolerant. `<symbol>` lookup is case-insensitive.
111
+ * @param network - CAIP-2 network identifier (e.g. `"tron:nile"`, `"eip155:97"`).
112
+ *
113
+ * @throws if the price format is invalid, the amount cannot be parsed,
114
+ * the token is not registered on `network`, or the amount has more
115
+ * decimal places than the token supports.
116
+ *
117
+ * Mirrors `bankofai.x402.tokens.TokenRegistry.parse_price`.
118
+ */
119
+ export function parsePrice(price, network) {
120
+ const parts = price.trim().split(/\s+/);
121
+ if (parts.length !== 2) {
122
+ throw new Error(`Invalid price format: "${price}". Expected "<amount> <symbol>" (e.g. "1.25 USDT").`);
123
+ }
124
+ const [amountStr, symbol] = parts;
125
+ if (!/^\d+(\.\d+)?$/.test(amountStr)) {
126
+ throw new Error(`Invalid amount in price "${price}": "${amountStr}" is not a non-negative decimal.`);
127
+ }
128
+ const token = getToken(network, symbol);
129
+ if (!token) {
130
+ throw new Error(`Unknown token "${symbol}" on network "${network}".`);
131
+ }
132
+ // BigInt-safe smallest-unit conversion. Reject precision overflow.
133
+ const [intPart, fracPart = ''] = amountStr.split('.');
134
+ if (fracPart.length > token.decimals) {
135
+ throw new Error(`Amount "${amountStr}" has more decimal places (${fracPart.length}) than ${symbol} supports (${token.decimals}).`);
136
+ }
137
+ const paddedFrac = fracPart.padEnd(token.decimals, '0');
138
+ // strip leading zeros to keep canonical numeric string
139
+ const combined = `${intPart}${paddedFrac}`.replace(/^0+(?=\d)/, '');
140
+ const amount = combined === '' ? '0' : combined;
141
+ return {
142
+ amount,
143
+ asset: token.address,
144
+ decimals: token.decimals,
145
+ symbol: token.symbol,
146
+ name: token.name,
147
+ ...(token.version !== undefined ? { version: token.version } : {}),
148
+ };
149
+ }
106
150
  //# sourceMappingURL=tokens.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tokens.js","sourceRoot":"","sources":["../src/tokens.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tokens.js","sourceRoot":"","sources":["../src/tokens.ts"],"names":[],"mappings":"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"}
@@ -29,6 +29,13 @@ export declare function encodePaymentPayload(payload: unknown): string;
29
29
  * Decode payment payload from base64 HTTP header
30
30
  */
31
31
  export declare function decodePaymentPayload<T>(encoded: string): T;
32
+ /**
33
+ * Generate a random 16-byte payment ID, formatted as `0x` + 32 hex chars.
34
+ *
35
+ * Used by `X402Server.createPaymentRequiredResponse` when the caller doesn't
36
+ * supply an explicit `paymentId`. Mirrors Python `generate_payment_id`.
37
+ */
38
+ export declare function generatePaymentId(): string;
32
39
  /**
33
40
  * Convert hex string to Uint8Array
34
41
  */
@@ -1 +1 @@
1
- {"version":3,"file":"encoding.d.ts","sourceRoot":"","sources":["../../src/utils/encoding.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,MAAM,CAW9D;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKjD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,CAU5D;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAEhD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,CAAC,GAAG,GAAG,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC,CAEnD;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAG7D;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,GAAG,CAAC,CAG1D;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CAOlD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,UAAO,GAAG,MAAM,CAKnE;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,UAAU,CAW9D"}
1
+ {"version":3,"file":"encoding.d.ts","sourceRoot":"","sources":["../../src/utils/encoding.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,MAAM,CAW9D;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKjD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,CAU5D;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAEhD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,CAAC,GAAG,GAAG,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC,CAEnD;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAG7D;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,GAAG,CAAC,CAG1D;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAQ1C;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CAOlD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,UAAO,GAAG,MAAM,CAKnE;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,UAAU,CAW9D"}
@@ -65,6 +65,21 @@ export function decodePaymentPayload(encoded) {
65
65
  const json = decodeBase64(encoded);
66
66
  return JSON.parse(json);
67
67
  }
68
+ /**
69
+ * Generate a random 16-byte payment ID, formatted as `0x` + 32 hex chars.
70
+ *
71
+ * Used by `X402Server.createPaymentRequiredResponse` when the caller doesn't
72
+ * supply an explicit `paymentId`. Mirrors Python `generate_payment_id`.
73
+ */
74
+ export function generatePaymentId() {
75
+ const bytes = new Uint8Array(16);
76
+ crypto.getRandomValues(bytes);
77
+ let hex = '';
78
+ for (const byte of bytes) {
79
+ hex += byte.toString(16).padStart(2, '0');
80
+ }
81
+ return `0x${hex}`;
82
+ }
68
83
  /**
69
84
  * Convert hex string to Uint8Array
70
85
  */
@@ -1 +1 @@
1
- {"version":3,"file":"encoding.js","sourceRoot":"","sources":["../../src/utils/encoding.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"encoding.js","sourceRoot":"","sources":["../../src/utils/encoding.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,6 @@
2
2
  * Utility exports
3
3
  */
4
4
  export * from './encoding.js';
5
- export { encodeBase64, decodeBase64, decodeBase64ToBytes, hexToBytes, bytesToHex, paymentIdToBytes } from './encoding.js';
5
+ export { encodeBase64, decodeBase64, decodeBase64ToBytes, generatePaymentId, hexToBytes, bytesToHex, paymentIdToBytes, } from './encoding.js';
6
6
  export * from './gasfree.js';
7
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,eAAe,CAAC;AAC9B,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,mBAAmB,EAAE,UAAU,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAC1H,cAAc,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,eAAe,CAAC;AAC9B,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,mBAAmB,EACnB,iBAAiB,EACjB,UAAU,EACV,UAAU,EACV,gBAAgB,GACjB,MAAM,eAAe,CAAC;AACvB,cAAc,cAAc,CAAC"}
@@ -2,6 +2,6 @@
2
2
  * Utility exports
3
3
  */
4
4
  export * from './encoding.js';
5
- export { encodeBase64, decodeBase64, decodeBase64ToBytes, hexToBytes, bytesToHex, paymentIdToBytes } from './encoding.js';
5
+ export { encodeBase64, decodeBase64, decodeBase64ToBytes, generatePaymentId, hexToBytes, bytesToHex, paymentIdToBytes, } from './encoding.js';
6
6
  export * from './gasfree.js';
7
7
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,eAAe,CAAC;AAC9B,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,mBAAmB,EAAE,UAAU,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAC1H,cAAc,cAAc,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,eAAe,CAAC;AAC9B,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,mBAAmB,EACnB,iBAAiB,EACjB,UAAU,EACV,UAAU,EACV,gBAAgB,GACjB,MAAM,eAAe,CAAC;AACvB,cAAc,cAAc,CAAC"}
@@ -0,0 +1,113 @@
1
+ /**
2
+ * Transaction Verification Utilities
3
+ *
4
+ * Generic functionality to verify blockchain transaction results after the
5
+ * facilitator reports settlement, ensuring on-chain transfers match expected
6
+ * parameters. Mirrors `bankofai.x402.utils.tx_verification`.
7
+ *
8
+ * This module provides the **base contracts**. Chain-specific implementations
9
+ * (TRON via tronweb, EVM via viem) subclass {@link BaseTransactionVerifier}
10
+ * and plug in via {@link getVerifierForNetwork}.
11
+ */
12
+ import type { PaymentPayload, PaymentRequirements } from '../types/index.js';
13
+ /** A single token transfer event extracted from a transaction. */
14
+ export interface TransferEvent {
15
+ /** Token contract address. */
16
+ token: string;
17
+ /** Sender address. */
18
+ fromAddr: string;
19
+ /** Recipient address. */
20
+ toAddr: string;
21
+ /** Transfer amount in smallest unit (as a BigInt-safe string). */
22
+ amount: string;
23
+ }
24
+ /** Outcome of {@link TransactionVerifier.verifyTransaction}. */
25
+ export interface TransactionVerificationResult {
26
+ success: boolean;
27
+ txHash: string;
28
+ blockNumber?: string;
29
+ errorReason?: string;
30
+ transfers?: TransferEvent[];
31
+ /** Whether the on-chain transaction status was "success". */
32
+ statusVerified: boolean;
33
+ /** Whether the payment transfer (amount + recipient) was verified. */
34
+ paymentVerified: boolean;
35
+ /** Whether the facilitator fee transfer was verified (when applicable). */
36
+ feeVerified: boolean;
37
+ }
38
+ /**
39
+ * Interface for transaction verification implementations. One per chain family.
40
+ *
41
+ * Wraps the chain's transaction-info / transfer-events RPC and applies the
42
+ * canonical "did the right transfer happen" check.
43
+ */
44
+ export interface TransactionVerifier {
45
+ verifyTransaction(txHash: string, payload: PaymentPayload, requirements: PaymentRequirements): Promise<TransactionVerificationResult>;
46
+ getTransactionTransfers(txHash: string, tokenAddress: string): Promise<TransferEvent[]>;
47
+ }
48
+ /** Generic transaction-info shape returned by chain-specific RPC adapters. */
49
+ export interface TransactionInfo {
50
+ status?: string | number;
51
+ blockNumber?: string;
52
+ }
53
+ /**
54
+ * Abstract base class for transaction verifiers. Subclasses implement the
55
+ * chain-specific RPC calls; the canonical verification flow lives here.
56
+ *
57
+ * Mirrors Python `BaseTransactionVerifier`. Like the Python base, the default
58
+ * {@link verifyTransaction} only checks that the on-chain transaction
59
+ * succeeded — chain-specific subclasses MAY override for richer transfer +
60
+ * fee verification.
61
+ */
62
+ export declare abstract class BaseTransactionVerifier implements TransactionVerifier {
63
+ /** Chain-specific: pull transaction info (status, blockNumber) from RPC. */
64
+ abstract getTransactionInfo(txHash: string): Promise<TransactionInfo>;
65
+ /** Chain-specific: pull token transfer events from the transaction. */
66
+ abstract getTransactionTransfers(txHash: string, tokenAddress: string): Promise<TransferEvent[]>;
67
+ /** Chain-specific: normalize an address for equality comparison. */
68
+ abstract normalizeAddress(address: string): string;
69
+ /**
70
+ * Canonical verification flow: pull transaction info, check status.
71
+ *
72
+ * Subclasses can override to additionally verify transfer amounts /
73
+ * fee transfers — set `paymentVerified` / `feeVerified` accordingly.
74
+ */
75
+ verifyTransaction(txHash: string, _payload: PaymentPayload, _requirements: PaymentRequirements): Promise<TransactionVerificationResult>;
76
+ }
77
+ /**
78
+ * Registry of (network-prefix → verifier factory) entries.
79
+ *
80
+ * Chain-specific verifiers register themselves at module load (e.g. a TRON
81
+ * verifier package would call `registerVerifierFactory('tron:', ...)`); the
82
+ * core `@bankofai/x402` package ships no concrete verifiers itself.
83
+ */
84
+ type VerifierFactory = (network: string, opts?: {
85
+ rpcUrl?: string;
86
+ }) => TransactionVerifier;
87
+ /**
88
+ * Register a verifier factory for a network prefix (e.g. `"tron:"`, `"eip155:"`).
89
+ * Calls override any prior registration for the same prefix.
90
+ */
91
+ export declare function registerVerifierFactory(prefix: string, factory: VerifierFactory): void;
92
+ /**
93
+ * Resolve a {@link TransactionVerifier} for a given network.
94
+ *
95
+ * Throws if no factory has been registered for the network's prefix. Callers
96
+ * that want optional verification (e.g. server middleware) should catch this
97
+ * and skip verification gracefully.
98
+ *
99
+ * @example
100
+ * ```ts
101
+ * try {
102
+ * const verifier = getVerifierForNetwork('tron:nile');
103
+ * const result = await verifier.verifyTransaction(txHash, payload, requirements);
104
+ * } catch {
105
+ * // No verifier registered → skip on-chain re-check (facilitator is trusted).
106
+ * }
107
+ * ```
108
+ */
109
+ export declare function getVerifierForNetwork(network: string, opts?: {
110
+ rpcUrl?: string;
111
+ }): TransactionVerifier;
112
+ export {};
113
+ //# sourceMappingURL=tx_verification.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tx_verification.d.ts","sourceRoot":"","sources":["../../src/utils/tx_verification.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAE7E,kEAAkE;AAClE,MAAM,WAAW,aAAa;IAC5B,8BAA8B;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,sBAAsB;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,yBAAyB;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,kEAAkE;IAClE,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,gEAAgE;AAChE,MAAM,WAAW,6BAA6B;IAC5C,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,aAAa,EAAE,CAAC;IAC5B,6DAA6D;IAC7D,cAAc,EAAE,OAAO,CAAC;IACxB,sEAAsE;IACtE,eAAe,EAAE,OAAO,CAAC;IACzB,2EAA2E;IAC3E,WAAW,EAAE,OAAO,CAAC;CACtB;AAED;;;;;GAKG;AACH,MAAM,WAAW,mBAAmB;IAClC,iBAAiB,CACf,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,cAAc,EACvB,YAAY,EAAE,mBAAmB,GAChC,OAAO,CAAC,6BAA6B,CAAC,CAAC;IAC1C,uBAAuB,CACrB,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;CAC7B;AAED,8EAA8E;AAC9E,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;;GAQG;AACH,8BAAsB,uBAAwB,YAAW,mBAAmB;IAC1E,4EAA4E;IAC5E,QAAQ,CAAC,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAErE,uEAAuE;IACvE,QAAQ,CAAC,uBAAuB,CAC9B,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,aAAa,EAAE,CAAC;IAE3B,oEAAoE;IACpE,QAAQ,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAElD;;;;;OAKG;IACG,iBAAiB,CACrB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,cAAc,EACxB,aAAa,EAAE,mBAAmB,GACjC,OAAO,CAAC,6BAA6B,CAAC;CAmC1C;AAED;;;;;;GAMG;AACH,KAAK,eAAe,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,KAAK,mBAAmB,CAAC;AAG5F;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,GAAG,IAAI,CAEtF;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,MAAM,EACf,IAAI,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GACzB,mBAAmB,CAOrB"}