Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 3 additions & 36 deletions polymarket_copier/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@

import argparse
import asyncio
import logging
import signal
import sys
import time
Expand All @@ -21,7 +20,7 @@
from polymarket_copier.core.portfolio import PortfolioManager
from polymarket_copier.core.risk_manager import RiskConfig, RiskManager
from polymarket_copier.core.tracker import TrackerClient, TrackerConfig
from polymarket_copier.utils.logger import log_event, setup_logger
from polymarket_copier.utils.logger import setup_logger

POLYMARKET_GEOBLOCK_URL = "https://polymarket.com/api/geoblock"

Expand Down Expand Up @@ -88,43 +87,13 @@ async def _enforce_live_geoblock_preflight(config, session: aiohttp.ClientSessio
logger.info("Polymarket geoblock preflight passed for %s%s", country, f"-{region}" if region else "")


def _log_live_mode_readiness_warning(config, logger) -> None:
"""Emit a structured startup warning for the current live-mode auth path."""
if config.mode != "live":
return

creds = [config.api_key, config.api_secret, config.api_passphrase]
if all(creds):
api_credentials = "provided"
elif any(creds):
api_credentials = "partial"
else:
api_credentials = "derived"

log_event(
logger,
"live_mode_readiness_warning",
level=logging.WARNING,
msg=(
"Live mode is still experimental: this repo uses py-clob-client while current "
"official docs center py-clob-client-v2 and deposit-wallet signature_type=3 for "
"new API users; startup success is not legal or profitability clearance"
),
client_sdk="py-clob-client",
docs_sdk="py-clob-client-v2",
docs_recommend_signature_type=3,
signature_type=config.signature_type,
funder_configured=bool(config.funder),
api_credentials=api_credentials,
forward_paper_gate_enabled=config.forward_paper_gate_enabled,
)


async def run_bot(config_path: Optional[str] = None, mode: Optional[Literal["paper", "live"]] = None) -> None:
config = load_config(config_path=config_path)
if mode:
config.mode = mode
validate_live_config(config)
if config.mode == "live":
raise ConfigError("Live mode is disabled: this build uses unsupported Polymarket CLOB V1 orders")

logger = setup_logger(level=config.logging.level, log_file=config.logging.file)

Expand Down Expand Up @@ -184,8 +153,6 @@ async def run_bot(config_path: Optional[str] = None, mode: Optional[Literal["pap
await portfolio.close()
await shared_session.close()
raise
_log_live_mode_readiness_warning(config, logger)

startup_positions = await portfolio.get_open_positions()

gamma_client = GammaClient(session=shared_session)
Expand Down
41 changes: 5 additions & 36 deletions tests/test_main.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

from __future__ import annotations

import logging
from types import SimpleNamespace

import pytest
Expand All @@ -14,7 +13,6 @@
POLYMARKET_GEOBLOCK_URL,
_enforce_live_geoblock_preflight,
_install_shutdown_handlers,
_log_live_mode_readiness_warning,
enforce_forward_paper_gate,
run_bot,
)
Expand Down Expand Up @@ -132,41 +130,12 @@ def _fake_signal(sig, handler): # noqa: ARG002
assert registered


def test_live_mode_readiness_warning_is_structured():
calls: list[tuple[int, str, dict]] = []

class _Logger:
def log(self, level, msg, *, extra=None):
calls.append((level, msg, extra or {}))

cfg = AppConfig(
mode="live",
signature_type=3,
funder="0xfunder",
forward_paper_gate_enabled=True,
)
_log_live_mode_readiness_warning(cfg, _Logger())

assert len(calls) == 1
level, msg, extra = calls[0]
assert level == logging.WARNING
assert "py-clob-client-v2" in msg
assert extra["data"]["event"] == "live_mode_readiness_warning"
assert extra["data"]["signature_type"] == 3
assert extra["data"]["funder_configured"] is True
assert extra["data"]["api_credentials"] == "derived"


def test_live_mode_readiness_warning_skips_paper_mode():
calls: list[tuple[int, str, dict]] = []

class _Logger:
def log(self, level, msg, *, extra=None):
calls.append((level, msg, extra or {}))

_log_live_mode_readiness_warning(AppConfig(mode="paper"), _Logger())
@pytest.mark.asyncio
async def test_live_mode_refuses_unsupported_clob_v1(monkeypatch):
monkeypatch.setattr("polymarket_copier.main.load_config", lambda **_: AppConfig(mode="live"))

assert calls == []
with pytest.raises(ConfigError, match="unsupported Polymarket CLOB V1"):
await run_bot()


class TestForwardPaperGate:
Expand Down
Loading