#!/usr/bin/env bash # Burn all WETH9 from every address whose private key is provided. # Keys: set BURN_KEYS_FILE to a path with one PRIVATE_KEY=0x... per line, # or export BURN_KEY_1=0x... BURN_KEY_2=0x... etc. # Requires: RPC_URL_138 (or CHAIN138_RPC_URL). Keys from smom-dbis-138/.env or BURN_KEYS_FILE / BURN_KEY_*. # Usage: ./scripts/burn-weth9-from-keys.sh [--dry-run] 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 for a in "$@"; do case "$a" in --dry-run) DRY_RUN=true;; esac done # Collect private keys: BURN_KEY_1, BURN_KEY_2, ... and/or PRIVATE_KEY, and/or lines in BURN_KEYS_FILE KEYS=() if [[ -n "${PRIVATE_KEY:-}" ]]; then KEYS+=( "$PRIVATE_KEY" ) fi for i in $(seq 1 50); do v="BURN_KEY_$i" [[ -n "${!v:-}" ]] && KEYS+=( "${!v}" ) done if [[ -n "${BURN_KEYS_FILE:-}" ]] && [[ -f "$BURN_KEYS_FILE" ]]; then while IFS= read -r line || true; do line=$(echo "$line" | sed 's/^[[:space:]]*//;s/[[:space:]]*$//') [[ -z "$line" || "$line" =~ ^# ]] && continue if [[ "$line" =~ PRIVATE_KEY=(.+) ]]; then KEYS+=( "$(echo "${BASH_REMATCH[1]}" | sed "s/^['\"]//;s/['\"]$//")" ) fi done < "$BURN_KEYS_FILE" fi if [[ ${#KEYS[@]} -eq 0 ]]; then echo "No private keys found. Set PRIVATE_KEY, BURN_KEY_1, BURN_KEY_2, ... or BURN_KEYS_FILE (file with PRIVATE_KEY=0x... per line)." exit 1 fi echo "=== Burn WETH9 from all key-controlled addresses ===" echo "RPC: $RPC" echo "WETH9: $WETH9" echo "Keys loaded: ${#KEYS[@]}" echo "" BURNED=0 for KEY in "${KEYS[@]}"; do [[ -z "$KEY" ]] && continue ADDR=$(cast wallet address --private-key "$KEY" 2>/dev/null || true) [[ -z "$ADDR" ]] && continue BALANCE_WEI=$(cast call "$WETH9" "balanceOf(address)(uint256)" "$ADDR" --rpc-url "$RPC" 2>/dev/null || echo "0") [[ -z "$BALANCE_WEI" ]] && BALANCE_WEI=0 if [[ "$BALANCE_WEI" == "0" ]]; then echo "[$ADDR] Balance 0, skip" continue fi BALANCE_ETH=$(cast from-wei "$BALANCE_WEI" ether 2>/dev/null || echo "?") echo "[$ADDR] WETH9: $BALANCE_WEI ($BALANCE_ETH WETH)" if $DRY_RUN; then echo " [dry-run] Would withdraw($BALANCE_WEI)" ((BURNED++)) || true continue fi if cast send "$WETH9" "withdraw(uint256)" "$BALANCE_WEI" \ --rpc-url "$RPC" --private-key "$KEY" --legacy --gas-price "$GAS_PRICE" --gas-limit "$GAS_LIMIT" 2>&1; then echo " Burned." ((BURNED++)) || true else echo " Failed." fi echo "" done echo "Done. Burned from $BURNED address(es)." echo "To zero total supply, every WETH9 holder must withdraw; use ./scripts/weth9-list-holders.sh to list holders."