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.

On this page+

Instruction layout

IndexProgramInstruction
0Compute BudgetSetComputeUnitLimit (the reference client uses 20,000)
1Compute BudgetSetComputeUnitPrice (the reference client uses 1 micro-lamport)
2SPL Token or Token-2022TransferChecked(amount, decimals)
3+Memo or LighthouseOptional, 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 payTo for that mint and token program.
  • The amount equals the offer’s amount exactly. 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

invalidReasonMeaning
invalid_exact_svm_payload_transaction_instructions_lengthFewer than 3 or more than 6 instructions
invalid_exact_svm_payload_no_transfer_instructionIndex 2 is not a TransferChecked
invalid_exact_svm_payload_mint_mismatchWrong token
invalid_exact_svm_payload_recipient_mismatchDestination is not payTo's ATA
invalid_exact_svm_payload_amount_mismatchAmount differs from the offer
invalid_exact_svm_payload_transaction_fee_payer_transferring_fundsThe facilitator's key would move funds
…_compute_price_instruction_too_highPriority fee above the facilitator's cap
transaction_simulation_failedUsually no balance, or payTo has no token account