Error Codes
This reference documents all error codes returned by ACDC APIs, SDKs, and CLI tools.
JSON-RPC Errors
Standard JSON-RPC 2.0 error codes:
| Code |
Name |
Description |
| -32700 |
Parse error |
Invalid JSON |
| -32600 |
Invalid request |
Missing required fields |
| -32601 |
Method not found |
Unknown RPC method |
| -32602 |
Invalid params |
Invalid parameter type or value |
| -32603 |
Internal error |
Server-side error |
ACDC-Specific RPC Errors
| Code |
Name |
Description |
| -32000 |
Transaction rejected |
Transaction validation failed |
| -32001 |
Insufficient funds |
Account balance too low |
| -32002 |
Nonce too low |
Transaction nonce already used |
| -32003 |
Nonce too high |
Gap in transaction nonce sequence |
| -32004 |
Gas too low |
Gas limit below minimum |
| -32005 |
Gas price too low |
Gas price below network minimum |
| -32006 |
Execution reverted |
Contract execution failed |
| -32007 |
Block not found |
Requested block does not exist |
| -32008 |
Transaction not found |
Requested transaction does not exist |
| -32009 |
Account not found |
Address has no on-chain state |
| -32010 |
Contract error |
Contract-specific error |
| -32011 |
Rate limited |
Too many requests |
| -32012 |
Subscription error |
WebSocket subscription failed |
| -32013 |
Proof invalid |
ZK proof verification failed |
| -32014 |
Record spent |
Alpha chain record already spent |
Transaction Errors
Validation Errors
| Code |
Name |
Description |
Resolution |
TX_INVALID_SIGNATURE |
Invalid signature |
Signature does not match sender |
Re-sign transaction |
TX_INVALID_NONCE |
Invalid nonce |
Nonce mismatch |
Get current nonce |
TX_INVALID_GAS_LIMIT |
Invalid gas limit |
Below intrinsic gas |
Increase gas limit |
TX_INVALID_GAS_PRICE |
Invalid gas price |
Below minimum |
Increase gas price |
TX_INVALID_VALUE |
Invalid value |
Negative or overflow |
Check amount |
TX_INVALID_DATA |
Invalid data |
Malformed calldata |
Check encoding |
TX_INVALID_TO |
Invalid recipient |
Malformed address |
Validate address |
TX_TOO_LARGE |
Transaction too large |
Exceeds size limit |
Reduce data |
Execution Errors
| Code |
Name |
Description |
Resolution |
EXEC_REVERT |
Execution reverted |
Contract reverted |
Check revert reason |
EXEC_OUT_OF_GAS |
Out of gas |
Gas limit exhausted |
Increase gas limit |
EXEC_STACK_OVERFLOW |
Stack overflow |
Call stack too deep |
Reduce call depth |
EXEC_INVALID_JUMP |
Invalid jump |
Invalid EVM jump |
Fix contract code |
EXEC_INVALID_OPCODE |
Invalid opcode |
Unknown instruction |
Fix contract code |
EXEC_WRITE_PROTECTION |
Write protection |
Static call modified state |
Use non-static call |
Revert Reasons
When a contract reverts, the reason is included in the error:
{
"code": -32006,
"message": "Execution reverted",
"data": {
"reason": "ERC20: insufficient balance",
"data": "0x08c379a0..."
}
}
Common revert reasons:
| Reason |
Description |
ERC20: insufficient balance |
Token balance too low |
ERC20: insufficient allowance |
Approval amount too low |
Ownable: caller is not owner |
Not contract owner |
Pausable: paused |
Contract is paused |
ReentrancyGuard: reentrant call |
Reentrancy detected |
SDK Errors
TypeScript SDK
import {
AcdcError,
RpcError,
NetworkError,
InvalidAddressError,
InsufficientFundsError,
NonceError,
SignatureError,
TimeoutError
} from '@acdc/sdk';
try {
await client.sendTransaction(tx);
} catch (error) {
if (error instanceof InsufficientFundsError) {
console.log('Need more ACDC');
console.log('Required:', error.required);
console.log('Available:', error.available);
} else if (error instanceof NonceError) {
console.log('Nonce issue:', error.message);
console.log('Expected:', error.expected);
console.log('Got:', error.got);
} else if (error instanceof RpcError) {
console.log('RPC Error:', error.code, error.message);
} else if (error instanceof NetworkError) {
console.log('Network Error:', error.message);
}
}
| Error Class |
Code |
Description |
RpcError |
varies |
JSON-RPC error from node |
NetworkError |
NETWORK_ERROR |
Connection failed |
TimeoutError |
TIMEOUT |
Request timed out |
InvalidAddressError |
INVALID_ADDRESS |
Address format invalid |
InsufficientFundsError |
INSUFFICIENT_FUNDS |
Balance too low |
NonceError |
NONCE_ERROR |
Nonce mismatch |
SignatureError |
SIGNATURE_ERROR |
Signing failed |
ContractError |
CONTRACT_ERROR |
Contract call failed |
Rust SDK
use acdc_sdk::{AcdcError, RpcError};
match client.send_transaction(tx).await {
Ok(receipt) => println!("Success: {:?}", receipt),
Err(AcdcError::Rpc(RpcError { code, message, .. })) => {
eprintln!("RPC error {}: {}", code, message);
}
Err(AcdcError::InsufficientFunds { required, available }) => {
eprintln!("Need {} but have {}", required, available);
}
Err(AcdcError::Network(e)) => {
eprintln!("Network error: {}", e);
}
Err(e) => eprintln!("Error: {}", e),
}
| Error Variant |
Description |
AcdcError::Rpc |
JSON-RPC error |
AcdcError::Network |
Connection error |
AcdcError::Timeout |
Request timeout |
AcdcError::InvalidAddress |
Address invalid |
AcdcError::InsufficientFunds |
Balance too low |
AcdcError::Signature |
Signing error |
AcdcError::Abi |
ABI encode/decode error |
CLI Errors
| Exit Code |
Name |
Description |
| 0 |
Success |
Command completed |
| 1 |
General error |
Unspecified error |
| 2 |
Invalid arguments |
Bad command line args |
| 3 |
Network error |
Connection failed |
| 4 |
Transaction error |
Transaction failed |
| 5 |
Wallet error |
Wallet operation failed |
| 6 |
Contract error |
Contract interaction failed |
| 7 |
Configuration error |
Bad config file |
CLI Error Messages
# Insufficient funds
acdc send --to dx1... --amount 1000000
# Error: Insufficient funds
# Required: 1000000 ACDC
# Available: 100 ACDC
# Exit code: 4
# Invalid address
acdc send --to invalid_address --amount 1
# Error: Invalid address format
# Provided: invalid_address
# Expected: dx1... or ax1...
# Exit code: 2
# Network error
acdc query balance --network mainnet
# Error: Failed to connect to RPC endpoint
# URL: https://delta-rpc.ac-dc.network
# Reason: Connection refused
# Exit code: 3
Alpha Chain Errors
Record Errors
| Code |
Name |
Description |
RECORD_NOT_FOUND |
Record not found |
Record does not exist |
RECORD_SPENT |
Record spent |
Record already consumed |
RECORD_INVALID |
Invalid record |
Record structure invalid |
RECORD_MISMATCH |
Record mismatch |
Record does not match proof |
Proof Errors
| Code |
Name |
Description |
PROOF_INVALID |
Invalid proof |
ZK proof verification failed |
PROOF_EXPIRED |
Proof expired |
Proof timestamp too old |
PROOF_MALFORMED |
Malformed proof |
Proof structure invalid |
View Key Errors
| Code |
Name |
Description |
VIEW_KEY_INVALID |
Invalid view key |
View key format wrong |
VIEW_KEY_MISMATCH |
View key mismatch |
View key does not match address |
DECRYPT_FAILED |
Decryption failed |
Could not decrypt record |
Staking Errors
| Code |
Name |
Description |
STAKE_INSUFFICIENT |
Insufficient stake |
Stake amount below minimum |
STAKE_LOCKED |
Stake locked |
Stake in unbonding period |
VALIDATOR_NOT_FOUND |
Validator not found |
Unknown validator address |
VALIDATOR_INACTIVE |
Validator inactive |
Validator not accepting delegates |
VALIDATOR_JAILED |
Validator jailed |
Validator is slashed/jailed |
REWARDS_NONE |
No rewards |
No rewards to claim |
UNBONDING_EXISTS |
Unbonding in progress |
Already unbonding |
Governance Errors
| Code |
Name |
Description |
PROPOSAL_NOT_FOUND |
Proposal not found |
Unknown proposal ID |
PROPOSAL_NOT_ACTIVE |
Proposal not active |
Voting period ended |
PROPOSAL_THRESHOLD |
Below threshold |
Not enough stake to propose |
ALREADY_VOTED |
Already voted |
Cannot vote twice |
NO_VOTING_POWER |
No voting power |
No staked tokens |
INVALID_VOTE |
Invalid vote |
Vote must be yes/no/abstain |
Bridge Errors
| Code |
Name |
Description |
BRIDGE_PAUSED |
Bridge paused |
Bridge temporarily disabled |
BRIDGE_LIMIT |
Bridge limit |
Daily/transaction limit exceeded |
BRIDGE_PROOF_INVALID |
Invalid proof |
Bridge proof failed |
BRIDGE_ALREADY_CLAIMED |
Already claimed |
Tokens already claimed |
BRIDGE_NOT_FINALIZED |
Not finalized |
Cross-chain tx not finalized |
HTTP Status Codes
REST API responses:
| Status |
Description |
| 200 |
Success |
| 400 |
Bad request / Invalid parameters |
| 401 |
Unauthorized / Invalid API key |
| 403 |
Forbidden / Rate limited |
| 404 |
Not found |
| 429 |
Too many requests |
| 500 |
Internal server error |
| 502 |
Bad gateway |
| 503 |
Service unavailable |
WebSocket Close Codes
| Code |
Description |
| 1000 |
Normal closure |
| 1001 |
Going away |
| 1002 |
Protocol error |
| 1003 |
Unsupported data |
| 1006 |
Abnormal closure |
| 1008 |
Policy violation |
| 1009 |
Message too big |
| 1011 |
Unexpected condition |
| 4000 |
Rate limited |
| 4001 |
Invalid subscription |
| 4002 |
Subscription limit |
| 4003 |
Authentication failed |
Debugging Errors
Enable Debug Logging
TypeScript:
const client = new AcdcClient({
chain: 'delta',
network: 'mainnet',
logLevel: 'debug'
});
Rust:
std::env::set_var("RUST_LOG", "acdc_sdk=debug");
let client = AcdcClient::new(Network::DeltaMainnet)?;
CLI:
ACDC_LOG=debug acdc send --to dx1... --amount 1
Get Detailed Error Info
try {
const tx = await signer.sendTransaction(request);
} catch (error) {
if (error.code === 'CALL_EXCEPTION') {
// Get revert reason
const reason = await client.call(request).catch(e => e.reason);
console.log('Revert reason:', reason);
// Simulate to get trace
const trace = await client.debug.traceCall(request);
console.log('Trace:', trace);
}
}