Skip to content

Conversation

@Kbhat1
Copy link

@Kbhat1 Kbhat1 commented Jan 20, 2026

Description

Adds an opt-in facilitatorFees extension to standardize facilitator fee disclosure, enabling fee-aware multi-facilitator routing.

This extension introduces three components:

  • facilitatorFeeQuote: Facilitator-signed fee disclosure surfaced in PaymentRequired
  • facilitatorFeeBid: Client fee constraints/preferences surfaced in PaymentPayload
  • facilitatorFeePaid: Actual fee charged surfaced in SettlementResponse

Motivation

Facilitators are beginning to charge explicit fees:

  • Coinbase CDP x402 Facilitator: flat-fee model ($0.001/transaction after free tier)
  • Thirdweb: percentage-based fees (0.3% bps)

Without standardization, clients cannot compare total cost across facilitators, and multi-facilitator routing cannot become a real market.

Changes

Spec:

  • specs/extensions/facilitator_fees.md — Full extension specification

TypeScript (@x402/extensions):

  • src/facilitator-fees/types.ts — Type definitions
  • src/facilitator-fees/schema.ts — Zod validation schemas
  • src/facilitator-fees/index.ts — Helper functions and exports
  • test/facilitator-fees.test.ts — Unit tests
  • Updated package.json, tsup.config.ts, src/index.ts for exports

Core Types (@x402/core):

  • Added extensions?: Record<string, unknown> to SettleResponse

Design Decisions

  1. Uses extensions, not extra: Facilitator fees are orthogonal to payment schemes and belong in the top-level extensions field (like bazaar)
  2. Selection semantics: selectedQuoteId enables client agency while keeping simple cases simple
  3. Signature schemes per network family: eip191 for EVM, ed25519 for Solana

Tests

Build:

cd typescript && pnpm --filter @x402/extensions build

✅ Build successful

Lint:
cd typescript && pnpm --filter @x402/extensions lint:check

✅ No errors

Code validation (all schemas and helpers verified):

  • ✅ FacilitatorFeeQuoteSchema — parses flat/bps fee quotes
  • ✅ FacilitatorFeeBidSchema — parses client bids
  • ✅ FacilitatorFeesSettlementInfoSchema — parses fee paid info
  • ✅ declareFacilitatorFeesExtension() — creates PaymentRequired extension
  • ✅ createFacilitatorFeeBid() — creates PaymentPayload extension
  • ✅ createFacilitatorFeePaid() — creates SettlementResponse extension
  • ✅ isQuoteExpired() — correctly detects expired quotes

Note: Unit tests are written in test/facilitator-fees.test.ts. The repo's vitest config has a pre-existing ESM/CJS compatibility issue (vite-tsconfig-paths module loading error) that affects all tests in @x402/extensions. The test file is correctly structured and will pass once resolved.

This extension standardizes facilitator fee disclosure to enable
fee-aware multi-facilitator routing:

- FacilitatorFeeQuote: facilitator-signed fee disclosure at PaymentRequired
- FacilitatorFeeBid: client fee constraints in PaymentPayload
- FacilitatorFeePaid: actual fee charged in SettlementResponse

Also adds extensions field to SettleResponse in core types.

Closes #XXX
@Kbhat1 Kbhat1 changed the title feat(extensions): Add Facilitator Fee Standardization (facilitatorFeeQuote, facilitatorFeeBid, facilitatorFeePaid) for Fee-aware routing feat(extensions): Add Facilitator Fee Standardization for Fee-Aware Routing (facilitator FeeQuote, facilitatorFeeBid, facilitatorFeePaid) Jan 20, 2026
@Kbhat1 Kbhat1 changed the title feat(extensions): Add Facilitator Fee Standardization for Fee-Aware Routing (facilitator FeeQuote, facilitatorFeeBid, facilitatorFeePaid) feat(extensions): Add Facilitator Fee Disclosures for Fee-Aware Routing (facilitator FeeQuote, facilitatorFeeBid, facilitatorFeePaid) Jan 20, 2026
@Kbhat1 Kbhat1 changed the title feat(extensions): Add Facilitator Fee Disclosures for Fee-Aware Routing (facilitator FeeQuote, facilitatorFeeBid, facilitatorFeePaid) feat(extensions): Add Facilitator Fee Disclosures for Fee-Aware Routing - feeQuote, facilitatorFeeBid, facilitatorFeePaid (draft, addresses #) Jan 20, 2026
@Kbhat1 Kbhat1 changed the title feat(extensions): Add Facilitator Fee Disclosures for Fee-Aware Routing - feeQuote, facilitatorFeeBid, facilitatorFeePaid (draft, addresses #) feat(extensions): Add Facilitator Fee Disclosures for Fee-Aware Routing - facilitatorFeeQuote, facilitatorFeeBid, facilitatorFeePaid (draft, addresses #) Jan 20, 2026
vite-tsconfig-paths v5.x is ESM-only, causing ERR_REQUIRE_ESM when
loading vitest.config.ts in CommonJS context. Using .mts extension
forces Node to treat configs as ES modules.

Also added .pnpm-store to .gitignore.
@Kbhat1 Kbhat1 marked this pull request as draft January 20, 2026 22:58
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants