Skip to content

x402 machine payments on Elysium Testnet

Turn HTTP 402 into a settlement gate.

EPP-402 lets agents and services discover each other, agree a signed quote, pay over x402 with one signed header, settle on Elysium and hold a receipt that proves both the payment and the delivery.

  • Network

    Elysium Testnet · chain 99801

    Settles to HyperEVM

  • Standard

    x402 v2 · exact scheme

    PAYMENT-REQUIRED, -SIGNATURE, -RESPONSE

  • Settlement

    EIP-3009 · facilitator pays gas

    The payer signs, never broadcasts

  • Status

    Testnet · awaiting first settlement

    Nothing has settled yet

POST/v1/inference
402 Payment Required

PAYMENT-REQUIRED · decoded

{
  "x402Version": 2,
  "accepts": [
    {
      "scheme": "exact",
      "network": "eip155:99801",
      "asset": "0x…EPPUSD",
      "amount": "10000",
      "payTo": "0xb1297Fea0b54A79BdBCfb8b057e39B226Cc2ebFc",
      "maxTimeoutSeconds": 300
    }
  ],
  "extensions": {
    "epp402": {
      "info": {
        "version": "1.0.0",
        "providerId": "inference.example.com",
        "quoteId": "qt_01k9r3w6zj8e2n0h4yv7c5b9ma"
      }
    }
  }
}
POST/v1/inference
200 OK

PAYMENT-RESPONSE · decoded

{
  "success": true,
  "transaction": "0x4b6c…e21f",
  "network": "eip155:99801",
  "payer": "0xB572b1950336e3c0b73B3E289929ceD2E4fda2b8"
}
EPP-RECEIPTSigned by the provider

The gate

Six stages carry a request from discovery to a receipt.

Discovery, quote, session and intent happen before any money moves. Settlement is the one on-chain step. The receipt is what the buyer keeps. Each stage is a protocol object with a schema, and the four signed ones carry an EIP-712 signature bound to the chain.

lifecycle one paid requestPlaying

stage 01 · Discovery

A provider publishes what it sells, the assets it accepts, the facilitators it settles through and the key its quotes and receipts are signed with. The registry indexes the document; it is never required to buy.

DiscoveryDocument fields, from the schema

  • protocol
  • version
  • provider
  • network
  • networks
  • assets
  • x402
  • services
  • receipts
  • updatedAt
  • signature
Live network

What has settled on Elysium Testnet.

Indexed from the chain and the facilitator, refreshed every thirty seconds. Nothing here is simulated: when the count is zero, the count is zero.

Indexer connectedOpen the explorer
Confirmed settlements
0
None yet
Settled volume
0EPPUSD
Asset not deployed yet
Registered providers
0
0 have been paid
Commerce sessions
0
0 receipts issued
settlements latest 0
eip155:99801
TransactionPayerPaid toAmountStatusWhen
No settlements indexed yet. The first paid request through an EPP-402 provider will appear here.

Three layers

x402 is the payment. EPP-402 is the commerce around it. Elysium is where it settles.

EPP-402 does not replace x402; it uses the official v2 specification, packages and facilitator interface as its HTTP-native payment foundation and adds a structured commerce layer above it. A plain x402 client can pay an EPP-402 endpoint without learning a new handshake.

  1. 01

    EPP-402 commerce layer

    off-chain · signed objects

    Coordinates the economic interaction around a payment.

    • Service discovery
    • Provider metadata
    • Pricing and quotes
    • Commerce sessions
    • Payment intents
    • Spending policies
    • Transaction coordination
    • Receipt generation
    • Commerce history
  2. 02

    x402 payment layer

    HTTP · official v2 wire format

    Requests, communicates, verifies and settles a payment over HTTP.

    • HTTP 402 negotiation
    • Payment requirements
    • Payment payloads
    • Payment schemes (exact)
    • Payment verification
    • Settlement interfaces
    • Settlement responses
  3. 03

    Elysium settlement layer

    on-chain · EVM

    Moves the money and makes it verifiable.

    • EVM-compatible execution
    • Supported payment assets
    • Wallet signatures
    • Smart contracts where required
    • Transaction monitoring
    • On-chain verification
Developers

Your route stays. The gate goes in front of it.

Accepting a payment is one middleware. Paying is one wrapped fetch. The protocol handles the headers, the signatures and the settlement, and leaves you the handler.

  1. 01Publish a discovery document

    Serve /.well-known/epp402.json: your services, prices, assets, facilitators and the key your quotes and receipts are signed with.

  2. 02Guard a route with payment

    The middleware answers 402 with x402 v2 requirements, verifies the signed payment with the facilitator, settles on Elysium and issues a signed receipt.

  3. 03Pay from an agent

    The SDK discovers, quotes, opens a session, enforces the spending policy, signs one EIP-3009 authorization and verifies the receipt. No gas, no API key.

server.tsIllustrative
import { serve } from "@hono/node-server";
import { privateKeyToAccount } from "viem/accounts";
import { createProvider } from "@epp402/server";

const provider = createProvider({
  providerId: "inference.example.com",
  name: "Example Inference",
  url: "https://inference.example.com",
  network: "elysium-testnet",
  signer: privateKeyToAccount(process.env.PROVIDER_PRIVATE_KEY as `0x${string}`),
  facilitatorUrl: "https://epp402-core.fly.dev/facilitator",
  registryUrl: "https://epp402-core.fly.dev",
  services: [
    {
      id: "inference.standard",
      name: "Standard inference",
      category: "ai-inference",
      endpoint: "/v1/inference",
      method: "POST",
      price: "0.01", // list price in EPPUSD; the quote below prices each request
      quote: {
        price: (req) => 10_000n + 5n * BigInt(String((req.params as { text?: string }).text ?? "").length / 100),
      },
    },
  ],
});

// Discovery, quotes, receipts and the x402 gate are already mounted; add your handler.
const app = provider.app();
app.post("/v1/inference", async (c) => c.json(await infer(await c.req.json())));

serve({ fetch: app.fetch, port: 4031 }, () => provider.publish());
Compatibility

Built on the standard, settled on the chain.

EPP-402 does not invent an incompatible payment handshake, and it does not assume a stablecoin exists. Both halves below were verified against the official documentation and the live network.

x402 compatibility

Specification
Specification
x402 v2, the official specification and TypeScript packages
Headers
PAYMENT-REQUIRED, PAYMENT-SIGNATURE, PAYMENT-RESPONSE (never the legacy v1 headers)
Scheme
exact, EIP-3009 transferWithAuthorization: the payer signs, the facilitator broadcasts
Facilitator
GET /supported, POST /verify, POST /settle, plus GET /status/:tx
Extension
EPP-402 commerce references ride in extensions.epp402; the wire format is untouched
Interoperability
Any x402 v2 client that allows the asset can pay an EPP-402 endpoint

Elysium integration

Explorer
Network
Elysium Testnet, chain id 99801
Blocks
100 ms canonical blocks, about 300 ms perceived receipt
Gas
HYPE, bridged 1:1 from HyperEVM; the payer never needs any
Settles to
HyperEVM Testnet (chain 998)
Stack
Arbitrum Orbit (Nitro/ArbOS), operated with Conduit
Public RPC
https://testnet-rpc.elysium.kinetiq.xyz
Reference

The details.

How quotes, sessions, settlement and receipts work, and what this release does and does not claim.

What is a quote?
A signed, time-bound price for one service call. The provider signs the quote's amount, asset, recipient, parameters hash and expiry with its key, and the 402 that follows must price the resource at exactly that amount. Once accepted, the amount cannot move.
What is a commerce session?
The coordination object for one workflow: a spending limit, the quotes attached to it (from one provider or several), the authorizations, what settled and what was delivered. A session is off-chain state, not an atomic transaction, so a provider failing halfway leaves the session partially settled, with the record of what happened.
What does the facilitator hold?
Nothing. It verifies the payer's EIP-3009 authorization against the payment requirements, broadcasts it and pays the gas. The authorization itself names the recipient and the exact amount, so the facilitator cannot redirect or resize a payment.
Which asset do payments use?
On Elysium Testnet the protocol settles in EPP402TestUSD (EPPUSD), a six-decimal EIP-3009 test asset the project deploys, because the chain's bridged USDC has EIP-2612 but no transferWithAuthorization. The asset has no value and a public faucet. Production assets are configured per network, never assumed.
Is this on mainnet?
No. EPP-402 runs on Elysium Testnet (chain 99801). Mainnet (chain 99901) is pre-launch on the network side and is not deployed on ours; nothing on this site claims otherwise.
How is a receipt verified?
Two checks, both independent of the provider: recover the EIP-712 signature and compare it with the provider address in the discovery document, then read the transaction on Elysium and confirm a transfer of the receipt's amount from the payer to the recipient. The explorer does both for any receipt you paste.
Which x402 clients work?
Any x402 v2 client whose spend controls allow the asset: the EPP-402 asset is not in the SDK's default table, so a client allows it by address with a per-payment cap, as it would any custom token. The EPP-402 SDK does that for you and adds quotes, sessions, intents and receipt verification.
What is EPP-402 not?
Not a wallet, not a chain, not a token and not a checkout page. It is the protocol between a buyer that is software and a seller that is software: discovery, pricing, authorization, settlement and proof.

Start

Sell to software. Buy as software.

Publish a discovery document, put the gate in front of a route, and the first agent that reads it can pay you on Elysium testnet with one signed header.

terminalIllustrative response
$ curl https://inference.example.com/.well-known/epp402.json
{
  "protocol": "epp-402",
  "version": "1.0.0",
  "provider": {
    "id": "inference.example.com",
    "name": "Example Inference",
    "address": "0xb1297Fea0b54A79BdBCfb8b057e39B226Cc2ebFc",
    "url": "https://inference.example.com"
  },
  "network": "eip155:99801",
  "assets": [
    {
      "network": "eip155:99801",
      "address": "0x…",
      "symbol": "EPPUSD",
      "decimals": 6,
      "name": "EPP-402 Test USD",
      "version": "1",
      "transferMethod": "eip3009"
    }
  ],
  "x402": {
    "version": 2,
    "schemes": [
      "exact"
    ],
    "facilitators": [
      "https://epp402-core.fly.dev/facilitator"
    ]
  },
  "services": [
    {
      "id": "inference.standard",
      "name": "Standard inference",
      "category": "ai-inference",
      "endpoint": "/v1/inference",
      "method": "POST",
      "pricing": {
        "model": "per_request",
        "amount": "10000",
        "asset": "0x…"
      },
      "payment": {
        "protocol": "x402",
        "version": 2,
        "schemes": [
          "exact"
        ],
        "maxTimeoutSeconds": 300
      },
      "quote": {
        "endpoint": "/v1/quotes",
        "required": false
      }
    }
  ],
  "updatedAt": 1794100000
}