#!/usr/bin/env bash # Unwrap (burn) all WETH9 in the deployer wallet on Chain 138. # Calls WETH9.withdraw(balance) so WETH9 is burned and ETH is returned to the deployer. # # Requires: PRIVATE_KEY and RPC_URL_138 (or CHAIN138_RPC_URL) in smom-dbis-138/.env # Usage: ./scripts/burn-weth9-deployer.sh [--dry-run] # ./scripts/burn-weth9-deployer.sh <0xADDRESS> # Check WETH9 balance of ADDRESS only (read-only) # If the UI shows WETH9 in a different wallet, that wallet's key must be in PRIVATE_KEY to unwrap. set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" cd "$PROJECT_ROOT" if [[ -f smom-dbis-138/.env ]]; then set -a source smom-dbis-138/.env set +a fi RPC="${RPC_URL_138:-${CHAIN138_RPC_URL:-http://192.168.11.211:8545}}" GAS_PRICE="${GAS_PRICE:-1000000000}" GAS_LIMIT="${GAS_LIMIT:-150000}" WETH9="0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2" DRY_RUN=false CHECK_ADDRESS="" for a in "$@"; do case "$a" in --dry-run) DRY_RUN=true;; 0x*) [[ -z "$CHECK_ADDRESS" ]] && CHECK_ADDRESS="$a";; esac done DEPLOYER="" if [[ -n "${PRIVATE_KEY:-}" ]]; then DEPLOYER=$(cast wallet address --private-key "$PRIVATE_KEY" 2>/dev/null || true) fi if [[ -n "$CHECK_ADDRESS" ]]; then DEPLOYER="$CHECK_ADDRESS" if [[ -z "$DEPLOYER" ]]; then echo "Error: invalid address $CHECK_ADDRESS" exit 1 fi echo "=== WETH9 balance check (read-only) ===" echo "Address: $DEPLOYER" echo "RPC: $RPC" echo "WETH9: $WETH9" echo "" BALANCE_WEI=$(cast call "$WETH9" "balanceOf(address)(uint256)" "$DEPLOYER" --rpc-url "$RPC" 2>/dev/null || echo "0") if [[ -z "$BALANCE_WEI" ]] || [[ "$BALANCE_WEI" == "0" ]]; then echo "WETH9 balance: 0" else BALANCE_ETH=$(cast from-wei "$BALANCE_WEI" ether 2>/dev/null || echo "?") echo "WETH9 balance: $BALANCE_WEI wei ($BALANCE_ETH WETH)" echo "" echo "To unwrap: run this script with PRIVATE_KEY for this address (e.g. set in smom-dbis-138/.env), or call withdraw($BALANCE_WEI) from this wallet." fi exit 0 fi if [[ -z "$DEPLOYER" ]]; then echo "Error: could not derive deployer address. Set PRIVATE_KEY in smom-dbis-138/.env" exit 1 fi echo "=== Burn all WETH9 in deployer wallet ===" echo "Deployer: $DEPLOYER" echo "RPC: $RPC" echo "WETH9: $WETH9" echo "" BALANCE_WEI=$(cast call "$WETH9" "balanceOf(address)(uint256)" "$DEPLOYER" --rpc-url "$RPC" 2>/dev/null || echo "0") if [[ -z "$BALANCE_WEI" ]] || [[ "$BALANCE_WEI" == "0" ]]; then echo "Deployer WETH9 balance is 0. Nothing to burn." exit 0 fi # Human-readable for display (18 decimals) BALANCE_ETH=$(cast from-wei "$BALANCE_WEI" ether 2>/dev/null || echo "?") echo "WETH9 balance: $BALANCE_WEI wei ($BALANCE_ETH WETH)" echo "" if $DRY_RUN; then echo "[dry-run] Would call WETH9.withdraw($BALANCE_WEI) to burn all WETH9 and receive $BALANCE_ETH ETH." echo "[dry-run] Command: cast send $WETH9 \"withdraw(uint256)\" $BALANCE_WEI --rpc-url \$RPC --private-key \$PRIVATE_KEY --legacy --gas-price $GAS_PRICE --gas-limit $GAS_LIMIT" exit 0 fi echo "Calling WETH9.withdraw($BALANCE_WEI)..." if cast send "$WETH9" "withdraw(uint256)" "$BALANCE_WEI" \ --rpc-url "$RPC" --private-key "$PRIVATE_KEY" --legacy --gas-price "$GAS_PRICE" --gas-limit "$GAS_LIMIT"; then echo "Done. All WETH9 in deployer wallet has been unwrapped (burned); ETH returned to $DEPLOYER" else echo "Transaction failed. Check gas, nonce, or RPC." exit 1 fi