Solana
Accept SOL, USDC, and USDT on Solana mainnet and devnet. A unique forwarder address per payment, with optional gasless SPL checkout.
Solana is account-based. Paste a single base58 ed25519 public key - no xpub, no HD derivation.
Networks
| Network | Chain key | Finality | Min invoice |
|---|---|---|---|
| Solana | SOL | finalized commitment | $0.50 |
| Solana Devnet (testnet) | SOL_DEVNET | finalized commitment | $0.10 |
Solana uses commitment levels, not block depth. The platform detects your payment at confirmed commitment within seconds, then credits it (status confirmed) once the transaction reaches finalized commitment - roughly 15 to 30 seconds.
Supported coins
| Chain | Coins |
|---|---|
SOL | SOL (native), USDC, USDT |
SOL_DEVNET | SOL (native), USDC |
The payment QR code and Solana Pay URI carry the official mint address, so the paying wallet can verify the token before sending. Classic SPL Token is fully supported. Token-2022 mints are accepted only when they carry no extensions - extension-bearing Token-2022 tokens are rejected for payment safety.
Wallet setup
Paste a single base58 Solana public key (32-44 chars). This is the address your wallet displays as the receive address.
Do not paste a custodial exchange deposit address - those are shared across users.
Compatible wallets:
Open your Solana wallet and copy the receive address.
Screenshot
Backpack wallet showing the Solana receive address and copy control
add image at public/images/guides/solana-backpack-copy-address.png
SOL or SOL_DEVNET.PDA forwarder (unique address per payment)
Each invoice gets a unique forwarder PDA derived deterministically off-chain, so there is nothing to disambiguate and the customer pays the quoted amount exactly. The customer pays into the canonical ATA for that PDA. The platform sweeps to your treasury.
The wallet becomes payable only once the onboarding below is finished. Until then the chain stays out of the customer's picker.
Where your operator enables direct settlement, two legs bypass the forwarder and land straight in your treasury in one transaction, with no sweep. One is a connected-wallet payment, where the customer connects Backpack, Phantom, or Solflare and signs the transfer themselves. That leg is customer-funded (they pay the network fee and any destination-account rent), not gasless, and native SOL is eligible. The other is gasless, covered below. See Payment modes.
SPL tokens and native SOL both work. Token payments land in the forwarder's token account and native SOL lands at the forwarder address itself - the sweep handles both. Some exchange withdrawals may not honor PDA destinations - confirm with your customers if they pay from CEXes.
One-time onboarding:
register_merchant on-chain. No cost to you.Register Treasury - Submit - your wallet (Backpack/Phantom/Solflare) signs with your control key.
Finalise - after transaction confirms, the wallet is ready. The dashboard polls automatically.
Control-key rotation: if you connect a different wallet account in the dashboard later, the on-chain control key won't match. The dashboard surfaces an inline Use this account instead action that proposes the rotation. For security the change takes effect after a 48-hour window, during which it can be cancelled, and your treasury versions are untouched.
Sweep lifecycle
When a payment confirms, the platform batches an automatic sweep and the funds land in your treasury - usually within minutes. A failed sweep retries automatically.
If retries keep failing, the payment detail page shows a Manual recovery required card with a Sign recovery and broadcast button. Sign with your control key in Backpack/Phantom/Solflare and the forwarder PDA drains directly to your treasury.
Gasless SPL (sponsored fee-payer)
Customers pay USDC or USDT without holding SOL for fees. The platform relay signs the fee-payer slot of the transaction. The customer signs only the transfer.
The customer flow:
- They click the pay button in the checkout - labelled like Pay 25.00 USDC (no SOL needed).
- Their wallet shows the transfer for signing - no fee field, no SOL required.
- They sign. The relay broadcasts.
- Payment confirms in seconds.
Sponsored Fee banner is mandatory. No surveyed Solana wallet renders fee-payer attribution natively, so the checkout displays who's paying the network fee so the customer can see it.
SPL tokens only (USDC, USDT). Native SOL uses the standard flow, since a customer sending SOL already holds SOL.
Gasless settles to your treasury. The sponsored transfer goes straight to your registered treasury in one transaction, with no forwarder sweep. That means it needs direct settlement enabled for the chain by your operator. Where it is off, the checkout declines the gasless option with SOLANA_GASLESS_NOT_ELIGIBLE_FOR_PDA_FORWARDER and the customer uses the standard payment flow instead. Enable gasless per wallet with the Gasless payments toggle.
The signing window is short (~60-90 seconds), but the checkout fetches a fresh blockhash every time the customer clicks Pay, so an expired window just means clicking Pay again.
Testnet (SOL_DEVNET)
- RPC:
https://api.devnet.solana.com - SOL faucet (web): faucet.solana.com.
- SOL faucet (CLI):
solana airdrop 1 <YOUR_PUBKEY> --url devnet. - USDC faucet: Circle (pick
SOL_DEVNET). - Solana Devnet Explorer
Common errors
| Code | When |
|---|---|
SOLANA_INVALID_CUSTOMER_PUBKEY | Customer pubkey malformed (not a base58 32-byte key) |
SOLANA_INVALID_TREASURY | Treasury pubkey malformed |
SOLANA_INVALID_SIGNATURE | ed25519 signature didn't verify |
SOLANA_GASLESS_NOT_ELIGIBLE | Payment in wrong status or wallet doesn't have gasless enabled |
SOLANA_GASLESS_NOT_ELIGIBLE_FOR_PDA_FORWARDER | Direct settlement is off for this chain, so gasless has no treasury to settle into |
SOLANA_GASLESS_UNECONOMIC | Priority fee above ceiling (temporary) |
SOLANA_ATTEST_CONTROLKEY_MISMATCH | On-chain control key disagrees with dashboard - use the Use this account instead action |
SOLANA_MERCHANT_NOT_REGISTERED | You must complete Attest before submitting Register Treasury |
INFLIGHT_CAP_EXCEEDED | Per-merchant CREATE2 in-flight USD cap exceeded - contact support |
See also
- Choosing your wallets
- Payment modes - how the PDA forwarder compares with the other chain families, plus gasless and direct settlement
- Recovery Kit - re-derive PDAs offline
- Payment States
- Webhooks
- Trust Model