Files
proxmox/scripts/verify/run-contract-verification-with-proxy.sh
defiQUG b3a8fe4496
Some checks failed
Deploy to Phoenix / deploy (push) Has been cancelled
chore: sync all changes to Gitea
- Config, docs, scripts, and backup manifests
- Submodule refs unchanged (m = modified content in submodules)

Made-with: Cursor
2026-03-02 11:37:34 -08:00

91 lines
3.7 KiB
Bash
Executable File

#!/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