Errors
The full DiceError enum, grouped by subsystem. If you see one of these in an Anchor log, find it here.
All variants live in programs/dice/src/error.rs. Anchor returns them as Custom(code) in TX logs — the variant name and message are what you see in the explorer.
Round protocol errors
The errors your client code is most likely to encounter when driving rounds.
| Variant | Message | Root cause |
|---|---|---|
| InsufficientNodes | minimum 4 required | Fewer than 4 nodes online at request time. Retry or reduce node_count. |
| InvalidNodeCount | must be between 4 and 50 | You passed node_count < 4 or > 50. Clamp client-side. |
| RoundTimedOut | Round has timed out | Nodes didn't reveal within the round window. Rare; coordinator retries automatically. |
| RoundAlreadyFinalized | already been finalized | Double finalisation attempted. Usually a coordinator bug, not caller-visible. |
| RoundNotComplete | not yet complete | Attempted to finalise before all reveals are in. Transient. |
| EscrowInsufficient | Escrow has insufficient funds | Channel is out of SOL. Call fund_channel. |
| UnauthorizedCoordinator | not the authorized coordinator for this channel | The TX signer doesn't match the channel's bound coordinator pubkey. |
| Variant | Message | Root cause |
|---|---|---|
| AlreadyCommitted | Node has already committed for this round | Duplicate submit_round for the same device + round. |
| AlreadyRevealed | Node has already revealed for this round | Duplicate submit_reveal for the same device + round. |
| RevealMismatch | hash(entropy) does not match commit | A node's reveal doesn't hash to its earlier commit. Hardware fault or malice. |
| InvalidSignature | Invalid ECDSA signature | The reveal signature didn't verify against the device's registered pubkey. |
| UnauthorizedNode | not authorized for this round | A device tried to submit for a round it wasn't selected in. |
| InvalidDeviceId | device_id does not match SHA-256(device_pubkey) | Provisioning integrity check failed. The device is misregistered. |
Callback errors
These surface when DICE tries to CPI into your program.
| Variant | Message | Root cause |
|---|---|---|
| CallbackProgramMissing | Callback program missing from remaining accounts | Coordinator didn't include the callback program in the finalisation TX. Ops issue. |
| CallbackProgramMismatch | Callback program ID does not match request | A different program was supplied than the channel's configured callback. Usually a client bug. |
| CallbackFailed | CPI callback to developer program failed | Your dice_callback reverted. See Callback handler → replay. |
Streaming feed errors
Relevant only if you're consuming the streaming VRF feed PDA. See Streaming feed.
| Variant | Message | Root cause |
|---|---|---|
| FeedPublishTooSoon | before the configured interval has elapsed | Feed crank ran faster than publish_interval_slots. Retry next interval. |
| FeedWrongCoordinator | not the coordinator bound to this feed | The signer doesn't match the feed's coordinator pubkey. |
| FeedInvalidInterval | between MIN and MAX_PUBLISH_INTERVAL_SLOTS | Interval config out of bounds. Choose a value in the allowed range. |
| FeedNotActive | closed or paused | Feed has been paused by its authority. |
| FeedChannelMismatch | does not match the feed's configured bound_channel | The channel passed to publish doesn't match the feed's binding. |
| FeedChannelNotFinalized | not in Finalized status | Attempted to publish from a still-running round. |
| FeedRoundIdMismatch | round_id does not match | The round_id argument disagrees with the channel's last finalised round. |
| FeedRandomnessMismatch | randomness does not match | The randomness argument disagrees with the channel's stored result. |
Node vault errors
You'll see these only if you operate a node. Integrators don't call vault instructions.
| Variant | Message | Root cause |
|---|---|---|
| VaultAlreadyBound | already bound to a payout wallet | bind_payout_wallet called twice. Use rotate_payout_wallet instead. |
| VaultNotBound | no payout wallet bound yet | Withdraw attempted before binding. Call bind_payout_wallet first. |
| VaultWrongPayoutWallet | not the vault's current payout wallet | Signer doesn't match the vault's bound wallet. |
| VaultInsufficientBalance | exceeds vault credited balance | Withdraw amount > credited. Reduce the amount. |
| VaultZeroAmount | must be greater than zero | Withdraw of 0 lamports. |
| VaultRotationCooldown | before cooldown elapsed | Tried to rotate payout wallet before the cooldown window ended. |
| VaultBindingSignatureInvalid | failed secp256k1 verification | Binding message signature didn't verify. Check firmware key. |
| VaultCreditOverflow | would overflow vault totals | Theoretical u64 overflow on credit. Should not happen in practice. |
| VaultUnknownServiceId | Unknown service ID | Credit path passed an unrecognised service tag. |
| VaultFrozen | Vault is frozen | Vault has been frozen by governance. Contact DICE ops. |
Deprecated
| Variant | Message | Root cause |
|---|---|---|
| V1ClaimRewardsDeprecated | use claim_rewards_v2 (v2 channel path) | The v1 claim path had unfixable per-node payout semantics. Migrate to v2. |