# ───────────────────────────────────────────── # WALLET SETUP # ───────────────────────────────────────────── # EOA private key — used for SIGNING only, does NOT hold USDC PRIVATE_KEY=0xYOUR_EOA_PRIVATE_KEY_HERE # Polymarket Proxy Wallet — the address shown when you click "Deposit" on Polymarket # This is where you deposit USDC.e, and where trades are funded from # How to find: Login to polymarket.com → Profile → Deposit → copy the address PROXY_WALLET_ADDRESS=0xYOUR_PROXY_WALLET_ADDRESS_HERE # ───────────────────────────────────────────── # POLYGON RPC # ───────────────────────────────────────────── POLYGON_RPC_URL=https://polygon.lava.build # ───────────────────────────────────────────── # POLYMARKET API CREDENTIALS (optional) # Leave blank to auto-derive from your private key # ───────────────────────────────────────────── CLOB_API_KEY= CLOB_API_SECRET= CLOB_API_PASSPHRASE= # ───────────────────────────────────────────── # TRADER TO COPY # Use the proxy wallet address of the trader (visible on their Polymarket profile) # ───────────────────────────────────────────── TRADER_ADDRESS=0xTRADER_PROXY_WALLET_ADDRESS # ───────────────────────────────────────────── # TRADE SIZING # ───────────────────────────────────────────── # SIZE_MODE: # "percentage" = SIZE_PERCENT% of MAX_POSITION_SIZE per market entry # (e.g. MAX_POSITION_SIZE=$10, SIZE_PERCENT=50 → buy $5 per entry) # "balance" = SIZE_PERCENT% of your current USDC.e balance per entry # (e.g. balance=$100, SIZE_PERCENT=10 → buy $10 per entry) # Note: sizing is independent of the trader's individual fill size. # Limit orders can fill in many small chunks — we always use our own sizing. SIZE_MODE=balance SIZE_PERCENT=10 # Minimum trade size in USDC (skip if calculated size is below this) MIN_TRADE_SIZE=1 # Maximum total position per market in USDC (won't buy more once this is reached) MAX_POSITION_SIZE=10 # ───────────────────────────────────────────── # AUTO SELL # ───────────────────────────────────────────── AUTO_SELL_ENABLED=true AUTO_SELL_PROFIT_PERCENT=10 # Sell mode when copying trader's sell # "market" = sell at market price immediately # "limit" = place limit order at trader's sell price SELL_MODE=market # ───────────────────────────────────────────── # INTERVALS # ───────────────────────────────────────────── # How often (seconds) to check for resolved markets to redeem REDEEM_INTERVAL=60 # Skip BUY if the market closes within this many seconds from now # Default 300 = skip if market ends in less than 5 minutes MIN_MARKET_TIME_LEFT=300 # When FAK finds no liquidity (e.g. copying into "next market" before it opens), # fall back to a GTC limit order and wait this many seconds for it to fill. # Set to 0 to disable the GTC fallback entirely. GTC_FALLBACK_TIMEOUT=60 # ───────────────────────────────────────────── # DRY RUN (set true to simulate without real trades) # ───────────────────────────────────────────── DRY_RUN=true # ───────────────────────────────────────────── # MARKET MAKER (mm.js / npm run mm-sim) # ───────────────────────────────────────────── # Comma-separated assets to market-make (same slug format as sniper) MM_ASSETS=btc # Market duration: "5m" (5-minute) or "15m" (15-minute) MM_DURATION=5m # USDC amount per side (total exposure = 2x this) MM_TRADE_SIZE=5 # Limit sell price target (e.g. 0.60 = sell at $0.60) MM_SELL_PRICE=0.60 # Seconds before market close to trigger cut-loss MM_CUT_LOSS_TIME=60 # Keyword to match market question (case-insensitive) MM_MARKET_KEYWORD=Bitcoin Up or Down # Max seconds after market open to enter (0 = at open only) MM_ENTRY_WINDOW=45 # How often to poll for new markets (seconds) MM_POLL_INTERVAL=10 # ── Recovery Buy (after cut-loss) ─────────────────────────── # After cut-loss triggers, monitor prices for 10s and market-buy # the dominant side if criteria are met. Does not affect the main # MM flow — purely an opt-in add-on. # # Enable recovery buy MM_RECOVERY_BUY=false # Minimum price the dominant side must be at (and rising/stable) to qualify MM_RECOVERY_THRESHOLD=0.70 # USDC size for the recovery buy (0 = use MM_TRADE_SIZE) MM_RECOVERY_SIZE=0 # Enable adaptive CL when one leg fills (true = patient limit orders, false = immediate market sell) MM_ADAPTIVE_CL=true # Minimum combined sell price (both legs) required to place a limit order. # Formula: filledLegPrice + unfilledLegPrice >= MM_ADAPTIVE_MIN_COMBINED # Example: filledLeg=0.60, MM_ADAPTIVE_MIN_COMBINED=1.20 → floor=0.60 (won't limit-sell below $0.60) # filledLeg=0.55, MM_ADAPTIVE_MIN_COMBINED=1.20 → floor=0.65 # If price is below floor, bot waits for recovery. Market-sell only at CL time as last resort. MM_ADAPTIVE_MIN_COMBINED=1.20 # Poll interval (seconds) for the adaptive CL loop after one leg fills. # Smaller = more responsive to price changes, more API calls. MM_ADAPTIVE_MONITOR_SEC=5 # ───────────────────────────────────────────── # ORDERBOOK SNIPER (sniper.js / npm run sniper-sim) # 3-Tier Strategy: Places GTC BUY orders at 3 prices with weighted sizing # Tier 1 (3c): smallest size | Tier 2 (2c): medium | Tier 3 (1c): largest # Catches panic dumps at multiple price levels with optimal capital allocation # ───────────────────────────────────────────── # Comma-separated assets to snipe SNIPER_ASSETS=eth,sol,xrp # 3-Tier pricing (high to low) SNIPER_TIER1_PRICE=0.03 # Highest price, smallest allocation (20%) SNIPER_TIER2_PRICE=0.02 # Mid price, medium allocation (30%) SNIPER_TIER3_PRICE=0.01 # Lowest price, largest allocation (50%) # Max total shares per side (min 5 shares per tier) # Example: 15 shares → 3@3c + 5@2c + 7@1c # Example: 30 shares → 6@3c + 9@2c + 15@1c SNIPER_MAX_SHARES=15 # ── Sniper Sizing Multiplier (UTC+8) ─────────────────────── # Time-based bet sizing multiplier. Format: HH:MM-HH:MM:factor,... # Multiplies SNIPER_MAX_SHARES during the specified time windows. # Default = 1.0x outside any window. # Example: US afternoon bump + Asia morning discount SNIPER_MULTIPLIERS=21:00-00:00:1.41,06:00-12:00:0.85 # ── Sniper Pause After Win ───────────────────────────────── # Number of 5-min rounds to pause an asset after a win is detected. # Set to 0 to disable. SNIPER_PAUSE_ROUNDS_AFTER_WIN=3 # ── Sniper Session Schedule (all times UTC+8) ────────────── # Format: HH:MM-HH:MM,HH:MM-HH:MM (comma-separated sessions) # Assets without a schedule entry are always active. SNIPER_SCHEDULE_BTC=19:40-22:40,03:40-06:10 SNIPER_SCHEDULE_ETH=11:40-15:40,16:40-19:40 SNIPER_SCHEDULE_SOL=09:40-12:40,21:40-23:40 SNIPER_SCHEDULE_XRP=18:40-20:40,08:40-09:50 # ───────────────────────────────────────────── # PROXY (Polymarket API only, NOT Polygon RPC) # Supports HTTP/HTTPS/SOCKS5 proxies # Leave empty to connect directly (no proxy) # Example: http://user:pass@proxy.example.com:8080 # ───────────────────────────────────────────── PROXY_URL=