ETH Logo

EthVanity

Custom Address Generator

Buy us a coffee

Our free tools run entirely on donations. Your support pays for the servers and GPU power that make every generation possible. If we helped you today, a small donation helps keep this service free for everyone.

ETH · Ethereum network
0xcf5777b71c31146bd396cece6d3128e42d0ad9f7

Thank you for keeping us running! ❤️

Developer guide

Same Address on Every EVM Chain: EOAs, CREATE2 and CREATE3

Why an EOA has the same address on every EVM chain, how contracts match via CREATE2 and CREATE3, and lessons from the 20M OP incident.

By Updated 7 min readRead as Markdown

Address equality is limited. Same EOA key: Can derive the same address across EVM chains; Different chains: Balances and account state remain separate; Contracts: Deployment details affect address reproducibility.
Address equality is limited. Same EOA key: Can derive the same address across EVM chains; Different chains: Balances and account state remain separate; Contracts: Deployment details affect address reproducibility.Open full-size diagram (SVG)Download diagram (PNG)About these visual guides
Short answer: An externally owned account has the same address on every EVM chain because the address is derived only from the private key. A contract gets the same address only if its deployment inputs match: the deployer and nonce for CREATE, or the deployer, salt and init code for CREATE2. Shared deployers such as the deterministic deployment proxy at 0x4e59b44847b379578588920cA78FbF26c0B4956C and CreateX make that repeatable.

EOAs: one key, one address everywhere

An EOA address is the last 20 bytes of keccak256 of the public key, and the public key depends only on the private key. No chain ID enters the calculation, so the same key controls the same address on Ethereum, Arbitrum, Optimism, Base, Polygon PoS and every other chain that uses Ethereum's account model. The derivation steps are in how Ethereum addresses are derived.

This has practical consequences. Funds sent to your address on the wrong EVM chain are still yours if you hold the key, and you can recover them by adding that network to your wallet. A vanity EOA is a vanity address on every chain at once. Since EIP-155, signed transactions include a chain ID, so a transaction you sign for one chain cannot be replayed on another, but an EIP-7702 authorization signed with chain ID 0 is valid on any chain, so read such requests carefully.

Contracts with CREATE: same address only with the same nonce

CREATE derives a contract address from keccak256(rlp([sender, nonce]))[12:]. To repeat an address on another chain you must deploy from the same account at the same nonce. Teams used to reserve a fresh deployer key and keep its nonces in lockstep across chains, which breaks as soon as one chain receives an extra transaction.

The failure mode is serious: the nonce that would have produced your address on a new chain can be consumed by an unrelated transaction, or the address can stay empty for years until someone deploys there. Anyone who controls the deployer key on that chain decides what code ends up at that address.

Contract factories face the same issue: a factory's nonce starts at 1 and increments with each deployment, so a factory that has deployed different numbers of contracts on two chains will put its next contract at different addresses.

CREATE2 through a shared deterministic deployer

CREATE2, specified in EIP-1014, computes keccak256(0xff ++ deployer ++ salt ++ keccak256(init_code))[12:]. If the same deployer contract exists at the same address on every chain, the same salt and init code give the same contract address everywhere, regardless of who sends the transaction or what nonces are in use.

The most widely used deployer is Arachnid's deterministic deployment proxy at 0x4e59b44847b379578588920cA78FbF26c0B4956C. It is itself deployed by a presigned transaction from a one-time keyless account, so anyone can publish it on a new chain. Calldata sent to it is a 32-byte salt followed by the init code. Because that presigned transaction carries no EIP-155 chain ID, chains that enforce replay protection cannot receive it this way, which is why Safe maintains a separate singleton factory deployed per chain.

CreateX, at 0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed, is a newer factory that supports CREATE, CREATE2 and CREATE3. It offers salt guards: if the first 20 bytes of the salt equal msg.sender, only that sender can deploy with it, and setting the 21st byte to 0x01 mixes the chain ID into the salt so the address cannot be reproduced on other chains.

CREATE3: address independent of the bytecode

CREATE2 ties the address to the exact init code, so changing a constructor argument per chain changes the address. CREATE3 is a pattern, not an opcode: a factory uses CREATE2 to deploy a tiny proxy with fixed bytecode, and that proxy immediately uses CREATE at its nonce 1 to deploy the real contract. The final address therefore depends only on the factory address and the salt.

That flexibility cuts both ways. CREATE3 lets you deploy different code to the same address on different chains, which is convenient for chain-specific constructor parameters but removes the guarantee that one address means one bytecode. Always verify the deployed code on each chain rather than assuming it from the address.

MethodAddress depends onSame address across chains requires
EOAPrivate key onlySame key (automatic)
CREATESender and nonceSame sender at the same nonce
CREATE2Deployer, salt, init code hashSame deployer, salt and exact bytecode
CREATE3 (pattern)Factory and saltSame factory and salt; code may differ

Practical workflow with Foundry

Foundry uses the deterministic deployment proxy by default. When a Forge script deploys with new Contract{salt: salt}(...), Foundry routes the deployment through 0x4e59b44847b379578588920cA78FbF26c0B4956C, so running the same script with the same salt and bytecode on several chains yields one address. The cast create2 command mines salts for that deployer, with options such as --starts-with, --ends-with, --matching, --case-sensitive and --init-code-hash.

Pin the compiler version, optimizer runs and metadata settings in foundry.toml before mining, since any change alters the init code hash. After deployment, confirm on each chain's explorer that the address holds the expected verified bytecode. If you need a vanity contract address, the EOA vs CREATE2 vanity guide explains the formula you are mining against.

# mine a salt for the default deterministic deployer
cast create2 --starts-with 0000 --init-code-hash <keccak256 of init code>

# deploy in a Forge script with the mined salt
# new MyContract{salt: SALT}(args);
forge script script/Deploy.s.sol --rpc-url $RPC_URL --broadcast

The 20 million OP incident of 2022

In June 2022 the Optimism Foundation sent 20 million OP tokens to a multisig address supplied by market maker Wintermute. The Safe multisig existed at that address on Ethereum mainnet but had not been deployed on Optimism. According to the Optimism Foundation's statement reported by The Block, an attacker deployed the multisig address on Optimism first with different initialization parameters and took control of the tokens.

SlowMist's analysis attributes this to transaction replay: the Safe proxy factory's original Ethereum deployment transaction had no chain ID, so the attacker replayed it on Optimism to recreate the factory at the same address, then created proxies until reaching the expected address with parameters they controlled. Wintermute accepted responsibility for the error. The lesson is that an address being yours on one chain says nothing about who controls it on another until you deploy there yourself.

Checklist for cross-chain deployments

Use these rules whether you deploy a vanity contract or an ordinary one.

  • Deploy through a factory that already exists at the same address on every target chain, and confirm it on each chain's explorer first.
  • Use permissioned salts so nobody can front-run your salt, as described in EOA vs CREATE2 vanity.
  • Never send assets to a contract address on a chain where that contract is not yet deployed.
  • Check chains with custom VMs: ZKsync's documentation states that EraVM bytecode uses a different CREATE and CREATE2 address derivation from Ethereum.
  • Remember that a mined leading-zero address carries over to every chain with the same deployer, keeping the gas benefit from leading-zero addresses.

Explore the related mechanism

Frequently asked questions

Is my MetaMask address the same on Polygon, Arbitrum and Base?

Yes. An EOA's address comes from its private key alone, so it is identical on every EVM-compatible chain that uses Ethereum's account model.

Is a contract at the same address on two chains the same contract?

Not necessarily. With CREATE or CREATE3, different code can live at the same address on different chains. Verify the bytecode on each chain.

What is the deterministic deployment proxy?

A minimal CREATE2 factory at 0x4e59b44847b379578588920cA78FbF26c0B4956C, deployed with a keyless presigned transaction so it can exist at the same address on many chains. You send it a salt followed by init code.

Will a lost private key on one chain affect my address on others?

Yes. One key controls the address on every EVM chain, so losing or leaking it affects all of them at once. If you import that key into a wallet, see importing a private key into MetaMask for backup precautions.

Does CreateX exist at the same address on every chain?

CreateX is deployed at 0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed on many chains, and its repository lists the deployments. Confirm the code at that address on your target chain before relying on it.

Sources and editorial method

The technical references below support the concepts discussed in this article. Examples and comparison worksheets are explanatory, not measured service benchmarks.

Read how these articles are prepared.