x402 on Arc
StockWaves accepts payment on Circle's Arc mainnet — with no facilitator.
On Arc, gas is USDC. So a buyer can broadcast its own EIP-3009 transferWithAuthorizationand pay the gas out of the same balance as the payment. Nobody needs to sponsor anything, and the server's job shrinks to one question: did this transaction pay this request?
Why this had to be built
x402's exactscheme settles through a facilitator that broadcasts the buyer's authorization and sponsors the gas. No facilitator does this on Arc — the one listed option is Circle Gateway, which assumes pre-deposited funds and a different contract interface. The chain itself was always ready: the USDC predeploy at 0x3600…0000 is a standard FiatTokenV2 with EIP-3009 live. Only the broadcaster was missing, and on Arc the buyer can be the broadcaster.
Live now
Every StockWaves endpoint priced at $0.03 or above offers an Arc option alongside Base and Solana. Cheaper endpoints deliberately do not — see the cost table below.
# See the Arc option in the live 402 challenge:
curl -si https://stockwaves.net/api/xstock/health?symbol=SPYx \
| grep -i '^payment-required:' | cut -d' ' -f2 | base64 -d | jq '.accepts[]'| Network | eip155:5042 (Arc mainnet) |
| Asset | 0x3600000000000000000000000000000000000000 — USDC, 6 decimals |
| Transfer method | eip3009-client-broadcast |
| Settlement | the buyer's own transaction; the server verifies the receipt |
Proof, on-chain
Two real mainnet payments, verifiable without trusting this page:
- 0xa33aa96f529bb9d8… — bought a live
/api/xstock/healthresponse ($0.03) - 0x8b7869c28f2e3027… — the reference server in the repo ($0.01)
Presenting either transaction a second time returns 402, not the data: the authorization is claimed before the handler runs, so a replay never reaches the service.
Pay it yourself
import { payOnArc, toPaymentHeader } from "x402-arc/client";
const payment = await payOnArc({ privateKey: KEY, requirements, chain: "mainnet" });
await fetch(url, { headers: { "PAYMENT-SIGNATURE": toPaymentHeader(payment, requirements) } });The server half has no runtime dependencies and registers beside existing rails — Base and Solana keep working exactly as before, because registration is per network.
npm install x402-arc
What it costs, honestly
Client-broadcast moves the gas onto the buyer. Measured on Arc mainnet: 0.00226 USDC per payment (112,519 gas). That is what makes a facilitator unnecessary — and what makes this the wrong rail for sub-cent pricing:
| Price | Gas as a share | Arc offered? |
|---|---|---|
| $0.003 | 75% | no |
| $0.03 | 7.5% | yes |
| $0.50 | 0.5% | yes |
| $1.50 | 0.15% | yes |
For true nanopayments on Arc, batching (Circle Gateway) is the right rail. This is for ordinary per-call pricing.
Status
This implements an open, unratified proposal (filed 2026-09-16, no maintainer decision yet). The receipt-verification core does not depend on that outcome; the wire format may. One correction was needed to make it usable: the proposal derives the EIP-3009 nonce deterministically from the payment requirements, and EIP-3009 nonces are single-use — so a buyer could pay for a given resource at a given price exactly once, ever. Freshness now comes from the buyer instead, which keeps repeat purchases working.
Source: github.com/kaditang/x402-arc (MIT) · Proposal: x402#3504 · Endpoints: stockwaves.net
Informational data only — not investment advice. See Terms & Disclaimer.