#!/usr/bin/env bash # Incremental Bridge Deployment Script # Compiles and deploys bridges one at a time to avoid full project compilation set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" cd "$PROJECT_ROOT" # Colors RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' CYAN='\033[0;36m' NC='\033[0m' log_info() { echo -e "${BLUE}[INFO]${NC} $1"; } log_success() { echo -e "${GREEN}[✓]${NC} $1"; } log_warn() { echo -e "${YELLOW}[⚠]${NC} $1"; } log_error() { echo -e "${RED}[✗]${NC} $1"; } log_section() { echo -e "\n${CYAN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"; echo -e "${CYAN}$1${NC}"; echo -e "${CYAN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}\n"; } # Load environment if [ -f "$PROJECT_ROOT/.env" ]; then set +e source "$PROJECT_ROOT/.env" 2>/dev/null || true set -e fi if [ -f "$PROJECT_ROOT/smom-dbis-138/.env" ]; then set +e source "$PROJECT_ROOT/smom-dbis-138/.env" 2>/dev/null || true set -e fi # Required variables PRIVATE_KEY="${PRIVATE_KEY:-}" RPC_URL="${RPC_URL_138:-http://localhost:8545}" CCIP_ROUTER="${CCIP_ROUTER:-0x8078A09637e47Fa5Ed34F626046Ea2094a5CDE5e}" CCIP_FEE_TOKEN="${CCIP_FEE_TOKEN:-0x514910771AF9Ca656af840dff83E8264EcF986CA}" # Mainnet configuration MAINNET_CHAIN_SELECTOR="5009297550715157269" MAINNET_WETH9_BRIDGE="0x3304b747E565a97ec8AC220b0B6A1f6ffDB837e6" MAINNET_WETH10_BRIDGE="0x8078A09637e47Fa5Ed34F626046Ea2094a5CDE5e" # Validate if [ -z "$PRIVATE_KEY" ]; then log_error "PRIVATE_KEY not set" exit 1 fi DEPLOYER=$(cast wallet address "$PRIVATE_KEY" 2>/dev/null || echo "") if [ -z "$DEPLOYER" ]; then log_error "Failed to derive deployer address" exit 1 fi log_section "ChainID 138 Incremental Bridge Deployment" log_info "Deployer: $DEPLOYER" log_info "RPC: $RPC_URL" log_info "Strategy: Compile and deploy each bridge separately" # Pre-flight checks log_section "Pre-Flight Checks" CHAIN_ID=$(cast chain-id --rpc-url "$RPC_URL" 2>/dev/null || echo "") if [ "$CHAIN_ID" != "138" ]; then log_error "Cannot connect to RPC or wrong chain ID: $CHAIN_ID" exit 1 fi log_success "RPC connected - Chain ID: $CHAIN_ID" BALANCE=$(cast balance "$DEPLOYER" --rpc-url "$RPC_URL" 2>/dev/null || echo "0") BALANCE_ETH=$(echo "scale=4; $BALANCE / 1000000000000000000" | bc 2>/dev/null || echo "0") MIN_BALANCE="1000000000000000000" BALANCE_CHECK=$(echo "$BALANCE < $MIN_BALANCE" | bc 2>/dev/null || echo "0") if [ "$BALANCE_CHECK" = "1" ]; then log_error "Insufficient balance: $BALANCE_ETH ETH" exit 1 fi log_success "Balance: $BALANCE_ETH ETH" # Calculate gas prices GAS_PRICE=$(bash "$PROJECT_ROOT/scripts/calculate-chain138-gas-price.sh" 2>/dev/null || echo "1100000000") BASE_FEE_HEX=$(cast rpc eth_getBlockByNumber latest false --rpc-url "$RPC_URL" 2>/dev/null | grep -o '"baseFeePerGas":"[^"]*"' | cut -d'"' -f4 || echo "0x0") BASE_FEE_DEC=$(cast --to-dec "$BASE_FEE_HEX" 2>/dev/null || echo "7") USE_EIP1559=false if [ -n "$BASE_FEE_HEX" ] && [ "$BASE_FEE_HEX" != "0x0" ] && [ "$BASE_FEE_HEX" != "null" ]; then USE_EIP1559=true MAX_FEE="$GAS_PRICE" AVAILABLE=$((MAX_FEE - BASE_FEE_DEC)) PRIORITY=$((AVAILABLE / 10)) if [ "$PRIORITY" -lt "10000000" ]; then PRIORITY="10000000" fi TOTAL=$((BASE_FEE_DEC + PRIORITY)) if [ "$TOTAL" -gt "$MAX_FEE" ]; then PRIORITY=$((MAX_FEE - BASE_FEE_DEC - 1000000)) fi log_success "EIP-1559: Max=$MAX_FEE, Priority=$PRIORITY, Base=$BASE_FEE_DEC" else log_info "Legacy: Gas Price=$GAS_PRICE" fi cd "$PROJECT_ROOT/smom-dbis-138" # Deploy WETH9 Bridge log_section "Deploy WETH9 Bridge" log_info "Compiling and deploying WETH9 Bridge (this will compile only what's needed)..." if [ "$USE_EIP1559" = true ]; then DEPLOY_OUTPUT=$(forge script script/DeployCCIPWETH9Bridge.s.sol:DeployCCIPWETH9Bridge \ --rpc-url "$RPC_URL" \ --broadcast \ --private-key "$PRIVATE_KEY" \ --with-gas-price "$MAX_FEE" \ --priority-gas-price "$PRIORITY" \ --slow \ -vvv 2>&1) else DEPLOY_OUTPUT=$(forge script script/DeployCCIPWETH9Bridge.s.sol:DeployCCIPWETH9Bridge \ --rpc-url "$RPC_URL" \ --broadcast \ --private-key "$PRIVATE_KEY" \ --with-gas-price "$GAS_PRICE" \ --legacy \ --slow \ -vvv 2>&1) fi echo "$DEPLOY_OUTPUT" | tail -50 WETH9_BRIDGE=$(echo "$DEPLOY_OUTPUT" | grep -oP "CCIPWETH9Bridge deployed at: \K0x[a-fA-F0-9]+" | tail -1 || echo "") if [ -z "$WETH9_BRIDGE" ]; then WETH9_BRIDGE=$(echo "$DEPLOY_OUTPUT" | grep -oE "0x[a-fA-F0-9]{40}" | tail -1 || echo "") fi if [ -n "$WETH9_BRIDGE" ] && [ ${#WETH9_BRIDGE} -eq 42 ]; then log_success "WETH9 Bridge: $WETH9_BRIDGE" sleep 5 CODE_SIZE=$(cast code "$WETH9_BRIDGE" --rpc-url "$RPC_URL" 2>/dev/null | wc -c || echo "0") log_info "Code size: $CODE_SIZE bytes" else log_error "Failed to deploy WETH9 Bridge" exit 1 fi # Deploy WETH10 Bridge log_section "Deploy WETH10 Bridge" log_info "Compiling and deploying WETH10 Bridge..." if [ "$USE_EIP1559" = true ]; then DEPLOY_OUTPUT=$(forge script script/DeployCCIPWETH10Bridge.s.sol:DeployCCIPWETH10Bridge \ --rpc-url "$RPC_URL" \ --broadcast \ --private-key "$PRIVATE_KEY" \ --with-gas-price "$MAX_FEE" \ --priority-gas-price "$PRIORITY" \ --slow \ -vvv 2>&1) else DEPLOY_OUTPUT=$(forge script script/DeployCCIPWETH10Bridge.s.sol:DeployCCIPWETH10Bridge \ --rpc-url "$RPC_URL" \ --broadcast \ --private-key "$PRIVATE_KEY" \ --with-gas-price "$GAS_PRICE" \ --legacy \ --slow \ -vvv 2>&1) fi echo "$DEPLOY_OUTPUT" | tail -50 WETH10_BRIDGE=$(echo "$DEPLOY_OUTPUT" | grep -oP "CCIPWETH10Bridge deployed at: \K0x[a-fA-F0-9]+" | tail -1 || echo "") if [ -z "$WETH10_BRIDGE" ]; then WETH10_BRIDGE=$(echo "$DEPLOY_OUTPUT" | grep -oE "0x[a-fA-F0-9]{40}" | tail -1 || echo "") fi if [ -n "$WETH10_BRIDGE" ] && [ ${#WETH10_BRIDGE} -eq 42 ]; then log_success "WETH10 Bridge: $WETH10_BRIDGE" sleep 5 CODE_SIZE=$(cast code "$WETH10_BRIDGE" --rpc-url "$RPC_URL" 2>/dev/null | wc -c || echo "0") log_info "Code size: $CODE_SIZE bytes" else log_error "Failed to deploy WETH10 Bridge" exit 1 fi # Configure Destinations log_section "Configure Bridge Destinations" log_info "Configuring WETH9 Bridge with Mainnet..." if [ "$USE_EIP1559" = true ]; then cast send "$WETH9_BRIDGE" \ "addDestination(uint64,address)" \ "$MAINNET_CHAIN_SELECTOR" \ "$MAINNET_WETH9_BRIDGE" \ --rpc-url "$RPC_URL" \ --private-key "$PRIVATE_KEY" \ --max-fee-per-gas "$MAX_FEE" \ --priority-fee-per-gas "$PRIORITY" \ -vv 2>&1 | tail -20 else cast send "$WETH9_BRIDGE" \ "addDestination(uint64,address)" \ "$MAINNET_CHAIN_SELECTOR" \ "$MAINNET_WETH9_BRIDGE" \ --rpc-url "$RPC_URL" \ --private-key "$PRIVATE_KEY" \ --gas-price "$GAS_PRICE" \ --legacy \ -vv 2>&1 | tail -20 fi log_info "Configuring WETH10 Bridge with Mainnet..." if [ "$USE_EIP1559" = true ]; then cast send "$WETH10_BRIDGE" \ "addDestination(uint64,address)" \ "$MAINNET_CHAIN_SELECTOR" \ "$MAINNET_WETH10_BRIDGE" \ --rpc-url "$RPC_URL" \ --private-key "$PRIVATE_KEY" \ --max-fee-per-gas "$MAX_FEE" \ --priority-fee-per-gas "$PRIORITY" \ -vv 2>&1 | tail -20 else cast send "$WETH10_BRIDGE" \ "addDestination(uint64,address)" \ "$MAINNET_CHAIN_SELECTOR" \ "$MAINNET_WETH10_BRIDGE" \ --rpc-url "$RPC_URL" \ --private-key "$PRIVATE_KEY" \ --gas-price "$GAS_PRICE" \ --legacy \ -vv 2>&1 | tail -20 fi # Deploy LINK Token log_section "Deploy LINK Token (CREATE2)" log_info "Compiling and deploying LINK token to canonical address..." if [ "$USE_EIP1559" = true ]; then LINK_OUTPUT=$(forge script script/DeployLinkToCanonicalAddress.s.sol:DeployLinkToCanonicalAddress \ --rpc-url "$RPC_URL" \ --broadcast \ --private-key "$PRIVATE_KEY" \ --with-gas-price "$MAX_FEE" \ --priority-gas-price "$PRIORITY" \ --slow \ -vvv 2>&1) else LINK_OUTPUT=$(forge script script/DeployLinkToCanonicalAddress.s.sol:DeployLinkToCanonicalAddress \ --rpc-url "$RPC_URL" \ --broadcast \ --private-key "$PRIVATE_KEY" \ --with-gas-price "$GAS_PRICE" \ --legacy \ --slow \ -vvv 2>&1) fi echo "$LINK_OUTPUT" | tail -30 LINK_ADDRESS="0x514910771AF9Ca656af840dff83E8264EcF986CA" sleep 5 CODE_SIZE=$(cast code "$LINK_ADDRESS" --rpc-url "$RPC_URL" 2>/dev/null | wc -c || echo "0") if [ "$CODE_SIZE" -gt 1000 ]; then log_success "LINK Token deployed: $LINK_ADDRESS ($CODE_SIZE bytes)" else log_warn "LINK Token not deployed (code size: $CODE_SIZE bytes)" fi # Final Summary log_section "Deployment Complete" echo "Deployed Addresses:" log_success "WETH9 Bridge: $WETH9_BRIDGE" log_success "WETH10 Bridge: $WETH10_BRIDGE" if [ "$CODE_SIZE" -gt 1000 ]; then log_success "LINK Token: $LINK_ADDRESS" else log_warn "LINK Token: Not deployed" fi # Save to file cat > /tmp/chain138-deployed-addresses-$(date +%Y%m%d-%H%M%S).txt <