Skip to content

Position Entry Flow

Trigger: Operator identifies a suitable prediction market and is ready to deploy idle capital. Caller: Governance (operator)

Pre-Conditions

Before calling openPosition(), the operator must verify all market selection criteria off-chain:

  • Market has ≥ 30 days to resolution and ≤ 120 days
  • Expected entry price is in the \(0.88–\)0.95 range
  • NO side liquidity depth is ≥ 5× intended position size within 2% of current price
  • Position will not exceed 10% of NO-side open interest
  • Position is uncorrelated with other active vault positions

Steps

  1. Operator identifies market meeting all selection criteria.

  2. Operator deploys MarketAdapter contract pointed at the venue and specific market.

  3. Set vault = vaultAddress (immutable, vault-authorized calls only)
  4. Set marketId to the target market identifier
  5. Verify adapter is functional: adapter.currentPrice() returns a reasonable value

  6. Operator calls vault.openPosition(slotIndex, adapterAddress, assets, maturity).

  7. Vault validates (on-chain):

  8. positions[slotIndex].status == EMPTY
  9. assets <= idleReserve - (aggMarketNAV * reserveTargetBps / 10000) — reserve constraint uses aggMarketNAV as TVL basis
  10. adapter is a valid non-zero contract address
  11. maturity > block.timestamp

  12. Vault calls (sharesAcquired, executionPrice) = adapter.buyNoShares(assets). Adapter acquires NO shares on the venue and returns both the shares acquired and the weighted average execution price as a named tuple.

  13. Vault assigns position.entryPrice = executionPrice. The operator never supplies this value — it comes directly from the adapter's execution.

  14. Vault records position in registry:

    positions[slotIndex] = Position {
        adapter:         adapterAddress,
        entryPrice:      executionPrice,   // from adapter.buyNoShares() tuple
        startTime:       block.timestamp,
        maturity:        maturity,
        allocatedAssets: assets,
        status:          ACTIVE,
        lastRebase:      0
    }
    

  15. PositionOpened(slot, adapter, assets, entryPrice, maturity) emitted.

  16. Position begins accruing in modeled NAV immediately from executionPrice.

Slippage Control

Maximum recommended entry slippage: 50 bps (0.5%). The adapter must revert if execution would exceed the slippage tolerance. The operator should then either:

  • Reduce the position size
  • Wait for better market conditions

Entry price is automatic

Because entryPrice is sourced from adapter.buyNoShares() — not supplied by the operator — there is no risk of an incorrectly stated entry price. Verify the SharesPurchased event on the adapter to confirm the execution price matches position.entryPrice.