
Burp Suite extension for decoding Web3 JSON-RPC traffic, including smart contract function calls, responses, and ABI resolution with proxy-aware and multicall support.
Web3 Decoder is a Burp Suite Extension that helps to analyze what is going on with the operations involving smart contracts of the web3. This is mainly JSON-RPC calls to Ethereum Nodes, and nodes of other compatible networks (like Polygon, Arbitrum, BSC...)
Download the latest extension JAR — this link always serves the newest release:
Older versions are on the Releases page.
Then load it in Burp Suite:
web3-decoder.jar.Web3 tab and the Web3 Request/Web3 Response editor
tabs appear once it loads.Requires a Burp release bundled with JRE 21 (current Burp Suite versions). The JAR is self-contained — all dependencies (web3j, etc.) are included.
./gradlew jar
The extension JAR is always written to a constant path — web3-decoder/build/libs/web3-decoder.jar —
regardless of version, so you can point Burp at it once and let it auto-reload on
rebuilds. Releasing is documented in docs/RELEASING.md.
This is how our improved Web3 editor tabs look after successfully decoding your JSON-RPC requests and responses:

Below the redesigned Web3 Tab, with all the settings, detected ABIs, and more! (Thanks Claude Design!)

Detailed documentation lives in the docs/ folder:
Most block explorers supported, like etherscan.io require an API key to allow more than 1 request each 5 seconds.
The new interface allows you to manage the chains, block explorers and API keys
The extension caches the downloaded ABIs from the block explorers like etherscan. You can also add them directly from the Web3 tab, obtaining them automatically from the block explorer, or adding them manually.
Web3 Request editor tab for JSON-RPC requests (hidden on traffic with no eth_call / eth_sendRawTransaction).Web3 Response editor tab for matching JSON-RPC responses.Web3 suite tab with chain/ABI/calldata tools.eth_call calldata into function + typed args.decoded, skipped, error) and reason when skipped/failed.result for previously decoded eth_call requests.id (or by index fallback).cache, builtin, etherscan, detected, or 4byte) in decoded output.PassiveScanCheck scans HTTP response bodies (typically minified dapp JS bundles) for Solidity ABIs
and stores everything it finds in a project-scoped pool indexed by function selector.!0 / !1 boolean shortcuts emitted by Terser/esbuild/Svelte.decodeSource: "detected".eth_chainId can't be determined: the detected pool and 4byte are chain-agnostic, so the
decoder still attempts them rather than refusing outright.api.4byte.sourcify.dev.ERC1967 slot and legacy ZeppelinOS/OpenZeppelin slot.aggregate, tryAggregate, aggregate3, aggregate3Value, blockAndAggregate, tryBlockAndAggregate.chains.json and persists customizations in Burp preferences.Web3 tab listing every ABI the passive scanner has accumulated.eth_sendRawTransaction JSON-RPC calls (and their inner functions)The full, current list of bundled chains lives in
web3-decoder/src/main/resources/chains.json —
the extension now ships the Etherscan v2 multichain set (Ethereum, Sepolia, BNB Smart
Chain, Polygon, Base, Arbitrum, Linea, Blast, Optimism, Avalanche, Gnosis, Scroll,
Taiko, Berachain, and many more, including their testnets). The interface also lets you
add your own chains at runtime — any chain whose block explorer exposes Etherscan-style
APIs will work. See Features for
chain management details (including migration of deprecated chain IDs).
eth_chainId JSON-RPC request to the node in use to detect which chain we are working on, and depending on
the chain, selects a block explorer API by searching in the chains.json file.
To decode function calls we need the ABI (Application Binary Interface) of the contract, which contains all functions that can be called in the contract and their inputs and outputs. The extension resolves ABIs in this order:
api.4byte.sourcify.dev, with a synthetic ABI
built from any matching candidate.If the chain ID can't be determined (e.g. the endpoint doesn't respond to eth_chainId), the chain-scoped
steps (1–3) are skipped and the decoder still tries the chain-agnostic steps (4 and 5).
To decode traffic, the extension talks to a few external sources. These are optional and you can deactivate them from the Web3 tab. All outbound
requests are sent through Burp's own HTTP stack (api.http().sendRequest), so they
respect Burp's upstream proxy/TLS settings and appear in Burp's traffic.
| Service | Endpoint | Used for |
|---|---|---|
| JSON-RPC node (the endpoint already in your traffic) | the proxied RPC URL | eth_chainId to detect the active chain, and eth_getStorageAt to read proxy implementation slots (ERC-1967 / legacy ZeppelinOS). |
| Etherscan (v2 multichain) | https://api.etherscan.io/v2/api?chainid=… | Fetching verified contract ABIs. Falls back to a chain's legacy explorer host (/api) when v2 doesn't support that chain. |
| 4byte signature database | https://api.4byte.sourcify.dev | Resolving an unknown 4-byte function selector to candidate signatures when no ABI is available (a synthetic ABI is then built from the match). |
Privacy note: ABI lookups send the contract address to the configured block explorer, and 4byte fallback sends the function selector to
api.4byte.sourcify.dev. Downloaded ABIs are cached locally so repeat decodes don't re-query. Most explorers (e.g. etherscan.io) need an API key for more than ~1 request / 5 seconds — manage keys from theWeb3tab.The passive ABI detector reads HTTP response bodies that Burp already captured and runs entirely locally — no traffic is generated by detection itself.