#!/usr/bin/env bash set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_ROOT="$(cd "${SCRIPT_DIR}/../.." && pwd)" # shellcheck source=/home/intlc/projects/proxmox/scripts/lib/load-project-env.sh source "${PROJECT_ROOT}/scripts/lib/load-project-env.sh" POLICY_PATH="${PROJECT_ROOT}/config/extraction/mainnet-cwusdc-usdc-support-policy.json" CHECKER="${PROJECT_ROOT}/scripts/verify/check-mainnet-cwusdc-usdc-support-health.py" FORGE_TARGET="smom-dbis-138/script/flash/RunManagedMainnetAaveCwusdcUsdcQuotePushCycle.s.sol:RunManagedMainnetAaveCwusdcUsdcQuotePushCycle" DRY_RUN=1 HEALTH_ONLY=0 FORCE_RUN=0 FLASH_OVERRIDE="" usage() { cat <<'EOF' Usage: bash scripts/maintenance/run-mainnet-cwusdc-usdc-support.sh [options] Options: --health-only Print the current support decision and exit. --broadcast Broadcast the managed cycle instead of simulating it. --force Run the managed cycle even if the checker only recommends monitor/hold. --flash-quote-amount-raw N Override the policy-selected flash quote amount. -h, --help Show this help text. Behavior: - Reads the canonical policy at config/extraction/mainnet-cwusdc-usdc-support-policy.json - Checks the public Uniswap V2 pair and defended DODO venue - Uses the managed Aave quote-push cycle against the defended DODO venue when intervention is recommended - Defaults to simulation unless --broadcast is passed EOF } while [[ $# -gt 0 ]]; do case "$1" in --health-only) HEALTH_ONLY=1 shift ;; --broadcast) DRY_RUN=0 shift ;; --force) FORCE_RUN=1 shift ;; --flash-quote-amount-raw) FLASH_OVERRIDE="${2:-}" shift 2 ;; -h|--help) usage exit 0 ;; *) echo "ERROR: unknown option: $1" >&2 usage >&2 exit 1 ;; esac done [[ -f "$POLICY_PATH" ]] || { echo "ERROR: missing policy file: $POLICY_PATH" >&2; exit 1; } [[ -f "$CHECKER" ]] || { echo "ERROR: missing checker script: $CHECKER" >&2; exit 1; } eval "$( python3 "$CHECKER" --shell )" echo "Policy: $POLICY_PATH" echo "Public pair: ${PUBLIC_PAIR_ADDRESS}" echo "Defended DODO pool: ${DEFENDED_POOL_ADDRESS}" echo "Deviation: ${PUBLIC_PAIR_DEVIATION_BPS:-unknown} bps" echo "Decision: ${DECISION_SEVERITY} / ${DECISION_ACTION}" echo "Reasons: ${REASONS_JSON}" if [[ "$HEALTH_ONLY" -eq 1 ]]; then exit 0 fi if [[ "$DECISION_ACTION" != "run_managed_cycle" && "$FORCE_RUN" -ne 1 ]]; then echo "No managed cycle scheduled. Use --force to simulate anyway." exit 0 fi FLASH_QUOTE_AMOUNT_RAW="${FLASH_OVERRIDE:-$FLASH_QUOTE_AMOUNT_RAW}" if [[ -z "${FLASH_QUOTE_AMOUNT_RAW:-}" || "${FLASH_QUOTE_AMOUNT_RAW}" == "0" ]]; then echo "ERROR: no flash quote amount resolved from policy or override" >&2 exit 1 fi for required_var in \ ETHEREUM_MAINNET_RPC \ DODO_PMM_INTEGRATION_MAINNET \ QUOTE_PUSH_EXTERNAL_UNWINDER_MAINNET \ AAVE_QUOTE_PUSH_RECEIVER_MAINNET \ QUOTE_PUSH_TREASURY_MANAGER_MAINNET \ UNWIND_MODE; do if [[ -z "${!required_var:-}" ]]; then echo "ERROR: missing required env var: ${required_var}" >&2 exit 1 fi done export PRIVATE_KEY="${KEEPER_PRIVATE_KEY:-${PRIVATE_KEY:-}}" if [[ -z "${PRIVATE_KEY}" ]]; then echo "ERROR: missing PRIVATE_KEY and KEEPER_PRIVATE_KEY" >&2 exit 1 fi export POOL_CWUSDC_USDC_MAINNET="${DEFENDED_POOL_ADDRESS}" export FLASH_QUOTE_AMOUNT_RAW export QUOTE_PUSH_TREASURY_HARVEST="${QUOTE_PUSH_TREASURY_HARVEST:-1}" export QUOTE_PUSH_TREASURY_GAS_HOLDBACK_TARGET_RAW="${GAS_HOLDBACK_TARGET_RAW}" forge_cmd=( forge script "$FORGE_TARGET" --root "$PROJECT_ROOT/smom-dbis-138" --rpc-url "$ETHEREUM_MAINNET_RPC" ) if [[ "$DRY_RUN" -eq 0 ]]; then forge_cmd+=(--broadcast) else echo "Simulation only. Pass --broadcast to execute on-chain." fi printf 'Running:' printf ' %q' "${forge_cmd[@]}" printf '\n' "${forge_cmd[@]}"