#!/usr/bin/env bash set -euo pipefail REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" STACK_DIR="${REPO_ROOT}/infra/blockchain-devnet" RPC_URL="${BLOCKCHAIN_RPC_URL:-http://127.0.0.1:${BLOCKCHAIN_RPC_PORT:-8545}}" usage() { cat <<'EOF' Usage: ./jeannie blockchain-devnet {status|up|down|logs|rpc} status Show local devnet containers and RPC health. up Start the local Anvil devnet. down Stop the local Anvil devnet. logs Follow devnet logs. rpc Print the configured JSON-RPC endpoint. EOF } rpc_call() { local method="$1" curl -fsS -X POST "$RPC_URL" \ -H 'content-type: application/json' \ --data "{\"jsonrpc\":\"2.0\",\"method\":\"${method}\",\"params\":[],\"id\":1}" } case "${1:-status}" in status) echo "Blockchain devnet stack: ${STACK_DIR}" if command -v docker >/dev/null 2>&1; then (cd "$STACK_DIR" && docker compose ps) || true else echo "docker compose unavailable; cannot inspect local devnet stack" fi echo echo "RPC endpoint: ${RPC_URL}" if rpc_call eth_chainId >/tmp/homelab-blockchain-chainid.json 2>/tmp/homelab-blockchain-rpc.err; then printf 'chainId: ' cat /tmp/homelab-blockchain-chainid.json echo printf 'blockNumber: ' rpc_call eth_blockNumber || true echo else echo "RPC unavailable" sed 's/^/ /' /tmp/homelab-blockchain-rpc.err >&2 || true fi ;; up) cd "$STACK_DIR" docker compose up -d ;; down) cd "$STACK_DIR" docker compose down ;; logs) cd "$STACK_DIR" docker compose logs -f --tail=100 ;; rpc) echo "$RPC_URL" ;; -h|--help|help) usage ;; *) usage >&2 exit 1 ;; esac