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
| Parameter | In | Type | Notes |
|---|---|---|---|
address | path | string | the 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 no404for an address without code. - For a beacon proxy,
implementationis the beacon, not the logic contract. The logic the beacon handed out over time is on the same row, inbeacon— 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
| Field | Meaning |
|---|---|
chainId | 1 — Ethereum mainnet |
address | the proxy, lowercase |
implementations[] | every pointer observed, newest-seen first. Empty when none was observed |
An implementation
| Field | Meaning |
|---|---|
implementation | the address delegated to, lowercase. For a beacon proxy, the beacon |
source | how 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) |
proxyFamily | the 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 |
confidence | confidence of the detection, 0 (none) to 3 (high) |
firstSeenBlock, lastSeenBlock | the first and last block the pointer was observed at |
slot | the storage slot the pointer was read from. Absent for eip1167, where the pointer is in the code |
isSelfDelegation | true when the proxy delegates to itself |
supersededBy | whether this pointer was replaced — see below |
supersededByBlock | the block of the replacement. Present exactly when supersededBy is an address |
slotLastEvent | the 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 |
beacon | on 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:
supersededBy | Meaning |
|---|---|
| an address | the pointer was replaced by it, at supersededByBlock |
null | no replacement observed — this pointer is current |
| absent | storage 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 beacon | Meaning |
|---|---|
state | proven — 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 |
provenFromBlock | the first block the history vouches for; before it, nothing is stated. Absent with not_proven |
completeThroughBlock | the 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.
Related pages
- One contract — the proxy pattern detected in the code
- Bytecode of a contract — the code of an implementation
- Function selectors of a contract — what an implementation can be called with
- Contracts on the entity page — proxy relationships, read in the app
Last updated 22 Oct 2026, 08:06 UTC · verified against TraceFast v1.0.261 · Markdown