Guide

How to verify a Solana payment

After you send SOL from a wallet or scan a Solana Pay QR, you get a transaction signature — an 87-character base58 string. Paste it below to confirm the payment landed on mainnet: status, amount, sender, and receiver.

Look up your transaction

Paste a transaction signature above.

Full-screen tool: transaction lookup. Format check only (no RPC): signature validator.

Where to find the signature

Signatures are public — sharing one does not expose your private key. Anyone can look up the same transaction on mainnet.

What to check

  1. Status — should say confirmed / success. A failed tx means no SOL moved.
  2. Amount — match the SOL you intended (minus network fee, which is separate).
  3. Receiver — confirm the destination address is who you meant to pay.
  4. Time — block time should be recent if you just sent.

Mainnet confirmations are usually under a second, but RPC nodes can lag a few seconds. If lookup says "not found", wait and retry. For a deeper breakdown of timing and commitment levels, see our Solana confirmation times guide.

Processed, confirmed, and finalized

Solana exposes three useful commitment levels when you ask an RPC node about a transaction. They answer different questions — and merchants should not treat them as interchangeable.

Browser tools (including the lookup above) typically query at confirmed. A game or shop may wait an extra second or two before unlocking content even though your wallet already shows success — that is conservative verification, not a bug. If you are building a flow yourself, pick one commitment level and document it for users.

How merchants verify payments on-chain

A wallet saying "confirmed" is not proof for a server. Anyone can fake UI text in a browser; the only trustworthy source is an RPC call your backend makes (or a webhook provider you audit). The usual server-side checklist:

  1. Fetch the transaction — call getTransaction (or getSignatureStatuses for a lighter check) at your chosen commitment level.
  2. Confirm successmeta.err must be null. A signature that exists but failed moved no SOL.
  3. Match amount — parse lamport transfers to your treasury address. Never trust the amount the client claims; read it from chain data.
  4. Match sender or memo — if you issued an order ID, confirm the memo or reference field matches (see below).
  5. Check freshness — reject transactions older than your order expiry window so someone cannot replay an old payment.

Two common integration styles:

Garden's multi-chain shop uses server-side verification with unique expected amounts per order so two buyers paying the same nominal price do not collide. For RPC endpoint choice, failover, and health checks, see Solana RPC endpoints.

Idempotency: verify once, credit once

Users double-click. Networks retry. Mobile wallets resubmit. Your verify endpoint must be idempotent: calling it twice with the same transaction signature should not deliver the product twice or double-count a deposit.

Store processed signatures in a database keyed by signature (or by order ID once paid). On repeat verify:

Idempotency protects buyers too: tapping "verify" again after a slow RPC should not create a duplicate charge or a second mint. Settlement systems for provably fair games apply the same rule — one on-chain bet, one payout attempt.

Memos, references, and unique amounts

When many customers pay the same treasury address, you need a way to tell which payment belongs to which cart. Common patterns:

Always confirm you are on mainnet before matching — a devnet signature looks identical but paid fake SOL. Our devnet vs mainnet guide covers how to spot the wrong cluster in explorers and RPC URLs.

Transaction failed or not found?

A failed status means no SOL moved. Common causes: cancelled in wallet, wrong network (devnet vs mainnet), or insufficient spendable SOL when your total balance looks fine — rent can be locked in empty token accounts.

After paying Garden Dice

Paid via Solana Pay or wallet on a challenge page? Copy the signature, verify it here, then return to the dice page and tap I've paid — detect & roll (or paste the sig in the fallback field).

Related guides & tools