Reference
Payment scheme
The rules a Solana exact payment must meet to be accepted. Useful when a payment is rejected or when you write your own client.
Instruction layout
| Index | Program | Instruction |
|---|---|---|
| 0 | Compute Budget | SetComputeUnitLimit (the reference client uses 20,000) |
| 1 | Compute Budget | SetComputeUnitPrice (the reference client uses 1 micro-lamport) |
| 2 | SPL Token or Token-2022 | TransferChecked(amount, decimals) |
| 3+ | Memo or Lighthouse | Optional, at most three more; the reference client always adds one memo |
Three to six instructions in total. Lighthouse is the assertion program some wallets insert to protect users; facilitators tolerate it. Any other program in the list makes the payment invalid.
What the facilitator checks
- The fee payer is one of the facilitator’s own addresses, and that address is not the transfer authority.
- The compute unit price is under the facilitator’s cap, since it pays it: 5,000,000 micro-lamports by default in the reference facilitator, 25,000 on Axonpay’s, which also caps compute units at 200,000 and signatures at 3.
- The mint equals the offer’s
asset. - The destination equals the ATA of
payTofor that mint and token program. - The amount equals the offer’s
amountexactly. Overpaying is rejected too. - If the offer set
extra.memo, exactly one memo with that text is present. - The transaction simulates successfully, which also proves the payer has the balance.
Axonpay’s facilitator applies its own policy before these checks (listed payTo, minimum amount, rate limits, daily cap) and refuses with axon_* codes; see Axonpay facilitator. It doesn’t enable the simulation path for smart wallets, so payments from Squads or Swig accounts aren’t accepted yet.
Settlement
On settle, the facilitator signs as fee payer, submits, waits for confirmation and returns the signature. A built-in settlement cache rejects a second settle of the same transaction for 120 seconds (about twice the blockhash lifetime), which closes the race where one payment could be presented to two requests before it confirmed.
Error codes
| invalidReason | Meaning |
|---|---|
| invalid_exact_svm_payload_transaction_instructions_length | Fewer than 3 or more than 6 instructions |
| invalid_exact_svm_payload_no_transfer_instruction | Index 2 is not a TransferChecked |
| invalid_exact_svm_payload_mint_mismatch | Wrong token |
| invalid_exact_svm_payload_recipient_mismatch | Destination is not payTo's ATA |
| invalid_exact_svm_payload_amount_mismatch | Amount differs from the offer |
| invalid_exact_svm_payload_transaction_fee_payer_transferring_funds | The facilitator's key would move funds |
| …_compute_price_instruction_too_high | Priority fee above the facilitator's cap |
| transaction_simulation_failed | Usually no balance, or payTo has no token account |