#!/usr/bin/env bash set -euo pipefail # Deploy only the Mainnet Aave quote-push receiver. # Default: simulation only. Use --apply to broadcast. # # Env: # PRIVATE_KEY, ETHEREUM_MAINNET_RPC required # AAVE_POOL_ADDRESS optional; defaults inside the Forge script # QUOTE_PUSH_RECEIVER_OWNER optional; defaults to deployer derived from PRIVATE_KEY # # Usage: # bash scripts/deployment/deploy-mainnet-aave-quote-push-receiver.sh --dry-run # bash scripts/deployment/deploy-mainnet-aave-quote-push-receiver.sh --apply SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROXMOX_ROOT="$(cd "${SCRIPT_DIR}/../.." && pwd)" SMOM="${PROXMOX_ROOT}/smom-dbis-138" _qp_private_key="${PRIVATE_KEY-}" _qp_rpc="${ETHEREUM_MAINNET_RPC-}" _qp_pool="${AAVE_POOL_ADDRESS-}" _qp_owner="${QUOTE_PUSH_RECEIVER_OWNER-}" # shellcheck disable=SC1091 source "${PROXMOX_ROOT}/scripts/lib/load-project-env.sh" 2>/dev/null || true # shellcheck disable=SC1091 source "${SMOM}/scripts/load-env.sh" >/dev/null 2>&1 || true [[ -n "$_qp_private_key" ]] && export PRIVATE_KEY="$_qp_private_key" [[ -n "$_qp_rpc" ]] && export ETHEREUM_MAINNET_RPC="$_qp_rpc" [[ -n "$_qp_pool" ]] && export AAVE_POOL_ADDRESS="$_qp_pool" [[ -n "$_qp_owner" ]] && export QUOTE_PUSH_RECEIVER_OWNER="$_qp_owner" unset _qp_private_key _qp_rpc _qp_pool _qp_owner require_cmd() { command -v "$1" >/dev/null 2>&1 || { echo "[fail] missing required command: $1" >&2 exit 1 } } require_env() { local name="$1" if [[ -z "${!name:-}" ]]; then echo "[fail] missing required env: $name" >&2 exit 1 fi } pick_latest_receiver() { local mode="$1" local latest_json="${SMOM}/broadcast/DeployAaveQuotePushFlashReceiver.s.sol/1/run-latest.json" if [[ "$mode" == "dry-run" ]]; then latest_json="${SMOM}/broadcast/DeployAaveQuotePushFlashReceiver.s.sol/1/dry-run/run-latest.json" fi if [[ ! -f "$latest_json" ]] || ! command -v jq >/dev/null 2>&1; then return 1 fi jq -r '.transactions[]? | select(.transactionType == "CREATE" and .contractName == "AaveQuotePushFlashReceiver") | .contractAddress' \ "$latest_json" | tail -n1 } require_cmd forge MODE="dry-run" BROADCAST=() for arg in "$@"; do case "$arg" in --dry-run) MODE="dry-run"; BROADCAST=() ;; --apply) MODE="apply"; BROADCAST=(--broadcast) ;; *) echo "[fail] unknown arg: $arg (use --dry-run or --apply)" >&2 exit 2 ;; esac done require_env PRIVATE_KEY require_env ETHEREUM_MAINNET_RPC echo "=== deploy-mainnet-aave-quote-push-receiver ($MODE) ===" if [[ -n "${QUOTE_PUSH_RECEIVER_OWNER:-}" ]]; then echo "receiver_owner=$QUOTE_PUSH_RECEIVER_OWNER" fi ( cd "$SMOM" forge script script/deploy/DeployAaveQuotePushFlashReceiver.s.sol:DeployAaveQuotePushFlashReceiver \ --rpc-url "$ETHEREUM_MAINNET_RPC" \ "${BROADCAST[@]}" \ -vvvv ) receiver_addr="$(pick_latest_receiver "$MODE" || true)" echo if [[ "$MODE" == "dry-run" ]]; then echo "Projected receiver address from this dry-run:" else echo "After --apply: copy deployed address into .env:" fi echo " AAVE_QUOTE_PUSH_RECEIVER_MAINNET=${receiver_addr:-...}" echo "Shortest manager handoff:" echo " AAVE_QUOTE_PUSH_RECEIVER_MAINNET=${receiver_addr:-...} QUOTE_PUSH_TREASURY_TAKE_RECEIVER_OWNERSHIP=1 bash scripts/deployment/deploy-mainnet-quote-push-treasury-manager.sh --apply" echo "Full stack alternative:" echo " bash scripts/deployment/deploy-mainnet-aave-quote-push-stack.sh --apply"