Solvency Guarantees
The most important property of MarkIt is that the contract can always pay every winner in full. This is not a soft promise — it's a hard invariant enforced by the smart contract on every single state change.
The Invariant
After every transaction that changes state, the contract enforces:
USDC held by contract ≥ max(total YES liability, total NO liability)In plain English: the contract always holds enough USDC to cover the worst-case payout. Since only one side wins, the worst case is whichever side would cost more to pay out. The contract guarantees it always has at least that much.
Why This Matters
No Underfunded Payouts
When a market resolves, winning token holders are guaranteed to receive 1.00 USDC per token. The USDC is already in the contract — it was collected from traders taking positions and from LP deposits. There is no scenario where the contract doesn't have enough to pay.
No Bank Runs
Because withdrawals only happen after resolution and the USDC is already locked in the contract, there is no "race to withdraw" dynamic. Every participant gets their full entitlement regardless of withdrawal order.
No External Bailouts
MarkIt does not rely on a treasury, insurance fund, or any external capital to cover payouts. Each market is fully self-contained. The USDC in the contract is the USDC available for payouts — nothing more, nothing less.
How It's Enforced
On Every Position
When a trader takes a position, the contract:
Accepts the USDC and mints outcome tokens
Updates the YES and NO liabilities
Checks the solvency invariant against the actual USDC balance of the contract
If the invariant would be violated, the transaction reverts — the position is rejected
This means it is impossible to place a position that would make the contract insolvent. The check uses the real on-chain USDC balance, not a shadow variable, so it cannot be tricked by accounting bugs.
Dynamic Skew Cap
In addition to the core solvency check, a dynamic skew cap prevents extreme imbalance:
This rejects positions that would create extreme one-sided exposure even if the absolute solvency invariant would still hold. It provides an additional safety margin.
LP Withdrawal Protection
When LPs withdraw after resolution, the contract first reserves USDC for all unredeemed winning tokens. LPs can only withdraw from the remaining pool. This ensures that LP withdrawals never reduce the contract's ability to pay winners, regardless of withdrawal ordering.
What the Invariant Does NOT Protect Against
The solvency invariant guarantees that winners get paid. It does not protect against:
Smart contract bugs — If the contract logic itself has a vulnerability, the invariant check could theoretically be bypassed. This is mitigated through testing and security review, but no code is provably bug-free.
Operator misbehavior — If the operator resolves a market with the wrong outcome, the wrong side gets paid. The contract enforces the resolution it's given, not the "correct" real-world outcome.
LP losses — The invariant ensures winners are paid, but it doesn't guarantee LPs profit. In heavily one-sided markets, LP returns may be reduced.
The solvency invariant is checked using USDC.balanceOf(address(this)) — the actual on-chain balance. This means even if someone directly transfers USDC to the contract (outside of normal operations), the extra USDC strengthens the invariant rather than creating accounting issues.
Last updated