How to verify a contract address before interacting
A repeatable procedure for confirming that an address is the contract you think it is: checksum validation, sourcing the address from an authoritative place, reading verified source on a block explorer, resolving proxy implementations, and ruling out lookalikes.
Quick answer
Never trust an address you copied from a chat, ad, or search result. Confirm it passes an EIP-55 mixed-case checksum, obtain it from the project's own authenticated channel, and open it on a block explorer to confirm the source code is verified. If it is a proxy, resolve and check the implementation too, and rule out lookalike addresses before signing anything.
Key points
- A mixed-case (EIP-55) address carries an internal checksum; a mistyped one usually fails validation, but all-lowercase addresses have no such protection.
- Sourcing matters more than any single check: get the address from the project's own verified account or documentation, never from search ads, DMs, or reply guys.
- A green 'verified source' badge on a block explorer means the published code matches the deployed bytecode. It does not mean the code is safe or audited.
- Proxy contracts delegate logic to a separate implementation address that can change; verify both the proxy and its current implementation.
- Lookalike and address-poisoning attacks rely on you matching only the first and last characters. Compare the full string.
Why an address needs verification at all
An account address on an EVM chain is a 20-byte value, normally written as 40 hexadecimal characters after a 0x prefix. Nothing about that string tells you what it is. The same format is used for a person’s wallet, a legitimate token, a router used by a decentralized exchange, and a contract written specifically to take your funds. The protocol does not distinguish between them, and it will not stop you from sending assets to, or granting an approval to, the wrong one. Verification is the manual work of establishing, before you sign, that a given address is the specific contract you intend to interact with.
The failure modes are consistent. People paste an address from a Telegram message, a search advertisement, or a screenshot; they trust an address because a website displayed it; or they copy an address out of their own transaction history without realizing it was planted there. Each of the steps below closes one of those gaps.
Step one: validate the checksum
Ethereum addresses are case-insensitive at the protocol level, so 0x5aaeb6... and 0x5AAEB6... refer to the same account. EIP-55 exploits that spare capacity by encoding a checksum in the pattern of upper- and lower-case letters. The algorithm hashes the lowercase address with Keccak-256 and, for each alphabetic character, capitalizes it when the corresponding hash nibble is 8 or greater. The result is a mixed-case address that most wallets will reject if a character is wrong.
0x5aAeb6053F3E94C9b9A09f33669435E7Ef1BeAed
According to the EIP-55 specification, the net probability that a randomly mistyped address passes the check by accident is roughly 0.0247 percent. Two caveats matter. First, an all-lowercase address contains no checksum information, so no error detection is possible; treat any interface that hands you a lowercase address with extra caution. Second, a checksum only proves the string is internally consistent. It proves nothing about whose address it is. A scammer’s address has a valid checksum too.
Step two: source the address from an authoritative place
This is the single most important step, and no on-chain check substitutes for it. Decide where the canonical address should come from before you go looking, so an attacker cannot supply the answer. Reliable sources include the project’s own documentation on a domain you typed yourself, an official token list, or a link from a verified account you reached independently. Unreliable sources include search-engine advertisements, direct messages, replies under a social post, QR codes from strangers, and any address a support agent sends you.
Where multiple independent sources exist, cross-check them. If a token’s contract is listed identically on the project’s documentation, a reputable token list, and the explorer’s labelled entry, that agreement is meaningful. If the only place an address appears is the message that is asking you to use it, you have verified nothing.
Step three: read the contract on a block explorer
Open the address on a block explorer such as Etherscan. A contract account shows a Contract tab; a plain wallet does not. If you expected a token or an application and the explorer shows no contract code, stop.
Look for verified source. When a developer verifies a contract, the explorer recompiles the submitted Solidity or Vyper with the exact compiler version and settings and compares the output to the bytecode already deployed on-chain. If they match, the source becomes publicly browsable and is marked with a verification badge. As ethereum.org and Etherscan both note, verification establishes that the human-readable code you are reading is the code that actually runs.
Understand precisely what that badge does and does not mean:
- It does mean the published source corresponds to the deployed bytecode, so any review you or others perform is review of the real logic.
- It does not mean the contract is safe, audited, or benign. Etherscan states plainly that a contract can be verified and still be malicious by design. Verification is a precondition for scrutiny, not a substitute for it.
On the verified code, sanity-check the basics that match your expectation: the token name and symbol, the declared decimals, and the presence or absence of functions that let an owner change tax, pause transfers, or blacklist addresses. Also read the explorer’s own labels and warnings, which frequently flag reported scams and phishing.
Step four: resolve proxy contracts
Many modern contracts are proxies. A proxy holds the state and forwards every call to a separate implementation (or logic) contract via delegatecall. This lets a project upgrade behavior without changing the address users interact with, but it also means the code that runs is not the code stored at the address you are looking at.
ERC-1967 standardizes where a proxy records its implementation: a fixed storage slot derived so that it cannot collide with ordinary variables.
0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc
Explorers detect this pattern. When a contract follows ERC-1967, Etherscan shows a note that it is a proxy, offers a Read as Proxy / Write as Proxy view, and links to the current implementation address. Two practical consequences follow. First, verify the implementation’s source as well, not just the proxy shell. Second, recognize that whoever controls the admin slot can point the proxy at new logic at any time; an address that behaves correctly today can be upgraded to behave differently tomorrow. If upgradeability is unexpected for what you are using, treat it as a finding, not a footnote.
Step five: rule out lookalikes and address poisoning
The last class of error is visual. Attackers generate addresses whose first and last characters match one you already use, then get that lookalike into your field of view. The most common technique is address poisoning: the attacker watches your on-chain activity, generates an address matching the first and last few characters of one you transact with, and sends you a tiny or zero-value transfer so their lookalike appears in your transaction history. Because ERC-20’s transferFrom emits a Transfer event even for a zero amount, this costs the attacker almost nothing. Later, when you copy a recent counterparty out of your history at a glance, you copy theirs. MetaMask, Trezor, and Chainalysis all document this pattern, and Chainalysis has traced tens of millions of dollars in losses to it.
Defences are concrete:
- Compare the entire address, or at minimum a run of characters from the middle, never only the ends. Attackers optimize for the ends because that is what people check.
- Do not copy addresses out of transaction history. Use a saved address book entry you created from a verified source, or re-obtain the address from that source each time.
- Send a small test transaction to a new destination before a large one where the cost of that test is acceptable.
- Be aware that a poisoned entry in your history is not a compromise of your wallet. It is bait. Ignoring it is sufficient; you do not need to move funds because a dust transfer appeared.
Putting the checks in order
The steps are cumulative and cheap relative to what they protect. In sequence: confirm the string is well-formed and checksummed; confirm it came from a source an attacker could not control; confirm on an explorer that it is a contract with verified source that matches your expectations; if it is a proxy, resolve and inspect the implementation and note who can upgrade it; and confirm by full-string comparison that it is not a lookalike. Only after all five should you connect a wallet, grant an approval, or sign. None of these steps requires trusting a person, and that is the point: verification replaces trust in a counterparty with checks you can perform yourself.
Sources
- EIP-55: Mixed-case checksum address encoding (ethereum.org)
- ERC-1967: Proxy Storage Slots (ethereum.org)
- Verifying smart contracts (ethereum.org)
- Types of Contract Verification (Etherscan Information Center)
- How to Safely Interact with Smart Contracts on the Explorer (Etherscan)
- Address poisoning scams (MetaMask Help Center)
- Anatomy of an Address Poisoning Scam (Chainalysis)
Frequently asked questions
Does a valid checksum mean an address is safe?
What does the green 'verified' badge on Etherscan actually prove?
The address behaves correctly now. Can it change later?
A strange address matching mine appeared in my transaction history. Was I hacked?
Why compare the whole address instead of the first and last few characters?
Note: CamoCrypt is security & education only — no prices, no predictions, no investment advice. Verify every address and contract yourself; we cannot recover lost funds and neither can anyone who contacts you claiming they can.