Documentation
Parl Protocol v0.1 — Deployed on Avalanche Fuji.
0xB3702B...be00Parl 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:
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
| Function | Params | Description |
|---|---|---|
| createMarket | desc, outcomes[], delay, resolver, feeBps | Create a new market |
| placeBet | marketId, outcomeIndex | Place bet (payable) |
| resolveMarket | marketId, winnerIndex | Resolve to an outcome |
| claimPayout | marketId | Claim winnings |
| getMarket | marketId | Get 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
Example: 3-Outcome Race
| Outcome | Pool (ETH) | Implied Odds |
|---|---|---|
| Team A | 2.5 ETH | 1.52× |
| Team B | 1.0 ETH | 3.80× |
| Draw | 0.3 ETH | 12.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:
Bettors can place bets on any outcome. Market resolves when the resolver submits the winning outcome.
The market has a winning outcome. Bettors who bet on the winner can now claim their payout.
All winning bettors have claimed their payouts. The market is finalized.
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).
| Parameter | Default | Range |
|---|---|---|
| Platform fee | 200 bps (2%) | 0 – 500 bps |
| Resolver fee | 0 bps | Optional |
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)
/api/marketsList 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"
}
]/api/markets/:idGet market by ID
{ "id": "...", "market_id": "...", ... }/api/bets/:marketIdGet bets for a market
[ { "bettor": "0x...", "outcome": 0, "amount": "1.5" }, ... ]/healthHealth 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