eth_getCode - Unichain RPC Method
Get contract bytecode on Unichain. Essential for verifying smart contracts for decentralized exchanges, liquidity protocols, and MEV-protected DeFi applications.
Returns the bytecode at a given address on Unichain.
Why Unichain? Build on Uniswap's DeFi-optimized Superchain L2 with 250ms sub-blocks and 95% lower costs than Ethereum with 250ms sub-blocks (fastest L2), TEE-secured block building, native Superchain interoperability, and 65% revenue to validators.
When to Use This Method
eth_getCode is essential for DeFi developers, liquidity protocol builders, and teams building on the Optimism Superchain:
- Contract Verification -- Verify that the bytecode deployed at an address matches the expected source code compilation output on Unichain
- EOA vs Contract Detection -- Determine whether an address is an externally owned account (returns
0x) or a deployed smart contract (returns bytecode) - Proxy Pattern Detection -- Check if a proxy contract has been initialized by examining whether its implementation slot contains code
- Security Auditing -- Validate contract deployments before interacting with them on decentralized exchanges, liquidity protocols, and MEV-protected DeFi applications
Common Use Cases
1. Detect Contract vs EOA
Determine if an address is a smart contract or a regular wallet on Unichain:
import { JsonRpcProvider } from 'ethers';
const provider = new JsonRpcProvider('https://api-unichain-mainnet.n.dwellir.com/YOUR_API_KEY');
async function isContract(address) {
const code = await provider.getCode(address);
return code !== '0x' && code !== '0x0';
}
async function classifyAddress(address) {
if (await isContract(address)) {
const balance = await provider.getBalance(address);
console.log('Contract at', address, '- balance:', balance.toString());
return 'contract';
}
console.log('EOA at', address);
return 'eoa';
}2. Verify Proxy Implementation Initialization
Check whether a proxy contract has been initialized with an implementation on Unichain:
import { JsonRpcProvider } from 'ethers';
const provider = new JsonRpcProvider('https://api-unichain-mainnet.n.dwellir.com/YOUR_API_KEY');
async function checkProxyInitialized(proxyAddress) {
// EIP-1967 implementation slot
const IMPL_SLOT = '0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc';
const slotValue = await provider.getStorage(proxyAddress, IMPL_SLOT);
const implAddress = '0x' + slotValue.slice(26);
const implCode = await provider.getCode(implAddress);
const hasCode = implCode !== '0x' && implCode !== '0x0';
console.log(`Proxy: ${proxyAddress}`);
console.log(`Implementation: ${implAddress} (has code: ${hasCode})`);
return hasCode;
}3. Batch Contract Detection
Scan multiple addresses to classify them efficiently:
async function scanAddresses(provider, addresses) {
const results = [];
for (const address of addresses) {
try {
const code = await provider.getCode(address);
const type = (code === '0x' || code === '0x0') ? 'EOA' : 'Contract';
results.push({ address, type, bytecodeSize: code.length });
} catch (error) {
results.push({ address, type: 'Error', error: error.message });
}
}
const summary = {
total: results.length,
contracts: results.filter(r => r.type === 'Contract').length,
eoas: results.filter(r => r.type === 'EOA').length,
errors: results.filter(r => r.type === 'Error').length
};
console.log('Scan results:', summary);
return { results, summary };
}Best Practices
- Check both
0xand0x0return values -- different client implementations return one or the other for EOAs - Use historical block numbers with
eth_getCodeto verify contract state at a specific point in time - For proxy pattern detection, combine
eth_getCodewitheth_getStorageAtto fully verify initialization - Cache bytecode by address, as deployed contract code is immutable
- The return value length is roughly 2x the deployment bytecode size (hex encoding doubles the byte count)
Code Examples
Related Methods
eth_getBalance- Get account balanceeth_getStorageAt- Get contract storage
eth_getBalance
Query account balance on Unichain. Essential for wallet applications and decentralized exchanges, liquidity protocols, and MEV-protected DeFi applications on Uniswap's DeFi-optimized Superchain L2 with 250ms sub-blocks and 95% lower costs than Ethereum.
eth_getStorageAt
Read the value from a storage slot at a given contract address on Unichain. Essential for reading contract state directly, proxy implementation verification, and storage layout analysis.