Files
proxmox/scripts/test-bridge-all-7-networks.sh
defiQUG cb47cce074 Complete markdown files cleanup and organization
- Organized 252 files across project
- Root directory: 187 → 2 files (98.9% reduction)
- Moved configuration guides to docs/04-configuration/
- Moved troubleshooting guides to docs/09-troubleshooting/
- Moved quick start guides to docs/01-getting-started/
- Moved reports to reports/ directory
- Archived temporary files
- Generated comprehensive reports and documentation
- Created maintenance scripts and guides

All files organized according to established standards.
2026-01-06 01:46:25 -08:00

521 lines
20 KiB
Bash
Executable File

#!/usr/bin/env bash
# Comprehensive testing of bridge functionality for all 7 networks
# Performs actual contract calls and validations (not simulation)
# Usage: ./test-bridge-all-7-networks.sh [token]
# Example: ./test-bridge-all-7-networks.sh weth9
set -uo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
SOURCE_PROJECT="/home/intlc/projects/smom-dbis-138"
# Colors
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
CYAN='\033[0;36m'
MAGENTA='\033[0;35m'
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"; }
log_test() { echo -e "${CYAN}[TEST]${NC} $1"; }
log_detail() { echo -e "${MAGENTA}[DETAIL]${NC} $1"; }
# Load environment variables
if [ -f "$SOURCE_PROJECT/.env" ]; then
source "$SOURCE_PROJECT/.env"
else
log_error ".env file not found in $SOURCE_PROJECT"
exit 1
fi
# Configuration
RPC_URL="${RPC_URL_138:-http://192.168.11.250:8545}"
WETH9_ADDRESS="0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2"
WETH10_ADDRESS="0xf4BB2e28688e89fCcE3c0580D37d36A7672E8A9f"
WETH9_BRIDGE="${CCIPWETH9_BRIDGE_CHAIN138:-0x89dd12025bfCD38A168455A44B400e913ED33BE2}"
WETH10_BRIDGE="${CCIPWETH10_BRIDGE_CHAIN138:-0xe0E93247376aa097dB308B92e6Ba36bA015535D0}"
# Parse arguments
TOKEN="${1:-weth9}"
# All 7 destination chains (including Ethereum Mainnet)
declare -A CHAIN_SELECTORS=(
["BSC"]="11344663589394136015"
["Polygon"]="4051577828743386545"
["Avalanche"]="6433500567565415381"
["Base"]="15971525489660198786"
["Arbitrum"]="4949039107694359620"
["Optimism"]="3734403246176062136"
["Ethereum"]="5009297550715157269"
)
# Determine token and bridge
if [ "$TOKEN" = "weth9" ]; then
TOKEN_ADDRESS="$WETH9_ADDRESS"
BRIDGE_ADDRESS="$WETH9_BRIDGE"
TOKEN_NAME="WETH9"
elif [ "$TOKEN" = "weth10" ]; then
TOKEN_ADDRESS="$WETH10_ADDRESS"
BRIDGE_ADDRESS="$WETH10_BRIDGE"
TOKEN_NAME="WETH10"
else
log_error "Invalid token: $TOKEN (use weth9 or weth10)"
exit 1
fi
if [ -z "${PRIVATE_KEY:-}" ]; then
log_error "PRIVATE_KEY not set in .env file"
exit 1
fi
DEPLOYER=$(cast wallet address --private-key "$PRIVATE_KEY" 2>/dev/null || echo "")
if [ -z "$DEPLOYER" ]; then
log_error "Failed to get deployer address"
exit 1
fi
# Test amount for calculations (0.01 ETH)
TEST_AMOUNT_WEI="10000000000000000"
TEST_AMOUNT_ETH="0.01"
# Test counters
TOTAL_TESTS=0
PASSED_TESTS=0
FAILED_TESTS=0
WARNINGS=0
# Test result tracking
declare -A TEST_RESULTS=()
test_pass() {
((TOTAL_TESTS++))
((PASSED_TESTS++))
TEST_RESULTS["$1"]="PASS"
log_success "$1"
}
test_fail() {
((TOTAL_TESTS++))
((FAILED_TESTS++))
TEST_RESULTS["$1"]="FAIL"
log_error "$1"
}
test_warn() {
((TOTAL_TESTS++))
((WARNINGS++))
TEST_RESULTS["$1"]="WARN"
log_warn "$1"
}
log_info "========================================="
log_info "Comprehensive Bridge Testing"
log_info "========================================="
log_info ""
log_info "Configuration:"
log_info " Token: $TOKEN_NAME"
log_info " Token Address: $TOKEN_ADDRESS"
log_info " Bridge Address: $BRIDGE_ADDRESS"
log_info " Deployer: $DEPLOYER"
log_info " RPC URL: $RPC_URL"
log_info " Test Amount: $TEST_AMOUNT_ETH ETH"
log_info ""
# ============================================================================
# TEST SUITE 1: RPC Connectivity
# ============================================================================
log_test "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
log_test "TEST SUITE 1: RPC Connectivity"
log_test "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
log_info ""
# Test 1.1: RPC Connection
log_test "Test 1.1: RPC Connection"
BLOCK_NUMBER=$(timeout 10 cast block-number --rpc-url "$RPC_URL" 2>/dev/null || echo "")
if [ -n "$BLOCK_NUMBER" ] && [ "$BLOCK_NUMBER" != "" ] && [ "$BLOCK_NUMBER" != "0" ]; then
test_pass "RPC connection successful (Block: $BLOCK_NUMBER)"
log_detail "Current block number: $BLOCK_NUMBER"
else
test_fail "RPC connection failed"
log_error "Cannot connect to RPC: $RPC_URL"
exit 1
fi
log_info ""
# Test 1.2: Chain ID
log_test "Test 1.2: Chain ID Verification"
CHAIN_ID=$(timeout 10 cast chain-id --rpc-url "$RPC_URL" 2>/dev/null || echo "")
if [ "$CHAIN_ID" = "138" ]; then
test_pass "Chain ID correct: $CHAIN_ID"
else
test_fail "Chain ID mismatch: expected 138, got $CHAIN_ID"
fi
log_info ""
# ============================================================================
# TEST SUITE 2: Contract Code Verification
# ============================================================================
log_test "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
log_test "TEST SUITE 2: Contract Code Verification"
log_test "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
log_info ""
# Test 2.1: Bridge Contract Code
log_test "Test 2.1: Bridge Contract Code Existence"
BRIDGE_CODE=$(timeout 10 cast code "$BRIDGE_ADDRESS" --rpc-url "$RPC_URL" 2>/dev/null || echo "")
if [ -n "$BRIDGE_CODE" ] && [ "${#BRIDGE_CODE}" -gt 10 ]; then
CODE_SIZE=$(( ${#BRIDGE_CODE} / 2 - 1 ))
test_pass "Bridge contract code exists (${CODE_SIZE} bytes)"
log_detail "Contract address: $BRIDGE_ADDRESS"
else
test_fail "Bridge contract has no code or invalid"
fi
log_info ""
# Test 2.2: Token Contract Code
log_test "Test 2.2: Token Contract Code Existence"
TOKEN_CODE=$(timeout 10 cast code "$TOKEN_ADDRESS" --rpc-url "$RPC_URL" 2>/dev/null || echo "")
if [ -n "$TOKEN_CODE" ] && [ "${#TOKEN_CODE}" -gt 10 ]; then
CODE_SIZE=$(( ${#TOKEN_CODE} / 2 - 1 ))
test_pass "Token contract code exists (${CODE_SIZE} bytes)"
log_detail "Contract address: $TOKEN_ADDRESS"
else
test_fail "Token contract has no code or invalid"
fi
log_info ""
# ============================================================================
# TEST SUITE 3: Account & Balance Verification
# ============================================================================
log_test "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
log_test "TEST SUITE 3: Account & Balance Verification"
log_test "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
log_info ""
# Test 3.1: ETH Balance
log_test "Test 3.1: ETH Balance Check"
ETH_BALANCE=$(timeout 10 cast balance "$DEPLOYER" --rpc-url "$RPC_URL" 2>/dev/null || echo "0")
if [ -z "$ETH_BALANCE" ]; then
ETH_BALANCE="0"
fi
ETH_BALANCE_ETH=$(echo "scale=6; $ETH_BALANCE / 1000000000000000000" | bc 2>/dev/null || echo "0")
if [ -z "$ETH_BALANCE_ETH" ]; then
ETH_BALANCE_ETH="0"
fi
if [ -n "$ETH_BALANCE" ] && [ "$ETH_BALANCE" != "0" ]; then
test_pass "ETH balance: $ETH_BALANCE_ETH ETH"
log_detail "Balance in wei: $ETH_BALANCE"
else
test_warn "ETH balance is zero or cannot be read"
fi
log_info ""
# Test 3.2: Token Balance
log_test "Test 3.2: $TOKEN_NAME Balance Check"
TOKEN_BALANCE=$(timeout 10 cast call "$TOKEN_ADDRESS" "balanceOf(address)" "$DEPLOYER" --rpc-url "$RPC_URL" 2>/dev/null || echo "0")
if [ -z "$TOKEN_BALANCE" ]; then
TOKEN_BALANCE="0"
fi
TOKEN_BALANCE_ETH=$(echo "scale=6; $TOKEN_BALANCE / 1000000000000000000" | bc 2>/dev/null || echo "0")
if [ -z "$TOKEN_BALANCE_ETH" ]; then
TOKEN_BALANCE_ETH="0"
fi
if [ -n "$TOKEN_BALANCE" ]; then
test_pass "$TOKEN_NAME balance: $TOKEN_BALANCE_ETH ETH"
log_detail "Balance in wei: $TOKEN_BALANCE"
else
test_warn "$TOKEN_NAME balance cannot be read"
fi
log_info ""
# Test 3.3: Bridge Allowance
log_test "Test 3.3: Bridge Allowance Check"
ALLOWANCE=$(timeout 10 cast call "$TOKEN_ADDRESS" "allowance(address,address)" "$DEPLOYER" "$BRIDGE_ADDRESS" --rpc-url "$RPC_URL" 2>/dev/null || echo "0")
if [ -z "$ALLOWANCE" ]; then
ALLOWANCE="0"
fi
ALLOWANCE_ETH=$(echo "scale=6; $ALLOWANCE / 1000000000000000000" | bc 2>/dev/null || echo "0")
if [ -z "$ALLOWANCE_ETH" ]; then
ALLOWANCE_ETH="0"
fi
if [ -n "$ALLOWANCE" ]; then
test_pass "Bridge allowance: $ALLOWANCE_ETH ETH"
log_detail "Allowance in wei: $ALLOWANCE"
if [ "$ALLOWANCE" = "0" ]; then
log_warn "Allowance is zero - approval will be needed for transfers"
fi
else
test_warn "Bridge allowance cannot be read"
fi
log_info ""
# ============================================================================
# TEST SUITE 4: Bridge Configuration - All 7 Networks
# ============================================================================
log_test "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
log_test "TEST SUITE 4: Bridge Destination Configuration (7 Networks)"
log_test "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
log_info ""
DESTINATIONS_CONFIGURED=0
declare -A DESTINATION_ADDRESSES=()
declare -A DESTINATION_STATUS=()
for chain in "${!CHAIN_SELECTORS[@]}"; do
selector="${CHAIN_SELECTORS[$chain]}"
log_test "Test 4.$((DESTINATIONS_CONFIGURED + 1)): $chain Destination Configuration"
log_detail "Chain Selector: $selector"
# Get destination address
DEST_ADDR=$(timeout 10 cast call "$BRIDGE_ADDRESS" "destinations(uint64)" "$selector" --rpc-url "$RPC_URL" 2>/dev/null || echo "")
if [ -n "$DEST_ADDR" ] && ! echo "$DEST_ADDR" | grep -qE "^0x0+$" && ! echo "$DEST_ADDR" | grep -qE "^0x0000000000000000000000000000000000000000$"; then
# Format address properly (remove leading zeros padding)
DEST_ADDR_CLEAN=$(echo "$DEST_ADDR" | sed 's/^0x0*//' | sed 's/^$/0/' | sed 's/^/0x/')
if [ "${#DEST_ADDR_CLEAN}" -lt 42 ]; then
DEST_ADDR_CLEAN=$(printf "0x%040s" "${DEST_ADDR_CLEAN#0x}" | tr ' ' '0')
fi
DESTINATION_ADDRESSES["$chain"]="$DEST_ADDR_CLEAN"
DESTINATION_STATUS["$chain"]="CONFIGURED"
test_pass "$chain destination configured: $DEST_ADDR_CLEAN"
((DESTINATIONS_CONFIGURED++))
else
DESTINATION_STATUS["$chain"]="NOT_CONFIGURED"
test_fail "$chain destination not configured or invalid"
log_detail "Returned value: $DEST_ADDR"
fi
log_info ""
done
log_info "Summary: $DESTINATIONS_CONFIGURED/7 destinations configured"
log_info ""
# ============================================================================
# TEST SUITE 5: Fee Calculation - All 7 Networks
# ============================================================================
log_test "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
log_test "TEST SUITE 5: Fee Calculation Testing (7 Networks)"
log_test "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
log_info ""
FEES_CALCULATED=0
declare -A FEE_VALUES=()
declare -A FEE_STATUS=()
for chain in "${!CHAIN_SELECTORS[@]}"; do
selector="${CHAIN_SELECTORS[$chain]}"
log_test "Test 5.$((FEES_CALCULATED + 1)): $chain Fee Calculation"
log_detail "Testing with amount: $TEST_AMOUNT_ETH ETH ($TEST_AMOUNT_WEI wei)"
# Calculate fee
FEE=$(timeout 10 cast call "$BRIDGE_ADDRESS" "calculateFee(uint64,uint256)" "$selector" "$TEST_AMOUNT_WEI" --rpc-url "$RPC_URL" 2>/dev/null || echo "0")
if [ -n "$FEE" ] && [ "$FEE" != "0" ] && [ "$FEE" != "" ]; then
FEE_ETH=$(echo "scale=10; $FEE / 1000000000000000000" | bc 2>/dev/null || echo "0")
FEE_VALUES["$chain"]="$FEE"
FEE_STATUS["$chain"]="SUCCESS"
test_pass "$chain fee calculation: $FEE_ETH ETH ($FEE wei)"
log_detail "Fee calculated successfully"
((FEES_CALCULATED++))
else
FEE_STATUS["$chain"]="FAILED"
test_warn "$chain fee calculation returned 0 or error"
log_detail "This may require LINK tokens or CCIP router configuration"
log_detail "Returned value: $FEE"
fi
log_info ""
done
log_info "Summary: $FEES_CALCULATED/7 fee calculations successful"
log_info ""
# ============================================================================
# TEST SUITE 6: Contract Function Verification
# ============================================================================
log_test "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
log_test "TEST SUITE 6: Contract Function Verification"
log_test "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
log_info ""
# Test 6.1: destinations() function
log_test "Test 6.1: destinations() Function"
BSC_SELECTOR="${CHAIN_SELECTORS[BSC]}"
DEST_TEST=$(timeout 10 cast call "$BRIDGE_ADDRESS" "destinations(uint64)" "$BSC_SELECTOR" --rpc-url "$RPC_URL" 2>/dev/null || echo "")
if [ -n "$DEST_TEST" ]; then
test_pass "destinations() function accessible"
log_detail "BSC destination: $DEST_TEST"
else
test_fail "destinations() function call failed"
fi
log_info ""
# Test 6.2: calculateFee() function
log_test "Test 6.2: calculateFee() Function"
FEE_TEST=$(timeout 10 cast call "$BRIDGE_ADDRESS" "calculateFee(uint64,uint256)" "$BSC_SELECTOR" "$TEST_AMOUNT_WEI" --rpc-url "$RPC_URL" 2>/dev/null || echo "0")
if [ -n "$FEE_TEST" ]; then
test_pass "calculateFee() function accessible"
log_detail "BSC fee result: $FEE_TEST wei"
else
test_fail "calculateFee() function call failed"
fi
log_info ""
# Test 6.3: Token balanceOf() function
log_test "Test 6.3: Token balanceOf() Function"
BALANCE_TEST=$(timeout 10 cast call "$TOKEN_ADDRESS" "balanceOf(address)" "$DEPLOYER" --rpc-url "$RPC_URL" 2>/dev/null || echo "0")
if [ -n "$BALANCE_TEST" ]; then
test_pass "Token balanceOf() function accessible"
log_detail "Balance result: $BALANCE_TEST wei"
else
test_fail "Token balanceOf() function call failed"
fi
log_info ""
# Test 6.4: Token allowance() function
log_test "Test 6.4: Token allowance() Function"
ALLOWANCE_TEST=$(timeout 10 cast call "$TOKEN_ADDRESS" "allowance(address,address)" "$DEPLOYER" "$BRIDGE_ADDRESS" --rpc-url "$RPC_URL" 2>/dev/null || echo "0")
if [ -n "$ALLOWANCE_TEST" ]; then
test_pass "Token allowance() function accessible"
log_detail "Allowance result: $ALLOWANCE_TEST wei"
else
test_fail "Token allowance() function call failed"
fi
log_info ""
# ============================================================================
# TEST SUITE 7: Gas Estimation (Read-Only)
# ============================================================================
log_test "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
log_test "TEST SUITE 7: Gas Estimation Testing"
log_test "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
log_info ""
# Test 7.1: Estimate gas for sendCrossChain (if allowance exists)
log_test "Test 7.1: Gas Estimation for sendCrossChain()"
if [ "$ALLOWANCE" != "0" ] && [ -n "$ALLOWANCE" ]; then
BSC_SELECTOR="${CHAIN_SELECTORS[BSC]}"
GAS_ESTIMATE=$(timeout 15 cast estimate "$BRIDGE_ADDRESS" "sendCrossChain(uint64,address,uint256)" "$BSC_SELECTOR" "$DEPLOYER" "$TEST_AMOUNT_WEI" --rpc-url "$RPC_URL" 2>/dev/null || echo "")
if [ -n "$GAS_ESTIMATE" ] && [ "$GAS_ESTIMATE" != "0" ]; then
test_pass "Gas estimation successful: $GAS_ESTIMATE gas units"
log_detail "Estimated gas for BSC transfer"
else
test_warn "Gas estimation failed or returned 0"
log_detail "This may indicate insufficient allowance or other issues"
fi
else
test_warn "Skipping gas estimation - allowance is zero"
log_detail "Set allowance first to test gas estimation"
fi
log_info ""
# ============================================================================
# TEST SUITE 8: Chain Selector Validation
# ============================================================================
log_test "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
log_test "TEST SUITE 8: Chain Selector Validation"
log_test "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
log_info ""
SELECTORS_VALID=0
for chain in "${!CHAIN_SELECTORS[@]}"; do
selector="${CHAIN_SELECTORS[$chain]}"
log_test "Test 8.$((SELECTORS_VALID + 1)): $chain Selector Validation"
if [ -n "$selector" ] && [[ "$selector" =~ ^[0-9]+$ ]] && [ "${#selector}" -ge 10 ]; then
test_pass "$chain selector valid: $selector"
log_detail "Selector format: numeric, ${#selector} digits"
((SELECTORS_VALID++))
else
test_fail "$chain selector invalid: $selector"
fi
log_info ""
done
log_info "Summary: $SELECTORS_VALID/7 chain selectors valid"
log_info ""
# ============================================================================
# FINAL SUMMARY REPORT
# ============================================================================
log_info "========================================="
log_info "TEST EXECUTION SUMMARY"
log_info "========================================="
log_info ""
log_info "Total Tests: $TOTAL_TESTS"
log_success "Passed: $PASSED_TESTS"
log_error "Failed: $FAILED_TESTS"
log_warn "Warnings: $WARNINGS"
log_info ""
# Calculate success rate
if [ "$TOTAL_TESTS" -gt 0 ]; then
SUCCESS_RATE=$(echo "scale=2; ($PASSED_TESTS * 100) / $TOTAL_TESTS" | bc 2>/dev/null || echo "0")
log_info "Success Rate: $SUCCESS_RATE%"
fi
log_info ""
# Detailed Results
log_info "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
log_info "DETAILED RESULTS"
log_info "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
log_info ""
log_info "Destination Configuration:"
for chain in "${!CHAIN_SELECTORS[@]}"; do
status="${DESTINATION_STATUS[$chain]:-UNKNOWN}"
addr="${DESTINATION_ADDRESSES[$chain]:-N/A}"
if [ "$status" = "CONFIGURED" ]; then
log_success " $chain: $addr"
else
log_error " $chain: NOT CONFIGURED"
fi
done
log_info ""
log_info "Fee Calculation Status:"
for chain in "${!CHAIN_SELECTORS[@]}"; do
status="${FEE_STATUS[$chain]:-UNKNOWN}"
fee="${FEE_VALUES[$chain]:-N/A}"
if [ "$status" = "SUCCESS" ]; then
fee_eth=$(echo "scale=10; $fee / 1000000000000000000" | bc 2>/dev/null || echo "0")
log_success " $chain: $fee_eth ETH"
else
log_warn " $chain: Failed or requires LINK"
fi
done
log_info ""
# Final Status
log_info "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
if [ "$FAILED_TESTS" -eq 0 ] && [ "$DESTINATIONS_CONFIGURED" -eq 7 ]; then
log_success "✅ ALL CRITICAL TESTS PASSED"
log_success "Bridge is fully configured and ready for all 7 networks"
elif [ "$DESTINATIONS_CONFIGURED" -eq 7 ]; then
log_warn "⚠ Bridge configured but some tests had warnings"
log_info "Review warnings above for details"
else
log_error "✗ SOME CRITICAL TESTS FAILED"
log_error "Bridge may not be fully configured for all networks"
fi
log_info "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
log_info ""
log_info "Next Steps:"
if [ "$ALLOWANCE" = "0" ] || [ -z "$ALLOWANCE" ]; then
log_info " 1. Approve bridge to spend tokens (if needed)"
fi
if [ "$TOKEN_BALANCE" = "0" ] || [ -z "$TOKEN_BALANCE" ]; then
log_info " 2. Wrap ETH to $TOKEN_NAME (if needed)"
fi
log_info " 3. Review fee calculation results (may need LINK tokens)"
log_info " 4. Execute bridge transfers when ready"
log_info ""