Skip to content
Development
Skill

/contract-decode

EVM contract error and calldata decoder. Use when: user pastes hex revert data, calldata, function selector, or mentions custom error, execution reverted, 4byte, decode. Input contains 0x + 8+ hex chars.

From plugin
sd0x-dev-flow
195102 skills16 agents5 hooks

Claude Code

$ npx -y skills add sd0xdev/sd0x-harness --skill contract-decode --agent claude-code

SKILL.md

contract-decode.SKILL.md
name: contract-decode
description: "EVM contract error and calldata decoder. Use when: user pastes hex revert data, calldata, function selector, or mentions custom error, execution reverted, 4byte, decode. Input contains 0x + 8+ hex chars."
allowed-tools: Read, Grep, Glob, Bash, WebFetch
context: fork

Contract Decode — EVM Error & Calldata Decoder

Decode EVM contract function selectors, custom errors, calldata, and revert data.

Trigger

  • Keywords: revert, selector, 4byte, calldata, decode, custom error, execution reverted, abi decode
  • Message contains `0x` + 8+ hex chars (selector or revert data)

When NOT to Use

  • Standard `Error(string)` revert already handled by your codebase
  • Non-EVM chain errors
  • Only need error code definitions (not hex decoding)

Input Parsing

Extract from user input:

| Field | Source | Example | |-------|--------|---------| | `revertData` | Error data or user-pasted hex | `0xaca553e4` | | `calldata` | Transaction data | `0x5e15c749000...1c05` | | `contractAddr` | Contract address | `0x5874...f064` | | `chainId` | Chain identifier | `1` (Ethereum mainnet) |

Workflow

Step 1: Classify input → Step 2: Local fast decode → Step 3: ABI query → Step 4: Precise decode → Report

Step 1: Classify Input

| Length | Classification | Next Step | |--------|---------------|-----------| | 4 bytes (`0x` + 8 hex) | Pure selector | Step 2 | | > 4 bytes, with selector prefix | Calldata or revert data | Step 2 + Step 3 | | Contract address | Need ABI first | Step 3 |

Step 2: Local Fast Decode (no external dependencies)

Try in order:

**2a. Standard error decode**

| Selector | Type | Decode Method | |----------|------|---------------| | `0x08c379a0` | `Error(string)` | `cast abi-decode "Error(string)" <data>` | | `0x4e487b71` | `Panic(uint256)` | `cast abi-decode "Panic(uint256)" <data>` → lookup panic code |

Panic code reference:

| Code | Meaning | |------|---------| | 0x00 | generic compiler panic | | 0x01 | assert failure | | 0x11 | arithmetic overflow | | 0x12 | division by zero | | 0x21 | enum conversion | | 0x22 | storage encoding | | 0x31 | pop empty array | | 0x32 | array out of bounds | | 0x41 | too much memory | | 0x51 | zero function pointer |

**2b. Selector lookup (`cast`)** — optional, skip if `cast` not installed

timeout 5 cast 4byte <selector>

If `cast` is unavailable or crashes, fall back to Step 3 API query.

Step 3: External API Query

See `references/apis.md` for full endpoints and parameters.

**Query strategy**:

Has contract address? → 3a. ABI path (precise) → get ABI → Step 4
No contract address?  → 3b. Selector DB path (candidates) → get signature candidates

**3a. ABI path** (has contract address + chainId)

1. **Sourcify** (free, no key) → get full ABI JSON 2. **Etherscan v2** (needs key, free tier 3 req/s) → get ABI JSON 3. If proxy → get implementation address → re-query ABI

**3b. Selector DB path** (no contract address or ABI query failed)

1. **4byte.directory** API → may return multiple candidates 2. Multiple candidates → mark `confidence: low`, list all possibilities

Step 4: Precise Decode

With ABI, use `cast` (if available):

# Decode revert data (needs ABI file)
cast decode-error <revert_data> --abi <abi_file>

# Decode calldata
cast decode-calldata <calldata> --abi <abi_file>

# Or decode with signature directly
cast calldata-decode "functionName(type1,type2)" <calldata>

Without ABI but with signature candidates:

cast abi-decode "functionName(type1,type2)" <data_without_selector>

Output Format

## Contract Decode Report

| Field | Value |
|-------|-------|
| Type | function call / revert error / event |
| Selector | `0x5e15c749` |
| Signature | `finalizeWithdrawal(uint256)` |
| Decoded Args | `tokenId: 7173` |
| Confidence | High (verified ABI) / Medium (selector DB) / Low (multiple candidates) |
| Source | Sourcify / Etherscan / 4byte.directory / cast |
| Contract | `0x5874...f064` |
| Chain | Ethereum Mainnet (chainId: 1) |

### Raw Data

- Revert: `0xaca553e4`
- Calldata: `0x5e15c749000...1c05`

Multiple candidates:

### Ambiguous Candidates

| # | Signature | Confidence |
|---|-----------|------------|
| 1 | `WithdrawalRequestDoesNotExist()` | Likely (context match) |
| 2 | `SomeOtherError()` | Unlikely |

References

| File | Purpose | When to Read | |------|---------|-------------| | `references/apis.md` | API endpoints, parameters, rate limits | Before Step 3 |

Verification

  • [ ] Input correctly classified (selector / calldata / revert data)
  • [ ] Local fast decode attempted (Error/Panic/cast)
  • [ ] External query returned results or marked as failed
  • [ ] Confidence level indicated
  • [ ] Multiple candidates listed (if any)

Examples

Input: Decode 0xaca553e4
Action: 4 bytes → selector → cast 4byte → 4byte.directory → return candidate signatures
Input: What is this revert data 0x08c379a0000...
Action: selector = Error(string) → local cast abi-decode → return error message
Input: Decode this with contract 0x5874..., chainId 1, revert data 0xaca553e4
Action: Has contract + chainId → Sourcify ABI → cast decode-error → precise decode
Read more
@sd0xdev
Ships withsd0x-dev-flow

Language: English | 繁體中文 | 简体中文 | 日本語 | 한국어 | Español The harness layer for Claude Code. Let the model choose the path. Keep "done" verifiable. Claude has discretion inside a closed, test-pinned anchor set.

195102 skills16 agents
Get the whole plugin

Stars on GitHub

Momentum

stars in total
195
Star history of sd0xdev/sd0x-dev-flow on GitHub, a chart by star-history.com

Other skills on sd0x-dev-flow.

adr

adr

Write an Architecture Decision Record (ADR) for a feature — Context / Decision / Status / Consequences / Alternatives, filed as…

agentctl-setup

agentctl-setup

Install and set up the optional agentctl mod (task scope, refusal before execution, evidence that goes stale, model-free…

architecture

architecture

Architecture design and documentation. Produces 3-architecture.md with component diagrams, data flow, integration points, and…

ask

ask

Context-aware Q&A with auto context gathering. Use when: user has a quick question about codebase, git history, rules, docs, or…

best-practices

best-practices

Industry best practices conformance audit with mandatory adversarial debate. Produces audit artifact: verdict (OK/WARN/FAIL) +…

bug-fix

bug-fix

Bug fix workflow. Use when: fixing bugs, resolving issues, regression fixes. Not for: new features (use feature-dev),…

More skills from other plugins.

brainstorming
Auto-invoked

brainstorming

You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or…

@obra@obraInstall Skill
ask-matt

ask-matt

Ask which skill or flow fits your situation. A router over the skills in this repo.

skills2w309k
@mattpocock@mattpocockInstall Skill
accessibility
Auto-invoked

accessibility

Design, implement, and audit accessible UI to WCAG 2.2 Level AA across Web, iOS, and Android — semantic ARIA roles and labels,…

ecc2w293k
@affaan-m@affaan-mInstall Skill
compiler-commit

compiler-commit

Use when you want to verify compiler changes and commit with the correct convention. Runs tests, lint, and format, then commits…

react5d252k
@facebook@facebookInstall Skill

Questions about contract-decode.

Which coding agents can use contract-decode?
contract-decode installs in Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot, OpenCode and Windsurf with the skills CLI, using each agent's flag shown on this page. Flowy's auto-invocation, which fires a skill when your prompt matches, runs in Claude Code only.