Skip to content
TraceFast Docs

Implementations of a proxy contract

Open the proxy on its entity page →

The implementations a proxy contract has been observed delegating to, newest first — found in its EIP-1167 bytecode, its EIP-1967 implementation or beacon slot, its OpenZeppelin v1 slot, or slot 0 of a Safe proxy — each with the blocks it was seen at and whether it has since been replaced.

GET https://tracefast.xyz/api/v1/chains/1/contracts/{address}/proxy
ParameterInTypeNotes
addresspathstringthe proxy contract, 0x-prefixed, 40 hex characters, any case

Access — an API key on the Enriched Data plan or higher (plans), or no key at all: pay per call with x402 at the same path on https://mpp.tracefast.xyz/api/v1, at the price its 402 states. As a tool for AI agents: get_contract_proxy on the MCP server. Stable — see stability.

chains/1 is a literal: other chain ids answer 404 chain_not_supported. The method takes no query parameters — an unknown one is refused rather than ignored.

What it covers, and what it does not

  • Five ways a pointer is found: EIP-1167 minimal-proxy bytecode, the EIP-1967 implementation slot, the EIP-1967 beacon slot, the OpenZeppelin v1 slot, and slot 0 of a Safe proxy — the singleton the Safe delegates to. A proxy that keeps its pointer anywhere else is not covered.
  • An empty list is not "not a proxy". It means no pointer was observed — the address may be an ordinary contract, an account, or a proxy of a kind listed nowhere above. Any address answers 200; there is no 404 for an address without code.
  • For a beacon proxy, implementation is the beacon, not the logic contract. The logic the beacon handed out over time is on the same row, in beacon — see a beacon proxy.

Response

200 application/json, USDC — four implementations over its history, the newest first. Two are shown:

{
  "data": {
    "chainId": 1,
    "address": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
    "implementations": [
      {
        "implementation": "0x43506849d7c04f9138d1a2050bbf3a0c054402dd",
        "source": "storage_oz_v1",
        "proxyFamily": "unknown",
        "confidence": 1,
        "firstSeenBlock": 18963716,
        "lastSeenBlock": 18963716,
        "slot": "0x7050c9e0f4ca769c69bd3a8ef740bc37934f8e2c036e5a723fd8ee048ed3f8c3",
        "isSelfDelegation": false,
        "supersededBy": null,
        "slotLastEvent": {
          "kind": "upgrade",
          "blockNumber": 18963716,
          "txHash": "0xae3ad89e569f27d47a8a02999a6d937c12aaa6bc50e66650e7cbd3244bde9951"
        }
      },
      {
        "implementation": "0xa2327a938febf5fec13bacfb16ae10ecbc4cbdcf",
        "source": "storage_oz_v1",
        "proxyFamily": "unknown",
        "confidence": 1,
        "firstSeenBlock": 12317814,
        "lastSeenBlock": 12317814,
        "slot": "0x7050c9e0f4ca769c69bd3a8ef740bc37934f8e2c036e5a723fd8ee048ed3f8c3",
        "isSelfDelegation": false,
        "supersededBy": "0x43506849d7c04f9138d1a2050bbf3a0c054402dd",
        "supersededByBlock": 18963716,
        "slotLastEvent": {
          "kind": "upgrade",
          "blockNumber": 18963716,
          "txHash": "0xae3ad89e569f27d47a8a02999a6d937c12aaa6bc50e66650e7cbd3244bde9951"
        }
      }
    ]
  },
  "meta": {
    "chain": "ethereum",
    "timestamp": 1789047625464,
    "cached": false,
    "docs": "https://docs.tracefast.xyz/api/contract-proxy"
  }
}

data

FieldMeaning
chainId1 — Ethereum mainnet
addressthe proxy, lowercase
implementations[]every pointer observed, newest-seen first. Empty when none was observed

An implementation

FieldMeaning
implementationthe address delegated to, lowercase. For a beacon proxy, the beacon
sourcehow it was found: eip1167 (minimal-proxy bytecode), storage_eip1967_impl (EIP-1967 implementation slot), storage_beacon (EIP-1967 beacon slot), storage_oz_v1 (OpenZeppelin v1 slot), storage_safe_singleton (slot 0 of a Safe proxy: the singleton it delegates to)
proxyFamilythe class of the proxy's code, fixed when this link was recorded: eip1167 for source: eip1167, safe for storage_safe_singleton, otherwise the same classes as proxyFamily of a contract — for example eip1967_impl, beacon, minimal_proxy; none or unknown when no pattern was recognised. The set grows as patterns are added. What the pointer is, source says — not this field
confidenceconfidence of the detection, 0 (none) to 3 (high)
firstSeenBlock, lastSeenBlockthe first and last block the pointer was observed at
slotthe storage slot the pointer was read from. Absent for eip1167, where the pointer is in the code
isSelfDelegationtrue when the proxy delegates to itself
supersededBywhether this pointer was replaced — see below
supersededByBlockthe block of the replacement. Present exactly when supersededBy is an address
slotLastEventthe last write observed on the pointer's slot, the same for every row that shares the slot: kind, blockNumber, txHash. Absent when no write to the slot is indexed
beaconon a storage_beacon row only: what the beacon handed out over time — see a beacon proxy

slotLastEvent.kind names what the write did: upgrade — an address was written to the slot, the first one included, as in the example; cleared — the slot was emptied; unset — zero was written, removing the pointer.

supersededBy has three states

Each means something different, and a client has to tell them apart:

supersededByMeaning
an addressthe pointer was replaced by it, at supersededByBlock
nullno replacement observed — this pointer is current
absentstorage cannot say: the pointer lives in the code (eip1167), or it is a beacon row

On a beacon row supersededBy speaks only of the proxy's beacon slot: an address means the proxy was switched to another beacon. It is never null there, because the logic changes inside the beacon, not in the proxy — those changes are in beacon.implementations.

A Safe's singleton follows the same lifecycle as an EIP-1967 slot. The Safe at 0x1db92e2eebc8e0c075a02bea49a2935bcd2dfcf4 answers two rows with source: storage_safe_singleton: 0x34cfac64… with supersededBy 0xbdd077f6… at block 21895238, and 0xbdd077f6… with supersededBy: null — the singleton in use now.

A beacon proxy

A beacon proxy reads its logic from a beacon, and the beacon can be upgraded for all its proxies at once. The row of such a proxy names the beacon in implementation, and beacon carries the logic history:

{
  "implementation": "0x31946680978cefb010e5f5fa8b8134c058cba7dc",
  "source": "storage_beacon",
  "proxyFamily": "none",
  "confidence": 0,
  "firstSeenBlock": 13436882,
  "lastSeenBlock": 13436882,
  "slot": "0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50",
  "isSelfDelegation": false,
  "slotLastEvent": {
    "kind": "upgrade",
    "blockNumber": 13436882,
    "txHash": "0x65f21bcbfa041792caf56dbf156496cd0ee07612511c0c38e03eeb2f369570bf"
  },
  "beacon": {
    "state": "proven",
    "provenFromBlock": 12545235,
    "completeThroughBlock": 26236750,
    "implementations": [
      { "implementation": "0x33886c99a834096f4a07ea1857d6819ca786e8b7", "startBlock": 15542644 },
      { "implementation": "0x708555f88aa9249e1d81d1acbcfd6e9cebd781e5", "startBlock": 15540580, "endBlock": 15542643 }
    ]
  }
}

The proxy 0x2279f53a28ee4c24efe1578d4dc072e5dc0f2a6a, shortened: its beacon handed out 43 logic contracts since block 12545235. The one in use now is the first entry, the one without endBlock.

Field of beaconMeaning
stateproven — the beacon's logic history is known from provenFromBlock on; not_proven — it could not be established (the beacon exposes no implementation, or reads it from another contract), which says nothing about what it hands out
provenFromBlockthe first block the history vouches for; before it, nothing is stated. Absent with not_proven
completeThroughBlockthe history is complete at least through this block — one bound shared by every beacon, not a property of this one; a change after it may not be listed yet. Absent with not_proven
implementations[]newest first: implementation, the logic contract, lowercase; startBlock, the first block of the period; endBlock, the last block of it, inclusive — absent for the current one. Periods meet: an endBlock is the next startBlock minus one. Empty with not_proven

A beacon whose logic could not be established answers "beacon": { "state": "not_proven", "implementations": [] } — for example the beacon behind 0xcdc974efcebe0eea0dc53e6e732321e405ca3703.

What proxies are and why they are used: ethereum.org — upgrading smart contracts.

Errors

This method has no errors of its own.

Malformed input, unknown parameters and the key check's 401/403/429 are the same for every method — see conventions and API keys.


Last updated 22 Oct 2026, 08:06 UTC · verified against TraceFast v1.0.261 · Markdown