- 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.
214 lines
7.3 KiB
Markdown
214 lines
7.3 KiB
Markdown
# Predeployed WETH Architecture
|
|
|
|
## Overview
|
|
|
|
WETH9 and WETH10 are **predeployed** at their canonical Ethereum Mainnet addresses via the `alloc` section in `genesis.json`. This provides the "same address across chains" property, enabling seamless cross-chain compatibility.
|
|
|
|
## Canonical Addresses
|
|
|
|
| Contract | Mainnet Address | ChainID 138 Address |
|
|
|----------|----------------|---------------------|
|
|
| **WETH9** | `0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2` | `0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2` ✅ Same |
|
|
| **WETH10** | `0xf4BB2e28688e89fCcE3c0580D37d36A7672E8A9f` | `0xf4BB2e28688e89fCcE3c0580D37d36A7672E8A9f` ✅ Same |
|
|
|
|
## Benefits
|
|
|
|
1. **Same Address Across Chains**: Users can use the same WETH addresses on both Mainnet and ChainID 138
|
|
2. **No Deployment Needed**: Contracts exist from genesis block
|
|
3. **Cross-Chain Compatibility**: DApps can reference the same addresses
|
|
4. **WETH10 Advanced Features**: Flash-mint and complex structures work out of the box
|
|
|
|
## Genesis Configuration
|
|
|
|
The contracts are added to `genesis.json` in the `alloc` section:
|
|
|
|
```json
|
|
{
|
|
"alloc": {
|
|
"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2": {
|
|
"code": "0x608060405234801561001057600080fd5b50...",
|
|
"balance": "0x0"
|
|
},
|
|
"0xf4BB2e28688e89fCcE3c0580D37d36A7672E8A9f": {
|
|
"code": "0x608060405234801561001057600080fd5b50...",
|
|
"balance": "0x0"
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
## Bridge Architecture
|
|
|
|
### Cross-Chain Bridge Pattern
|
|
|
|
The bridge contracts (`CCIPWETH9Bridge` and `CCIPWETH10Bridge`) work with the predeployed WETH contracts:
|
|
|
|
```
|
|
┌─────────────────────────────────────────────────────────────┐
|
|
│ Ethereum Mainnet │
|
|
│ │
|
|
│ User WETH (0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2) │
|
|
│ │ │
|
|
│ │ Lock/Burn │
|
|
│ ▼ │
|
|
│ CCIPWETH9Bridge │
|
|
│ │ │
|
|
│ │ CCIP Message │
|
|
│ ▼ │
|
|
└───────────┼──────────────────────────────────────────────────┘
|
|
│
|
|
│ CCIP Cross-Chain
|
|
│
|
|
┌───────────┼──────────────────────────────────────────────────┐
|
|
│ ▼ ChainID 138 │
|
|
│ CCIPWETH9Bridge │
|
|
│ │ │
|
|
│ │ Mint/Unlock │
|
|
│ ▼ │
|
|
│ WETH9 (0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2) │
|
|
│ │ │
|
|
│ │ User receives WETH │
|
|
│ ▼ │
|
|
│ User │
|
|
└─────────────────────────────────────────────────────────────┘
|
|
```
|
|
|
|
### Bridge Functions
|
|
|
|
#### Lock/Unlock Pattern (WETH9)
|
|
|
|
**On Mainnet:**
|
|
1. User deposits WETH to bridge
|
|
2. Bridge locks WETH (transfers from user)
|
|
3. Bridge sends CCIP message to ChainID 138
|
|
|
|
**On ChainID 138:**
|
|
1. Bridge receives CCIP message
|
|
2. Bridge mints WETH to user (same address as Mainnet)
|
|
|
|
#### Mint/Burn Pattern (WETH10)
|
|
|
|
**On Mainnet:**
|
|
1. User deposits WETH to bridge
|
|
2. Bridge burns WETH
|
|
3. Bridge sends CCIP message to ChainID 138
|
|
|
|
**On ChainID 138:**
|
|
1. Bridge receives CCIP message
|
|
2. Bridge mints WETH to user (same address as Mainnet)
|
|
|
|
### Bridge Contract Implementation
|
|
|
|
The bridge contracts reference the predeployed WETH addresses:
|
|
|
|
```solidity
|
|
// CCIPWETH9Bridge.sol
|
|
address public immutable weth9 = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;
|
|
|
|
// CCIPWETH10Bridge.sol
|
|
address public immutable weth10 = 0xf4BB2e28688e89fCcE3c0580D37d36A7672E8A9f;
|
|
```
|
|
|
|
## WETH10 Advanced Features
|
|
|
|
WETH10 is treated as an advanced instrument with:
|
|
|
|
- **Flash-Mint**: ERC-3156 flash loan support
|
|
- **Complex Structures**: More sophisticated internal logic
|
|
- **Same Address**: Works seamlessly across chains
|
|
|
|
## Deployment Process
|
|
|
|
### 1. Compile Contracts
|
|
|
|
```bash
|
|
forge build
|
|
```
|
|
|
|
### 2. Add to Genesis
|
|
|
|
```bash
|
|
./scripts/genesis/add-predeployed-weth.sh
|
|
```
|
|
|
|
This script:
|
|
- Compiles WETH9 and WETH10
|
|
- Extracts bytecode
|
|
- Adds to `genesis.json` `alloc` section
|
|
- Backs up original genesis file
|
|
|
|
### 3. Deploy Bridge Contracts
|
|
|
|
```bash
|
|
# Deploy CCIPWETH9Bridge
|
|
forge script script/DeployCCIPWETH9Bridge.s.sol --rpc-url $RPC_URL --broadcast
|
|
|
|
# Deploy CCIPWETH10Bridge
|
|
forge script script/DeployCCIPWETH10Bridge.s.sol --rpc-url $RPC_URL --broadcast
|
|
```
|
|
|
|
### 4. Verify
|
|
|
|
```bash
|
|
# Check WETH9 exists at canonical address
|
|
cast code 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 --rpc-url $RPC_URL
|
|
|
|
# Check WETH10 exists at canonical address
|
|
cast code 0xf4BB2e28688e89fCcE3c0580D37d36A7672E8A9f --rpc-url $RPC_URL
|
|
```
|
|
|
|
## Cross-Chain Usage
|
|
|
|
### Example: User Wants to Bridge WETH
|
|
|
|
1. **User on Mainnet**:
|
|
```solidity
|
|
// Approve bridge
|
|
IERC20(WETH9).approve(bridgeAddress, amount);
|
|
|
|
// Bridge WETH
|
|
CCIPWETH9Bridge(bridgeAddress).sendCrossChain(
|
|
destinationChainSelector,
|
|
recipient,
|
|
amount
|
|
);
|
|
```
|
|
|
|
2. **Bridge on Mainnet**:
|
|
- Locks WETH from user
|
|
- Sends CCIP message
|
|
|
|
3. **Bridge on ChainID 138**:
|
|
- Receives CCIP message
|
|
- Mints WETH to user at same address
|
|
|
|
4. **User on ChainID 138**:
|
|
- Receives WETH at `0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2`
|
|
- Can use immediately (same address as Mainnet)
|
|
|
|
## Security Considerations
|
|
|
|
1. **Bytecode Verification**: Ensure bytecode matches Mainnet exactly
|
|
2. **Initial State**: Contracts start with zero balance (no pre-minted tokens)
|
|
3. **Bridge Security**: Bridge contracts must be secure (audit recommended)
|
|
4. **Access Control**: Only bridge contracts should mint/burn on ChainID 138
|
|
|
|
## Advantages Over Deployment
|
|
|
|
| Aspect | Predeployment | Deployment |
|
|
|--------|--------------|------------|
|
|
| **Address** | ✅ Same as Mainnet | ❌ Different |
|
|
| **Cross-Chain** | ✅ Seamless | ⚠️ Requires mapping |
|
|
| **User Experience** | ✅ Same addresses | ❌ Different addresses |
|
|
| **DApp Compatibility** | ✅ Works immediately | ⚠️ Needs updates |
|
|
|
|
## Conclusion
|
|
|
|
Predeploying WETH9 and WETH10 at their canonical Mainnet addresses provides:
|
|
- ✅ Same addresses across chains
|
|
- ✅ Seamless cross-chain compatibility
|
|
- ✅ Better user experience
|
|
- ✅ DApp compatibility out of the box
|
|
|
|
The bridge contracts handle the lock/unlock and mint/burn operations, enabling true cross-chain WETH transfers while maintaining address consistency.
|