Files
proxmox/scripts/verify/run-mev-roadmap-validation.sh

178 lines
5.9 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
MEV_ROOT="$ROOT/MEV_Bot/mev-platform"
CHAIN_ID="${CHAIN_ID:-}"
BASE_URL="${MEV_BASE_URL:-https://mev.defi-oracle.io}"
API_KEY="${MEV_API_KEY:-${API_KEY:-}}"
RUN_LIVE=0
LIVE_PER_CHAIN=0
rpc_jsonrpc() {
local rpc_url="$1"
local body="$2"
local attempts="${3:-4}"
local delay=1
local tmp_body tmp_code
tmp_body="$(mktemp)"
tmp_code="$(mktemp)"
for ((i=1; i<=attempts; i++)); do
if curl -sS -o "$tmp_body" -w '%{http_code}' -H 'content-type: application/json' -d "$body" "$rpc_url" >"$tmp_code"; then
code="$(cat "$tmp_code")"
if [[ "$code" == "200" ]]; then
cat "$tmp_body"
rm -f "$tmp_body" "$tmp_code"
return 0
fi
if [[ "$code" != "429" ]]; then
cat "$tmp_body" >&2 || true
rm -f "$tmp_body" "$tmp_code"
return 1
fi
fi
sleep "$delay"
delay=$((delay * 2))
done
cat "$tmp_body" >&2 || true
rm -f "$tmp_body" "$tmp_code"
return 1
}
while [[ $# -gt 0 ]]; do
case "$1" in
--chain-id)
CHAIN_ID="${2:-}"
shift 2
;;
--base-url)
BASE_URL="${2:-}"
shift 2
;;
--api-key)
API_KEY="${2:-}"
shift 2
;;
--live)
RUN_LIVE=1
shift
;;
--live-per-chain)
RUN_LIVE=1
LIVE_PER_CHAIN=1
shift
;;
*)
echo "Unknown arg: $1" >&2
exit 2
;;
esac
done
echo "[1/4] Rust validation"
(
cd "$MEV_ROOT"
cargo test -p mev-shared
cargo check -p mev-state-ingestion -p mev-liquidity-graph -p mev-opportunity-search -p mev-simulation -p mev-bundle-builder -p mev-admin-api
)
echo "[2/4] Contract validation"
(
cd "$MEV_ROOT/contracts"
forge test
)
echo "[3/4] GUI validation"
(
cd "$MEV_ROOT/gui"
npm run build
)
echo "[4/4] Config inventory checks"
python3 - "$MEV_ROOT/config.toml" "$CHAIN_ID" <<'PY'
import sys, tomllib
path = sys.argv[1]
requested = sys.argv[2].strip()
with open(path, "rb") as fh:
data = tomllib.load(fh)
chains = data.get("chains", {})
required = {"1", "8453", "138"}
missing = sorted(required - set(chains.keys()))
if missing:
raise SystemExit(f"Missing required chains in config.toml: {', '.join(missing)}")
targets = [requested] if requested else sorted(required)
for cid in targets:
chain = chains.get(cid)
if not chain:
raise SystemExit(f"Chain {cid} missing from config.toml")
if "rpc_url" not in chain:
raise SystemExit(f"Chain {cid} missing rpc_url")
if "multicall" not in chain:
raise SystemExit(f"Chain {cid} missing multicall")
venues = chain.get("venues", [])
if cid == "138" and not venues:
raise SystemExit("Chain 138 requires DODO venue examples or inventory")
print("Config inventory checks passed")
PY
if [[ "$RUN_LIVE" -eq 1 ]]; then
echo "[live] API smoke"
auth_header=()
if [[ -n "$API_KEY" ]]; then
auth_header=(-H "X-API-Key: $API_KEY")
fi
curl -fsS "${auth_header[@]}" "$BASE_URL/api/health" >/dev/null
curl -fsS "${auth_header[@]}" "$BASE_URL/api/infra" >/dev/null
curl -fsS "${auth_header[@]}" "$BASE_URL/api/stats/freshness" >/dev/null
curl -fsS "${auth_header[@]}" "$BASE_URL/api/stats/venue-coverage" >/dev/null
echo "Live API smoke passed"
fi
if [[ "$LIVE_PER_CHAIN" -eq 1 ]]; then
echo "[live] Per-chain deployment validation"
python3 - "$MEV_ROOT/config.toml" <<'PY' > /tmp/mev_roadmap_live_targets.json
import json, sys, tomllib
with open(sys.argv[1], "rb") as fh:
data = tomllib.load(fh)
chains = data.get("chains", {})
targets = {}
for cid in ("1", "8453", "138"):
chain = chains[cid]
targets[cid] = {
"rpc_url": chain.get("rpc_url", ""),
"ws_url": chain.get("ws_url", ""),
"multicall": chain.get("multicall", ""),
}
print(json.dumps(targets))
PY
for cid in 1 8453 138; do
rpc_url="$(python3 -c 'import json; import sys; data=json.load(open("/tmp/mev_roadmap_live_targets.json")); print(data[sys.argv[1]]["rpc_url"])' "$cid")"
ws_url="$(python3 -c 'import json; import sys; data=json.load(open("/tmp/mev_roadmap_live_targets.json")); print(data[sys.argv[1]]["ws_url"])' "$cid")"
multicall="$(python3 -c 'import json; import sys; data=json.load(open("/tmp/mev_roadmap_live_targets.json")); print(data[sys.argv[1]]["multicall"])' "$cid")"
override_var="MEV_LIVE_RPC_URL_${cid}"
override_rpc="${!override_var:-}"
if [[ -n "$override_rpc" ]]; then
rpc_url="$override_rpc"
fi
echo " - chain $cid"
[[ -n "$rpc_url" ]] || { echo "missing rpc_url for chain $cid" >&2; exit 1; }
[[ -n "$multicall" ]] || { echo "missing multicall for chain $cid" >&2; exit 1; }
chain_hex="$(rpc_jsonrpc "$rpc_url" '{"jsonrpc":"2.0","id":1,"method":"eth_chainId","params":[]}' | python3 -c 'import json,sys; print(json.load(sys.stdin)["result"])')"
block_hex="$(rpc_jsonrpc "$rpc_url" '{"jsonrpc":"2.0","id":1,"method":"eth_blockNumber","params":[]}' | python3 -c 'import json,sys; print(json.load(sys.stdin)["result"])')"
[[ "$chain_hex" == "0x$(printf '%x' "$cid")" ]] || { echo "chainId mismatch for chain $cid: $chain_hex" >&2; exit 1; }
[[ "$block_hex" != "0x0" ]] || { echo "block height invalid for chain $cid" >&2; exit 1; }
if [[ -n "$ws_url" ]]; then
echo " ws_url configured"
else
echo " ws_url missing" >&2
exit 1
fi
curl -fsS "${auth_header[@]}" "$BASE_URL/api/stats/freshness" | python3 -c 'import json,sys; rows=json.load(sys.stdin); cid=int(sys.argv[1]); assert any(int(r["chain_id"])==cid for r in rows)' "$cid" >/dev/null
curl -fsS "${auth_header[@]}" "$BASE_URL/api/stats/venue-coverage" | python3 -c 'import json,sys; rows=json.load(sys.stdin); cid=int(sys.argv[1]); assert any(int(r["chain_id"])==cid for r in rows)' "$cid" >/dev/null
done
rm -f /tmp/mev_roadmap_live_targets.json
echo "Per-chain live validation passed"
fi
echo "MEV roadmap validation completed successfully"