72 lines
2.6 KiB
Bash
72 lines
2.6 KiB
Bash
|
|
#!/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 <chain_id> # 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 <chain_id> [-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
|