Deploying Smart Contracts to Arbitrum
Arbitrum is an Optimistic Rollup L2 that is EVM-compatible at the bytecode level. The overwhelming majority of Ethereum contracts deploy without changes. But there are nuances that burn in production: differences in gas mechanics, ArbOS specifics, finalization specifics and bridging.
How Arbitrum Differs from Ethereum
Gas model: Arbitrum uses two-component gas. L2 execution gas — analog of Ethereum gas, costs cheap. L1 calldata cost — cost of publishing transaction calldata to Ethereum (for data availability), automatically added to every transaction. tx.gasprice on Arbitrum — not the same as on Ethereum; use ArbGasInfo precompile for accurate calculation.
Block numbers: block.number on Arbitrum returns L1 Ethereum block number (updated ~every 12 seconds), not Arbitrum block. For Arbitrum-native block number — ArbSys(0x64).arbBlockNumber(). Contracts using block.number for timing (vesting, TWAP) may work unexpectedly.
Block timestamp: block.timestamp corresponds to real time, updated with each Arbitrum block (~250ms). This is faster than Ethereum — can affect TWAP oracles.
Precompiles: Arbitrum-specific addresses 0x64 (ArbSys), 0x6b (ArbGasInfo), 0x6c (ArbAggregator). Useful for getting L1 block number, gas pricing info.
Deployment via Hardhat/Foundry
// hardhat.config.ts
networks: {
arbitrum: {
url: process.env.ARBITRUM_RPC_URL || 'https://arb1.arbitrum.io/rpc',
accounts: [process.env.PRIVATE_KEY!],
chainId: 42161,
},
arbitrumSepolia: {
url: 'https://sepolia-rollup.arbitrum.io/rpc',
accounts: [process.env.PRIVATE_KEY!],
chainId: 421614,
},
}
# Foundry
forge create --rpc-url $ARBITRUM_RPC_URL \
--private-key $PRIVATE_KEY \
--etherscan-api-key $ARBISCAN_API_KEY \
--verify \
src/MyContract.sol:MyContract \
--constructor-args arg1 arg2
Verification on Arbiscan: same mechanism as Etherscan, separate API key from arbiscan.io.
Contract Size and Optimizations
24KB limit remains. On Arbitrum gas is cheaper, but calldata still costs money (L1 cost). Calldata optimization is relevant for frequently called functions with large arguments.
Bridges and Tokens
Canonical Arbitrum bridge for ETH and standard ERC-20. For custom tokens — Arbitrum token bridge with registration. If contract manages bridge or works with bridged tokens: account for the fact that WETH on Arbitrum is not the same address as on Ethereum.
Timeline Estimates
Deploying a ready contract + verification: several hours. With compatibility audit, multisig ownership setup via Safe, proxy deployment (UUPS/Transparent) and deployment scripts: 1-2 days.







