2026-03-27 19:02:30 -07:00
#!/usr/bin/env bash
# Configure Chain 138 ↔ Ethereum mainnet CCIP WETH bridge destinations.
# Uses CCIPWETH9Bridge / CCIPWETH10Bridge addDestination(uint64,address) (receiver = peer bridge on the other chain).
# For Gnosis/Cronos/Celo/Wemix, use complete-config-ready-chains.sh instead.
#
# Env: PRIVATE_KEY; bridge addresses (see below); RPC_URL_138; ETHEREUM_MAINNET_RPC or RPC_URL_MAINNET.
#
# shellcheck disable=SC1090
set -euo pipefail
SCRIPT_DIR = " $( cd " $( dirname " ${ BASH_SOURCE [0] } " ) " && pwd ) "
PROJECT_ROOT = " $( cd " $SCRIPT_DIR /../.. " && pwd ) "
if [ [ -f " $SCRIPT_DIR /../lib/deployment/dotenv.sh " ] ] ; then
source " $SCRIPT_DIR /../lib/deployment/dotenv.sh "
load_deployment_env --repo-root " $PROJECT_ROOT "
fi
2025-12-12 14:57:48 -08:00
2026-03-02 12:14:09 -08:00
RED = '\033[0;31m'
GREEN = '\033[0;32m'
YELLOW = '\033[1;33m'
2026-03-27 19:02:30 -07:00
NC = '\033[0m'
2025-12-12 14:57:48 -08:00
2026-03-02 12:14:09 -08:00
PRIVATE_KEY = " ${ PRIVATE_KEY :- } "
2026-03-27 19:02:30 -07:00
if [ [ -n " $PRIVATE_KEY " && ! " $PRIVATE_KEY " = ~ ^0x ] ] ; then
PRIVATE_KEY = " 0x $PRIVATE_KEY "
fi
2026-03-02 12:14:09 -08:00
2026-03-27 19:02:30 -07:00
RPC_URL_138 = " ${ RPC_URL_138 :- http : //192.168.11.211 : 8545 } "
RPC_URL_138 = " ${ RPC_URL_138 % $'\r' } "
RPC_URL_138 = " ${ RPC_URL_138 % $'\n' } "
RPC_URL_MAINNET = " ${ RPC_URL_MAINNET :- ${ ETHEREUM_MAINNET_RPC :- https : //eth.llamarpc.com } } "
RPC_URL_MAINNET = " ${ RPC_URL_MAINNET % $'\r' } "
RPC_URL_MAINNET = " ${ RPC_URL_MAINNET % $'\n' } "
2026-03-02 12:14:09 -08:00
2026-03-27 19:02:30 -07:00
MAINNET_CHAIN_SELECTOR = " ${ MAINNET_CHAIN_SELECTOR :- 5009297550715157269 } "
CHAIN138_CHAIN_SELECTOR = " ${ CHAIN138_CHAIN_SELECTOR :- ${ CHAIN138_SELECTOR :- } } "
2026-03-02 12:14:09 -08:00
2026-03-27 19:02:30 -07:00
# 138-side bridges (aliases match .env CCIP* names)
WETH9_BRIDGE_138 = " ${ WETH9_BRIDGE_138 :- ${ CCIPWETH9_BRIDGE_CHAIN138 :- } } "
WETH10_BRIDGE_138 = " ${ WETH10_BRIDGE_138 :- ${ CCIPWETH10_BRIDGE_CHAIN138 :- } } "
# Mainnet peer *bridge* contracts (not WETH token addresses)
WETH9_MAINNET = " ${ WETH9_MAINNET :- ${ MAINNET_CCIP_WETH9_BRIDGE :- } } "
WETH10_MAINNET = " ${ WETH10_MAINNET :- ${ MAINNET_CCIP_WETH10_BRIDGE :- } } "
echo -e " ${ GREEN } === Bridge destination configuration (138 ↔ Mainnet) === ${ NC } \n "
if [ [ -z " $PRIVATE_KEY " ] ] ; then
echo -e " ${ RED } ERROR: PRIVATE_KEY not set (env or .env) ${ NC } " >& 2
exit 1
fi
2026-03-02 12:14:09 -08:00
2026-03-27 19:02:30 -07:00
if [ [ -z " $WETH9_BRIDGE_138 " || -z " $WETH10_BRIDGE_138 " ] ] ; then
echo -e " ${ RED } ERROR: Set WETH9_BRIDGE_138 / WETH10_BRIDGE_138 or CCIPWETH9_BRIDGE_CHAIN138 / CCIPWETH10_BRIDGE_CHAIN138 ${ NC } " >& 2
exit 1
2025-12-12 14:57:48 -08:00
fi
2026-03-27 19:02:30 -07:00
if [ [ -z " $WETH9_MAINNET " || -z " $WETH10_MAINNET " ] ] ; then
echo -e " ${ RED } ERROR: Set mainnet peer bridge addresses: WETH9_MAINNET / WETH10_MAINNET ${ NC } " >& 2
echo -e " (or MAINNET_CCIP_WETH9_BRIDGE / MAINNET_CCIP_WETH10_BRIDGE). These must be the CCIP bridge contracts on Ethereum, not WETH token addresses. ${ NC } " >& 2
exit 1
2025-12-12 14:57:48 -08:00
fi
2026-03-02 12:14:09 -08:00
add_destination( ) {
2026-03-27 19:02:30 -07:00
local bridge_address = $1
local chain_selector = $2
local receiver_bridge = $3
local rpc_url = $4
local network_name = $5
echo -e " ${ GREEN } Adding destination on $network_name bridge... ${ NC } "
cast send " ${ bridge_address ,, } " \
"addDestination(uint64,address)" \
" $chain_selector " \
" ${ receiver_bridge ,, } " \
--rpc-url " $rpc_url " \
--private-key " $PRIVATE_KEY " \
--legacy \
--gas-limit 250000 \
--gas-price 2000000000
echo -e " ${ GREEN } ✓ Destination added ${ NC } \n "
2026-03-02 12:14:09 -08:00
}
2025-12-12 14:57:48 -08:00
2026-03-02 12:14:09 -08:00
verify_destinations( ) {
2026-03-27 19:02:30 -07:00
local bridge_address = $1
local rpc_url = $2
local network_name = $3
echo -e " ${ GREEN } Verifying destinations on $network_name ... ${ NC } "
local chains
if chains = $( cast call " ${ bridge_address ,, } " \
"getDestinationChains()(uint64[])" \
--rpc-url " $rpc_url " 2>/dev/null) ; then
2026-03-02 12:14:09 -08:00
echo -e " ${ GREEN } Destination chains: $chains ${ NC } \n "
2026-03-27 19:02:30 -07:00
else
echo -e " ${ YELLOW } Could not read getDestinationChains (cast/RPC). Try cast rpc eth_call or another RPC. ${ NC } \n "
fi
2026-03-02 12:14:09 -08:00
}
2026-03-27 19:02:30 -07:00
echo -e " ${ YELLOW } === Chain 138 → Mainnet === ${ NC } \n "
2026-03-02 12:14:09 -08:00
2026-03-27 19:02:30 -07:00
echo -e " ${ GREEN } 1. WETH9 bridge on 138 → Mainnet peer ${ NC } "
add_destination " $WETH9_BRIDGE_138 " " $MAINNET_CHAIN_SELECTOR " " $WETH9_MAINNET " " $RPC_URL_138 " "Chain 138 WETH9"
2026-03-02 12:14:09 -08:00
2026-03-27 19:02:30 -07:00
echo -e " ${ GREEN } 2. WETH10 bridge on 138 → Mainnet peer ${ NC } "
add_destination " $WETH10_BRIDGE_138 " " $MAINNET_CHAIN_SELECTOR " " $WETH10_MAINNET " " $RPC_URL_138 " "Chain 138 WETH10"
2026-03-02 12:14:09 -08:00
2026-03-27 19:02:30 -07:00
echo -e " ${ YELLOW } === Verify 138 bridges === ${ NC } \n "
2026-03-02 12:14:09 -08:00
verify_destinations " $WETH9_BRIDGE_138 " " $RPC_URL_138 " "WETH9 Bridge"
verify_destinations " $WETH10_BRIDGE_138 " " $RPC_URL_138 " "WETH10 Bridge"
2026-03-27 19:02:30 -07:00
if [ [ -z " $CHAIN138_CHAIN_SELECTOR " ] ] ; then
echo -e " ${ YELLOW } NOTE: CHAIN138_CHAIN_SELECTOR / CHAIN138_SELECTOR not set. ${ NC } "
echo -e " ${ YELLOW } To add Chain 138 as a destination on Mainnet bridges, set the selector then run addDestination on mainnet (see complete-config-ready-chains.sh pattern). ${ NC } "
echo -e " ${ YELLOW } Router getChainSelector() may revert on custom routers; see docs/deployment/CHAIN138_SELECTOR_NOTES.md ${ NC } \n "
2026-03-02 12:14:09 -08:00
else
2026-03-27 19:02:30 -07:00
echo -e " ${ YELLOW } === Mainnet → Chain 138 === ${ NC } "
echo -e " ${ YELLOW } CHAIN138_CHAIN_SELECTOR= $CHAIN138_CHAIN_SELECTOR — run addDestination on each Mainnet bridge with this selector and the 138 peer bridge address (not automated here). ${ NC } \n "
2025-12-12 14:57:48 -08:00
fi
2026-03-27 19:02:30 -07:00
echo -e " ${ GREEN } === Done === ${ NC } \n "
echo -e "Next: fund bridges with LINK; test transfers; monitor fees."