What it does#
The volume reward of an epoch is split in proportion to trading credits. A member of the boost set counts for more than its credits: weight = floor(credits * boost_q32 / 2^32), where boost_q32 is the multiplier the epoch froze when it closed. The default is 130 %, and the pool refuses anything outside 100 %–200 %.
Nothing else changes. The budget is the same, the anti-farming ceiling is the same, and the proof of a claim is the same size on the wire.
The boost set#
The pool keeps a fourth Merkle tree next to the main, stake and credit trees, with the same hash and the same height. Each leaf is one number:
secret = Poseidon(viewing secret, 3)
leaf = Poseidon(secret)The leaf comes from the same viewing secret that already derives your notes. Two consequences, both on purpose:
- Nobody can compute your leaf but you. The tree is public; it is a list of numbers that says nothing about anybody.
- The boost cannot be lent. The claim proof also requires every credit it spends to derive from that same viewing secret, so lending the boost means lending the whole wallet.
One address, the boost authority, may append a leaf (posl_add_boost_member). It cannot remove one, cannot read one back to a person, cannot spend and cannot claim. The admin sets and rotates that address under the usual delay.
How the boost stays private#
The boost is a private bit of the claimVolume proof. Two public inputs were added, boost_q32 and boost_root, and both are read from the epoch account, so every claim of an epoch carries the same two values, boosted or not.
boost * (boost - 1) === 0 // the bit is a bit
if boost: boost_root === path of Poseidon(Poseidon(viewing secret, 3))
if boost: every spent credit derives from that same viewing secret
weight = credits * (boost ? boost_q32 : 2^32) / 2^32
reward = weight * rate / 2^32 // hidden inside the reward commitmentThe reward amount lives inside a commitment, not in the clear, so nobody can divide by the rate to recover the weight. A plain claim and a boosted claim have the same eleven public inputs, in the same places, and measure 596 bytes either way.
When the bit is 0, the membership constraint is switched off: a non-member needs no valid path and may put anything in those fields.
What it costs the pool to hide it#
Because the pool cannot count boosted claims, it cannot know the total weight of an epoch in advance. So it reserves the worst case: it pays the plain rate out of a reduced base, and keeps the rest for the boosts that may show up.
reserve_bps = ceil((m - 10000) * 10000 / m) // m = boost, in bps
base = payable * (10000 - reserve_bps) / 10000
volume_rate = floor(base * 2^32 / total_credits)At 130 % the reserve is 2308 bps. Nobody boosted: the epoch pays the plain rate and the reserve stays in the vault. Everybody boosted: the epoch pays at most what it reserved. The invariant holds on both ends, which is why the division rounds up.
The price of hiding the boost is therefore up to 23.07 % of an epoch's volume budget sitting idle when nobody is boosted. That part is not re-offered to a later epoch.
Getting in#
Once, off chain, you show that you hold the item and hand over your commitment. The service that receives it keeps only the hash of the item, never the item itself, accepts one commitment per item and one item per commitment, and queues the commitment for the boost authority to append in a batch.
That one moment is the only link in the whole design: the service sees your item and your commitment together, once. Everything after it is zero knowledge. If you want no link at all, do not join, and keep the plain rate.
What it does not promise#
- A crowd of one is visible. The anonymity set of a boosted claim is the members who had volume in that epoch. With a handful of members, the totals of the epoch point at you. The boost gets quiet when the set is populated.
- Membership is forever. Selling the item does not remove your leaf: the tree is append only.
- The boost applies to volume rewards only, not to lock rewards.
- A member added after an epoch closed cannot reach back into it. Each epoch froze its own root and its own index.
Next: why wash trading still loses and the privacy model.