Documentation

Parl Protocol v0.1 — Deployed on Avalanche Fuji.

PoolEngine: 0xB3702B...be00
Chain: Avalanche Fuji (43113)
License: MIT

Parl is a fully on-chain parimutuel prediction markets protocol. Unlike AMM-based prediction markets (e.g. Polymarket), Parl uses a parimutuel pool mechanism — all bets for a given market pool into a shared pot, and winners split the pot proportionally.

This means no liquidity providers, no impermanent loss, and no AMM slippage. The protocol is designed to be used as an infrastructure layer — integrate into your own frontend, aggregator, or platform.

1Quickstart

Create your first prediction market in under 5 minutes.

1. Connect to Fuji

Add Avalanche Fuji to your wallet:

Network: Avalanche Fuji C-Chain
RPC: https://avalanche-fuji.infura.io/v3/...
Chain ID: 43113
Currency: AVAX

2. Create a Market

Call createMarket on PoolEngine:

// Params- description: "Will BTC > $100k by EOY?"
- outcomes: ["Yes", "No"]
- resolutionDelay: 604800 (7 days)
- resolverAddress: 0x...
- platformFeeBps: 200 (2%)

3. Place a Bet

Call placeBet with the marketId, outcome index, and ETH value.

2Smart Contracts

The protocol consists of a single core contract: PoolEngine.

PoolEngine

address PoolEngine = 0xB3702B20900AE748A68287B75b6065284081be00;
FunctionParamsDescription
createMarketdesc, outcomes[], delay, resolver, feeBpsCreate a new market
placeBetmarketId, outcomeIndexPlace bet (payable)
resolveMarketmarketId, winnerIndexResolve to an outcome
claimPayoutmarketIdClaim winnings
getMarketmarketIdGet market details

Verified on Snowscan: testnet.snowscan.xyz →

3Parimutuel Math

Parl uses a standard parimutuel payout model. Unlike AMMs, odds are not set by a formula — they emerge from the distribution of bets in the pool.

Payout Formula

Winnings per bettor
payout = (betAmount / totalWinnerPool) × (totalPool × (1 - fee))
Implied odds
odds ≈ totalPool / outcomePool

Example: 3-Outcome Race

OutcomePool (ETH)Implied Odds
Team A2.5 ETH1.52×
Team B1.0 ETH3.80×
Draw0.3 ETH12.67×

Total pool: 3.8 ETH. If Team A wins, the 2.5 ETH pool splits the pool (minus 2% fee) proportionally.

4Pool Lifecycle

Every market goes through four distinct phases:

Active

Bettors can place bets on any outcome. Market resolves when the resolver submits the winning outcome.

Resolved

The market has a winning outcome. Bettors who bet on the winner can now claim their payout.

Claimed

All winning bettors have claimed their payouts. The market is finalized.

Canceled

Market was canceled (e.g., no resolution within timeout). Bettors can reclaim their stake.

5Fee Structure

The market creator sets a platform fee at market creation time, expressed in basis points (bps).

ParameterDefaultRange
Platform fee200 bps (2%)0 – 500 bps
Resolver fee0 bpsOptional

Fees are taken from the total pool after betting closes and before payouts are distributed. The fee only applies to the winning pool — losers forfeit their stake entirely.

6Resolution & Oracles

Each market has a resolver address set at creation — the only entity authorized to resolve the market.

Resolver Types

EOA (Manual)

A regular wallet. Simple for managed markets where you control resolution.

Multisig

Gnosis Safe or similar. Multiple parties must agree on the outcome.

Oracle Contract

Programmatic resolution via an oracle (e.g., Chainlink, UMA, or custom).

⚠️ The resolver address is trusted. If the resolver is malicious or compromised, the market can be resolved dishonestly. Use multisig oracles for production markets.

7API Reference

Parl exposes a REST API for querying on-chain data indexed by the Parl Indexer.

Base URL: https://parl.build/api (or via proxy)

GET/api/markets

List all markets

[
  {
    "id": "9a228815-...",
    "market_id": "0xe1cc...",
    "description": "Will Team A win?",
    "outcomes": ["Yes", "No"],
    "status": "active",
    "total_pool": "3.800000000000000000",
    "platform_fee_bps": 200,
    "created_at": "2026-07-01T12:00:00Z"
  }
]
GET/api/markets/:id

Get market by ID

{ "id": "...", "market_id": "...", ... }
GET/api/bets/:marketId

Get bets for a market

[ { "bettor": "0x...", "outcome": 0, "amount": "1.5" }, ... ]
GET/health

Health check

{ "status": "ok", "backend": "ok", "db": "ok" }

8SDK & Integration

Integrate Parl into your own application. The protocol is permissionless — any frontend, aggregator, or platform can read and write to PoolEngine.

Contract Integration

// ethers.js / viem
import { PoolEngineABI } from "./PoolEngineABI";

const poolEngine = new ethers.Contract(
  "0xB3702B20900AE748A68287B75b6065284081be00",
  PoolEngineABI,
  signer
);

// Create market
const tx = await poolEngine.createMarket(
  "Will BTC > $100k?",
  ["Yes", "No"],
  604800,
  resolverAddress,
  200
);
await tx.wait();

API Integration

// Fetch markets
const res = await fetch("https://parl.build/api/markets");
const markets = await res.json();

// Display pool amounts
markets.forEach(m => {
  const poolEth = ethers.formatEther(m.total_pool);
  console.log(`${m.description}: ${poolEth} ETH`);
});

9Security

Parl is in early-stage development on Avalanche Fuji testnet. The following considerations apply:

  • Contract has not undergone a formal audit. Use at your own risk.
  • Resolver address is a single point of trust — use multisig for production.
  • No emergency pause or upgrade mechanism in v0.1.
  • Fuji testnet AVAX has no real value. This is experimental software.
  • Bet amounts are held in the contract until resolution.

🛡️ The contract is verified on Snowscan. Review the source code before depositing any meaningful value.

Parl Protocol Documentation

v0.1 — Last updated July 2026

Launch App →