Files
smom-dbis-138/docs/CREATE_DEPLOYMENT.md
defiQUG 1fb7266469 Add Oracle Aggregator and CCIP Integration
- Introduced Aggregator.sol for Chainlink-compatible oracle functionality, including round-based updates and access control.
- Added OracleWithCCIP.sol to extend Aggregator with CCIP cross-chain messaging capabilities.
- Created .gitmodules to include OpenZeppelin contracts as a submodule.
- Developed a comprehensive deployment guide in NEXT_STEPS_COMPLETE_GUIDE.md for Phase 2 and smart contract deployment.
- Implemented Vite configuration for the orchestration portal, supporting both Vue and React frameworks.
- Added server-side logic for the Multi-Cloud Orchestration Portal, including API endpoints for environment management and monitoring.
- Created scripts for resource import and usage validation across non-US regions.
- Added tests for CCIP error handling and integration to ensure robust functionality.
- Included various new files and directories for the orchestration portal and deployment scripts.
2025-12-12 14:57:48 -08:00

140 lines
4.3 KiB
Markdown

# CREATE Deployment Guide
## Overview
This guide explains how to deploy WETH9 and WETH10 contracts to the exact addresses from `genesis.json` using CREATE (not CREATE2).
## Problem
The `genesis.json` file contains reserved addresses:
- **WETH9**: `0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2`
- **WETH10**: `0xf4BB2e28688e89fCcE3c0580D37d36A7672E8A9F`
These are Ethereum mainnet addresses that were originally deployed using CREATE. To deploy to these exact addresses on ChainID 138, we need to use CREATE with the correct deployer address and nonce.
## CREATE Address Calculation
CREATE address is calculated using:
```
address = keccak256(RLP(deployer_address, nonce))[12:]
```
Where:
- `deployer_address`: The address that creates the contract
- `nonce`: The nonce of the deployer address (transaction count)
## Deployment Methods
### Method 1: vm.etch (Test/Simulation Only)
**File**: `script/DeployWETHToGenesisAddresses.s.sol`
Uses `vm.etch` to directly set bytecode at target addresses. This only works in Foundry's test/simulation mode, not in actual broadcasts.
```solidity
vm.etch(TARGET_WETH9, deployedBytecode);
```
**Limitation**: `vm.etch` is a cheatcode that doesn't work in production broadcasts.
### Method 2: CREATE with Calculated Nonce
**Files**:
- `script/DeployWETHWithCREATEDirect.s.sol`
- `scripts/utils/calculate-create-address.js`
Calculates the nonce needed for a deployer to produce the target address.
```bash
# Calculate CREATE nonce
node scripts/utils/calculate-create-address.js <target-address> [deployer] [max-nonce]
# Example
node scripts/utils/calculate-create-address.js 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
```
### Method 3: Direct CREATE Deployment
Once we know the deployer and nonce, we can deploy directly:
```solidity
vm.startBroadcast(deployerAddress);
// Ensure deployer has correct nonce
WETH weth = new WETH(); // Will deploy to calculated address
```
## Current Status
### Attempts Made
1.**vm.etch Deployment**: Successfully set bytecode in simulation, but doesn't work in broadcasts
2.**CREATE Nonce Calculation**: Tried to calculate nonce for common deployers (0-10,000), not found
3.**Direct CREATE Deployment**: Tried deploying from genesis addresses, addresses don't match
### Challenges
1. **Nonce Calculation**: Finding the exact nonce that produces the target address requires brute-force searching
2. **Deployer Unknown**: We don't know which deployer address was used originally
3. **vm.etch Limitation**: Only works in tests, not in production broadcasts
## Solutions
### Solution 1: Use vm.etch in Fork Mode
If deploying in fork mode or testnet, `vm.etch` can work:
```bash
forge script script/DeployWETHToGenesisAddresses.s.sol \
--fork-url <rpc-url> \
--broadcast
```
### Solution 2: Calculate Nonce (Longer Search)
Increase the nonce search range:
```bash
node scripts/utils/calculate-create-address.js \
0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 \
0x0742D35CC6634c0532925A3b844bc9E7595f0Beb \
1000000 # Search up to nonce 1,000,000
```
### Solution 3: Use Known Deployer
If you know the deployer address used when creating genesis.json, use it directly:
```solidity
vm.startBroadcast(knownDeployer);
// Deploy will use deployer's current nonce
WETH weth = new WETH();
```
### Solution 4: Pre-calculate and Reserve Nonce
1. Calculate what nonce produces the target address
2. Send transactions to reach that nonce
3. Deploy contract - it will be at the target address
## Recommendation
For production deployment on ChainID 138:
1. **If addresses are just reserved**: Keep them reserved in genesis.json and use the deployed addresses from earlier deployments
2. **If exact addresses are required**: Calculate the CREATE nonce with a longer search range, or use the deployer that created genesis.json
3. **For testing**: Use `vm.etch` in test/fork mode
## Files Created
1. `script/DeployWETHToGenesisAddresses.s.sol` - vm.etch deployment
2. `script/DeployWETH9WithCREATE.s.sol` - CREATE nonce calculation
3. `script/DeployWETHWithCREATEDirect.s.sol` - Direct CREATE deployment
4. `scripts/utils/calculate-create-address.js` - CREATE address calculator
## See Also
- [Ethereum CREATE Opcode](https://ethereum.org/en/developers/docs/evm/opcodes/)
- [Foundry vm.etch](https://book.getfoundry.sh/cheatcodes/etch)
- [RLP Encoding](https://ethereum.org/en/developers/docs/data-structures-and-encoding/rlp/)