Files
proxmox/scripts/verify/check-mainnet-cwusdc-usdc-reserve-peg.sh
defiQUG dbd517b279 Sync workspace: config, docs, scripts, CI, operator rules, and submodule pointers.
- Update dbis_core, cross-chain-pmm-lps, explorer-monorepo, metamask-integration, pr-workspace/chains
- Omit embedded publish git dirs and empty placeholders from index

Made-with: Cursor
2026-04-12 06:12:20 -07:00

90 lines
3.1 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
# Read-only: Mainnet cWUSDC/USDC vault reserve 1:1 peg (same 6dp raw units).
#
# Invariant: |base - quote| / max(base, quote) <= PEG_IMBALANCE_MAX_BPS / 10_000
# (default 25 bps = 0.25%). Tune for ops; use 0 for "exact equality only".
#
# Usage:
# source scripts/lib/load-project-env.sh
# bash scripts/verify/check-mainnet-cwusdc-usdc-reserve-peg.sh
# PEG_IMBALANCE_MAX_BPS=50 bash scripts/verify/check-mainnet-cwusdc-usdc-reserve-peg.sh
#
# Exit:
# 0 — within tolerance
# 1 — breach (or RPC/read failure)
#
# Env: ETHEREUM_MAINNET_RPC, DODO_PMM_INTEGRATION_MAINNET (optional pool remap),
# POOL_CWUSDC_USDC_MAINNET, PEG_IMBALANCE_MAX_BPS (default 25)
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(cd "${SCRIPT_DIR}/../.." && pwd)"
# shellcheck disable=SC1091
source "${PROJECT_ROOT}/scripts/lib/load-project-env.sh" 2>/dev/null || true
# shellcheck disable=SC1091
source "${PROJECT_ROOT}/smom-dbis-138/scripts/load-env.sh" >/dev/null 2>&1 || true
require_cmd() {
command -v "$1" >/dev/null 2>&1 || {
echo "[fail] missing required command: $1" >&2
exit 1
}
}
require_cmd cast
require_cmd python3
RPC_URL="${ETHEREUM_MAINNET_RPC:-}"
CWUSDC="${CWUSDC_MAINNET:-0x2de5F116bFcE3d0f922d9C8351e0c5Fc24b9284a}"
USDC="0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"
INTEGRATION="${DODO_PMM_INTEGRATION_MAINNET:-}"
POOL="${POOL_CWUSDC_USDC_MAINNET:-0x69776fc607e9edA8042e320e7e43f54d06c68f0E}"
MAX_BPS="${PEG_IMBALANCE_MAX_BPS:-25}"
if [[ -z "$RPC_URL" ]]; then
echo "[fail] ETHEREUM_MAINNET_RPC is required" >&2
exit 1
fi
if [[ -n "$INTEGRATION" ]]; then
mapped_pool="$(cast call "$INTEGRATION" 'pools(address,address)(address)' "$CWUSDC" "$USDC" --rpc-url "$RPC_URL" 2>/dev/null | awk '{print $1}' || true)"
if [[ -n "$mapped_pool" && "$mapped_pool" != "0x0000000000000000000000000000000000000000" && "${mapped_pool,,}" != "${POOL,,}" ]]; then
POOL="$mapped_pool"
fi
fi
out="$(cast call "$POOL" 'getVaultReserve()(uint256,uint256)' --rpc-url "$RPC_URL" 2>/dev/null)" || {
echo "[fail] could not read getVaultReserve on pool=$POOL" >&2
exit 1
}
base_r="$(printf '%s\n' "$out" | sed -n '1p' | awk '{print $1}')"
quote_r="$(printf '%s\n' "$out" | sed -n '2p' | awk '{print $1}')"
read -r imb_bps verdict human_b human_q human_gap abs_raw <<<"$(
python3 - "$base_r" "$quote_r" "$MAX_BPS" <<'PY'
import sys
b, q, max_bps = int(sys.argv[1]), int(sys.argv[2]), int(sys.argv[3])
m = max(b, q, 1)
imb = abs(b - q) * 10000 // m
if max_bps <= 0:
ok = imb == 0
else:
ok = imb <= max_bps
verdict = "PEG_OK" if ok else "PEG_BREACH"
print(imb, verdict, f"{b / 1e6:.6f}", f"{q / 1e6:.6f}", f"{abs(b - q) / 1e6:.6f}", abs(b - q))
PY
)"
echo "=== Mainnet cWUSDC/USDC reserve peg ==="
echo "pool=$POOL"
echo "baseReserve_human=$human_b cWUSDC quoteReserve_human=$human_q USDC"
echo "imbalance_abs_raw=$abs_raw human_gap=$human_gap"
echo "imbalance_bps=$imb_bps max_allowed_bps=$MAX_BPS verdict=$verdict"
echo "Remediate: bash scripts/deployment/plan-mainnet-cwusdc-usdc-rebalance-liquidity.sh"
if [[ "$verdict" == "PEG_OK" ]]; then
exit 0
fi
exit 1