Testing
Testing
You integrate against Base Sepolia, a public testnet, using tokens that carry no real value. Everything works exactly as it will in production — the only difference is the network and the keys.
Testnet vs mainnet
RSends mirrors the classic test/live split onto chains. Your rsend_test_ key drives the router on Base Sepolia; a rsend_live_ key drives mainnet once it is enabled for your jurisdiction.
| Sandbox (test) | Production (live) | |
|---|---|---|
| API key | rsend_test_… | rsend_live_… |
| Network | Base Sepolia (84532), Avalanche Fuji (43113), TRON Nile | Base (8453), Avalanche C-Chain (43114), TRON — per jurisdiction |
| Token value | None — faucet test tokens | Real funds |
| Tokens | Test USDC and native ETH | Enabled at rollout |
| Router | Deployed — routerVersion 1 (charges an on-chain flat fee) | Not deployed yet — fee-less routerVersion 2 |
Fund a test wallet
Instead of a test card number, you fund a real wallet with free testnet tokens, then pay yourself end-to-end. You need two things:
- Test USDC to pay with — mint it at faucet.circle.com (select Base Sepolia).
- A little Base Sepolia ETH for gas — grab it from the Base network faucets.
Two enabled tokens on Base Sepolia
USDC and native ETH are the payable tokens on the sandbox — USDC is what you'll want for a realistic run. Anything else (EURC, USDT, DAI …) is not enabled on this chain and creating an intent with it returns 400 UNSUPPORTED_TOKEN.USDC 6 decimals 0x036CbD53842c5426634e7929541eC2318f3dCF7e
faucet: https://faucet.circle.com
ETH 18 decimals native (token address 0x0000…0000)
faucet: https://docs.base.org/tools/network-faucetsA full test run
| Step | Action |
|---|---|
| 1 | Fund a wallet with test USDC + Base Sepolia ETH (above). |
| 2 | Create a payment intent with your rsend_test_ key — see Payment intents. |
| 3 | Open https://demo.rsends.io/pay/{intent_id}, connect the funded wallet, and pay. Note the payer is asked for onchain.total, which on this router is the amount plus a small flat fee. |
| 4 | Confirm you receive a payment.completed webhook and that the funds landed in your destination wallet. |
| 5 | Verify the PaymentMade event on sepolia.basescan.org. |
The Quickstart has this same run with copyable calls.
Going live
Mainnet is not deployed yet — the production router has not been published, so there is no live environment to point at today. When it opens, moving over means swapping three things: the API key (rsend_test_ → rsend_live_), the chain (base_sepolia → base), and the webhook signing secret (register a webhook in the live environment; test and live deliveries never cross).
One behavioural difference to code for now
onchain.fee becomes "0", total equals amount, maxFee becomes null, and the call carries no fee argument. If you read onchain.routerVersion and use the values the API hands you rather than assuming, your integration needs no change at cutover. Live access also rolls out per jurisdiction — until your live key is enabled, the sandbox flow is the complete, representative integration.