152 lines
3.8 KiB
Markdown
152 lines
3.8 KiB
Markdown
|
|
# Address Mapping Documentation
|
||
|
|
|
||
|
|
## Overview
|
||
|
|
|
||
|
|
This document describes the address mapping system that maps reserved addresses from `genesis.json` to actual deployed contract addresses.
|
||
|
|
|
||
|
|
## Problem
|
||
|
|
|
||
|
|
The `genesis.json` file contains reserved addresses for WETH9 and WETH10:
|
||
|
|
- **WETH9**: `0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2`
|
||
|
|
- **WETH10**: `0xf4BB2e28688e89fCcE3c0580D37d36A7672E8A9F`
|
||
|
|
|
||
|
|
These are Ethereum mainnet addresses that were originally deployed using `CREATE` (not `CREATE2`), so they cannot be recreated with `CREATE2` on ChainID 138.
|
||
|
|
|
||
|
|
## Solution
|
||
|
|
|
||
|
|
We deploy the contracts to new addresses and maintain a mapping from the genesis addresses to the deployed addresses.
|
||
|
|
|
||
|
|
### Actual Deployed Addresses
|
||
|
|
|
||
|
|
- **WETH9**: `0x3304b747E565a97ec8AC220b0B6A1f6ffDB837e6`
|
||
|
|
- **WETH10**: `0x105F8A15b819948a89153505762444Ee9f324684`
|
||
|
|
|
||
|
|
## Mapping Components
|
||
|
|
|
||
|
|
### 1. JSON Configuration File
|
||
|
|
|
||
|
|
**File**: `config/address-mapping.json`
|
||
|
|
|
||
|
|
Contains the mapping in JSON format for easy reference and tooling.
|
||
|
|
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"mappings": {
|
||
|
|
"WETH9": {
|
||
|
|
"genesisAddress": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",
|
||
|
|
"deployedAddress": "0x3304b747E565a97ec8AC220b0B6A1f6ffDB837e6"
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### 2. On-Chain Contract
|
||
|
|
|
||
|
|
**Contract**: `AddressMapper.sol`
|
||
|
|
|
||
|
|
Provides on-chain address mapping that can be queried by other contracts.
|
||
|
|
|
||
|
|
```solidity
|
||
|
|
AddressMapper mapper = AddressMapper(mapperAddress);
|
||
|
|
address deployed = mapper.getDeployedAddress(genesisAddress);
|
||
|
|
```
|
||
|
|
|
||
|
|
### 3. Environment Variables
|
||
|
|
|
||
|
|
**File**: `.env`
|
||
|
|
|
||
|
|
Contains both genesis and deployed addresses for easy access:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
WETH9_GENESIS_ADDRESS=0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
|
||
|
|
WETH9_DEPLOYED_ADDRESS=0x3304b747E565a97ec8AC220b0B6A1f6ffDB837e6
|
||
|
|
WETH10_GENESIS_ADDRESS=0xf4BB2e28688e89fCcE3c0580D37d36A7672E8A9F
|
||
|
|
WETH10_DEPLOYED_ADDRESS=0x105F8A15b819948a89153505762444Ee9f324684
|
||
|
|
```
|
||
|
|
|
||
|
|
## Usage
|
||
|
|
|
||
|
|
### Query Mapping from Command Line
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Get mapped address for a genesis address
|
||
|
|
./scripts/utils/get-mapped-address.sh 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
|
||
|
|
```
|
||
|
|
|
||
|
|
### Use in Contracts
|
||
|
|
|
||
|
|
```solidity
|
||
|
|
import {AddressMapper} from "./utils/AddressMapper.sol";
|
||
|
|
|
||
|
|
AddressMapper mapper = AddressMapper(0x...); // Deploy AddressMapper first
|
||
|
|
address weth9 = mapper.getDeployedAddress(0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2);
|
||
|
|
```
|
||
|
|
|
||
|
|
### Use in Scripts
|
||
|
|
|
||
|
|
```solidity
|
||
|
|
// In Foundry scripts
|
||
|
|
address weth9Genesis = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;
|
||
|
|
address weth9Deployed = 0x3304b747E565a97ec8AC220b0B6A1f6ffDB837e6;
|
||
|
|
|
||
|
|
// Or use AddressMapper contract
|
||
|
|
AddressMapper mapper = AddressMapper(mapperAddress);
|
||
|
|
address weth9 = mapper.getDeployedAddress(weth9Genesis);
|
||
|
|
```
|
||
|
|
|
||
|
|
## Deployment
|
||
|
|
|
||
|
|
### Deploy AddressMapper Contract
|
||
|
|
|
||
|
|
```bash
|
||
|
|
forge script script/DeployAddressMapper.s.sol:DeployAddressMapper \
|
||
|
|
--rpc-url $RPC_URL \
|
||
|
|
--broadcast \
|
||
|
|
--private-key $PRIVATE_KEY \
|
||
|
|
--legacy
|
||
|
|
```
|
||
|
|
|
||
|
|
After deployment, add the AddressMapper address to `.env`:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
ADDRESS_MAPPER=0x...
|
||
|
|
```
|
||
|
|
|
||
|
|
## Best Practices
|
||
|
|
|
||
|
|
1. **Always use deployed addresses** for contract interactions
|
||
|
|
2. **Keep genesis addresses** in genesis.json for reference/compatibility
|
||
|
|
3. **Use AddressMapper contract** for on-chain lookups
|
||
|
|
4. **Update mappings** if contracts are redeployed
|
||
|
|
|
||
|
|
## Adding New Mappings
|
||
|
|
|
||
|
|
### Update JSON File
|
||
|
|
|
||
|
|
Edit `config/address-mapping.json` and add the new mapping.
|
||
|
|
|
||
|
|
### Update AddressMapper Contract
|
||
|
|
|
||
|
|
If AddressMapper is deployed, call `setMapping()`:
|
||
|
|
|
||
|
|
```solidity
|
||
|
|
mapper.setMapping(genesisAddress, deployedAddress);
|
||
|
|
```
|
||
|
|
|
||
|
|
### Update .env
|
||
|
|
|
||
|
|
Add the new addresses to `.env`:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
NEW_CONTRACT_GENESIS_ADDRESS=0x...
|
||
|
|
NEW_CONTRACT_DEPLOYED_ADDRESS=0x...
|
||
|
|
```
|
||
|
|
|
||
|
|
## See Also
|
||
|
|
|
||
|
|
- `config/address-mapping.json` - JSON mapping file
|
||
|
|
- `contracts/utils/AddressMapper.sol` - On-chain mapping contract
|
||
|
|
- `script/DeployAddressMapper.s.sol` - Deployment script
|
||
|
|
- `scripts/utils/get-mapped-address.sh` - Utility script
|
||
|
|
|