Developer guide

    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

    1. Open ABI Page Builder and paste the ABI (or the partial ABI you assembled).
    2. Enter the deployed address — the unverified one — and pick the network.
    3. 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.
    4. Generate the page. Read functions resolve immediately; write functions appear with typed inputs.
    5. 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

    Related Guides