How to Interact with an Unverified Smart Contract
A contract with no verified source shows no Read or Write tab on the explorer — but the bytecode still works. All you need is the ABI, and you can drive it from a browser UI in about a minute.
Why the Write Tab Is Missing
Block explorers generate their Read/Write UI from verified source code. If nobody uploaded the Solidity sources and matched them against the deployed bytecode, the explorer has no ABI to render — so it shows the raw bytecode and nothing else. This is extremely common for:
- →Freshly deployed contracts you have not verified yet
- →Factory-deployed clones and minimal proxies (EIP-1167)
- →Contracts on chains whose explorer has no verification service
- →Private or internal deployments where source is intentionally withheld
Verification is a convenience for humans. The chain does not care: any address can be called with correctly encoded calldata, verified or not.
Step 1 — Get an ABI
You compiled it yourself
The ABI is in your build output: artifacts/<Contract>.sol/<Contract>.json (Hardhat/Foundry) under the abi key, or out/ with Foundry. Copy just the array.
It follows a known standard
ERC-20, ERC-721, ERC-1155, Ownable, AccessControl and most OpenZeppelin bases have fixed interfaces. Paste the standard ABI — every function that exists in the bytecode will work, and the ones that do not will simply revert.
A twin is verified elsewhere
Clones and multi-chain deployments share bytecode. Find the same contract on another chain (or the implementation behind a proxy) and reuse that ABI.
Nothing else works: recover selectors
Tools that disassemble bytecode can list the 4-byte selectors a contract dispatches. Look each one up in a public signature database and hand-write a partial ABI containing only the functions you need. A partial ABI is completely valid — it does not have to describe the whole contract.
Step 2 — Build the UI
- Open ABI Page Builder and paste the ABI (or the partial ABI you assembled).
- Enter the deployed address — the unverified one — and pick the network.
- If the chain is not a preset, add it as a custom network with its chain ID, RPC URL, native currency symbol and explorer URL.
- Generate the page. Read functions resolve immediately; write functions appear with typed inputs.
- Connect a wallet and send transactions exactly as you would on a verified contract.
Pitfalls Worth Knowing
- A wrong ABI does not error politely — the call is encoded against a selector the contract does not have, and it reverts with no reason. If every function reverts, suspect the ABI, not the chain.
- Token amounts are raw integers. 1 USDC is 1000000 (6 decimals), not 1. Read decimals() first.
- Addresses must be valid; mixed-case addresses are checksummed and a typo will be rejected before the call is sent.
- If the address is a proxy, the ABI you need is the implementation ABI, used at the proxy address.
- Read calls cost nothing and never revert state — use them to sanity-check the ABI before spending gas on a write.
👉 Have an ABI for that unverified contract?
Build a contract page