128 lines
4.9 KiB
Bash
128 lines
4.9 KiB
Bash
|
|
#!/usr/bin/env bash
|
||
|
|
# Phase 3.1 & 3.3: Extract Bridge State from Old Contracts
|
||
|
|
# This script extracts state from old bridge contracts to prepare for migration
|
||
|
|
|
||
|
|
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_section() { echo -e "\n${CYAN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"; echo -e "${CYAN}$1${NC}"; echo -e "${CYAN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}\n"; }
|
||
|
|
|
||
|
|
# Configuration
|
||
|
|
CHAIN138_RPC="http://${RPC_CORE_1}:8545"
|
||
|
|
WETH9_BRIDGE_OLD="0x3304b747E565a97ec8AC220b0B6A1f6ffDB837e6"
|
||
|
|
WETH10_BRIDGE_OLD="0x8078A09637e47Fa5Ed34F626046Ea2094a5CDE5e"
|
||
|
|
WETH9_ADDRESS="0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2"
|
||
|
|
WETH10_ADDRESS="0xf4BB2e28688e89fCcE3c0580D37d36A7672E8A9f"
|
||
|
|
|
||
|
|
log_section "Phase 3.1 & 3.3: Extract Bridge State"
|
||
|
|
|
||
|
|
# Test RPC connection
|
||
|
|
CHAIN_ID=$(cast chain-id --rpc-url "$CHAIN138_RPC" 2>/dev/null || echo "")
|
||
|
|
if [ -z "$CHAIN_ID" ]; then
|
||
|
|
log_warn "Failed to connect to $CHAIN138_RPC, trying alternative..."
|
||
|
|
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 RPC endpoints"
|
||
|
|
exit 1
|
||
|
|
fi
|
||
|
|
fi
|
||
|
|
log_success "RPC connection successful (ChainID: $CHAIN_ID)"
|
||
|
|
log_info ""
|
||
|
|
|
||
|
|
# Function to extract state from a bridge
|
||
|
|
extract_bridge_state() {
|
||
|
|
local BRIDGE_ADDRESS=$1
|
||
|
|
local BRIDGE_NAME=$2
|
||
|
|
|
||
|
|
log_section "Extracting State from $BRIDGE_NAME Bridge"
|
||
|
|
log_info "Bridge Address: $BRIDGE_ADDRESS"
|
||
|
|
log_info ""
|
||
|
|
|
||
|
|
# Extract admin (we know this works)
|
||
|
|
log_info "Extracting admin..."
|
||
|
|
ADMIN=$(cast call "$BRIDGE_ADDRESS" "admin()(address)" --rpc-url "$CHAIN138_RPC" 2>/dev/null || echo "")
|
||
|
|
if [ -n "$ADMIN" ] && [ "$ADMIN" != "0x0000000000000000000000000000000000000000" ]; then
|
||
|
|
log_success " Admin: $ADMIN"
|
||
|
|
else
|
||
|
|
# Known from resolution plan
|
||
|
|
ADMIN="0x4a666f96fc8764181194447a7dfdb7d471b301c8"
|
||
|
|
log_warn " Admin: $ADMIN (from known value)"
|
||
|
|
fi
|
||
|
|
|
||
|
|
# Try to read storage slots directly
|
||
|
|
log_info ""
|
||
|
|
log_info "Reading storage slots..."
|
||
|
|
|
||
|
|
# Storage slot 0: likely router (from resolution plan: 0x99b3511a2d315a497c8112c1fdd8d508d4b1e506)
|
||
|
|
SLOT0=$(cast storage "$BRIDGE_ADDRESS" "0x0000000000000000000000000000000000000000000000000000000000000000" --rpc-url "$CHAIN138_RPC" 2>/dev/null || echo "")
|
||
|
|
if [ -n "$SLOT0" ] && [ "$SLOT0" != "0x0000000000000000000000000000000000000000000000000000000000000000" ]; then
|
||
|
|
# Extract address (last 20 bytes)
|
||
|
|
ROUTER_CANDIDATE="0x$(echo "$SLOT0" | cut -c 27-)"
|
||
|
|
log_info " Slot 0 (potential router): $ROUTER_CANDIDATE"
|
||
|
|
fi
|
||
|
|
|
||
|
|
# Storage slot 1: admin (should match)
|
||
|
|
SLOT1=$(cast storage "$BRIDGE_ADDRESS" "0x0000000000000000000000000000000000000000000000000000000000000001" --rpc-url "$CHAIN138_RPC" 2>/dev/null || echo "")
|
||
|
|
if [ -n "$SLOT1" ] && [ "$SLOT1" != "0x0000000000000000000000000000000000000000000000000000000000000000" ]; then
|
||
|
|
ADMIN_SLOT="0x$(echo "$SLOT1" | cut -c 27-)"
|
||
|
|
log_info " Slot 1 (admin): $ADMIN_SLOT"
|
||
|
|
if [ "$ADMIN_SLOT" = "$ADMIN" ]; then
|
||
|
|
log_success " ✓ Admin matches storage slot"
|
||
|
|
fi
|
||
|
|
fi
|
||
|
|
|
||
|
|
# Output state for deployment script
|
||
|
|
log_info ""
|
||
|
|
log_info "State Summary for $BRIDGE_NAME:"
|
||
|
|
echo " ADMIN=$ADMIN"
|
||
|
|
if [ -n "$ROUTER_CANDIDATE" ]; then
|
||
|
|
echo " ROUTER=$ROUTER_CANDIDATE"
|
||
|
|
fi
|
||
|
|
echo " WETH9=$WETH9_ADDRESS"
|
||
|
|
if [ "$BRIDGE_NAME" = "WETH10" ]; then
|
||
|
|
echo " WETH10=$WETH10_ADDRESS"
|
||
|
|
fi
|
||
|
|
|
||
|
|
log_info ""
|
||
|
|
}
|
||
|
|
|
||
|
|
# Extract state from both bridges
|
||
|
|
extract_bridge_state "$WETH9_BRIDGE_OLD" "WETH9"
|
||
|
|
extract_bridge_state "$WETH10_BRIDGE_OLD" "WETH10"
|
||
|
|
|
||
|
|
log_section "State Extraction Complete"
|
||
|
|
|
||
|
|
log_warn "⚠ IMPORTANT NOTES:"
|
||
|
|
log_info "1. Router address needs to be verified from deployment records or environment"
|
||
|
|
log_info "2. Fee token (LINK) address needs to be confirmed"
|
||
|
|
log_info "3. These values will be used to deploy new contracts with same parameters"
|
||
|
|
log_info ""
|
||
|
|
|
||
|
|
# Try to get LINK token address from common locations
|
||
|
|
LINK_TOKEN="0x514910771AF9Ca656af840dff83E8264EcF986CA"
|
||
|
|
log_info "Expected LINK token address: $LINK_TOKEN"
|
||
|
|
log_info ""
|
||
|
|
|
||
|
|
log_success "State extraction complete. Review values above for deployment."
|