- Resolve stash: merge load_deployment_env path with secure-secrets and CR/LF RPC strip - create-pmm-full-mesh-chain138.sh delegates to sync-chain138-pmm-pools-from-json.sh - env.additions.example: canonical PMM pool defaults (cUSDT/USDT per crosscheck) - Include Chain138 scripts, official mirror deploy scaffolding, and prior staged changes Made-with: Cursor
200 lines
13 KiB
Markdown
200 lines
13 KiB
Markdown
# All Mainnets Deployment Runbook — CCIP, Trustless Bridge, Oracle, AMB, Mapper, PMM (Anchored to ChainID 138)
|
||
|
||
This runbook ensures deployment of **CCIP Bridge**, **Trustless Bridge**, **Oracle**, **AMB Messaging** (relay), **Mapper**, and **PMM Liquidity Pools** across all mainnets, anchored to ChainID 138.
|
||
|
||
---
|
||
|
||
## 1. Prerequisites
|
||
|
||
- **One-shot check:** Run `scripts/deployment/ensure-prerequisites.sh` from `smom-dbis-138` to validate .env and deps (see [PREREQUISITES.md](./PREREQUISITES.md)).
|
||
- `.env` with `PRIVATE_KEY`, `RPC_URL_138`, `ETHEREUM_MAINNET_RPC`, and per-chain RPC/CCIP vars (see below).
|
||
- **Dependencies (CCIPLogger):** From `smom-dbis-138` run `npm install --legacy-peer-deps` so Hardhat is available locally.
|
||
- Sufficient gas token on each target chain (run `scripts/deployment/check-balances-gas-and-deploy.sh`).
|
||
- For **LINK funding:** deployer must have LINK on each chain. For **PMM:** set `DODO_VENDING_MACHINE_ADDRESS` on Chain 138 when available.
|
||
- Verify CCIP router/LINK/selector per chain from [Chainlink CCIP Supported Networks](https://docs.chain.link/ccip/supported-networks) if you add new chains.
|
||
|
||
---
|
||
|
||
## 2. .env Updates (Completed)
|
||
|
||
- **Ethereum Mainnet**: `MAINNET_CCIP_WETH9_BRIDGE`, `MAINNET_CCIP_WETH10_BRIDGE`, `CCIP_ETH_*`, `ETH_MAINNET_SELECTOR`, `WETH9_MAINNET`, `WETH10_MAINNET`.
|
||
- **Avalanche, Arbitrum, Cronos**: `CCIPWETH9_BRIDGE_*`, `CCIPWETH10_BRIDGE_*` updated to latest deployed addresses.
|
||
- **BSC, Polygon, Base, Optimism, Gnosis**: `CCIP_*_ROUTER`, `CCIP_*_LINK_TOKEN`, `*_SELECTOR` added for DeployAll.
|
||
|
||
---
|
||
|
||
## 3. Deployment Matrix (Anchored to ChainID 138)
|
||
|
||
| Component | Chain 138 | Ethereum | BSC | Polygon | Base | Arbitrum | Optimism | Avalanche | Cronos | Gnosis |
|
||
|-----------|-----------|----------|-----|---------|------|----------|----------|-----------|--------|--------|
|
||
| **CCIP Bridge** (WETH9/WETH10) | ✅ | ✅ | script | script | script | ✅ | script | ✅ | ✅ | script |
|
||
| **Trustless Bridge** | Lockbox | Bond/Challenge/LP/Inbox/Swap/Coord | — | — | — | — | — | — | — | — |
|
||
| **Oracle** | ✅ | optional | optional | optional | optional | optional | optional | optional | ✅ | optional |
|
||
| **AMB / Relay** | Source (router) | Relay Router+Bridge | — | — | — | — | — | — | — | — |
|
||
| **Mapper** | ✅ AddressMapper | AddressMapperEmpty | script | script | script | script | script | script | script | script |
|
||
| **PMM Liquidity Pools** | ✅ DODO (138) | — | — | — | — | — | — | — | — | — |
|
||
|
||
- **CCIP**: DeployAll.s.sol per chain. Chain 138 and Ethereum use existing WETH/bridges; other chains deploy or reuse WETH+bridges.
|
||
- **Trustless Bridge**: DeployTrustlessBridge.s.sol on **Chain 138** (Lockbox) and **Ethereum** (BondManager, ChallengeManager, LiquidityPool, InboxETH, SwapRouter, BridgeSwapCoordinator). Other mainnets not in scope for trustless bridge.
|
||
- **Oracle**: DeployOracle.s.sol — primary on Chain 138; optional on others if needed for price feeds.
|
||
- **AMB Messaging**: Relay (138→Ethereum) = CCIP Relay Router + Relay Bridge on Mainnet; source = Chain 138 CCIP router. Already deployed per `services/relay/README.md`.
|
||
- **Mapper**: DeployAddressMapper.s.sol on **Chain 138** (with mappings); DeployAddressMapperOtherChain.s.sol on **other mainnets** (empty mapper for address mapping layer).
|
||
- **PMM Liquidity Pools**: DODOPMMIntegration + pool creation on **Chain 138** (anchored to 138). Other chains use DEX integrations as configured.
|
||
|
||
---
|
||
|
||
## 4. Run Order (High Level)
|
||
|
||
1. **Chain 138** (anchor): Core (01_DeployCore, 02_DeployBridges), Oracle, AddressMapper, ReserveSystem, DODO PMM Integration, Trustless Lockbox.
|
||
2. **Ethereum Mainnet**: CCIP bridges (done), Trustless (BondManager, ChallengeManager, LP, Inbox, SwapRouter, Coordinator), Relay Router+Bridge, optional Oracle, Mapper (empty).
|
||
3. **Other mainnets** (BSC, Polygon, Base, Optimism, Avalanche, Cronos, Gnosis): DeployAll.s.sol (CCIP bridges + existing WETH where set), then DeployAddressMapperOtherChain.s.sol per chain.
|
||
|
||
---
|
||
|
||
## 5. Commands Reference
|
||
|
||
### 5.1 CCIP Bridges (all mainnets with CCIP config in .env)
|
||
|
||
```bash
|
||
cd /home/intlc/projects/proxmox/smom-dbis-138
|
||
set +u && source .env && set -u 2>/dev/null || true
|
||
[[ -f scripts/lib/infura.sh ]] && source scripts/lib/infura.sh
|
||
|
||
# RPC with Infura Basic Auth when secret set
|
||
for chain in BSC:56 POLYGON:137 BASE:8453 OPTIMISM:10 GNOSIS:100; do
|
||
name="${chain%:*}"; id="${chain#*:}"
|
||
rpc_var="${name}_RPC_URL"; rpc_var="${rpc_var/BNB/MAINNET}"
|
||
[ "$name" = "BSC" ] && rpc_var="BSC_RPC_URL"
|
||
[ "$name" = "POLYGON" ] && rpc_var="POLYGON_MAINNET_RPC"
|
||
[ "$name" = "BASE" ] && rpc_var="BASE_MAINNET_RPC"
|
||
[ "$name" = "OPTIMISM" ] && rpc_var="OPTIMISM_MAINNET_RPC"
|
||
[ "$name" = "GNOSIS" ] && rpc_var="GNOSIS_MAINNET_RPC"
|
||
rpc="${!rpc_var}"
|
||
type ensure_infura_rpc_url &>/dev/null && rpc=$(ensure_infura_rpc_url "$rpc")
|
||
[ -z "$rpc" ] && continue
|
||
echo "DeployAll to $name (chain $id)..."
|
||
forge script script/DeployAll.s.sol:DeployAll --rpc-url "$rpc" --chain-id "$id" --private-key "$PRIVATE_KEY" --broadcast --slow -vvv
|
||
done
|
||
```
|
||
|
||
### 5.2 Trustless Bridge (Chain 138 + Ethereum)
|
||
|
||
```bash
|
||
# Chain 138: Lockbox
|
||
forge script script/bridge/trustless/DeployTrustlessBridge.s.sol:DeployTrustlessBridge \
|
||
--rpc-url "$RPC_URL_138" --broadcast --via-ir --private-key "$PRIVATE_KEY"
|
||
|
||
# Ethereum: BondManager, ChallengeManager, LiquidityPool, InboxETH, SwapRouter, BridgeSwapCoordinator
|
||
MAINNET_RPC="${ETHEREUM_MAINNET_RPC}"; type ensure_infura_rpc_url &>/dev/null && MAINNET_RPC=$(ensure_infura_rpc_url "$MAINNET_RPC")
|
||
forge script script/bridge/trustless/DeployTrustlessBridge.s.sol:DeployTrustlessBridge \
|
||
--rpc-url "$MAINNET_RPC" --broadcast --via-ir --private-key "$PRIVATE_KEY" --verify --etherscan-api-key "$ETHERSCAN_API_KEY"
|
||
```
|
||
|
||
### 5.3 Oracle (Chain 138 first; optional others)
|
||
|
||
```bash
|
||
forge script script/DeployOracle.s.sol:DeployOracle \
|
||
--rpc-url "$RPC_URL_138" --broadcast --private-key "$PRIVATE_KEY" --with-gas-price 1000000000 --legacy
|
||
```
|
||
|
||
### 5.4 Mapper (Chain 138 = full; others = empty)
|
||
|
||
```bash
|
||
# Chain 138 (full AddressMapper with mappings)
|
||
forge script script/DeployAddressMapper.s.sol:DeployAddressMapper \
|
||
--rpc-url "$RPC_URL_138" --broadcast --private-key "$PRIVATE_KEY" --with-gas-price 1000000000 --legacy
|
||
|
||
# Other mainnets (AddressMapperEmpty)
|
||
for chain in ETHEREUM:1 BSC:56 POLYGON:137 BASE:8453 ARBITRUM:42161 OPTIMISM:10 AVALANCHE:43114 CRONOS:25 GNOSIS:100; do
|
||
name="${chain%:*}"; id="${chain#*:}"
|
||
rpc_var="${name}_MAINNET_RPC"; [ "$name" = "ETHEREUM" ] && rpc_var="ETHEREUM_MAINNET_RPC"
|
||
[ "$name" = "BSC" ] && rpc_var="BSC_RPC_URL"; [ "$name" = "AVALANCHE" ] && rpc_var="AVALANCHE_RPC_URL"
|
||
[ "$name" = "ARBITRUM" ] && rpc_var="ARBITRUM_MAINNET_RPC"; [ "$name" = "CRONOS" ] && rpc_var="CRONOS_RPC_URL"
|
||
rpc="${!rpc_var}"; type ensure_infura_rpc_url &>/dev/null && rpc=$(ensure_infura_rpc_url "$rpc")
|
||
[ -z "$rpc" ] && continue
|
||
forge script script/DeployAddressMapperOtherChain.s.sol:DeployAddressMapperOtherChain \
|
||
--rpc-url "$rpc" --chain-id "$id" --broadcast --private-key "$PRIVATE_KEY"
|
||
done
|
||
```
|
||
|
||
### 5.5 PMM Liquidity Pools (Chain 138)
|
||
|
||
```bash
|
||
# Requires: DODO_VENDING_MACHINE_ADDRESS, COMPLIANT_USDT_ADDRESS, COMPLIANT_USDC_ADDRESS (or equiv) in .env
|
||
forge script script/dex/DeployDODOPMMIntegration.s.sol:DeployDODOPMMIntegration \
|
||
--rpc-url "$RPC_URL_138" --broadcast --private-key "$PRIVATE_KEY" --with-gas-price 1000000000 --legacy
|
||
|
||
# Create pools (e.g. XAU-anchored): set DODOPMM_INTEGRATION_ADDRESS, XAU_ADDRESS_138
|
||
forge script script/dex/DeployPrivatePoolRegistryAndPools.s.sol:DeployPrivatePoolRegistryAndPools \
|
||
--rpc-url "$RPC_URL_138" --broadcast --private-key "$PRIVATE_KEY" --with-gas-price 1000000000 --legacy
|
||
```
|
||
|
||
### 5.6 AMB / Relay (Ethereum Mainnet)
|
||
|
||
- Relay Router and Relay Bridge are already deployed (see `CCIP_RELAY_ROUTER_MAINNET`, `CCIP_RELAY_BRIDGE_MAINNET` in .env).
|
||
- To redeploy: `forge script script/DeployCCIPRelay.s.sol:DeployCCIPRelay --rpc-url $ETHEREUM_MAINNET_RPC --broadcast --legacy --via-ir`
|
||
|
||
---
|
||
|
||
## 6. Next Steps Checklist
|
||
|
||
- [x] Run balance check: `DEPLOYER_ADDRESS=0x4A66... bash scripts/deployment/check-balances-gas-and-deploy.sh`
|
||
- [x] Deploy CCIP to BSC, Polygon, Base, Optimism, Gnosis (DeployAll.s.sol)
|
||
- [x] Run Trustless Bridge on Chain 138 + Ethereum: `bash scripts/deployment/deploy-all-mainnets-with-mapper-oracle-pmm.sh trustless` (Lockbox 138: 0xC3a91d46…; Mainnet: BondManager, ChallengeManager, LP, Inbox, SwapRouter, Coordinator — update .env)
|
||
- [x] Deploy Oracle on Chain 138 (Aggregator: 0x452a4701..., Proxy: 0x404DcD22...)
|
||
- [x] Deploy Mapper: AddressMapper on 138 (0xe48E3f24...); AddressMapperEmpty on Ethereum, BSC, Polygon, Base, Arbitrum, Optimism, Avalanche, Cronos, Gnosis
|
||
- [ ] Deploy DODO PMM Integration + pools on Chain 138 (see **Remaining gaps: PMM** below)
|
||
- [x] Update config/smart-contracts-master.json with mapper addresses per chain (and Oracle on 138)
|
||
- [x] Configure bridge destinations (addDestination): Step B done for all mainnets (Ethereum, BSC, Polygon, Base, Optimism, Arbitrum, Avalanche, Cronos, Gnosis); Step A (138 → mainnets) uses `--gas-limit` in script (see **CCIP_BRIDGE_DESTINATIONS_AND_LINK_FUNDING.md**)
|
||
- [ ] Fund bridges with LINK on each chain (see **CCIP_BRIDGE_DESTINATIONS_AND_LINK_FUNDING.md**)
|
||
- [ ] Deploy CCIPLogger per chain if required (see **Remaining gaps: CCIPLogger** below)
|
||
|
||
### Remaining gaps: PMM and CCIPLogger
|
||
|
||
- **PMM (Chain 138):** The `pmm` phase of `deploy-all-mainnets-with-mapper-oracle-pmm.sh` is skipped unless `DODO_VENDING_MACHINE_ADDRESS` (and related DODO/stablecoin env vars) are set in `.env`. Deploy DODO PMM Integration and pools only after setting these; see §5.5 and run the DODO scripts manually.
|
||
- **CCIPLogger:** DeployAll.s.sol does **not** deploy CCIPLogger (outputs a Hardhat-based instruction). To have a logger on each mainnet, deploy per chain using the Hardhat script (e.g. `npm run deploy:logger:mainnet` or a chain-specific deployment). Optional for basic bridge operation.
|
||
|
||
### PMM (Chain 138) completion checklist
|
||
|
||
1. Set **DODO_VENDING_MACHINE_ADDRESS** in `.env` to the DODO DVM factory address on Chain 138. **Chain 138 is not in DODO’s official list** — see [DVM_DEPLOYMENT_CHECK.md](DVM_DEPLOYMENT_CHECK.md). Deploy the factory yourself from [DODOEX](https://github.com/DODOEX) or use an existing deployment if available.
|
||
2. Set **OFFICIAL_USDT_ADDRESS** and **OFFICIAL_USDC_ADDRESS** to the live Chain 138 quote-side mirror stables:
|
||
- `OFFICIAL_USDT_ADDRESS=0x004b63A7B5b0E06f6bB6adb4a5F9f590BF3182D1`
|
||
- `OFFICIAL_USDC_ADDRESS=0x71D6687F38b93CCad569Fa6352c876eea967201b`
|
||
3. Run: `bash scripts/deployment/deploy-all-mainnets-with-mapper-oracle-pmm.sh pmm` to deploy DODOPMMIntegration.
|
||
4. Set **DODOPMM_INTEGRATION_ADDRESS** (or DODO_PMM_INTEGRATION) in .env from the deploy output, then create pools:
|
||
- cUSDT/USDT and cUSDC/USDC: call `createCUSDTUSDTPool` and `createCUSDCUSDCPool` on the integration (see `docs/integration/DODO_PMM_INTEGRATION.md`).
|
||
- XAU-anchored: set **XAU_ADDRESS_138** and run `forge script script/dex/DeployPrivatePoolRegistryAndPools.s.sol:DeployPrivatePoolRegistryAndPools --rpc-url $RPC_URL_138 --broadcast --private-key $PRIVATE_KEY --with-gas-price 1000000000 --legacy`.
|
||
|
||
### Deployed Mapper Addresses (for config/smart-contracts-master.json)
|
||
|
||
| Chain ID | Network | Mapper (AddressMapperEmpty) |
|
||
|----------|-----------|----------------------------------|
|
||
| 138 | Chain 138 | 0xe48E3f248698610e18Db865457fcd935Bb3da856 (AddressMapper) |
|
||
| 1 | Ethereum | 0x0ea68F5B5A8427bB58e54ECcee941F543Dc538c5 |
|
||
| 56 | BSC | 0x6e94e53F73893b2a6784Df663920D31043A6dE07 |
|
||
| 137 | Polygon | 0xb689c1C69DAa08DEb5D8feA2aBF0F64bFD409727 |
|
||
| 8453 | Base | 0x6e94e53F73893b2a6784Df663920D31043A6dE07 |
|
||
| 42161 | Arbitrum | 0xB142e7f4D3Cc0dd231BB1867E815342932431Bb5 |
|
||
| 10 | Optimism | 0xDAB0591e5e89295fFaD75A71Dcfc30c5625C4fA2 |
|
||
| 43114 | Avalanche | 0x73376eB92c16977B126dB9112936A20Fa0De3442 |
|
||
| 25 | Cronos | 0x3f8C409C6072a2B6a4Ff17071927bA70F80c725F |
|
||
| 100 | Gnosis | 0x99B3511A2d315A497C8112C1fdd8D508d4B1E506 |
|
||
|
||
---
|
||
|
||
## 7. Script: Deploy All Mainnets (Orchestrator)
|
||
|
||
Use `scripts/deployment/deploy-all-mainnets-with-mapper-oracle-pmm.sh` to run the above in order (see script for exact steps and guards).
|
||
|
||
## 8. Remaining operator tasks (scripts provided)
|
||
|
||
| Task | Script / Notes |
|
||
|------|----------------|
|
||
| Fund bridges with LINK | `scripts/deployment/fund-ccip-bridges-with-link.sh` — use `--link <amount>` (default 10 LINK), `--dry-run` to print only. See [CCIP_BRIDGE_DESTINATIONS_AND_LINK_FUNDING.md](./CCIP_BRIDGE_DESTINATIONS_AND_LINK_FUNDING.md). |
|
||
| PMM (Chain 138) | `scripts/deployment/run-pmm-and-pools.sh` — set `DODO_VENDING_MACHINE_ADDRESS` (and official tokens) in .env first; script runs pmm phase then optional XAU pools if `XAU_ADDRESS_138` and `DODOPMM_INTEGRATION_ADDRESS` are set. |
|
||
| CCIPLogger | `scripts/deployment/deploy-ccip-logger-all-chains.sh` — from `smom-dbis-138` run after `pnpm install`; deploys to mainnet, BSC, Polygon, Gnosis, Cronos. Optional. |
|
||
|
||
## 9. Related docs
|
||
|
||
- **Bridge destinations and LINK funding:** [CCIP_BRIDGE_DESTINATIONS_AND_LINK_FUNDING.md](./CCIP_BRIDGE_DESTINATIONS_AND_LINK_FUNDING.md) — `addDestination` per bridge and LINK funding for CCIP fees.
|