#!/usr/bin/env bash # Orchestrate contract verification using forge-verification-proxy and Blockscout # Usage: source smom-dbis-138/.env 2>/dev/null; ./scripts/verify/run-contract-verification-with-proxy.sh # Env: FORGE_VERIFY_TIMEOUT (default 900), KEEP_PROXY=1 (skip cleanup), DEBUG=1 # Version: 2026-01-31 set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)" # Load env and contract addresses when available (optional so script works from CI or minimal env) if [[ -f "${SCRIPT_DIR}/../lib/load-project-env.sh" ]]; then source "${SCRIPT_DIR}/../lib/load-project-env.sh" else [[ -f "${PROJECT_ROOT}/config/ip-addresses.conf" ]] && source "${PROJECT_ROOT}/config/ip-addresses.conf" 2>/dev/null || true [[ -f "${PROJECT_ROOT}/smom-dbis-138/.env" ]] && set -a && source "${PROJECT_ROOT}/smom-dbis-138/.env" 2>/dev/null && set +a fi [[ "${DEBUG:-0}" = "1" ]] && set -x # Pre-flight command -v forge &>/dev/null || { echo "ERROR: forge not found (install Foundry)"; exit 1; } command -v node &>/dev/null || { echo "ERROR: node not found (required for verification proxy)"; exit 1; } SMOM="${SMOM_DIR:-${PROJECT_ROOT}/smom-dbis-138}" [[ -d "$SMOM" ]] || { echo "ERROR: smom-dbis-138 not found at $SMOM"; exit 1; } IP_BLOCKSCOUT="${IP_BLOCKSCOUT:-192.168.11.140}" VERIFIER_PORT="${FORGE_VERIFIER_PROXY_PORT:-3080}" PROXY_DIR="${PROJECT_ROOT}/forge-verification-proxy" FORGE_VERIFY_TIMEOUT="${FORGE_VERIFY_TIMEOUT:-900}" PROXY_PID="" KEEP_PROXY="${KEEP_PROXY:-0}" cleanup_proxy() { if [[ "${KEEP_PROXY}" = "1" ]]; then return 0; fi [[ -n "${PROXY_PID:-}" ]] && kill "$PROXY_PID" 2>/dev/null || true } trap cleanup_proxy EXIT # Optional Blockscout connectivity check if curl -s -o /dev/null -w "%{http_code}" --connect-timeout 3 "http://${IP_BLOCKSCOUT}:4000/" 2>/dev/null | grep -qE "200|404|502"; then : Blockscout reachable elif [[ -n "${SKIP_BLOCKSCOUT_CHECK:-}" ]]; then : Skipping Blockscout check else echo "WARN: Blockscout at ${IP_BLOCKSCOUT}:4000 is not reachable from this host (private LAN)." >&2 echo " Set SKIP_BLOCKSCOUT_CHECK=1 to run anyway (verification submissions will fail until Blockscout is reachable)." >&2 echo " To verify successfully: run this script from a host on the same LAN as ${IP_BLOCKSCOUT} or via VPN." >&2 fi proxy_listening() { if command -v nc &>/dev/null; then nc -z -w 2 127.0.0.1 "${VERIFIER_PORT}" 2>/dev/null else timeout 2 bash -c "echo >/dev/tcp/127.0.0.1/${VERIFIER_PORT}" 2>/dev/null fi } start_proxy_if_needed() { if proxy_listening; then echo "Forge verification proxy already running on port ${VERIFIER_PORT}" return 0 fi [[ ! -f "${PROXY_DIR}/server.js" ]] && { echo "ERROR: forge-verification-proxy not found at ${PROXY_DIR}"; exit 1; } echo "Starting forge-verification-proxy on port ${VERIFIER_PORT}..." BLOCKSCOUT_URL="http://${IP_BLOCKSCOUT}:4000" PORT="${VERIFIER_PORT}" node "${PROXY_DIR}/server.js" & PROXY_PID=$! sleep 2 if ! kill -0 "$PROXY_PID" 2>/dev/null; then PROXY_PID="" echo "ERROR: Proxy failed to start" exit 1 fi echo "Proxy started (PID $PROXY_PID). Will run verification..." } export FORGE_VERIFIER_URL="http://127.0.0.1:${VERIFIER_PORT}/api" start_proxy_if_needed if [[ "${FORGE_VERIFY_TIMEOUT}" -gt 0 ]]; then echo "Running verification (timeout: ${FORGE_VERIFY_TIMEOUT}s)..." timeout "${FORGE_VERIFY_TIMEOUT}" "${SCRIPT_DIR}/../verify-contracts-blockscout.sh" "${@}" || { code=$? [[ $code -eq 124 ]] && echo "Verification timed out after ${FORGE_VERIFY_TIMEOUT}s. Set FORGE_VERIFY_TIMEOUT=0 for no limit." && exit 124 exit $code } else "${SCRIPT_DIR}/../verify-contracts-blockscout.sh" "${@}" fi