Base USDC Facilitator
The Base USDC Facilitator handles verification and settlement for EVM scheme payments — USDC on Base via EIP-3009 TransferWithAuthorization. It is FluxA's production x402 settlement endpoint and is registered on x402scan.
Base URL
https://facilitator.fluxapay.xyz/Supported
| Aspect | Values |
|---|---|
| Schemes | exact |
| Networks (mainnet) | base (v1), eip155:8453 (v2) |
| Networks (testnet) | base-sepolia (v1), eip155:84532 (v2) |
| Assets | USDC (0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913 on Base; 0x036CbD53842c5426634e7929541eC2318f3dCF7e on Base Sepolia) |
x402Version | 1, 2 |
| Signature | EIP-712 TransferWithAuthorization (EIP-3009) |
Endpoints
| Method | Path | Description |
|---|---|---|
POST | /verify | Validate an EVM payment proof |
POST | /settle | Submit on-chain transferWithAuthorization and return the tx hash |
GET | /supported | Return the list of (x402Version, scheme, network, asset) tuples this facilitator accepts |
Verify
Validates an x402 payment payload without executing settlement.
Request
{
"paymentPayload": {
"x402Version": 2,
"scheme": "exact",
"network": "eip155:8453",
"payload": {
"signature": "0x...",
"authorization": {
"from": "0xPayerWallet...",
"to": "0xRecipientAddress...",
"value": "10000",
"validAfter": "1700000000",
"validBefore": "1700000060",
"nonce": "0x<32-byte-random-hex>"
}
}
},
"paymentRequirements": {
"scheme": "exact",
"network": "eip155:8453",
"maxAmountRequired": "10000",
"resource": "/api/data",
"payTo": "0xRecipientAddress...",
"asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
"maxTimeoutSeconds": 60,
"extra": { "name": "USD Coin", "version": "2" }
}
}Both x402Version: 1 (with network: "base") and x402Version: 2 (with network: "eip155:8453") request shapes are accepted; the rest of the payload is identical.
Validation Checks
schemeisexactandnetworkmatches a supported network.- EIP-712 signature recovers to
authorization.from. authorization.tomatchespaymentRequirements.payTo.authorization.valueis exactlypaymentRequirements.maxAmountRequired.- Current time is within
validAfter/validBefore. noncehas not been used (replay protection at the USDC contract level).- Payer's USDC balance covers
value. - The
extra.name/extra.versionmatch the on-chain USDC EIP-712 domain.
Response (success)
{
"isValid": true,
"payer": "0xPayerWallet...",
"network": "eip155:8453",
"currency": "USDC",
"amount": "10000"
}Response (failure)
{
"isValid": false,
"invalidReason": "invalid_signature"
}Settle
Submits the signed authorization on-chain and returns the transaction hash.
Request
Same shape as Verify.
Response (success)
{
"success": true,
"transaction": "0xabc123...",
"txHash": "0xabc123...",
"network": "eip155:8453",
"payer": "0xPayerWallet...",
"amount": "10000",
"currency": "USDC"
}The transaction hash returned here is what the upstream server includes in the X-Payment-Response header to the client.
Idempotency
If settle is called for an authorization whose nonce has already been consumed on-chain, the facilitator returns the original transaction hash instead of submitting a duplicate. Safe to retry.
Gas
The facilitator covers gas for the on-chain transferWithAuthorization call. Funds flow user → user (payer → payTo); FluxA never holds the USDC.
Supported
GET /supportedReturns the canonical list of (x402Version, scheme, network, asset) tuples accepted by this facilitator. Use it to discover compatibility from a client without hard-coding values.
Response
{
"kinds": [
{ "x402Version": 1, "scheme": "exact", "network": "base", "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913" },
{ "x402Version": 2, "scheme": "exact", "network": "eip155:8453", "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913" },
{ "x402Version": 1, "scheme": "exact", "network": "base-sepolia", "asset": "0x036CbD53842c5426634e7929541eC2318f3dCF7e" },
{ "x402Version": 2, "scheme": "exact", "network": "eip155:84532", "asset": "0x036CbD53842c5426634e7929541eC2318f3dCF7e" }
]
}Error Scenarios
| Error | Description |
|---|---|
invalid_signature | EIP-712 signature recovery does not match authorization.from |
invalid_recipient | authorization.to does not match paymentRequirements.payTo |
invalid_amount | authorization.value does not match maxAmountRequired |
invalid_validity_window | Current time outside validAfter / validBefore |
nonce_already_used | Nonce has already been settled on-chain |
insufficient_balance | Payer's USDC balance is below value |
unsupported_network | network is not in /supported |
unsupported_x402_version | x402Version is not 1 or 2 |
settlement_failed | On-chain transferWithAuthorization reverted |
