Files
smom-dbis-138/scripts/deployment/preflight-config-ready-chains.sh
2026-03-02 12:14:09 -08:00

146 lines
4.5 KiB
Bash
Executable File

#!/usr/bin/env bash
# Preflight check for Config-Ready Chains (Gnosis, Cronos, Celo, Wemix) CCIP bridge deployment.
# Verifies: RPC connectivity, deployer address, native gas balance on each chain.
# Run before deploy-bridges-config-ready-chains.sh.
#
# Usage: ./scripts/deployment/preflight-config-ready-chains.sh [gnosis|cronos|celo|wemix|all]
# SKIP_BALANCE=1 ... # skip balance checks (RPC-only)
# DEPLOYER_ADDRESS=0x... # use specific address instead of deriving from PRIVATE_KEY
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
cd "$PROJECT_ROOT"
[[ -f "$PROJECT_ROOT/.env" ]] && set -a && source "$PROJECT_ROOT/.env" && set +a
SKIP_BALANCE="${SKIP_BALANCE:-0}"
CHAIN="${1:-all}"
# Chain config: name | chain_id | RPC_var | gas_token | min_recommended (human)
get_chain_config() {
case "$1" in
gnosis) echo "Gnosis|100|GNOSIS_RPC|xDAI|0.1" ;;
cronos) echo "Cronos|25|CRONOS_RPC|CRO|1" ;;
celo) echo "Celo|42220|CELO_RPC|CELO|0.1" ;;
wemix) echo "Wemix|1111|WEMIX_RPC|WEMIX|0.4" ;;
*) echo "" ;;
esac
}
# Default RPCs (from env or public)
GNOSIS_RPC="${GNOSIS_RPC:-https://rpc.gnosischain.com}"
CRONOS_RPC="${CRONOS_RPC:-https://evm.cronos.org}"
CELO_RPC="${CELO_RPC:-https://forno.celo.org}"
WEMIX_RPC="${WEMIX_RPC:-https://api.wemix.com}"
# Deployer
if [[ -n "${DEPLOYER_ADDRESS:-}" ]]; then
DEPLOYER="${DEPLOYER_ADDRESS}"
[[ "$DEPLOYER" != 0x* ]] && DEPLOYER="0x$DEPLOYER"
else
if [[ -z "${PRIVATE_KEY:-}" ]]; then
echo "Error: Set PRIVATE_KEY in .env or DEPLOYER_ADDRESS for read-only check" >&2
exit 1
fi
DEPLOYER=$(cast wallet address "$PRIVATE_KEY" 2>/dev/null || true)
if [[ -z "$DEPLOYER" ]]; then
echo "Error: Could not derive deployer from PRIVATE_KEY (is 'cast' available?)" >&2
exit 1
fi
fi
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'
check_chain() {
local key="$1"
local config
config=$(get_chain_config "$key")
[[ -z "$config" ]] && return 1
local name chain_id rpc_var gas_token min_rec
IFS='|' read -r name chain_id rpc_var gas_token min_rec <<< "$config"
local rpc="${!rpc_var:-}"
if [[ -z "$rpc" ]]; then
echo -e " ${RED}${NC} $name: $rpc_var not set in .env"
return 1
fi
# RPC connectivity
local res
res=$(curl -s -m 10 -X POST "$rpc" -H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}' 2>/dev/null || true)
if [[ -z "$res" ]] || ! echo "$res" | grep -q '"result"'; then
echo -e " ${RED}${NC} $name: RPC unreachable ($rpc)"
return 1
fi
echo -e " ${GREEN}${NC} $name: RPC OK (chain $chain_id)"
if [[ "$SKIP_BALANCE" == "1" ]]; then
return 0
fi
# Balance check
local balance_wei
balance_wei=$(cast balance "$DEPLOYER" --rpc-url "$rpc" 2>/dev/null || echo "0")
local balance_eth
balance_eth=$(echo "scale=6; $balance_wei / 1000000000000000000" | bc 2>/dev/null || echo "0")
if [[ -z "$balance_wei" || "$balance_wei" == "0" ]]; then
echo -e " ${RED}${NC} Balance: 0 $gas_token (need $min_rec $gas_token)"
return 1
fi
# Compare: balance_eth >= min_rec (use bc for decimals)
if ! command -v bc >/dev/null 2>&1; then
echo -e " ${YELLOW}?${NC} Balance: $balance_eth $gas_token (bc not found, cannot compare)"
return 0
fi
if [[ "$(echo "$balance_eth >= $min_rec" | bc 2>/dev/null)" != "1" ]]; then
echo -e " ${YELLOW}${NC} Balance: $balance_eth $gas_token (recommended: $min_rec $gas_token)"
return 1
fi
echo -e " ${GREEN}${NC} Balance: $balance_eth $gas_token"
return 0
}
run_checks() {
local keys
case "$CHAIN" in
gnosis) keys="gnosis" ;;
cronos) keys="cronos" ;;
celo) keys="celo" ;;
wemix) keys="wemix" ;;
all) keys="gnosis cronos celo wemix" ;;
*) echo "Usage: $0 [gnosis|cronos|celo|wemix|all]"; exit 1 ;;
esac
local failed=0
for k in $keys; do
if ! check_chain "$k"; then
failed=1
fi
done
return $failed
}
echo "=== Preflight: Config-Ready Chains (Gnosis, Cronos, Celo, Wemix) ==="
echo "Deployer: ${DEPLOYER:0:10}...${DEPLOYER: -8}"
echo "SKIP_BALANCE=$SKIP_BALANCE CHAIN=$CHAIN"
echo ""
if run_checks; then
echo ""
echo "Preflight OK. Run: ./scripts/deployment/deploy-bridges-config-ready-chains.sh $CHAIN"
exit 0
else
echo ""
echo "Preflight failed. Fix RPCs and gas balances before deploy."
echo " Gas tokens: Gnosis=xDAI, Cronos=CRO, Celo=CELO, Wemix=WEMIX"
echo " Recommended: Gnosis 0.1, Cronos 1, Celo 0.1, Wemix 0.4"
exit 1
fi