Conformance

What OpenWallet implements, against which pinned sources, and how it is tested against other implementations.

Pinned sources

SourcePinned at
x402 specification (v2), x402-foundation/x4026b6ee91fee027b540faabcb25774e73851006c3b (29 Sep 2026)
XRPL exact scheme, specs/schemes/exact/scheme_exact_xrpl.mdsame commit; file SHA-256 c8defedd55c76aada590283605f985fb7c237e68c6eec2db7b96552bf1f28bf9; introduced 3 Jul 2026, revised 14 Jul 2026
x402 over MCP, specs/transports-v2/mcp.mdsame commit
Reference packagesnpm @x402/xrpl 2.28.0 and @x402/mcp 2.28.0
MCPSpecification 2026-07-28; clients on 2025-11-25 are also served
XRPL network idsCAIP-2 xrpl:{NetworkID}

What is implemented

ItemStatus in the specOpenWallet
x402 v2 HTTP transportNormativeClient and merchant
x402 v1Normative, but the XRPL scheme is v2 onlyRefused with x402_v1_unsupported; X-PAYMENT-RESPONSE read as a fallback
exact on XRPL: XRP and issued tokensMergedAll of it: both asset kinds, invoiceId, destinationTag, issuer, both transfer methods (tickets behind a grant switch), authorization and upfront
Facilitator API /verify, /settle, /supportedNormativeThe merchant library calls them, or verifies and submits by itself
x402 over MCPNormativeAs a client (paying a paid tool) and in the merchant library (building one)
payment-identifier extensionNormativeClient and merchant
bazaar extensionNormativeEchoed unchanged
sign-in-with-x and EVM-only extensionsNo XRPL definitionEchoed unchanged, never acted on
upto, batch settlement on XRPLNot standardisedNot shipped; refused with unsupported_scheme
A2A transportNormativeNot supported

What OpenWallet signs is strict: it always adds payload.invoiceId beside signedTxBlob, adds SourceTag only when a 402 asks with extra.sourceTag, never adds Memos, accepts an entry where areFeesSponsored is absent (XRPL cannot sponsor fees) and refuses one where it is true. This exact shape passed /verify and settled on both x402.org and t54 on Testnet on 30 September 2026.

Interop matrix

The interop tests run this matrix on Testnet. "Expected to fail" cells assert the documented failure, so a change in either facilitator shows up.

Payer ↓ · Merchant →x402-xrpl, selfx402-xrpl + x402.orgx402-xrpl + t54@x402 reference + x402.orgt54 SDK merchant
openwallet-agentpasses: XRP, RLUSD, sequence, ticketspassespasses (sourceTag)passespasses
@x402/xrpl clientpassespassesexpected to failpassesexpected to fail
t54 x402-xrpl payerexpected to fail (Memos)expected to failpassesexpected to failpasses

Known facilitator differences

  • t54 needs payload.invoiceId and a SourceTag, omits areFeesSponsored in its 402s, and accepts Memos.
  • x402.org is Testnet only for XRPL and ignores payload.invoiceId.
  • Duplicate settlement: both returned success: true twice for one blob in a single Testnet test. Merchants should keep their own atomic gate on the hash and the invoice, as the library does.
  • xrpl.org's "Agentic Payments with x402" page describes the client as submitting the transaction and using X-PAYMENT. In v2 the client signs without submitting and sends PAYMENT-SIGNATURE. Build from the spec.

Where the evidence is thin

  • t54's Mainnet behaviour (fee cap, expiry bound, how long it deduplicates). Only its Testnet facilitator was probed.
  • Whether the facilitators' duplicate-settlement behaviour is consistent: it rests on one sample each.