Negative Risk Markets
Negative risk is a mechanism that lets traders operate capital-efficiently in events with three or more possible outcomes. It connects positions across all outcomes through a conversion operation, making a bet against one outcome economically identical to a bet in favor of every other outcome.
Why Independent Markets Fall Short
Section titled “Why Independent Markets Fall Short”When multi-outcome events are modeled as separate, unlinked markets, capital requirements balloon quickly. If an event has outcomes A, B, and C, purchasing NO on outcome A gives you zero exposure to B or C. Each position demands its own capital allocation.
Negative risk eliminates this inefficiency by enabling cross-outcome conversion.
How Conversion Works
Section titled “How Conversion Works”In a negative risk event:
- A NO share in any single outcome can be transformed into 1 YES share in every other outcome.
- This transformation is atomic and executes through the Neg Risk Adapter contract.
Example
Section titled “Example”Take an event “Who will win the 2028 Presidential Election?” with three candidates:
Before conversion:
| Outcome | Your Position |
|---|---|
| Candidate A | — |
| Candidate B | — |
| Candidate C | 1 NO |
After conversion through the Neg Risk Adapter:
| Outcome | Your Position |
|---|---|
| Candidate A | 1 YES |
| Candidate B | 1 YES |
| Candidate C | — |
A position against one candidate turns into a position supporting all remaining candidates. Capital requirements shrink dramatically since you no longer need to fund separate positions in each individual outcome market.
Identifying Neg Risk Markets
Section titled “Identifying Neg Risk Markets”The Gamma API surfaces a neg_risk boolean on both events and markets:
{ "id": "456", "title": "Who will win the 2028 Presidential Election?", "negRisk": true, "markets": [...]}When submitting orders on neg risk markets, include neg_risk: true in your order configuration:
use openfish_client_sdk::clob::types::{Side, OrderType};use openfish_client_sdk::types::dec;
let order = client.limit_order() .token_id(token_id) .price(dec!(0.35)) .size(dec!(200)) .side(Side::Buy) .neg_risk(true) // required for neg risk markets .build().await?;let signed = client.sign(&signer, order).await?;client.post_order(signed).await?;Contract Addresses
Section titled “Contract Addresses”Neg risk markets settle through dedicated exchange contracts, separate from the contracts used by standard binary markets. Both sets are deployed on Polygon mainnet.
| Contract | Address | Purpose |
|---|---|---|
| Neg Risk CTF Exchange | 0x700eaF3f3FEb1D3f2aE67000e1A4FA41a6E35DF1 | Order matching for multi-outcome markets |
| Neg Risk Adapter | 0x0d8FA66CFe5D5EF96D6be9C4e808BD4279527d6e | Converts NO tokens into YES tokens across outcomes |
The settlement layer automatically directs trades to the correct exchange based on the neg_risk flag:
// From openfish-clob-server settlement/onchain.rslet exchange_addr: Address = if trade.neg_risk { NEG_RISK_EXCHANGE.parse().unwrap()} else { CTF_EXCHANGE.parse().unwrap()};SDK Configuration
Section titled “SDK Configuration”The Openfish Rust SDK provides dedicated config lookup for neg risk contracts:
use openfish_client_sdk::{POLYGON, contract_config};
// Standard market configlet config = contract_config(POLYGON, false).expect("polygon config");// config.exchange: 0xA642f9165D192Ff13b1D43a0Ef56B3BD074614bB
// Neg risk market configlet neg_config = contract_config(POLYGON, true).expect("neg risk config");// neg_config.exchange: 0x700eaF3f3FEb1D3f2aE67000e1A4FA41a6E35DF1// neg_config.neg_risk_adapter: Some(0x0d8FA66CFe5D5EF96D6be9C4e808BD4279527d6e)Token Approvals for Neg Risk
Section titled “Token Approvals for Neg Risk”Beyond the approvals required for standard markets, neg risk trading needs additional permissions:
| Token | Spender | Purpose |
|---|---|---|
| CTF (outcome tokens) | Neg Risk CTF Exchange | Trade neg risk tokens |
| CTF (outcome tokens) | Neg Risk Adapter | Convert between YES and NO positions |
See Getting Started for approval instructions.
Augmented Negative Risk
Section titled “Augmented Negative Risk”Standard negative risk assumes every possible outcome is known before trading starts. In practice, new outcomes sometimes emerge after a market is already live (for example, a late entrant in a race).
Augmented negative risk addresses this by introducing three outcome categories:
| Type | Description |
|---|---|
| Named outcomes | Known outcomes at launch (e.g., “Candidate A”, “Candidate B”) |
| Placeholder outcomes | Reserved slots that can be clarified later (e.g., “Person X”) |
| Explicit Other | Catches any outcome not explicitly named |
How Placeholders Work
Section titled “How Placeholders Work”- The event goes live with named outcomes, placeholder slots, and an “Other” catch-all.
- When a previously unknown outcome becomes relevant, a placeholder is assigned to it.
- As placeholders are filled, the scope of the “Other” outcome narrows correspondingly.
Trading Rules
Section titled “Trading Rules”Restrict your trading to named outcomes only. Ignore placeholder outcomes until they receive a concrete assignment. If the actual outcome at resolution does not correspond to any named outcome, the market resolves to “Other”.
Identifying Augmented Neg Risk
Section titled “Identifying Augmented Neg Risk”Both of the following flags must be true in the Gamma API response:
{ "enableNegRisk": true, "negRiskAugmented": true}The SDK parameter remains neg_risk: true regardless of whether the event uses standard or augmented neg risk.
Inventory Management in Neg Risk Markets
Section titled “Inventory Management in Neg Risk Markets”Split and merge operations follow the same pattern as standard markets, but target the Neg Risk Adapter address. See Inventory for the complete workflow.
The conversion operation (NO to YES across outcomes) is a capability unique to neg risk markets:
- You hold 1 NO token for Outcome A.
- Call the convert function on the Neg Risk Adapter.
- You receive 1 YES token for every other outcome in the event.
Next Steps
Section titled “Next Steps”- Contract Addresses — Full list of Openfish contracts on Polygon.
- Inventory — Split, merge, and manage outcome tokens.
- Trading — Order entry and quoting best practices.