Five steps, about fifteen minutes, one contract live on the EEZ L2. Everything you need is on this page — the walkthroughs explain why it works, and none of them are prerequisites.
The demos and this page are pinned to Foundry v1.7.1. Nothing else is needed.
$ curl -L https://foundry.paradigm.xyz | bash && foundryup
The faucet hands out xDAI on Chiado, which funds both layers. Then hand the key to your shell:
$ export KEY=0x… # the private key the faucet funded
⚠ Use a throwaway key. Never a key that holds real assets — testnet or not.
Everything below comes from this table — the L2 manager is a predeploy, the same 0x4200…0007 on every EEZ L2; the L1 manager comes from the canonical deploy.
| CHAIN | RPC URL | CHAIN ID | EEZ MANAGER | EXPLORER |
|---|---|---|---|---|
| EEZ L2 (testnet) | COMING SOON | COMING SOON | 0x4200…0007 | COMING SOON |
| Chiado (L1) | https://rpc.chiadochain.net | 10200 | COMING SOON | gnosis-chiado.blockscout.com |
$ export EEZ_RPC=COMING_SOON
One command. src/MyContract.sol is whatever you're shipping.
$ forge create src/MyContract.sol:MyContract --rpc-url $EEZ_RPC --private-key $KEY
Deployer: 0x… Deployed to: 0x… ← this line means you're done Transaction hash: 0x…
Verify it landed — non-empty bytes means deployed:
$ cast code <address> --rpc-url $EEZ_RPC
The key isn't funded on the L2 — go back to the faucet, then cast balance $ADDR --rpc-url $EEZ_RPC to confirm before retrying.
$EEZ_RPC doesn't match the table in step 3 — re-copy it. cast chain-id --rpc-url $EEZ_RPC should print the chain id from the table.
An earlier transaction from this key is stuck or already mined — cast nonce $ADDR --rpc-url $EEZ_RPC to inspect, then resend.
In this order.
Your contract's stand-in on every other rollup — readable before anything is deployed.
An ordinary encode, sent to the proxy — the answer comes back in the same transaction.
Cross-chain, msg.sender is the proxy — not your contract. Fix the check before it ships.