Documentation

Pricing & allocation

Acquisition pricing follows the cheap positions people usually receive, while Chainlink VRF and live-pool selection keep allocation fair.

An acquisition costs roughly the average value of the position you might receive, plus a small acquisition surcharge, the protocol markup (10% by default). Because the lightly-backed positions are the ones you almost always receive, the price tracks them, while the rare highest-backed positions barely move it1.

  • Pools of cheap positions stay cheap to acquire from, even with a few richly-backed positions in them, since those are selected so rarely they barely move the price. You get frequent, low-cost acquisitions and a high-backed position to chase at once.
  • The price is honest. You pay about what an acquisition is worth, plus the set surcharge, with no hidden markup.

You're quoted the pool acquisition fee plus the Chainlink VRF fee; the VRF fee is paid straight to Chainlink, so an acquisition never touches anyone's backing. Any overpayment is refunded in the same transaction, and you can set optional limits2 so the acquisition reverts if the pool shifts against you between the quote and the purchase.

Randomness comes from Chainlink VRF3. You fund the random-number request yourself, and your acquisition fee is held in escrow until the result lands. When the number arrives, it's mapped onto a position through the Fenwick tree, which keeps the selection fast and cheap no matter how many positions the pool holds4. The selection runs against the live pool at the moment the number lands, using current state instead of a snapshot from when you requested it, so it stays valid as deposits, withdrawals, and other acquisitions happen alongside it. Many acquisitions can resolve at the same time.

When an acquisition can't settle cleanly:

  • Empty pool. If every position left before your number arrived, your escrowed fee is refunded.
  • Price drift. If another acquisition shifted the price too far in the meantime, yours is refunded rather than settled at a stale price.
  • Stuck request. If the random number never arrives in time, anyone can cancel the acquisition and refund the fee. An acquisition can never be both refunded and settled.

Technical breakdownonchain

  1. 1.
    Expected value is weightedBackingTotal / totalWeight, which, because weights are inverse to backing, equals the harmonic mean of all backings (dominated by the cheapest positions). The fee is acquisitionFee = EV · (BPS + surchargeBps) / BPS with surchargeBps = 1000 (10%), exposed by the acquisitionFee() view.
  2. 2.
    A request accepts optional maxAcquisitionFee and minWeightedValue bounds (0 disables each). Separately, a selection-time guard of selectionSlippageBps = 500 (5%) refunds the acquisition if the live fee has drifted too far from what was escrowed.
  3. 3.
    Chainlink VRF 2.5 in native-payment (direct-funding) mode, via VRFV2PlusWrapperConsumerBase. The purchaser calls requestRandomnessPayInNative; the result arrives in the fulfillRandomWords callback, which only the VRF wrapper can invoke.
  4. 4.
    Each active position contributes an inverse-value weight to totalWeight via a Fenwick tree (binary indexed tree). Selection maps randomWords[0] % totalWeight onto a target prefix sum, then _selectSlot walks a depth-32 path to the position, giving 2^32 slots (~4.29 billion) at constant selection gas. Selection runs against current state inside the callback, so concurrent acquisitions stay correct. Refund paths: empty pool; live-fee drift beyond selectionSlippageBps; and a stuck request after selectionTimeoutBlocks = 30, after which anyone may cancel. Cancel and fulfill are mutually exclusive.