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
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distributions
Built Distributions
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file chainfoundry_chainerrors-0.1.0-cp311-cp311-win_amd64.whl.
File metadata
- Download URL: chainfoundry_chainerrors-0.1.0-cp311-cp311-win_amd64.whl
- Upload date:
- Size: 282.6 kB
- Tags: CPython 3.11, Windows x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
702411c6caa21d7b6befa1fc3dc7d99fea8b71c94d911061f657c25b30832ad0
|
|
| MD5 |
cd4c285dba95b81bd1d58ae677bd2131
|
|
| BLAKE2b-256 |
54f0caaecd7690223b7617d1ffc07953d4c1c23091cc250d28c282676f1c160e
|
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
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
chainfoundry_chainerrors-0.1.0-cp311-cp311-win_amd64.whl -
Subject digest:
702411c6caa21d7b6befa1fc3dc7d99fea8b71c94d911061f657c25b30832ad0 - Sigstore transparency entry: 1060634003
- Sigstore integration time:
-
Permalink:
DarshanKumar89/chainkit@74ad734886840a2fe11aa19b69fed950744023b3 -
Branch / Tag:
refs/tags/chainerrors-v0.1.0 - Owner: https://github.com/DarshanKumar89
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-chainerrors.yml@74ad734886840a2fe11aa19b69fed950744023b3 -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file chainfoundry_chainerrors-0.1.0-cp311-cp311-macosx_11_0_arm64.whl.
File metadata
- Download URL: chainfoundry_chainerrors-0.1.0-cp311-cp311-macosx_11_0_arm64.whl
- Upload date:
- Size: 330.9 kB
- Tags: CPython 3.11, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6cdb5194626fb4a67259afd5b98c5516c5202837ed4fb113c31b867acd695581
|
|
| MD5 |
3206cfb79e8256719a03522505db0687
|
|
| BLAKE2b-256 |
a4ae3464346a46e635c7eacb8e206697852f561a1d69cabb0a93f6fd71694a2d
|
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
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
chainfoundry_chainerrors-0.1.0-cp311-cp311-macosx_11_0_arm64.whl -
Subject digest:
6cdb5194626fb4a67259afd5b98c5516c5202837ed4fb113c31b867acd695581 - Sigstore transparency entry: 1060633781
- Sigstore integration time:
-
Permalink:
DarshanKumar89/chainkit@74ad734886840a2fe11aa19b69fed950744023b3 -
Branch / Tag:
refs/tags/chainerrors-v0.1.0 - Owner: https://github.com/DarshanKumar89
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-chainerrors.yml@74ad734886840a2fe11aa19b69fed950744023b3 -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file chainfoundry_chainerrors-0.1.0-cp311-cp311-macosx_10_12_x86_64.whl.
File metadata
- Download URL: chainfoundry_chainerrors-0.1.0-cp311-cp311-macosx_10_12_x86_64.whl
- Upload date:
- Size: 346.2 kB
- Tags: CPython 3.11, macOS 10.12+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c13b3fd3a552e5bd0e559e920728a60b3129ca5e32cd5038cdb04af111ac98bd
|
|
| MD5 |
f19b01aec43b9108220f0f147d066354
|
|
| BLAKE2b-256 |
46cbe9b7463e70be154e62df396c2a0eb2c26f8183b7b98e7a4a1ec7a8deb9a9
|
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
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
chainfoundry_chainerrors-0.1.0-cp311-cp311-macosx_10_12_x86_64.whl -
Subject digest:
c13b3fd3a552e5bd0e559e920728a60b3129ca5e32cd5038cdb04af111ac98bd - Sigstore transparency entry: 1060633848
- Sigstore integration time:
-
Permalink:
DarshanKumar89/chainkit@74ad734886840a2fe11aa19b69fed950744023b3 -
Branch / Tag:
refs/tags/chainerrors-v0.1.0 - Owner: https://github.com/DarshanKumar89
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-chainerrors.yml@74ad734886840a2fe11aa19b69fed950744023b3 -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file chainfoundry_chainerrors-0.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.
File metadata
- Download URL: chainfoundry_chainerrors-0.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 361.1 kB
- Tags: CPython 3.8, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3f7f33af36979ac90899965c214d01c74edd3b762c11d4131c894c6b6bc00a69
|
|
| MD5 |
91d08e608bf3d2e6a629c80d561d7e11
|
|
| BLAKE2b-256 |
71cc9a172e94b29a2f3d2fb985a0a425022f25d5301330f7eedbcf8926ef9d97
|
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
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
chainfoundry_chainerrors-0.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl -
Subject digest:
3f7f33af36979ac90899965c214d01c74edd3b762c11d4131c894c6b6bc00a69 - Sigstore transparency entry: 1060634069
- Sigstore integration time:
-
Permalink:
DarshanKumar89/chainkit@74ad734886840a2fe11aa19b69fed950744023b3 -
Branch / Tag:
refs/tags/chainerrors-v0.1.0 - Owner: https://github.com/DarshanKumar89
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-chainerrors.yml@74ad734886840a2fe11aa19b69fed950744023b3 -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file chainfoundry_chainerrors-0.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.
File metadata
- Download URL: chainfoundry_chainerrors-0.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
- Upload date:
- Size: 346.0 kB
- Tags: CPython 3.8, manylinux: glibc 2.17+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e2191b9a2ddebe575ae24532f3fb8445b56a50f4e6a552bfce2862d4236a73ac
|
|
| MD5 |
be9077b70703b1958a1897702c1d0871
|
|
| BLAKE2b-256 |
64459a0576dbf7554c8b364689dacabb0f0f3b46d6b1ef24f10da535e89997af
|
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
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
chainfoundry_chainerrors-0.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl -
Subject digest:
e2191b9a2ddebe575ae24532f3fb8445b56a50f4e6a552bfce2862d4236a73ac - Sigstore transparency entry: 1060633929
- Sigstore integration time:
-
Permalink:
DarshanKumar89/chainkit@74ad734886840a2fe11aa19b69fed950744023b3 -
Branch / Tag:
refs/tags/chainerrors-v0.1.0 - Owner: https://github.com/DarshanKumar89
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-chainerrors.yml@74ad734886840a2fe11aa19b69fed950744023b3 -
Trigger Event:
workflow_dispatch
-
Statement type: