// production
Going Live
Splintr ships fully in test mode out of the box. To accept real money you need three things: a settlement destination, hot-wallet keys for the chains you want to sweep, and paid RPC endpoints. This page walks through each one.
1. Required secrets
Add these in Backend → Secrets. Names are exact and case-sensitive.
| SECRET | Where it comes from | Notes |
|---|---|---|
| PLATFORM_EVM_PRIVATE_KEY | Hot wallet you generate offline | 0x-prefixed 32-byte hex. Funds USDC sweeps on EVM chains. |
| PLATFORM_SOLANA_PRIVATE_KEY | `solana-keygen new` output, base58 encoded | Funds SPL USDC sweeps on Solana mainnet. |
| EVM_RPC_BASE | Alchemy / Ankr / QuickNode | HTTPS URL for Base mainnet. Sibling vars: EVM_RPC_ETHEREUM, EVM_RPC_ARBITRUM, EVM_RPC_OPTIMISM, EVM_RPC_POLYGON — set the ones you accept. |
| SOL_RPC_URL | Helius / Triton / QuickNode | HTTPS URL for Solana mainnet. SOLANA_RPC_URL is also accepted. |
| LIFI_API_KEY | li.fi dashboard | Already set. Required for cross-chain routing. |
| CIRCLE_API_KEY | console.circle.com/api-keys | Bearer token used verbatim as `Authorization: Bearer <key>`. Sandbox keys start with `TEST_API_KEY:`, mainnet with `LIVE_API_KEY:` — Splintr picks the base URL from the prefix automatically. |
| CIRCLE_ENVIRONMENT | You (optional override) | `sandbox` or `live`. Only set if you want to force a base URL regardless of key prefix. |
| PAYOUT_ALLOWED_CHAINS | You (optional kill-switch) | Comma-separated list, e.g. `base,arbitrum,solana`. Unset = allow every supported chain (ethereum, base, arbitrum, optimism, polygon, bnb, avalanche, robinhood, solana). Change without redeploy to pause a chain. |
2. Hot wallets
Generate keys offline. Never paste an existing personal wallet's key.
EVM
# Generate a fresh key
openssl rand -hex 32 | awk '{print "0x"$1}'
# Fund the resulting address on each chain you accept:
# - Base: ~$50 USDC + $5 ETH for gas
# - Arbitrum: ~$50 USDC + $5 ETH for gas
# Then paste the 0x... key as PLATFORM_EVM_PRIVATE_KEY.Solana
# Generate offline (keep the JSON file safe)
solana-keygen new --outfile splintr-hot.json
# Convert byte array to base58 for storage
python -c "import json,base58,sys; print(base58.b58encode(bytes(json.load(open('splintr-hot.json')))).decode())"
# Fund with ~$50 USDC (SPL) + 0.05 SOL for fees.
# Paste the base58 string as PLATFORM_SOLANA_PRIVATE_KEY.3. RPC providers
Public RPCs will rate-limit you within an hour of first live traffic. Use paid endpoints.
- Alchemy — Base + Arbitrum. Create separate apps per chain.
- Helius — Solana. The free tier is fine for early volume.
4. Payout rails
Merchants pick a rail in Dashboard → Settings. Options:
- self_custody — Splintr broadcasts USDC transfers from your hot wallets directly to the merchant address.
- circle — Splintr creates a Circle payout and reconciles via webhook. Requires Circle secrets above.
- mock — Test-mode only. No on-chain broadcast.
5. Alert sinks
Configure destinations in Dashboard → Alerts. Splintr will page you when webhook delivery, payouts, or intent expiry breach the thresholds you set.
6. Live smoke test
Once secrets are in place, run one real $0.50 payment end-to-end from CI or a laptop:
SPLINTR_LIVE_SMOKE=1 \
SPLINTR_BASE_URL=https://splintr.cash \
SPLINTR_SECRET_KEY=sk_live_... \
MERCHANT_WALLET=0xYourMerchantWallet \
node scripts/smoke-payout-live.mjsThe script creates a $0.50 live intent, prints the checkout URL, polls until settled, waits for the payout row, and asserts an on-chain tx hash. Any failure exits non-zero.
Also available as a manual GitHub Action (payout-live-smoke workflow) — never runs on push.
This live workflow requires GitHub environment secrets named exactly SPLINTR_LIVE_SECRET_KEY and SPLINTR_LIVE_MERCHANT_WALLET on the production environment. Staging secrets are only used by the staging smoke suite.
7. Dashboard go-live checklist
Your dashboard home shows a live readiness checklist for this merchant: settlement destination set, a live API key issued, an enabled webhook endpoint, at least one settled live payment, and at least one successful payout. Every item must be green before you route real customer volume.
Payout failures are shown in plain language on the Payouts page — the most common one is an unfunded platform hot wallet on the settlement chain. Fund it, then retry the payout from the same row.