139 lines
3.9 KiB
Bash
139 lines
3.9 KiB
Bash
|
|
#!/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[@]}"
|