From eth-skills
Production contract addresses for major protocols on Ethereum mainnet and L2s — with verification commands for every single one.
How this skill is triggered — by the user, by Claude, or both
Slash command
/eth-skills:contract-addressesThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
You asked an AI for a contract address and used it without verifying. Or you copied an address from a random blog post. Or you assumed the address you used on a testnet is the same on mainnet.
You asked an AI for a contract address and used it without verifying. Or you copied an address from a random blog post. Or you assumed the address you used on a testnet is the same on mainnet.
Wrong address = lost funds. Permanently. There is no "undo" onchain.
AI models hallucinate addresses. They mix up V2 and V3 deployments. They confuse mainnet and testnet addresses. They invent addresses that look plausible but point to nothing — or worse, to a malicious contract someone deployed at a similar-looking address.
Every address in this document has a verification command. Run it before you use the address. Every time. No exceptions.
WARNING: Always verify addresses on Etherscan before using. Never trust training data for addresses.
Three checks, in order:
cast code 0xADDRESS --rpc-url https://eth.llamarpc.com
# Should return bytecode (0x6080604...), NOT "0x"
If it returns 0x, the address has no contract deployed. Stop.
# For tokens: check the symbol
cast call 0xADDRESS "symbol()(string)" --rpc-url https://eth.llamarpc.com
# For Chainlink feeds: check the description
cast call 0xADDRESS "description()(string)" --rpc-url https://eth.llamarpc.com
# For Uniswap: check the factory
cast call 0xADDRESS "factory()(address)" --rpc-url https://eth.llamarpc.com
Check the address against the protocol's official documentation or GitHub repository. Not a third-party site. Not a forum post. The official source.
| Address | 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 |
| Standard | ERC-20 |
| Decimals | 18 |
cast call 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 \
"symbol()(string)" --rpc-url https://eth.llamarpc.com
# "WETH"
| Address | 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 |
| Standard | ERC-20 |
| Decimals | 6 |
cast call 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 \
"symbol()(string)" --rpc-url https://eth.llamarpc.com
# "USDC"
USDC uses 6 decimals, not 18. This is the most common source of bugs when working with USDC. 1 USDC = 1,000,000 (1e6), not 1e18.
| Address | 0xdAC17F958D2ee523a2206206994597C13D831ec7 |
| Standard | ERC-20 (non-standard: no return value on transfer) |
| Decimals | 6 |
cast call 0xdAC17F958D2ee523a2206206994597C13D831ec7 \
"symbol()(string)" --rpc-url https://eth.llamarpc.com
# "USDT"
Warning: USDT's transfer() and transferFrom() do not return a bool. This breaks contracts that expect a return value. Use OpenZeppelin's SafeERC20 library when interacting with USDT from Solidity.
| Address | 0x6B175474E89094C44Da98b954EedeAC495271d0F |
| Standard | ERC-20 |
| Decimals | 18 |
cast call 0x6B175474E89094C44Da98b954EedeAC495271d0F \
"symbol()(string)" --rpc-url https://eth.llamarpc.com
# "DAI"
DAI uses 18 decimals (unlike USDC/USDT which use 6). Don't mix them up.
| Contract | Address |
|---|---|
| Router02 | 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D |
| Factory | 0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f |
# Verify V2 Router — check its factory address
cast call 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D \
"factory()(address)" --rpc-url https://eth.llamarpc.com
# 0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f
| Contract | Address |
|---|---|
| Factory | 0x1F98431c8aD98523631AE4a59f267346ea31F984 |
| SwapRouter02 | 0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45 |
| NonfungiblePositionManager | 0xC36442b4a4522E871399CD717aBDD847Ab11FE88 |
| QuoterV2 | 0x61fFE014bA17989E743c5F6cB21bF9697530B21e |
# Verify V3 Factory
cast call 0x1F98431c8aD98523631AE4a59f267346ea31F984 \
"owner()(address)" --rpc-url https://eth.llamarpc.com
# Verify NonfungiblePositionManager
cast code 0xC36442b4a4522E871399CD717aBDD847Ab11FE88 \
--rpc-url https://eth.llamarpc.com | head -c 20
| Contract | Address |
|---|---|
| Factory | 0x1F98431c8aD98523631AE4a59f267346ea31F984 |
| SwapRouter02 | 0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45 |
| NonfungiblePositionManager | 0xC36442b4a4522E871399CD717aBDD847Ab11FE88 |
| Contract | Address |
|---|---|
| Factory | 0x1F98431c8aD98523631AE4a59f267346ea31F984 |
| SwapRouter02 | 0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45 |
| NonfungiblePositionManager | 0xC36442b4a4522E871399CD717aBDD847Ab11FE88 |
| Contract | Address |
|---|---|
| Factory | 0x33128a8fC17869897dcE68Ed026d694621f6FDfD |
| SwapRouter02 | 0x2626664c2603336E57B271c5C0b26F421741e481 |
| NonfungiblePositionManager | 0x03a520b32C04BF3bEEf7BEb72E919cf822Ed34f1 |
Note: Uniswap V3 on Base uses different addresses than mainnet/Arbitrum/Optimism. Always verify per chain.
| Contract | Address |
|---|---|
| PoolManager | 0x000000000004444c5dc75cB358380D2e3dE08A90 |
cast code 0x000000000004444c5dc75cB358380D2e3dE08A90 \
--rpc-url https://eth.llamarpc.com | head -c 20
Uniswap V4 uses a singleton pattern — all pools live in one contract, unlike V2/V3 which deploy a separate contract per pool.
| Contract | Address |
|---|---|
| Pool | 0x87870Bca3F3fD6335C3F4ce8392D69350B4fA4E2 |
| PoolAddressesProvider | 0x2f39d218133AFaB8F2B819B1066c7E434Ad94E9e |
# Verify Aave V3 Pool
cast code 0x87870Bca3F3fD6335C3F4ce8392D69350B4fA4E2 \
--rpc-url https://eth.llamarpc.com | head -c 20
# Verify PoolAddressesProvider returns the Pool address
cast call 0x2f39d218133AFaB8F2B819B1066c7E434Ad94E9e \
"getPool()(address)" --rpc-url https://eth.llamarpc.com
# Should return 0x87870Bca3F3fD6335C3F4ce8392D69350B4fA4E2
| Contract | Address |
|---|---|
| Pool | 0x794a61358D6845594F94dc1DB02A252b5b4814aD |
| PoolAddressesProvider | 0xa97684ead0e402dC232d5A977953DF7ECBaB3CDb |
| Contract | Address |
|---|---|
| Pool | 0x794a61358D6845594F94dc1DB02A252b5b4814aD |
| PoolAddressesProvider | 0xa97684ead0e402dC232d5A977953DF7ECBaB3CDb |
| Contract | Address |
|---|---|
| Pool | 0xA238Dd80C259a72e81d7e4664a9801593F98d1c5 |
| PoolAddressesProvider | 0xe20fCBdBfFC4Dd138cE8b2E6FBb6CB49777ad64D |
| Address | 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 |
| Decimals | 8 |
cast call 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 \
"description()(string)" --rpc-url https://eth.llamarpc.com
# "ETH / USD"
cast call 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 \
"latestAnswer()(int256)" --rpc-url https://eth.llamarpc.com
# e.g., 240000000000 (= $2,400.00 with 8 decimals)
| Address | 0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c |
| Decimals | 8 |
cast call 0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c \
"description()(string)" --rpc-url https://eth.llamarpc.com
# "BTC / USD"
| Address | 0x2c1d072e956AFFC0D435Cb7AC38EF18d24d9127c |
| Decimals | 8 |
cast call 0x2c1d072e956AFFC0D435Cb7AC38EF18d24d9127c \
"description()(string)" --rpc-url https://eth.llamarpc.com
# "LINK / USD"
All Chainlink feeds return prices with 8 decimal places. Divide by 1e8 to get the human-readable price.
| Contract | Address |
|---|---|
| Singleton | 0x41675C099F32341bf84BFc5382aF534df5C7461a |
| Proxy Factory | 0x4e1DCf7AD4e460CfD30791CCC4F9c8a4f820ec67 |
| MultiSend | 0x38869bf66a61cF6bDB996A6aE40D5853Fd43B526 |
| MultiSendCallOnly | 0x9641d764fc13c8B624c04430C7356C1C7C8102e2 |
| Fallback Handler | 0xfd0732Dc9E303f09fCEf3a7388Ad10A83459Ec99 |
cast code 0x41675C099F32341bf84BFc5382aF534df5C7461a \
--rpc-url https://eth.llamarpc.com | head -c 20
cast code 0x4e1DCf7AD4e460CfD30791CCC4F9c8a4f820ec67 \
--rpc-url https://eth.llamarpc.com | head -c 20
| Contract | Address |
|---|---|
| Registry | 0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e |
| PublicResolver | 0x231b0Ee14048e9dCcD1d247744d114a4EB5E8E63 |
| BaseRegistrar (ETHRegistrarController) | 0x253553366Da8546fC250F225fe3d25d0C782303b |
# Verify ENS Registry
cast code 0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e \
--rpc-url https://eth.llamarpc.com | head -c 20
# Resolve a name
cast resolve-name vitalik.eth --rpc-url https://eth.llamarpc.com
| Address | 0xcA11bde05977b3631167028862bE2a173976CA11 |
| Deployed on | Ethereum, Base, Arbitrum, Optimism, Polygon, and 70+ chains |
cast code 0xcA11bde05977b3631167028862bE2a173976CA11 \
--rpc-url https://eth.llamarpc.com | head -c 20
cast call 0xcA11bde05977b3631167028862bE2a173976CA11 \
"getBlockNumber()(uint256)" --rpc-url https://eth.llamarpc.com
Multicall3 is deployed at the same address on virtually every EVM chain. It uses CREATE2 for deterministic deployment.
| Address | 0x0000000071727De22E5E9d8BAf0edAc6f37da032 |
cast code 0x0000000071727De22E5E9d8BAf0edAc6f37da032 \
--rpc-url https://eth.llamarpc.com | head -c 20
| Chain | Address |
|---|---|
| Ethereum | 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 |
| Arbitrum | 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1 |
| Optimism | 0x4200000000000000000000000000000000000006 |
| Base | 0x4200000000000000000000000000000000000006 |
Note: Optimism and Base use the same address for WETH (0x4200...0006), which is a predeploy. Arbitrum uses a different address.
| Chain | Address | Notes |
|---|---|---|
| Ethereum | 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 | 6 decimals |
| Arbitrum | 0xaf88d065e77c8cC2239327C5EDb3A432268e5831 | Native (Circle-issued) |
| Arbitrum (legacy) | 0xFF970A61A04b1cA14834A43f5dE4533eBDDB5CC8 | Bridged USDC.e — use native instead |
| Optimism | 0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85 | Native (Circle-issued) |
| Base | 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913 | Native (Circle-issued) |
| Chain | Address |
|---|---|
| Ethereum | 0xdAC17F958D2ee523a2206206994597C13D831ec7 |
| Arbitrum | 0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9 |
| Optimism | 0x94b008aA00579c1307B0EF2c499aD98a8ce58e58 |
| Chain | Address |
|---|---|
| Ethereum | 0x6B175474E89094C44Da98b954EedeAC495271d0F |
| Arbitrum | 0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1 |
| Optimism | 0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1 |
| Base | 0x50c5725949A6F0c72E6C4a641F24049A917DB0Cb |
OpenZeppelin contracts are not deployed at fixed addresses. They are Solidity libraries you import and deploy as part of your own contract.
# Install via Foundry
forge install OpenZeppelin/openzeppelin-contracts
# Or via npm
npm install @openzeppelin/contracts
// ERC-20
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
// ERC-721
import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol";
// Access Control
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/access/AccessControl.sol";
// Security
import "@openzeppelin/contracts/utils/ReentrancyGuard.sol";
import "@openzeppelin/contracts/utils/Pausable.sol";
// Proxy/Upgradeable
import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol";
import "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol";
Use SafeERC20 whenever interacting with arbitrary ERC-20 tokens (especially USDT which doesn't return a bool on transfer).
Before using any address in production code:
cast code — Confirm bytecode exists at the addresssymbol(), name(), description(), factory(), owner()# Check if a contract is a proxy (EIP-1967 implementation slot)
cast storage 0xCONTRACT \
0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc \
--rpc-url https://eth.llamarpc.com
If the storage slot returns a non-zero value, it's a proxy, and that value is the implementation address.
| Protocol / Token | Contract | Mainnet Address |
|---|---|---|
| WETH | Token | 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 |
| USDC | Token | 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 |
| USDT | Token | 0xdAC17F958D2ee523a2206206994597C13D831ec7 |
| DAI | Token | 0x6B175474E89094C44Da98b954EedeAC495271d0F |
| Uniswap V2 | Router | 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D |
| Uniswap V2 | Factory | 0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f |
| Uniswap V3 | Factory | 0x1F98431c8aD98523631AE4a59f267346ea31F984 |
| Uniswap V3 | SwapRouter02 | 0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45 |
| Uniswap V3 | NonfungiblePositionManager | 0xC36442b4a4522E871399CD717aBDD847Ab11FE88 |
| Uniswap V4 | PoolManager | 0x000000000004444c5dc75cB358380D2e3dE08A90 |
| Aave V3 | Pool | 0x87870Bca3F3fD6335C3F4ce8392D69350B4fA4E2 |
| Aave V3 | PoolAddressesProvider | 0x2f39d218133AFaB8F2B819B1066c7E434Ad94E9e |
| Chainlink | ETH/USD | 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 |
| Chainlink | BTC/USD | 0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c |
| Chainlink | LINK/USD | 0x2c1d072e956AFFC0D435Cb7AC38EF18d24d9127c |
| Safe v1.4.1 | Singleton | 0x41675C099F32341bf84BFc5382aF534df5C7461a |
| Safe v1.4.1 | ProxyFactory | 0x4e1DCf7AD4e460CfD30791CCC4F9c8a4f820ec67 |
| Safe v1.4.1 | MultiSend | 0x38869bf66a61cF6bDB996A6aE40D5853Fd43B526 |
| ENS | Registry | 0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e |
| ENS | PublicResolver | 0x231b0Ee14048e9dCcD1d247744d114a4EB5E8E63 |
| ENS | BaseRegistrar | 0x253553366Da8546fC250F225fe3d25d0C782303b |
| Multicall3 | Aggregator | 0xcA11bde05977b3631167028862bE2a173976CA11 |
| ERC-4337 | EntryPoint v0.7 | 0x0000000071727De22E5E9d8BAf0edAc6f37da032 |
Provides CDSS development patterns for drug interaction checking, dose validation, clinical scoring (NEWS2, qSOFA), and alert classification integrated into EMR workflows.
npx claudepluginhub andginja/ethskills --plugin eth-skills