Skip to main content

EVM revert decoder — decode require(), custom errors, Panic codes from Solidity

Project description

ChainErrors

Blockchain error decoder for EVM and Solana — decode reverts, panics, custom errors, and program failures.

ChainErrors is part of ChainKit, a monorepo of blockchain primitives for Rust, TypeScript, Python, Go, and Java.


Features

Feature Status
EVM Error(string) revert decoding
EVM Panic(uint256) decode with meanings
EVM custom error decoding (40+ bundled)
Solana System Program errors (0-17)
Solana SPL Token errors (0-17)
Solana Anchor framework errors (100-5000+)
Solana program log parsing
Confidence scoring (0.0 – 1.0)
Human-readable suggestions
Golden fixture test suite

Quick Start

Rust

[dependencies]
chainerrors-core = "0.1.0"
chainerrors-evm  = "0.1.0"
chainerrors-solana = "0.1.0"
use chainerrors_evm::EvmErrorDecoder;
use chainerrors_core::ErrorDecoder;

let decoder = EvmErrorDecoder::new();

// Decode a revert string
let data = hex::decode("08c379a0...").unwrap();
let result = decoder.decode(&data, None).unwrap();
println!("{result}");
// → "reverted: Not enough tokens"

// Decode a panic
let panic_data = hex::decode("4e487b71...0011").unwrap();
let result = decoder.decode(&panic_data, None).unwrap();
println!("{result}");
// → "panic 0x11: arithmetic overflow"
use chainerrors_solana::SolanaErrorDecoder;
use chainerrors_core::ErrorDecoder;

let decoder = SolanaErrorDecoder::new();

// Decode a system program error
let result = decoder.decode_error_code(
    1,
    Some("11111111111111111111111111111111"),
    None,
).unwrap();
println!("{result}");
// → "AccountAlreadyInUse(code=1)"

// Decode from program logs
let result = decoder.decode_log(
    "Program failed: custom program error: 0xbc4",
    None,
).unwrap();
println!("{result}");
// → "AccountNotInitialized(code=3012)"

TypeScript (Node.js)

npm install @chainfoundry/chainerrors
import { decodeEvmError } from '@chainfoundry/chainerrors';

const result = decodeEvmError('0x08c379a0...');
console.log(result.kind);    // "revert_string"
console.log(result.message); // "Not enough tokens"

Python

pip install chainerrors
from chainerrors import decode_evm_error

result = decode_evm_error("0x08c379a0...")
print(result["kind"])     # "revert_string"
print(result["message"])  # "Not enough tokens"

CLI

cargo install chainerrors-cli

chainerrors decode --data 0x08c379a0...
# → Error(string): "Not enough tokens"

chainerrors decode --data 0x4e487b710000...0011
# → Panic(uint256): arithmetic overflow (0x11)

EVM Error Types

Revert Strings (0x08c379a0)

require(balance >= amount, "Insufficient balance")
→ Error(string): "Insufficient balance"

Panic Codes (0x4e487b71)

Code Meaning
0x01 assert() violation
0x11 Arithmetic overflow
0x12 Division by zero
0x21 Invalid enum conversion
0x32 Array out of bounds
0x51 Zero-initialized function pointer

Bundled Custom Errors (40+)

ERC-20: InsufficientBalance, InvalidSender, InvalidReceiver, InsufficientAllowance ERC-721: InvalidOwner, NonexistentToken, IncorrectOwner, InsufficientApproval OpenZeppelin: OwnableUnauthorizedAccount, AccessControlUnauthorizedAccount, ReentrancyGuardReentrantCall, EnforcedPause Uniswap V3: T, LOK, TLU, TLM, TUM, AS, M0, M1, IIA, SPL, F0, F1, L, LS, LA EIP-4626: ExceededMaxDeposit/Mint/Withdraw/Redeem SafeERC20: FailedOperation, FailedDecreaseAllowance


Solana Error Types

System Program (18 errors)

AccountAlreadyInitialized, AccountAlreadyInUse, AccountDataTooSmall, AccountNotRentExempt, InsufficientFundsForFee, InvalidAccountDataLength, and more.

SPL Token (18 errors)

NotRentExempt, InsufficientFunds, InvalidMint, MintMismatch, OwnerMismatch, UninitializedState, AccountFrozen, and more.

Anchor Framework (40+ errors)

  • Instruction (100-103): InstructionMissing, InstructionDidNotDeserialize
  • Constraint (2000-2020): ConstraintMut, ConstraintHasOne, ConstraintSigner, ConstraintSeeds, ConstraintOwner
  • Account (3000-3017): AccountDiscriminatorMismatch, AccountNotInitialized, AccountOwnedByWrongProgram, InvalidProgramId

Program Log Parsing

"Program XYZ failed: custom program error: 0xbc4" → Code(3012) → AccountNotInitialized
"Program log: Error: insufficient funds" → Message("insufficient funds")
"Error Code: AccountNotInitialized. Error Number: 3012." → Code(3012)

Architecture

chainerrors/
├── crates/
│   ├── chainerrors-core/     # ErrorDecoder trait, DecodedError, ErrorKind, registry
│   ├── chainerrors-evm/      # EvmErrorDecoder — revert, panic, custom errors
│   └── chainerrors-solana/   # SolanaErrorDecoder — system, token, anchor, logs
├── bindings/
│   ├── node/                 # TypeScript via napi-rs
│   ├── python/               # Python via PyO3/maturin
│   ├── go/                   # Go via cgo
│   └── java/                 # Java via JNI
└── cli/                      # chainerrors-cli binary

Tests

cd chainerrors && cargo test --workspace
# 72 tests: 7 core + 17 evm + 10 golden + 35 solana + 3 doc-tests

License

MIT — see LICENSE

Contact

Built by @darshan_aqua — questions, feedback, and contributions welcome.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

chainfoundry_chainerrors-0.1.0-cp311-cp311-win_amd64.whl (282.6 kB view details)

Uploaded CPython 3.11Windows x86-64

chainfoundry_chainerrors-0.1.0-cp311-cp311-macosx_11_0_arm64.whl (330.9 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

chainfoundry_chainerrors-0.1.0-cp311-cp311-macosx_10_12_x86_64.whl (346.2 kB view details)

Uploaded CPython 3.11macOS 10.12+ x86-64

chainfoundry_chainerrors-0.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (361.1 kB view details)

Uploaded CPython 3.8manylinux: glibc 2.17+ x86-64

chainfoundry_chainerrors-0.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (346.0 kB view details)

Uploaded CPython 3.8manylinux: glibc 2.17+ ARM64

File details

Details for the file chainfoundry_chainerrors-0.1.0-cp311-cp311-win_amd64.whl.

File metadata

File hashes

Hashes for chainfoundry_chainerrors-0.1.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 702411c6caa21d7b6befa1fc3dc7d99fea8b71c94d911061f657c25b30832ad0
MD5 cd4c285dba95b81bd1d58ae677bd2131
BLAKE2b-256 54f0caaecd7690223b7617d1ffc07953d4c1c23091cc250d28c282676f1c160e

See more details on using hashes here.

Provenance

The following attestation bundles were made for chainfoundry_chainerrors-0.1.0-cp311-cp311-win_amd64.whl:

Publisher: publish-chainerrors.yml on DarshanKumar89/chainkit

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file chainfoundry_chainerrors-0.1.0-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for chainfoundry_chainerrors-0.1.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 6cdb5194626fb4a67259afd5b98c5516c5202837ed4fb113c31b867acd695581
MD5 3206cfb79e8256719a03522505db0687
BLAKE2b-256 a4ae3464346a46e635c7eacb8e206697852f561a1d69cabb0a93f6fd71694a2d

See more details on using hashes here.

Provenance

The following attestation bundles were made for chainfoundry_chainerrors-0.1.0-cp311-cp311-macosx_11_0_arm64.whl:

Publisher: publish-chainerrors.yml on DarshanKumar89/chainkit

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file chainfoundry_chainerrors-0.1.0-cp311-cp311-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for chainfoundry_chainerrors-0.1.0-cp311-cp311-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 c13b3fd3a552e5bd0e559e920728a60b3129ca5e32cd5038cdb04af111ac98bd
MD5 f19b01aec43b9108220f0f147d066354
BLAKE2b-256 46cbe9b7463e70be154e62df396c2a0eb2c26f8183b7b98e7a4a1ec7a8deb9a9

See more details on using hashes here.

Provenance

The following attestation bundles were made for chainfoundry_chainerrors-0.1.0-cp311-cp311-macosx_10_12_x86_64.whl:

Publisher: publish-chainerrors.yml on DarshanKumar89/chainkit

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file chainfoundry_chainerrors-0.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for chainfoundry_chainerrors-0.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 3f7f33af36979ac90899965c214d01c74edd3b762c11d4131c894c6b6bc00a69
MD5 91d08e608bf3d2e6a629c80d561d7e11
BLAKE2b-256 71cc9a172e94b29a2f3d2fb985a0a425022f25d5301330f7eedbcf8926ef9d97

See more details on using hashes here.

Provenance

The following attestation bundles were made for chainfoundry_chainerrors-0.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: publish-chainerrors.yml on DarshanKumar89/chainkit

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file chainfoundry_chainerrors-0.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for chainfoundry_chainerrors-0.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 e2191b9a2ddebe575ae24532f3fb8445b56a50f4e6a552bfce2862d4236a73ac
MD5 be9077b70703b1958a1897702c1d0871
BLAKE2b-256 64459a0576dbf7554c8b364689dacabb0f0f3b46d6b1ef24f10da535e89997af

See more details on using hashes here.

Provenance

The following attestation bundles were made for chainfoundry_chainerrors-0.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: publish-chainerrors.yml on DarshanKumar89/chainkit

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page