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
125 lines
5.3 KiB
Bash
Executable File
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
|