SOLANA_RPC_URL= # Base58-encoded private key of a dedicated burner wallet. Never your main wallet. SOLANA_PRIVATE_KEY= # Safety: keep true until you have verified behavior. No live swaps are sent while true. DRY_RUN=true # Simulates a paper bankroll for dry-run testing without needing a funded wallet. # 0 (default) uses the real wallet balance as the dry-run cap, same as before. DRY_RUN_PAPER_BALANCE_USD=0 TRADE_CURRENCY=USDC POSITION_SIZE_USD=100 GAS_RESERVE_SOL=0.5 SLIPPAGE_BPS=300 PUMP_WINDOW_MINUTES=15 PUMP_THRESHOLD_PCT=15 # First leg fixed take-profit; second leg rides on a trailing stop (see # TRAILING_STOP_BPS below) instead of a fixed target, so a real runner isn't capped # at the same level as an average trade - tested against real trades and reverted # back to this from the two-fixed-target "369" system, which gave up ~$292 of real # upside overnight by capping every winner at TAKE_PROFIT_PCT_2. Set # ENABLE_369_SYSTEM=true to switch back to two fixed targets instead of trailing. TAKE_PROFIT_PCT=9 STOP_LOSS_PCT=3 ENABLE_369_SYSTEM=false TAKE_PROFIT_PCT_2=9 # Places TP/SL as an on-chain order executed by Jupiter's own infrastructure (faster # than our own polling loop). Falls back to polling automatically on any failure. # Set to false to disable and use polling-only exits (instant kill switch, no redeploy). USE_JUPITER_TRIGGER_ORDERS=true # Pre-buy rug/honeypot filters, checked only for tokens that already triggered the # momentum trigger. Set ENABLE_SAFETY_FILTERS=false to restore old no-filter behavior. ENABLE_SAFETY_FILTERS=true MIN_LIQUIDITY_USD=5000 REQUIRE_MINT_AUTHORITY_REVOKED=true REQUIRE_FREEZE_AUTHORITY_REVOKED=true # RugCheck.xyz free report API: LP-lock and top-holder concentration checks ENABLE_RUGCHECK=true MIN_LP_LOCKED_PCT=50 MAX_TOP_HOLDER_PCT=30 # Stop opening new positions once today's realized P&L drops to/below -this amount. # Set to 0 to disable. Resets automatically at UTC midnight. DAILY_LOSS_LIMIT_USD=50 # Pause new buys after this many consecutive stop-losses, for LOSING_STREAK_COOLDOWN_MINUTES. # Set LOSING_STREAK_COUNT to 0 to disable. LOSING_STREAK_COUNT=3 LOSING_STREAK_COOLDOWN_MINUTES=20 # Skip tokens younger than this, even if already pumping - the highest rug density # is the first couple minutes after launch. MIN_TOKEN_AGE_SECONDS=150 # Require rising volume alongside the price move, not just one whale moving a thin # order book. m5 volume must clear MIN_RECENT_VOLUME_USD and be at least # VOLUME_SURGE_MULTIPLIER x the token's own hourly 5-min average rate. ENABLE_VOLUME_CONFIRMATION=true MIN_RECENT_VOLUME_USD=2000 VOLUME_SURGE_MULTIPLIER=1.5 # When a meme trend spawns copycat launches, only buy the one with the most liquidity. ENABLE_COPYCAT_FILTER=true COPYCAT_SIMILARITY_THRESHOLD=0.82 # Size position bigger for setups that clear the safety filters comfortably, smaller # for ones that barely squeak by (+/-30% of POSITION_SIZE_USD). ENABLE_CONVICTION_SIZING=true # Hard ceiling on $ risked per trade as a % of total account equity (cash + open # exposure), overriding conviction sizing's upper bound. No metadata check reliably # tells a token about to run apart from one about to be dumped into thin liquidity - # this bounds the worst case ($ lost if a position goes to zero) regardless of what # the filters missed. Set to 0 to disable. MAX_POSITION_RISK_PCT=2.0 # How long after opening a position to poll it at FAST_POLL_INTERVAL_SECONDS instead # of the normal ~0.5s cadence. Every rug pull observed in testing hit within minutes # of buying - this narrows the reaction window during the highest-risk period. FAST_POLL_WINDOW_SECONDS=120 FAST_POLL_INTERVAL_SECONDS=0.15 # Sell PARTIAL_EXIT_PCT of the position at fixed take-profit/stop-loss, let the rest # ride with a trailing stop (TRAILING_STOP_BPS, 500 = 5%) instead of exiting the whole # position at the same fixed target every time. Defaults off: checked against 238 real # trades and the trailing leg lost -$184 (over 90% of total losses) while the fixed leg # was roughly breakeven (-$17) - the trailing distance is getting shaken out by normal # price noise more often than it's catching real runners. Re-enable to experiment with # a wider TRAILING_STOP_BPS if you want to test whether that fixes it. ENABLE_PARTIAL_EXIT=false PARTIAL_EXIT_PCT=50 TRAILING_STOP_BPS=500 # How long a position can go with no price data before it's written off as dead # and closed as a full loss. Was 30 minutes of a stop loss having zero chance to # fire since there's no price to check - shortened to stop losing that much time # to a token that's already gone. DEAD_TOKEN_TIMEOUT_SECONDS=300 # Rejects a single price reading implying more than this multiple of a move from entry # (up or down) as an API glitch rather than a real price. Observed live: a feed briefly # returned a 5000x-too-high price, which was accepted as a real take-profit fill and # recorded a fabricated profit. Set to 0 to trust every reading as-is. MAX_PRICE_JUMP_MULTIPLE=50 REBUY_COOLDOWN_MINUTES=30 MAX_POSITION_HOLD_MINUTES=120 MAX_OPEN_POSITIONS=10 SCAN_CONCURRENCY=8 SCAN_RATE_LIMIT_PER_SECOND=5 DB_PATH=positions.db DASHBOARD_PORT=8090 DASHBOARD_HOST=127.0.0.1 # Set to protect the dashboard when exposing it beyond localhost. Open the # dashboard once with ?key= appended to the URL; the browser remembers # it via cookie after that, no login prompt needed again. DASHBOARD_ACCESS_KEY=