checkout402_
Reference

Networks & fees#

The fee#

0.5% per payment, with a $0.005 floor. No monthly fee, no per-seat cost, no minimum.

Seller price Fee Buyer pays Seller receives
$0.01 $0.005 (floor) $0.015 $0.01
$0.10 $0.005 (floor) $0.105 $0.10
$1.00 $0.005 (floor) $1.005 $1.00
$10.00 $0.05 $10.05 $10.00
$100.00 $0.50 $100.50 $100.00

The floor binds below $1 — 0.5% of $1.00 is $0.005 exactly, so that's the crossover.

It's visible in every 402 before anyone pays:

"extra": { "providerAmount": "100000", "feeAmount": "5000" }

Atomic USDC, 6 decimals, as strings.

The seller always receives the number they set

The fee is added on top, not deducted. Set $0.10 and $0.10 lands in your wallet.


Rails#

One checkout can advertise several networks at the same dollar price. The buyer picks.

Network CAIP-2 Asset Status
Base mainnet eip155:8453 USDC Launch rail — proven end to end
Base Sepolia eip155:84532 test USDC Testing
Solana mainnet solana:5eykt4Us… SPL USDC Wired; not yet proven on a validator
Stellar stellar:pubnet USDC Dormant

Testnets are hidden unless EXPOSE_TESTNET is on. Solana is hidden unless EXPOSE_SOLANA is on and its config is complete — a half-wired rail is never advertised.


How the split happens#

Base (EVM) — a splitter contract#

payTo is an immutable splitter, not the seller. The buyer signs one EIP-3009 ReceiveWithAuthorization for the total; the contract divides it in the same transaction.

0x234fE2A1D1df93fD9B907F0e1ad0c8b94E81FB5c   splitter (Base mainnet)
0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913   USDC (Base mainnet)

The USDC address and fee recipient are baked into the contract at deploy time and cannot be changed — not by us, not by anyone.

The buyer needs no ETH: a relayer submits the transaction and pays gas.

Solana (SVM) — no contract at all#

Program-less. payTo names the seller, and the split is two transfer_checked instructions inside the buyer's own transaction — one to the seller's ATA, one to the fee recipient's.

The relayer co-signs as fee payer, so the buyer needs no SOL.

Verification differs accordingly

On Base we trust an immutable contract to divide correctly. On Solana there's nothing to trust, so verification decodes the buyer's transaction and checks both transfer destinations and amounts against the 402. Neither path takes the client's word for the split.


Decimals and rounding#

USDC is 6 decimals everywhere we settle. Amounts cross the wire as atomic integer strings"105000", not 0.105 — because a float can't hold money and JavaScript rounds silently.

Sub-cent amounts are real. The $0.005 floor is half a cent, and it's never rounded up to $0.01.


Settlement timing#

Base A few seconds — one transaction, confirmed before goods release
Solana Sub-second to a couple of seconds

Goods are released only after settlement confirms. That ordering isn't configurable.


Test mode#

test_mode settles without touching a chain: synthetic 0xtest_… hash, test_mode: true on the payment and receipt, no explorer link.

A c402_live_ key cannot create a test-mode checkout, and a c402_test_ key cannot move real money. The two modes can't be crossed by accident.