# Fork Analysis: Can We Use Mainnet WETH9 Address? ## Question: If ChainID 138 is a fork of Ethereum Mainnet, can we use the existing WETH9 address? **Answer: ✅ YES - If it's a fork, WETH9 already exists at the Mainnet address!** --- ## Understanding Forks ### What is a Fork? A **fork** of Ethereum Mainnet means: - The new chain starts with a copy of Mainnet's state at a specific block - All existing contracts are preserved at their original addresses - All account balances and contract storage are preserved - The chain then diverges from that point ### What is a New Chain? A **new chain** (not a fork) means: - Starts with empty state (genesis block) - No existing contracts - Must deploy all contracts from scratch - Addresses will be different --- ## Current Status: ChainID 138 ### Genesis Configuration Analysis Looking at `config/genesis.json`: - **Chain ID**: 138 (different from Mainnet's 1) - **Consensus**: QBFT 2.0 (different from Mainnet's Proof of Stake) - **Alloc**: Limited pre-allocated accounts - **WETH9 Address**: Not found in genesis ### Conclusion: **NOT a Fork** Based on the genesis configuration, ChainID 138 appears to be a **NEW chain**, not a fork: - Different consensus mechanism (QBFT 2.0 vs PoS) - Different chain ID (138 vs 1) - No Mainnet state included - WETH9 address not in genesis --- ## If We Made It a Fork ### Option 1: Fork at a Specific Block If we configure ChainID 138 as a fork of Ethereum Mainnet: ```json { "config": { "chainId": 138, "berlinBlock": 0, "londonBlock": 0, "istanbulBlock": 0, "qbft2": { ... } }, "alloc": { // Mainnet state at fork block would be included "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2": { "balance": "...", "code": "...", // WETH9 bytecode "storage": { ... } // WETH9 storage } } } ``` **Result:** - ✅ WETH9 exists at `0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2` - ✅ No deployment needed - ✅ Same address as Mainnet - ✅ All Mainnet contracts available ### Option 2: Use Besu's Fork Configuration Hyperledger Besu supports forking Ethereum Mainnet: ```toml # besu-config.toml genesis-file="/config/genesis.json" fork-block-number=18000000 # Fork at block 18,000,000 ``` **Result:** - ✅ Mainnet state preserved - ✅ WETH9 at original address - ✅ All contracts available --- ## Current Implementation: New Chain Since ChainID 138 is configured as a **new chain** (not a fork): ### Implications: 1. ❌ WETH9 does NOT exist 2. ❌ Must deploy WETH9 3. ❌ Address will be different from Mainnet 4. ✅ Full control over chain state 5. ✅ Custom consensus (QBFT 2.0) ### Deployment Options: 1. **Deploy with CREATE**: New address (current method) 2. **Deploy with CREATE2**: Deterministic address (but still different from Mainnet) 3. **Fork Mainnet**: WETH9 already exists (requires genesis reconfiguration) --- ## Recommendation ### If You Want WETH9 at Mainnet Address: **Option A: Reconfigure as Fork** 1. Update genesis.json to include Mainnet state 2. Configure Besu to fork from a specific Mainnet block 3. WETH9 will exist at `0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2` 4. No deployment needed **Option B: Keep as New Chain** 1. Deploy WETH9 with CREATE or CREATE2 2. Document the new address 3. Users will use the new address on ChainID 138 ### Trade-offs: | Aspect | Fork | New Chain | |--------|------|-----------| | **WETH9 Address** | ✅ Same as Mainnet | ❌ Different | | **Mainnet Contracts** | ✅ All available | ❌ Must deploy | | **State Size** | ⚠️ Large (full Mainnet state) | ✅ Small (empty) | | **Control** | ⚠️ Limited (inherits Mainnet state) | ✅ Full control | | **Consensus** | ⚠️ Must match Mainnet | ✅ Custom (QBFT 2.0) | --- ## Next Steps 1. **Decide**: Fork or New Chain? 2. **If Fork**: Update genesis.json with Mainnet state 3. **If New Chain**: Continue with current deployment method 4. **Document**: Clearly state whether it's a fork or new chain --- ## Conclusion **Current Status**: ChainID 138 is a **NEW CHAIN**, not a fork. **To Use Mainnet WETH9 Address**: Reconfigure as a fork of Ethereum Mainnet. **Otherwise**: Deploy WETH9 and use the new address.