NoHoldPay
Blockchains

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

NetworkChain keyFinalityMin invoice
SolanaSOLfinalized commitment$0.50
Solana Devnet (testnet)SOL_DEVNETfinalized 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

ChainCoins
SOLSOL (native), USDC, USDT
SOL_DEVNETSOL (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.

In NoHoldPay, go to Wallets -> Add wallet and pick SOL or SOL_DEVNET.
Paste the address.
Solana wallets use the PDA forwarder - each payment gets its own address.
Save, then complete the on-screen onboarding in your wallet.

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:

Attest - the platform calls register_merchant on-chain. No cost to you.
Register Treasury - Prepare - the dashboard fetches the digest to sign.

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:

  1. They click the pay button in the checkout - labelled like Pay 25.00 USDC (no SOL needed).
  2. Their wallet shows the transfer for signing - no fee field, no SOL required.
  3. They sign. The relay broadcasts.
  4. 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)


Common errors

CodeWhen
SOLANA_INVALID_CUSTOMER_PUBKEYCustomer pubkey malformed (not a base58 32-byte key)
SOLANA_INVALID_TREASURYTreasury pubkey malformed
SOLANA_INVALID_SIGNATUREed25519 signature didn't verify
SOLANA_GASLESS_NOT_ELIGIBLEPayment in wrong status or wallet doesn't have gasless enabled
SOLANA_GASLESS_NOT_ELIGIBLE_FOR_PDA_FORWARDERDirect settlement is off for this chain, so gasless has no treasury to settle into
SOLANA_GASLESS_UNECONOMICPriority fee above ceiling (temporary)
SOLANA_ATTEST_CONTROLKEY_MISMATCHOn-chain control key disagrees with dashboard - use the Use this account instead action
SOLANA_MERCHANT_NOT_REGISTEREDYou must complete Attest before submitting Register Treasury
INFLIGHT_CAP_EXCEEDEDPer-merchant CREATE2 in-flight USD cap exceeded - contact support

See also

On this page