All packages

polymarket-pnl

PaulieB14
This is not the latest version — go to v1.2.1
v1.0.1/458 downloads/Repository

Package ref

polymarket-pnl@v1.0.1

Run package

CLI

Run db_out from the command line.

substreams run polymarket-pnl@v1.0.1 db_out -e polygon
Authenticate by running substreams auth or directly on thegraph.market (see docs).

README

Polymarket P&L Substreams

Polymarket P&L

Real-time Profit & Loss tracking for Polymarket prediction markets on Polygon

Substreams Polygon PostgreSQL License


Overview

Comprehensive Substreams package for tracking Polymarket P&L with SQL sink support for persistent state accumulation. Tracks all trading activity from both CTF Exchange and Neg Risk Exchange contracts.

Key Features

FeatureDescription
Real P&L TrackingRealized & unrealized P&L with cost basis
SQL SinkPostgreSQL/Clickhouse for persistent state
Trader AnalyticsVolume, win rate, max drawdown
Market StatsPrice, volume, trade counts per market
Whale DetectionLarge trade tracking with trader context

Quick Start

Stream Data (No Database)

# Install CLI
brew install streamingfast/tap/substreams

# Authenticate
substreams auth

# Stream order fills
substreams run https://spkg.io/PaulieB14/polymarket-pnl-v1.0.0.spkg \
  map_order_fills \
  -e polygon.substreams.pinax.network:443 \
  -s 65000000 -t +1000

# Stream user P&L
substreams run https://spkg.io/PaulieB14/polymarket-pnl-v1.0.0.spkg \
  map_user_pnl \
  -e polygon.substreams.pinax.network:443 \
  -s 65000000 -t +1000

Sink to PostgreSQL (Required for P&L)

Important: P&L requires accumulated state. Use the SQL sink for accurate calculations.

# Install sink
brew install streamingfast/tap/substreams-sink-sql

# Create database
createdb polymarket_pnl

# Setup schema
substreams-sink-sql setup \
  "psql://localhost:5432/polymarket_pnl?sslmode=disable" \
  https://spkg.io/PaulieB14/polymarket-pnl-v1.0.0.spkg

# Run sink (start from beginning for full history)
substreams-sink-sql run \
  "psql://localhost:5432/polymarket_pnl?sslmode=disable" \
  https://spkg.io/PaulieB14/polymarket-pnl-v1.0.0.spkg \
  -e polygon.substreams.pinax.network:443

Query Your Data

-- Top traders by P&L
SELECT * FROM leaderboard_pnl LIMIT 20;

-- Whale trades with trader stats
SELECT * FROM whale_trades;

-- User positions
SELECT * FROM user_positions
WHERE user_address = '0x...' AND quantity > 0;

-- Daily stats
SELECT date, total_volume, total_trades
FROM daily_stats ORDER BY date DESC;

Architecture

                    Polygon Blockchain
                           │
                           ▼
              ┌─────────────────────────┐
              │     Firehose Blocks     │
              └─────────────────────────┘
                           │
         ┌─────────────────┼─────────────────┐
         ▼                 ▼                 ▼
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ map_order_fills │ │map_token_transf │ │map_usdc_transf  │
│  (CTF + NegRisk)│ │    (ERC1155)    │ │    (USDC)       │
└─────────────────┘ └─────────────────┘ └─────────────────┘
         │                 │                   │
         └─────────────────┼───────────────────┘
                           ▼
              ┌─────────────────────────┐
              │    STORES (State)       │
              │  • user_positions       │
              │  • user_cost_basis      │
              │  • user_realized_pnl    │
              │  • latest_prices        │
              └─────────────────────────┘
                           │
                           ▼
              ┌─────────────────────────┐
              │      map_user_pnl       │
              │   (Computed Analytics)  │
              └─────────────────────────┘
                           │
                           ▼
              ┌─────────────────────────┐
              │         db_out          │
              │      (SQL Sink)         │
              └─────────────────────────┘
                           │
                           ▼
              ┌─────────────────────────┐
              │       PostgreSQL        │
              └─────────────────────────┘

Modules

Layer 1: Event Extraction

ModuleDescription
map_order_fillsOrderFilled events from CTF & NegRisk exchanges
map_token_transfersERC1155 TransferSingle events
map_usdc_transfersUSDC transfer events

Layer 2: State Stores

StoreKeyDescription
store_user_positions{user}:{token}Position quantities
store_user_cost_basis{user}:{token}Total cost basis
store_user_realized_pnl{user}Realized P&L
store_user_volume{user}Trading volume
store_user_trade_count{user}Trade count
store_market_volume{token}Market volume
store_latest_prices{token}Latest prices

Layer 3: Analytics

ModuleDescription
map_user_pnlReal-time P&L calculations
map_market_statsMarket-level statistics

Layer 4: Sink

ModuleDescription
db_outDatabase changes for SQL sink

Database Schema

Tables

TableDescription
tradesAll order fills with price, amount, side
user_pnlAggregated P&L per user
user_positionsCurrent positions with cost basis
marketsMarket statistics
daily_statsDaily aggregates

Views

ViewDescription
leaderboard_pnlTop 1000 by P&L
leaderboard_volumeTop 1000 by volume
whale_tradesTrades >$10K

Contract Addresses

ContractAddressStart Block
CTF Exchange0x4bfb41d5b3570defd03c39a9a4d8de6bd8b8982e33,605,403
NegRisk Exchange0xC5d563A36AE78145C45a50134d48A1215220f80a50,505,492
Conditional Tokens0x4D97DCd97eC945f40cF65F87097ACe5EA04760454,023,686
USDC0x2791Bca1f2de4661ED88A30C99A7a9449Aa841744,023,686

Build from Source

# Clone
git clone https://github.com/PaulieB14/Polymarket-P-L-Substreams
cd Polymarket-P-L-Substreams

# Build
substreams build

# Test
substreams run substreams.yaml map_order_fills \
  -e polygon.substreams.pinax.network:443 \
  -s 65000000 -t +100

# Package & publish
substreams pack substreams.yaml -o polymarket-pnl-v1.0.0.spkg
substreams publish polymarket-pnl-v1.0.0.spkg

Why SQL Sink?

P&L calculation requires state accumulation over time:

Without SinkWith SQL Sink
No historyFull history persisted
P&L = $0Accurate P&L
StatelessTracks cost basis
Demo onlyProduction ready

Related


License

MIT

Modules

Execution graph

15 modules
mapMain

db_out

Outputs database changes for SQL sink (PostgreSQL/Clickhouse). Creates/updates tables: trades, user_pnl, user_positions, markets

from #33605403

Output

sf.substreams.sink.database.v1.DatabaseChanges

store

store_market_volume

Tracks total volume per market (token_id). Key: {token_id}

from #33605403

Store value

bigint

Update policy

add

store

store_user_cost_basis

Tracks total cost basis per user per token for average price calculation. Key: {user_address}:{token_id}

from #33605403

Store value

bigint

Update policy

add

store

store_user_positions

Accumulates user positions per token. Tracks quantity held. Key: {user_address}:{token_id}

from #33605403

Store value

bigint

Update policy

add

store

store_user_realized_pnl

Accumulates realized P&L when users sell positions. Key: {user_address}

from #33605403

Store value

bigint

Update policy

add

store

store_user_trade_count

Tracks number of trades per user. Key: {user_address}

from #33605403

Store value

int64

Update policy

add

store

store_user_volume

Tracks total trading volume per user. Key: {user_address}

from #33605403

Store value

bigint

Update policy

add

Show 2 dependencies
map

ethcommon:all_events

`all_events` gives you all the events in a block (from successful transactions), with basic block hash/number/timestamp and transaction hash

Output

sf.substreams.ethereum.v1.Events

blockIndex

ethcommon:index_events

`index_events` sets the following keys on the block: * Event signatures evt_sig:0x0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef (signature in hex, prefixed by 0x) * Event address evt_addr:0x0123456789abcdef0123456789abcdef01234567 (address in hex, prefixed by 0x)

Output

sf.substreams.index.v1.Keys