All Insights05 / Market Structure · 7 min read

Eliminating Legging Risk on Sub-Second EVM Orderbooks

How we engineered Divergence Router on Somnia (<380ms block finality) to execute dual-leg relative-value binary trades atomically with PostOnly-to-IOC failover.

01. The Legging Trap in Decentralized Prediction & Binary Markets

Traders frequently want to express relative-value views rather than pure directional bets: for example, going Long BTC UP while simultaneously going Long ETH DOWN over a 15-minute window, or trading a calendar term-structure inversion between 15-minute and 1-hour pools.

On traditional decentralized CLOBs, executing that thesis requires signing two separate transactions across two different pools. If Pool A fills at your target price but Pool B experiences a sudden liquidity vacuum or spread jump 400 milliseconds later, your second transaction reverts. You are now stranded holding unhedged directional exposure on Leg A.

02. Atomic Dual-Leg Execution with Full EVM Rollback

When we built Divergence Router on Somnia Shannon (Chain ID 50312) for the DreamDEX CLOB, we engineered DivergenceRouter.sol as a stateless, non-custodial atomic execution proxy. When a trader submits a 50/50 divergence split via openSplit(), the contract pulls tUSDC collateral once and routes both complete-set mints sequentially inside a single EVM transaction.

Crucially, the contract enforces a strict post-mint slippage invariant on both legs. If starved liquidity in either the BTC pool or the ETH pool causes the received ERC-6909 outcome shares to fall below minFillAmount, the router reverts with InsufficientFill and unwinds the entire transaction, returning 100% of the trader’s tUSDC with zero orphan exposure.

DIVERGENCEROUTER.SOL // ATOMIC DUAL-LEG SLIPPAGE GUARDSOURCE
function openSplit(
    PoolKey calldata legAPool,
    PoolKey calldata legBPool,
    uint256 totalCollateral,
    uint256 minFillLegA,
    uint256 minFillLegB
) external nonReentrant returns (uint256 sharesA, uint256 sharesB) {
    uint256 halfCollateral = totalCollateral / 2;
    tUSDC.transferFrom(msg.sender, address(this), totalCollateral);

    sharesA = dreamDex.mintOutcome(legAPool, halfCollateral, msg.sender);
    if (sharesA < minFillLegA) revert InsufficientFill(0, sharesA, minFillLegA);

    sharesB = dreamDex.mintOutcome(legBPool, totalCollateral - halfCollateral, msg.sender);
    if (sharesB < minFillLegB) revert InsufficientFill(1, sharesB, minFillLegB);
}

03. Pairing Sub-380ms Finality with a 3-Tier Regime HUD

Somnia’s sub-second block times (<380ms) unlocked a completely new class of client-side middleware. Using Viem v2 WebSocket subscriptions, Divergence Router continuously computes a real-time price divergence scalar D_t between DreamDEX pool depth and benchmark index feeds.

In Equilibrium (D_t <= 0.50%), orders route as passive PostOnly makers to capture fee rebates. In Managed Dislocation (0.50% < D_t <= 3.00%), our state machine intercepts potential PostOnlyWouldCross reverts and transitions seamlessly to bounded Immediate-or-Cancel (IOC) execution. And if dislocation exceeds 3.00%, the terminal triggers an automatic circuit-breaker halt before the user can sign into a toxic spread.