Files
proxmox/scripts/deployment/retire-engine-x-legacy-vault.sh
defiQUG dd02f4b59b
All checks were successful
Deploy to Phoenix / validate (push) Successful in 1m11s
Deploy to Phoenix / deploy (push) Successful in 43s
Deploy to Phoenix / deploy-atomic-swap-dapp (push) Successful in 1m32s
phoenix-deploy Deployed to cloudflare-sync
Deploy to Phoenix / cloudflare (push) Successful in 38s
Enhance .env configuration with Infura support and add new RPC endpoints for various networks. Update package.json with new deployment scripts for Engine X. Improve public LP compliance documentation in runbooks and scripts, including guidance for public pair repairs and funding strategies.
2026-05-07 18:19:37 -07:00

125 lines
5.3 KiB
Bash
Executable File

#!/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"
: "${ETHEREUM_MAINNET_RPC:?ETHEREUM_MAINNET_RPC is required}"
VAULT="${ENGINE_X_VAULT:-0x9a22a3e272A364D64240dE6bda796FcA421cA7E9}"
CWUSDC="${CWUSDC_MAINNET:-0x2de5F116bFcE3d0f922d9C8351e0c5Fc24b9284a}"
USDC="${USDC_MAINNET:-0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48}"
RECIPIENT="${RETIRE_RECIPIENT:-${DEPLOYER_ADDRESS:-}}"
ALLOW_STALE_ACCOUNTING_RETIREMENT="${ALLOW_STALE_ACCOUNTING_RETIREMENT:-0}"
EXECUTE="${EXECUTE:-0}"
if [[ -n "${PRIVATE_KEY:-}" ]]; then
SIGNER="$(cast wallet address --private-key "${PRIVATE_KEY}")"
RECIPIENT="${RETIRE_RECIPIENT:-${SIGNER}}"
else
SIGNER="${DEPLOYER_ADDRESS:-}"
fi
if [[ -z "${RECIPIENT}" ]]; then
echo "Set RETIRE_RECIPIENT or DEPLOYER_ADDRESS" >&2
exit 1
fi
if [[ "${EXECUTE}" == "1" && -z "${PRIVATE_KEY:-}" ]]; then
echo "PRIVATE_KEY is required when EXECUTE=1" >&2
exit 1
fi
OWNER="$(cast call "${VAULT}" 'owner()(address)' --rpc-url "${ETHEREUM_MAINNET_RPC}" | grep -oE '0x[a-fA-F0-9]{40}' | head -1)"
POOL_CWUSDC_RAW="$(cast call "${VAULT}" 'poolCwusdcReserve()(uint256)' --rpc-url "${ETHEREUM_MAINNET_RPC}" | awk '{print $1}' || echo 0)"
POOL_USDC_RAW="$(cast call "${VAULT}" 'poolUsdcReserve()(uint256)' --rpc-url "${ETHEREUM_MAINNET_RPC}" | awk '{print $1}' || echo 0)"
LENDER_USDC_RAW="$(cast call "${VAULT}" 'lenderUsdcAvailable()(uint256)' --rpc-url "${ETHEREUM_MAINNET_RPC}" | awk '{print $1}' || echo 0)"
VAULT_CWUSDC_RAW="$(cast call "${CWUSDC}" 'balanceOf(address)(uint256)' "${VAULT}" --rpc-url "${ETHEREUM_MAINNET_RPC}" | awk '{print $1}')"
VAULT_USDC_RAW="$(cast call "${USDC}" 'balanceOf(address)(uint256)' "${VAULT}" --rpc-url "${ETHEREUM_MAINNET_RPC}" | awk '{print $1}')"
ACCOUNTING_AWARE_SUPPORTED="0"
if cast call "${VAULT}" 'maxFlashLoan(address)(uint256)' "${USDC}" --rpc-url "${ETHEREUM_MAINNET_RPC}" >/dev/null 2>&1; then
ACCOUNTING_AWARE_SUPPORTED="1"
fi
if [[ "${EXECUTE}" == "1" && "${SIGNER,,}" != "${OWNER,,}" ]]; then
echo "EXECUTE=1 signer must be the vault owner" >&2
echo " signer: ${SIGNER}" >&2
echo " owner: ${OWNER}" >&2
exit 1
fi
eval "$(
python3 - "${POOL_CWUSDC_RAW}" "${POOL_USDC_RAW}" "${LENDER_USDC_RAW}" "${VAULT_CWUSDC_RAW}" "${VAULT_USDC_RAW}" <<'PY'
from decimal import Decimal
import sys
pool_cw, pool_usdc, lender_usdc, vault_cw, vault_usdc = map(int, sys.argv[1:])
def units(raw):
return f"{Decimal(raw) / Decimal(10**6):f}"
def emit(k, v):
print(f"{k}='{v}'")
emit("POOL_CWUSDC_UNITS", units(pool_cw))
emit("POOL_USDC_UNITS", units(pool_usdc))
emit("LENDER_USDC_UNITS", units(lender_usdc))
emit("VAULT_CWUSDC_UNITS", units(vault_cw))
emit("VAULT_USDC_UNITS", units(vault_usdc))
emit("BALANCED_POOL_WITHDRAW_RAW", min(pool_cw, pool_usdc, vault_cw, max(vault_usdc - lender_usdc, 0)))
PY
)"
cat <<EOF
Engine X legacy vault retirement plan
mode: ${EXECUTE}
vault: ${VAULT}
owner: ${OWNER}
signer: ${SIGNER:-n/a}
recipient: ${RECIPIENT}
accounting-aware API: ${ACCOUNTING_AWARE_SUPPORTED}
accounted pool: ${POOL_CWUSDC_UNITS} cWUSDC / ${POOL_USDC_UNITS} USDC
lender bucket: ${LENDER_USDC_UNITS} USDC
actual balances: ${VAULT_CWUSDC_UNITS} cWUSDC / ${VAULT_USDC_UNITS} USDC
EOF
if [[ "${ACCOUNTING_AWARE_SUPPORTED}" == "1" ]]; then
cat <<EOF
Accounting-aware retirement commands:
cast send "${VAULT}" 'withdrawPoolLiquidity(address,uint256,uint256)' "${RECIPIENT}" "${BALANCED_POOL_WITHDRAW_RAW}" "${BALANCED_POOL_WITHDRAW_RAW}" --rpc-url "\$ETHEREUM_MAINNET_RPC" --private-key "\$PRIVATE_KEY"
cast send "${VAULT}" 'withdrawLenderUsdc(address,uint256)' "${RECIPIENT}" "${LENDER_USDC_RAW}" --rpc-url "\$ETHEREUM_MAINNET_RPC" --private-key "\$PRIVATE_KEY"
EOF
if [[ "${EXECUTE}" == "1" ]]; then
cast send "${VAULT}" 'withdrawPoolLiquidity(address,uint256,uint256)' "${RECIPIENT}" "${BALANCED_POOL_WITHDRAW_RAW}" "${BALANCED_POOL_WITHDRAW_RAW}" --rpc-url "${ETHEREUM_MAINNET_RPC}" --private-key "${PRIVATE_KEY}"
cast send "${VAULT}" 'withdrawLenderUsdc(address,uint256)' "${RECIPIENT}" "${LENDER_USDC_RAW}" --rpc-url "${ETHEREUM_MAINNET_RPC}" --private-key "${PRIVATE_KEY}"
fi
exit 0
fi
cat <<EOF
This vault does not expose accounting-aware retirement APIs. Default behavior is report-only.
Set ALLOW_STALE_ACCOUNTING_RETIREMENT=1 only when the vault is being permanently retired
and no future proof will rely on its internal accounting.
EOF
if [[ "${ALLOW_STALE_ACCOUNTING_RETIREMENT}" != "1" ]]; then
exit 0
fi
cat <<EOF
Legacy full-token retirement commands:
cast send "${VAULT}" 'withdraw(address,address,uint256)' "${CWUSDC}" "${RECIPIENT}" "${VAULT_CWUSDC_RAW}" --rpc-url "\$ETHEREUM_MAINNET_RPC" --private-key "\$PRIVATE_KEY"
cast send "${VAULT}" 'withdraw(address,address,uint256)' "${USDC}" "${RECIPIENT}" "${VAULT_USDC_RAW}" --rpc-url "\$ETHEREUM_MAINNET_RPC" --private-key "\$PRIVATE_KEY"
EOF
if [[ "${EXECUTE}" == "1" ]]; then
cast send "${VAULT}" 'withdraw(address,address,uint256)' "${CWUSDC}" "${RECIPIENT}" "${VAULT_CWUSDC_RAW}" --rpc-url "${ETHEREUM_MAINNET_RPC}" --private-key "${PRIVATE_KEY}"
cast send "${VAULT}" 'withdraw(address,address,uint256)' "${USDC}" "${RECIPIENT}" "${VAULT_USDC_RAW}" --rpc-url "${ETHEREUM_MAINNET_RPC}" --private-key "${PRIVATE_KEY}"
fi