Prediction Market

draft

Augur Statoblast White Paper

Augur Statoblast is a binary prediction market built on top of Zoltar. It creates security pools scoped to individual questions, lets traders mint and redeem ETH-backed shares, lets REP vaults provide underwriting, and tries to settle disputes locally before forcing Zoltar to fork. Statoblast assumes Protocol Security Model.

The Zoltar universe fork and Statoblast pool-fork activation are distinct transitions. On the pool's own local non-decision path, Statoblast activates pool fork mode immediately before forking Zoltar in the same transaction. After an unrelated external Zoltar fork, anyone must separately initiate the affected pool's fork handling. Child pools are then created lazily. Vault holders choose a child by migrating their vault positions, and the forker materializes the corresponding child REP.

Proportional open-interest collateral moves with each vault migration; it is not duplicated across universes. As a result, some child universes may not receive enough collateral to fully back their inherited open interest.

After the migration window ends, each undercollateralized child pool may run its own truth auction, selling that child universe's REP to raise as much repair ETH as demand supports.

1. System Overview

#

The stack has two protocol identities. Zoltar is the base truth/forking oracle layer for universes, questions, scalar math, and REP branching. Augur Statoblast is the application layer that adds market collateral, underwriting, local disputes, migration, and collateral repair. For the base oracle layer, see zoltar-whitepaper.html.

Statoblast's lifecycle starts by creating a pool scoped to one question and universe, letting traders and REP vaults use it, trying to resolve disputes locally, and only then turning to fork and collateral-repair machinery.

  1. A question is registered in Zoltar and a Statoblast security pool is deployed for that question in one universe.
  2. REP vaults fund underwriting capacity and users mint ETH-backed complete sets.
  3. After question end, disputes first try to resolve locally through the escalation game.
  4. If local resolution reaches non-decision, Statoblast can trigger a Zoltar fork. An unrelated external Zoltar fork can also interrupt the pool before local resolution. In either case, a separate pool-fork activation snapshots the parent before child-pool migration begins.
  5. If a child pool is missing ETH collateral after migration, it can sell child-universe REP through a truth auction to repair that collateral gap.
  6. The child pool in the branch users choose to keep using resumes operation and users settle or redeem positions there.

Happy Path vs Recovery Path

Checkpoint Happy path Recovery path
Resolution trigger Escalation picks a single local winner before non-decision. The pool's own non-decision triggers Zoltar, or an unrelated external Zoltar fork interrupts the pool; pool-fork activation is a separate step.
Where state settles The original pool remains the settlement venue. Vaults, shares, and collateral accounting can migrate into child pools. Each child receives one canonical unresolved-escalation snapshot and aggregate backing; winners later settle by proof.
Collateral condition Winning shares redeem against the existing ETH collateral base. A child pool may need truth-auction repair before redemptions are clean.
User mental model One pool, one final outcome, direct redemption. Choose the child universe that retains value, migrate positions, then settle there.

Actor SwimlanesThe same lifecycle looks different by role

Statoblast is not an exchange venue. It issues transferable ERC-1155 outcome shares and manages redemption, migration, and collateral accounting; secondary market trading sits outside this protocol.

2. Architecture

#

A Statoblast lineage begins with one origin SecurityPool and includes the descendant child pools created after forks. It sits between two independent oracle boundaries: Zoltar supplies question and universe identity, while OpenOracle supplies contestable REP/ETH prices through a pool-specific coordinator. Each contract owns only its part of the lineage's state.

Authority map

One lineage, three architectural layers

Follow the map from durable identity, through the market ledger, to services that decide, price, migrate, and repair it. Every contract box is a separate storage and authority boundary.

  1. 01
    Truth and identity Arrows show direct call direction
    ZoltarQuestionData

    Registers the question and its valid answer encoding.

    Zoltar

    Owns universe identity, branch creation, and the migration ledger.

    ReputationToken

    Owns REP balances and theoretical supply within one universe.

  2. 02
    Market lineage ledger Held across one origin pool and its descendants
    SecurityPoolFactory

    Binds an eligible binary question to a universe and deploys an origin pool.

    SecurityPool

    Owns its ETH collateral, REP vault accounting, allowances, fees, lifecycle status, and the pointer to its escalation game.

    ShareToken

    Tracks universe-aware Invalid, Yes, and No claims, and materializes unminted child claims during migration.

  3. 03
    Bounded services Invoked for one specialized transition
    Decide locally EscalationGame

    Owns outcome deposits, balances, carry commitments, replay state, and resolution state; it verifies caller-supplied carry proofs and resolves locally unless contention reaches a non-decision.

    Stage guarded operations OpenOraclePriceCoordinator

    Owns cached price and staged-operation state. A vault or liquidator stages with it; after obtaining a fresh accepted price, it invokes the pool.

    Report REP/ETH price OpenOracle

    Owns report games and reporter balances; the coordinator requests and accepts its contestable REP/ETH reports.

    Create child pools SecurityPoolForker

    Snapshots the parent pool, deploys selected child pools, routes vault accounting and collateral, and installs continuation backing.

    Route branch REP SecurityPoolMigrationProxy

    Provides one stable caller identity, calls Zoltar to lock, fork, and split REP, then transfers materialized child REP directly to its receiver.

    Attempt collateral repair UniformPriceDualCapBatchAuction

    When a shortfall remains, sells auctionable child REP for as much ETH as demand supplies; activation counts only actual accepted ETH.

Control path

  1. DeployFactory binds question + universe
  2. OperatePool accounts for collateral, REP, and shares
  3. ResolveEscalation settles locally or exposes non-decision
  4. ContinueForker creates selected children; the auction may attempt remaining shortfall repair
Keep the oracle roles separate. Zoltar answers “which truth branch is this?” OpenOracle answers “what is REP worth in ETH for this guarded operation?” Neither oracle owns the pool's collateral ledger, and the truth auction answers neither question.

3. Core Economic Roles

#

Security assumptions: A01 risk-adjusted incentives, A03 independent participants, A13 REP liquidity, and A06 lifecycle executors.

4. Security Pools

#

Security assumptions: A08 REP valuation, A14 REP economic backing, A21 genesis REP and WETH behavior, A23 canonical deployment, A15 intended question selection, A25 safe immutable parameters, A22 asset-recipient compatibility, A24 client and wallet integrity, and A28 account authority.

A SecurityPool is a lineage-specific Statoblast contract for a question in a universe. Vault operators deposit REP, choose bond allowance, and underwrite ETH-backed complete sets in that pool's local accounting ledger.

Origin pools are narrower than the general Zoltar question model. The factory requires the question to exist, the universe to be unforked, the universe REP token to be present, and the question to have exactly two categorical labels in this order: Yes, then No. Invalid is added by Statoblast as the third trading and resolution outcome; it is not one of the two origin-pool labels checked by the factory. The factory also records each deployment and exposes paged deployment-history reads for indexers and UIs.

Origin pool validation intentionally lives above Zoltar. Zoltar accepts global questions; Statoblast's factory decides which question shape is eligible for the current security-pool implementation.

Pool-related addresses are deterministic and their lineage identity commits to the origin's immutable initialReportPriorityFeeWeiPerGas. Origins configured with different priority fees therefore cannot share a pool or share-token namespace, while children inherit their origin's configuration. The Operator Reference owns the exact address and registry-key derivations.

An inherited child and a newly created origin may coexist for the same question, multiplier, initial-report priority fee, and universe. This is intentional: their origin IDs, pool addresses, share tokens, collateral ledgers, and migration paths are distinct. A caller selecting a pool therefore selects an origin lineage, not merely a question and universe. Because a fresh origin cannot occupy an inherited lineage’s registry entry, origin deployment does not scan universe ancestors.

Asset FlowThe pool is the accounting hub: ETH backs complete sets, REP backs underwriting, fees accrue to vaults, and child REP can be monetized to repair child collateral after a fork.

Statoblast uses OpenOracle to estimate the value of REP compared to ETH. OpenOracle settles WETH/REP amounts, and the coordinator stores the result as scaled REP per ETH because solvency checks compare REP backing against ETH obligations.

repPerEthPrice = repAmount pricePrecision ethAmount

REP/ETH PricerepPerEthPrice is stored as scaled REP units per ETH, and pricePrecision is the fixed scale factor that keeps REP-side and ETH-side terms in the same integer math units.

Statoblast uses the REP/ETH price to compare REP backing with ETH-denominated obligations. Vault operators choose their security bond allowance. A new allowance must leave the affected vault non-liquidatable, while aggregate pool REP must independently satisfy the same multiplier-adjusted inequality. Only vaults are liquidation targets. BPS_DENOMINATOR = 10_000 converts the stored Statoblast multiplier from basis points.

remainingRepBacking pricePrecision BPS_DENOMINATOR securityBondAllowance statoblastSecurityMultiplierBps repPerEthPrice

Backing Preservation REP withdrawals and escalation deposits preserve the same multiplier-adjusted coverage required when allowance is admitted.

repBacking pricePrecision BPS_DENOMINATOR securityBondAllowance statoblastSecurityMultiplierBps repPerEthPrice

Allowance Admission Setting an allowance cannot make the affected vault immediately liquidatable, and aggregate pool backing must independently clear the same inequality.

securityBondAllowance statoblastSecurityMultiplierBps repPerEthPrice > repBacking pricePrecision BPS_DENOMINATOR

Liquidation Condition The multiplier determines when unsafe allowance becomes liquidable.

Equality at allowance admission is permitted because liquidation uses the strict inverse inequality. Later REP withdrawals and escalation deposits cannot move either the vault or aggregate pool below that multiplier-adjusted boundary while the allowance remains active. All operands are atomic integers: the contract compares the products exactly, while a derived maximum allowance rounds the quotient down. The pool-wide maximum uses that floored aggregate ceiling minus the allowances already assigned to other vaults. Liquidation requires the target to be liquidatable, bounds the transfer, and verifies that the caller remains safe while aggregate allowance is preserved.

Complete Sets

Traders and liquidity providers can mint complete sets by calling createCompleteSet with ETH. For each complete-set unit, the pool mints one Invalid, one Yes, and one No ERC-1155 share through ShareToken. The deposited ETH increases completeSetCollateralAmount.

Fee Extraction and Retention Rate

Complete-set collateral gradually decays into an unallocated fee reserve. Fee-eligible vaults accrue fees in proportion to their assigned security bond allowance. Vault checkpoints turn whole-wei entitlements from that reserve into redeemable vault debt.

The retention rate falls as utilization rises, so security becomes more expensive as open interest consumes underwriting slack.

Retention follows a piecewise heuristic in SecurityPoolUtils.calculateRetentionRate. It starts high, declines linearly until 80% utilization, and then stays at the minimum retention rate. The intent is to charge more aggressively for security as utilization rises and underwriting slack falls.

Read as a user-facing metric, that retention curve becomes the annualized open-interest fee shown in the UI. At zero utilization, the constants imply roughly a 10% yearly fee. Once utilization reaches the 80% dip, the annualized fee is roughly 50% and then stays flat because the on-chain retention rate is already pinned to its minimum. The UI annualizes the rate as annualFee = 1 - (retentionRate / PRICE_PRECISION)^SECONDS_PER_YEAR.

Retention and UtilizationThe chart applies the onchain piecewise retention formula and the UI's annualization formula to the exact current constants. The 80% rule marks the point where the minimum per-second retention rate begins to apply.

When feeEligibleSecurityBondAllowance == 0, the pool sets feeIndexDelta and reserveCredit to zero, clears feeIndexRemainder, leaves collateral unchanged, and advances the accumulator to the clamped current time. This prevents unclaimed auction allowance from earning retroactive fees. The remaining fee-index equations apply only when fee-eligible allowance is positive.

Fee accrual is lazy: state-changing pool operations checkpoint the global fee index, and vault operations checkpoint each vault against that index. Fractional amounts remain in explicit remainders until they accumulate into whole wei, so callers do not need to iterate over every vault when time advances.

Fee accrual is time-clamped. The pool extracts collateral into fees only until the question end time while the universe remains unforked; after the universe forks, the fee accumulator is instead clamped to the fork time. Retention-rate updates no-op outside Operational mode or when the recalculated rate is unchanged. While operational, utilization uses vault-assigned, fee-eligible allowance; zero eligible allowance selects the maximum retention rate. Unclaimed auction allowance therefore cannot change the live fee curve.

A child pool begins a new fee epoch when migration and any truth auction finalize. Only allowance already assigned to a vault enters the fee denominator. Auctioned allowance becomes fee-eligible when the winning bid is claimed, after that vault first checkpoints at the current index. Each delayed claim adds only its newly assigned amount to the live eligible total; it does not reconstruct that total from fork-time migration counters, so intervening allowance changes and liquidations remain intact. Per-vault fractional remainders survive public checkpoints, while whole fees move from the pool reserve into totalFeesOwedToVaults; this keeps aggregate debt equal to redeemable vault balances. The totalAccruedFees() view adds that assigned debt to the unallocated reserve when callers need to reconcile all fee-adjusted collateral.

A fork permanently closes the parent's fee epoch. The pool tracks how much eligible allowance still has not checkpointed the final index. After every eligible vault syncs, any whole reserve wei left solely from aggregating individually sub-wei vault remainders cannot become redeemable, so it returns to complete-set collateral. Until the last checkpoint, that reserve remains protected by totalAccruedFees().

Pool AccountingREP ownership and fee accounting use separate proportional ledgers: ownership tracks REP claims, while the fee index tracks decayed ETH collateral owed to vaults.

poolOwnership = repAmount poolOwnershipDenominator totalRepBalance repAmount = poolOwnership totalRepBalance poolOwnershipDenominator

Pool Ownership ConversionVault REP claims are represented as ownership units against the current pool REP balance and ownership denominator.

Solvency Operations and Liquidation

Withdrawals, allowance changes, and liquidation depend on a fresh REP/ETH price. Liquidation transfers unsafe allowance to a non-liquidatable caller vault and seizes unlocked target REP, so it redistributes backing rather than creating it.

Read how the liquidation works from Liquidation Design.

5. Shares and Complete Sets

#

ShareToken is an ERC-1155 contract. Each complete set mints one Invalid, one Yes, and one No share. The token id encodes the universe id and outcome, making positions fork-aware.

A positive ETH deposit must convert through cashToShares to at least one complete-set unit. If rounding would mint zero shares, createCompleteSet reverts with Exchange rate undefined instead of accepting collateral.

Share LifecycleShares are transferable until redemption or the first fork-claim materialization. Materialization preserves the source balance but locks it against later transfer.

Shares can materialize across forks. ShareToken.migrate preserves a parent-universe token id as a persistent entitlement and mints child-universe token ids for selected valid, non-malformed fork outcomes.

Share MigrationShare migration is not a pro-rata split across selected branches. The source balance remains as a transfer-locked entitlement after first use, and each untouched selected child first materializes the full current balance. Later calls mint only that child's unmaterialized delta.

If none of the selected children has received a source entitlement, the first call materializes the full current source balance in each selected child. On a later call, each child receives only current source balance - amount already materialized. If every selected delta is zero, the call reverts. The canonical guarantees are FORK-10, SHARE-04, and FORK-11.

At the implementation level, redeemShares burns the holder’s full materialized balance of the winning token id and pays the burned amount’s pro-rata share of current collateral, using the pool’s remaining economic claim supply as the denominator. That shareTokenSupply includes materialized ERC-1155 balances and fork-time entitlements that can materialize later. In the healthy case this corresponds to a clean 1:1 redemption outcome against the economic meaning of a complete-set claim, subject to collateral accounting remaining intact through migration and any required auction repair.

cashPayout = burnedWinningShares completeSetCollateralAmount economicClaimSupplyBeforeBurn

Share RedemptionThe remaining economic claim supply reserves collateral for both materialized winners and winning fork entitlements that arrive later.

The important edge case is fork recovery. If a child pool emerges from migration with incomplete collateral, the truth auction sells REP for ETH so the child pool can restore the collateral base needed for clean redemption. If multiple target outcomes are selected during share migration, the holder’s source entitlement remains and its unmaterialized balance is minted into each selected child.

6. Escalation Resolution

#

When a market ends, Statoblast attempts to resolve its outcome by running an Escalation Game based on The Isonzo Front. Participants escrow vault-backed REP behind Invalid, Yes, or No. Each deposit adds to that outcome's cumulative balance; it does not have to outbid the previous deposit or the current leader. The accepted deposit must normally meet the game's starting bond, unless it fills the selected outcome to the non-decision threshold.

The running escalation cost increases with elapsed time, and the median outcome balance determines the scheduled end. After that deadline, a strict balance leader resolves the question. If two outcomes instead reach the non-decision threshold, the game enters local non-decision and Statoblast proceeds to its fork-resolution path. The sections below derive those rules and their economic consequences.

Security assumptions: A01 risk-adjusted incentives, A02 viable operating costs, A10 timely outcome evidence, A03 independent participants, A04 early alarm capital, A13 REP liquidity, A16 timely inclusion, and A06 lifecycle executors.

Why not fork immediately? A fork asks the whole universe to branch, so Statoblast first gives vault-backed REP a local path to settle the question. The rising cost curve makes late disagreement increasingly expensive, while the non-decision threshold keeps the fork path available when competing outcomes remain strongly funded. The Escalation Game system is an optimization, and in theory the system would work without it as well, in a more inefficient manner.

SecurityPoolFactory requires its configured initialEscalationGameDeposit to be at least 1 REP, copies that value into every deployed SecurityPool, and admits a new origin pool only while its live non-decision threshold exceeds the configured bond. An existing pool can outlive that relationship because REP burns reduce the tracked theoretical supply. On the first post-end deposit, the SecurityPool passes its stored bond and the current threshold to EscalationGameFactory. That game factory preserves the bond when possible and otherwise substitutes nonDecisionThreshold - 1. Positive atomic-unit bonds below one whole REP remain valid; a threshold of one atomic unit or less has no positive smaller bond and cannot initialize a game.

requiredEscalationCost ( elapsedEscalationTime ) = startingBondAmount exp ( ln ( nonDecisionThresholdAmount startingBondAmount ) elapsedEscalationTime fullEscalationInterval )

Escalation Cost CurveThe required dispute bond rises exponentially from the starting bond to the non-decision threshold over the full interval.

The plot below is an illustrative normalized instance with ln(nonDecisionThreshold / startingBond) = 2.4. It uses the parameterized curve implemented by totalCost() and computeIterativeAttritionCost: early deposits face the starting bond, while sustained late disagreement approaches the non-decision threshold. The plotted curve is the continuous model; Solidity computes it with fixed-point integer approximation using SCALE = 1e6 and clamps the endpoints. Ratio normalization extracts whole powers of two before approximating the residual logarithm, including exact power-of-two ratios whose residual is zero.

Exponential Cost CurveDelay becomes increasingly expensive without jumping immediately to the non-decision threshold: early disagreement can settle locally, while sustained late disagreement becomes costly enough to justify the non-decision path.

Escalation deposits enter through SecurityPool.depositToEscalationGame. The first valid deposit after question end deploys the game, sets activationTime = block.timestamp + 3 days, and records the game’s starting parameters. Later deposits can continue only while the pool is operational, the game has resumed if it came from a fork continuation, and the child pool is not still waiting for continuation processing.

The security pool wrapper first previews the accepted amount, then removes the corresponding vault REP ownership with round-up accounting, checks the vault and pool remain solvent, enforces the minimum remaining REP rule, and transfers REP into the escalation game from the caller's existing vault position rather than from free-floating wallet REP. If the pool has any active security-bond allowance, the call also requires a fresh REP/ETH oracle price before the deposit can proceed. Inside the game, the proposed amount must be at least startBond. The recorded amount must be positive and either at least startBond or exactly fill the selected outcome to nonDecisionThreshold.

The game rejects invalid targets, full outcomes, and post-non-decision deposits. Accepted deposits are clipped to the selected outcome's remaining room, and the game applies a small tie-avoidance adjustment when a below-threshold deposit would otherwise make two outcomes share the maximum balance.

Escalation Deposit Trace

Step Contract area State or check Why it matters
Preview amount EscalationGame.previewDepositOnOutcome Computes accepted amount, threshold room, and tie adjustment. The submitted maximum is not always the recorded deposit.
Remove vault ownership SecurityPool.depositToEscalationGame Burns pool ownership with round-up accounting and checks solvency. Escalation uses existing vault-backed REP, not free wallet REP.
Transfer REP SecurityPool to EscalationGame Moves accepted REP into local game custody. The game can later settle, export, or carry that locked REP.
Record deposit EscalationGame.recordDepositFromSecurityPool Updates outcome balances, unresolved totals, and deposit indexes. Those indexes are the handles used by later withdrawal and fork paths.
Adjust escalation deposit clipping and tie avoidance

The accepted deposit is capped by remaining room under the non-decision threshold. If a below-threshold deposit would tie the current leading outcome, the game reduces the accepted amount by one atomic REP unit (1 wei of REP precision). In first-deposit mode, outcome balances are fixed at zero and the start-bond slider is the pool's configured bond, copied from SecurityPoolFactory when the pool was deployed. The SecurityPool passes that bond and the current threshold to EscalationGameFactory; when the bond is at or above the live threshold, the game factory uses an effective bond of nonDecisionThreshold - 1 atomic unit. In repeat-deposit mode, the sliders instead represent an existing game's balances and stored parameters; no factory normalization is reapplied.

Room on No10 REP
Effective start bond2 REP
Accepted amount5 REP
Adjustmentaccepted as proposed
Post-deposit conditionNo ends at 5 REP
Adjust escalation resolution edge cases

The resolution helper first checks whether at least two outcomes meet the running cost. If that unresolved test does not apply and all three balances are zero, the helper returns Invalid. Otherwise, a strict Invalid, Yes, or No lead wins. Valid deposits prevent tied maxima below non-decision by reducing the accepted amount by one atomic REP unit, or reverting if that adjusted amount becomes invalid. Continuation snapshots preserve the parent balances exactly, including tied maxima below nonDecisionThreshold, so all selected children begin from the same unresolved state.

Outcomes at or above cost2
Resolution helper returnsNone
Reasontwo outcomes still contest the cost

The contract exposes both directions of this curve: it can compute the required cost from elapsed time, and it can derive the effective end time from the final binding capital. Before activation, totalCost() is zero. In fork-continuation games, elapsed time can be inherited from a parent game and then resume later instead of restarting from zero.

Non-Decision FlowA live unresolved contest is not the same as the stronger non-decision condition. This diagram shows a local threshold crossing, which makes canTriggerOwnFork() true. A pool with an inherited fixed outcome rejects the deposits that could create this state and still rejects activateForkMode().

Payouts depend on final binding capital, the median of the three outcome balances. Winning capital inside the reward-eligible window shares a fixed reward pool; excess winning capital receives principal only.

If time expires without non-decision, the resolution ordering in the interactive example above applies. A local deposit that brings a second outcome to nonDecisionThreshold records nonDecisionState = Local and nonDecisionTimestamp, then makes the game-local canTriggerOwnFork() predicate true. That predicate does not override pool finality: a pool with an inherited fixed outcome rejects new depositToEscalationGame calls before they can create a local non-decision and still rejects activateForkMode(). A fork continuation instead records nonDecisionState = InheritedThresholdTie when its preserved balances already meet that condition, without rebasing balances or fabricating a local timestamp. Both explicit states close further deposits. A continuation with a fixed child outcome follows its remaining clock and settles to that outcome; one without a fixed outcome can open its own fork directly.

For the exact resolution ordering, empty-game fallback, deposit clipping, carry batching, and residual sweep rules, see Escalation Resolution and Deposits.

The median matters because the game is trying to detect whether disagreement remains live across multiple sides, not merely whether one side has accumulated the most stake. binding capital measures the level at which the contest is still jointly sustained by competing outcomes, which is why it drives timeout and payout logic.

Payout RegionsWinning deposits below binding capital and in the safety boundary share rewards, while excess receives principal only.

rewardEligibleCap = bindingCapital + bindingCapital excessRewardWindowDivisor rewardBonusPool = bindingCapital 3 5 burnAmount = rewardEligibleDeposit bindingCapital 2 5 rewardEligiblePrincipal amountToWithdraw = depositAmount + rewardEligibleDeposit rewardBonusPool rewardEligiblePrincipal scaledWithdrawal = amountToWithdraw actualForkThreshold nonDecisionThreshold if forkTime <= escalationGameEndDate and actualForkThreshold < nonDecisionThreshold

Winning PayoutReward-eligible winning principal shares the 60% bonus pool pro rata, while a 40% haircut is charged exactly once. If the escalation itself triggers the universe fork, Zoltar collects that haircut from the aggregate escalation backing; otherwise settlement burns it directly. Low fork thresholds scale the payout down when no fork is recorded or the recorded universe forkTime is at or before the scheduled escalationGameEndDate. When forkTime is strictly later than the scheduled escalationGameEndDate, the withdrawal calculation substitutes the configured nonDecisionThreshold for the actual fork threshold, restoring the unscaled payout schedule for unclaimed winning deposits. Amounts withdrawn earlier are not revisited. All amounts are atomic REP, and every Solidity division floors before the next step.

Example: if final binding capital is 10 REP, the reward-eligible cap is 15 REP, the safety boundary is (10 REP, 15 REP], and the reward pool is 6 REP. If the winning side contributes 15 REP inside that reward-eligible window, each 5 REP deposit receives 7 REP. Winning depth above 15 REP receives principal back with no share of the reward pool.

Settlement uses different calls for local withdrawal, own-fork direct claims, optional parent-lock cleanup, and child proof claims. The distinction matters because local withdrawal settles deposit indexes, while continuation games settle inherited winners by proof and retire inherited losers without a call.

Escalation Settlement Call Matrix

Entry point Used when Claim unit
withdrawFromEscalationGame A local game reaches a final outcome without non-decision and no earlier universe fork interrupted it. This includes the ordinary no-fork lifecycle. Local deposit indexes for one beneficiary vault per call.
claimForkedEscalationDeposits A non-decision fork exists and the vault claims winning parent deposits for a selected outcome. Winning parent deposit indexes; own-fork claims pay the ordinary winning reward in child REP to the vault wallet. The escalation's own fork has already removed the winner haircut from aggregate backing, so the claim does not burn it again.
migrateVaultWithUnresolvedEscalation Optional cleanup after an own or external fork captured unresolved local locks before the game finalized. The affected vault invokes the wrapper for its own parent lock totals. See the operator cleanup reference for ordering, scope, and proof independence.
withdrawForkedEscalationDeposits A child continuation game finalized; only inherited winning deposits are claimable, while inherited losers require no call. Carried-deposit proofs for one beneficiary vault per call.

The pool removes ownership and escrows REP when the user deposits into the local game. Settlement does not re-mint that ownership: a winner receives the ordinary winning payout as wallet REP, while a losing settlement clears escrow without a payout. An own-fork direct claim uses the same winning reward math and releases pre-funded child REP from the selected child's aggregate backing to the vault owner's wallet. It is not a claim-time conversion and does not mint child-pool ownership. Own-fork direct claims must still be submitted before the parent migration window closes.

Caller permissions are intentionally mixed. withdrawFromEscalationGame and withdrawForkedEscalationDeposits are liveness helpers that any caller can submit so long as every proof or deposit index in the batch belongs to the same beneficiary vault. By contrast, claimForkedEscalationDeposits and the optional migrateVaultWithUnresolvedEscalation cleanup require msg.sender to be the affected vault.

External Zoltar forks interrupt the escalation game. This is called continuation. The canonical continuation lifecycle lives in Forks and Migration. This section only distinguishes the settlement entry points and their caller permissions.

Continuation claims use Merkle Mountain Range proofs and nullifier roots. The canonical leaf fields, peak ordering, proof lengths, and replay rules are documented in Merkle Mountain Range carry proofs.

7. Forks and Migration

#

Fork handling spans both layers. Zoltar creates child universes and handles REP splitting. Statoblast separately moves vault state, proportional collateral, and share positions into child pools, while child creation reproduces unresolved escalation state from one canonical snapshot and aggregate backing transfer.

The child-pool selector comes from the universe’s fork question, not from Statoblast’s binary market shape. A binary Statoblast pool can therefore spawn child pools keyed to scalar encodings or multi-way categorical outcomes when the universe fork used a different Zoltar question.

As described by Zoltar's global-question rules, the consequence is universe-wide: an eligible Zoltar fork stops or redirects parent flows for every pool using that universe, even when the fork question is unrelated to a pool.

Security assumptions: A07 fork value preservation, A09 truthful-branch preference, A10 timely outcome evidence, A11 practical migration, A05 lineage access value, A16 timely inclusion, A06 lifecycle executors, and A20 chain-data availability.

State Meaning Typical transition out
Operational Stored state for normal operation outside the explicit fork lifecycle. A late universe fork can still disable globally guarded calls without changing this enum value. Local resolution or fork handling activation.
PoolForked Fork handling was activated for this parent pool, which has stopped normal operation. Child pools begin migration setup.
ForkMigration Child pool receives migrated vaults, REP-derived state, and collateral. Migration window ends.
ForkTruthAuction Truth-auction decision and finalization phase. The child either sells REP when repair is needed or finalizes immediately without a sale. Auction finalization accounts legitimate routed collateral plus accepted bid ETH and activates the child at that level. It rejects explicit caller contribution ETH.

SystemState is primarily a fork-and-migration state machine, not a generic question-resolution state machine. A pool finalized before a late, unrelated universe fork can retain SystemState.Operational. Its isOperational-guarded activity still freezes because that modifier separately checks the universe fork time, while finalized share, REP, and eligible escalation-deposit redemption paths that check only the stored state remain callable.

Fork State MachineWhen fork handling is activated, the parent moves to PoolForked; child pools do migration and optional auction repair. Only a child whose legitimate routed collateral and accepted bid ETH have been accounted returns to operational mode. Finalization rejects explicit contribution ETH, while forced ETH remains unaccounted surplus. A previously finalized pool affected by a late unrelated fork is the separate stored-state case described above.

REP migration and share migration intentionally reproduce a source position into every selected child branch. A share source remains as a transfer-locked entitlement after first use, and each child balance is colored by a distinct universe, so this is not a same-universe double claim. Integrations must nevertheless keep branch balance sheets separate: summing child REP or shares as though all branches were simultaneously redeemable in one economic universe overstates capital.

The migration API is not a single generic “fork migrator” role. Child creation is permissionless, migrateVault always acts on the caller’s own vault, and the unresolved-escalation and own-fork-claim entry points require the affected vault as caller. This matters for off-chain automation because a keeper can help with liveness, but it cannot migrate or claim another vault’s locked REP.

Fork Migration Contract Trace

Step Function State changed Reason for the boundary
Activate fork mode initiateSecurityPoolFork Parent pool enters fork handling and snapshots auctionable REP. Normal pool accounting stops before child migration begins.
Create child branch createChildUniverse Deploys or locates the child universe and child pool. Child pools are lazy because not every branch may be used.
Migrate vault migrateVault Moves caller vault ownership, allowance, and proportional collateral. Only the vault owner can decide which child branch receives its position.
Repair shortfall startTruthAuction, finalizeTruthAuction Sells child REP for ETH and sets auction ownership rates. Repair is optional and bounded by actual child-pool collateral needs.
Resume child pool Forker-controlled pool setters Returns the child to operational mode after migration and auction settlement. The child accounts only routed collateral and accepted bid ETH; donations are rejected.

Pool Migration FlowThe Zoltar fork and Statoblast pool migration are related, but they are not the same contract step.

Migration Proxy Identity

Statoblast does not send every pool migration call to Zoltar directly from the forker. Instead, SecurityPoolForker lazily deploys one deterministic SecurityPoolMigrationProxy per parent pool. That proxy is the stable msg.sender for Zoltar's migration ledger, so one parent pool has one predictable migration identity across lockRep, forkUniverse, splitToChild, and child REP sweeping.

The address is predictable, but prefunding it does not create pool migration credit. Fork accounting measures REP newly routed through the proxy and Zoltar’s migration ledger; any ERC-20 balance already at the address remains isolated surplus and is not swept into a child on the pool’s behalf.

Migration ProxyThe proxy is a thin adapter, but it is economically important because Zoltar accounts migration balances by caller.

Every selected continuation receives the complete parent game snapshot. It also receives the applicable aggregate backing once: complete game REP for an unrelated fork, or post-haircut game REP when the escalation paid for its own fork. A winning carry proof authorizes its own claim and pays the authenticated depositor. The child resumes when its pool becomes operational; it does not wait for vault migration or cleanup calls, but its aggregate funding gate must pass.

During vault migration, the forker also ensures the child pool is backed by enough child-universe REP for the cumulative migrated REP credited to that child. It tracks how much REP has already been split for each parent-pool/outcome pair and only splits the shortfall before sweeping child REP into the child pool. The migration-proxy and child-backing guardrails are collected in Fork Migration .

Proportional MigrationVault migration normally floors each ownership-based REP delta. The migration that completes a child's ownership reconciles every remaining REP unit, and cumulative routed REP sets the collateral target.

migrationRepDenominatorAtFork = { vaultRepAtFork if ownFork auctionableRepAtFork otherwise provisionalMigratedRepDelta = parentPoolOwnership migrationRepDenominatorAtFork parentPoolOwnershipDenominator migratedRepDelta = { migrationRepDenominatorAtFork priorMigratedRep if resultingMigratedPoolOwnership = parentPoolOwnershipDenominator provisionalMigratedRepDelta otherwise

Fork Migration ProportionUnlocked vault migration normally floors the parent ownership share against the REP bucket that backs collateral for that fork type. The migration that completes the parent ownership denominator receives the exact remaining REP delta.

The equation above gives the provisional ownership proportion. The forker also tracks cumulative migrated parent ownership independently for every child. When that cumulative value reaches the complete parent denominator, the final migration receives every REP unit left in the fork bucket. Both external and own-fork transfers use one fixed, fee-exclusive fork snapshot plus cumulative ceiling accounting, so complete ownership migration transfers the complete REP and collateral snapshots without manufacturing an auction shortfall from individual REP rounding. An external fork is already known when activateForkMode checkpoints and records that snapshot. The own-fork snapshot uses this order: activateForkMode changes the pool state and checkpoints through the pre-fork fee horizon; the proxy creates the universe fork; a fork-time checkpoint covers the newly exposed question-end-to-fork interval at the retained operational rate; then collateralAtFork records the resulting fee-exclusive collateral in the fork-neutral snapshot shared by both paths. Truth-auction repair subtracts the child's actual cumulative routed collateral from that snapshot to set the missing collateral as its ETH raise target; actual repair still depends on auction demand, clearing, and tick-level integer rounding. Before either migration path clears the parent allowance, it also checkpoints the vault's earned fees. Each ETH transfer subtracts from parent complete-set collateral and is limited to the pool balance above totalAccruedFees(), keeping both the unallocated reserve and assigned vault debt funded in the parent.

cumulativeCollateralTargetAfterMigration = parentCollateralAtFork cumulativeRepTransferredAfterMigration migrationRepDenominatorAtFork requestedCollateralDelta = cumulativeCollateralTargetAfterMigration - cumulativeCollateralAlreadyTransferred actualCollateralDelta =min(requestedCollateralDelta,parentCompleteSetCollateral)

Fork Collateral CeilingThe forker recomputes the cumulative collateral target after the migration, subtracts cumulative collateral already transferred, and sends only the portion that does not back accrued parent fees.

Own-fork migration has one extra accounting split. The pool and its active escalation game both contribute REP to the fork, but the child-universe REP returning from Zoltar is a single auctionable migration balance. Statoblast splits that balance into a vault bucket and an escalation bucket before child migration resumes.

Own-Fork REP BucketsIn an own fork, the drained escalation-game REP pays the fork haircut and the remainder becomes aggregate child backing. Ordinary pool REP forms the vault bucket without a haircut.

forkHaircut = forkThresholdforkBurnDivisor escalationChildRepAtFork = escalationRepToFork - forkHaircut vaultRepAtFork = auctionableRepAtFork - escalationChildRepAtFork selectedChildEscalationBacking = escalationChildRepAtFork

Own-Fork Bucket AllocationThe escalation bucket pays the configured fork haircut exactly once. The vault bucket preserves ordinary pool REP 1:1, and each selected child receives the same post-haircut aggregate escalation backing once.

When a pool forks while its escalation game is unresolved, the parent forker snapshots the unresolved game’s startBond, nonDecisionThreshold, elapsed escalation time, actual per-outcome balances, carry totals, peaks, leaf counts, and nullifier roots. External unrelated forks reserve the drained game's complete REP at 1:1. The escalation's own fork reserves it after the winner haircut has been paid through Zoltar. Each selected child pool can initialize its own paused fork-continuation escalation game from that canonical snapshot and receives the complete aggregate game backing once. The continuation preserves the parent live Invalid, Yes, and No balances, each unresolved deposit’s original outcome, stable parent deposit index, and payout ordering. The authenticated winning proof is the claim authorization; it pays the recorded depositor directly from aggregate backing without a preceding vault migration.

The continuation game remains paused during the migration window so child deployment and vault migration do not silently consume escalation time. While the child pool is waiting for continuation processing, SecurityPool.depositToEscalationGame rejects new live child deposits through the awaitingForkContinuation guard. Operational activation clears that guard without waiting for parent-vault transactions. Before the remaining clock can start, resumeFromFork verifies aggregate REP funding. An unrelated fork must cover effective unresolved principal one-to-one. When the escalation's own fork already paid the winner haircut through Zoltar, its recorded initial backing must cover at least sourcePrincipalAtFork - ⌊sourcePrincipalAtFork / 5⌋. The game's live balance must cover that initial backing minus child REP already exported by valid direct claims before resume. An underfunded child therefore remains paused instead of reaching a resolution it cannot pay. An inactive vault cannot make other users pay to process its position or delay a fully funded child continuation.

In that formula, sourcePrincipalAtFork is the aggregate raw unresolved principal installed in the continuation's fork snapshot: the sum across outcomes of stored inheritedUnresolvedTotal and localUnresolvedTotal before effective direct-claim deductions. It is not the post-claim effective carry total or the child game's current REP balance.

  1. The parent pool forks, stores canonical unresolved escalation state, and locks the game's aggregate physical REP once.
  2. Each selected child pool is created in a child universe and marks itself as awaiting fork continuation.
  3. Each created child initializes a paused continuation escalation game from that snapshot and receives the full aggregate escalation backing once.
  4. After the migration window and any required truth auction, the child pool becomes operational, clears the wait marker, and resumes the paused continuation game only after its aggregate REP funding check passes.

A continuation pool can fork again only when it has no inherited fixed outcome. Within that pool-level boundary, its game can become eligible by inheriting a threshold tie at snapshot initialization or by recording a local non-decision after resuming. The game-local canTriggerOwnFork() predicate returns true for a local non-decision, but it does not bypass the pool's fixed-outcome guard. When both levels are eligible, the forker stores the game's current balances, carry totals, peaks, leaf counts, and current nullifier roots after any prior proof consumption. It drains and locks the remaining aggregate REP once. Each selected grandchild receives that same canonical snapshot and full remaining backing once; winning proofs remain their own authorization. Escalation can therefore branch recursively with Zoltar universes without replaying spent proofs or requiring other vaults to migrate. Before consuming a carried proof, the forker derives a stable global deposit id as keccak256(abi.encode(securityPoolFactory, originId, uint8(outcomeIndex), parentDepositIndex)). A direct claim recorded anywhere in that factory-scoped origin lineage therefore blocks the corresponding descendant proof with one mapping lookup.

Recursive continuation adds another descendant branch to the migration lifecycle described here. The normative recursive-fork gas-bound requirement, current enforcement status, and evidence are maintained in EXT-05. Total historical data and offchain proof coordination can still grow as more forks occur.

For example, suppose Zoltar has two ended questions: “Did London record a temperature of at least 30 °C on August 1, 2030?” and “Did the Atlas protocol upgrade activate by July 1, 2031?” A security pool in the Genesis universe is still escalating the London-temperature question. Before that escalation resolves, a caller invokes Zoltar.forkUniverse with the unrelated, already ended Atlas-upgrade question, causing Zoltar to fork the Genesis universe. Each resulting child universe represents one possible answer to the Atlas-upgrade question. The pool's unresolved London-temperature escalation migrates into selected child universes as separate paused continuation games, one in each selected child universe. After a continuation resumes, it still disputes the London-temperature question. Because the unrelated fork did not give the continuation pool a fixed outcome, an inherited threshold tie or a later local non-decision lets a caller invoke the security-pool fork path, causing Zoltar to fork that child universe again. The first fork therefore creates branches for the possible answers to the unrelated Atlas-upgrade question; the recursive fork creates branches for the possible answers to the pool's original London-temperature question.

Recursive ContinuationEach child continuation game receives the same canonical proof snapshot and aggregate backing. Winning proofs remain claimable without vault migration. Only a child pool without a fixed outcome can export the carry into another fork generation; within that boundary, a local non-decision or inherited threshold tie makes its game eligible.

Recursive AccountingThe next canonical snapshot and aggregate backing move once per selected child. At final resolution, a winning proof authenticates and pays its depositor; inherited losing principal retires without proof transactions.

The inherited-carry baseline is implemented with Merkle Mountain Range peaks and nullifier roots so a child game can consume proofs without replaying already-spent parent deposits. New child deposits are tracked separately as local carry. Proof settlement is per requested winning leaf, not a depositor-wide loop. Immutable peaks and leaves remain the proof commitment even if separate parent cleanup occurs.

A carried proof's source principal authenticates the leaf and decrements inherited unresolved principal. Normal winning-payout math then pays from the aggregate child backing, so a reward may exceed the proof principal without per-vault scaling. Direct parent claims reduce effective inherited principal by outcome and remain blocked from a second payout in every descendant. Once the final winner's proofs are consumed, inherited losers have retired, local deposits are settled, and no local escrow remains, residual REP can be swept back to the security pool.

Recursive Continuation Example

Step Example state What carries forward
Parent fork In this external-fork example, source REP converts to child REP one-for-one. A parent game has 12 REP unresolved on Yes and 8 REP unresolved on No. The fork snapshot preserves both original outcomes and parent deposit indexes; the one-for-one conversion makes the child backing 20 REP.
Child continuation The preferred child receives the complete 20 REP aggregate backing once and resumes with the inherited carry. Winning inherited proofs authorize themselves and pay their recorded depositors; new deposits are tracked as local child state.
New local activity After resume, users add 5 REP to Invalid and 7 REP to Yes. The next snapshot combines inherited carry, local carry, and spent-proof nullifiers.
Second fork This unrelated continuation has no fixed outcome and did not inherit a threshold tie. When new activity records a local non-decision, canTriggerOwnFork() becomes true. The same predicate also accepts an inherited threshold tie without a fixed outcome. The forker stores the current carry state and nullifier roots and locks the remaining aggregate REP; each selected grandchild receives the full remaining backing once; winning proofs need no vault migration there.

Child Outcome Resolution

Child pools resolve outcomes through the forker. When the parent universe forks on the pool's question, each child stores its selected Zoltar outcome index as the fixed result, whether the fork began through the pool-specific path or a direct Zoltar call. The pool stores and reports that result from child creation, and it is final for that pool. Pool asset redemptions begin after the child becomes operational. When a continuation game exists, it uses the same result for carried-deposit settlement only after its remaining continuation deadline. Later universe forks cannot transition a pool with an inherited fixed result, even when they reuse the pool question. A child created by an unrelated fork without an inherited fixed result uses a local escalation result only if that escalation ended before the universe forked; otherwise it remains unresolved until continuation or later state produces an outcome. The ownFork flag changes accounting, not question semantics.

This finality is also a collateral-accounting boundary. Winning-share redemption burns only the fixed winning token and reduces the pool's remaining economic claim supply. A later fork must not reclassify a surviving sibling outcome token as winning against that reduced denominator.

The same boundary closes new local escalation deposits. A fixed-outcome pool cannot use another fork to export a local non-decision, while local settlement rejects deposits after non-decision. Accepting new REP in that state would therefore lock the depositor's vault ownership and block REP redemption. Carried winning proofs from the parent continuation remain claimable through their separate withdrawal path.

System Decision FlowThe main path is simple, but the unresolved continuation loop matters: a child without a fixed outcome can become the parent of the next fork generation. A fixed-outcome child settles without re-entering the loop.

ethCollateralToBuy = max ( 0 , parentCollateralAtFork - forkCollateralReceived )

Auction ShortfallThe truth auction targets the exact parent snapshot not already received by the child. forkCollateralReceived sums actual routed transfers after cumulative-ceiling calculation and the parent’s available-collateral cap; nominal migrated REP is not substituted.

Adjust child collateral repair

In this example, the parent obligations still require 50 ETH of collateral and the child actually received 47.5 ETH through routed, capped migration transfers. That leaves an exact 2.5 ETH shortfall before any repair auction raises more ETH. After the deadline, the child activates with the collateral actually migrated and raised; finalizer contribution ETH is rejected. Each child branch is sized against its own received collateral and remaining shortfall.

Routed collateral received47.50 ETH
Initial shortfall2.50 ETH
Unfilled target after auction0.00 ETH
Activation behaviorno contribution required

8. Truth Auction

#

Security assumptions: A01 bidder incentives, A02 viable operating costs, A03 independent demand, A12 efficient REP conversion, A13 REP liquidity, A16 timely inclusion, A06 lifecycle executors, A20 bid-data availability, A25 safe immutable parameters, and A22 native-ETH recipient compatibility.

After the parent migration window ends, a child pool may still hold less ETH than users need for clean redemption. The truth auction sells child-universe REP for ETH to repair that gap, subject to both an ETH raise cap and a maximum REP sale cap.

The repair target is the contract’s direct statement of the collateral gap: parentCollateralAtFork minus forkCollateralReceived, floored at zero. The received counter records actual cumulative-ceiling transfers after the parent’s available-collateral cap, so nominal migrated REP cannot overstate child funding. The auction start gate is tied to the parent pool’s fork timestamp plus the eight-week migration window, not to any child-universe fork time. If migrated REP has reached the pool-auctionable baseline, or if that baseline is zero, the child pool can finalize this phase without running the division path or selling REP. For an own fork that baseline is vaultRepAtFork; for an external fork it is auctionableRepAtFork.

The REP sale cap is deliberately not just “all remaining REP.” The forker computes the auctionable pool REP baseline, subtracts a tiny floor-rounded haircut tied to the REP that already migrated, and gives the auction that maximum inventory. For an own fork, poolAuctionableRepAtFork means only the vault REP bucket, so the separate own-fork escalation REP bucket is not sold in the truth auction. For an external fork, it means the parent pool’s full auctionable REP at fork.

migratedRepHaircut = migratedRep MAX_AUCTION_VAULT_HAIRCUT_DIVISOR maxRepBeingSold = 0 if migratedRepHaircut >= poolAuctionableRepAtFork poolAuctionableRepAtFork - migratedRepHaircut otherwise

Auction REP Sale CapThe truth auction sells at most the auctionable REP baseline minus a small migrated-REP haircut, with Solidity integer division applying the floor rounding.

Truth Auction Balance SheetThe auction repairs a child pool by trading part of that child universe’s scarce REP for ETH. The child becomes operational after migration collateral and accepted auction proceeds are accounted, even when weak demand leaves the original target partly unfilled.

The forker tracks collateral received through migration and the auction separately from the child contract's raw ETH balance. ETH forced into the child does not count toward the repair target. After the deadline, value-free finalization activates the child with migrated collateral plus accepted auction ETH and releases every bid to settlement. Nonzero finalizer ETH is rejected.

Auction winners become the responsible child-pool owners only when their claims attach ownership and allowance to bidder vaults. Recipient behavior cannot roll back that accounting transition. The Truth Auction settlement specification owns the exact zero-migration ownership conversion, allowance activation, and failed-refund recovery rules.

Clearing and Settlement

The Truth Auction design owns tick pricing, cap selection, underfunded qualification, and the interactive examples; its settlement section owns allocation rounding and recovery behavior. The security model separately states efficient REP-to-ETH auction conversion as an explicit assumption.

9. REP/ETH Price Oracle

#

Security assumptions: A01 arbitrage incentives, A02 viable operating costs, A13 REP liquidity, A16 timely inclusion, A17 corrector capability, A18 independent correction incentive, A19 observable correctable price, A06 settlement executors, and A20 report-state availability.

The REP/ETH oracle is narrow in purpose. OpenOraclePriceCoordinator uses OpenOracle to obtain a fresh REP/ETH price for liquidation, REP withdrawal, and bond-allowance updates. A stale price also blocks depositToEscalationGame whenever the pool still has active security-bond allowance. It is not the oracle for question truth; escalation and, if necessary, Zoltar forks handle that path.

The OpenOracle path is contestable before the coordinator can use it: the sponsor funds the request, the coordinator atomically posts the initial token amounts and becomes the onchain reporter, disputers can replace a bad report with the contract-required replacement amounts strictly before the settlement deadline, and a settler can finalize the report at or after that deadline. OpenOracle credits the final position to the final reporter. Its callback supplies the accepted amounts to the coordinator, which withdraws only its own internal WETH/REP balances back to the sponsor. Request, dispute, settlement, callback safety, and recovery details are maintained in the dedicated OpenOracle integration guide.

If the last price is stale, solvency-sensitive operations can be queued until a valid report is settled. The coordinator then replays the pending operation against the fresh price. Escalation deposits are the exception: they require a fresh price when bond allowance is outstanding, but they revert instead of entering the staged callback queue. This price path is only for security backing against ETH collateral.

REP/ETH Oracle FlowThe coordinator is a queue plus cache. A fresh price can execute immediately; a stale price moves operations into a pending-settlement path whose callback batch is capped at four operations but whose duration is unbounded under paid rolling disputes.

10. Assumptions and Security Model

#

The Protocol Security Model defines assumptions A01–A28 and the guarantees deliberately excluded from the protocol model.

Primary economic assumptions: A07 fork value preservation, A08 REP valuation, A09 truthful-branch preference, A12 truth-auction demand, A14 REP economic backing, and A05 lineage access value.

Zoltar creates child universes, while Statoblast carries underwriting state, collateral accounting, and outcome-share claims into child pools. REP migration, proportional collateral migration, and truth-auction repair can rebuild usable market state, but none of those mechanisms independently identifies truth or guarantees full collateral repair.

11. Parameter Sources

#

Security assumption: A25 safe immutable parameters.

Parameter familyCanonical source
Universe fork thresholds and haircutsZoltar fork economics
Escalation timing, thresholds, and rewardsEscalation Game
Migration and truth-auction timing and boundsTruth Auction lifecycle
Liquidation constants and solvency limitsLiquidation penalty math
REP/ETH coordinator and OpenOracle valuesOpenOracle parameters
Carry-proof peak and nullifier boundsMerkle Mountain Range bounds

12. Implementation Constraints

#