- 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
13 KiB
13 KiB
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.shfromsmom-dbis-138to validate .env and deps (see PREREQUISITES.md). .envwithPRIVATE_KEY,RPC_URL_138,ETHEREUM_MAINNET_RPC, and per-chain RPC/CCIP vars (see below).- Dependencies (CCIPLogger): From
smom-dbis-138runnpm install --legacy-peer-depsso 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_ADDRESSon Chain 138 when available. - Verify CCIP router/LINK/selector per chain from Chainlink 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,*_SELECTORadded 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)
- Chain 138 (anchor): Core (01_DeployCore, 02_DeployBridges), Oracle, AddressMapper, ReserveSystem, DODO PMM Integration, Trustless Lockbox.
- Ethereum Mainnet: CCIP bridges (done), Trustless (BondManager, ChallengeManager, LP, Inbox, SwapRouter, Coordinator), Relay Router+Bridge, optional Oracle, Mapper (empty).
- 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)
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)
# 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)
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)
# 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)
# 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_MAINNETin .env). - To redeploy:
forge script script/DeployCCIPRelay.s.sol:DeployCCIPRelay --rpc-url $ETHEREUM_MAINNET_RPC --broadcast --legacy --via-ir
6. Next Steps Checklist
- Run balance check:
DEPLOYER_ADDRESS=0x4A66... bash scripts/deployment/check-balances-gas-and-deploy.sh - Deploy CCIP to BSC, Polygon, Base, Optimism, Gnosis (DeployAll.s.sol)
- 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) - Deploy Oracle on Chain 138 (Aggregator: 0x452a4701..., Proxy: 0x404DcD22...)
- 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)
- Update config/smart-contracts-master.json with mapper addresses per chain (and Oracle on 138)
- 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-limitin 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
pmmphase ofdeploy-all-mainnets-with-mapper-oracle-pmm.shis skipped unlessDODO_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:mainnetor a chain-specific deployment). Optional for basic bridge operation.
PMM (Chain 138) completion checklist
- Set DODO_VENDING_MACHINE_ADDRESS in
.envto the DODO DVM factory address on Chain 138. Chain 138 is not in DODO’s official list — see DVM_DEPLOYMENT_CHECK.md. Deploy the factory yourself from DODOEX or use an existing deployment if available. - Set OFFICIAL_USDT_ADDRESS and OFFICIAL_USDC_ADDRESS to the live Chain 138 quote-side mirror stables:
OFFICIAL_USDT_ADDRESS=0x004b63A7B5b0E06f6bB6adb4a5F9f590BF3182D1OFFICIAL_USDC_ADDRESS=0x71D6687F38b93CCad569Fa6352c876eea967201b
- Run:
bash scripts/deployment/deploy-all-mainnets-with-mapper-oracle-pmm.sh pmmto deploy DODOPMMIntegration. - Set DODOPMM_INTEGRATION_ADDRESS (or DODO_PMM_INTEGRATION) in .env from the deploy output, then create pools:
- cUSDT/USDT and cUSDC/USDC: call
createCUSDTUSDTPoolandcreateCUSDCUSDCPoolon the integration (seedocs/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.
- cUSDT/USDT and cUSDC/USDC: call
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. |
| 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 —
addDestinationper bridge and LINK funding for CCIP fees.