- 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
90 lines
3.1 KiB
Bash
Executable File
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
|