Skip to content
Mechanics

Turns

Cadence, snapshot, tie-breaks, chunked buys and the caller reward.

A turn is the moment the flock decides. Every 30 minutes, anyone can call it. It weighs every compass, picks the heaviest target, buys it in chunks, and checks every open position against the exit rules.

the flock turns as one ribbon. the lead bird flares at the apex.
next turn in --:--schedule · pending

Cadence

Turns sit on a fixed 30 minutes grid, on the hour and the half hour UTC. After a turn runs, the next one opens at the next mark on that grid. Before the contracts are live, the clock shows the same grid and is labelled schedule · pending. Once live, it follows the last turn onchain.

What happens in a turn

  1. Weigh. Each compass counts with its weight: activeDeposit * rankMultiplier. Deposits count from the turn after next; withdrawals count immediately. See the compass.
  2. Pick. The weights are summed per target, over targets that are eligible right now. The heaviest target wins.
  3. Buy. The flock vault buys the target with at most 5% of its WETH. The buy is split into 4 chunks: the first fills in the turn itself, the rest can be filled by anyone with continueTurn(), one per block, within 20 blocks. Each chunk has a slippage cap of 3%. If the target is already held, the buy adds to that position, unless that position has an exit due.
  4. Exits. Every open position is then checked against the exit rules. Exits run after the buy, on every turn call, whether or not a new position opens, so nothing a held coin does during its sale can affect the buy.
  5. Record. The turn emits a Turn event with the turn number, target, weight, size, caller and reward. It appears in the turn ledger.

The list of candidates

A turn picks among up to 32 candidate targets. A target can join the list when at least 1,000,000 $MYR of weight that is active by the next turn points at it (deposits made before the current turn, so MYR deposited and withdrawn in one transaction cannot take a slot), and is picked only with at least that much active. That way a target is on the list for the first turn its weight counts. It joins on the next deposit or settle on it, or when anyone presses Add target to the list. A target that drops below the threshold for four turns, or stays ineligible for six hours, can be removed by anyone. The leader itself is removed for ineligibility only once the turn passes it over (below). When the list is full, a new target can take the place of one like that, or of one with less active weight.

The turn picks the heaviest candidate. If that target is not eligible at that moment, the turn is held open for the first 20 minutes (the call reverts and anyone can try again a few minutes later); after that the turn buys nothing. Making the leader look ineligible for a moment never hands the turn to the runner-up. Every turn counts the turns a leader has vetoed this way, and only being picked resets that count. A leader that has vetoed 12 turns this way (each after the 20-minute hold) is passed over for the next heaviest candidate, and it is picked again as soon as it is eligible at a turn: a dead pool cannot block the turns for good.

A pushed price earns nothing

Every buy and sell checks the pool's current price against its 5-minute average. A sale waits if they are more than 1% apart; a buy waits only if the current price is more than 1% above the average (a lower price only makes the buy cheaper). The call that ran into it earns no reward. If it is the turn's buy that waits, the whole turn() call reverts and the turn stays open for the next caller. An exit that waits only forfeits its own reward; past max hold, each turn it waits counts toward the write-off. Pushing a pool's price around a turn call gains nothing and uses up nothing.

Tie-breaks

If two targets have exactly the same total weight, the earliest-set weight wins. The target whose supporting compasses were set first takes the turn. This rewards pointing early and makes a last-second tie useless.

Who calls the turn

Anyone. There is no keeper, no backend and no switch. When turnReady() returns true, any address can send turn(). The app's Call turn button is enabled only then.

The caller earns a reward: 0.1% of the turn size, capped at 0.01 ETH, paid in ETH in the same transaction. The reward is split across the chunks: the caller of turn() gets one share and whoever fills a later chunk with continueTurn() gets one share per chunk, so a whole turn pays the capped reward once. A turn that buys nothing pays a flat 0.0002 ETH if it ran at least one exit, and nothing otherwise. That exit-only reward is paid at most once per turn, whether by turn() or pokeExits(), so there is no reason to spam calls. The reward exists to cover gas and give someone a reason to call. It is small on purpose.

If nobody calls

Then nothing happens until someone does. The next call processes the turn that is due. Missed turns are skipped, never stacked: if three turn windows pass with no call, the next call runs one turn, not three. The vault never catches up by buying more.

A turn that is late still checks exits. But exits only run when a turn is called, so a long gap means positions go unchecked for that long. That is a real risk. See risks.

If there is no eligible target

If no compass points at an eligible target, or the vault already holds 12 open positions, the turn opens nothing. It still checks exits and still counts as a turn.

Where to see it

  • The countdown is on the landing page, in the app header and above.
  • Every past turn is in the turn ledger: block, target, size, caller, reward.
  • Block numbers inside the contracts are Ethereum block numbers (about 12 seconds each), so the chunk window is roughly four minutes.
  • Until the flock vault is live, the ledger is empty and says so. Nothing in it is simulated.
searchesc
follow us