Editorial

Research guide · x402 · Solana exact-SVM · 13 September 2026

x402 Solana payment rejected: debug exact-SVM compute-limit errors

A valid-looking Solana payment can still be refused by the facilitator that is sponsoring its fee. That distinction is now important in x402 exact-SVM: the current specification separates the required payment outcome from sponsor acceptance policy, while an open CDP-hosted-facilitator report documents a narrower observed compute-limit window and a confusing SPL Token rejection on the no-limit path.

Published 13 September 2026 · sources checked 13 September 2026

400k CU

Current x402 reference sponsor default

100k CU

Reported hosted-facilitator rejection

~20k CU

Reported settlement in the same observed window

Policy ≠ validity

Sponsors may enforce stricter local rules

The key distinction

Protocol-valid does not mean every sponsor must sign it

The current x402 exact-SVM specification defines the payment in terms of outcome: the correct asset must reach the correct recipient for at least the required amount, with exactly one matching transfer. It separately defines sponsor controls for the account that signs as feePayer.

For compute budgets, the specification gives an operator-configurable reference default of 400,000 compute units and explicitly permits sponsors to introduce stricter limits. That means a hosted facilitator can reject a payment transaction even when the transaction would otherwise satisfy the exact payment outcome.

An open x402/CDP report says the hosted facilitator changed behavior between 23 and 26 August 2026: a 100,000-CU envelope that had settled earlier was rejected, while an approximately 20,000-CU variant settled. The same report says omitting the compute-limit instruction produced a smart_wallet_program_not_allowed rejection naming the SPL Token program. Treat that as current implementation evidence, not a new universal x402 constant.

Error map

Start from the facilitator's exact reason string

Observed errorWhat to inspect next
invalid_exact_svm_payload_transaction_instructions_compute_limit_instructionThe facilitator rejected the ComputeBudget limit instruction. Compare the value and instruction layout with the current sponsor policy rather than treating the error as proof the payment outcome is invalid.
smart_wallet_program_not_allowed: Tokenkeg...The reported no-limit path reached a program-policy rejection. Capture the full instruction list, current SDK version and facilitator revision before changing the token transfer itself.
transaction_simulation_failedThe envelope may be structurally accepted but lack enough compute or fail execution for another reason. Inspect simulation details before increasing limits blindly.

Diagnosis

Seven checks before changing your payment code

  1. 1. Preserve the original 402 challenge. Record the exact network, asset, payTo, feePayer, timeout and any memo/blockhash hints returned by the resource server.
  2. 2. Record the facilitator and SDK versions. A hosted deployment can differ from open-source main. Version the environment before comparing envelopes.
  3. 3. Decode the signed Solana transaction. List every top-level instruction in order, its program ID, the ComputeBudget values, transfer destination, memo and signer set.
  4. 4. Compare payment validity with sponsor policy separately. Check the exact payment outcome first, then the sponsor's compute, fee-payer, program and simulation constraints.
  5. 5. Do not hard-code the reported 20k value. It was an observed hosted-facilitator acceptance point, not a protocol requirement. Use the smallest compute budget your actual transaction needs and keep the setting configurable.
  6. 6. A/B one variable at a time. Hold the resource, challenge, wallet and transaction shape constant while varying only the compute limit. That separates a CU ceiling from unrelated blockhash, memo, signer or destination failures.
  7. 7. Re-test when the facilitator changes. Remove temporary compatibility bounds when the hosted policy or SDK fix lands. A transient deployment quirk should not become your permanent x402 contract.

What not to infer

Three tempting conclusions are too strong

“400k must work everywhere”

No. It is a reference sponsor default; stricter local policy is explicitly allowed.

“20k is the new x402 rule”

No. It is an observed acceptance point in an open hosted-facilitator report.

“Tokenkeg means SPL transfers are invalid”

No. The current exact-SVM specification explicitly permits SPL Token TransferChecked as a payment outcome.

Sources

Primary evidence

  • x402 exact-SVM specification — current payment-outcome rules, sponsor-policy separation, 400k reference compute default and policy flexibility.
  • x402 issue #3268 — public reproduction of exact-SVM compute-limit and no-limit rejection behavior.
  • CDP SDK issue #795 — hosted-facilitator report and evidence that observed behavior diverged from current open-source main.

Continue the implementation path