x402x-facilitator
Version:
X402 Payment Facilitator for handling payment settlements
157 lines • 4.34 kB
JavaScript
// src/facilitator.ts
var DEFAULT_FACILITATOR_URL = "https://facilitator.wtf.com/v1";
var Facilitator = class {
constructor(config) {
if (!config.recipientAddress) {
throw new Error("recipientAddress is required");
}
this.config = {
recipientAddress: config.recipientAddress,
waitUntil: config.waitUntil || "confirmed",
baseUrl: config.baseUrl || DEFAULT_FACILITATOR_URL,
apiKey: config.apiKey || ""
};
this.authHeaders = this.config.apiKey ? {
Authorization: `Bearer ${this.config.apiKey}`
} : {};
}
/**
* 获取 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,
transaction: data.transaction,
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 };
}
};
export {
Facilitator
};
//# sourceMappingURL=index.mjs.map