{
  "$schema": "https://degreesofsatoshi.com/encyclopedia/schemas/article-v1.json",
  "schemaVersion": "1.0.0",
  "id": "ethereum-calldata",
  "canonical": "https://degreesofsatoshi.com/encyclopedia/ethereum-calldata/",
  "collection": "ethereum",
  "title": "Calldata: the bytes sent to an Ethereum contract",
  "description": "Read Ethereum calldata as transaction input bytes and distinguish it from ETH value, persistent storage and readable function names.",
  "aliases": [],
  "dates": {
    "published": "2026-10-02",
    "modified": "2026-10-02",
    "verified": "2026-10-02T18:12:41.505Z",
    "dataAsOf": "2026-10-02"
  },
  "authorship": {
    "publisher": "Degrees of Satoshi editorial project",
    "process": "AI-assisted research and drafting with a separate automated source-verification pass; no external expert or named human review is implied."
  },
  "quickAnswer": {
    "text": "Calldata is the input data supplied to an Ethereum call. For a conventional ABI-encoded function call, it begins with a four-byte selector followed by encoded arguments. The bytes can request powerful actions even when the transaction transfers zero ETH. Decoding requires the correct interface and execution context.",
    "claimId": "ethereum-calldata-quick-answer",
    "sourceIds": [
      "solidity-abi",
      "eth-transactions"
    ]
  },
  "keyFacts": [
    {
      "label": "Selector",
      "value": "The first four bytes of a conventional ABI function call identify a function signature.",
      "sourceIds": [
        "solidity-abi"
      ],
      "id": "selector",
      "claimId": "ethereum-calldata-fact-selector"
    },
    {
      "label": "Arguments",
      "value": "Arguments follow the selector using ABI encoding rules.",
      "sourceIds": [
        "solidity-abi"
      ],
      "id": "arguments",
      "claimId": "ethereum-calldata-fact-arguments"
    },
    {
      "label": "Value",
      "value": "The transaction’s ETH value and input data are distinct fields.",
      "sourceIds": [
        "eth-transactions"
      ],
      "id": "value",
      "claimId": "ethereum-calldata-fact-value"
    }
  ],
  "prerequisites": [
    "ethereum-smart-contracts"
  ],
  "sections": [
    {
      "id": "call",
      "heading": "A zero-value transaction can still change assets",
      "sourceIds": [
        "erc20",
        "solidity-abi"
      ],
      "paragraphs": [
        "Calling approve can authorize a spender without sending ETH as transaction value. Calling a token’s transfer function expresses its recipient and amount in arguments rather than in the transaction’s ETH-value field.",
        "A wallet summary that shows “0 ETH” therefore does not fully describe the requested action. Read the destination contract, function and arguments."
      ]
    },
    {
      "id": "decode",
      "heading": "An ABI is a decoding schema, not a safety certificate",
      "sourceIds": [
        "solidity-abi"
      ],
      "paragraphs": [
        "Static and dynamic argument types use different encoding rules. Strings and arrays involve lengths and offsets; arbitrary bytes cannot be reliably interpreted by guessing where an address appears.",
        "A four-byte selector can collide across different signatures. A plausible decoded label is stronger when paired with the correct verified implementation and ABI."
      ]
    },
    {
      "id": "lifetime",
      "heading": "Input is different from contract storage",
      "sourceIds": [
        "solidity-abi",
        "solidity-layout",
        "eth-jsonrpc"
      ],
      "paragraphs": [
        "Call input supplies data for execution. A contract may use it to update persistent state, but simply placing bytes in calldata is not the same as writing a named state variable.",
        "Transaction input included in a public chain can be inspected by others. It should not be treated as a private message to the contract."
      ]
    }
  ],
  "faq": [
    {
      "question": "Can I understand any transaction just from its selector?",
      "answer": "No. You need the arguments, destination code and relevant state, and a selector is not globally unique. Nested calls and proxy execution can add further context.",
      "sourceIds": [
        "solidity-abi",
        "oz-proxy"
      ]
    }
  ],
  "claims": [
    {
      "id": "ethereum-calldata-quick-answer",
      "articleSlug": "ethereum-calldata",
      "statement": "Calldata is the input data supplied to an Ethereum call. For a conventional ABI-encoded function call, it begins with a four-byte selector followed by encoded arguments. The bytes can request powerful actions even when the transaction transfers zero ETH. Decoding requires the correct interface and execution context.",
      "sourceIds": [
        "source-6219cf92582a012d",
        "source-c4666896686db30e"
      ],
      "sourceLocators": [
        {
          "sourceId": "source-6219cf92582a012d",
          "locator": "Function Selector; Argument Encoding; Events; Errors; JSON"
        },
        {
          "sourceId": "source-c4666896686db30e",
          "locator": "The transaction lifecycle; Typed transaction envelope"
        }
      ],
      "scope": {
        "collection": "ethereum",
        "dataAsOf": "2026-10-02",
        "blockHeight": null
      },
      "qualification": "",
      "evidenceStatus": "documented",
      "verification": {
        "status": "verified",
        "method": "independent automated source review",
        "checkedAt": "2026-10-02T18:12:41.505Z",
        "reviewer": "Codex independent automated reviewer /root/verify_ethereum_100",
        "notes": [
          "Checked selector/arguments and static/dynamic encodings against Solidity ABI; ERC-20 approve/transfer signatures support zero-ETH-value token actions.",
          "Added RPC input-field evidence for public transaction input. Selector collisions follow from the finite 32-bit identifier and are not treated as unique proof of behavior."
        ]
      }
    },
    {
      "id": "ethereum-calldata-fact-selector",
      "articleSlug": "ethereum-calldata",
      "statement": "Selector: The first four bytes of a conventional ABI function call identify a function signature.",
      "sourceIds": [
        "source-6219cf92582a012d"
      ],
      "sourceLocators": [
        {
          "sourceId": "source-6219cf92582a012d",
          "locator": "Function Selector; Argument Encoding; Events; Errors; JSON"
        }
      ],
      "scope": {
        "collection": "ethereum",
        "dataAsOf": "2026-10-02",
        "blockHeight": null
      },
      "qualification": "",
      "evidenceStatus": "documented",
      "verification": {
        "status": "verified",
        "method": "independent automated source review",
        "checkedAt": "2026-10-02T18:12:41.505Z",
        "reviewer": "Codex independent automated reviewer /root/verify_ethereum_100",
        "notes": [
          "Checked selector/arguments and static/dynamic encodings against Solidity ABI; ERC-20 approve/transfer signatures support zero-ETH-value token actions.",
          "Added RPC input-field evidence for public transaction input. Selector collisions follow from the finite 32-bit identifier and are not treated as unique proof of behavior."
        ]
      }
    },
    {
      "id": "ethereum-calldata-fact-arguments",
      "articleSlug": "ethereum-calldata",
      "statement": "Arguments: Arguments follow the selector using ABI encoding rules.",
      "sourceIds": [
        "source-6219cf92582a012d"
      ],
      "sourceLocators": [
        {
          "sourceId": "source-6219cf92582a012d",
          "locator": "Function Selector; Argument Encoding; Events; Errors; JSON"
        }
      ],
      "scope": {
        "collection": "ethereum",
        "dataAsOf": "2026-10-02",
        "blockHeight": null
      },
      "qualification": "",
      "evidenceStatus": "documented",
      "verification": {
        "status": "verified",
        "method": "independent automated source review",
        "checkedAt": "2026-10-02T18:12:41.505Z",
        "reviewer": "Codex independent automated reviewer /root/verify_ethereum_100",
        "notes": [
          "Checked selector/arguments and static/dynamic encodings against Solidity ABI; ERC-20 approve/transfer signatures support zero-ETH-value token actions.",
          "Added RPC input-field evidence for public transaction input. Selector collisions follow from the finite 32-bit identifier and are not treated as unique proof of behavior."
        ]
      }
    },
    {
      "id": "ethereum-calldata-fact-value",
      "articleSlug": "ethereum-calldata",
      "statement": "Value: The transaction’s ETH value and input data are distinct fields.",
      "sourceIds": [
        "source-c4666896686db30e"
      ],
      "sourceLocators": [
        {
          "sourceId": "source-c4666896686db30e",
          "locator": "The transaction lifecycle; Typed transaction envelope"
        }
      ],
      "scope": {
        "collection": "ethereum",
        "dataAsOf": "2026-10-02",
        "blockHeight": null
      },
      "qualification": "",
      "evidenceStatus": "documented",
      "verification": {
        "status": "verified",
        "method": "independent automated source review",
        "checkedAt": "2026-10-02T18:12:41.505Z",
        "reviewer": "Codex independent automated reviewer /root/verify_ethereum_100",
        "notes": [
          "Checked selector/arguments and static/dynamic encodings against Solidity ABI; ERC-20 approve/transfer signatures support zero-ETH-value token actions.",
          "Added RPC input-field evidence for public transaction input. Selector collisions follow from the finite 32-bit identifier and are not treated as unique proof of behavior."
        ]
      }
    }
  ],
  "sources": [
    {
      "id": "solidity-abi",
      "label": "Contract ABI Specification",
      "publisher": "Solidity contributors",
      "url": "https://docs.soliditylang.org/en/v0.8.30/abi-spec.html",
      "locator": "Function Selector; Argument Encoding; Events; Errors; JSON",
      "note": "ABI encoding, selectors, event topics and event data.",
      "version": "Solidity 0.8.30 documentation",
      "checkedAt": "2026-10-02T17:03:42.824Z",
      "contentSha256": "f5889011070e9e83487b6fd899f56ccecd0c08382c998cd2f8860daafd27dc7b",
      "recordId": "source-6219cf92582a012d"
    },
    {
      "id": "eth-transactions",
      "label": "Ethereum transactions",
      "publisher": "ethereum.org contributors",
      "url": "https://ethereum.org/en/developers/docs/transactions/",
      "locator": "The transaction lifecycle; Typed transaction envelope",
      "note": "Signed transaction fields, nonces, propagation, inclusion and transaction types.",
      "version": null,
      "checkedAt": "2026-10-02T17:03:41.854Z",
      "contentSha256": "2eb9d9cb65efec673d9bb3327961aa14a0e354b612e149c5a6b733032977fee7",
      "recordId": "source-c4666896686db30e"
    },
    {
      "id": "erc20",
      "label": "ERC-20 Token Standard",
      "publisher": "Ethereum Improvement Proposals",
      "url": "https://eips.ethereum.org/EIPS/eip-20",
      "locator": "totalSupply; balanceOf; transfer; decimals; approve; allowance; transferFrom; Transfer",
      "note": "Token supply, displayed units and balance accounting.",
      "version": "ERC-20",
      "checkedAt": "2026-10-02T17:03:45.826Z",
      "contentSha256": "98bda5e4707841a68684879878c4c165fdaa47d89ed69ebf232ab9be06ff050e",
      "recordId": "source-ac4ad503a55127bb"
    },
    {
      "id": "solidity-layout",
      "label": "Layout of State Variables in Storage and Transient Storage",
      "publisher": "Solidity contributors",
      "url": "https://docs.soliditylang.org/en/v0.8.30/internals/layout_in_storage.html",
      "locator": "Layout of State Variables; Mappings and Dynamic Arrays",
      "note": "Persistent storage slots, packing and mappings.",
      "version": "Solidity 0.8.30 documentation",
      "checkedAt": "2026-10-02T17:03:42.820Z",
      "contentSha256": "de5fd67613e71fdb6b46e30bcb1c7e63380ea40d9521e757cfba947a5ee8d738",
      "recordId": "source-2b10f2b55ba1af87"
    },
    {
      "id": "eth-jsonrpc",
      "label": "Ethereum JSON-RPC",
      "publisher": "ethereum.org contributors",
      "url": "https://ethereum.org/en/developers/docs/apis/json-rpc/",
      "locator": "eth_getTransactionByHash; eth_getTransactionReceipt; eth_call; eth_getLogs; eth_getCode; eth_estimateGas; eth_getBalance; eth_getStorageAt; eth_getTransactionCount; default block parameter",
      "note": "RPC response fields, transaction receipts, call simulation and log filtering.",
      "version": null,
      "checkedAt": "2026-10-02T17:03:42.060Z",
      "contentSha256": "ed13997ec4f415dff80883add0730d4e64bcc8c17b95dd4f6c27aed0241a4073",
      "recordId": "source-a5154b4118a3d15f"
    },
    {
      "id": "oz-proxy",
      "label": "Proxy contracts",
      "publisher": "OpenZeppelin",
      "url": "https://docs.openzeppelin.com/contracts/5.x/api/proxy",
      "locator": "TransparentUpgradeableProxy; UUPSUpgradeable; ERC1967Proxy",
      "note": "Proxy implementation slots, delegated execution and upgrade authority.",
      "version": "OpenZeppelin Contracts 5.x",
      "checkedAt": "2026-10-02T17:03:43.024Z",
      "contentSha256": "58fe40b9eaa6d3cf92e48caed2d8db247a790b1a3055948095a48c7f8eb77854",
      "recordId": "source-16bb921e662a5173"
    }
  ],
  "related": {
    "articles": [
      "function-selectors",
      "ethereum-contract-abis",
      "ethereum-wallet-requests",
      "ethereum-access-lists"
    ],
    "dossiers": [],
    "wallets": []
  },
  "revisionHistory": [
    {
      "date": "2026-10-02",
      "kind": "published",
      "summary": "First publication after primary-source research and independent automated verification."
    }
  ],
  "citation": "Degrees of Satoshi editorial project. “Calldata: the bytes sent to an Ethereum contract.” Published 2026-10-02; updated 2026-10-02. https://degreesofsatoshi.com/encyclopedia/ethereum-calldata/"
}
