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
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"
}
}
}
}PAYMENT-RESPONSE · decoded
{
"success": true,
"transaction": "0x4b6c…e21f",
"network": "eip155:99801",
"payer": "0xB572b1950336e3c0b73B3E289929ceD2E4fda2b8"
}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.
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
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.
| Transaction | Payer | Paid to | Amount | Status | When |
|---|---|---|---|---|---|
| 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.
- 01
EPP-402 commerce layer
off-chain · signed objectsCoordinates 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
- 02
x402 payment layer
HTTP · official v2 wire formatRequests, communicates, verifies and settles a payment over HTTP.
- HTTP 402 negotiation
- Payment requirements
- Payment payloads
- Payment schemes (exact)
- Payment verification
- Settlement interfaces
- Settlement responses
- 03
Elysium settlement layer
on-chain · EVMMoves the money and makes it verifiable.
- EVM-compatible execution
- Supported payment assets
- Wallet signatures
- Smart contracts where required
- Transaction monitoring
- On-chain verification
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.
01Publish a discovery document
Serve /.well-known/epp402.json: your services, prices, assets, facilitators and the key your quotes and receipts are signed with.
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.
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.
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());One registry, eight kinds of service.
Providers publish their own discovery documents; the registry indexes them by category so an agent can find a price without a sales call. Counts are live from the index.
- 0
AI inference
Model calls priced per request or per token.
0 services listed
- 0
Market data
Prices, books and histories sold per query.
0 services listed
- 0
Compute
GPU and CPU work metered by the second.
0 services listed
- 0
Storage
Bytes kept and served, per unit.
0 services listed
- 0
APIs and developer services
Any endpoint that was behind a key.
0 services listed
- 0
Data processing
Transforms, extractions and pipelines.
0 services listed
- 0
Agent services
Agents that sell their own work to other agents.
0 services listed
- 0
Other
Everything with a price and an endpoint.
0 services listed
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
The details.
How quotes, sessions, settlement and receipts work, and what this release does and does not claim.
What is a quote?
What is a commerce session?
What does the facilitator hold?
Which asset do payments use?
transferWithAuthorization. The asset has no value and a public faucet. Production assets are configured per network, never assumed.Is this on mainnet?
How is a receipt verified?
Which x402 clients work?
What is EPP-402 not?
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.
$ 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
}