TypeScript SDK for the OddMaki Protocol — a fully on-chain prediction market factory on Base. Built on viem.
pnpm add @oddmaki-protocol/sdk viemimport { createOddMakiClient } from "@oddmaki-protocol/sdk";
const client = createOddMakiClient({
walletClient, // viem WalletClient
});
// Read markets
const markets = await client.public.getMarkets(venueId);
// Place a limit order — buy YES at $0.65, 100 USDC, expires in 24h
await client.trade.placeOrderSimple(marketId, outcomeId, "buy", "0.65", "100", "24h");
// Place a market order (Fill-or-Kill)
await client.trade.placeMarketOrderSimple(marketId, outcomeId, "50", "0.70", 0);The client exposes functional modules covering the full protocol:
| Module | Purpose |
|---|---|
venue |
Create and configure venues (fee structure, access control, oracle params) |
market |
Create markets and market groups, read pricing and positions |
trade |
Limit orders, market orders (FOK/FAK), batch operations, split/merge |
public |
Subgraph queries — markets, trades, orderbook, analytics, leaderboards |
token |
ERC20 approvals and balance checks |
uma |
UMA oracle lifecycle — assert, settle, report, redeem |
accessControl |
Deploy and manage access control contracts (whitelist, NFT-gated, token-gated) |
priceMarket |
Pyth-powered price markets with automatic resolution |
Both raw and simplified interfaces are available. The simple API accepts human-readable strings:
// Limit order
await client.trade.placeOrderSimple(marketId, outcomeId, "buy", "0.65", "100", "24h");
// Market order: spend 50 USDC, max price $0.70, Fill-or-Kill
await client.trade.placeMarketOrderSimple(marketId, outcomeId, "50", "0.70", 0);
// Batch: place up to 20 orders atomically
await client.trade.batchPlaceOrdersSimple(marketId, orders);
// Cancel and replace in a single transaction
await client.trade.cancelAndReplace(cancelIds, marketId, newOrders);The public module provides indexed reads:
// Unified feed (standalone markets + groups)
const feed = await client.public.getUnifiedMarketFeed(venueId);
// Trader profile and positions
const profile = await client.public.getTraderProfile(address);
const positions = await client.public.getTraderPositions(address);
// Leaderboard
const leaders = await client.public.getLeaderboard("totalVolume", "desc");import { priceToTick, tickToPrice, parseAmount } from "@oddmaki-protocol/sdk";
priceToTick("0.80"); // 80n
tickToPrice(80n); // "0.80"
parseAmount("10.5"); // 10500000n (6 decimals)pnpm install
pnpm run build
pnpm run test
pnpm run lint- oddmaki-core — Smart contracts
- oddmaki-subgraph — Subgraph
- oddmaki-venue-starter — Venue starter template
- Protocol — oddmaki.com
- Maintainer — predictablereality.com
- Contact — team@oddmaki.com
MIT — Copyright (c) 2025-2026 Predictable Reality, Inc.