A contract address is the address of a smart contract on a blockchain. It is created when the contract is deployed, it has no private key, and it is the string people mean when they write "CA" next to a token.
On Ethereum and every EVM chain it looks exactly like a wallet address: 0x followed by 40 hexadecimal characters. A token such as USDT or USDC is a contract, so the token's address is a contract address. What differs from a wallet address is what sits behind it: code and storage instead of a person holding a private key.
The term shows up in three places: when you add a custom token to a wallet, when a block explorer labels an address as a contract, and when someone posts a CA for a new coin. This guide explains what the address identifies, how it is generated, how to tell it apart from a wallet address, where to find a token's real address and what happens if you send funds to one.
The short version
- A contract address points to code; a wallet address points to a key holder. Both use the same format on EVM chains, so the format alone cannot tell you which is which. A block explorer or an eth_getCode call can.
- On EVM chains the address is 0x + 40 hex characters, derived from the deployer's address and nonce, or from a salt with CREATE2. Tron uses 34 characters starting with T, Solana a base58 mint address.
- Copy a token's address from the issuer's site or documentation, then check that the explorer shows verified source code, many holders and a long history. Scam tokens reuse real names and symbols.
- Most token contracts cannot return tokens sent to their own address. Deposits go to a wallet address; you interact with a contract through a dApp or a wallet that knows its functions.
1. What is a contract address?
Every account on Ethereum, and on the chains built like it, has an address. Two kinds of account exist. An externally owned account belongs to whoever holds its private key. A contract account holds a program and the data that program keeps, and its address is the contract address. The ethereum.org documentation states it directly: contract accounts do not have private keys; they are controlled by the logic of the smart contract code.
A contract is deployed once by a transaction, receives its address at that moment and keeps it for as long as the chain exists. Anyone can send a transaction to that address to call one of the contract's functions. A token transfer or a swap on a decentralised exchange is a transaction addressed to a contract.
Tokens are the most common case. USDT, USDC, WETH and every other ERC-20 token is a contract that keeps a table of balances. The token's address is therefore a contract address, and it is the one piece of information a wallet needs to display a token it does not know yet.
2. What does "CA" mean in crypto?
CA stands for contract address. On X, Telegram and Discord, a post about a new token usually ends with CA followed by the address, because a token's name and ticker are not unique and the address is. Trading sites and wallets use the same abbreviation.
On Solana the CA is the token's mint address, the account that defines the token's supply and decimals. On Ethereum, BNB Chain, Base and other EVM networks it is the address of the ERC-20 or BEP-20 contract. In both cases the address is what you paste into a wallet or an explorer to reach the exact token someone is talking about. That is also why fake CAs are a common scam: a lookalike token with the same name gets a different address.
3. What does a contract address look like?
The format follows the chain, and it is the same format the chain uses for wallet addresses. These are the official addresses of two widely used stablecoins, taken from the issuers' pages:
| Network | Token | Contract address | Format |
|---|---|---|---|
| Ethereum | USDT (ERC-20) | 0xdAC17F958D2ee523a2206206994597C13D831ec7 | 0x + 40 hex characters |
| Ethereum | USDC | 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 | 0x + 40 hex characters |
| Base | USDC | 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913 | 0x + 40 hex characters |
| Arbitrum One | USDC | 0xaf88d065e77c8cC2239327C5EDb3A432268e5831 | 0x + 40 hex characters |
| Polygon PoS | USDC | 0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359 | 0x + 40 hex characters |
| Tron | USDT (TRC-20) | TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t | 34 base58check characters starting with T |
| Solana | USDC (mint address) | EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v | 32 to 44 base58 characters |
The Ethereum, Base, Arbitrum and Polygon entries come from Circle's list of USDC contract addresses, the USDT entries from Tether's supported protocols page. USDC has a different address on each chain: the same name does not mean the same contract. Upper and lower case letters in an EVM address form a checksum defined in EIP-55; the all-lowercase form is the same address, and explorers and wallets accept both.
Bitcoin has no contract addresses. A Bitcoin address that starts with 3 or bc1 can encode a script, but there is no program living at the address that you call. The concept belongs to account-based chains such as Ethereum, Tron and Solana.
4. Contract address vs wallet address: what is the difference?
On an EVM chain the two look identical, so the distinction is about what controls the address.
| Wallet address (externally owned account) | Contract address | |
|---|---|---|
| Controlled by | A private key, usually derived from a seed phrase | The contract's code; there is no private key |
| Can start a transaction | Yes | No. It runs only when a transaction or another contract calls it |
| Holds code | No, unless it delegates to code under EIP-7702 | Yes, plus its own storage |
| How it is created | Free: derived from a public key, no transaction needed | By a deployment transaction that pays gas |
| Typical use | Receiving funds, signing transactions | Tokens, exchanges, lending pools, NFT collections, bridges |
| On a block explorer | Shown as a normal address | Labelled as a contract, with a Contract tab |
The one grey area is EIP-7702, live on Ethereum since the Pectra upgrade of May 2025. It lets a wallet address attach delegated code to itself so it can batch calls or let someone else pay its fees. The key still controls the account and the account can still send transactions, so it remains a wallet address with code attached.
To tell them apart, open the address on a block explorer: a contract gets a Contract tab, a creator address and, if the source was published, verified code. In code, the JSON-RPC method eth_getCode returns the bytecode stored at an address, and just 0x for a wallet address. The Etherscan guide shows where each of these tabs is.
5. How is a contract address generated?
The address is computed, not chosen, and each chain has its own rule:
- Ethereum and EVM chains (CREATE)
- The address is the last 20 bytes of the Keccak-256 hash of the deployer's address and its nonce, the count of transactions that address has sent. Deploying twice from the same account gives two different addresses because the nonce has moved on.
- Ethereum and EVM chains (CREATE2)
- A contract can deploy another contract at an address computed from its own address, a salt it chooses and the hash of the creation code: keccak256(0xff ++ address ++ salt ++ keccak256(init_code))[12:]. The address is known before anything is deployed, which is how one contract can appear at the same address on many chains.
- Tron
- A Tron address is 21 bytes with a leading 0x41, shown as 34 base58check characters starting with T. Contract addresses use the same format as wallet addresses and are derived from the deployment transaction's ID and the deployer's address.
- Solana
- A program's address is the public key of the account that stores its executable code. A token is identified by the address of its mint account, which the Token Program owns. The wallet that holds the token gets a separate token account for each mint.
The rules are in the ethereum.org accounts documentation, in EIP-1014 for CREATE2, in the Tron account reference and in the Solana token documentation.
6. Is a token address the same as a contract address?
On EVM chains, yes. A token address is the contract address of the token's contract, and wallets, explorers and exchanges use the two names for the same string. Adding a custom token to a wallet means pasting that address; the wallet then reads the symbol and the number of decimals from the contract itself, which is why a wrong address shows a wrong token rather than an error.
Two cases need an extra identifier. An NFT is identified by the collection's contract address plus a token ID, since one contract holds the whole collection. On Solana the token address is the mint address, and the balance you own lives in a token account tied to your wallet rather than at the mint.
7. How do I find a token's contract address?
Take it from a source the issuer controls, then confirm it on an explorer.
- The issuer's website or documentation
- Stablecoin issuers, protocols and most projects publish their addresses per chain. Circle and Tether keep one page each for USDC and USDT, and the entries in the table above come from there.
- CoinMarketCap and CoinGecko
- The token page lists the contract address for each chain under Contracts, with a copy button and a link to the explorer.
- A block explorer
- Search the token name on Etherscan, BscScan, Polygonscan, Tronscan or Solscan. Explorers mark the established token and show the number of holders; a copy with the same name and ten holders is a different token.
- Your wallet or exchange
- Wallets show the address in the token's details screen. Exchanges show it on the deposit and withdrawal pages, together with the network the address belongs to.
Copy the whole string and keep the network with it. A USDC address from Base means nothing on Arbitrum, and an explorer shows an empty address if you look it up on the wrong chain.
8. How do I verify that a contract address is legitimate?
The name and symbol of a token are free text in the contract, so anyone can deploy a second USDC. These checks separate the real contract from the copies:
- Match it against the issuer
- The address must be identical, character for character, to the one on the issuer's site or documentation. Compare more than the first and last few characters; lookalike addresses are generated to share exactly those.
- Look for verified source code
- On Etherscan and similar explorers the Contract tab shows whether the deployer published the source and the explorer recompiled it to match the bytecode. Unverified bytecode is a warning sign for any widely used token.
- Check holders, age and activity
- A real stablecoin contract has millions of transfers and years of history. A contract deployed last week with a handful of holders and no verified source is a different token, whatever its name.
- Read the token's rules
- Explorers and token scanners flag contracts whose owner can mint freely, pause transfers, change fees or block selling. A proxy contract keeps its address but can swap its implementation, so check who controls the upgrade.
- Cross-check the chain
- The same project has different addresses on different chains, so make sure the explorer, the wallet and the source all refer to the same network.
The Etherscan guide walks through the Contract tab and the Read Contract and Write Contract views used for these checks.
9. Can I send crypto to a contract address?
You can, and the result depends on the contract. Depositing into a lending pool, buying on a decentralised exchange or minting an NFT all work by sending a transaction to a contract, usually with a function call attached, through a wallet or a dApp that knows the contract's interface.
Sending tokens to the token's own contract address is the mistake to avoid. The ERC-20 standard defines transfer, approve and balance functions and nothing that lets the contract hand tokens back, so coins sent to a token contract by mistake are normally gone unless the issuer built a recovery function and agrees to use it. The same applies to most contracts that were never designed to receive plain transfers: some reject them, others accept them silently.
When an exchange or a person asks for a deposit, they give you a wallet address. When a protocol wants you to interact, the dApp builds the transaction for you. If you find yourself pasting a token's contract address into the recipient field of a transfer, stop and check what you are doing.
10. Is a contract address the same on every blockchain?
No, unless the deployer made it so. The USDC table above shows four different addresses on four EVM chains for the same asset, because each deployment was a separate transaction from an account with a different nonce. Bridged versions of a token, often labelled with a suffix such as .e, have their own addresses, so an explorer can show more than one token called USDC on one network.
Identical addresses across chains are possible through CREATE2, or by replaying the same signed deployment transaction from a fresh account on every chain. Multicall3, a helper contract used by wallets and libraries, sits at 0xcA11bde05977b3631167028862bE2a173976CA11 on more than a hundred chains for that reason, as its deployment list shows. Most tokens are not deployed this way, so look up the address on the chain you are using.
If you are unsure which network a wallet is connected to, the chain ID list maps each chain ID to its network and explorer.
11. Checking an address in code
An application that lets users paste a token or recipient address should validate the format before it builds a transaction. ChainGate's SDK validates addresses for Bitcoin, Ethereum, Litecoin, Dogecoin, Bitcoin Cash and any EVM network you register, and it rejects an EVM address whose mixed-case checksum does not match:
import { ChainGate, isValidEvmAddress } from 'chaingate';
const cg = new ChainGate({ apiKey: process.env.CHAINGATE_API_KEY });
// Format checks: true for a well-formed address, false otherwise
cg.networks.ethereum.isValidAddress('0xdAC17F958D2ee523a2206206994597C13D831ec7'); // true (USDT contract)
cg.networks.ethereum.isValidAddress('0xD8DA6bf26964af9d7eed9e03e53415d37aa96045'); // false (EIP-55 checksum does not match)
isValidEvmAddress('0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48'); // true (USDC contract)
// Bitcoin: validate and classify the address type
cg.networks.bitcoin.isValidAddress('bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4'); // true
cg.networks.bitcoin.identifyAddressType('bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4'); // 'segwit-p2wpkh'Format validation says the string is a well-formed address; it does not say whether code lives there. For that, call eth_getCode on an RPC endpoint: a contract returns its bytecode and a wallet address returns 0x. The address validation documentation lists every supported network and the Bitcoin address types the SDK recognises.
12. Where to go from here
A contract address tells you which program you are talking to, the transaction hash tells you which call you made, and the Etherscan guide shows how to read both on an explorer. Every call to a contract costs gas, and the gas tracker shows what that costs right now on each network. If you want address validation, balances and transfers handled across Bitcoin, Ethereum and the other networks from one SDK, ChainGate does that.
Frequently asked questions
What is a contract address in crypto?
The blockchain address of a smart contract: a program deployed by a transaction, with its own storage and no private key. Tokens, decentralised exchanges, lending pools and NFT collections are contracts, so each has a contract address. On Ethereum and other EVM chains it is 0x followed by 40 hexadecimal characters, the same format as a wallet address.
What does CA mean in crypto?
CA is short for contract address. People post it next to a token's name because names and tickers are not unique and the address is. On Solana the CA is the token's mint address; on Ethereum, BNB Chain or Base it is the address of the token contract.
Is a contract address the same as a wallet address?
No. A wallet address is controlled by a private key and can start transactions. A contract address is controlled by the code deployed at it, has no private key and only acts when a transaction calls it. On EVM chains both have the same 0x format, so you tell them apart on a block explorer, where contracts get a Contract tab, or with the eth_getCode RPC call, which returns 0x for a wallet address.
What does a contract address look like?
Ethereum, BNB Chain, Polygon, Arbitrum, Base and other EVM chains: 0x plus 40 hex characters, for example USDT at 0xdAC17F958D2ee523a2206206994597C13D831ec7. Tron: 34 base58check characters starting with T, for example USDT at TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t. Solana: a base58 mint address of 32 to 44 characters, for example USDC at EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v.
How do I find a token's contract address?
Take it from the issuer's website or documentation, or from the Contracts section of the token's page on CoinMarketCap or CoinGecko, then confirm it on the block explorer of the same chain: verified source code, a large number of holders and a long transfer history mark the real contract. Wallets show the address in the token details screen and exchanges on their deposit pages.
How do I know if an address is a contract?
Open it on a block explorer. A contract page shows a Contract tab, the creator address and, if published, the verified source code. In code, the eth_getCode RPC method returns the bytecode for a contract and 0x for a wallet address.
Can I send tokens to a contract address?
Only when the contract is designed to receive them, such as a lending pool or an exchange, and usually through a dApp that attaches the right function call. Sending tokens to the token's own contract address normally loses them, because the ERC-20 standard has no function to send them back. Deposits to exchanges and payments to people always go to a wallet address.
What is a token address?
The contract address of the token's smart contract. Wallets, explorers and exchanges use token address and contract address for the same string. On Solana the token address is the mint address; an NFT is identified by its collection's contract address plus a token ID.
Is a contract address the same on all chains?
Not by default. USDC has a different address on Ethereum, Base, Arbitrum and Polygon because each deployment is a separate transaction. Projects can obtain identical addresses on many chains through CREATE2 or by replaying the same signed deployment, as Multicall3 does, but you should always look up the address on the chain you are using.
Does a smart contract have a private key?
No. A contract account is controlled by its code. If the code includes owner functions, the owner is a separate address, usually a wallet or a multisig, that holds its own keys. A contract whose ownership was renounced has no one who can change it.
Build with ChainGate
Put these ideas to work — ChainGate gives you wallets, transactions and managed RPC for Ethereum and 20+ other blockchains with one install.