Files
explorer-monorepo/scripts/test-weth9-deposit.sh

206 lines
7.2 KiB
Bash
Executable File

#!/usr/bin/env bash
# Test WETH9 deposit function with detailed analysis
# Tests multiple amounts to verify 1:1 ratio consistency
# Usage: ./test-weth9-deposit.sh [private_key] [test_amounts...]
# Example: ./test-weth9-deposit.sh 0x... 0.001 0.01 0.1
set -euo pipefail
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'
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 environment variables if .env exists
if [ -f "$PROJECT_ROOT/.env" ]; then
source "$PROJECT_ROOT/.env"
elif [ -f "$PROJECT_ROOT/../.env" ]; then
source "$PROJECT_ROOT/../.env"
fi
# Configuration
RPC_URL="${RPC_URL_138:-http://192.168.11.250:8545}"
WETH9_ADDRESS="0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2"
# Parse arguments
PRIVATE_KEY="${1:-${PRIVATE_KEY:-}}"
shift || true
TEST_AMOUNTS=("${@:-0.001}")
if [ -z "$PRIVATE_KEY" ]; then
log_error "PRIVATE_KEY not provided. Usage: $0 [private_key] [test_amounts...]"
log_info "Or set PRIVATE_KEY in .env file"
exit 1
fi
log_info "========================================="
log_info "WETH9 Deposit Function Test Suite"
log_info "========================================="
log_info ""
# Get deployer address
DEPLOYER=$(cast wallet address --private-key "$PRIVATE_KEY" 2>/dev/null || echo "")
if [ -z "$DEPLOYER" ]; then
log_error "Failed to get address from private key"
exit 1
fi
log_info "Wallet Address: $DEPLOYER"
log_info "Test Amounts: ${TEST_AMOUNTS[*]}"
log_info "RPC URL: $RPC_URL"
log_info ""
# Get initial balances
INITIAL_ETH=$(cast balance "$DEPLOYER" --rpc-url "$RPC_URL" 2>/dev/null || echo "0")
INITIAL_WETH9=$(cast call "$WETH9_ADDRESS" "balanceOf(address)" "$DEPLOYER" --rpc-url "$RPC_URL" 2>/dev/null || echo "0")
INITIAL_ETH_ETH=$(echo "scale=18; $INITIAL_ETH / 1000000000000000000" | bc 2>/dev/null || echo "0")
INITIAL_WETH9_ETH=$(echo "scale=18; $INITIAL_WETH9 / 1000000000000000000" | bc 2>/dev/null || echo "0")
log_info "Initial ETH Balance: $INITIAL_ETH_ETH ETH"
log_info "Initial WETH9 Balance: $INITIAL_WETH9_ETH WETH"
log_info ""
# Test results storage
declare -a TEST_RESULTS
PASSED=0
FAILED=0
# Run tests for each amount
for TEST_AMOUNT in "${TEST_AMOUNTS[@]}"; do
log_info "----------------------------------------"
log_info "Testing with amount: $TEST_AMOUNT ETH"
log_info "----------------------------------------"
# Convert to wei
TEST_AMOUNT_WEI=$(cast --to-wei "$TEST_AMOUNT" ether 2>/dev/null || echo "")
if [ -z "$TEST_AMOUNT_WEI" ]; then
log_error "Failed to convert $TEST_AMOUNT to wei"
((FAILED++)) || true
continue
fi
# Get balance before
ETH_BEFORE=$(cast balance "$DEPLOYER" --rpc-url "$RPC_URL" 2>/dev/null || echo "0")
WETH9_BEFORE=$(cast call "$WETH9_ADDRESS" "balanceOf(address)" "$DEPLOYER" --rpc-url "$RPC_URL" 2>/dev/null || echo "0")
# Check sufficient balance
ETH_BEFORE_ETH=$(echo "scale=18; $ETH_BEFORE / 1000000000000000000" | bc 2>/dev/null || echo "0")
REQUIRED=$(echo "scale=18; $TEST_AMOUNT + 0.01" | bc 2>/dev/null || echo "$TEST_AMOUNT")
if (( $(echo "$ETH_BEFORE_ETH < $REQUIRED" | bc -l 2>/dev/null || echo 1) )); then
log_warn "Insufficient ETH for test ($TEST_AMOUNT ETH). Skipping..."
((FAILED++)) || true
continue
fi
# Execute deposit
log_info "Executing deposit() with $TEST_AMOUNT ETH..."
CURRENT_NONCE=$(cast nonce "$DEPLOYER" --rpc-url "$RPC_URL" 2>/dev/null || echo "0")
DEPOSIT_TX=$(cast send "$WETH9_ADDRESS" "deposit()" \
--value "$TEST_AMOUNT_WEI" \
--rpc-url "$RPC_URL" \
--private-key "$PRIVATE_KEY" \
--gas-price 5000000000 \
--nonce "$CURRENT_NONCE" \
2>&1 || echo "")
if ! echo "$DEPOSIT_TX" | grep -qE "transactionHash"; then
log_error "Deposit transaction failed"
log_info "Output: $DEPOSIT_TX"
((FAILED++)) || true
continue
fi
TX_HASH=$(echo "$DEPOSIT_TX" | grep -oE "transactionHash[[:space:]]+0x[0-9a-fA-F]{64}" | awk '{print $2}')
log_success "Transaction sent: $TX_HASH"
log_info "Waiting for confirmation..."
sleep 15
# Get balance after
ETH_AFTER=$(cast balance "$DEPLOYER" --rpc-url "$RPC_URL" 2>/dev/null || echo "0")
WETH9_AFTER=$(cast call "$WETH9_ADDRESS" "balanceOf(address)" "$DEPLOYER" --rpc-url "$RPC_URL" 2>/dev/null || echo "0")
# Calculate differences
ETH_SPENT=$(echo "$ETH_BEFORE - $ETH_AFTER" | bc 2>/dev/null || echo "0")
WETH9_RECEIVED=$(echo "$WETH9_AFTER - $WETH9_BEFORE" | bc 2>/dev/null || echo "0")
ETH_SPENT_ETH=$(echo "scale=18; $ETH_SPENT / 1000000000000000000" | bc 2>/dev/null || echo "0")
WETH9_RECEIVED_ETH=$(echo "scale=18; $WETH9_RECEIVED / 1000000000000000000" | bc 2>/dev/null || echo "0")
# Calculate gas (approximate)
GAS_ESTIMATE=$(echo "$ETH_SPENT - $TEST_AMOUNT_WEI" | bc 2>/dev/null || echo "0")
GAS_ESTIMATE_ETH=$(echo "scale=18; $GAS_ESTIMATE / 1000000000000000000" | bc 2>/dev/null || echo "0")
log_info "Results:"
log_info " ETH Spent (total): $ETH_SPENT_ETH ETH ($ETH_SPENT wei)"
log_info " ETH for Wrap: $TEST_AMOUNT ETH ($TEST_AMOUNT_WEI wei)"
log_info " Gas (approx): $GAS_ESTIMATE_ETH ETH ($GAS_ESTIMATE wei)"
log_info " WETH9 Received: $WETH9_RECEIVED_ETH WETH ($WETH9_RECEIVED wei)"
log_info ""
# Verify 1:1 ratio
if [ "$WETH9_RECEIVED" = "$TEST_AMOUNT_WEI" ]; then
log_success "✓ 1:1 Ratio VERIFIED for $TEST_AMOUNT ETH"
TEST_RESULTS+=("$TEST_AMOUNT ETH: PASS")
((PASSED++)) || true
else
log_error "✗ 1:1 Ratio FAILED for $TEST_AMOUNT ETH"
log_error " Expected: $TEST_AMOUNT_WEI wei"
log_error " Received: $WETH9_RECEIVED wei"
DIFF=$(echo "$TEST_AMOUNT_WEI - $WETH9_RECEIVED" | bc 2>/dev/null || echo "0")
DIFF_ETH=$(echo "scale=18; $DIFF / 1000000000000000000" | bc 2>/dev/null || echo "0")
log_error " Difference: $DIFF_ETH ETH ($DIFF wei)"
TEST_RESULTS+=("$TEST_AMOUNT ETH: FAIL (diff: $DIFF_ETH ETH)")
((FAILED++)) || true
fi
log_info ""
done
# Final summary
log_info "========================================="
log_info "Test Summary"
log_info "========================================="
log_info ""
for result in "${TEST_RESULTS[@]}"; do
if echo "$result" | grep -q "PASS"; then
log_success "$result"
else
log_error "$result"
fi
done
log_info ""
log_info "Total Tests: $(($PASSED + $FAILED))"
log_info "Passed: $PASSED"
log_info "Failed: $FAILED"
if [ $FAILED -eq 0 ]; then
log_success "✓ All tests passed - 1:1 ratio is maintained"
exit 0
else
log_error "✗ Some tests failed - 1:1 ratio is NOT maintained"
log_info ""
log_info "This indicates the WETH9 contract may have:"
log_info " - Fees deducted during deposit"
log_info " - Modified deposit() implementation"
log_info " - Accounting errors"
log_info ""
log_info "Recommendation: Inspect contract bytecode and compare with standard WETH9"
exit 1
fi