#!/usr/bin/env bash # Phase 1.2: Check Event Logs for Existing Bridge Configuration # This script checks for DestinationAdded events on ChainID 138 bridges set -euo pipefail # Load IP configuration SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" source "${PROJECT_ROOT}/config/ip-addresses.conf" 2>/dev/null || true SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" # 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_detail() { echo -e "${CYAN}[DETAIL]${NC} $1"; } log_section() { echo -e "\n${CYAN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"; echo -e "${CYAN}$1${NC}"; echo -e "${CYAN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}\n"; } # Configuration from resolution plan CHAIN138_RPC="http://${RPC_CORE_1}:8545" WETH9_BRIDGE="0x3304b747E565a97ec8AC220b0B6A1f6ffDB837e6" WETH10_BRIDGE="0x8078A09637e47Fa5Ed34F626046Ea2094a5CDE5e" MAINNET_SELECTOR="5009297550715157269" log_section "Phase 1.2: Check Event Logs for Existing Configuration" log_info "Configuration:" log_info " ChainID 138 RPC: $CHAIN138_RPC" log_info " WETH9 Bridge: $WETH9_BRIDGE" log_info " WETH10 Bridge: $WETH10_BRIDGE" log_info " Mainnet Chain Selector: $MAINNET_SELECTOR" log_info "" # Check if cast is available if ! command -v cast &> /dev/null; then log_error "cast command not found. Please install foundry." exit 1 fi # Test RPC connection log_info "Testing RPC connection..." CHAIN_ID=$(cast chain-id --rpc-url "$CHAIN138_RPC" 2>/dev/null || echo "") if [ -z "$CHAIN_ID" ]; then log_error "Failed to connect to RPC endpoint: $CHAIN138_RPC" log_warn "Trying alternative RPC: http://${RPC_PUBLIC_1:-192.168.11.221}:8545" CHAIN138_RPC="http://${RPC_PUBLIC_1:-192.168.11.221}:8545" CHAIN_ID=$(cast chain-id --rpc-url "$CHAIN138_RPC" 2>/dev/null || echo "") if [ -z "$CHAIN_ID" ]; then log_error "Failed to connect to alternative RPC endpoint" exit 1 fi log_info "Using alternative RPC: $CHAIN138_RPC" fi log_success "RPC connection successful (ChainID: $CHAIN_ID)" log_info "" # Get latest block number log_info "Getting latest block number..." LATEST_BLOCK=$(cast block-number --rpc-url "$CHAIN138_RPC" 2>/dev/null || echo "0") log_info "Latest block: $LATEST_BLOCK" log_info "" # Function to check events for a bridge check_bridge_events() { local BRIDGE_ADDRESS=$1 local BRIDGE_NAME=$2 log_section "Checking $BRIDGE_NAME Bridge Events" log_info "Bridge Address: $BRIDGE_ADDRESS" log_info "Searching for DestinationAdded events from block 0 to $LATEST_BLOCK..." log_info "" # Get events # Event signature: DestinationAdded(uint64,address) EVENT_SIG="0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0" # keccak256("DestinationAdded(uint64,address)") first 4 bytes # Note: cast logs requires the full event signature with indexed params log_info "Querying DestinationAdded events..." # Try to get events using cast logs # DestinationAdded(uint64 indexed chainSelector, address indexed receiverBridge) EVENTS=$(cast logs \ --from-block 0 \ --to-block "$LATEST_BLOCK" \ --address "$BRIDGE_ADDRESS" \ "DestinationAdded(uint64,address)" \ --rpc-url "$CHAIN138_RPC" 2>&1 || echo "") if echo "$EVENTS" | grep -qE "error|Error|ERROR"; then log_warn "Error querying events (this is expected if function doesn't exist)" log_detail "Error output: $EVENTS" log_info "" return 1 fi if [ -z "$EVENTS" ] || [ "$EVENTS" = "[]" ]; then log_warn "No DestinationAdded events found for $BRIDGE_NAME bridge" log_info "This means destinations may not be configured via events" log_info "" return 1 fi # Parse events if found log_success "Events found for $BRIDGE_NAME bridge:" echo "$EVENTS" | jq -r '.[] | "Block: \(.blockNumber) | Chain Selector: \(.topics[1]) | Receiver Bridge: \(.topics[2])"' 2>/dev/null || echo "$EVENTS" log_info "" # Check if Mainnet selector is in events if echo "$EVENTS" | grep -qi "$MAINNET_SELECTOR"; then log_success "✓ Mainnet destination found in events for $BRIDGE_NAME bridge!" return 0 else log_warn "Mainnet destination not found in events for $BRIDGE_NAME bridge" return 1 fi } # Check both bridges WETH9_EVENTS_FOUND=0 WETH10_EVENTS_FOUND=0 check_bridge_events "$WETH9_BRIDGE" "WETH9" && WETH9_EVENTS_FOUND=1 || WETH9_EVENTS_FOUND=0 check_bridge_events "$WETH10_BRIDGE" "WETH10" && WETH10_EVENTS_FOUND=1 || WETH10_EVENTS_FOUND=0 # Summary log_section "Phase 1.2 Summary - Event Log Analysis" if [ "$WETH9_EVENTS_FOUND" -eq 1 ] && [ "$WETH10_EVENTS_FOUND" -eq 1 ]; then log_success "✓ Both bridges have DestinationAdded events with Mainnet selector" log_success "Conclusion: Destinations may already be configured!" log_info "" log_info "Next Step: Proceed to Phase 1.1 to test actual bridge transfer" echo "EVENT_STATUS=CONFIGURED" > "$PROJECT_ROOT/.phase1-event-status" elif [ "$WETH9_EVENTS_FOUND" -eq 1 ] || [ "$WETH10_EVENTS_FOUND" -eq 1 ]; then log_warn "⚠ Partial configuration detected" if [ "$WETH9_EVENTS_FOUND" -eq 1 ]; then log_info " - WETH9 bridge: Events found" else log_warn " - WETH9 bridge: No events" fi if [ "$WETH10_EVENTS_FOUND" -eq 1 ]; then log_info " - WETH10 bridge: Events found" else log_warn " - WETH10 bridge: No events" fi echo "EVENT_STATUS=PARTIAL" > "$PROJECT_ROOT/.phase1-event-status" else log_warn "⚠ No DestinationAdded events found for either bridge" log_info "This suggests:" log_info " 1. Destinations were not configured via events, OR" log_info " 2. Events were emitted before current block range, OR" log_info " 3. Contract uses different event signature" log_info "" log_info "Next Step: Proceed to Phase 1.1 to test if bridge works anyway" echo "EVENT_STATUS=NOT_FOUND" > "$PROJECT_ROOT/.phase1-event-status" fi log_info "" log_success "Phase 1.2 Complete - Event log analysis saved to .phase1-event-status"