@wtflabs/x402-server 0.0.1-beta.10

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.
@@ -0,0 +1,589 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/index.ts
21
+ var src_exports = {};
22
+ __export(src_exports, {
23
+ CreateRequirementsConfigSchema: () => CreateRequirementsConfigSchema,
24
+ InitResultSchema: () => InitResultSchema,
25
+ ParseResultSchema: () => ParseResultSchema,
26
+ ParsedPaymentSchema: () => ParsedPaymentSchema,
27
+ PaymentPayloadSchema: () => import_types3.PaymentPayloadSchema,
28
+ PaymentRequirementsSchema: () => import_types3.PaymentRequirementsSchema,
29
+ ProcessResultSchema: () => ProcessResultSchema,
30
+ Response402Schema: () => Response402Schema,
31
+ SettleResultSchema: () => SettleResultSchema,
32
+ VerifyResultSchema: () => VerifyResultSchema,
33
+ X402Server: () => X402Server,
34
+ createExpressMiddleware: () => createExpressMiddleware,
35
+ createHonoMiddleware: () => createHonoMiddleware,
36
+ decodeBase64: () => decodeBase64,
37
+ encodeBase64: () => encodeBase64
38
+ });
39
+ module.exports = __toCommonJS(src_exports);
40
+
41
+ // src/server.ts
42
+ var import_x402_detector = require("@wtflabs/x402-detector");
43
+
44
+ // src/schemas.ts
45
+ var import_types = require("@wtflabs/x402/types");
46
+ var import_zod = require("zod");
47
+ var EthAddressRegex = /^0x[a-fA-F0-9]{40}$/;
48
+ var isIntegerString = (value) => {
49
+ const num = Number(value);
50
+ return Number.isInteger(num) && num >= 0;
51
+ };
52
+ var CreateRequirementsConfigSchema = import_zod.z.object({
53
+ // 必填
54
+ asset: import_zod.z.string().regex(EthAddressRegex, "Invalid token address"),
55
+ maxAmountRequired: import_zod.z.string().refine(isIntegerString, "Amount must be a non-negative integer string"),
56
+ // 可选 - 网络和 scheme
57
+ network: import_types.NetworkSchema,
58
+ scheme: import_zod.z.literal("exact").optional(),
59
+ outputSchema: import_zod.z.record(import_zod.z.any()).optional(),
60
+ // 可选 - 额外信息
61
+ extra: import_zod.z.record(import_zod.z.any()).optional(),
62
+ // 可选 - 支付类型
63
+ paymentType: import_zod.z.enum(["permit", "eip3009", "permit2", "auto"]).optional(),
64
+ // 可选 - 资源描述
65
+ resource: import_zod.z.string().url().optional().or(import_zod.z.literal("")),
66
+ description: import_zod.z.string().optional(),
67
+ mimeType: import_zod.z.string().optional(),
68
+ maxTimeoutSeconds: import_zod.z.number().int().positive().optional(),
69
+ // 可选 - 性能控制
70
+ autoDetect: import_zod.z.boolean().optional()
71
+ });
72
+ var Response402Schema = import_zod.z.object({
73
+ x402Version: import_zod.z.literal(1),
74
+ accepts: import_zod.z.array(import_types.PaymentRequirementsSchema),
75
+ error: import_zod.z.string().optional()
76
+ });
77
+ var InitResultSchema = import_zod.z.discriminatedUnion("success", [
78
+ import_zod.z.object({ success: import_zod.z.literal(true) }),
79
+ import_zod.z.object({ success: import_zod.z.literal(false), error: import_zod.z.string() })
80
+ ]);
81
+ var ProcessResultSchema = import_zod.z.discriminatedUnion("success", [
82
+ import_zod.z.object({
83
+ success: import_zod.z.literal(true),
84
+ status: import_zod.z.literal(200),
85
+ data: import_zod.z.object({
86
+ payer: import_zod.z.string().regex(EthAddressRegex),
87
+ txHash: import_zod.z.string()
88
+ })
89
+ }),
90
+ import_zod.z.object({
91
+ success: import_zod.z.literal(false),
92
+ status: import_zod.z.literal(402),
93
+ response: Response402Schema
94
+ })
95
+ ]);
96
+ var ParsedPaymentSchema = import_zod.z.object({
97
+ payload: import_types.PaymentPayloadSchema,
98
+ requirements: import_types.PaymentRequirementsSchema
99
+ });
100
+ var ParseResultSchema = import_zod.z.discriminatedUnion("success", [
101
+ import_zod.z.object({ success: import_zod.z.literal(true), data: ParsedPaymentSchema }),
102
+ import_zod.z.object({ success: import_zod.z.literal(false), response402: Response402Schema })
103
+ ]);
104
+ var VerifyResultSchema = import_zod.z.discriminatedUnion("success", [
105
+ import_zod.z.object({ success: import_zod.z.literal(true), payer: import_zod.z.string().regex(EthAddressRegex) }),
106
+ import_zod.z.object({ success: import_zod.z.literal(false), error: import_zod.z.string() })
107
+ ]);
108
+ var SettleResultSchema = import_zod.z.discriminatedUnion("success", [
109
+ import_zod.z.object({
110
+ success: import_zod.z.literal(true),
111
+ txHash: import_zod.z.string(),
112
+ network: import_zod.z.string()
113
+ }),
114
+ import_zod.z.object({
115
+ success: import_zod.z.literal(false),
116
+ error: import_zod.z.string()
117
+ })
118
+ ]);
119
+
120
+ // src/utils.ts
121
+ function decodeBase64(base64) {
122
+ const cleanBase64 = base64.replace(/^data:application\/json;base64,/, "");
123
+ if (typeof window !== "undefined" && window.atob) {
124
+ return window.atob(cleanBase64);
125
+ }
126
+ if (typeof Buffer !== "undefined") {
127
+ return Buffer.from(cleanBase64, "base64").toString("utf-8");
128
+ }
129
+ throw new Error("No Base64 decoder available");
130
+ }
131
+ function encodeBase64(str) {
132
+ if (typeof window !== "undefined" && window.btoa) {
133
+ return window.btoa(str);
134
+ }
135
+ if (typeof Buffer !== "undefined") {
136
+ return Buffer.from(str, "utf-8").toString("base64");
137
+ }
138
+ throw new Error("No Base64 encoder available");
139
+ }
140
+
141
+ // src/server.ts
142
+ var import_types2 = require("@wtflabs/x402/types");
143
+ var X402Server = class {
144
+ /**
145
+ * 构造函数
146
+ *
147
+ * @param config - Server 配置
148
+ */
149
+ constructor(config) {
150
+ this.network = null;
151
+ if (!config.client) {
152
+ throw new Error("client is required");
153
+ }
154
+ if (!config.facilitator) {
155
+ throw new Error("facilitator is required");
156
+ }
157
+ this.client = config.client;
158
+ this.facilitator = config.facilitator;
159
+ this.detector = new import_x402_detector.TokenDetector(config.client, { logger: null });
160
+ this.network = config.network || null;
161
+ }
162
+ /**
163
+ * 可选的初始化 - 预热缓存
164
+ *
165
+ * @param tokens - 要预热的 token 地址列表
166
+ * @returns 初始化结果
167
+ */
168
+ async initialize(tokens) {
169
+ try {
170
+ await this.detector.initialize(tokens);
171
+ return { success: true };
172
+ } catch (error) {
173
+ return {
174
+ success: false,
175
+ error: error instanceof Error ? error.message : "Initialization failed"
176
+ };
177
+ }
178
+ }
179
+ /**
180
+ * 创建支付要求
181
+ *
182
+ * @param config - 配置选项
183
+ * @returns 支付要求
184
+ */
185
+ async createRequirements(config) {
186
+ const validatedConfig = CreateRequirementsConfigSchema.parse(config);
187
+ const network = validatedConfig.network || this.network || await this.getNetworkName();
188
+ let paymentType;
189
+ let tokenName;
190
+ let tokenVersion;
191
+ if (validatedConfig.autoDetect !== false) {
192
+ const result = await this.detector.detect(validatedConfig.asset);
193
+ if (validatedConfig.paymentType && validatedConfig.paymentType !== "auto") {
194
+ paymentType = validatedConfig.paymentType;
195
+ } else {
196
+ const recommendedMethod = await this.detector.getRecommendedMethod(validatedConfig.asset);
197
+ if (!recommendedMethod) {
198
+ throw new Error(
199
+ `Token ${validatedConfig.asset} does not support advanced payment methods`
200
+ );
201
+ }
202
+ paymentType = recommendedMethod;
203
+ }
204
+ tokenName = result.name;
205
+ tokenVersion = result.version;
206
+ } else {
207
+ if (!validatedConfig.paymentType || validatedConfig.paymentType === "auto") {
208
+ throw new Error("Must specify paymentType when autoDetect is false");
209
+ }
210
+ paymentType = validatedConfig.paymentType;
211
+ }
212
+ const requirements = {
213
+ scheme: validatedConfig.scheme || "exact",
214
+ network,
215
+ maxAmountRequired: validatedConfig.maxAmountRequired,
216
+ payTo: this.facilitator.recipientAddress,
217
+ asset: validatedConfig.asset,
218
+ maxTimeoutSeconds: validatedConfig.maxTimeoutSeconds || 300,
219
+ resource: validatedConfig.resource || "",
220
+ description: validatedConfig.description || "",
221
+ mimeType: validatedConfig.mimeType || "application/json",
222
+ paymentType,
223
+ outputSchema: validatedConfig.outputSchema,
224
+ extra: {
225
+ ...validatedConfig.extra || {},
226
+ ...tokenName && { name: tokenName },
227
+ ...tokenVersion && { version: tokenVersion }
228
+ }
229
+ };
230
+ return import_types2.PaymentRequirementsSchema.parse(requirements);
231
+ }
232
+ /**
233
+ * 完整的支付处理流程
234
+ * parse → verify → settle 一步到位
235
+ *
236
+ * @param paymentHeader - X-PAYMENT header 的值 (Base64)
237
+ * @param expectedRequirements - 期望的支付要求
238
+ * @returns 处理结果
239
+ */
240
+ async process(paymentHeader, expectedRequirements) {
241
+ const parsed = this.parse(paymentHeader, expectedRequirements);
242
+ if (!parsed.success) {
243
+ return {
244
+ success: false,
245
+ status: 402,
246
+ response: parsed.response402
247
+ };
248
+ }
249
+ const verified = await this.verify(parsed.data);
250
+ if (!verified.success) {
251
+ return {
252
+ success: false,
253
+ status: 402,
254
+ response: this.get402Response(expectedRequirements, verified.error)
255
+ };
256
+ }
257
+ const settled = await this.settle(parsed.data);
258
+ if (!settled.success) {
259
+ return {
260
+ success: false,
261
+ status: 402,
262
+ response: this.get402Response(expectedRequirements, settled.error)
263
+ };
264
+ }
265
+ return {
266
+ success: true,
267
+ status: 200,
268
+ data: {
269
+ payer: verified.payer,
270
+ txHash: settled.txHash
271
+ }
272
+ };
273
+ }
274
+ /**
275
+ * 解析支付头
276
+ *
277
+ * @param paymentHeader - X-PAYMENT header 的值
278
+ * @param expectedRequirements - 期望的支付要求
279
+ * @returns 解析结果
280
+ */
281
+ parse(paymentHeader, expectedRequirements) {
282
+ if (!paymentHeader) {
283
+ return {
284
+ success: false,
285
+ response402: this.get402Response(expectedRequirements, "missing_payment_header")
286
+ };
287
+ }
288
+ let payload;
289
+ try {
290
+ const decoded = decodeBase64(paymentHeader);
291
+ const parsed = JSON.parse(decoded);
292
+ payload = import_types2.PaymentPayloadSchema.parse(parsed);
293
+ } catch (error) {
294
+ return {
295
+ success: false,
296
+ response402: this.get402Response(
297
+ expectedRequirements,
298
+ error instanceof Error ? `invalid_payment_header: ${error.message}` : "invalid_payment_header"
299
+ )
300
+ };
301
+ }
302
+ return {
303
+ success: true,
304
+ data: {
305
+ payload,
306
+ requirements: expectedRequirements
307
+ }
308
+ };
309
+ }
310
+ /**
311
+ * 验证支付签名
312
+ *
313
+ * @param parsed - 解析后的支付数据
314
+ * @returns 验证结果
315
+ */
316
+ async verify(parsed) {
317
+ try {
318
+ const facilitatorPayload = {
319
+ ...parsed.payload,
320
+ payload: parsed.payload.payload || {}
321
+ };
322
+ const result = await this.facilitator.verify(
323
+ facilitatorPayload,
324
+ parsed.requirements
325
+ );
326
+ if (!result.success) {
327
+ return {
328
+ success: false,
329
+ error: result.error || result.errorMessage || "Verification failed"
330
+ };
331
+ }
332
+ if (!result.payer) {
333
+ return {
334
+ success: false,
335
+ error: "Payer address not found in verification result"
336
+ };
337
+ }
338
+ return {
339
+ success: true,
340
+ payer: result.payer
341
+ };
342
+ } catch (error) {
343
+ return {
344
+ success: false,
345
+ error: error instanceof Error ? error.message : "Verification error"
346
+ };
347
+ }
348
+ }
349
+ /**
350
+ * 结算支付
351
+ *
352
+ * @param parsed - 解析后的支付数据
353
+ * @returns 结算结果
354
+ */
355
+ async settle(parsed) {
356
+ try {
357
+ const facilitatorPayload = {
358
+ ...parsed.payload,
359
+ payload: parsed.payload.payload || {}
360
+ };
361
+ const result = await this.facilitator.settle(
362
+ facilitatorPayload,
363
+ parsed.requirements
364
+ );
365
+ if (!result.success) {
366
+ return {
367
+ success: false,
368
+ error: result.error || result.errorMessage || "Settlement failed"
369
+ };
370
+ }
371
+ if (!result.transaction) {
372
+ return {
373
+ success: false,
374
+ error: "Transaction hash not found in settlement result"
375
+ };
376
+ }
377
+ return {
378
+ success: true,
379
+ txHash: result.transaction,
380
+ network: result.network || parsed.requirements.network
381
+ };
382
+ } catch (error) {
383
+ return {
384
+ success: false,
385
+ error: error instanceof Error ? error.message : "Settlement error"
386
+ };
387
+ }
388
+ }
389
+ /**
390
+ * 生成 402 响应
391
+ *
392
+ * @param requirements - 支付要求
393
+ * @param error - 可选的错误信息
394
+ * @returns 402 响应对象
395
+ */
396
+ get402Response(requirements, error) {
397
+ return {
398
+ x402Version: 1,
399
+ accepts: [requirements],
400
+ error
401
+ };
402
+ }
403
+ /**
404
+ * 清除缓存
405
+ *
406
+ * @param token - 可选,指定要清除的 token 地址
407
+ */
408
+ async clearCache(token) {
409
+ await this.detector.clearCache(token);
410
+ }
411
+ /**
412
+ * 获取缓存统计
413
+ *
414
+ * @returns 缓存统计信息
415
+ */
416
+ getCacheStats() {
417
+ return this.detector.getCacheStats();
418
+ }
419
+ /**
420
+ * 获取 facilitator 实例(供外部访问)
421
+ *
422
+ * @returns Facilitator 实例
423
+ */
424
+ getFacilitator() {
425
+ return this.facilitator;
426
+ }
427
+ /**
428
+ * 获取 detector 实例(供外部访问)
429
+ *
430
+ * @returns TokenDetector 实例
431
+ */
432
+ getDetector() {
433
+ return this.detector;
434
+ }
435
+ /**
436
+ * 获取 client 实例(供外部访问)
437
+ *
438
+ * @returns PublicClient 实例
439
+ */
440
+ getClient() {
441
+ return this.client;
442
+ }
443
+ /**
444
+ * 获取网络名称
445
+ *
446
+ * @returns 网络名称
447
+ */
448
+ async getNetworkName() {
449
+ if (this.network) {
450
+ return this.network;
451
+ }
452
+ const chainId = await this.client.getChainId();
453
+ const networkMap = {
454
+ 1: "ethereum-mainnet",
455
+ 5: "ethereum-goerli",
456
+ 11155111: "ethereum-sepolia",
457
+ 56: "bsc-mainnet",
458
+ 97: "bsc-testnet",
459
+ 137: "polygon-mainnet",
460
+ 80001: "polygon-mumbai",
461
+ 42161: "arbitrum-mainnet",
462
+ 421613: "arbitrum-goerli",
463
+ 10: "optimism-mainnet",
464
+ 420: "optimism-goerli",
465
+ 8453: "base-mainnet",
466
+ 84531: "base-goerli"
467
+ };
468
+ this.network = networkMap[chainId] || `chain-${chainId}`;
469
+ return this.network;
470
+ }
471
+ };
472
+
473
+ // src/middlewares/express.ts
474
+ function createExpressMiddleware(options) {
475
+ return async (req, res, next) => {
476
+ try {
477
+ const token = await options.getToken(req);
478
+ const amount = await options.getAmount(req);
479
+ const extraConfig = options.getConfig ? await options.getConfig(req) : {};
480
+ const filteredConfig = Object.fromEntries(
481
+ Object.entries(extraConfig).filter(([, value]) => value !== void 0)
482
+ );
483
+ const requirements = await options.server.createRequirements({
484
+ asset: token,
485
+ maxAmountRequired: amount,
486
+ ...filteredConfig
487
+ });
488
+ const paymentHeader = req.headers["x-payment"];
489
+ const result = await options.server.process(paymentHeader, requirements);
490
+ if (!result.success) {
491
+ if (options.on402) {
492
+ options.on402(req, res, result.response);
493
+ } else {
494
+ res.status(402).json(result.response);
495
+ }
496
+ return;
497
+ }
498
+ req.x402 = {
499
+ payer: result.data.payer,
500
+ txHash: result.data.txHash
501
+ };
502
+ if (options.onPaymentSuccess) {
503
+ await options.onPaymentSuccess(req, result.data.payer, result.data.txHash);
504
+ }
505
+ next();
506
+ } catch (error) {
507
+ if (options.onError) {
508
+ options.onError(error, req, res);
509
+ } else {
510
+ console.error("x402 middleware error:", error);
511
+ res.status(500).json({
512
+ error: "Payment processing error",
513
+ message: error instanceof Error ? error.message : "Unknown error"
514
+ });
515
+ }
516
+ }
517
+ };
518
+ }
519
+
520
+ // src/middlewares/hono.ts
521
+ function createHonoMiddleware(options) {
522
+ return async (c, next) => {
523
+ try {
524
+ const token = await options.getToken(c);
525
+ const amount = await options.getAmount(c);
526
+ const extraConfig = options.getConfig ? await options.getConfig(c) : {};
527
+ const filteredConfig = Object.fromEntries(
528
+ Object.entries(extraConfig).filter(([, value]) => value !== void 0)
529
+ );
530
+ const requirements = await options.server.createRequirements({
531
+ asset: token,
532
+ maxAmountRequired: amount,
533
+ ...filteredConfig
534
+ });
535
+ const paymentHeader = c.req.header("x-payment");
536
+ const result = await options.server.process(paymentHeader, requirements);
537
+ if (!result.success) {
538
+ if (options.on402) {
539
+ return options.on402(c, result.response);
540
+ } else {
541
+ return c.json(result.response, 402);
542
+ }
543
+ }
544
+ c.set("x402", {
545
+ payer: result.data.payer,
546
+ txHash: result.data.txHash
547
+ });
548
+ if (options.onPaymentSuccess) {
549
+ await options.onPaymentSuccess(c, result.data.payer, result.data.txHash);
550
+ }
551
+ await next();
552
+ } catch (error) {
553
+ if (options.onError) {
554
+ return options.onError(error, c);
555
+ } else {
556
+ console.error("x402 middleware error:", error);
557
+ return c.json(
558
+ {
559
+ error: "Payment processing error",
560
+ message: error instanceof Error ? error.message : "Unknown error"
561
+ },
562
+ 500
563
+ );
564
+ }
565
+ }
566
+ };
567
+ }
568
+
569
+ // src/types.ts
570
+ var import_types3 = require("@wtflabs/x402/types");
571
+ // Annotate the CommonJS export names for ESM import in node:
572
+ 0 && (module.exports = {
573
+ CreateRequirementsConfigSchema,
574
+ InitResultSchema,
575
+ ParseResultSchema,
576
+ ParsedPaymentSchema,
577
+ PaymentPayloadSchema,
578
+ PaymentRequirementsSchema,
579
+ ProcessResultSchema,
580
+ Response402Schema,
581
+ SettleResultSchema,
582
+ VerifyResultSchema,
583
+ X402Server,
584
+ createExpressMiddleware,
585
+ createHonoMiddleware,
586
+ decodeBase64,
587
+ encodeBase64
588
+ });
589
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/index.ts","../../src/server.ts","../../src/schemas.ts","../../src/utils.ts","../../src/middlewares/express.ts","../../src/middlewares/hono.ts","../../src/types.ts"],"sourcesContent":["/**\n * Server SDK for x402 Payment Protocol\n *\n * - Automatic token detection (via @wtflabs/x402-detector)\n * - Payment verification and settlement (via @wtflabs/x402-facilitator)\n * - Dynamic PaymentRequirements creation with Zod validation for server side\n * - Built-in caching for performance\n * - Express and Hono middlewares\n */\n\n// Export main class\nexport { X402Server } from \"./server\";\n\n// Export middlewares\nexport { createExpressMiddleware, createHonoMiddleware } from \"./middlewares\";\nexport type { ExpressMiddlewareOptions, HonoMiddlewareOptions } from \"./middlewares\";\n\n// Export types and schemas\nexport type {\n X402ServerConfig,\n CreateRequirementsConfig,\n PaymentRequirements,\n PaymentPayload,\n Response402,\n InitResult,\n ProcessResult,\n ParseResult,\n VerifyResult,\n SettleResult,\n ParsedPayment,\n} from \"./types\";\n\nexport {\n CreateRequirementsConfigSchema,\n PaymentRequirementsSchema,\n PaymentPayloadSchema,\n Response402Schema,\n InitResultSchema,\n ProcessResultSchema,\n ParseResultSchema,\n VerifyResultSchema,\n SettleResultSchema,\n ParsedPaymentSchema,\n} from \"./types\";\n\n// Export utilities\nexport { decodeBase64, encodeBase64 } from \"./utils\";\n\n// Re-export WaitUntil from facilitator\nexport type { WaitUntil } from \"@wtflabs/x402-facilitator\";\n","import type { PublicClient } from \"viem\";\nimport { TokenDetector } from \"@wtflabs/x402-detector\";\nimport { Facilitator } from \"@wtflabs/x402-facilitator\";\nimport type {\n X402ServerConfig,\n PaymentRequirements,\n PaymentPayload,\n Response402,\n InitResult,\n ProcessResult,\n ParseResult,\n VerifyResult,\n SettleResult,\n ParsedPayment,\n} from \"./types\";\nimport { CreateRequirementsConfigSchema } from \"./schemas\";\nimport type { CreateRequirementsConfig } from \"./schemas\";\nimport { decodeBase64 } from \"./utils\";\nimport { PaymentPayloadSchema, PaymentRequirementsSchema } from \"@wtflabs/x402/types\";\n\n/**\n * X402 Server\n *\n * 服务端 SDK,用于处理支付验证和结算\n *\n * @example\n * ```typescript\n * // 1. 创建 facilitator\n * const facilitator = new Facilitator({\n * recipientAddress: \"0x1234...\",\n * waitUntil: \"confirmed\",\n * });\n *\n * // 2. 创建 server\n * const server = new X402Server({\n * client: viemClient,\n * facilitator,\n * });\n *\n * // 3. 可选:预热缓存\n * await server.initialize([tokenAddress]);\n *\n * // 4. 创建支付要求\n * const requirements = await server.createRequirements({\n * asset: tokenAddress,\n * maxAmountRequired: \"1000\",\n * });\n *\n * // 5. 处理支付\n * const result = await server.process(paymentHeader, requirements);\n * ```\n */\nexport class X402Server {\n private client: PublicClient;\n private detector: TokenDetector;\n private facilitator: Facilitator;\n private network: string | null = null;\n\n /**\n * 构造函数\n *\n * @param config - Server 配置\n */\n constructor(config: X402ServerConfig) {\n if (!config.client) {\n throw new Error(\"client is required\");\n }\n if (!config.facilitator) {\n throw new Error(\"facilitator is required\");\n }\n\n this.client = config.client;\n this.facilitator = config.facilitator;\n\n // 初始化 detector (禁用日志)\n this.detector = new TokenDetector(config.client, { logger: null });\n\n // 保存网络配置\n this.network = config.network || null;\n }\n\n /**\n * 可选的初始化 - 预热缓存\n *\n * @param tokens - 要预热的 token 地址列表\n * @returns 初始化结果\n */\n async initialize(tokens: string[]): Promise<InitResult> {\n try {\n await this.detector.initialize(tokens);\n return { success: true };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : \"Initialization failed\",\n };\n }\n }\n\n /**\n * 创建支付要求\n *\n * @param config - 配置选项\n * @returns 支付要求\n */\n async createRequirements(config: CreateRequirementsConfig): Promise<PaymentRequirements> {\n // 使用 Zod 验证输入参数\n const validatedConfig = CreateRequirementsConfigSchema.parse(config);\n\n // 获取网络名称\n const network = validatedConfig.network || this.network || (await this.getNetworkName());\n\n // 确定支付类型和 token 信息\n let paymentType: \"permit\" | \"eip3009\" | \"permit2\" | undefined;\n let tokenName: string | undefined;\n let tokenVersion: string | undefined;\n\n if (validatedConfig.autoDetect !== false) {\n // 自动检测模式(默认)\n const result = await this.detector.detect(validatedConfig.asset);\n\n // 确定支付类型\n if (validatedConfig.paymentType && validatedConfig.paymentType !== \"auto\") {\n paymentType = validatedConfig.paymentType;\n } else {\n const recommendedMethod = await this.detector.getRecommendedMethod(validatedConfig.asset);\n if (!recommendedMethod) {\n throw new Error(\n `Token ${validatedConfig.asset} does not support advanced payment methods`,\n );\n }\n paymentType = recommendedMethod;\n }\n\n tokenName = result.name;\n tokenVersion = result.version;\n } else {\n // 快速模式,跳过检测\n if (!validatedConfig.paymentType || validatedConfig.paymentType === \"auto\") {\n throw new Error(\"Must specify paymentType when autoDetect is false\");\n }\n paymentType = validatedConfig.paymentType;\n }\n\n // 构建支付要求(未验证的对象)\n const requirements: PaymentRequirements = {\n scheme: validatedConfig.scheme || \"exact\",\n network,\n maxAmountRequired: validatedConfig.maxAmountRequired,\n payTo: this.facilitator.recipientAddress,\n asset: validatedConfig.asset,\n maxTimeoutSeconds: validatedConfig.maxTimeoutSeconds || 300,\n resource: validatedConfig.resource || \"\",\n description: validatedConfig.description || \"\",\n mimeType: validatedConfig.mimeType || \"application/json\",\n paymentType,\n outputSchema: validatedConfig.outputSchema,\n extra: {\n ...(validatedConfig.extra || {}),\n ...(tokenName && { name: tokenName }),\n ...(tokenVersion && { version: tokenVersion }),\n },\n };\n\n // 使用 Zod 验证输出\n return PaymentRequirementsSchema.parse(requirements);\n }\n\n /**\n * 完整的支付处理流程\n * parse → verify → settle 一步到位\n *\n * @param paymentHeader - X-PAYMENT header 的值 (Base64)\n * @param expectedRequirements - 期望的支付要求\n * @returns 处理结果\n */\n async process(\n paymentHeader: string | undefined,\n expectedRequirements: PaymentRequirements,\n ): Promise<ProcessResult> {\n // 1. 解析\n const parsed = this.parse(paymentHeader, expectedRequirements);\n if (!parsed.success) {\n return {\n success: false,\n status: 402,\n response: parsed.response402,\n };\n }\n\n // 2. 验证\n const verified = await this.verify(parsed.data);\n if (!verified.success) {\n return {\n success: false,\n status: 402,\n response: this.get402Response(expectedRequirements, verified.error),\n };\n }\n\n // 3. 结算\n const settled = await this.settle(parsed.data);\n if (!settled.success) {\n return {\n success: false,\n status: 402,\n response: this.get402Response(expectedRequirements, settled.error),\n };\n }\n\n return {\n success: true,\n status: 200,\n data: {\n payer: verified.payer,\n txHash: settled.txHash,\n },\n };\n }\n\n /**\n * 解析支付头\n *\n * @param paymentHeader - X-PAYMENT header 的值\n * @param expectedRequirements - 期望的支付要求\n * @returns 解析结果\n */\n parse(paymentHeader: string | undefined, expectedRequirements: PaymentRequirements): ParseResult {\n // 检查是否提供了支付头\n if (!paymentHeader) {\n return {\n success: false,\n response402: this.get402Response(expectedRequirements, \"missing_payment_header\"),\n };\n }\n\n // 解析 Base64\n let payload: PaymentPayload;\n try {\n const decoded = decodeBase64(paymentHeader);\n const parsed = JSON.parse(decoded);\n\n // 使用 Zod 验证 payload\n payload = PaymentPayloadSchema.parse(parsed);\n } catch (error) {\n return {\n success: false,\n response402: this.get402Response(\n expectedRequirements,\n error instanceof Error\n ? `invalid_payment_header: ${error.message}`\n : \"invalid_payment_header\",\n ),\n };\n }\n\n return {\n success: true,\n data: {\n payload,\n requirements: expectedRequirements,\n },\n };\n }\n\n /**\n * 验证支付签名\n *\n * @param parsed - 解析后的支付数据\n * @returns 验证结果\n */\n async verify(parsed: ParsedPayment): Promise<VerifyResult> {\n try {\n // 调用 facilitator 验证\n const facilitatorPayload = {\n ...parsed.payload,\n payload: parsed.payload.payload || {},\n };\n\n const result = await this.facilitator.verify(\n facilitatorPayload as Parameters<typeof this.facilitator.verify>[0],\n parsed.requirements as Parameters<typeof this.facilitator.verify>[1],\n );\n\n if (!result.success) {\n return {\n success: false,\n error: result.error || result.errorMessage || \"Verification failed\",\n };\n }\n\n if (!result.payer) {\n return {\n success: false,\n error: \"Payer address not found in verification result\",\n };\n }\n\n return {\n success: true,\n payer: result.payer,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : \"Verification error\",\n };\n }\n }\n\n /**\n * 结算支付\n *\n * @param parsed - 解析后的支付数据\n * @returns 结算结果\n */\n async settle(parsed: ParsedPayment): Promise<SettleResult> {\n try {\n // 调用 facilitator 结算\n const facilitatorPayload = {\n ...parsed.payload,\n payload: parsed.payload.payload || {},\n };\n\n const result = await this.facilitator.settle(\n facilitatorPayload as Parameters<typeof this.facilitator.settle>[0],\n parsed.requirements as Parameters<typeof this.facilitator.settle>[1],\n );\n\n if (!result.success) {\n return {\n success: false,\n error: result.error || result.errorMessage || \"Settlement failed\",\n };\n }\n\n if (!result.transaction) {\n return {\n success: false,\n error: \"Transaction hash not found in settlement result\",\n };\n }\n\n return {\n success: true,\n txHash: result.transaction,\n network: result.network || parsed.requirements.network,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : \"Settlement error\",\n };\n }\n }\n\n /**\n * 生成 402 响应\n *\n * @param requirements - 支付要求\n * @param error - 可选的错误信息\n * @returns 402 响应对象\n */\n get402Response(requirements: PaymentRequirements, error?: string): Response402 {\n return {\n x402Version: 1,\n accepts: [requirements],\n error,\n };\n }\n\n /**\n * 清除缓存\n *\n * @param token - 可选,指定要清除的 token 地址\n */\n async clearCache(token?: string): Promise<void> {\n await this.detector.clearCache(token);\n }\n\n /**\n * 获取缓存统计\n *\n * @returns 缓存统计信息\n */\n getCacheStats(): { size: number; keys: string[] } {\n return this.detector.getCacheStats();\n }\n\n /**\n * 获取 facilitator 实例(供外部访问)\n *\n * @returns Facilitator 实例\n */\n getFacilitator(): Facilitator {\n return this.facilitator;\n }\n\n /**\n * 获取 detector 实例(供外部访问)\n *\n * @returns TokenDetector 实例\n */\n getDetector(): TokenDetector {\n return this.detector;\n }\n\n /**\n * 获取 client 实例(供外部访问)\n *\n * @returns PublicClient 实例\n */\n getClient(): PublicClient {\n return this.client;\n }\n\n /**\n * 获取网络名称\n *\n * @returns 网络名称\n */\n private async getNetworkName(): Promise<string> {\n if (this.network) {\n return this.network;\n }\n\n const chainId = await this.client.getChainId();\n\n // 映射常见的 chainId 到网络名称\n const networkMap: Record<number, string> = {\n 1: \"ethereum-mainnet\",\n 5: \"ethereum-goerli\",\n 11155111: \"ethereum-sepolia\",\n 56: \"bsc-mainnet\",\n 97: \"bsc-testnet\",\n 137: \"polygon-mainnet\",\n 80001: \"polygon-mumbai\",\n 42161: \"arbitrum-mainnet\",\n 421613: \"arbitrum-goerli\",\n 10: \"optimism-mainnet\",\n 420: \"optimism-goerli\",\n 8453: \"base-mainnet\",\n 84531: \"base-goerli\",\n };\n\n this.network = networkMap[chainId] || `chain-${chainId}`;\n return this.network;\n }\n}\n","import {\n NetworkSchema,\n PaymentPayloadSchema,\n PaymentRequirementsSchema,\n} from \"@wtflabs/x402/types\";\nimport { z } from \"zod\";\n\n/**\n * 以太坊地址正则\n */\nconst EthAddressRegex = /^0x[a-fA-F0-9]{40}$/;\n\n/**\n * 整数字符串验证\n *\n * @param value - 整数字符串\n * @returns 是否为整数字符串\n */\nconst isIntegerString = (value: string) => {\n const num = Number(value);\n return Number.isInteger(num) && num >= 0;\n};\n\n/**\n * CreateRequirementsConfig Schema\n *\n * @example\n * ```typescript\n * const config = {\n * asset: \"0x1234567890abcdef1234567890abcdef12345678\",\n * maxAmountRequired: \"1000\",\n * };\n * ```\n *\n * @returns CreateRequirementsConfigSchema\n */\nexport const CreateRequirementsConfigSchema = z.object({\n // 必填\n asset: z.string().regex(EthAddressRegex, \"Invalid token address\"),\n maxAmountRequired: z\n .string()\n .refine(isIntegerString, \"Amount must be a non-negative integer string\"),\n\n // 可选 - 网络和 scheme\n network: NetworkSchema,\n scheme: z.literal(\"exact\").optional(),\n outputSchema: z.record(z.any()).optional(),\n\n // 可选 - 额外信息\n extra: z.record(z.any()).optional(),\n\n // 可选 - 支付类型\n paymentType: z.enum([\"permit\", \"eip3009\", \"permit2\", \"auto\"]).optional(),\n\n // 可选 - 资源描述\n resource: z.string().url().optional().or(z.literal(\"\")),\n description: z.string().optional(),\n mimeType: z.string().optional(),\n maxTimeoutSeconds: z.number().int().positive().optional(),\n\n // 可选 - 性能控制\n autoDetect: z.boolean().optional(),\n});\n\nexport type CreateRequirementsConfig = z.infer<typeof CreateRequirementsConfigSchema>;\n\n/**\n * PaymentRequirements Schema\n *\n * @example\n * ```typescript\n * const requirements = {\n * x402Version: 1,\n * scheme: \"exact\",\n * network: \"ethereum-mainnet\",\n * maxAmountRequired: \"1000\",\n * payTo: \"0x1234567890abcdef1234567890abcdef12345678\",\n * asset: \"0x1234567890abcdef1234567890abcdef12345678\",\n * maxTimeoutSeconds: 300,\n * resource: \"https://api.example.com/data\",\n * description: \"API access\",\n * mimeType: \"application/json\",\n * paymentType: \"permit\",\n * extra: {\n * relayer: \"0x1234567890abcdef1234567890abcdef12345678\",\n * name: \"API access\",\n * version: \"1.0.0\",\n * },\n * };\n * ```\n *\n * @returns PaymentRequirementsSchema\n */\n\nexport type PaymentRequirements = z.infer<typeof PaymentRequirementsSchema>;\n\n/**\n * PaymentPayload Schema\n *\n * @example\n * ```typescript\n * const payload = {\n * x402Version: 1,\n * scheme: \"exact\",\n * network: \"ethereum-mainnet\",\n * payload: {\n * maxAmountRequired: \"1000\",\n * asset: \"0x1234567890abcdef1234567890abcdef12345678\",\n * recipient: \"0x1234567890abcdef1234567890abcdef12345678\",\n * nonce: \"1234567890abcdef1234567890abcdef12345678\",\n * expiration: 1715000000,\n * },\n * };\n * ```\n */\n// export const PaymentPayloadSchema = z.object({\n// x402Version: z.number(),\n// scheme: z.literal(\"exact\"),\n// network: z.string(),\n// payload: z.any(),\n// });\n\nexport type PaymentPayload = z.infer<typeof PaymentPayloadSchema>;\n\n/**\n * Response402 Schema\n */\nexport const Response402Schema = z.object({\n x402Version: z.literal(1),\n accepts: z.array(PaymentRequirementsSchema),\n error: z.string().optional(),\n});\n\nexport type Response402 = z.infer<typeof Response402Schema>;\n\n/**\n * InitResult Schema\n */\nexport const InitResultSchema = z.discriminatedUnion(\"success\", [\n z.object({ success: z.literal(true) }),\n z.object({ success: z.literal(false), error: z.string() }),\n]);\n\nexport type InitResult = z.infer<typeof InitResultSchema>;\n\n/**\n * ProcessResult Schema\n */\nexport const ProcessResultSchema = z.discriminatedUnion(\"success\", [\n z.object({\n success: z.literal(true),\n status: z.literal(200),\n data: z.object({\n payer: z.string().regex(EthAddressRegex),\n txHash: z.string(),\n }),\n }),\n z.object({\n success: z.literal(false),\n status: z.literal(402),\n response: Response402Schema,\n }),\n]);\n\nexport type ProcessResult = z.infer<typeof ProcessResultSchema>;\n\n/**\n * ParsedPayment Schema\n */\nexport const ParsedPaymentSchema = z.object({\n payload: PaymentPayloadSchema,\n requirements: PaymentRequirementsSchema,\n});\n\nexport type ParsedPayment = z.infer<typeof ParsedPaymentSchema>;\n\n/**\n * ParseResult Schema\n */\nexport const ParseResultSchema = z.discriminatedUnion(\"success\", [\n z.object({ success: z.literal(true), data: ParsedPaymentSchema }),\n z.object({ success: z.literal(false), response402: Response402Schema }),\n]);\n\nexport type ParseResult = z.infer<typeof ParseResultSchema>;\n\n/**\n * VerifyResult Schema\n */\nexport const VerifyResultSchema = z.discriminatedUnion(\"success\", [\n z.object({ success: z.literal(true), payer: z.string().regex(EthAddressRegex) }),\n z.object({ success: z.literal(false), error: z.string() }),\n]);\n\nexport type VerifyResult = z.infer<typeof VerifyResultSchema>;\n\n/**\n * SettleResult Schema\n */\nexport const SettleResultSchema = z.discriminatedUnion(\"success\", [\n z.object({\n success: z.literal(true),\n txHash: z.string(),\n network: z.string(),\n }),\n z.object({\n success: z.literal(false),\n error: z.string(),\n }),\n]);\n\nexport type SettleResult = z.infer<typeof SettleResultSchema>;\n","/**\n * 解码 Base64 字符串\n *\n * @param base64 - Base64 编码的字符串\n * @returns 解码后的字符串\n */\nexport function decodeBase64(base64: string): string {\n // 移除 data URL 前缀(如果存在)\n const cleanBase64 = base64.replace(/^data:application\\/json;base64,/, \"\");\n\n // 浏览器环境\n if (typeof window !== \"undefined\" && window.atob) {\n return window.atob(cleanBase64);\n }\n\n // Node.js 环境\n if (typeof Buffer !== \"undefined\") {\n return Buffer.from(cleanBase64, \"base64\").toString(\"utf-8\");\n }\n\n throw new Error(\"No Base64 decoder available\");\n}\n\n/**\n * 编码为 Base64 字符串\n *\n * @param str - 要编码的字符串\n * @returns Base64 编码的字符串\n */\nexport function encodeBase64(str: string): string {\n // 浏览器环境\n if (typeof window !== \"undefined\" && window.btoa) {\n return window.btoa(str);\n }\n\n // Node.js 环境\n if (typeof Buffer !== \"undefined\") {\n return Buffer.from(str, \"utf-8\").toString(\"base64\");\n }\n\n throw new Error(\"No Base64 encoder available\");\n}\n","/**\n * Express 中间件 for x402 Payment Protocol\n */\n\nimport type { X402Server } from \"../server\";\nimport type { CreateRequirementsConfig, Response402 } from \"../schemas\";\n\n/**\n * Express-like Request 接口\n * 定义最小化的类型,避免直接依赖 express\n */\nexport interface ExpressRequest {\n headers: Record<string, string | string[] | undefined>;\n body?: unknown;\n params?: Record<string, string>;\n query?: Record<string, string | string[] | undefined>;\n x402?: {\n payer: string;\n txHash: string;\n };\n}\n\n/**\n * Express-like Response 接口\n */\nexport interface ExpressResponse {\n status(code: number): this;\n json(body: unknown): this;\n}\n\n/**\n * Express-like NextFunction 类型\n */\nexport type ExpressNextFunction = (error?: Error) => void;\n\n/**\n * Express 中间件配置选项\n */\nexport interface ExpressMiddlewareOptions {\n /** X402Server 实例 */\n server: X402Server;\n\n /** 获取 token 地址的函数 */\n getToken: (req: ExpressRequest) => string | Promise<string>;\n\n /** 获取金额的函数 */\n getAmount: (req: ExpressRequest) => string | Promise<string>;\n\n /** 可选:获取额外配置的函数 */\n getConfig?: (\n req: ExpressRequest,\n ) => Partial<CreateRequirementsConfig> | Promise<Partial<CreateRequirementsConfig>>;\n\n /** 可选:自定义错误处理 */\n onError?: (error: Error, req: ExpressRequest, res: ExpressResponse) => void;\n\n /** 可选:自定义 402 响应处理 */\n on402?: (req: ExpressRequest, res: ExpressResponse, response402: Response402) => void;\n\n /** 可选:支付成功后的回调 */\n onPaymentSuccess?: (req: ExpressRequest, payer: string, txHash: string) => void | Promise<void>;\n}\n\n/**\n * 创建 Express 中间件\n *\n * @param options - 中间件配置\n * @returns Express 中间件函数\n *\n * @example\n * ```typescript\n * const middleware = createExpressMiddleware({\n * server,\n * getToken: (req) => req.body.token || USDC,\n * getAmount: (req) => calculatePrice(req.body),\n * });\n *\n * app.post(\"/api/resource\", middleware, (req, res) => {\n * // Payment already verified and settled\n * const { payer, txHash } = req.x402;\n * res.json({ data: \"resource\", payer, txHash });\n * });\n * ```\n */\nexport function createExpressMiddleware(options: ExpressMiddlewareOptions) {\n return async (req: ExpressRequest, res: ExpressResponse, next: ExpressNextFunction) => {\n try {\n // 1. 获取 token 和 amount\n const token = await options.getToken(req);\n const amount = await options.getAmount(req);\n\n // 2. 获取额外配置\n const extraConfig = options.getConfig ? await options.getConfig(req) : {};\n\n // 3. 创建支付要求(过滤掉 undefined 值)\n const filteredConfig = Object.fromEntries(\n Object.entries(extraConfig).filter(([, value]) => value !== undefined),\n );\n\n const requirements = await options.server.createRequirements({\n asset: token,\n maxAmountRequired: amount,\n ...filteredConfig,\n } as CreateRequirementsConfig);\n\n // 4. 处理支付\n const paymentHeader = req.headers[\"x-payment\"] as string | undefined;\n const result = await options.server.process(paymentHeader, requirements);\n\n // 5. 处理结果\n if (!result.success) {\n // 支付失败,返回 402\n if (options.on402) {\n options.on402(req, res, result.response);\n } else {\n res.status(402).json(result.response);\n }\n return;\n }\n\n // 6. 支付成功\n // 将支付信息附加到 req 对象\n req.x402 = {\n payer: result.data.payer,\n txHash: result.data.txHash,\n };\n\n // 调用成功回调\n if (options.onPaymentSuccess) {\n await options.onPaymentSuccess(req, result.data.payer, result.data.txHash);\n }\n\n // 继续到下一个中间件\n next();\n } catch (error) {\n // 错误处理\n if (options.onError) {\n options.onError(error as Error, req, res);\n } else {\n console.error(\"x402 middleware error:\", error);\n res.status(500).json({\n error: \"Payment processing error\",\n message: error instanceof Error ? error.message : \"Unknown error\",\n });\n }\n }\n };\n}\n\n/**\n * Express 中间件函数类型\n */\nexport type ExpressMiddleware = (\n req: ExpressRequest,\n res: ExpressResponse,\n next: ExpressNextFunction,\n) => void | Promise<void>;\n","/**\n * Hono 中间件 for x402 Payment Protocol\n */\n\nimport type { X402Server } from \"../server\";\nimport type { CreateRequirementsConfig, Response402 } from \"../schemas\";\n\n/**\n * Hono-like Request 接口\n */\nexport interface HonoRequest {\n header(name: string): string | undefined;\n json<T = unknown>(): Promise<T>;\n query(name: string): string | undefined;\n}\n\n/**\n * Hono-like Context 接口\n */\nexport interface HonoContext {\n req: HonoRequest;\n json(body: unknown, status?: number): Response;\n set(key: string, value: unknown): void;\n get(key: string): unknown;\n}\n\n/**\n * Hono-like Next 函数\n */\nexport type HonoNext = () => Promise<void>;\n\n/**\n * Hono 中间件函数类型\n */\nexport type HonoMiddlewareHandler = (c: HonoContext, next: HonoNext) => Promise<Response | void>;\n\n/**\n * Hono 中间件配置选项\n */\nexport interface HonoMiddlewareOptions {\n /** X402Server 实例 */\n server: X402Server;\n\n /** 获取 token 地址的函数 */\n getToken: (c: HonoContext) => string | Promise<string>;\n\n /** 获取金额的函数 */\n getAmount: (c: HonoContext) => string | Promise<string>;\n\n /** 可选:获取额外配置的函数 */\n getConfig?: (\n c: HonoContext,\n ) => Partial<CreateRequirementsConfig> | Promise<Partial<CreateRequirementsConfig>>;\n\n /** 可选:自定义错误处理 */\n onError?: (error: Error, c: HonoContext) => Response | Promise<Response>;\n\n /** 可选:自定义 402 响应处理 */\n on402?: (c: HonoContext, response402: Response402) => Response | Promise<Response>;\n\n /** 可选:支付成功后的回调 */\n onPaymentSuccess?: (c: HonoContext, payer: string, txHash: string) => void | Promise<void>;\n}\n\n/**\n * 创建 Hono 中间件\n *\n * @param options - 中间件配置\n * @returns Hono 中间件函数\n *\n * @example\n * ```typescript\n * const middleware = createHonoMiddleware({\n * server,\n * getToken: (c) => c.req.query(\"token\") || USDC,\n * getAmount: async (c) => {\n * const body = await c.req.json();\n * return calculatePrice(body.complexity);\n * },\n * });\n *\n * app.post(\"/api/resource\", middleware, (c) => {\n * // Payment already verified and settled\n * const { payer, txHash } = c.get(\"x402\");\n * return c.json({ data: \"resource\", payer, txHash });\n * });\n * ```\n */\nexport function createHonoMiddleware(options: HonoMiddlewareOptions): HonoMiddlewareHandler {\n return async (c: HonoContext, next: HonoNext) => {\n try {\n // 1. 获取 token 和 amount\n const token = await options.getToken(c);\n const amount = await options.getAmount(c);\n\n // 2. 获取额外配置\n const extraConfig = options.getConfig ? await options.getConfig(c) : {};\n\n // 3. 创建支付要求(过滤掉 undefined 值)\n const filteredConfig = Object.fromEntries(\n Object.entries(extraConfig).filter(([, value]) => value !== undefined),\n );\n\n const requirements = await options.server.createRequirements({\n asset: token,\n maxAmountRequired: amount,\n ...filteredConfig,\n } as CreateRequirementsConfig);\n\n // 4. 处理支付\n const paymentHeader = c.req.header(\"x-payment\");\n const result = await options.server.process(paymentHeader, requirements);\n\n // 5. 处理结果\n if (!result.success) {\n // 支付失败,返回 402\n if (options.on402) {\n return options.on402(c, result.response);\n } else {\n return c.json(result.response, 402);\n }\n }\n\n // 6. 支付成功\n // 将支付信息存储到 context\n c.set(\"x402\", {\n payer: result.data.payer,\n txHash: result.data.txHash,\n });\n\n // 调用成功回调\n if (options.onPaymentSuccess) {\n await options.onPaymentSuccess(c, result.data.payer, result.data.txHash);\n }\n\n // 继续到下一个中间件\n await next();\n } catch (error) {\n // 错误处理\n if (options.onError) {\n return options.onError(error as Error, c);\n } else {\n console.error(\"x402 middleware error:\", error);\n return c.json(\n {\n error: \"Payment processing error\",\n message: error instanceof Error ? error.message : \"Unknown error\",\n },\n 500,\n );\n }\n }\n };\n}\n","import type { PublicClient } from \"viem\";\nimport type { Facilitator } from \"@wtflabs/x402-facilitator\";\n\n/**\n * X402Server 配置选项\n */\nexport interface X402ServerConfig {\n /** Viem PublicClient (必填) */\n client: PublicClient;\n\n /** Facilitator 实例 (必填) */\n facilitator: Facilitator;\n\n /** 网络名称,默认从 client 自动检测 */\n network?: string;\n}\n\n// Re-export all types and schemas from schemas.ts\nexport type {\n CreateRequirementsConfig,\n PaymentRequirements,\n PaymentPayload,\n Response402,\n InitResult,\n ProcessResult,\n ParseResult,\n VerifyResult,\n SettleResult,\n ParsedPayment,\n} from \"./schemas\";\n\nexport {\n CreateRequirementsConfigSchema,\n Response402Schema,\n InitResultSchema,\n ProcessResultSchema,\n ParseResultSchema,\n VerifyResultSchema,\n SettleResultSchema,\n ParsedPaymentSchema,\n} from \"./schemas\";\n\nexport { PaymentRequirementsSchema, PaymentPayloadSchema } from \"@wtflabs/x402/types\";\n"],"mappings":"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","names":["import_types","import_types"]}