- 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
154 lines
4.6 KiB
Bash
Executable File
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
|