Decode calldata: function and arguments of an EVM call
Decode EVM transaction calldata into the function and its arguments with viem: give the function signature (transfer(address,uint256)), or leave it out to try common ERC-20, ERC-721, ERC-1155, WETH, permit and multicall functions by selector. Numbers come back as decimal strings. Use to read what a pending or past transaction does before signing; get calldata from eth_tx. A selector that does not match is 422, uncharged.
Inputs
| Name | Type | Description |
|---|---|---|
data (required) | string | 0x calldata (selector plus ABI-encoded arguments), up to 8 KB |
signature | string | Optional function signature such as transfer(address,uint256) |
Request
Over HTTP, with a card key from /credits:
curl -H "Authorization: Bearer adt_…" "https://agent-data-tools.revmesh2074.workers.dev/evm/decode-calldata?data=0xa9059cbb000000000000000000000000d8da6bf26964af9d7eed9e03e53415d37aa960450000000000000000000000000000000000000000000000000000000000989680"
Or one of your 25 free calls, no key:
curl "https://agent-data-tools.revmesh2074.workers.dev/evm/decode-calldata?data=0xa9059cbb000000000000000000000000d8da6bf26964af9d7eed9e03e53415d37aa960450000000000000000000000000000000000000000000000000000000000989680&trial=1"
Without a key, the same URL answers 402 Payment Required with x402 and MPP terms, so an agent with a wallet pays per call in USDC (Base, Polygon, Arbitrum or Solana over x402; Base or Tempo over MPP) and retries.
Example result
{
"selector": "0xa9059cbb",
"decoded": true,
"function": "transfer(address,uint256)",
"args": [
{
"type": "address",
"value": "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045"
},
{
"type": "uint256",
"value": "10000000"
}
]
}
From an AI agent (MCP)
Add the MCP server to Claude, Cursor or any MCP client. This tool is evm_decode_calldata, and the first 25 successful calls are free:
https://agent-data-tools.revmesh2074.workers.dev/mcp