Files
proxmox/scripts/deployment/chain138-pmm-random-soak-swaps.sh
defiQUG 6fb6bd3993 fix(pmm-soak): shellcheck-clean bots/tick/bootstrap; expand CI ShellCheck
- bootstrap: split mnemonic export (SC2155), PMM_SOAK_RPC_URL_OVERRIDE, noprofile fund-grid, ASCII echoes, help header only
- chain138-tick: document POOLS global for SC2153
- random/grid bots: log line references INTEGRATION, USD bounds, gold, gas, log_tag (SC2034)
- validate-config: ShellCheck all 11 PMM soak + chain138-pmm shell scripts incl. smoke + bootstrap

Made-with: Cursor
2026-04-12 03:43:35 -07:00

154 lines
4.6 KiB
Bash
Executable File

#!/usr/bin/env bash
# Chain 138 — continuous random PMM swaps across funded pools (single deployer wallet).
#
# Each interval (default 6s): pick a random live pool, random direction (base/quote in),
# random notional between USD_MIN and USD_MAX (for USD-pegged stables), then execute swap
# (default CHAIN138_PMM_SOAK_SWAP_VIA=pool: transfer + sellBase/sellQuote; optional integration).
#
# For 33x33x6 grid wallets + operator funding, use chain138-pmm-soak-grid-bot.sh
#
# Safety: default is dry-run (no chain writes). Live swaps require: --apply and PRIVATE_KEY.
#
# Usage:
# bash scripts/deployment/chain138-pmm-random-soak-swaps.sh --dry-run --max-ticks 5
# PMM_SOAK_INTERVAL_SEC=6 bash scripts/deployment/chain138-pmm-random-soak-swaps.sh --apply
#
# Env: (see scripts/lib/pmm-soak-chain138-tick.sh) + PMM_SOAK_MAX_ITER / --max-ticks
# Pools: PMM_SOAK_POOLS | PMM_SOAK_POOLS_FILE | PMM_SOAK_POOL_PRESET (see scripts/lib/pmm-soak-pools.sh)
# CLI: --pool-preset <name> | --swap-via pool|integration
#
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(cd "${SCRIPT_DIR}/../.." && pwd)"
APPLY=0
CLI_MAX_ITER=""
CLI_POOL_PRESET=""
CLI_SWAP_VIA=""
while [[ $# -gt 0 ]]; do
case "$1" in
--apply) APPLY=1 ;;
--dry-run) APPLY=0 ;;
--max-ticks)
CLI_MAX_ITER="$2"
shift
;;
--pool-preset)
CLI_POOL_PRESET="$2"
shift
;;
--swap-via)
CLI_SWAP_VIA="$2"
shift
;;
-h | --help)
echo "chain138-pmm-random-soak-swaps.sh — single-wallet PMM soak (deployer)"
echo ""
echo "Usage: $0 [--dry-run|--apply] [--max-ticks N] [--pool-preset NAME] [--swap-via pool|integration]"
exit 0
;;
*)
echo "[pmm-soak] unknown arg: $1" >&2
exit 2
;;
esac
shift
done
# shellcheck source=/dev/null
source "${PROJECT_ROOT}/scripts/lib/pmm-soak-dotenv-override.sh"
pmm_soak_snapshot_pool_env_for_restore
# shellcheck source=/dev/null
[[ -f "${PROJECT_ROOT}/scripts/lib/load-project-env.sh" ]] && source "${PROJECT_ROOT}/scripts/lib/load-project-env.sh"
pmm_soak_restore_pool_env_after_dotenv
if [[ -n "$CLI_SWAP_VIA" ]]; then
export CHAIN138_PMM_SOAK_SWAP_VIA="$CLI_SWAP_VIA"
fi
if [[ -n "$CLI_POOL_PRESET" ]]; then
export PMM_SOAK_POOL_PRESET="$CLI_POOL_PRESET"
unset PMM_SOAK_POOLS PMM_SOAK_POOLS_FILE 2>/dev/null || true
fi
# shellcheck source=/dev/null
source "${PROJECT_ROOT}/scripts/lib/pmm-soak-chain138-tick.sh"
# shellcheck source=/dev/null
source "${PROJECT_ROOT}/scripts/lib/pmm-soak-pools.sh"
require_cmd() {
command -v "$1" >/dev/null 2>&1 || {
echo "[pmm-soak] missing: $1" >&2
exit 1
}
}
require_cmd cast
require_cmd python3
require_cmd bc
PK="${DEPLOYER_PRIVATE_KEY:-${PRIVATE_KEY:-}}"
RPC="${RPC_URL_138:-http://192.168.11.211:8545}"
INTEGRATION="${DODO_PMM_INTEGRATION_ADDRESS:-${CHAIN_138_DODO_PMM_INTEGRATION:-0x86ADA6Ef91A3B450F89f2b751e93B1b7A3218895}}"
INTERVAL="${PMM_SOAK_INTERVAL_SEC:-6}"
USD_MIN="${PMM_SOAK_USD_MIN:-10}"
USD_MAX="${PMM_SOAK_USD_MAX:-5000}"
SLIP_BPS="${PMM_SOAK_SLIPPAGE_BPS:-100}"
GOLD_USD="${GOLD_USD_PRICE:-3300}"
GAS_WEI="${CHAIN138_DEPLOY_GAS_PRICE_WEI:-1000}"
SOAK_MAX_ITER="${CLI_MAX_ITER:-${PMM_SOAK_MAX_ITER:-}}"
pmm_soak_load_pools || exit 1
PMM_SOAK_LOG_TAG="pmm-soak"
log() { pmm_soak_log "$@"; }
deployer_addr() {
if [[ -z "$PK" ]]; then
echo ""
return
fi
cast wallet address --private-key "$PK" 2>/dev/null || true
}
DEPLOYER="$(deployer_addr)"
if [[ "$APPLY" -eq 1 ]]; then
if [[ -z "$PK" ]]; then
log "FATAL: --apply requires PRIVATE_KEY or DEPLOYER_PRIVATE_KEY"
exit 1
fi
if [[ -z "$DEPLOYER" ]]; then
log "FATAL: could not derive address from private key"
exit 1
fi
else
DEPLOYER="${DEPLOYER_ADDRESS:-0x4A666F96fC8764181194447A7dFdb7d471b301C8}"
log "Dry-run mode (no txs). Use --apply for live swaps."
fi
LOCK="/tmp/chain138-pmm-random-soak.${USER}.lock"
if [[ "$APPLY" -eq 1 ]]; then
if ! mkdir "$LOCK" 2>/dev/null; then
log "FATAL: lock exists $LOCK — another soak bot may be running"
exit 1
fi
trap 'rmdir "$LOCK" 2>/dev/null || true' EXIT
fi
SWAP_VIA_LOG="${CHAIN138_PMM_SOAK_SWAP_VIA:-pool}"
log "RPC=$RPC integration=$INTEGRATION swap_via=$SWAP_VIA_LOG interval=${INTERVAL}s deployer=$DEPLOYER pools=${#POOLS[@]} USD=${USD_MIN}-${USD_MAX} slip_bps=$SLIP_BPS gold_usd=$GOLD_USD gas_wei=$GAS_WEI log_tag=$PMM_SOAK_LOG_TAG apply=$APPLY"
tick=0
while true; do
tick=$((tick + 1))
pmm_soak_chain138_run_tick_iteration "$tick" "$DEPLOYER" "$PK" "$APPLY"
if [[ -n "$SOAK_MAX_ITER" && "$tick" -ge "$SOAK_MAX_ITER" ]]; then
log "SOAK_MAX_ITER=$SOAK_MAX_ITER done"
break
fi
sleep "$INTERVAL"
done