Networks
All networks use the same Net payment envelopes. Enabling another network may require asset-registry entries, facilitator configuration, conformance fixtures, and implementation in the relevant x402 scheme module. Net core does not add a new envelope type for each chain.
CAIP identifiers and the asset registry
Networks and assets are named with CAIP-2 (chain, e.g. eip155:8453) and
CAIP-19 (asset) identifiers. IDs compare exactly and case-sensitively —
eip155:8453/erc20:0xABC and …0xabc are distinct ids; equivalence is
registry policy, never string normalization.
The asset registry is a signed document (net.payment.asset_registry@1)
mapping registry entries (symbol, decimals, CAIP id) that both provider and
caller reference by hash. A capability's price references the registry it was
authored under, so a caller can confirm they're pricing the same asset the
provider meant. An asset absent from the registry is a hard reject, not a
guess.
Enablement is a ladder, and each rung has its own state
Enablement is deliberate and per-rung. Do not read the ladder as "all shipped." As of this writing:
| Rung | State |
|---|---|
Mock (mock:net) | Active. The conformance backbone; no real value. |
Base Sepolia (eip155:84532) | Suite shipped; the live testnet run is env-gated, not on by default. |
| Base mainnet / Solana | Scheme seams and independent chain checkers landed (SvmChecker for Solana); the packs serve confirmed(1), not receipt-trust. Still enablement-gated per deployment — needs allowed_networks, a signer, facilitator credentials, and a live conformance run. |
XRPL (xrpl:0) | Built (XRP-only), enablement-gated — on par with the other real rungs now, not a "not-shipped-active" outlier. A t54_xrpl_mainnet pack serving confirmed(1), an independent XrplChecker, an XRP registry entry (xrpl:0/slip44:144, Mode A; RLUSD deferred), and fixture conformance all exist. Enable it like any rung (allowed_networks + signer + pack + live run). The xrpl:0 CAIP-2 id is a pinned-doc convention, unratified upstream. |
Enabling a real network for a deployment means: list it in the spend policy's
allowed_networks, wire a facilitator config pack, provide an
ExternalSigner, and — to serve above observed —
have a chain checker for it. The registry is the asset allowlist; it is not the
enablement switch.
Config packs
A pack is a pre-filled FacilitatorConfig for a known facilitator — endpoint,
the (scheme, network) pairs it offers, chain RPC endpoints for the independent
checker, and the tier to require before serving:
use net_payments::facilitator::packs;
let sepolia = packs::x402_org_base_sepolia(); // no credentials needed
let base = packs::cdp_base_mainnet("secret://cdp"); // secret *ref*, not a key
let solana = packs::cdp_solana_mainnet("secret://cdp");
let xrpl = packs::t54_xrpl_mainnet();Credentials are passed as references the deployment resolves, never as literals in config — the same reason the signer seam takes a callback rather than a key.
Two fields on the config are worth setting deliberately rather than inheriting.
required_tier is per CAIP-2 network and defaults to observed, which is
receipt-trust; if you want depth, say so. And rpc_endpoints is what the
independent checker queries — without one, nothing can promote a payment above
observed no matter what the facilitator reports.
Mock is the conformance backbone
Every example in this section, and the compiled
docs_payments.rs,
runs against MockFacilitator and default_mock_registry. That's deliberate:
the mock rung exercises the identical lifecycle with no real value at stake, so
a demo can't quietly train the policy path wrong. Under
SpendProfile::Production, even a mock spend needs an approval.
Why config-not-code matters
A new payment scheme (EVM exact, SVM exact, XRPL exact) is real
code — but it lives quarantined in the x402 scheme modules, the one place
chain-specific reality is allowed. Net core never grows a per-network branch. So
"support chain X" is a pack + registry entries + a conformance run, and the
commercial-fact envelopes are unchanged.