One contract
Open the contract on its entity page →
One deployed contract: the hash and size of its current runtime code, what that code exposes — the four ERC-20 view functions, ERC-165, an EIP-1167 minimal proxy and its target — the proxy pattern detected in it, and its lifecycle: who deployed it, from which transaction, how often its code changed and whether it self-destructed.
GET https://tracefast.xyz/api/v1/chains/1/contracts/{address}
| Parameter | In | Type | Notes |
|---|---|---|---|
address | path | string | 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 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
- Everything here is read from the code, not from a verified source or an
ABI.
isErc20means the bytecode exposes all four ERC-20 view functions; it does not say the contract behaves like a token. proxyFamilyis a detection from the code alone. A proxy that keeps its implementation pointer in a storage slot the code does not reveal readsunknownhere — USDC in the example below is one. The proxy method lists the implementations actually observed, for every proxy kind.- An account with an EIP-7702 delegation has code too. It is answered with
bytecodeVariant: eip7702: the code is a delegation designator, not a contract. - An address with no indexed code answers
404, not an empty body.
Response
200 application/json:
{
"data": {
"chainId": 1,
"address": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
"codeHash": "0xd80d4b7c890cb9d6a4893e6b52bc34b56b25335cb13716e0d1d31383e6b41505",
"blockNumber": 6082465,
"bytecodeSize": 2186,
"bytecodeVariant": "legacy_analyzed",
"isErc20": false,
"isErc165": false,
"isEip1167Proxy": false,
"selectorCount": 6,
"erc20Interface": {
"hasDecimals": false,
"hasSymbol": false,
"hasName": false,
"hasTotalSupply": false
},
"proxyFamily": "unknown",
"proxyConfidence": 1,
"lifecycle": {
"deployBlock": 6082465,
"latestCodeBlock": 6082465,
"deployCodeHash": "0xd80d4b7c890cb9d6a4893e6b52bc34b56b25335cb13716e0d1d31383e6b41505",
"latestCodeHash": "0xd80d4b7c890cb9d6a4893e6b52bc34b56b25335cb13716e0d1d31383e6b41505",
"codeChangeCount": 1,
"isAlive": true,
"deployer": "0x95ba4cf87d6723ad9c0db21737d862be80e93911",
"origin": "0x95ba4cf87d6723ad9c0db21737d862be80e93911",
"deployTxHash": "0xe7e0fe390354509cd08c9a0168536938600ddc552b3f7cb96030ebef62e75895",
"deployTxIndex": 22,
"deployCallType": "CREATE"
}
},
"meta": {
"chain": "ethereum",
"timestamp": 1789047625242,
"cached": false,
"docs": "https://docs.tracefast.xyz/api/contract"
}
}The USDC address is the proxy; the six selectors are the proxy's own admin functions, not the token's. The token logic lives in the implementation — see the same address in the proxy method.
data
| Field | Meaning |
|---|---|
chainId | 1 — Ethereum mainnet |
address | the contract, lowercase |
codeHash | Keccak-256 hash of the current runtime code |
blockNumber | the block of the current code |
bytecodeSize | size of the current runtime code in bytes |
bytecodeVariant | legacy_raw, legacy_analyzed, or eip7702 — a delegation designator, not code |
isErc20 | true when the code exposes all four ERC-20 view functions; erc20Interface has each one |
isErc165 | true when the code exposes supportsInterface (ERC-165) |
isEip1167Proxy | true when the code is an EIP-1167 minimal proxy |
selectorCount | how many 4-byte function selectors were found in the code — listed by the selectors method |
erc20Interface | hasName, hasSymbol, hasDecimals, hasTotalSupply — which ERC-20 view functions the code exposes |
proxyFamily | the class of the contract's own current code, for example eip1967_impl, eip1967_admin, beacon, minimal_proxy, oz_v1, diamond_like, storage_delegate (the code delegates to an address it reads from storage — a Safe is one), eip7702, none, unknown. The set grows as patterns are added. It can differ from proxyFamily in the rows of the proxy method, which records the class at the time each implementation link was seen. Absent when not determined |
proxyConfidence | confidence of proxyFamily, 0 (none) to 3 (high). Absent with it |
proxyImplementation | the target of an EIP-1167 minimal proxy. Absent for every other contract |
lifecycle | how the contract came to exist and whether it still does. Absent when not yet known for the address |
lifecycle
| Field | Meaning |
|---|---|
deployBlock | the block the contract was deployed at |
deployCodeHash | hash of the code deployed at deployBlock |
latestCodeBlock | block of the latest code change; equal to deployBlock when the code never changed |
latestCodeHash | hash of the code at latestCodeBlock. Absent when not stated |
codeChangeCount | how many code states were observed, deployment included |
isAlive | false after a self-destruct |
selfDestructBlock | the block of the self-destruct; absent while the contract is alive |
deployer | the account that executed the creation — a factory, or the sender itself |
origin | the externally owned account that sent the creating transaction |
deployTxHash | the creating transaction |
deployTxIndex | its index within the block |
deployCallType | CREATE or CREATE2 |
deployer, origin, deployTxHash, deployTxIndex and deployCallType are
absent while the creation has not been indexed yet. How contract creation works:
ethereum.org — smart contracts.
Errors
| Status | code | When | details |
|---|---|---|---|
| 404 | not_found | no contract code is indexed at this address | — |
| 422 | block_not_available | reason: coverage_gap — recent blocks are in a coverage gap, and a contract deployed in them cannot be seen right now. Retry later; it is not a statement that the contract does not exist | coverageGapFromBlock, coverageGapToBlock, maxAvailableBlock |
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
- Bytecode of a contract — the code itself
- Implementations of a proxy contract — what a proxy delegates to
- Function selectors of a contract — what the code can be called with
- Events emitted by a contract — its event logs
- Contracts on the entity page — the same contract, read in the app
Last updated 22 Oct 2026, 08:06 UTC · verified against TraceFast v1.0.261 · Markdown