Files
smom-dbis-138/docs/deployment/ALL_MAINNETS_DEPLOYMENT_RUNBOOK.md
defiQUG 2a4753eb2d feat: restore operator WIP — PMM JSON sync entrypoint, dotenv RPC trim + secrets, pool env alignment
- 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
2026-03-27 19:02:30 -07:00

13 KiB
Raw Permalink Blame History

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).
  • .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 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)

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_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

  • 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-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 DODOs official list — see DVM_DEPLOYMENT_CHECK.md. Deploy the factory yourself from 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.
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.