Skip to content
NEW Earn 30% affiliate commissions Get your link

Solana error codes list: custom program error 0x1, 0x1771

Solana error codes decoded: 0x1 is insufficient funds in System and SPL Token, 0x1771 is 6001 (Jupiter slippage). Hex tables for every core program, with fixes.

21 min read
Cover image for Solana error codes list: custom program error 0x1, 0x1771

Key takeaways

  • On Solana, custom program error 0x1 means insufficient funds in both the System program (ResultWithNegativeLamports) and the SPL Token program (InsufficientFunds), but other programs use 0x1 for unrelated errors.
  • Custom program error 0x1771 is decimal 6001, the second custom error of an Anchor program: SlippageToleranceExceeded in Jupiter v6, AlreadyInitialized in pump.fun and InvalidOwner in Raydium CPMM.
  • Anchor programs number their own errors from 6000 (0x1770), while Anchor's built-in errors sit below that, such as 2000 ConstraintMut and 3012 AccountNotInitialized.
  • The number in 'Error processing Instruction 2' is a zero-based index, so it points to the third instruction in the transaction, which in a swap is often the call after two Compute Budget instructions.
  • SOLTidy's free Transaction Decoder reads the failing program from the logs and translates known System, SPL Token, Token-2022 and Jupiter error codes without connecting a wallet.

The short answer

A Solana custom program error is a number chosen by the program that failed, shown in hex in the logs, so custom program error: 0x1 and 0x1771 only make sense once you know which program raised them. In the System program 0x1 is ResultWithNegativeLamports (not enough SOL), and in SPL Token and Token-2022 it is InsufficientFunds (not enough tokens). 0x1771 is decimal 6001, the second custom error of an Anchor program, which in Jupiter v6 is SlippageToleranceExceeded. The tables below list every code of the core programs, checked against their source code as of November 2026.

This page is the lookup reference. For the story of why transactions fail and the most common fixes, read why Solana transactions fail first.

How do you read "custom program error: 0x1"?

You read it in three steps: find which program failed, convert the hex code to decimal, and look the number up in that program's error list. A typical failed transaction gives you two pieces of text. The transaction error, as an RPC node or explorer returns it, looks like this:

Error processing Instruction 2: custom program error: 0x1771
{"InstructionError":[2,{"Custom":6001}]}

The program logs carry the third piece, the program that raised it:

Program JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4 invoke [1]
Program log: AnchorError occurred. Error Code: SlippageToleranceExceeded. Error Number: 6001. Error Message: Slippage tolerance exceeded.
Program JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4 failed: custom program error: 0x1771

Each part means something specific:

  • The instruction index. Instruction 2 is a zero-based index into the transaction's top-level instructions, so it is the third one. Wallet and app transactions usually start with two Compute Budget instructions (set compute unit limit, set compute unit price), so index 2 is often the first instruction that does real work.
  • The custom code. Custom is the program's own error number. The JSON form shows it in decimal (6001) and the log line in hex (0x1771); they are the same number. The runtime formats it as custom program error: {num:#x} in the InstructionError source.
  • The failing program. The line Program <address> failed: ... names the program. If one program called another (a cross-program invocation), the inner failure propagates upward, because a calling program cannot catch it. You then see several "failed" lines with the same code, and the first one, the deepest, is the program that raised the error.

Here is the procedure in order:

  1. Copy the transaction signature from your wallet's activity list or an explorer such as Solscan, Solana Explorer or SolanaFM.
  2. Open the transaction's logs, or paste the signature into the free Transaction Decoder, which needs no wallet.
  3. Find the first line containing failed: and note the program address on it.
  4. Convert the hex code to decimal (next section).
  5. Look the number up in the table for that program below. Anchor programs often print the error name in a Program log: AnchorError occurred line, which saves the lookup.

I built the decoder to do steps 3 to 5 automatically: it searches the logs for the first Program ... failed: custom program error line, reports the instruction number counting from one, and adds a plain-English meaning for the System, SPL Token, Token-2022 and Jupiter v6 codes it knows. For other programs it gives you the decimal and hex codes and the program name, and you finish the lookup in that program's IDL.

How do you convert a Solana error code from hex to decimal?

Drop the 0x and read the remaining digits as base 16. Each digit is worth 16 times the one to its right, so 0x1771 is 1 x 4096 + 7 x 256 + 7 x 16 + 1 = 6001. Quick ways to do it:

  • Browser console: parseInt("1771", 16) returns 6001.
  • Python: int("1771", 16).
  • Terminal: printf "%d\n" 0x1771.

The conversions you will meet most often:

HexDecimalWhere it usually comes from
0x00System AccountAlreadyInUse, Token NotRentExempt
0x11System ResultWithNegativeLamports, Token InsufficientFunds
0xb11Token NonNativeHasBalance (close with tokens left)
0x1117Token AccountFrozen
0x1e30Raydium AMM v4 ExceededSlippage
0x2335Token-2022 AccountHasWithheldTransferFees
0x7d02000Anchor ConstraintMut
0xbc43012Anchor AccountNotInitialized
0x17706000First custom error of any Anchor program
0x17716001Second custom error of any Anchor program
0x17726002Third custom error (pump.fun TooMuchSolRequired)

What do the SPL Token program error codes mean?

SPL Token error codes run from 0x0 to 0x13 (0 to 19) and come from the TokenError enum, numbered in declaration order. The list below is taken from the token program's error.rs, which also defines the "Error:" text the program writes to the logs. The program is TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA, and Token-2022 (TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb) uses the same 20 codes with the same meaning.

HexDecNameLog textWhat it means and the fix
0x00NotRentExemptLamport balance below rent-exempt thresholdThe new account was not funded to its rent-exempt minimum. Fund it with the full deposit; the rent calculator gives the amount
0x11InsufficientFundsinsufficient fundsThe token account holds fewer tokens than the amount sent. Check the balance and the decimals
0x22InvalidMintInvalid MintThe mint account is not a valid, initialized mint
0x33MintMismatchAccount not associated with this MintThe token account belongs to a different mint than the instruction expects
0x44OwnerMismatchowner does not matchThe signer is not the account owner, delegate or close authority. Sign with the right wallet
0x55FixedSupplythe total supply of this token is fixedMinting was attempted after the mint authority was revoked
0x66AlreadyInUseaccount or token already in useThe account being initialized is already initialized
0x77InvalidNumberOfProvidedSignersInvalid number of provided signersA multisig got the wrong number of signer accounts
0x88InvalidNumberOfRequiredSignersInvalid number of required signersA multisig was configured with an invalid threshold
0x99UninitializedStateState is uninitializedThe token account or mint does not exist yet. Create it first
0xa10NativeNotSupportedInstruction does not support native tokensThe instruction cannot be used on a wrapped SOL account
0xb11NonNativeHasBalanceNon-native account can only be closed if its balance is zeroClosing an account that still holds tokens. Sell, send or burn them first
0xc12InvalidInstructionInvalid instructionThe instruction data could not be parsed
0xd13InvalidStateInvalid account state for operationThe account is in a state that does not allow this operation
0xe14OverflowOperation overflowedAn amount calculation overflowed, often minting past the u64 maximum
0xf15AuthorityTypeNotSupportedAccount does not support specified authority typeSetAuthority was called with an authority type the account does not have
0x1016MintCannotFreezeThis token mint cannot freeze accountsFreeze or thaw on a mint with no freeze authority
0x1117AccountFrozenAccount is frozenThe freeze authority froze this account. Only it can thaw the account
0x1218MintDecimalsMismatchdecimals different from the Mint decimalsA *Checked instruction passed the wrong decimals for the mint
0x1319NonNativeNotSupportedInstruction does not support non-native tokensThe instruction only works on wrapped SOL, such as SyncNative

The three that ordinary users hit most are 0x1 (not enough tokens, often because the app and wallet disagree on decimals), 0xb (closing an account with dust left in it) and 0x11 (a frozen account). The closing cases are covered step by step in can't close a Solana token account, and frozen accounts in mint authority vs freeze authority.

What are the extra Token-2022 error codes?

Token-2022 adds 49 codes, 0x14 to 0x44 (20 to 68), for its extensions, on top of the 20 shared with SPL Token. They are listed in the Token-2022 error.rs as of November 2026. The newest entries at the bottom may only appear once the deployed program has been upgraded to include them.

HexDecNameWhat it means
0x1420ExtensionTypeMismatchExtension type does not match existing extensions
0x1521ExtensionBaseMismatchExtension is for a mint but used on an account, or the reverse
0x1622ExtensionAlreadyInitializedExtension already initialized on this account
0x1723ConfidentialTransferAccountHasBalanceCannot close: confidential balance is not zero
0x1824ConfidentialTransferAccountNotApprovedAccount not approved for confidential transfers
0x1925ConfidentialTransferDepositsAndTransfersDisabledAccount not accepting deposits or transfers
0x1a26ConfidentialTransferElGamalPubkeyMismatchElGamal public key mismatch
0x1b27ConfidentialTransferBalanceMismatchConfidential balance mismatch
0x1c28MintHasSupplyCannot close a mint with tokens in circulation; burn them first
0x1d29NoAuthorityExistsNo authority exists to perform this operation
0x1e30TransferFeeExceedsMaximumTransfer fee above the 10,000 basis point maximum
0x1f31MintRequiredForTransferUse TransferChecked; plain Transfer is not allowed for this mint
0x2032FeeMismatchCalculated transfer fee does not match the expected fee
0x2133FeeParametersMismatchZero-knowledge proof fee parameters do not match the mint
0x2234ImmutableOwnerThe account's owner cannot be changed
0x2335AccountHasWithheldTransferFeesCannot close: withheld transfer fees remain; harvest them to the mint first
0x2436NoMemoRecipient requires a memo in the previous instruction
0x2537NonTransferableThe mint is non-transferable (soulbound)
0x2638NonTransferableNeedsImmutableOwnershipNon-transferable tokens need an immutable-owner account
0x2739MaximumPendingBalanceCreditCounterExceededToo many confidential deposits or transfers pending
0x2840MaximumDepositAmountExceededConfidential deposit above the maximum
0x2941CpiGuardSettingsLockedCPI Guard cannot be toggled inside a CPI
0x2a42CpiGuardTransferBlockedCPI Guard blocked a program transfer without a delegate
0x2b43CpiGuardBurnBlockedCPI Guard blocked a program burn without a delegate
0x2c44CpiGuardCloseAccountBlockedCPI Guard blocked a close that does not return SOL to the owner
0x2d45CpiGuardApproveBlockedCPI Guard blocked a delegate approval
0x2e46CpiGuardSetAuthorityBlockedCPI Guard blocked adding or replacing an authority
0x2f47CpiGuardOwnerChangeBlockedOwnership cannot change while CPI Guard is on
0x3048ExtensionNotFoundExtension not found in account data
0x3149NonConfidentialTransfersDisabledOnly confidential transfers are allowed
0x3250ConfidentialTransferFeeAccountHasWithheldFeeCannot close: confidential withheld fee is not zero
0x3351InvalidExtensionCombinationInvalid combination of extensions
0x3452InvalidLengthForAllocReallocation with overwrite must keep the same length
0x3553AccountDecryptionFailed to decrypt a confidential account
0x3654ProofGenerationFailed to generate a proof
0x3755InvalidProofInstructionOffsetInvalid proof instruction offset
0x3856HarvestToMintDisabledHarvesting withheld fees to the mint is disabled
0x3957SplitProofContextStateAccountsNotSupportedSplit proof context accounts not supported here
0x3a58NotEnoughProofContextStateAccountsNot enough proof context accounts provided
0x3b59MalformedCiphertextCiphertext is malformed
0x3c60CiphertextArithmeticFailedCiphertext arithmetic failed
0x3d61PedersenCommitmentMismatchPedersen commitment mismatch
0x3e62RangeProofLengthMismatchRange proof length mismatch
0x3f63IllegalBitLengthIllegal transfer amount bit length
0x4064FeeCalculationFee calculation failed
0x4165IllegalMintBurnConversionWithdraw or deposit not allowed for confidential mint-burn
0x4266InvalidScaleInvalid scale for the scaled UI amount extension
0x4367MintPausedTransfers, minting and burning are paused on this mint
0x4468PendingBalanceNonZeroKey rotation attempted with a pending balance

For traders the relevant ones are 0x23 (harvest withheld fees before closing, explained in how to set and claim Token-2022 transfer fees), 0x1f (an app used the wrong transfer instruction), 0x25 (the token cannot be moved at all) and 0x43 (the issuer paused the mint). What those extensions are for is covered in Token-2022 explained for traders.

What are the Associated Token Account program errors?

The Associated Token Account program (ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL) defines only one custom error: 0x0, InvalidOwner, "Associated token account owner does not match address derivation". Everything else it returns is a standard runtime error, which shows up as a name rather than a number. From the ATA processor source:

Error shownCauseFix
custom program error: 0x0 (InvalidOwner)An existing account at that address is owned by a different walletPass the correct wallet and mint
IllegalOwner ("Provided owner is not allowed")Plain Create was called but the account already existsUse CreateIdempotent, or skip the create step
InvalidSeeds ("Provided seeds do not result in a valid address")The address passed is not the derived ATA for that wallet, mint and token programDerive the address with the right token program (SPL Token or Token-2022)
InvalidAccountDataIdempotent create found an account for a different mintCheck the mint

Note that a 0x0 from the ATA program and a 0x0 from the System program are different errors, which is the whole reason to check the program first.

What do the System program error codes mean?

The System program (11111111111111111111111111111111) has nine custom errors, 0x0 to 0x8, from the SystemError enum in the Solana SDK source. The log messages come from the Agave system processor.

HexDecNameLog text you may seeMeaning and fix
0x00AccountAlreadyInUseCreate Account: account ... already in useThe address being created already exists. Often harmless; skip the create
0x11ResultWithNegativeLamportsTransfer: insufficient lamports X, need YThe sender lacks the SOL being transferred or deposited. Add SOL or send less
0x22InvalidProgramIdCannot assign the account to this program
0x33InvalidAccountDataLengthThe requested account size is not allowed (above the 10 MiB limit)
0x44MaxSeedLengthExceededA seed longer than 32 bytes was used for a derived address
0x55AddressWithSeedMismatchThe address does not match the base, seed and owner provided
0x66NonceNoRecentBlockhashesAdvancing a durable nonce needs the RecentBlockhashes sysvar
0x77NonceBlockhashNotExpiredThe stored nonce is still the current blockhash, so it cannot be advanced yet; wait and retry
0x88NonceUnexpectedBlockhashValueThe transaction's nonce does not match the stored nonce

The System program's 0x1 is the classic "not enough SOL" during a transaction. The "Transfer: insufficient lamports" line in the logs states both numbers in lamports, so you can see exactly how short you were. One SOL is 1,000,000,000 lamports.

What are the common Anchor framework error codes?

Anchor errors split into two groups: framework errors below 6000, which mean the same thing in every Anchor program, and custom errors from 6000 (0x1770) up, which each program defines itself. The framework ranges, from the ErrorCode enum in Anchor's lang/error source (the repository formerly at coral-xyz/anchor), are 100+ for instruction errors, 1000+ for IDL errors, 2000+ for account constraints, 2500+ for require! checks, 3000+ for account errors and 4100+ for miscellaneous errors. The ones you are most likely to see:

HexDecNameWhat it means
0x65101InstructionFallbackNotFoundThe instruction discriminator matched nothing; often an outdated client or wrong program
0x66102InstructionDidNotDeserializeInstruction arguments could not be decoded; client and program versions disagree
0x7d02000ConstraintMutAn account marked mut was passed as read-only
0x7d12001ConstraintHasOneA has_one relationship between accounts did not match
0x7d22002ConstraintSignerAn account that must sign did not
0x7d32003ConstraintRawA custom constraint = ... expression was false
0x7d42004ConstraintOwnerAn account is not owned by the expected program
0x7d62006ConstraintSeedsA PDA does not match its expected seeds
0x7dc2012ConstraintAddressAn account is not at the required address
0x7de2014ConstraintTokenMintA token account is for the wrong mint
0x7df2015ConstraintTokenOwnerA token account has the wrong owner
0x7f82040ConstraintDuplicateMutableAccountThe same account was passed twice as mutable
0x9c42500RequireViolatedA require! check in the program failed
0xbb93001AccountDiscriminatorNotFoundThe account is too small to hold a discriminator, often not created yet
0xbba3002AccountDiscriminatorMismatchThe account is of a different type than expected
0xbbb3003AccountDidNotDeserializeThe account data could not be decoded, often after a program upgrade
0xbbd3005AccountNotEnoughKeysToo few accounts passed to the instruction
0xbbe3006AccountNotMutableThe account is not writable
0xbbf3007AccountOwnedByWrongProgramThe account is owned by a different program than expected
0xbc03008InvalidProgramIdThe wrong program was passed
0xbc23010AccountNotSignerThe account did not sign
0xbc33011AccountNotSystemOwnedThe account is not owned by the System program
0xbc43012AccountNotInitializedAn account the instruction expected to exist has not been created
0x10044100DeclaredProgramIdMismatchThe program's declared id does not match where it is deployed
0x17706000(custom)First error defined by the program itself

As a user, the Anchor framework errors usually mean the app built the transaction wrong, not that you did something wrong. 3012 is the exception you can sometimes act on: it often means an account you were supposed to create first, such as a token account or a user profile in that app, does not exist yet.

Why does 0x1771 mean different things in different programs?

0x1771 means different things because Anchor numbers each program's custom errors from 6000 in the order its developers declared them, so 6001 is simply the second error in that program's list. Anchor even allows a different starting offset per program. I read the error lists below from the Anchor IDL stored on chain for Jupiter v6, pump.fun and PumpSwap, and from the GitHub source for Raydium, whose CPMM and CLMM programs do not publish an on-chain IDL:

CodeJupiter v6pump.funPumpSwapRaydium CPMMRaydium CLMM
6000 (0x1770)EmptyRouteNotAuthorizedFeeBasisPointsExceedsMaximumNotApprovedNotApproved
6001 (0x1771)SlippageToleranceExceededAlreadyInitializedZeroBaseAmountInvalidOwnerInvalidUpdateConfigFlag
6002 (0x1772)InvalidCalculationTooMuchSolRequiredZeroQuoteAmountEmptySupplyAccountLack
6003 (0x1773)MissingPlatformFeeAccountTooLittleSolReceivedTooLittlePoolTokenLiquidityInvalidInputClosePositionErr
6004 (0x1774)InvalidSlippageMintDoesNotMatchBondingCurveExceededSlippageIncorrectLpMintInvalidTickIndex
6005 (0x1775)NotEnoughPercentBondingCurveCompleteInvalidAdminExceededSlippageTickInvalidOrder

So the slippage error has a different number in each program. This is the lookup that matters most for traders:

ProgramProgram IDSlippage error
Jupiter v6 aggregatorJUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV46001 (0x1771) SlippageToleranceExceeded; 6017 (0x1781) ExactOutAmountNotMatched for exact-out swaps
pump.fun bonding curve6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P6002 (0x1772) TooMuchSolRequired on buys; 6003 (0x1773) TooLittleSolReceived on sells
PumpSwap AMMpAMMBay6oceH9fJKBRHGP5D4bD4sWpmSwMn52FMfXEA6004 (0x1774) ExceededSlippage
Raydium AMM v4675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp830 (0x1e) ExceededSlippage (native program, not Anchor)
Raydium CPMMCPMMoo8L3F4NbTegBCKVNunggL7H1ZpdTHKxQB5qKP1C6005 (0x1775) ExceededSlippage
Raydium CLMMCAMMCzo5YL8w4VFF8KVHrK22GGUsp5VTaW7grrKgrWqK6017 (0x1781) PriceSlippageCheck, 6018 (0x1782) TooLittleOutputReceived, 6019 (0x1783) TooMuchInputPaid

Sources: the on-chain IDLs of the first three programs as of November 4, 2026, the Jupiter CPI IDL, and Raydium's AMM v4, CPMM and CLMM error files. Jupiter's own common errors page adds two codes worth knowing: 6024 (0x1788) InsufficientFunds, for swap amount, fees or rent, and 6025 (0x1789) InvalidTokenAccount.

The practical lesson: when a Jupiter swap fails with 0x1771, the error came from Jupiter. When it fails with 0x1e, Jupiter routed through Raydium AMM v4 and the pool's own slippage check stopped it, and the first "failed" log line names Raydium, not Jupiter. Either way the fix is the same: a fresh quote, a smaller size or a wider slippage setting.

What do runtime transaction errors like BlockhashNotFound mean?

Runtime transaction errors are produced by the validator, not by a program, so they appear as names with no hex code. They come from the TransactionError enum in the Solana SDK source. Most of them reject the transaction before it runs, which means no fee is charged; the cost rules are explained in Solana transaction fees explained.

Error nameMessage textMeaning and fix
BlockhashNotFoundBlockhash not foundThe blockhash expired or the RPC node has not seen it. Rebuild and sign again
AccountNotFoundAttempt to debit an account but found no record of a prior credit.The fee payer does not exist, meaning it has zero SOL. Fund it with native SOL
InsufficientFundsForFeeInsufficient funds for feeThe fee payer cannot cover the fee. Add SOL, or unwrap wSOL
InsufficientFundsForRentTransaction results in an account (N) with insufficient funds for rentAccount number N would end up with SOL but below its rent-exempt minimum. Leave more SOL in it
InstructionErrorError processing Instruction N: ...Instruction N (zero-based) failed. The detail is a runtime error or a custom program error
AlreadyProcessedThis transaction has already been processedThe same signed transaction landed already. Check its status before resending
AccountInUseAccount in useAnother transaction in the same batch holds a lock on the account. Retry
DuplicateInstructionTransaction contains a duplicate instruction (N) that is not allowedUsually two Compute Budget instructions of the same kind
WouldExceedMaxBlockCostLimitTransaction would exceed max Block Cost LimitThe block was full. Retry, possibly with a higher priority fee
ProgramAccountNotFoundAttempt to load a program that does not existThe transaction calls a program address that has no program
MaxLoadedAccountsDataSizeExceededTransaction exceeded max loaded accounts data size capThe accounts the transaction loads are too large in total

InsufficientFundsForRent is the one to remember for small wallets: Solana will not leave an account holding SOL below its rent-exempt minimum. A new token account needs 0.00148844 SOL, which is the usual reason a first-time buy fails on a nearly empty wallet. The rent calculator gives the minimum for any account size, and what is Solana rent explains why it exists.

What do instruction errors like ProgramFailedToComplete mean?

Instruction errors are the named, non-custom failures inside InstructionError, such as ProgramFailedToComplete or InsufficientFunds. They come from the runtime rather than a program's own list, from the InstructionError enum:

NameMessage textUsual cause
ProgramFailedToCompleteProgram failed to completeThe program aborted. If the log says "exceeded CUs meter at BPF instruction", it ran out of compute units
ComputationalBudgetExceededComputational budget exceededCompute units ran out while the runtime charged for a call or syscall
InsufficientFundsinsufficient funds for instructionAn account lacked the lamports the instruction needed
MissingRequiredSignaturemissing required signature for instructionA required signer did not sign
AccountNotRentExemptAn account does not have enough lamports to be rent-exemptThe account was underfunded
InvalidAccountDatainvalid account data for instructionAn account held data the program did not expect, often the wrong account
AccountAlreadyInitializedinstruction requires an uninitialized accountThe account already exists
UninitializedAccountinstruction requires an initialized accountThe account has not been created
IncorrectProgramIdincorrect program id for instructionWrong program for that account, often SPL Token versus Token-2022
IllegalOwnerProvided owner is not allowedThe account is owned by an unexpected program
InvalidSeedsProvided seeds do not result in a valid addressA derived address does not match its seeds
Custom(N)custom program error: 0x...The program's own error number N; look it up in that program's list

The compute case is worth spelling out, because it is the one people search for. When a program runs out of compute units, the log shows Program <address> failed: exceeded CUs meter at BPF instruction and the instruction error is ProgramFailedToComplete, as the Agave invoke context shows; ComputationalBudgetExceeded appears when the meter runs out during a runtime-charged operation. The default limit is 200,000 compute units per instruction and the maximum is 1,400,000 per transaction, per Agave's compute budget constants. The fix is a higher compute unit limit, set by the app; the priority fee tracker shows the price side, and how much priority fee to pay explains why the limit you request matters for cost.

Bottom line

A Solana error code is only meaningful next to the program that raised it: find the first Program ... failed line in the logs, convert the hex code to decimal, and look it up in that program's list. In the core programs, 0x1 is "not enough SOL" (System) or "not enough tokens" (SPL Token and Token-2022), 0xb and 0x23 block account closes, and 0x11 means frozen. Anchor's 2000 to 4100 range means the same in every Anchor program, while 6000 and up are program-specific, which is why 0x1771 is Jupiter slippage but something else entirely in pump.fun or Raydium. Runtime errors such as BlockhashNotFound and AccountNotFound are names, not numbers, and usually cost nothing. To skip the manual lookup, paste the signature into the free Transaction Decoder, and for the causes behind the codes, see why Solana transactions fail.

Questions & answers

What does custom program error 0x1 mean on Solana?

It is error number 1 of whichever program failed. In the System program it is ResultWithNegativeLamports, meaning the sender lacked the SOL being transferred. In the SPL Token and Token-2022 programs it is InsufficientFunds, meaning the token account held less than the amount sent. In any other program 0x1 means something else, so check the 'Program ... failed' line in the logs to see which program raised it.

What does custom program error 0x1771 mean?

0x1771 is hexadecimal for 6001, the second custom error defined by an Anchor program. In Jupiter v6 it is SlippageToleranceExceeded, so the swap would have returned less than your minimum. In pump.fun 6001 is AlreadyInitialized and in Raydium CPMM it is InvalidOwner, so the meaning depends entirely on which program failed. For a Jupiter swap, retry with a fresh quote or wider slippage.

How do I convert a Solana error code from hex to decimal?

Drop the 0x and read the rest as base 16. In a browser console, parseInt('1771', 16) returns 6001; in Python, int('1771', 16) does the same; in a terminal, printf '%d' 0x1771 works. The transaction's JSON error already shows the decimal form, for example Custom 6001, while the program logs show the hex form 0x1771.

What does 'Attempt to debit an account but found no record of a prior credit' mean?

It is the AccountNotFound transaction error. The fee payer account does not exist on chain, which means the wallet has never held SOL or has a balance of zero. The transaction is rejected before it runs and costs nothing. Send a small amount of native SOL to the wallet first; wrapped SOL in a token account does not count.

What is the difference between Anchor error 3012 and custom error 6000?

3012 (0xbc4) is AccountNotInitialized, one of Anchor's built-in framework errors, and it means the same thing in every Anchor program: an account the instruction expected to exist has not been created. 6000 (0x1770) and above are errors the program's developers defined themselves, so 6000 in Jupiter, pump.fun and Raydium are three different errors that you look up in each program's IDL.

Why does a failed Solana transaction show the same error twice in the logs?

When one program calls another and the inner call fails, the caller cannot catch the error, so it fails too with the same code. The logs then show 'Program X failed' for the inner program first and again for each program above it. The first failed line, the deepest one, names the program that actually raised the error and whose error list you need.

Tools from this guide

Bookmark SOLTidy

Then open SOLTidy from the bookmark instead of from search results or links in DMs, where look-alike scam sites live.