If you are providing liquidity to Parquet, the v4 payout queue changes the mental model you should use for your position. Your headline LP balance is no longer the same thing as the cash you can pull out, and pool gains from losing trades temporarily live somewhere other than your balance. This page explains exactly where the money sits, how it flows, and what to watch.Documentation Index
Fetch the complete documentation index at: https://docs.parquet.exchange/llms.txt
Use this file to discover all available pages before exploring further.
Your balance vs. what you can withdraw
The pool’stotal_usdc field is the headline number — the sum of LP capital
parked in the vault. It is not, however, the same as the amount you can
withdraw. Withdrawals are gated by a derived quantity:
reserved_usdc is the collateral set aside to back open positions, the way it
always has been. The new piece in v4 is queue_total_owed: the sum of every
unpaid winning close sitting in the FIFO payout queue. When a trader closes a
profitable position and the pool cannot pay them immediately, the obligation
goes into the queue and that exact dollar amount becomes locked LP capital
until it is paid out.
Where LP gains park: the side bucket
When a losing trader closes and the queue is non-empty, the LP gain is routed into a new pool field calledside_bucket
rather than directly into total_usdc.
The side bucket exists for one reason: so the next harvest call has a pile
of cash to pay queue entries from without dipping into your LP balance. As
losing closes accumulate, the side bucket grows; as harvests run, it drains
into the pockets of the queued winners.
When the queue is fully drained — queue_total_owed = 0 and no entries
remain — the side bucket flushes back into total_usdc and the pool resumes
simpler accounting until the queue fills again.
Harvesting is permissionless and pays the caller
Anyone holding a few cents of SOL can callharvest(max_entries: u8) on a
pool, where max_entries is capped at 20 per call. Each entry the call
successfully pays out closes a queue account that originally cost the trader
around $0.30 of SOL rent at enqueue time — that rent is refunded to whoever
calls harvest.
Parquet’s official keeper runs
harvest on a loop during US Regular Trading
Hours, with a shouldAttemptHarvest pre-flight that mirrors the on-chain
early-break — it skips submission when side_bucket < first_entry.amount so
neither the chain nor the keeper burns lamports on no-ops. Outside RTH the
keeper is idle because harvest reads the oracle and reverts on stale prices.Bad debt eats the side bucket first
When a position is liquidated for less than its remaining obligations to the pool, the shortfall — bad debt — has to come out of somewhere. In v4 the routing is:| Queue state | First sink | Fallback |
|---|---|---|
| Active (entries pending) | side_bucket | total_usdc (only if side bucket empty) |
| Empty | total_usdc | — |
What to monitor
Queue depth is a useful real-time proxy for how much oftotal_usdc is
“soft” — i.e. committed to upcoming payouts. The indexer exposes this per
market:
head, tail, total_owed, depth, side_bucket,
and estimated_drain_seconds. A high depth with a small side_bucket
means harvest activity has not kept up and free_liquidity is likely tight
on this market; a high side_bucket with low depth means harvest is
running and your balance is being shielded as intended. See
/network/api for the full schema and rate limits, and
/trade/payout-queue for the trader side of the
same mechanism.