# CREATE vs CREATE2: Can We Match Ethereum Mainnet Addresses?

## Question: If we use CREATE to deploy WETH9, will it have the same address as Ethereum Mainnet?

**Answer: ❌ NO - It will NOT have the same address.**

---

## How CREATE Calculates Addresses

The CREATE opcode calculates the contract address using:

```
address = keccak256(rlp([deployer_address, nonce]))
```

Where:
- `deployer_address`: The address that sends the deployment transaction
- `nonce`: The transaction count (nonce) of the deployer address **on that specific chain**

---

## Why CREATE Cannot Match Mainnet Addresses

### Problem 1: Different Deployer Address
- **Ethereum Mainnet WETH9**: Deployed by a specific address (the original deployer)
- **Your Deployment**: Deployed by your address (different from original)
- **Result**: Different deployer = different address calculation

### Problem 2: Nonce is Chain-Specific
Even if you could use the **same deployer address**, the nonce is chain-specific:

- **Ethereum Mainnet**: Deployer's nonce = X (number of transactions on Mainnet)
- **ChainID 138**: Deployer's nonce = Y (number of transactions on ChainID 138)
- **Result**: Different nonce = different address

### Problem 3: Chain Context
The RLP encoding and address calculation are done in the context of the specific chain, so even with identical parameters, the chain context matters.

---

## Example Calculation

### Ethereum Mainnet WETH9
```
Deployer: 0xOriginalDeployer
Nonce: 0 (first transaction from that address on Mainnet)
Address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
```

### Your Deployment on ChainID 138 (CREATE)
```
Deployer: 0xYourAddress (different!)
Nonce: 0 (first transaction from your address on ChainID 138)
Address: 0xDifferentAddress (will be different)
```

Even if you somehow used the same deployer address:
```
Deployer: 0xOriginalDeployer (same)
Nonce: 0 (on ChainID 138, not Mainnet)
Address: Still different (because nonce is chain-specific)
```

---

## Comparison: CREATE vs CREATE2

| Aspect | CREATE | CREATE2 |
|--------|--------|---------|
| **Address Formula** | `keccak256(rlp([deployer, nonce]))` | `keccak256(0xff \|\| deployer \|\| salt \|\| keccak256(bytecode))` |
| **Deterministic** | ❌ No (depends on nonce) | ✅ Yes (if parameters match) |
| **Cross-Chain** | ❌ No (nonce is chain-specific) | ✅ Yes (if deployer/salt/bytecode match) |
| **Can Match Mainnet** | ❌ No | ⚠️ Possibly (if originally deployed with CREATE2) |

---

## Can We Match Ethereum Mainnet WETH9 Address?

### Using CREATE: ❌ **NO**
- Different deployer address
- Nonce is chain-specific
- **Impossible** to match

### Using CREATE2: ❌ **NO** (for WETH9)
- WETH9 on Mainnet was deployed with CREATE (not CREATE2)
- Even with CREATE2, we can't replicate a CREATE-deployed address
- **Impossible** to match

---

## What About WETH10?

### Using CREATE: ❌ **NO**
- Same issues as WETH9
- **Impossible** to match

### Using CREATE2: ⚠️ **POSSIBLY**
- If WETH10 on Mainnet was deployed with CREATE2
- Need: Same bytecode + same deployer + same salt
- **May be possible** if we have the original deployment parameters

---

## Conclusion

**Using CREATE will NOT give you the same address as Ethereum Mainnet.**

The only way to potentially match a Mainnet address is:
1. The contract was originally deployed with CREATE2
2. You use CREATE2 with the exact same parameters (bytecode, deployer, salt)

For WETH9, this is **impossible** because it was deployed with CREATE.

For WETH10, it's **possibly** if it was deployed with CREATE2 and we can replicate the parameters.

---

## Recommendation

Since we cannot match Ethereum Mainnet addresses:
1. **Use CREATE2** for deterministic addresses (same address across deployments if parameters match)
2. **Use CREATE** for simplicity (current method, but addresses will differ)
3. **Document the addresses** clearly so users know they're different from Mainnet

The choice depends on whether you need:
- **Deterministic addresses**: Use CREATE2
- **Simplicity**: Use CREATE (current method)
