UNPKG

@wtflabs/x402-facilitator

Version:

X402 Payment Facilitator for handling payment settlements

192 lines (190 loc) 5.61 kB
"use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); // src/index.ts var index_exports = {}; __export(index_exports, { Facilitator: () => Facilitator }); module.exports = __toCommonJS(index_exports); // src/facilitator.ts var DEFAULT_FACILITATOR_URL = "https://facilitator.wtf.com/v1"; var DEFAULT_RELAYER_ADDRESS = "0x877D0A51a37178b5F34Ffb68a5c2beD0ff46D432"; var Facilitator = class { constructor(config) { if (!config.recipientAddress) { throw new Error("recipientAddress is required"); } this.config = { recipientAddress: config.recipientAddress, relayer: config.relayer || DEFAULT_RELAYER_ADDRESS, waitUntil: config.waitUntil || "confirmed", baseUrl: config.baseUrl || DEFAULT_FACILITATOR_URL, apiKey: config.apiKey || "" }; this.authHeaders = this.config.apiKey ? { Authorization: `Bearer ${this.config.apiKey}` } : {}; } /** * 获取 relayer 地址 */ get relayer() { return this.config.relayer; } /** * 获取 recipient 地址 */ get recipientAddress() { return this.config.recipientAddress; } /** * 获取等待策略 */ get waitUntil() { return this.config.waitUntil; } /** * 验证支付 * @param payload 支付负载 * @param requirements 支付要求 * @returns 验证结果 */ async verify(payload, requirements) { try { const response = await fetch(`${this.config.baseUrl}/verify`, { method: "POST", headers: { "Content-Type": "application/json", ...this.authHeaders }, body: JSON.stringify({ x402Version: payload.x402Version, paymentPayload: payload, paymentRequirements: requirements }) }); if (!response.ok) { const errorText = await response.text(); return { success: false, error: `Verification failed: ${response.status}`, errorMessage: errorText }; } const data = await response.json(); return { success: data.success ?? true, payer: data.payer, error: data.error, errorMessage: data.errorMessage }; } catch (error) { return { success: false, error: "Verification error", errorMessage: error instanceof Error ? error.message : "Unknown error" }; } } /** * 结算支付 * @param payload 支付负载 * @param requirements 支付要求 * @param waitUntil 可选的等待策略,覆盖配置中的默认值 * @returns 结算结果 */ async settle(payload, requirements, waitUntil) { try { const response = await fetch(`${this.config.baseUrl}/settle`, { method: "POST", headers: { "Content-Type": "application/json", ...this.authHeaders }, body: JSON.stringify({ x402Version: payload.x402Version, paymentPayload: payload, paymentRequirements: requirements, waitUntil: waitUntil || this.config.waitUntil }) }); if (!response.ok) { const errorText = await response.text(); return { success: false, error: `Settlement failed: ${response.status}`, errorMessage: errorText }; } const data = await response.json(); return { success: data.success ?? true, transactionHash: data.transactionHash, network: data.network, receipt: data.receipt, error: data.error, errorMessage: data.errorMessage }; } catch (error) { return { success: false, error: "Settlement error", errorMessage: error instanceof Error ? error.message : "Unknown error" }; } } /** * 获取支持的支付类型 * @param filters 可选的过滤条件 * @returns 支持的支付类型列表 */ async supported(filters) { try { const url = new URL(`${this.config.baseUrl}/supported`); if (filters?.chainId) { url.searchParams.set("chainId", filters.chainId.toString()); } if (filters?.tokenAddress) { url.searchParams.set("tokenAddress", filters.tokenAddress); } const response = await fetch(url.toString(), { headers: this.authHeaders }); if (!response.ok) { throw new Error(`Failed to get supported kinds: ${response.status}`); } const data = await response.json(); return data; } catch (error) { console.error("Error fetching supported payment kinds:", error); return { kinds: [] }; } } /** * 获取完整配置 */ getConfig() { return { ...this.config }; } }; // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { Facilitator }); //# sourceMappingURL=index.js.map