Oracle3
Open-source trading engine and MCP server for prediction markets. Fee-aware no-arbitrage trading across related contracts, live on Kalshi, Polymarket and Solana or on paper.
Trade without trace. Private sealed-bid batch auctions on Polymarket.
Translation pending
FinanceSolidity · TypeScriptGitHub @Ambesh69OnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Loading the full README. The saved excerpt is shown below.
Private sealed-bid batch auction layer on top of Polymarket.
Launch status: Mainnet intake is closed. V13 is deployed on Polygon in a
paused state and its Railway chain/database preflight passes. It replaces v12's
publicly linkable per-market order commitments with generic order notes,
secret-derived nullifiers, and private refund/position allocations. An
independent security review, v13 live recovery pilot, and privacy/product
validation are still required before intake opens. See
the v13 architecture and launch gate.Read the full README ↗Private sealed-bid batch auction layer on top of Polymarket.
Launch status: Mainnet intake is closed. V13 is deployed on Polygon in a paused state and its Railway chain/database preflight passes. It replaces v12's publicly linkable per-market order commitments with generic order notes, secret-derived nullifiers, and private refund/position allocations. An independent security review, v13 live recovery pilot, and privacy/product validation are still required before intake opens. See the v13 architecture and launch gate.
V13 retains Polymarket for aggregate execution. Proofs omit individual order witnesses and source commitments from public batch settlement. This does not guarantee anonymity: public funding, withdrawal amounts, timing, and two-order batches permit inference. The aggregate Polymarket hedge remains public, and the relayer sees decrypted order witnesses while grouping and proving a batch.
Trader ShieldedPoolV2 Relayer / Polymarket
│ │ │
├─ deposit private note ──────►│ │
├─ lock generic order proof ─►│ │
├─ send encrypted witness ────────────────────────────────────►│
│ │◄─ route two-order ZK proof ───┤
│ ├─ aggregate collateral ───────►│
│ │ CLOB fill │
│ │◄─ returned assets + proof ────┤
│◄─ private refund/position notes │
Key properties:
Predacy/
├── contracts/ Solidity (Foundry) — BatchVault, verifiers, proxy wallets
├── circuits/ Noir ZK circuits — batch_clearing + claim
├── relayer/ Node.js + TypeScript — HTTP API, batch processor, ZK prover
└── frontend/ Next.js 15 — trading UI
| Layer | Technology |
|---|---|
| Contracts | Solidity 0.8.33, Foundry (via_ir, optimizer 200) |
| ZK circuits | Noir — UltraHonk / Barretenberg (@aztec/bb.js) |
| Relayer | Node.js + TypeScript + viem, deployed on Railway |
| Frontend | Next.js 15, wagmi/viem, Tailwind v3 |
| Chain | Polygon mainnet |
| Privacy | Noir/UltraHonk shielded notes (individual details hidden on-chain; witnesses visible to the relayer) |
| Order book | Polymarket CLOB API (gap fills between phases) |
These addresses belong to the retired v10 flow. V13 is deployed separately; its production configuration must not use these legacy addresses.
| Contract | Address |
|---|---|
| BatchVault v10 | 0x8fD2B227E98F401F55B4252d34905C96eEEAEA1a |
| HonkVerifier (batch) | 0xFd32E90a67247dF2878bEeD5599aaFc3430fC993 |
| PublicInputAdapter | 0x8f6829E931E278d47Ec160847C1037864AfB1cC7 |
| ClaimHonkVerifier (active in BatchVault; fork-tested with a fresh proof) | 0xA50409A331E3CA9Db7fDfB96028BAeFF3AF48bBd |
| ProxyWalletFactory | 0x7608A95420c107503837dE35E25bf360bEe82f38 |
| WrappedCTFFactory | 0x8Ff83784f6209D4455D83C9e28b515255dbEA955 |
V13 mainnet order intake is disabled. Deployments start paused and the relayer and frontend gates default closed. See the v13 runbook and the launch gate.
This section documents the old two-phase flow for historical context. It is not the v13 production path.
Phase 1 — lockFunds()
CTF.splitPosition (balanced demand) or CTF.mergePositions (excess sellers)Between phases
Phase 2 — settleBatch(batchId, proof)
Claim — claimWithProof()
claimWithProof on behalf of the trader; payout goes to the recipient addresscd contracts
forge build
forge test
cd relayer
cp .env.example .env # fill in VAULT_ADDRESS, RELAYER_PRIVATE_KEY, RPC_URL, etc.
npm start
Required env vars:
| Variable | Description |
|---|---|
VAULT_ADDRESS | BatchVault contract address |
RELAYER_PRIVATE_KEY | Relayer hot wallet private key |
RPC_URL | Polygon mainnet RPC (authenticated dRPC recommended) |
ADAPTER_ADDRESS | PublicInputAdapter address |
CLAIM_VERIFIER | ClaimHonkVerifier address |
REDIS_URL | Redis connection string (order storage, 7-day TTL) |
USE_REAL_ZK | true for mainnet (HonkVerifier); false for mock mode |
cd frontend
cp .env.local.example .env.local # fill in NEXT_PUBLIC_RELAYER_URL, etc.
npm run dev
| On-chain action | Trader visible? |
|---|---|
commitOrderFor calldata | No — ephemeral signer |
settleBatch calldata | No — no trader field |
| Claim tx | No — relayer submits |
PositionClaimed event | No — recipient address only |
| USDC transfer to ephemeral | No (mainnet) — Railgun private transfer |
The table describes the intended wallet-link protection only. The v10
lockFunds calldata reveals every order's market, side, amount, limit, and
salt; a direct transfer to an ephemeral wallet is linkable. Polymarket fills
are public. Do not describe this flow as hiding all trade details.
commitment = keccak256(abi.encode(marketId, side, amount, limitPrice, salt))
nullifier = keccak256(abi.encode(commitment, batchId, salt))
side is a uint8: 0 = YES_BUY, 1 = YES_SELL, 2 = NO_BUY, 3 = NO_SELL.
The trader address is never part of the commitment — the relayer associates trader ↔ commitment off-chain in Redis.