Robinhood Chain (an Arbitrum Orbit L2, chain id 4663) reached mainnet on 2026-07-01, and its canonical stablecoin is USDG (Global Dollar) — not Circle USDC. Agent402 settled a real x402 payment in USDG on the chain's second day of mainnet, and this guide documents everything that took: the chain parameters, the buyer flow, the seller config, and how to recognize an x402 settlement on a block explorer.
| Chain id | 4663 (CAIP-2: eip155:4663) |
| RPC | https://rpc.mainnet.chain.robinhood.com |
| Explorer | https://robinhoodchain.blockscout.com |
| Stablecoin | USDG (Global Dollar) — 0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168, 6 decimals |
| EIP-712 domain | name "Global Dollar", version "1" |
Nothing about the protocol changes: the buyer hits a paid endpoint, gets an
HTTP 402 whose accepts includes an eip155:4663 option carrying the
USDG contract address and its EIP-712 domain, signs an EIP-3009
transferWithAuthorization with its own key, and retries. A facilitator
submits the transfer on-chain and pays the gas — the buyer needs only USDG,
no ETH, no bridge, no account.
The standard x402 EVM client signs USDG as-is (asset + domain come from the
402's accepts entry). One subtlety: a multi-chain seller offers several
networks, and the default client may pick another chain — filter the accepts
to eip155:4663 to force USDG settlement:
import { x402Client, x402HTTPClient } from "@x402/core/client";
import { registerExactEvmScheme } from "@x402/evm/exact/client";
import { privateKeyToAccount } from "viem/accounts";
const client = new x402Client();
registerExactEvmScheme(client, { signer: privateKeyToAccount(process.env.AGENT_KEY) });
const http = new x402HTTPClient(client);
const url = "https://agent402.tools/api/hash";
const init = { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ text: "hello" }) };
const challenge = await fetch(url, init); // → 402
const required = http.getPaymentRequiredResponse((n) => challenge.headers.get(n), await challenge.json().catch(() => undefined));
const robinhood = required.accepts.filter((a) => a.network === "eip155:4663");
const payload = await client.createPaymentPayload({ ...required, accepts: robinhood });
const res = await fetch(url, { ...init, headers: { ...init.headers, ...http.encodePaymentSignatureHeader(payload) } });
// 200 — and the PAYMENT-RESPONSE header carries the on-chain tx hash
The open-source server ships the rail; enabling it is config:
PAYMENT_NETWORKS=base,solana,polygon,arbitrum,robinhood \
ROBINHOOD_FACILITATOR_URL=<an x402 facilitator that settles eip155:4663> \
WALLET_ADDRESS=0xYourRevenueWallet npm start
Every paid route's 402 now offers USDG on Robinhood Chain alongside USDC on the other chains. If the facilitator URL is unset, the server degrades gracefully — the robinhood option is simply omitted; every other rail keeps serving.
On-chain there is no "402" label — the tell is the shape of the transaction:
transferWithAuthorization (EIP-3009, selector
0xe3ee160e) on the USDG contract — not a plain transfer.from = the buyer's wallet, to = the
seller's revenue wallet, value = the quoted price.A real example — the settlement that verified this guide:
0xae8e3e40…f826.
Agent402's keyless chain tools speak Robinhood Chain too — tx-status and
gas-estimate accept network=robinhood against the public RPC, so an
agent can verify its own settlement for $0.001 without an RPC key.