Skip to content

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.


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.


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.

Take an event “Who will win the 2028 Presidential Election?” with three candidates:

Before conversion:

OutcomeYour Position
Candidate A
Candidate B
Candidate C1 NO

After conversion through the Neg Risk Adapter:

OutcomeYour Position
Candidate A1 YES
Candidate B1 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.


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?;

Neg risk markets settle through dedicated exchange contracts, separate from the contracts used by standard binary markets. Both sets are deployed on Polygon mainnet.

ContractAddressPurpose
Neg Risk CTF Exchange0x700eaF3f3FEb1D3f2aE67000e1A4FA41a6E35DF1Order matching for multi-outcome markets
Neg Risk Adapter0x0d8FA66CFe5D5EF96D6be9C4e808BD4279527d6eConverts 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.rs
let exchange_addr: Address = if trade.neg_risk {
NEG_RISK_EXCHANGE.parse().unwrap()
} else {
CTF_EXCHANGE.parse().unwrap()
};

The Openfish Rust SDK provides dedicated config lookup for neg risk contracts:

use openfish_client_sdk::{POLYGON, contract_config};
// Standard market config
let config = contract_config(POLYGON, false).expect("polygon config");
// config.exchange: 0xA642f9165D192Ff13b1D43a0Ef56B3BD074614bB
// Neg risk market config
let neg_config = contract_config(POLYGON, true).expect("neg risk config");
// neg_config.exchange: 0x700eaF3f3FEb1D3f2aE67000e1A4FA41a6E35DF1
// neg_config.neg_risk_adapter: Some(0x0d8FA66CFe5D5EF96D6be9C4e808BD4279527d6e)

Beyond the approvals required for standard markets, neg risk trading needs additional permissions:

TokenSpenderPurpose
CTF (outcome tokens)Neg Risk CTF ExchangeTrade neg risk tokens
CTF (outcome tokens)Neg Risk AdapterConvert between YES and NO positions

See Getting Started for approval instructions.


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:

TypeDescription
Named outcomesKnown outcomes at launch (e.g., “Candidate A”, “Candidate B”)
Placeholder outcomesReserved slots that can be clarified later (e.g., “Person X”)
Explicit OtherCatches any outcome not explicitly named
  1. The event goes live with named outcomes, placeholder slots, and an “Other” catch-all.
  2. When a previously unknown outcome becomes relevant, a placeholder is assigned to it.
  3. As placeholders are filled, the scope of the “Other” outcome narrows correspondingly.

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”.

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.


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:

  1. You hold 1 NO token for Outcome A.
  2. Call the convert function on the Neg Risk Adapter.
  3. You receive 1 YES token for every other outcome in the event.

  • Contract Addresses — Full list of Openfish contracts on Polygon.
  • Inventory — Split, merge, and manage outcome tokens.
  • Trading — Order entry and quoting best practices.