146 lines
4.5 KiB
Bash
Executable File
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
|