TypeScript SDK
x402.facilitator
Creates a facilitator for the x402 payment protocol.
You can use this with verifyPayment
or with any x402 middleware to enable settling transactions with your thirdweb server wallet.
import { facilitator } from "thirdweb/x402";import { createThirdwebClient } from "thirdweb"; const client = createThirdwebClient({ secretKey: "your-secret-key",});const thirdwebX402Facilitator = facilitator({ client: client, serverWalletAddress: "0x1234567890123456789012345678901234567890",}); // add the facilitator to any x402 payment middlewareconst middleware = paymentMiddleware( "0x1234567890123456789012345678901234567890", { "/api/paywall": { price: "$0.01", network: "base-sepolia", config: { description: "Access to paid content", }, }, }, thirdwebX402Facilitator,);
createAuthHeaders: () => Promise<{ list: { "x-secret-key": string }; settle: { "x-secret-key": string; "x-settlement-wallet-address": string; "x-vault-access-token"?: string; }; supported: { "x-secret-key": string }; verify: { "x-secret-key": string }; }>; url: `${string}://${string}`; settle: ( payload: { network: string; payload: | { authorization: { from: string; nonce: string; to: string; validAfter: string; validBefore: string; value: string; }; signature: string; } | { transaction: string }; scheme: "exact"; x402Version: number; }, paymentRequirements: { asset: string; description: string; extra?: Record<string, any>; maxAmountRequired: string; maxTimeoutSeconds: number; mimeType: string; network: string; outputSchema?: Record<string, any>; payTo: string; resource: string; scheme: "exact"; }, ) => Promise<{ errorReason?: | "insufficient_funds" | "invalid_exact_evm_payload_authorization_valid_after" | "invalid_exact_evm_payload_authorization_valid_before" | "invalid_exact_evm_payload_authorization_value" | "invalid_exact_evm_payload_signature" | "invalid_exact_evm_payload_recipient_mismatch" | "invalid_exact_svm_payload_transaction" | "invalid_exact_svm_payload_transaction_amount_mismatch" | "invalid_exact_svm_payload_transaction_create_ata_instruction" | "invalid_exact_svm_payload_transaction_create_ata_instruction_incorrect_payee" | "invalid_exact_svm_payload_transaction_create_ata_instruction_incorrect_asset" | "invalid_exact_svm_payload_transaction_instructions" | "invalid_exact_svm_payload_transaction_instructions_length" | "invalid_exact_svm_payload_transaction_instructions_compute_limit_instruction" | "invalid_exact_svm_payload_transaction_instructions_compute_price_instruction" | "invalid_exact_svm_payload_transaction_instructions_compute_price_instruction_too_high" | "invalid_exact_svm_payload_transaction_instruction_not_spl_token_transfer_checked" | "invalid_exact_svm_payload_transaction_instruction_not_token_2022_transfer_checked" | "invalid_exact_svm_payload_transaction_not_a_transfer_instruction" | "invalid_exact_svm_payload_transaction_cannot_derive_receiver_ata" | "invalid_exact_svm_payload_transaction_receiver_ata_not_found" | "invalid_exact_svm_payload_transaction_sender_ata_not_found" | "invalid_exact_svm_payload_transaction_simulation_failed" | "invalid_exact_svm_payload_transaction_transfer_to_incorrect_ata" | "invalid_network" | "invalid_payload" | "invalid_payment_requirements" | "invalid_scheme" | "invalid_payment" | "payment_expired" | "unsupported_scheme" | "invalid_x402_version" | "invalid_transaction_state" | "settle_exact_svm_block_height_exceeded" | "settle_exact_svm_transaction_confirmation_timed_out" | "unexpected_settle_error" | "unexpected_verify_error"; network: string; payer?: string; success: boolean; transaction: string; }>; supported: () => Promise<{ kinds: Array<{ extra?: Record<string, any>; network: | "base" | "base-sepolia" | "avalanche-fuji" | "avalanche" | "iotex" | "solana-devnet" | "solana" | "sei" | "sei-testnet"; scheme: "exact"; x402Version: number; }>; }>; verify: ( payload: { network: string; payload: | { authorization: { from: string; nonce: string; to: string; validAfter: string; validBefore: string; value: string; }; signature: string; } | { transaction: string }; scheme: "exact"; x402Version: number; }, paymentRequirements: { asset: string; description: string; extra?: Record<string, any>; maxAmountRequired: string; maxTimeoutSeconds: number; mimeType: string; network: string; outputSchema?: Record<string, any>; payTo: string; resource: string; scheme: "exact"; }, ) => Promise<{ invalidReason?: | "insufficient_funds" | "invalid_exact_evm_payload_authorization_valid_after" | "invalid_exact_evm_payload_authorization_valid_before" | "invalid_exact_evm_payload_authorization_value" | "invalid_exact_evm_payload_signature" | "invalid_exact_evm_payload_recipient_mismatch" | "invalid_exact_svm_payload_transaction" | "invalid_exact_svm_payload_transaction_amount_mismatch" | "invalid_exact_svm_payload_transaction_create_ata_instruction" | "invalid_exact_svm_payload_transaction_create_ata_instruction_incorrect_payee" | "invalid_exact_svm_payload_transaction_create_ata_instruction_incorrect_asset" | "invalid_exact_svm_payload_transaction_instructions" | "invalid_exact_svm_payload_transaction_instructions_length" | "invalid_exact_svm_payload_transaction_instructions_compute_limit_instruction" | "invalid_exact_svm_payload_transaction_instructions_compute_price_instruction" | "invalid_exact_svm_payload_transaction_instructions_compute_price_instruction_too_high" | "invalid_exact_svm_payload_transaction_instruction_not_spl_token_transfer_checked" | "invalid_exact_svm_payload_transaction_instruction_not_token_2022_transfer_checked" | "invalid_exact_svm_payload_transaction_not_a_transfer_instruction" | "invalid_exact_svm_payload_transaction_cannot_derive_receiver_ata" | "invalid_exact_svm_payload_transaction_receiver_ata_not_found" | "invalid_exact_svm_payload_transaction_sender_ata_not_found" | "invalid_exact_svm_payload_transaction_simulation_failed" | "invalid_exact_svm_payload_transaction_transfer_to_incorrect_ata" | "invalid_network" | "invalid_payload" | "invalid_payment_requirements" | "invalid_scheme" | "invalid_payment" | "payment_expired" | "unsupported_scheme" | "invalid_x402_version" | "invalid_transaction_state" | "settle_exact_svm_block_height_exceeded" | "settle_exact_svm_transaction_confirmation_timed_out" | "unexpected_settle_error" | "unexpected_verify_error"; isValid: boolean; payer?: string; }>;};
The configuration for the facilitator
let config: { baseUrl?: string; serverWalletAddress: string; vaultAccessToken?: string;};
let returnType: { createAuthHeaders: () => Promise<{ list: { "x-secret-key": string }; settle: { "x-secret-key": string; "x-settlement-wallet-address": string; "x-vault-access-token"?: string; }; supported: { "x-secret-key": string }; verify: { "x-secret-key": string }; }>; url: `${string}://${string}`; settle: ( payload: { network: string; payload: | { authorization: { from: string; nonce: string; to: string; validAfter: string; validBefore: string; value: string; }; signature: string; } | { transaction: string }; scheme: "exact"; x402Version: number; }, paymentRequirements: { asset: string; description: string; extra?: Record<string, any>; maxAmountRequired: string; maxTimeoutSeconds: number; mimeType: string; network: string; outputSchema?: Record<string, any>; payTo: string; resource: string; scheme: "exact"; }, ) => Promise<{ errorReason?: | "insufficient_funds" | "invalid_exact_evm_payload_authorization_valid_after" | "invalid_exact_evm_payload_authorization_valid_before" | "invalid_exact_evm_payload_authorization_value" | "invalid_exact_evm_payload_signature" | "invalid_exact_evm_payload_recipient_mismatch" | "invalid_exact_svm_payload_transaction" | "invalid_exact_svm_payload_transaction_amount_mismatch" | "invalid_exact_svm_payload_transaction_create_ata_instruction" | "invalid_exact_svm_payload_transaction_create_ata_instruction_incorrect_payee" | "invalid_exact_svm_payload_transaction_create_ata_instruction_incorrect_asset" | "invalid_exact_svm_payload_transaction_instructions" | "invalid_exact_svm_payload_transaction_instructions_length" | "invalid_exact_svm_payload_transaction_instructions_compute_limit_instruction" | "invalid_exact_svm_payload_transaction_instructions_compute_price_instruction" | "invalid_exact_svm_payload_transaction_instructions_compute_price_instruction_too_high" | "invalid_exact_svm_payload_transaction_instruction_not_spl_token_transfer_checked" | "invalid_exact_svm_payload_transaction_instruction_not_token_2022_transfer_checked" | "invalid_exact_svm_payload_transaction_not_a_transfer_instruction" | "invalid_exact_svm_payload_transaction_cannot_derive_receiver_ata" | "invalid_exact_svm_payload_transaction_receiver_ata_not_found" | "invalid_exact_svm_payload_transaction_sender_ata_not_found" | "invalid_exact_svm_payload_transaction_simulation_failed" | "invalid_exact_svm_payload_transaction_transfer_to_incorrect_ata" | "invalid_network" | "invalid_payload" | "invalid_payment_requirements" | "invalid_scheme" | "invalid_payment" | "payment_expired" | "unsupported_scheme" | "invalid_x402_version" | "invalid_transaction_state" | "settle_exact_svm_block_height_exceeded" | "settle_exact_svm_transaction_confirmation_timed_out" | "unexpected_settle_error" | "unexpected_verify_error"; network: string; payer?: string; success: boolean; transaction: string; }>; supported: () => Promise<{ kinds: Array<{ extra?: Record<string, any>; network: | "base" | "base-sepolia" | "avalanche-fuji" | "avalanche" | "iotex" | "solana-devnet" | "solana" | "sei" | "sei-testnet"; scheme: "exact"; x402Version: number; }>; }>; verify: ( payload: { network: string; payload: | { authorization: { from: string; nonce: string; to: string; validAfter: string; validBefore: string; value: string; }; signature: string; } | { transaction: string }; scheme: "exact"; x402Version: number; }, paymentRequirements: { asset: string; description: string; extra?: Record<string, any>; maxAmountRequired: string; maxTimeoutSeconds: number; mimeType: string; network: string; outputSchema?: Record<string, any>; payTo: string; resource: string; scheme: "exact"; }, ) => Promise<{ invalidReason?: | "insufficient_funds" | "invalid_exact_evm_payload_authorization_valid_after" | "invalid_exact_evm_payload_authorization_valid_before" | "invalid_exact_evm_payload_authorization_value" | "invalid_exact_evm_payload_signature" | "invalid_exact_evm_payload_recipient_mismatch" | "invalid_exact_svm_payload_transaction" | "invalid_exact_svm_payload_transaction_amount_mismatch" | "invalid_exact_svm_payload_transaction_create_ata_instruction" | "invalid_exact_svm_payload_transaction_create_ata_instruction_incorrect_payee" | "invalid_exact_svm_payload_transaction_create_ata_instruction_incorrect_asset" | "invalid_exact_svm_payload_transaction_instructions" | "invalid_exact_svm_payload_transaction_instructions_length" | "invalid_exact_svm_payload_transaction_instructions_compute_limit_instruction" | "invalid_exact_svm_payload_transaction_instructions_compute_price_instruction" | "invalid_exact_svm_payload_transaction_instructions_compute_price_instruction_too_high" | "invalid_exact_svm_payload_transaction_instruction_not_spl_token_transfer_checked" | "invalid_exact_svm_payload_transaction_instruction_not_token_2022_transfer_checked" | "invalid_exact_svm_payload_transaction_not_a_transfer_instruction" | "invalid_exact_svm_payload_transaction_cannot_derive_receiver_ata" | "invalid_exact_svm_payload_transaction_receiver_ata_not_found" | "invalid_exact_svm_payload_transaction_sender_ata_not_found" | "invalid_exact_svm_payload_transaction_simulation_failed" | "invalid_exact_svm_payload_transaction_transfer_to_incorrect_ata" | "invalid_network" | "invalid_payload" | "invalid_payment_requirements" | "invalid_scheme" | "invalid_payment" | "payment_expired" | "unsupported_scheme" | "invalid_x402_version" | "invalid_transaction_state" | "settle_exact_svm_block_height_exceeded" | "settle_exact_svm_transaction_confirmation_timed_out" | "unexpected_settle_error" | "unexpected_verify_error"; isValid: boolean; payer?: string; }>;};
a x402 compatible FacilitatorConfig