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.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 isacquisitionFee = EV · (BPS + surchargeBps) / BPSwithsurchargeBps = 1000(10%), exposed by theacquisitionFee()view. - 2.A request accepts optional
maxAcquisitionFeeandminWeightedValuebounds (0 disables each). Separately, a selection-time guard ofselectionSlippageBps = 500(5%) refunds the acquisition if the live fee has drifted too far from what was escrowed. - 3.Chainlink VRF 2.5 in native-payment (direct-funding) mode, via
VRFV2PlusWrapperConsumerBase. The purchaser callsrequestRandomnessPayInNative; the result arrives in thefulfillRandomWordscallback, which only the VRF wrapper can invoke. - 4.Each active position contributes an inverse-value weight to
totalWeightvia a Fenwick tree (binary indexed tree). Selection mapsrandomWords[0] % totalWeightonto a target prefix sum, then_selectSlotwalks a depth-32 path to the position, giving2^32slots (~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 beyondselectionSlippageBps; and a stuck request afterselectionTimeoutBlocks = 30, after which anyone may cancel. Cancel and fulfill are mutually exclusive.
Home