Accept USDG payments on Robinhood Chain over x402
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 parameters
| 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" |
How a payment works (same x402, different stablecoin)
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.
Buy something on Robinhood Chain (JavaScript)
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
Accept USDG as a seller (self-hosted Agent402)
The open-source server ships the rail; enabling it is config:
PAYMENT_NETWORKS=base,solana,polygon,arbitrum,stellar,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.
How to recognize an x402 settlement on Blockscout
On-chain there is no "402" label - the tell is the shape of the transaction:
- Method is
transferWithAuthorization(EIP-3009, selector0xe3ee160e) on the USDG contract - not a plaintransfer. - The tx sender is the facilitator's relayer, not the buyer - the buyer only signed; it paid no gas. "Sender ≠ the address whose USDG moved" is the gasless-settlement signature.
- The decoded transfer shows
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.
Reads, not just payments
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 a fraction of a cent without an RPC key.