Contract Errors
This page maps the airdrop contract error codes to plain-language meanings.
Use it when:
- a wallet or explorer shows a raw onchain error
- you need to understand what a failed transaction means
- support asks for the exact contract error code
Campaign Setup and Access
| Code | Name | Meaning | What to check |
|---|---|---|---|
6000 | AccountNotFound | Required account could not be found. | Make sure the campaign, mint, or related account exists on the expected network. |
6001 | InvalidConfigAuthority | The wrong config authority was used. | Confirm the connected wallet is the expected authority. |
6002 | AccountAlreadyInitialized | The account was already created. | Make sure you are not creating the same object twice. |
6003 | InvalidAirdropType | The requested airdrop type is invalid. | Re-check whether the flow should be Onchain List or Claim-based (Merkle). |
6004 | InvalidActionType | The requested action is not valid in this context. | Confirm you are using the right contract action for the current step. |
6005 | InvalidPubkey | A provided public key is invalid. | Check copied addresses for typos or truncation. |
6006 | InvalidTimestamp | A timestamp is malformed or out of range. | Re-check start and end dates. |
6007 | InvalidAmount | The provided amount is invalid. | Check token amounts, recipient amounts, and formatted input values. |
6008 | UriTooLong | A URI field is too long. | Shorten metadata or related URI input. |
6009 | InvalidSourceAccount | The selected source token account is not valid. | Check the wallet, mint, and source token account pairing. |
6026 | InvalidAirdropAccount | The provided airdrop account is not valid. | Confirm you opened the correct campaign. |
6027 | MissingDraftRound | A required draft round is missing. | Re-open the campaign from the current draft flow. |
6028 | InvalidCreator | The caller is not the expected creator. | Use the creator wallet for management actions. |
6029 | InvalidDraftRound | The draft round is not valid. | Refresh the campaign and retry from the right draft state. |
6034 | InvalidAirdropStatus | The current campaign status does not allow this action. | Make sure the campaign is in the right state for the action you are trying. |
6035 | InvalidProtocolVault | The protocol vault account is invalid. | Check that the app is pointing to the correct environment and vault setup. |
6036 | InvalidAirdropDraftIndex | The referenced draft index is invalid. | Re-open the latest draft and avoid using stale URLs. |
6037 | InvalidPda | A PDA derivation is invalid. | This often points to a mismatched account or environment. |
Schedule and Lifecycle
| Code | Name | Meaning | What to check |
|---|---|---|---|
6010 | AirdropNotStarted | The campaign is not live yet. | Check whether the campaign has been started or is still scheduled for later. |
6011 | AirdropEnded | The campaign already ended. | Confirm the claim window has not already closed. |
6012 | AirdropNotEnded | The campaign has not ended yet. | This often appears when using an action that requires the end date to have passed. |
6013 | AirdropHasNoEnd | The campaign has no end date. | Set an end date if the action requires a bounded schedule. |
6014 | InvalidState | The current state does not allow the action. | Re-check whether setup, funding, or launch is already complete. |
6015 | EndBeforeStart | The end time is before the start time. | Fix the schedule ordering. |
6016 | StartTimeInPast | The chosen start time is already in the past. | Set a valid future time or leave start blank for immediate launch. |
6053 | AirdropDurationTooShort | The campaign duration is too short. | Increase the claim window to a valid duration. |
Claim and Balance
| Code | Name | Meaning | What to check |
|---|---|---|---|
6017 | AlreadyClaimed | This allocation was already claimed. | Confirm whether the wallet has already completed the claim. |
6018 | InvalidMerkleProof | The submitted Merkle proof is invalid. | Check that the recipient dataset, proof, and wallet all match the same campaign. |
6019 | MathOverflow | A numeric calculation overflowed. | Re-check amounts and totals for unusually large values. |
6020 | InsufficientVaultBalance | The vault does not hold enough tokens. | Confirm the campaign is fully funded before claims or withdrawals. |
6021 | InsufficientFunds | The wallet or account does not hold enough funds. | Check token balance and SOL balance for fees. |
6030 | InvalidMint | The provided mint is invalid. | Confirm you selected the correct mint address. |
6031 | InvalidTokenProgram | The token program does not match the mint. | Re-check whether the mint belongs to Token or Token-2022. |
6032 | InvalidMemoProgram | The memo program is invalid. | This usually points to an environment or account mismatch. |
6033 | Overflow | A calculation overflowed. | Re-check unusually large amounts, totals, or aggregated dataset values. |
Mint and Token Restrictions
| Code | Name | Meaning | What to check |
|---|---|---|---|
6022 | InvalidCostLamports | The creation cost exceeded the allowed limit. | Re-check rent-heavy setup or account growth. |
6023 | UnsupportedMint | The mint is not supported by the contract rules. | Confirm the mint type and extension set are allowed for airdrops. |
6024 | MintFreezeAuthorityNotAllowed | The mint still has freeze authority. | Revoke freeze authority before using the token for an airdrop if required. |
6025 | SourceCpiGuardEnabled | The source token account has CPI Guard enabled. | Use a compatible source token account for the action. |
6043 | TransferFeeCalculationFailed | The transfer fee could not be calculated. | Re-check Token-2022 transfer fee configuration and required deposit math. |
Recipient Lists and Merkle Data
| Code | Name | Meaning | What to check |
|---|---|---|---|
6038 | InvalidLeafData | Merkle leaf or recipient data is malformed. | Rebuild the recipient dataset and Merkle files. |
6039 | EmptyRecipientList | No recipients were provided. | Make sure the CSV or recipient input contains rows. |
6040 | AppendRecipientsLimitExceeded | Too many recipients were appended in one onchain step. | Reduce batch size or switch to Merkle for large campaigns. |
6041 | ListEmpty | The onchain list is empty. | Add recipients before trying actions that depend on them. |
6042 | ListChunkOverflow | Recipient list chunking exceeded the allowed shape. | Split the list differently or use Merkle for larger datasets. |
6044 | EmptyMerkleRoots | No Merkle roots were provided. | Upload or generate Merkle files before registration. |
6045 | MerkleRootsLimitExceeded | Too many Merkle roots were provided. | Reduce root count or rebuild the dataset with valid limits. |
6046 | InvalidMerkleRoot | A Merkle root is invalid. | Rebuild and re-upload the Merkle files. |
6047 | InvalidMerkleLeafCount | A root has an invalid leaf count. | Check the generated Merkle metadata. |
6048 | MerkleLeafCountExceeded | A root contains too many leaves. | Rebuild the dataset so each root stays within the supported limit. |
6049 | InvalidMerkleRootSum | A root sum is invalid. | Re-check the generated totals in the Merkle files. |
6050 | DuplicateMerkleRoot | The same root was submitted more than once. | Remove duplicate roots before registration. |
6051 | MerkleRootsAlreadyRegistered | Merkle roots were already registered for this campaign. | Avoid registering the same root set twice. |
6052 | MerkleRootSumTotalMismatch | The combined root sums do not match the expected total. | Rebuild the Merkle dataset and confirm aggregate totals. |
Notes
- Anchor custom errors usually start at 6000 and increase by declaration order.
- A wallet UI may show only the message, only the code, or both.
- If a transaction fails in the explorer, compare the code or message here and then continue with Troubleshooting.
Last updated on