Files
proxmox/scripts/maintenance/run-mainnet-cwusdc-usdc-support.sh

139 lines
3.9 KiB
Bash
Raw Normal View History

#!/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[@]}"