# Architecture
This document describes the architecture for the polymarket-hft trading system.
## Status Legend
| β
IMPLEMENTED | Production-ready, available in current release |
| π§ IN PROGRESS | Under active development |
| π PLANNED | Designed but not yet implemented |
## System Overview
```text
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Client Layer (SDK) β
IMPLEMENTED β
β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Polymarket API Clients β β
β β βββββββββββββ βββββββββββββ βββββββββββββ βββββββββββββ β β
β β β Data β β CLOB β β Gamma β β RTDS β β β
β β β (REST) β β(REST + WS)β β (REST) β β (WS) β β β
β β βββββββββββββ βββββββββββββ βββββββββββββ βββββββββββββ β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β CoinMarketCap API Client β β
β β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β CMC Client (REST) - Listings, Global Metrics, Fear&Greed β β β
β β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β
β ββββββββββββββββΌβββββββββββββββ β
β β Shared HTTP Client β β
β β (retry, timeout, pooling) β β
β βββββββββββββββββββββββββββββββ β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Ingestors π PLANNED β
β β
β βββββββββββββββ βββββββββββββββ βββββββββββββββ β
β β WS Actor β βPoller Actor β β Cron Actor β β
β β (RTDS/CLOB) β β (REST APIs) β β (Daily) β β
β ββββββββ¬βββββββ ββββββββ¬βββββββ ββββββββ¬βββββββ β
β ββββββββββββββββββΌβββββββββββββββββ β
β β MarketEvent β
β βΌ β
β βββββββββββββββββββββββββββ β
β β Dispatcher β β
β β - Message routing β β
β β - Backpressure control β β
β ββββββββββββββ¬βββββββββββββ β
βββββββββββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
βββββββββββββββββββΌββββββββββββββββββ
βΌ βΌ βΌ
βββββββββββββββ βββββββββββββββ βββββββββββββββ
β Archiver β β State β β Policy β
β π PLANNED β β Manager β β Engine β
β β β π PLANNED β β π PLANNED β
ββββββββ¬βββββββ ββββββββ¬βββββββ ββββββββ¬βββββββ
βΌ βΌ βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Storage Layer π PLANNED β
β β
β ββββββββββββββββββββββββββ ββββββββββββββββββββββββββ β
β β TimescaleDB β β Redis β β
β β (Cold/Warm Data) β β (Hot Data, TTL:15min) β β
β ββββββββββββββββββββββββββ ββββββββββββββββββββββββββ β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Action Executor π PLANNED β
β β
β βββββββββββββββββββββ βββββββββββββββββββββ βββββββββββββββββββββ β
β β Order Executor β β Notification β β Audit Logger β β
β βββββββββββββββββββββ βββββββββββββββββββββ βββββββββββββββββββββ β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
```
## Components
### Client Layer β
IMPLEMENTED
Multi-source client architecture under `src/client/`. Currently implements Polymarket and CoinMarketCap APIs with extensibility for future data sources. See [Client Guide](./client.md) for usage details.
#### Polymarket Clients
| Data | REST | User positions, trades, portfolio value |
| CLOB | REST + WS | Order management, EIP-712 signing, real-time updates |
| Gamma | REST | Market metadata, events, search |
| RTDS | WebSocket | Real-time prices, trades, orderbook streams |
#### CoinMarketCap Client
| CMC | REST | Cryptocurrency listings, global metrics, fear & greed index |
**Shared Infrastructure**:
- HTTP client with exponential backoff retry (3 attempts)
- WebSocket auto-reconnect with subscription recovery
- Connection pooling (10 idle connections per host)
### Ingestors π PLANNED
Data collection actors that emit `MarketEvent` messages.
| WS Actor | RTDS/CLOB WebSocket | Real-time price, orderbook, trade streams |
| Poller Actor | REST APIs | Market metadata, positions, balances |
| Cron Actor | Scheduled tasks | Daily snapshots, cleanup, aggregations |
### Dispatcher π PLANNED
Central message hub routing `MarketEvent` to multiple consumers.
**Design Choice**: Dispatcher pattern over `tokio::sync::broadcast`:
- Independent `mpsc` channel per consumer
- Slow consumers don't block others
- Per-consumer message filtering and backpressure
### Processors π PLANNED
#### Archiver
Buffers events and batch-writes to TimescaleDB (100 events or 1 second threshold).
#### State Manager
Maintains real-time state using local cache + Redis Pub/Sub to eliminate round-trip latency.
#### Policy Engine
User-defined policies via YAML/JSON configuration. See [Policy Engine Guide](./policy.md) for details.
**Key Features:**
- **Declarative DSL** β Define conditions and actions without code
- **Composite Conditions** β AND/OR logic with time-window support
- **Multiple Actions** β Notifications, orders, webhooks
- **Rate Limiting** β Built-in cooldown per policy
```yaml
# Example: Price alert policy
policies:
- id: btc_low_alert
conditions:
field: price
asset: "BTC"
operator: crosses_below
value: 80000
actions:
- type: notification
channel: telegram
template: "BTC below $80K!"
```
### Action Executor π PLANNED
| Executor | Responsibility |
| -------------- | ----------------------------------------- |
| Order Executor | Submit/cancel orders via CLOB Trading API |
| Notification | Send alerts via Telegram |
| Audit Logger | Record all actions to TimescaleDB |
## Data Layer π PLANNED
### Hot Data (Redis)
| Key Pattern | Description |
| -------------------------------------- | ----------------------------- |
| `polymarket:price:{asset_id}` | Current price, bid, ask |
| `polymarket:orderbook:{market}` | Price levels with sizes |
| `polymarket:position:{wallet}:{asset}` | Position size, avg price, PnL |
### Cold Data (TimescaleDB)
```sql
-- Price time-series with continuous aggregation
CREATE TABLE prices (
time TIMESTAMPTZ NOT NULL, asset_id TEXT NOT NULL,
price NUMERIC(20,8), bid NUMERIC(20,8), ask NUMERIC(20,8)
);
SELECT create_hypertable('prices', 'time');
-- Hourly OHLCV aggregation
CREATE MATERIALIZED VIEW prices_1h WITH (timescaledb.continuous) AS
SELECT time_bucket('1 hour', time) AS bucket, asset_id,
first(price, time) AS open, max(price) AS high,
min(price) AS low, last(price, time) AS close
FROM prices GROUP BY bucket, asset_id;
```
## Event Types π PLANNED
```rust
pub enum MarketEvent {
PriceUpdate { asset_id: String, price: Decimal, bid: Option<Decimal>, ask: Option<Decimal>, timestamp: u64 },
OrderBookSnapshot { market: String, bids: Vec<PriceLevel>, asks: Vec<PriceLevel>, timestamp: u64 },
Trade { market: String, side: Side, price: Decimal, size: Decimal, timestamp: u64 },
PositionUpdate { wallet: String, asset_id: String, size: Decimal, avg_price: Decimal },
}
```
## Directory Structure
```text
src/
βββ client/ # API clients
β βββ polymarket/ # β
Polymarket APIs (Data, CLOB, Gamma, RTDS)
β βββ coinmarketcap/ # β
CoinMarketCap APIs (Listings, Metrics, F&G)
β βββ http.rs # β
Shared HTTP client with retry
β βββ {other}/ # π Future data sources
βββ engine/ # π HFT engine
β βββ events.rs # MarketEvent definitions
β βββ dispatcher.rs # Message dispatcher
β βββ ingestors/ # WS, Poller, Cron actors
β βββ state.rs # State Manager
β βββ archiver.rs # TimescaleDB batch writer
β βββ policy/ # Policy engine (user-defined rules)
β βββ executor.rs # Action executor
βββ storage/ # π Redis + TimescaleDB clients
βββ cli/ # β
CLI commands
```
## Design Decisions
| Message Bus | Dispatcher (mpsc per consumer) | Avoid slow consumer blocking |
| Policy Definition | YAML/JSON DSL | User-defined without recompilation |
| State Sync | Local cache + Pub/Sub | Eliminate Redis round-trip per tick |
| Data TTL | Redis 15 minutes | Support technical indicators |
| Batch Write | 100 events / 1 second | Balance throughput vs latency |
## Implementation Phases
| 1. Core Infrastructure | events, dispatcher, ws ingestor | π Next |
| 2. Data Persistence | redis, timescale, archiver | π |
| 3. Policy Engine | state, policy DSL, evaluator | π |
| 4. Execution Layer | executor, notifications | π |
| 5. Operations | Metrics, tracing, health checks | π |