{
  "tool_id": "art-607-erc1967-proxy-slot-classifier",
  "tool_version": "1.0.0",
  "display_name": "ERC-1967 Proxy Slot Classifier",
  "mcp_name": "classify_erc1967_proxy_slot",
  "mandate_type": "compliance_control",
  "wave": 99,
  "gpu": false,
  "url": "https://ainumbers.co/chaingraph/art-607-erc1967-proxy-slot-classifier.html",
  "description": "Recomputes the four canonical EIP-1967 storage slots (bytes32(uint256(keccak256(label)) - 1) for the implementation, admin, beacon, and rollback labels) fresh on every call using the vendored keccak256 bundle already pinned in this repository, then classifies a caller-supplied (declared_slot, storage_value) pair: which of the four roles declared_slot matches, if any, and whether storage_value looks like the zero-padded 20-byte address EIP-1967 expects at that slot (extracting and EIP-55 checksumming the embedded address when it does). Zero network calls: this tool never reads live chain state -- declared_slot and storage_value are both caller-supplied, read by the caller from their own eth_getStorageAt call or a block explorer, and may already be stale by the time they are pasted in. Address/slot-level fact only: renders no upgrade-safety, admin-trustworthiness, or implementation-safety judgment, and a non-standard declared_slot does not itself prove a contract is not a proxy.",
  "input_schema_ref": "chaingraph/art-607-erc1967-proxy-slot-classifier.html#manifest",
  "consumes": [],
  "feeds": [],
  "status": "live",
  "conformance_fixtures": true,
  "compute_capability": "server",
  "compute_proof_ready": "ready",
  "compute_images": [
    {
      "system": "sha256-source",
      "image_id": "sha256:ba2594899100c01f60407bceb4cf910240b5fd70113d1cd91236d1b0bfa1c896",
      "valid_from": "2026-07-10"
    },
    {
      "system": "risc0",
      "image_id": "sha256:a1a0bc89b5b1febaeda3519f6dbade0fa5ac16beeb143c4e1b01689573567bc6",
      "valid_from": "2026-08-13"
    }
  ],
  "compute_proof": {
    "type": "ZkVmReceipt",
    "system": "risc0",
    "receiptFormat": "groth16-bn254",
    "imageId": "sha256:a1a0bc89b5b1febaeda3519f6dbade0fa5ac16beeb143c4e1b01689573567bc6",
    "seal": "Ar5/GyvqDhu8JhED2Rw/GqyMjwe9iopUDYojXgTFTXohrbAM6aaX8uZUerqWoU09JIyYRkAHkOPR9JdG59/4lA47kmUfGSwbZaYrk/Vx2uKnPmmIdb0N9v2n93Q5uSOwF1BwLlGa3Nw9Sf/QG88Nmx7XO1F2QrFO6BnMuYsggasIq6JvoQaAi2vftgdfD7CFi/XH/8ImT0jLkkn3ISQ06Sim1IztdLo2KlxqH6nFv1uLrANwy00PK0spGWR3kmH5A/FP1wEifQN6I0XmH/aRwEYJf9V+Hh3D+VI/8AnutQ0bzJ3qTGHgjh4q8gu0A2CEfgnhJRT/VEg0g3P9P8sOiw==",
    "journal": {
      "chaingraph_version": "0.4.0",
      "kernel_digest": "sha256:ba2594899100c01f60407bceb4cf910240b5fd70113d1cd91236d1b0bfa1c896",
      "output": {
        "classification_summary": "EIP-1967 \"implementation\" slot, holding address 0x5B38Da6a701c568545dCfcB03FcB875f56beddC4.",
        "declared_slot": "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc",
        "embedded_address": "0x5b38da6a701c568545dcfcb03fcb875f56beddc4",
        "embedded_address_checksummed": "0x5B38Da6a701c568545dCfcB03FcB875f56beddC4",
        "findings": [
          {
            "check": "slot_classification",
            "detail": "declared_slot matches the canonical EIP-1967 \"implementation\" slot.",
            "verdict": "CONSISTENT"
          },
          {
            "check": "storage_value_shape",
            "detail": "storage_value is a zero-padded 20-byte address, as EIP-1967 mandates for this slot family.",
            "verdict": "CONSISTENT"
          }
        ],
        "known_eip1967_slots": {
          "admin": "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103",
          "beacon": "0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50",
          "implementation": "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc",
          "rollback": "0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143"
        },
        "matched_role": "implementation",
        "not_proven": [
          {
            "detail": "declared_slot and storage_value are both caller-supplied, read by the caller from their own eth_getStorageAt call or a block explorer. This tool never fetches them and cannot confirm they are current.",
            "item": "Current on-chain storage"
          },
          {
            "detail": "A recognized slot with an address-shaped value says nothing about whether that implementation, admin, or beacon address is safe, audited, or behaves correctly.",
            "item": "Upgrade safety"
          },
          {
            "detail": "A non-standard (unrecognized) declared_slot does not prove the contract is not a proxy -- only that this particular slot is not one of the four canonical EIP-1967 slots. Some proxies use EIP-1967 for one role and a custom slot for another.",
            "item": "Proxy pattern correctness"
          }
        ],
        "overall_determination": "CONSISTENT",
        "scope_note": "Recomputes the four canonical EIP-1967 storage slots (bytes32(uint256(keccak256(label)) - 1)) fresh on every call, then classifies a caller-supplied (declared_slot, storage_value) pair: which role declared_slot matches, if any, and whether storage_value looks like the zero-padded 20-byte address EIP-1967 expects. Zero network calls -- this tool never reads live chain state. Address/slot-level fact only: it renders no upgrade-safety, admin-trustworthiness, or implementation-safety judgment.",
        "storage_value": "0x0000000000000000000000005b38da6a701c568545dcfcb03fcb875f56beddc4"
      }
    }
  },
  "export_capability": [
    "json"
  ]
}
