# Telegram Bot TELEGRAM_BOT_TOKEN=your_bot_token_here TELEGRAM_CHAT_ID=your_chat_id_here # Optional multi-chat target (comma-separated). If set, it will be merged with TELEGRAM_CHAT_ID. # Example: TELEGRAM_CHAT_IDS=-1003586303099,-1003539418691 TELEGRAM_CHAT_IDS= # Optional: route /city and /deb outputs to a fixed forum topic. # If TELEGRAM_QUERY_TOPIC_CHAT_ID is empty, fallback to command source chat. TELEGRAM_QUERY_TOPIC_CHAT_ID= TELEGRAM_QUERY_TOPIC_ID= # Optional per-group topic routing (higher priority than fixed topic above): # format: chat_id:topic_id,chat_id:topic_id # Example: TELEGRAM_QUERY_TOPIC_MAP=-1003586303099:25513,-1003539418691:25514 TELEGRAM_QUERY_TOPIC_MAP= TELEGRAM_ALERT_PUSH_ENABLED=true TELEGRAM_ALERT_PUSH_INTERVAL_SEC=300 TELEGRAM_ALERT_PUSH_COOLDOWN_SEC=1800 TELEGRAM_ALERT_MIN_TRIGGER_COUNT=2 TELEGRAM_ALERT_MIN_SEVERITY=medium # Mispricing radar: skip push when YES buy price is above this cap (10c = 0.10) TELEGRAM_ALERT_MISPRICING_MAX_YES_BUY=0.10 TELEGRAM_ALERT_CITIES=ankara,london,paris,seoul,hong kong,shanghai,singapore,tokyo,tel aviv,toronto,buenos aires,wellington,new york,chicago,dallas,miami,atlanta,seattle,lucknow,sao paulo,munich # AI GROQ_API_KEY=your_groq_api_key_here # Open-Meteo (forecast data changes ~hourly, no need to refresh more often) OPEN_METEO_CACHE_TTL_SEC=7200 OPEN_METEO_ENSEMBLE_CACHE_TTL_SEC=7200 OPEN_METEO_MULTI_MODEL_CACHE_TTL_SEC=7200 # Proxy Setting (optional) HTTPS_PROXY=http://127.0.0.1:7890 HTTP_PROXY=http://127.0.0.1:7890 # Other Settings LOG_LEVEL=INFO ENV=production POLYWEATHER_MAP_URL=https://polyweather-pro.vercel.app/ # Runtime data directory (host path mounted into container at /var/lib/polyweather and /app/data) POLYWEATHER_RUNTIME_DATA_DIR=/var/lib/polyweather # Recommended: keep SQLite outside repository workspace POLYWEATHER_DB_PATH=/var/lib/polyweather/polyweather.db # Recommended disk cache/state paths (optional; defaults are still /app/data/*) OPEN_METEO_DISK_CACHE_PATH=/var/lib/polyweather/open_meteo_cache.json # Unified Auth (Supabase + Google/Email) POLYWEATHER_AUTH_ENABLED=false # If true: website APIs require login; if false: guest access, login optional. POLYWEATHER_AUTH_REQUIRED=false # If true, authenticated users must also have an active row in `subscriptions`. POLYWEATHER_AUTH_REQUIRE_SUBSCRIPTION=false SUPABASE_URL= SUPABASE_ANON_KEY= SUPABASE_SERVICE_ROLE_KEY= SUPABASE_HTTP_TIMEOUT_SEC=8 SUPABASE_AUTH_CACHE_TTL_SEC=30 SUPABASE_SUB_CACHE_TTL_SEC=60 # Frontend wallet connection (WalletConnect v2) # Apply in Vercel env as NEXT_PUBLIC_* NEXT_PUBLIC_WALLETCONNECT_PROJECT_ID= NEXT_PUBLIC_WALLETCONNECT_POLYGON_RPC_URL=https://polygon-bor-rpc.publicnode.com # Bot command access guard (/city, /deb): # - Pro entitlement removed # - user only needs to be a member of any configured group (TELEGRAM_CHAT_IDS / TELEGRAM_CHAT_ID) POLYWEATHER_BOT_GROUP_INVITE_URL= # Group message points (anti-spam + ranking) POLYWEATHER_BOT_MESSAGE_POINTS=4 POLYWEATHER_BOT_MESSAGE_DAILY_CAP=40 POLYWEATHER_BOT_MESSAGE_MIN_LENGTH=3 POLYWEATHER_BOT_MESSAGE_COOLDOWN_SEC=30 POLYWEATHER_BOT_CITY_QUERY_COST=1 POLYWEATHER_BOT_DEB_QUERY_COST=1 # Weekly leaderboard reward settlement # settle_weekday: 1=Mon ... 7=Sun POLYWEATHER_WEEKLY_REWARD_ENABLED=true POLYWEATHER_WEEKLY_REWARD_TIMEZONE=Asia/Shanghai POLYWEATHER_WEEKLY_REWARD_SETTLE_WEEKDAY=1 POLYWEATHER_WEEKLY_REWARD_SETTLE_HOUR=0 POLYWEATHER_WEEKLY_REWARD_SETTLE_MINUTE=5 POLYWEATHER_WEEKLY_REWARD_CHECK_INTERVAL_SEC=300 POLYWEATHER_WEEKLY_REWARD_HTTP_TIMEOUT_SEC=10 POLYWEATHER_WEEKLY_REWARD_ANNOUNCE_ENABLED=true # Backend entitlement guard (for /api/cities, /api/city/*, /api/history/*) POLYWEATHER_REQUIRE_ENTITLEMENT=false POLYWEATHER_BACKEND_ENTITLEMENT_TOKEN= # P1 Contract Checkout (MetaMask + Polygon USDC) POLYWEATHER_PAYMENT_ENABLED=false POLYWEATHER_PAYMENT_CHAIN_ID=137 POLYWEATHER_PAYMENT_RPC_URL=https://polygon-rpc.com # Legacy single-token fallback (still supported) POLYWEATHER_PAYMENT_RECEIVER_CONTRACT= POLYWEATHER_PAYMENT_TOKEN_ADDRESS=0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174 POLYWEATHER_PAYMENT_TOKEN_DECIMALS=6 # Recommended multi-token config (supports USDC.e + Native USDC at the same time) # Example: # [ # {"code":"usdc_e","symbol":"USDC.e","name":"USDC.e (PoS)","address":"0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174","decimals":6,"receiver_contract":"0xYourCheckoutContract","is_default":true}, # {"code":"usdc","symbol":"USDC","name":"Native USDC","address":"0x3c499c542cef5e3811e1192ce70d8cc03d5c3359","decimals":6,"receiver_contract":"0xYourCheckoutContract"} # ] POLYWEATHER_PAYMENT_ACCEPTED_TOKENS_JSON= POLYWEATHER_PAYMENT_CONFIRMATIONS=2 POLYWEATHER_PAYMENT_INTENT_TTL_SEC=1800 POLYWEATHER_PAYMENT_WALLET_CHALLENGE_TTL_SEC=600 POLYWEATHER_PAYMENT_HTTP_TIMEOUT_SEC=10 POLYWEATHER_PAYMENT_POLL_INTERVAL_SEC=4 POLYWEATHER_PAYMENT_MAX_WAIT_SEC=50 POLYWEATHER_PAYMENT_TELEGRAM_NOTIFY_ENABLED=true # Payment points redemption POLYWEATHER_PAYMENT_POINTS_ENABLED=true POLYWEATHER_PAYMENT_POINTS_PER_USDC=500 POLYWEATHER_PAYMENT_POINTS_MAX_DISCOUNT_USDC=3 # Comma-separated allowed plans for checkout UI + backend validation. # Default is monthly-only launch. POLYWEATHER_PAYMENT_ALLOWED_PLAN_CODES=pro_monthly # JSON object # Example: {"pro_monthly":{"plan_id":101,"amount_usdc":"5","duration_days":30}} POLYWEATHER_PAYMENT_PLAN_CATALOG_JSON= # Polymarket P0 Read-Only Market Layer POLYMARKET_MARKET_SCAN_ENABLED=true POLYMARKET_GAMMA_URL=https://gamma-api.polymarket.com POLYMARKET_CLOB_URL=https://clob.polymarket.com POLYMARKET_CHAIN_ID=137 POLYMARKET_HTTP_TIMEOUT_SEC=8 POLYMARKET_MARKET_CACHE_TTL_SEC=180 POLYMARKET_PRICE_CACHE_TTL_SEC=10 POLYMARKET_DISCOVERY_PAGES=6 POLYMARKET_DISCOVERY_LIMIT=200 POLYMARKET_SIGNAL_MIN_LIQUIDITY=500 POLYMARKET_SIGNAL_EDGE_PCT=2 # Polygon Wallet Watcher (Single Chain P0) POLYGON_WALLET_WATCH_ENABLED=false POLYGON_RPC_URL=https://polygon-rpc.com POLYGON_WALLET_WATCH_ADDRESSES=0x0000000000000000000000000000000000000000 POLYGON_WALLET_WATCH_INTERVAL_SEC=8 POLYGON_WALLET_WATCH_CONFIRMATIONS=2 POLYGON_WALLET_WATCH_MAX_BLOCKS_PER_CYCLE=30 POLYGON_WALLET_WATCH_SEEN_TTL_SEC=604800 POLYGON_WALLET_WATCH_RPC_TIMEOUT_SEC=10 POLYGON_WALLET_WATCH_TX_BASE=https://polygonscan.com/tx POLYGON_WALLET_WATCH_ADDR_BASE=https://polygonscan.com/address POLYGON_WALLET_WATCH_POLYMARKET_ONLY=true POLYGON_WALLET_WATCH_INCLUDE_DEFAULT_PM_CONTRACTS=true # Optional custom Polymarket contracts, format: LABEL:0x...,LABEL2:0x... POLYGON_WALLET_WATCH_POLYMARKET_CONTRACTS= # Polymarket Wallet Activity Watcher (all markets, not weather-only) POLYMARKET_WALLET_ACTIVITY_ENABLED=false POLYMARKET_WALLET_ACTIVITY_USERS=0x0000000000000000000000000000000000000000 # Optional dedicated chat targets for wallet activity push (recommended) # If unset, fallback to TELEGRAM_CHAT_IDS / TELEGRAM_CHAT_ID. POLYMARKET_WALLET_ACTIVITY_CHAT_ID= POLYMARKET_WALLET_ACTIVITY_CHAT_IDS= # Optional: mirror wallet activity push to a forum topic, while keeping existing chat targets unchanged. POLYMARKET_WALLET_ACTIVITY_TOPIC_CHAT_ID= POLYMARKET_WALLET_ACTIVITY_TOPIC_ID= # Optional wallet nicknames: # - CSV: 0xabc...=Whale_A,0xdef...=Main_Account # - JSON: {"0xabc...":"Whale A","0xdef...":"Main Account"} # - Env key: POLYMARKET_WALLET_ACTIVITY_USER_ALIASES # (legacy typo POLYMARKET_WALLET_ACTIVITY_USERS_ALIASES is also accepted) POLYMARKET_WALLET_ACTIVITY_USER_ALIASES= POLYMARKET_WALLET_ACTIVITY_DATA_API_URL=https://data-api.polymarket.com POLYMARKET_WALLET_ACTIVITY_INTERVAL_SEC=20 POLYMARKET_WALLET_ACTIVITY_TIMEOUT_SEC=10 POLYMARKET_WALLET_ACTIVITY_MIN_SIZE_ABS=0.001 POLYMARKET_WALLET_ACTIVITY_MIN_SIZE_DELTA=0.001 POLYMARKET_WALLET_ACTIVITY_MIN_AVG_PRICE_DELTA=0.002 POLYMARKET_WALLET_ACTIVITY_IMMEDIATE_ON_SIZE_DELTA=true POLYMARKET_WALLET_ACTIVITY_IMMEDIATE_SIZE_DELTA_MIN=0.001 POLYMARKET_WALLET_ACTIVITY_IMMEDIATE_COOLDOWN_SEC=20 POLYMARKET_WALLET_ACTIVITY_MAX_CHANGES_PER_MSG=5 POLYMARKET_WALLET_ACTIVITY_NOTIFY_CLOSED=false POLYMARKET_WALLET_ACTIVITY_BOOTSTRAP_ALERT=false POLYMARKET_WALLET_ACTIVITY_LINK_PREVIEW=true POLYMARKET_WALLET_ACTIVITY_UPDATE_DEBOUNCE_SEC=30 POLYMARKET_WALLET_ACTIVITY_UPDATE_MAX_HOLD_SEC=120 POLYMARKET_WALLET_ACTIVITY_AVG_PRICE_SHOW_MIN=0.01 POLYMARKET_WALLET_ACTIVITY_AVG_PRICE_SHOW_MAX=0.99 # Skip wallet activity pushes when position value is below this floor (USD). # Set 0 to disable. POLYMARKET_WALLET_ACTIVITY_MIN_POSITION_VALUE_USD=0 # Comma-separated wallet addresses exempt from min value floor. # Example: 0x849d9a4dd64829b8b0141ea53e7caca7e99529ec POLYMARKET_WALLET_ACTIVITY_MIN_VALUE_EXEMPT_USERS=