43 lines
1.5 KiB
Bash
43 lines
1.5 KiB
Bash
|
|
#!/usr/bin/env bash
|
||
|
|
# List all WETH9 holders and their balances on Chain 138 (Blockscout API).
|
||
|
|
# Usage: ./scripts/weth9-list-holders.sh
|
||
|
|
|
||
|
|
set -euo pipefail
|
||
|
|
|
||
|
|
BLOCKSCOUT_API="${BLOCKSCOUT_API:-https://explorer.d-bis.org/api}"
|
||
|
|
WETH9="0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2"
|
||
|
|
PAGE_SIZE=100
|
||
|
|
|
||
|
|
echo "=== WETH9 holders (Chain 138) ==="
|
||
|
|
echo "WETH9: $WETH9"
|
||
|
|
echo "API: $BLOCKSCOUT_API"
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
PAGE=1
|
||
|
|
TOTAL=0
|
||
|
|
while true; do
|
||
|
|
URL="${BLOCKSCOUT_API}/v2/tokens/${WETH9}/holders?page=${PAGE}&page_size=${PAGE_SIZE}"
|
||
|
|
RESP=$(curl -sS --connect-timeout 10 "$URL" 2>/dev/null || echo '{"items":[]}')
|
||
|
|
N=$(echo "$RESP" | jq -r '(.items | length) // (.data | length) // 0' 2>/dev/null || echo "0")
|
||
|
|
[[ -z "$N" || "$N" -eq 0 ]] && break
|
||
|
|
for i in $(seq 0 $((N - 1))); do
|
||
|
|
ITEM=$(echo "$RESP" | jq -c "(.items[$i] // .data[$i]) // {}")
|
||
|
|
ADDR=$(echo "$ITEM" | jq -r '.address.hash // .address // .holder_address // empty')
|
||
|
|
VAL=$(echo "$ITEM" | jq -r '.value // .balance // "0"')
|
||
|
|
[[ -z "$ADDR" || "$ADDR" == "null" ]] && continue
|
||
|
|
if command -v cast &>/dev/null; then
|
||
|
|
ETH=$(cast from-wei "$VAL" ether 2>/dev/null || echo "$VAL")
|
||
|
|
else
|
||
|
|
ETH="$VAL"
|
||
|
|
fi
|
||
|
|
echo "$ADDR $VAL ($ETH WETH9)"
|
||
|
|
((TOTAL++)) || true
|
||
|
|
done
|
||
|
|
[[ "$N" -lt $PAGE_SIZE ]] && break
|
||
|
|
((PAGE++)) || true
|
||
|
|
done
|
||
|
|
|
||
|
|
echo ""
|
||
|
|
echo "Total holders: $TOTAL"
|
||
|
|
echo "To burn from an address you control: WETH9.withdraw(balance) with that key."
|