Skip to main content

What Is Signals v1

Signals v1 is an on-chain prediction market protocol for continuous outcomes. Instead of forcing questions into yes/no buckets, it represents outcomes on a finite tick grid and lets traders buy ranges on that grid. A shared CLMSR curve prices every range, and markets settle once per day with explicit on-chain finality.

Signals v1 treats a continuous outcome as something that can be traded only if two contracts are fixed up front:

  1. A settlement contract: a deterministic mapping from real-world values to a finite tick grid.
  2. A pricing contract: a single global curve that assigns a coherent price to every tick and every contiguous range.

Most of the protocol follows from those two contracts. The grid makes settlement objective and removes interpretive edge cases. The curve makes liquidity shared across ranges and makes trade cost depend only on state transitions.

Core objects

Signals v1 can be read as four primitives that show up in every market:

  • Outcome grid: a domain [L,U)[L, U) divided into ticks of size ss.
  • Range position: a half-open interval [lowerTick,upperTick)[\text{lowerTick}, \text{upperTick}) with a quantity.
  • Shared curve: one CLMSR state qq that prices every tick and every range.
  • Daily finality: a daily settlement tick that locks payouts and opens claims after a delay.

The outcome grid

Every market declares bounds LL and UU and a spacing ss. These values define a finite set of ticks. An observed value xx maps to a tick by clamping and flooring:

tick(x)=clamp ⁣(xLs,0,n1)\text{tick}(x) = \mathrm{clamp}\!\left(\left\lfloor\frac{x - L}{s}\right\rfloor, 0, n-1\right)

This rule has two implications that show up repeatedly in edge cases:

  • Out of range: values below LL map to tick 0; values at or above UU map to tick n1n-1.
  • Boundary semantics: adjacent ticks partition the domain; no two ticks claim the same value.

The protocol does not attempt to settle on an infinitely precise number. It settles on a tick index.

Range positions

The traded instrument is a range on the grid. A position specifies:

  • a market ID
  • a range [lowerTick,upperTick)[\text{lowerTick}, \text{upperTick})
  • a quantity xx

After settlement, payout is binary over the interval:

Payout={x,τ[lowerTick,upperTick)0,otherwise\text{Payout} = \begin{cases} x, & \tau \in [\text{lowerTick}, \text{upperTick}) \\ 0, & \text{otherwise} \end{cases}

Half-open intervals remove boundary overlap. Two adjacent ranges tile the grid without paying twice on the boundary tick.

Positions are composable. A wider view is a wider range. A more peaked view can be represented as multiple overlapping or adjacent ranges with different quantities. The protocol does not need bespoke instruments for each belief shape.

This composability is easiest to see by treating each tick interval as a basis instrument. If the grid ticks are (τ0,τ1,,τn1)(\tau_0,\tau_1,\dots,\tau_{n-1}), then the half-open intervals [τi,τi+1)[\tau_i,\tau_{i+1}) form a disjoint partition of the domain. A general "histogram payout" can be written as a sum of basis ranges:

i=0n2xi1[τi,τi+1)\sum_{i=0}^{n-2} x_i\,\mathbf{1}_{[\tau_i,\tau_{i+1})}

where xix_i is the payout size assigned to that tick interval. Signals v1 does not implement bespoke payoff functions directly; it implements a small range instrument, and composition is done by holding multiple positions.

Even without using the unit intervals, a small number of overlapping ranges can produce a wide class of shapes. A broad range can express a coarse view, and a narrow range layered on top can express a local concentration. The resulting payout is the sum of the ranges' binary payoffs at the finalized settlement tick.

One curve for every range

Signals v1 does not maintain separate pools per range. One CLMSR curve maintains a pricing state qq over ticks, and every trade updates that same state.

Tick prices form a normalized distribution:

ipi(q)=1\sum_i p_i(q) = 1

The price mass of a range is the sum of tick prices in that range:

p(R;q)=iRpi(q)p(R; q) = \sum_{i \in R} p_i(q)

The cost of buying a range is the change in the CLMSR potential. For quantity xx on range RR:

baseCost(x;q,R)=C(q+x1R)C(q)\text{baseCost}(x; q, R) = C(q + x \mathbf{1}_R) - C(q)

where 1R\mathbf{1}_R is the indicator vector for ticks inside RR.

This is the mechanism-level version of "shared liquidity": the same qq prices a narrow range and a wide range, so all ranges inherit liquidity from the same state. Precision is priced as concentration on the shared curve, not as a separate pool.

The curve also implies a consistency property that is easy to state at a high level: fee-free cashflow depends only on state changes. If a sequence of trades moves the market through states q0q1qkq_0 \to q_1 \to \dots \to q_k, then the fee-free cashflow telescopes:

j=0k1(C(qj+1)C(qj))=C(qk)C(q0)\sum_{j=0}^{k-1} \bigl(C(q_{j+1}) - C(q_j)\bigr) = C(q_k) - C(q_0)

This is the mechanism reason trade splitting does not change the base cost at a fixed final state.

Trading geometry

Execution in Signals v1 is shaped by two explicit degrees of freedom:

  • Range width: narrower ranges concentrate mass on fewer ticks.
  • Trade size: larger size pushes the shared state further.

Depth α\alpha scales how sensitive prices are to trades. Higher depth compresses price impact for a given state update. Lower depth makes the same update move prices further along the curve.

Fees are applied after base pricing as an overlay. This yields two comparable quantities for any trade:

  • Base price: implied by the curve via the cost-function difference.
  • Effective price: base plus fee on buys, base minus fee on sells.

The difference between quoted range price and executed average price is slippage from moving the shared curve. Fees are a separate policy layer on top of that.

A concrete sketch

Consider a market whose domain is [50,000,70,000)[50{,}000, 70{,}000) with spacing 100100. The range [60,000,62,000)[60{,}000, 62{,}000) spans 20 ticks. A buy on that range increases the weights of those ticks relative to the rest of the grid. That increases the range's price mass and makes subsequent buys on that range more expensive.

Because the curve is shared, a concentrated buy on a narrow range also changes the state used to price nearby ranges. The market encodes information as a global state update.

Settlement and claims

Markets do not settle continuously. Settlement is a daily finality step that selects one settlement tick and locks payouts to that tick.

Settlement uses a signed pull oracle:

  • Signed data is produced off-chain and carried on-chain by any submitter during the sample window.
  • The protocol selects a candidate sample using a deterministic closest-to-TT rule.
  • Finalization is an explicit transaction gated by a time window and an authorization layer.
  • Claims open only after finalization and a claim delay.

The timeline is expressed by three parameters around the settlement timestamp TT:

Δclaim=Δsettle+Δops\Delta_\text{claim} = \Delta_\text{settle} + \Delta_\text{ops}

where Δsettle\Delta_\text{settle} is the sample window and Δops\Delta_\text{ops} is the decision window. Claims open at T+ΔclaimT + \Delta_\text{claim} once settlement is finalized.

Settlement finality writes two objects that are easy to reason about:

  • settlementValue: a fixed-point value derived from the oracle feed.
  • settlementTick τ\tau: the grid-aligned tick obtained by clamping and aligning settlementValue to tickSpacing.

Payouts are defined purely in terms of τ\tau and the half-open interval convention. The claim gate is time-based, but it is also conditional on the finalization transaction being mined. Even if the claim-open timestamp has passed, claims remain closed until the market has been finalized on-chain.

This daily structure turns settlement into a protocol event rather than a social process. Trading ends before finality. Finality fixes one tick. Claims pay out on the fixed tick and the half-open payout rule.

Binary markets as a special case

Binary markets can be represented on the same grid by choosing a domain that has only two meaningful regions. Signals v1 keeps the same instrument and the same curve, but allows the domain to have more structure. A range on a continuous grid is still a binary payout rule over "in the range" and "out of the range"; the difference is that the range can move across a finer settlement surface.

Reference: