#!/usr/bin/env bash # Generate MCP allowlist fragment for a public chain from deployment-status.json. # Reads cross-chain-pmm-lps/config/deployment-status.json and outputs pools for the given chainId. # # Usage: # ./scripts/generate-mcp-allowlist-from-deployment-status.sh # e.g. 137 # ./scripts/generate-mcp-allowlist-from-deployment-status.sh 137 -o fragment-137.json # # Output: JSON with "chain", "pools" (array of {name, pool_address, base_token, quote_token, profile}). # pmmPools in deployment-status must have poolAddress (or pool_address), base, quote (or base_token, quote_token). set -euo pipefail REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" STATUS="${REPO_ROOT}/cross-chain-pmm-lps/config/deployment-status.json" OUT_PATH="" CHAIN_ID="${1:-}" [[ -n "$CHAIN_ID" ]] || { echo "Usage: $0 [-o output.json]"; exit 1; } shift || true while [[ $# -gt 0 ]]; do case "$1" in -o) OUT_PATH="$2"; shift 2 ;; *) shift ;; esac done [[ -f "$STATUS" ]] || { echo "Not found: $STATUS"; exit 1; } command -v jq &>/dev/null || { echo "jq required"; exit 1; } # Read pmmPools for this chain; schema can be { "base", "quote", "poolAddress" } or { "base_token", "quote_token", "pool_address" } pools_json=$(jq -c --arg c "$CHAIN_ID" ' .chains[$c].pmmPools // [] | map( { name: ("pool-" + (.["poolAddress"] // .pool_address // "?")[0:10]), pool_address: (.["poolAddress"] // .pool_address), base_token: (.["base"] // .base_token), quote_token: (.["quote"] // .quote_token), profile: (.["profile"] // "dodo_pmm_v2_like") } | select(.pool_address != null and .base_token != null and .quote_token != null) ) ' "$STATUS" 2>/dev/null || echo "[]") # Add default limits to each pool with_limits=$(echo "$pools_json" | jq ' map(. + { limits: { max_slippage_bps: 50, max_single_tx_notional_usd: 2500, max_daily_notional_usd: 10000, cooldown_seconds: 1800, max_oracle_deviation_bps: 75, gas_cap_gwei: 35 } }) ') chain_name=$(jq -r --arg c "$CHAIN_ID" '.chains[$c].name // "Unknown"' "$STATUS") result=$(jq -n \ --arg chain "$CHAIN_ID" \ --arg name "$chain_name" \ --argjson pools "$with_limits" \ '{chain: $chain, description: ("MCP allowlist for chain " + $chain + " (" + $name + ") from deployment-status.json. Use with multi-chain MCP or per-chain allowlist."), pools: $pools}') if [[ -n "$OUT_PATH" ]]; then mkdir -p "$(dirname "$OUT_PATH")" echo "$result" | jq . > "$OUT_PATH" echo "Wrote $OUT_PATH ($(echo "$pools_json" | jq 'length') pools)" >&2 else echo "$result" | jq . fi