Polyark Documentation
Polyark is a prediction market fund marketplace built on Polymarket V2. Skilled traders deploy ERC-4626 vaults, pool investor capital, trade Polymarket positions on investors' behalf, and earn performance fees. Smart contract enforcement solves the trust problem — managers can only interact with whitelisted Polymarket contracts and cannot withdraw investor funds directly.
What is Polyark
Polyark lets you invest in managed prediction market funds without trusting the manager with custody of your funds. Think of it as copy-trading meets hedge funds, enforced programmatically by smart contracts.
- Investors deposit USDC into vaults and receive ERC-20 shares representing their stake.
- Managers trade Polymarket prediction markets using the pooled capital and earn a performance fee on profits above a high-watermark.
- The contract ensures managers can only interact with approved Polymarket contracts — they cannot move funds to arbitrary addresses.
How it works
The vault lifecycle
- A manager deploys a vault via PolyarkFactory with their chosen parameters (fee, kill switch, timelock).
- Investors deposit USDC and receive vault shares. NAV starts at 1.0 USDC per share.
- The manager executes trades on Polymarket by calling whitelisted contracts through the vault. USDC leaves the vault to buy prediction market positions.
- As positions resolve profitably, USDC returns to the vault. NAV per share rises above 1.0.
- Performance fees accrue on gains above the high-watermark NAV. The manager claims them periodically.
- Investors withdraw at any time. Their shares are redeemed at current NAV minus any applicable performance fee.
Trust model
The core security guarantee: the manager cannot steal funds. The execute() function — the only way a manager can move vault assets — is restricted to a whitelist of Polymarket's own smart contracts. Any call to an unlisted address reverts on-chain.
What the manager can do: make good or bad trades. Investors trust the manager's trading skill, not their custody of funds. The kill switch limits downside automatically.
Architecture
PolyarkVault
ERC-4626 tokenised vault. Holds USDC, issues shares, enforces whitelist, manages fees and kill switch.
PolyarkFactory
Deploys new vaults with validated parameters. Maintains a registry of all deployed vaults.
PolyarkOracle
EIP-712 signed price feed for CTF positions. Used to display NAV of vaults holding open Polymarket positions.
Frontend apps are deployed on Vercel. Auth is handled by Supabase. The oracle backend service runs on Railway and submits signed price updates every 5 minutes.
Investor: Getting started
- Go to investor.polyark.xyz
- Sign up with email and password.
- Confirm your email via the link sent to your inbox.
- Connect your MetaMask wallet. You'll be asked to sign a message — this verifies you own the wallet and costs no gas.
- Switch MetaMask to the Sepolia testnet if prompted.
Investing in a vault
- Open the Explorer tab to browse all deployed vaults.
- Click a vault to see its NAV, AUM, fee structure, and oracle positions.
- Click the Invest tab in the right panel.
- Enter the USDC amount. Click Approve USDC on first use (one MetaMask confirmation).
- Click Deposit (one MetaMask confirmation). You receive vault shares immediately.
Your shares represent a proportional claim on the vault's assets. If NAV rises, your shares are worth more. If NAV falls, they are worth less.
Withdrawing
- Open the vault → Withdraw tab.
- Select the percentage to withdraw (25%, 50%, 75%, or 100%).
- Click Request withdrawal.
- If your withdrawal exceeds the timelock threshold (a % of AUM), wait for the countdown timer. Otherwise, execute immediately.
- Click Execute withdrawal to receive USDC.
NAV & Oracle
NAV (Net Asset Value) per share tells you what each share is currently worth in USDC.
- At vault launch: NAV = 1.0000 USDC per share.
- After a profitable trade: NAV rises above 1.0.
- After a loss: NAV falls below 1.0.
The on-chain NAV is calculated from the vault's USDC balance divided by total shares outstanding. It's exact and trustless.
The oracle NAV (shown in the positions panel) reflects estimated values of open Polymarket positions using real-time prices from the Polymark CLOB, signed by the oracle service and submitted on-chain every 5 minutes.
Safety mechanisms
| Mechanism | What it does |
|---|---|
| Kill switch | Automatically pauses trading if drawdown exceeds the threshold. Withdrawals still work normally when paused. |
| Whitelist | Manager can only interact with approved Polymarket contracts. Cannot send funds to arbitrary addresses. |
| Timelock | Large withdrawals (above a % of AUM) are delayed, giving the manager time to close positions without a bank run. |
| High-watermark | Performance fees only apply to gains above the previous peak NAV. No fee on recovering from losses. |
| Fee exclusion | Accrued but unclaimed fees are excluded from NAV calculation so remaining investors don't subsidise the manager's fees. |
Manager: Getting started
- Go to manager.polyark.xyz
- Sign up with email and password, confirm your email.
- Connect the wallet you want to use as your manager identity. This wallet will hold
MANAGER_ROLEandADMIN_ROLEon any vault you deploy.
Deploying a vault
Click + Deploy vault in the top right corner of the manager dashboard.
| Field | Description |
|---|---|
| Name | Full name of the vault, shown to investors. E.g. "Sigma Edge Vault". Max 64 characters. |
| Symbol | Short ticker for the vault's share token. E.g. "SEV". Max 16 characters. |
| Performance fee | Your cut of profits above the high-watermark. In basis points. 2000 = 20%. Max 5000 (50%). |
| Kill switch threshold | Drawdown from peak NAV that automatically pauses trading. In basis points. 1500 = 15%. |
| Timelock delay | How long large withdrawal requests are delayed. In seconds. 259200 = 3 days. |
| Timelock threshold | How large a withdrawal (as % of AUM) triggers the timelock. In basis points. 1000 = 10% of AUM. |
After deployment, your wallet automatically receives both MANAGER_ROLE (trade execution) and ADMIN_ROLE (vault configuration).
Vault parameters explained
NAV per share
The current price of one vault share in USDC. Starts at 1.0. Rises when trades are profitable, falls when they lose. This is the primary performance metric investors watch.
AUM (Assets Under Management)
Total USDC currently inside the vault. Decreases when the manager buys Polymarket positions (USDC leaves the vault to the exchange), increases when positions are sold back.
Drawdown
How far NAV has fallen from its all-time peak. If peak NAV was 1.25 and current NAV is 1.10, drawdown is 12%. The kill switch activates when this exceeds the threshold you set.
High-watermark (HWM)
The highest NAV the vault has ever reached. Performance fees only accrue on gains above this level. If NAV drops from 1.3 to 0.9 and then recovers to 1.2, no fee is charged until NAV exceeds 1.3 again.
Accrued fees
Performance fees that have built up from profitable redemptions but haven't been claimed yet. These are excluded from NAV so they don't inflate other investors' balances.
Executing trades
Trades are executed via the Execute Trade tab in the manager dashboard.
- Target address — the Polymarket contract to call. Must be on the vault's whitelist. On testnet this is MockCTFExchange. On mainnet this is Polymarket's CTF Exchange V2 or Neg Risk Exchange V2.
- Calldata — the ABI-encoded instruction. On mainnet, generate this using the Polymarket CLOB SDK:
import { ClobClient } from "@polymarket/clob-client-v2";
const clobClient = new ClobClient(host, chainId, signer);
const order = await clobClient.createOrder({ tokenID, price, size, side });
const calldata = await clobClient.encodeMatchOrder(order);
// paste calldata into Execute Trade tab
- Approve Targets — call this once after vault deployment, and again after adding new whitelist entries. It grants the exchange contracts permission to spend the vault's USDC.
Managing fees
Performance fees are calculated per-redemption: when an investor withdraws, any gain above the HWM is subject to the fee. The fee is held inside the vault as accruedPerfFees.
Click Claim Fees in the Overview tab to transfer all accrued fees to the feeRecipient address (your admin wallet by default). You can update the fee recipient in Settings.
Kill switch
The kill switch pauses all trading activity while leaving withdrawals fully operational.
- Auto-trigger — fires automatically when
currentDrawdownBps ≥ killSwitchBps. Checked after every trade. - Manual activate — admin can pause at any time via the Overview tab.
- Lift — admin can resume trading. This resets the
peakNavto the current NAV, restarting the drawdown measurement.
Whitelist management
The whitelist is the security boundary between manager and vault. Only addresses on the list can be called via execute().
- Add target — adds an address and allows calls to it. Follow with Approve Targets to also grant USDC spending approval.
- Remove target — removes the address AND atomically revokes its USDC spending approval. If you suspect a Polymarket contract has been compromised, remove it immediately.
Maximum 20 targets per vault.
Smart contracts (Sepolia testnet)
| Contract | Address |
|---|---|
| PolyarkFactory | 0xE1926DC1fA6ba6056acD5B5e0eA6201e1D16145b |
| PolyarkOracle | 0x6e100fb077eE4f887C0605805DA9F17c6A1a5a28 |
| Sigma Edge Vault | 0x9c2D26CB315FC3DE9DAb47Be3b5c4F860a0674f2 |
| MockUSDC | 0x20059B9Fd46b4eF4d332960DAD1d99074Ba5fdcd |
All contracts are deployed on Ethereum Sepolia (chain ID 11155111). Mainnet (Polygon) deployment coming soon.
Security model
What the protocol guarantees
- Manager cannot send vault funds to arbitrary addresses — only whitelisted Polymarket contracts.
- Reentrancy guards on all state-changing functions.
- Performance fee uses HWM — no fee on recovering losses.
- Accrued fees excluded from NAV.
- Withdrawal IDs include a nonce to prevent same-block collisions.
- Fee changes have a 7-day timelock.
- Removing a whitelist target atomically revokes its USDC allowance.
What the protocol does not guarantee
- Trading skill. A manager can lose money through bad trades.
- Liquidity. If the vault's USDC is in open positions, immediate large withdrawals may fail.
- Oracle accuracy on mainnet. NAV charts depend on the oracle service being live.
Testnet guide
Polyark is currently live on Ethereum Sepolia. Everything works exactly as it will on mainnet, but with fake tokens.
- Get free Sepolia ETH (for gas): sepolia-faucet.pk910.de
- Get free test USDC: use the mint button in the Portfolio tab of the investor app.
- MetaMask shows "ETH" on Sepolia — this is testnet ETH worth nothing. Confirm the network says Sepolia in the top left of MetaMask.
FAQ
Can the manager steal my funds?
No. The vault's execute() function — the only way to move USDC — only works with addresses on the whitelist. On mainnet those are Polymarket's own contracts. The manager can make bad trades, but cannot withdraw funds to their own wallet.
What happens when the kill switch activates?
Trading pauses. Withdrawals continue normally. The manager must manually lift the kill switch to resume trading. If they don't, investors can withdraw their funds at the current (reduced) NAV.
How are performance fees calculated?
Only on redemptions, and only on gains above the high-watermark. If you deposit at NAV 1.2 and the HWM is 1.5, you pay no performance fee until NAV exceeds 1.5.
What is the timelock for?
It prevents a single large withdrawal from forcing the manager to dump all open positions at once. The timelock gives the manager time to wind down positions cleanly before the USDC is released.
Can I use Polyark on mobile?
Yes, via MetaMask Mobile's built-in browser. Navigate to investor.polyark.xyz or manager.polyark.xyz.
When is mainnet (Polygon) launching?
Soon. The contracts are deployment-ready. Polygon mainnet launch requires updating to Polymarket V2 addresses and funding the deployer wallet with POL for gas.