196 lines
7.2 KiB
Bash
Executable File
196 lines
7.2 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Verify WETH9 1:1 ratio with ETH
|
|
# This script tests that depositing X ETH results in exactly X WETH9
|
|
# Usage: ./verify-weth9-ratio.sh [private_key] [test_amount]
|
|
|
|
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:-}}"
|
|
TEST_AMOUNT="${2:-0.001}"
|
|
|
|
if [ -z "$PRIVATE_KEY" ]; then
|
|
log_error "PRIVATE_KEY not provided. Usage: $0 [private_key] [test_amount]"
|
|
log_info "Or set PRIVATE_KEY in .env file"
|
|
exit 1
|
|
fi
|
|
|
|
log_info "========================================="
|
|
log_info "WETH9 1:1 Ratio Verification"
|
|
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 Amount: $TEST_AMOUNT ETH"
|
|
log_info "RPC URL: $RPC_URL"
|
|
log_info ""
|
|
|
|
# Step 1: Get initial balances
|
|
log_info "Step 1: Checking 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 ($INITIAL_ETH wei)"
|
|
log_info "Initial WETH9 Balance: $INITIAL_WETH9_ETH WETH ($INITIAL_WETH9 wei)"
|
|
log_info ""
|
|
|
|
# Check if sufficient ETH
|
|
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"
|
|
exit 1
|
|
fi
|
|
|
|
REQUIRED_ETH=$(echo "scale=18; $TEST_AMOUNT + 0.01" | bc 2>/dev/null || echo "$TEST_AMOUNT")
|
|
if (( $(echo "$INITIAL_ETH_ETH < $REQUIRED_ETH" | bc -l 2>/dev/null || echo 1) )); then
|
|
log_error "Insufficient ETH balance. Need at least $REQUIRED_ETH ETH (including gas)"
|
|
exit 1
|
|
fi
|
|
|
|
# Step 2: Wrap ETH to WETH9
|
|
log_info "Step 2: Wrapping $TEST_AMOUNT ETH to WETH9..."
|
|
CURRENT_NONCE=$(cast nonce "$DEPLOYER" --rpc-url "$RPC_URL" 2>/dev/null || echo "0")
|
|
|
|
WRAP_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 "$WRAP_TX" | grep -qE "transactionHash"; then
|
|
TX_HASH=$(echo "$WRAP_TX" | grep -oE "transactionHash[[:space:]]+0x[0-9a-fA-F]{64}" | awk '{print $2}')
|
|
log_success "✓ Wrap transaction sent: $TX_HASH"
|
|
log_info "Waiting for confirmation..."
|
|
sleep 15
|
|
else
|
|
log_error "Failed to wrap ETH"
|
|
log_info "Transaction output: $WRAP_TX"
|
|
exit 1
|
|
fi
|
|
|
|
# Step 3: Check balances after wrap
|
|
log_info ""
|
|
log_info "Step 3: Checking balances after wrap..."
|
|
FINAL_ETH=$(cast balance "$DEPLOYER" --rpc-url "$RPC_URL" 2>/dev/null || echo "0")
|
|
FINAL_WETH9=$(cast call "$WETH9_ADDRESS" "balanceOf(address)" "$DEPLOYER" --rpc-url "$RPC_URL" 2>/dev/null || echo "0")
|
|
|
|
FINAL_ETH_ETH=$(echo "scale=18; $FINAL_ETH / 1000000000000000000" | bc 2>/dev/null || echo "0")
|
|
FINAL_WETH9_ETH=$(echo "scale=18; $FINAL_WETH9 / 1000000000000000000" | bc 2>/dev/null || echo "0")
|
|
|
|
log_info "Final ETH Balance: $FINAL_ETH_ETH ETH ($FINAL_ETH wei)"
|
|
log_info "Final WETH9 Balance: $FINAL_WETH9_ETH WETH ($FINAL_WETH9 wei)"
|
|
log_info ""
|
|
|
|
# Step 4: Calculate differences
|
|
ETH_DIFF=$(echo "scale=18; $INITIAL_ETH - $FINAL_ETH" | bc 2>/dev/null || echo "0")
|
|
WETH9_DIFF=$(echo "scale=18; $FINAL_WETH9 - $INITIAL_WETH9" | bc 2>/dev/null || echo "0")
|
|
|
|
ETH_DIFF_ETH=$(echo "scale=18; $ETH_DIFF / 1000000000000000000" | bc 2>/dev/null || echo "0")
|
|
WETH9_DIFF_ETH=$(echo "scale=18; $WETH9_DIFF / 1000000000000000000" | bc 2>/dev/null || echo "0")
|
|
|
|
log_info "ETH Spent: $ETH_DIFF_ETH ETH ($ETH_DIFF wei)"
|
|
log_info "WETH9 Received: $WETH9_DIFF_ETH WETH ($WETH9_DIFF wei)"
|
|
log_info ""
|
|
|
|
# Step 5: Verify 1:1 ratio
|
|
log_info "Step 4: Verifying 1:1 ratio..."
|
|
log_info ""
|
|
|
|
# Calculate the ratio (should be exactly 1.0)
|
|
if [ "$WETH9_DIFF" != "0" ]; then
|
|
RATIO=$(echo "scale=18; $WETH9_DIFF / $TEST_AMOUNT_WEI" | bc 2>/dev/null || echo "0")
|
|
RATIO_PERCENT=$(echo "scale=6; $RATIO * 100" | bc 2>/dev/null || echo "0")
|
|
|
|
log_info "Expected WETH9: $TEST_AMOUNT WETH ($TEST_AMOUNT_WEI wei)"
|
|
log_info "Actual WETH9: $WETH9_DIFF_ETH WETH ($WETH9_DIFF wei)"
|
|
log_info "Ratio: $RATIO ($RATIO_PERCENT%)"
|
|
log_info ""
|
|
|
|
# Check if ratio is exactly 1.0 (within 0.0001% tolerance for rounding)
|
|
RATIO_DIFF=$(echo "scale=18; $RATIO - 1.0" | bc 2>/dev/null || echo "0")
|
|
RATIO_DIFF_ABS=$(echo "scale=18; if ($RATIO_DIFF < 0) -($RATIO_DIFF) else $RATIO_DIFF" | bc 2>/dev/null || echo "0")
|
|
|
|
# Tolerance: 0.0001% (0.000001 in ratio terms)
|
|
TOLERANCE="0.000001"
|
|
|
|
if (( $(echo "$RATIO_DIFF_ABS <= $TOLERANCE" | bc -l 2>/dev/null || echo 0) )); then
|
|
log_success "✓ 1:1 Ratio Verified! (Ratio: $RATIO)"
|
|
log_info " ETH deposited: $TEST_AMOUNT ETH"
|
|
log_info " WETH9 received: $WETH9_DIFF_ETH WETH"
|
|
log_info " Difference: $ETH_DIFF_ETH ETH (gas fees)"
|
|
else
|
|
log_error "✗ Ratio Mismatch Detected!"
|
|
log_error " Expected ratio: 1.0"
|
|
log_error " Actual ratio: $RATIO"
|
|
log_error " Difference: $RATIO_DIFF"
|
|
log_error ""
|
|
log_error "This indicates the WETH9 contract is NOT maintaining a 1:1 ratio."
|
|
log_error "Please investigate the contract implementation."
|
|
exit 1
|
|
fi
|
|
else
|
|
log_error "No WETH9 was received. Transaction may have failed."
|
|
exit 1
|
|
fi
|
|
|
|
# Step 6: Check contract balance
|
|
log_info ""
|
|
log_info "Step 5: Verifying contract backing..."
|
|
CONTRACT_ETH=$(cast balance "$WETH9_ADDRESS" --rpc-url "$RPC_URL" 2>/dev/null || echo "0")
|
|
TOTAL_SUPPLY=$(cast call "$WETH9_ADDRESS" "totalSupply()" --rpc-url "$RPC_URL" 2>/dev/null || echo "0")
|
|
|
|
CONTRACT_ETH_ETH=$(echo "scale=18; $CONTRACT_ETH / 1000000000000000000" | bc 2>/dev/null || echo "0")
|
|
TOTAL_SUPPLY_ETH=$(echo "scale=18; $TOTAL_SUPPLY / 1000000000000000000" | bc 2>/dev/null || echo "0")
|
|
|
|
log_info "WETH9 Contract ETH Balance: $CONTRACT_ETH_ETH ETH"
|
|
log_info "WETH9 Total Supply: $TOTAL_SUPPLY_ETH WETH"
|
|
|
|
if [ "$CONTRACT_ETH" = "$TOTAL_SUPPLY" ]; then
|
|
log_success "✓ Contract balance matches total supply (1:1 backing)"
|
|
else
|
|
log_warn "⚠ Contract balance does not match total supply"
|
|
log_warn " This may indicate an issue with the contract implementation"
|
|
fi
|
|
|
|
log_info ""
|
|
log_success "Verification complete!"
|
|
|