Skip to main content

VoteMarket Toolkit

Python SDK for VoteMarket - campaign management, proofs, and analytics.

PyPI version Python License: AGPL-3.0

Installation

pip install votemarket-toolkit

Development Prerequisites

For development, this project uses uv for fast, reliable dependency management.

Install uv:

# macOS/Linux
curl -LsSf https://astral.sh/uv/install.sh | sh

# Windows
powershell -c "irm https://astral.sh/uv/install.ps1 | iex"

# Alternative: via pip
pip install uv

Alternative: Traditional pip/venv workflow

If you prefer not to use uv, you can use standard Python tools:

# Create virtual environment
python -m venv .venv

# Activate virtual environment
source .venv/bin/activate  # macOS/Linux
# OR
.venv\Scripts\activate  # Windows

# Install package in editable mode
pip install -e ".[dev]"

# Run commands directly
python -m votemarket_toolkit.cli --help

Quick Start

from votemarket_toolkit.campaigns.service import CampaignService
from votemarket_toolkit.shared import registry

# Get platform address
curve_platform = registry.get_platform("curve", chain_id=42161)

# Fetch campaigns
service = CampaignService()
campaigns = await service.get_campaigns(
    chain_id=42161,
    platform_address=curve_platform,
    campaign_id=97
)

Features

  • Campaign Management: Fetch, create, and manage VoteMarket campaigns
  • Proof Generation: Generate merkle proofs for reward claims
  • Analytics: Analyze historical performance and optimize parameters
  • Multi-chain: Supports Ethereum, Arbitrum, and other networks
  • Registry: Built-in platform and gauge registries

Services

CampaignService

Fetch and manage campaign data, lifecycle status, and proof insertion.

from votemarket_toolkit.campaigns import CampaignService

service = CampaignService()
campaigns = await service.get_campaigns(chain_id=42161, platform_address="0x...")

AnalyticsService

Access historical performance metrics from the VoteMarket analytics repository.

from votemarket_toolkit.analytics import get_analytics_service

analytics = get_analytics_service()
history = await analytics.fetch_gauge_history("curve", "0x...")

CampaignOptimizer

Calculate optimal campaign parameters using market data and historical performance.

from votemarket_toolkit.analytics import get_campaign_optimizer

optimizer = get_campaign_optimizer()
result = await optimizer.calculate_optimal_campaign(
    protocol="curve",
    gauge="0x...",
    reward_token="0x...",
    chain_id=1,
    total_reward_tokens=10000
)

VoteMarketProofs

Generate merkle proofs for user and gauge rewards.

from votemarket_toolkit.proofs import VoteMarketProofs

proofs = VoteMarketProofs(chain_id=1)
gauge_proof = proofs.get_gauge_proof("curve", "0x...", epoch, block_number)
user_proof = proofs.get_user_proof("curve", "0x...", "0x...", block_number)

Web3Service

Multi-chain Web3 connections with contract interaction utilities.

from votemarket_toolkit.shared.services import Web3Service

web3 = Web3Service.get_instance(chain_id=1)
contract = web3.get_contract(address, "vm_platform")

LaPosteService

Handle wrapped/native token conversions for cross-chain rewards.

from votemarket_toolkit.shared.services.laposte_service import laposte_service

native_tokens = await laposte_service.get_native_tokens(chain_id, ["0x..."])
token_info = await laposte_service.get_token_info(chain_id, "0x...")

VotesService

Fetch and cache voting data for gauges.

from votemarket_toolkit.votes.services import VotesService

votes = VotesService()
gauge_votes = await votes.get_gauge_votes("curve", "0x...", start_block, end_block)

Configuration

Create .env file with RPC endpoints:

# Required for all chains
ETHEREUM_MAINNET_RPC_URL=https://eth-mainnet.g.alchemy.com/v2/YOUR_KEY
ARBITRUM_MAINNET_RPC_URL=https://arb-mainnet.g.alchemy.com/v2/YOUR_KEY
OPTIMISM_MAINNET_RPC_URL=https://opt-mainnet.g.alchemy.com/v2/YOUR_KEY
BASE_MAINNET_RPC_URL=https://base-mainnet.g.alchemy.com/v2/YOUR_KEY
POLYGON_MAINNET_RPC_URL=https://polygon-mainnet.g.alchemy.com/v2/YOUR_KEY
BSC_MAINNET_RPC_URL=https://bsc-dataseed.binance.org/

Examples

See examples/python for complete usage examples:

  • campaigns/list_all.py – Fetch campaigns across protocols with periods and rewards
  • users/check_status.py – Check user proof status (block data, gauge data, user votes)
  • proofs/generate.py – Build gauge and user proofs for claims
  • data/calculate_efficiency.py – Model optimal max_reward_per_vote values

Check User Eligibility

Check if a user has claimable rewards across all campaigns:

# Check eligibility for all campaigns in a protocol
make check-user-eligibility USER=0x... PROTOCOL=curve

# Filter by specific gauge
make check-user-eligibility USER=0x... PROTOCOL=curve GAUGE=0x...

# Filter by chain
make check-user-eligibility USER=0x... PROTOCOL=balancer CHAIN_ID=42161

# Show only active campaigns
make check-user-eligibility USER=0x... PROTOCOL=curve STATUS=active

This command checks pre-generated proof data from the VoteMarket API to determine which periods have claimable rewards.

Unified CLI

You can use the unified CLI instead of individual scripts.

Examples:

  • Generate a user proof uv run -m votemarket_toolkit.cli proofs-user --protocol curve --gauge-address 0x... --user-address 0x... --block-number 18500000 [--chain-id 1]

  • Generate a gauge proof uv run -m votemarket_toolkit.cli proofs-gauge --protocol curve --gauge-address 0x... --current-epoch 1699920000 --block-number 18500000 [--chain-id 1]

  • List active campaigns uv run -m votemarket_toolkit.cli campaigns-active --protocol curve --chain-id 42161 uv run -m votemarket_toolkit.cli campaigns-active --platform 0x... --chain-id 42161

  • Check a user’s eligibility uv run -m votemarket_toolkit.cli users-eligibility --user 0x... --protocol curve [--gauge 0x...] [--chain-id 42161] [--status active|closed|all]

When installed from PyPI, the CLI is available as votemarket:

  • votemarket proofs-user --protocol curve --gauge-address 0x... --user-address 0x... --block-number 18500000

Development

# Clone repository
git clone https://github.com/stake-dao/votemarket-proof-toolkit
cd votemarket-proof-toolkit

# Install dependencies (requires uv - see below)
uv sync

# Run examples
uv run examples/python/data/calculate_efficiency.py
uv run examples/python/data/get_token_prices.py

# Format and lint
make format              # Format all code
make format FILE=path    # Format specific file

# Build and publish
make build               # Build package
make test-build          # Test build locally
make deploy              # Deploy to PyPI

# Development commands (see Makefile for full list)
make list-campaigns CHAIN_ID=42161 PLATFORM=0x...
make get-active-campaigns PROTOCOL=curve
make check-user-eligibility USER=0x... PROTOCOL=curve [GAUGE=0x...] [CHAIN_ID=1] [STATUS=active]

License

AGPL-3.0 License - see LICENSE

Metadata

Release files for votemarket-toolkit 2.0.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for votemarket-toolkit 2.0.0
File Size Uploaded
votemarket_toolkit-2.0.0.tar.gz 105.7 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for votemarket-toolkit 2.0.0
File Interpreter ABI Platform
votemarket_toolkit-2.0.0-py3-none-any.whl Python 3 none any Details

Total release size: 244.1 kB

Release files / votemarket_toolkit-2.0.0.tar.gz

Download URL votemarket_toolkit-2.0.0.tar.gz
Size 105.7 kB
Tags Source
SHA-256 checksum
How to use checksums
cbd1656a8d06b723eeb826196a305a2f1b2957b1e7b9c8a899af66f366e3cb64
BLAKE2b-256 checksum
How to use checksums
8c601a306dafe08d3dd9e4f718c1fec9833cad892815136c3a5bd61628734d9a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.5.2

Release files / votemarket_toolkit-2.0.0-py3-none-any.whl

Download URL votemarket_toolkit-2.0.0-py3-none-any.whl
Size 138.3 kB
Tags Python 3
SHA-256 checksum
How to use checksums
738724207d09c594c450ee7145052abcc6502388712880479859d05a060af443
BLAKE2b-256 checksum
How to use checksums
c69cb6ef29b2a6690d49e6506958e2c154caa2e29a097b6a199d2e942757472a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.5.2

Release history Release notifications | RSS feed

This release

2.0.0 This release

2 release files

1.0.8

2 release files

1.0.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page