After settlement, token holders redeem their winning tokens for $1 USDC each.
YES wins (Settled state): YES holders get $1 USDC per YES token NO wins (Expired state): NO holders get $1 USDC per NO token
Tokens are burned (balance set to 0) on claim — cannot double-claim.
fn claim(env: soroban_sdk::Env, holder: soroban_sdk::Address)
fn get_state(env: soroban_sdk::Env) -> MarketState
Bumps instance TTL. Anyone can call this to keep the contract alive.
fn extend_ttl(env: soroban_sdk::Env)
fn get_orders(env: soroban_sdk::Env) -> soroban_sdk::Map
Called once by the factory immediately after deployment.
Parameters mirror the spec's MarketConfig struct. depeg_threshold uses 14-decimal fixed point: $0.995 = 9_950_000_000_000_0 (14 zeros after decimal = 1e14)
fn initialize(
env: soroban_sdk::Env,
market_id: u32,
label: soroban_sdk::String,
collateral_token: soroban_sdk::Address,
covered_asset: Asset,
oracle_contract: soroban_sdk::Address,
depeg_threshold: i128,
breach_duration_seconds: u64,
expiry_timestamp: u64,
anchor_id: Option,
anchor_stake_contract: soroban_sdk::Address,
)
Attempt to settle the market by reading the oracle price.
Anyone can call this — it is permissionless. The watcher calls it every 60s. The contract's settlement logic (settlement.rs) handles:
fn try_settle(env: soroban_sdk::Env)
Match open buy and sell orders.
Called by the watcher bot every 60 seconds and by users directly. Fills up to max_fills matches per call to bound gas usage.
fn fill_orders(env: soroban_sdk::Env, caller: soroban_sdk::Address, max_fills: u32)
Place a limit order.
is_buy=true → buying YES tokens (buying insurance cover), pays USDC is_buy=false → selling YES tokens (underwriter collecting premium), locks YES
price_bps: 1–9999 basis points (1 = 0.01%, 9999 = 99.99%) e.g. 150 bps = buyer pays 1.5 USDC for 100 YES tokens (1.5% premium)
fn place_order(
env: soroban_sdk::Env,
owner: soroban_sdk::Address,
is_buy: bool,
price_bps: i64,
amount: i128,
) -> u64
Cancel an existing order. Only the order owner can cancel. Escrowed assets (USDC or YES tokens) are returned proportional to unfilled amount.
fn cancel_order(env: soroban_sdk::Env, owner: soroban_sdk::Address, order_id: u64)
Returns (yes_balance, no_balance) for a holder.
fn get_balances(env: soroban_sdk::Env, holder: soroban_sdk::Address) -> (i128, i128)
fn get_market_id(env: soroban_sdk::Env) -> u32
fn get_total_yes(env: soroban_sdk::Env) -> i128
Admin function to configure a yield vault (DeFindex / Blend)
fn set_yield_vault(
env: soroban_sdk::Env,
admin: soroban_sdk::Address,
vault: soroban_sdk::Address,
)
Underwriter deposits amount USDC and receives amount YES + amount NO tokens.
The complete set invariant: every YES token has exactly one paired NO token, and together they are always worth exactly $1 USDC (after settlement).
Typical underwriter flow:
fn mint_complete_set(
env: soroban_sdk::Env,
underwriter: soroban_sdk::Address,
amount: i128,
)
fn get_total_collateral(env: soroban_sdk::Env) -> i128
fn get_breach_started_at(env: soroban_sdk::Env) -> Option