Files
explorer-monorepo/scripts/verify-complete-ccip-setup.sh
2026-03-27 22:21:15 -07:00

260 lines
8.6 KiB
Bash
Executable File

#!/usr/bin/env bash
# Comprehensive CCIP Setup Verification
# Task 139: Create Comprehensive CCIP Verification Script
# Usage: ./verify-complete-ccip-setup.sh
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
source "$PROJECT_ROOT/scripts/lib/address-inventory.sh"
source "$PROJECT_ROOT/scripts/lib/ccip-destinations.sh"
# Colors
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'
log_info() { echo -e "${BLUE}[INFO]${NC} $1"; }
log_success() { echo -e "${GREEN}[✓]${NC} $1"; }
log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
log_error() { echo -e "${RED}[ERROR]${NC} $1"; }
load_explorer_runtime_env
# Configuration
RPC_URL="${RPC_URL_138:-http://192.168.11.250:8545}"
# Counters
TOTAL_CHECKS=0
PASSED_CHECKS=0
FAILED_CHECKS=0
WARNING_CHECKS=0
check_pass() {
((TOTAL_CHECKS++)) || true
((PASSED_CHECKS++)) || true
log_success "$1"
}
check_fail() {
((TOTAL_CHECKS++)) || true
((FAILED_CHECKS++)) || true
log_error "$1"
}
check_warn() {
((TOTAL_CHECKS++)) || true
((WARNING_CHECKS++)) || true
log_warn "$1"
}
log_info "========================================="
log_info "Comprehensive CCIP Setup Verification"
log_info "========================================="
log_info ""
log_info "RPC URL: $RPC_URL"
log_info "Date: $(date)"
log_info ""
# Section A: CCIP Lane Configuration
log_info "========================================="
log_info "A) CCIP Lane Configuration"
log_info "========================================="
log_info ""
# A.1: Router Deployment
log_info "A.1: Router Deployment"
ROUTER="$(resolve_address_value CCIP_ROUTER_ADDRESS CCIP_ROUTER_ADDRESS 0x8078A09637e47Fa5Ed34F626046Ea2094a5CDE5e)"
ROUTER_BYTECODE=$(cast code "$ROUTER" --rpc-url "$RPC_URL" 2>/dev/null || echo "")
if [ -n "$ROUTER_BYTECODE" ] && [ "$ROUTER_BYTECODE" != "0x" ]; then
check_pass "Router contract deployed: $ROUTER"
else
check_fail "Router contract not found: $ROUTER"
fi
# A.2: Sender Deployment
log_info ""
log_info "A.2: Sender Deployment"
SENDER="0x105F8A15b819948a89153505762444Ee9f324684"
SENDER_BYTECODE=$(cast code "$SENDER" --rpc-url "$RPC_URL" 2>/dev/null || echo "")
if [ -n "$SENDER_BYTECODE" ] && [ "$SENDER_BYTECODE" != "0x" ]; then
check_pass "Sender contract deployed: $SENDER"
else
check_fail "Sender contract not found: $SENDER"
fi
# A.3: Bridge Destinations
log_info ""
log_info "A.3: Bridge Destination Configuration"
WETH9_BRIDGE="$(resolve_address_value CCIPWETH9_BRIDGE CCIPWETH9_BRIDGE 0x971cD9D156f193df8051E48043C476e53ECd4693)"
WETH10_BRIDGE="$(resolve_address_value CCIPWETH10_BRIDGE CCIPWETH10_BRIDGE 0xe0E93247376aa097dB308B92e6Ba36bA015535D0)"
WETH9_CONFIGURED=0
WETH10_CONFIGURED=0
TOTAL_DESTINATIONS=$(ccip_destination_count)
while IFS=$'\t' read -r _chain_name SELECTOR _weth9 _weth10 _rpc_url; do
# Check WETH9
DEST_WETH9=$(cast call "$WETH9_BRIDGE" "destinations(uint64)" "$SELECTOR" --rpc-url "$RPC_URL" 2>/dev/null || echo "")
DEST_WETH9_CLEAN=$(echo "$DEST_WETH9" | grep -oE "^0x[0-9a-fA-F]{40}$" | head -1 || echo "")
if [ -n "$DEST_WETH9_CLEAN" ] && ! echo "$DEST_WETH9_CLEAN" | grep -qE "^0x0+$"; then
((WETH9_CONFIGURED++)) || true
fi
# Check WETH10
DEST_WETH10=$(cast call "$WETH10_BRIDGE" "destinations(uint64)" "$SELECTOR" --rpc-url "$RPC_URL" 2>/dev/null || echo "")
DEST_WETH10_CLEAN=$(echo "$DEST_WETH10" | grep -oE "^0x[0-9a-fA-F]{40}$" | head -1 || echo "")
if [ -n "$DEST_WETH10_CLEAN" ] && ! echo "$DEST_WETH10_CLEAN" | grep -qE "^0x0+$"; then
((WETH10_CONFIGURED++)) || true
fi
done < <(ccip_destination_rows)
if [ $WETH9_CONFIGURED -eq $TOTAL_DESTINATIONS ]; then
check_pass "WETH9 Bridge: All $TOTAL_DESTINATIONS destinations configured"
elif [ $WETH9_CONFIGURED -gt 0 ]; then
check_warn "WETH9 Bridge: $WETH9_CONFIGURED/$TOTAL_DESTINATIONS destinations configured"
else
check_fail "WETH9 Bridge: No destinations configured"
fi
if [ $WETH10_CONFIGURED -eq $TOTAL_DESTINATIONS ]; then
check_pass "WETH10 Bridge: All $TOTAL_DESTINATIONS destinations configured"
elif [ $WETH10_CONFIGURED -gt 0 ]; then
check_warn "WETH10 Bridge: $WETH10_CONFIGURED/$TOTAL_DESTINATIONS destinations configured"
else
check_fail "WETH10 Bridge: No destinations configured"
fi
# Section B: Token Configuration
log_info ""
log_info "========================================="
log_info "B) Token Configuration"
log_info "========================================="
log_info ""
# B.1: WETH9 Token
log_info "B.1: WETH9 Token"
WETH9="0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2"
WETH9_BYTECODE=$(cast code "$WETH9" --rpc-url "$RPC_URL" 2>/dev/null || echo "")
if [ -n "$WETH9_BYTECODE" ] && [ "$WETH9_BYTECODE" != "0x" ]; then
check_pass "WETH9 token deployed: $WETH9"
# Check 1:1 ratio
WETH9_BALANCE=$(cast balance "$WETH9" --rpc-url "$RPC_URL" 2>/dev/null || echo "0")
WETH9_SUPPLY=$(cast call "$WETH9" "totalSupply()" --rpc-url "$RPC_URL" 2>/dev/null || echo "0")
if [ "$WETH9_BALANCE" = "$WETH9_SUPPLY" ]; then
check_pass "WETH9 1:1 ratio verified"
else
check_warn "WETH9 1:1 ratio: Balance=$WETH9_BALANCE, Supply=$WETH9_SUPPLY"
fi
else
check_fail "WETH9 token not found: $WETH9"
fi
# B.2: WETH10 Token
log_info ""
log_info "B.2: WETH10 Token"
WETH10="0xf4BB2e28688e89fCcE3c0580D37d36A7672E8A9f"
WETH10_BYTECODE=$(cast code "$WETH10" --rpc-url "$RPC_URL" 2>/dev/null || echo "")
if [ -n "$WETH10_BYTECODE" ] && [ "$WETH10_BYTECODE" != "0x" ]; then
check_pass "WETH10 token deployed: $WETH10"
# Check 1:1 ratio
WETH10_BALANCE=$(cast balance "$WETH10" --rpc-url "$RPC_URL" 2>/dev/null || echo "0")
WETH10_SUPPLY=$(cast call "$WETH10" "totalSupply()" --rpc-url "$RPC_URL" 2>/dev/null || echo "0")
if [ "$WETH10_BALANCE" = "$WETH10_SUPPLY" ]; then
check_pass "WETH10 1:1 ratio verified"
else
check_warn "WETH10 1:1 ratio: Balance=$WETH10_BALANCE, Supply=$WETH10_SUPPLY"
fi
else
check_fail "WETH10 token not found: $WETH10"
fi
# Section C: Bridge Contracts
log_info ""
log_info "========================================="
log_info "C) Bridge Contracts"
log_info "========================================="
log_info ""
# C.1: WETH9 Bridge
log_info "C.1: WETH9 Bridge"
WETH9_BRIDGE_BYTECODE=$(cast code "$WETH9_BRIDGE" --rpc-url "$RPC_URL" 2>/dev/null || echo "")
if [ -n "$WETH9_BRIDGE_BYTECODE" ] && [ "$WETH9_BRIDGE_BYTECODE" != "0x" ]; then
check_pass "WETH9 Bridge deployed: $WETH9_BRIDGE"
else
check_fail "WETH9 Bridge not found: $WETH9_BRIDGE"
fi
# C.2: WETH10 Bridge
log_info ""
log_info "C.2: WETH10 Bridge"
WETH10_BRIDGE_BYTECODE=$(cast code "$WETH10_BRIDGE" --rpc-url "$RPC_URL" 2>/dev/null || echo "")
if [ -n "$WETH10_BRIDGE_BYTECODE" ] && [ "$WETH10_BRIDGE_BYTECODE" != "0x" ]; then
check_pass "WETH10 Bridge deployed: $WETH10_BRIDGE"
else
check_fail "WETH10 Bridge not found: $WETH10_BRIDGE"
fi
# Section D: Fee Configuration
log_info ""
log_info "========================================="
log_info "D) Fee Configuration"
log_info "========================================="
log_info ""
# D.1: Fee Token
log_info "D.1: Fee Token Configuration"
FEE_TOKEN=$(cast call "$ROUTER" "getFeeToken()" --rpc-url "$RPC_URL" 2>/dev/null || echo "")
if [ -n "$FEE_TOKEN" ] && [ "$FEE_TOKEN" != "0x" ]; then
FEE_TOKEN_CLEAN=$(echo "$FEE_TOKEN" | grep -oE "^0x[0-9a-fA-F]{40}$" | head -1 || echo "")
if [ -n "$FEE_TOKEN_CLEAN" ]; then
check_pass "Fee token configured: $FEE_TOKEN_CLEAN"
else
check_warn "Fee token returned invalid address"
fi
else
check_warn "Fee token configuration not accessible"
fi
# D.2: Fee Calculation
log_info ""
log_info "D.2: Fee Calculation"
ETHEREUM_SELECTOR="5009297550715157269"
FEE_RESULT=$(cast call "$ROUTER" "getFee(uint64,bytes)" "$ETHEREUM_SELECTOR" "0x" --rpc-url "$RPC_URL" 2>/dev/null || echo "")
if [ -n "$FEE_RESULT" ] && [ "$FEE_RESULT" != "0x" ]; then
check_pass "Fee calculation accessible"
else
check_warn "Fee calculation not accessible"
fi
# Summary
log_info ""
log_info "========================================="
log_info "Verification Summary"
log_info "========================================="
log_info ""
log_info "Total Checks: $TOTAL_CHECKS"
log_success "Passed: $PASSED_CHECKS"
log_warn "Warnings: $WARNING_CHECKS"
log_error "Failed: $FAILED_CHECKS"
log_info ""
if [ $FAILED_CHECKS -eq 0 ]; then
if [ $WARNING_CHECKS -eq 0 ]; then
log_success "✓ All checks passed!"
exit 0
else
log_warn "⚠ Some checks have warnings"
exit 0
fi
else
log_error "✗ Some checks failed"
exit 1
fi