{"data":{"schemaVersion":"reel.hook-catalog.v1","scope":"Documentation of the Hook Blocks reel's program implements (docs/PROGRAM.md §5). It does not prove that the program is deployed: read /api/v1/protocol-stats for that.","programs":{"reel":"Ajvhesd3q6yJFgnBL6vppAJDF7gP6nmksA8WkrTM4vcJ","reelHook":"oF7b3JDvBhT34SjHPsC1xiZrkgNKwFzPncTxk2TYGdx"},"categories":[{"id":"protection","name":"Protection and access","line":"Who may trade, when, and how much."},{"id":"fees","name":"Fees","line":"What a swap pays, and how it moves with the market."},{"id":"creator","name":"Creator income","line":"Royalties and taxes for the creator."},{"id":"rewards","name":"Rewards","line":"Burns, prizes, pots and rewards for traders and holders."},{"id":"liquidity","name":"Liquidity and yield","line":"What LPs earn and how liquidity is held."},{"id":"team","name":"Team tokens","line":"The creator's own buys, locks and allocations."},{"id":"pools","name":"Pools and trading","line":"Many pools, routes between them, and orders."}],"poolTerms":[{"key":"base_fee_pips","label":"Base LP fee","unit":"pips","type":"u32","min":100,"max":100000,"default":3000,"step":null,"options":null,"rule":"Counted once in the 600,000-pip LP-fee room (PROGRAM.md §5a).","scope":"pool","fixed":false,"help":"Every swap pays it, 100% to the pool's LPs. reel never takes any of it."},{"key":"protocol_share_bps","label":"Protocol share","unit":"bps","type":"u16","min":2000,"max":5000,"default":2000,"step":null,"options":null,"rule":null,"scope":"pool","fixed":false,"help":"reel's share s of each block fee, split off first. Chosen at launch, from Config.share_floor_bps (2,000 by default) up to 5,000."}],"blocks":[{"id":"anti-snipe","name":"Anti-Snipe","category":"protection","phase":"BEFORE","bit":0,"status":"live","statusNote":"In the reel program: bit 0 of PoolParams.blocks, frozen at PoolInit (PROGRAM.md §5).","line":"Caps and taxes early buys while the launch guard lasts. Sells never pay it.","onReel":"The guard is [open_ts, guard_end) in unix seconds. Buys pay the decaying Snipe tax as an LP fee, with the protocol share split off. The buy cap is one budget per slot for the whole launch: cap_now = snipe_cap·tax0/tax_now (none once the tax reaches 0), and each buy uses A·10⁶/cap_now ppm of the slot's budget of 10⁶ (BuyCapExceeded past it). Exact-out buys fail with ExactOutDuringGuard; adds by anyone but the launch position fail with GuardAddRefused.","paid":"LPs in range (the launch position while the guard lasts), after reel's share.","requires":[],"conflicts":[],"settings":[{"key":"guard_secs","label":"Guard length","unit":"secs","type":"u32","min":12,"max":1200000,"default":600,"step":null,"options":null,"rule":"A pool-level setting (§5a) that Wallet Cap and Buy/Sell Block share.","scope":"pool","fixed":false,"help":"The launch guard runs this long from open: buys pay the Snipe tax, the per-slot buy cap applies, exact-out buys are refused, only the launch position adds and principal stays locked."},{"key":"snipe_cap","label":"Buy cap per slot","unit":"atoms","type":"u64","min":0,"max":null,"default":null,"step":null,"options":null,"rule":null,"scope":"pool","fixed":false,"help":"Quote atoms the whole launch may buy in one slot at the starting tax. It grows as the tax falls and lifts at 0. 0 = uncapped. The SDK sizes it at 0.5% of the pool's quote depth at open."},{"key":"snipe_tax_pips","label":"Snipe tax","unit":"pips","type":"u32","min":0,"max":600000,"default":100000,"step":null,"options":null,"rule":"At most 600,000 − the base fee.","scope":"pool","fixed":false,"help":"An extra LP fee on guarded buys, decaying to the floor. Sells never pay it."},{"key":"snipe_floor_pips","label":"Tax floor","unit":"pips","type":"u32","min":0,"max":null,"default":0,"step":null,"options":null,"rule":"Below the Snipe tax.","scope":"pool","fixed":false,"help":"Where the tax settles for the rest of the guard."},{"key":"snipe_decay_secs","label":"Tax decay","unit":"secs","type":"u32","min":0,"max":null,"default":300,"step":null,"options":null,"rule":"At most 3,600 s, or the guard length if longer.","scope":"pool","fixed":false,"help":"Time from open for the tax to fall to its floor. 0 = a flat tax for the whole guard."},{"key":"snipe_curve","label":"Decay curve","unit":"choice","type":"u8","min":0,"max":2,"default":0,"step":null,"options":[{"value":0,"label":"Linear"},{"value":1,"label":"Front-loaded"},{"value":2,"label":"Step"}],"rule":null,"scope":"pool","fixed":false,"help":"Linear falls in a straight line; front-loaded halves what is left every eighth of the decay; step holds the tax in eight equal steps."}],"page":"/hooks/anti-snipe","launch":"/launch?add=anti-snipe"},{"id":"buy-sell-block","name":"Buy/Sell Block","category":"protection","phase":"BEFORE","bit":10,"status":"live","statusNote":"In the reel program: bit 10 of PoolParams.blocks, frozen at PoolInit (PROGRAM.md §5).","line":"Pauses buys and locks sells for a set time after launch. Charges nothing.","onReel":"Swap refuses buys before open + buy_pause_secs (BuysPaused) and sells before open + sell_lock_secs (SellsLocked); other adds are refused during the sell lock. On a hooked new token reel-hook also refuses transfers to off-curve owners, other venues' vaults, while the sell lock lasts, so the lock holds everywhere. Every new token's pools also pause buys for their first 12 s. The windows need a guard of the longer window + 84 s; with guard_secs at 0 on a new token, PoolInit switches exactly that on.","paid":"Nobody: it charges nothing.","requires":[],"conflicts":[],"settings":[{"key":"guard_secs","label":"Guard length","unit":"secs","type":"u32","min":0,"max":1200000,"default":0,"step":null,"options":null,"rule":"Shared with Anti-Snipe, which sets 600 s.","scope":"pool","fixed":false,"help":"0, or 12 s to 1,200,000 s. At 0 on a new token PoolInit switches a guard on: the longer window + 84 s. Without Anti-Snipe the guard charges no tax and has no buy cap, but still refuses exact-out buys and locks launch principal."},{"key":"buy_pause_secs","label":"Buy pause","unit":"secs","type":"u32","min":0,"max":3600,"default":0,"step":null,"options":null,"rule":null,"scope":"pool","fixed":false,"help":"Buys are refused until open + this. The dev buy is exempt."},{"key":"sell_lock_secs","label":"Sell lock","unit":"secs","type":"u32","min":0,"max":60,"default":0,"step":null,"options":null,"rule":"Not both windows 0.","scope":"pool","fixed":false,"help":"Sells, and adds other than the launch position, are refused until open + this."}],"page":"/hooks/buy-sell-block","launch":"/launch?add=buy-sell-block"},{"id":"wallet-cap","name":"Wallet Cap","category":"protection","phase":"BEFORE","bit":9,"status":"live","statusNote":"In the reel program: bit 9 of PoolParams.blocks, frozen at PoolInit (PROGRAM.md §5).","line":"While the guard lasts, no wallet buys more than a set share of the supply.","onReel":"WalletCounter [\"wcount\", launch, wallet].bought, the tokens delivered after burn across every pool of the launch, must stay within Launch.wallet_cap = supply·bps/10⁴ (WalletCapExceeded). On a hooked new token reel-hook also caps any receiving wallet's balance during the guard on every venue; the creator and reel's vaults are exempt. The cap needs a guard of at least 96 s; with guard_secs at 0 on a new token, PoolInit switches on 180 s (hookr's 15 blocks).","paid":"Nobody: it charges nothing.","requires":[],"conflicts":[],"settings":[{"key":"guard_secs","label":"Guard length","unit":"secs","type":"u32","min":0,"max":1200000,"default":0,"step":null,"options":null,"rule":"Shared with Anti-Snipe, which sets 600 s.","scope":"pool","fixed":false,"help":"0, or 12 s to 1,200,000 s. At 0 on a new token PoolInit switches a guard on: 180 s. Without Anti-Snipe the guard charges no tax and has no buy cap, but still refuses exact-out buys and locks launch principal."},{"key":"wallet_cap_bps","label":"Cap per wallet","unit":"bps","type":"u16","min":10,"max":1000,"default":200,"step":10,"options":null,"rule":null,"scope":"pool","fixed":false,"help":"Share of supply one wallet may buy while the guard lasts, across every pool of the launch."}],"page":"/hooks/wallet-cap","launch":"/launch?add=wallet-cap"},{"id":"sandwich-guard","name":"Sandwich Guard","category":"protection","phase":"FEE","bit":11,"status":"live","statusNote":"In the reel program: bit 11 of PoolParams.blocks, frozen at PoolInit (PROGRAM.md §5).","line":"A swap that moves price back toward where its window opened pays that move.","onReel":"The window is sandwich_slots slots, with the open price snapshotted at its first swap. A swap moving toward the open pays (p0 − clamp(p1, open))/p0 in pips, capped at sandwich_max_pips. Destination 5, the default, sends all of it to the protocol; 1 (owner) and 3 (King of the Pool pot) split off the protocol share first.","paid":"reel (100%, the default), or the liquidity owner, the Holder Pot or the King of the Pool pot after reel's share.","requires":[],"conflicts":[],"settings":[{"key":"sandwich_slots","label":"Window","unit":"slots","type":"u8","min":1,"max":4,"default":1,"step":null,"options":null,"rule":null,"scope":"pool","fixed":false,"help":"Slots that share one opening price."},{"key":"sandwich_max_pips","label":"Most per swap","unit":"pips","type":"u32","min":50000,"max":150000,"default":100000,"step":10000,"options":null,"rule":null,"scope":"pool","fixed":false,"help":"The largest charge one swap can pay."},{"key":"sandwich_to","label":"Paid to","unit":"choice","type":"u8","min":1,"max":5,"default":5,"step":null,"options":[{"value":5,"label":"Protocol (100%)"},{"value":1,"label":"Liquidity owner"},{"value":2,"label":"Holder Pot"},{"value":3,"label":"King of the Pool pot"}],"rule":null,"scope":"pool","fixed":false,"help":"Protocol takes all of it; the others get it after reel's share. The Holder Pot (new reel tokens) streams it to holders."}],"page":"/hooks/sandwich-guard","launch":"/launch?add=sandwich-guard"},{"id":"exit-clock","name":"Exit Clock","category":"protection","phase":"FEE","bit":6,"status":"live","statusNote":"In the reel program: bit 6 of PoolParams.blocks, frozen at PoolInit (PROGRAM.md §5).","line":"Sells pay a fee that falls the longer the tokens were held.","onReel":"Sells pay decay(top → floor, held, horizon, curve) bps, protocol share first. On hooked new tokens held = now − HookHolder.acq_ts of the seller: reel-hook keeps a weighted-average acquisition time on every receive, and a wallet with no holder account pays the top rate. Other tokens decay pool-wide from open_ts.","paid":"LPs by default, or the liquidity owner, the Holder Pot, the King of the Pool pot or the payee, after reel's share.","requires":[],"conflicts":[],"settings":[{"key":"exit_top_bps","label":"Top rate","unit":"bps","type":"u16","min":10,"max":1000,"default":300,"step":10,"options":null,"rule":null,"scope":"pool","fixed":false,"help":"What a sell pays at once after buying."},{"key":"exit_floor_bps","label":"Floor","unit":"bps","type":"u16","min":0,"max":null,"default":0,"step":10,"options":null,"rule":"At most the top rate − 10.","scope":"pool","fixed":false,"help":"What a sell pays once held for the whole horizon."},{"key":"exit_horizon_secs","label":"Horizon","unit":"secs","type":"u32","min":3600,"max":2592000,"default":259200,"step":null,"options":null,"rule":null,"scope":"pool","fixed":false,"help":"Hold time over which the rate falls from top to floor (1 to 720 hours)."},{"key":"exit_curve","label":"Curve","unit":"choice","type":"u8","min":0,"max":2,"default":0,"step":null,"options":[{"value":0,"label":"Linear"},{"value":1,"label":"Front-loaded"},{"value":2,"label":"Step"}],"rule":null,"scope":"pool","fixed":false,"help":"The same three curves as Anti-Snipe's decay."},{"key":"exit_to","label":"Paid to","unit":"choice","type":"u8","min":0,"max":4,"default":0,"step":null,"options":[{"value":0,"label":"LP fee"},{"value":1,"label":"Liquidity owner"},{"value":2,"label":"Holder Pot"},{"value":3,"label":"King of the Pool pot"},{"value":4,"label":"Payee"}],"rule":null,"scope":"pool","fixed":false,"help":"Where the fee goes after reel's share."}],"page":"/hooks/exit-clock","launch":"/launch?add=exit-clock"},{"id":"market-guard","name":"Market Guard","category":"protection","phase":"ADVISORY","bit":14,"status":"live","statusNote":"In the reel program: bit 14 of PoolParams.blocks, frozen at PoolInit (PROGRAM.md §5).","line":"Swaps that stray from a live Pyth price pay the pool's LPs a surcharge.","onReel":"Reads a Pyth PriceUpdateV2 account (owner rec5EKMG…, full verification, tag checked, publish_time within oracle_max_age); guard_flags bit 0 inverts the feed. Surcharge = guard_surcharge_pips·min(1, over/ramp), all to LPs; below guard_min_depth of quote to the band edge the full surcharge applies. A stale or missing feed fails closed with OracleUnavailable. With Arb recapture on the same pool, recapture must read the same Pyth feed (recap_ref 1).","paid":"LPs, 100%. reel keeps none of it.","requires":[],"conflicts":[],"settings":[{"key":"guard_band_bps","label":"Band","unit":"bps","type":"u16","min":50,"max":5000,"default":1000,"step":null,"options":null,"rule":null,"scope":"pool","fixed":false,"help":"Each way around the oracle price; swaps that end inside it pay nothing extra."},{"key":"guard_ramp_bps","label":"Ramp","unit":"bps","type":"u16","min":50,"max":5000,"default":1000,"step":null,"options":null,"rule":null,"scope":"pool","fixed":false,"help":"Past the band, the surcharge rises from 0 to full over this distance."},{"key":"guard_surcharge_pips","label":"Full surcharge","unit":"pips","type":"u32","min":1,"max":50000,"default":10000,"step":null,"options":null,"rule":null,"scope":"pool","fixed":false,"help":"Paid by swaps that end past band + ramp and move away. 100% to LPs."},{"key":"oracle_max_age","label":"Price age limit","unit":"secs","type":"u32","min":60,"max":90000,"default":90000,"step":null,"options":null,"rule":null,"scope":"pool","fixed":false,"help":"A feed older than this refuses every swap, sells too (fail-closed). Market Guard only."},{"key":"guard_min_depth","label":"Least depth","unit":"atoms","type":"u64","min":0,"max":null,"default":0,"step":null,"options":null,"rule":null,"scope":"pool","fixed":false,"help":"If quote depth to the band edge is below this, the full surcharge applies. 0 = off."},{"key":"guard_flags","label":"Feed orientation","unit":"flags","type":"u8","min":0,"max":1,"default":0,"step":null,"options":[{"value":1,"label":"Invert the feed"}],"rule":null,"scope":"pool","fixed":false,"help":"Bit 0 inverts the feed, for a pool whose base is the feed's quote."}],"page":"/hooks/market-guard","launch":"/launch?add=market-guard"},{"id":"agent-gate","name":"Agent gate","category":"protection","phase":"ADVISORY","bit":17,"status":"live","statusNote":"In the reel program: bit 17 of PoolParams.blocks, frozen at PoolInit (PROGRAM.md §5).","line":"Only registered agents can buy, sell or add liquidity. Removing is never gated.","onReel":"The signer needs an Agent PDA [\"agent\", wallet] (AgentRequired). agent_min_score > 0 needs a Score from the reviewer set in adv[0] at least that high for buys and adds (ScoreTooLow); a missing score account counts as unscored. Below agent_tier_score the swap pays agent_tier_pips to LPs. agent_flags bit 0 makes a buy's recipient an agent too; bit 1 allows CPI callers, otherwise the swap must be top level (CpiRefused).","paid":"LPs, 100% of the tier surcharge.","requires":[],"conflicts":[],"settings":[{"key":"agent_flags","label":"Checks","unit":"flags","type":"u8","min":0,"max":3,"default":1,"step":null,"options":[{"value":1,"label":"A buy's recipient must be an agent"},{"value":2,"label":"Allow programs calling by CPI"}],"rule":null,"scope":"pool","fixed":false,"help":"Without the second, the swap must be a top-level instruction."},{"key":"agent_min_score","label":"Score to enter","unit":"score","type":"u32","min":0,"max":4294967295,"default":0,"step":null,"options":null,"rule":null,"scope":"pool","fixed":false,"help":"Buys and adds need a score at least this from the reviewer set. 0 = no score needed."},{"key":"agent_tier_score","label":"Score for the base fee","unit":"score","type":"u32","min":0,"max":4294967295,"default":0,"step":null,"options":null,"rule":null,"scope":"pool","fixed":false,"help":"Agents below it, or unscored, pay the tier surcharge."},{"key":"agent_tier_pips","label":"Tier surcharge","unit":"pips","type":"u32","min":0,"max":50000,"default":0,"step":null,"options":null,"rule":null,"scope":"pool","fixed":false,"help":"Paid to LPs by agents below the tier score."}],"page":"/hooks/agent-gate","launch":"/launch?add=agent-gate"},{"id":"canonical-venue-token","name":"Canonical Venue Token","category":"protection","phase":"LAUNCH","bit":null,"status":"partial","statusNote":"Partial: the transfer hook can't tell a person's wallet from a wrapper or custodian whose owner is an on-curve key (PROGRAM.md §12). It stops other venues' program vaults, not every custodian.","line":"A new token that moves only between wallets and reel's own vaults.","onReel":"A mint flag set at launch. reel-hook, the token's Token-2022 transfer hook, requires the sender and receiver of every transfer to be on-curve wallets or reel's VAULT_AUTH (CanonicalOnly). Every reel vault is owned by VAULT_AUTH, so the token trades on any of its reel pools.","paid":"Nothing extra; the pools' blocks charge as usual.","requires":[],"conflicts":[],"settings":[],"page":"/hooks/canonical-venue-token","launch":null},{"id":"recovery-reserve","name":"Recovery reserve","category":"protection","phase":"OUTSIDE","bit":null,"status":"vaults","statusNote":"Live in reel-vaults on Solana mainnet (the `reserve` module).","line":"A public fund that repays LPs or traders after a reviewed incident.","onReel":"reel-vaults' reserve module: a reserve PDA per pool, set up by the launch owner. Its named reviewer co-signs each incident and each claim as a transaction signer, in place of EIP-712 attestations. Nothing in the pool program reads it.","paid":"Claimants the reviewer signs for. reel takes nothing.","requires":[],"conflicts":[],"settings":[],"page":"/hooks/recovery-reserve","launch":null},{"id":"dynamic-fees","name":"Dynamic fees","category":"fees","phase":"FEE","bit":1,"status":"live","statusNote":"In the reel program: bit 1 of PoolParams.blocks, frozen at PoolInit (PROGRAM.md §5).","line":"The fee rises with how far a swap pushes the price. Pushing it back is free.","onReel":"dyn_ref steps every dyn_window_secs keeping dyn_carry_bps of the gap (at most 64 steps) and joins the price after dyn_reset_secs with no counted move. Moving away pays min(span, sens·(d0² + d0·d1 + d1²)/3,300) pips, d the bps distance from the reference (capped at 20,000), d0 = 0 when the swap crosses it. A move counts when |Δp| ≥ dyn_move_bps and X ≥ dyn_ref_liq (opening depth ÷ divisor). Exact-out swaps pay the span. The protocol share applies above the base fee.","paid":"LPs, after reel's share of the part above the base fee.","requires":[],"conflicts":["storm-fee"],"settings":[{"key":"dyn_max_pips","label":"Fee ceiling","unit":"pips","type":"u32","min":null,"max":600000,"default":23000,"step":null,"options":null,"rule":"From the base fee + 1 up to 600,000; it includes the base fee.","scope":"pool","fixed":false,"help":"The most a swap pays in base plus dynamic fee. The default is the base fee + 20,000."},{"key":"dyn_sens","label":"Sensitivity","unit":"count","type":"u8","min":1,"max":10,"default":5,"step":null,"options":null,"rule":null,"scope":"pool","fixed":false,"help":"How fast the fee climbs: a swap leaving the reference pays sens·d²/3,300 pips for a move of d bps, up to the ceiling."},{"key":"dyn_window_secs","label":"Step every","unit":"secs","type":"u32","min":12,"max":300,"default":30,"step":null,"options":null,"rule":null,"scope":"pool","fixed":false,"help":"Each window, the reference keeps the carry share of its gap to the price."},{"key":"dyn_reset_secs","label":"Reset after","unit":"secs","type":"u32","min":30,"max":1800,"default":120,"step":null,"options":null,"rule":"At least twice the step.","scope":"pool","fixed":false,"help":"With no counted move for this long, the reference joins the price."},{"key":"dyn_carry_bps","label":"Gap kept per step","unit":"bps","type":"u16","min":0,"max":9500,"default":7500,"step":null,"options":null,"rule":null,"scope":"pool","fixed":false,"help":"Share of the gap between reference and price kept at each step."},{"key":"dyn_move_bps","label":"Counted move","unit":"bps","type":"u16","min":50,"max":2000,"default":200,"step":null,"options":null,"rule":null,"scope":"pool","fixed":false,"help":"A move counts when the price moves at least this far and the swap is at least the reference liquidity."},{"key":"dyn_divisor","label":"Liquidity divisor","unit":"count","type":"u16","min":2,"max":10000,"default":100,"step":null,"options":null,"rule":null,"scope":"pool","fixed":false,"help":"Reference liquidity = the pool's quote depth at open ÷ this. A push with no size behind it doesn't raise the next buyer's fee."}],"page":"/hooks/dynamic-fees","launch":"/launch?add=dynamic-fees"},{"id":"storm-fee","name":"Storm Fee","category":"fees","phase":"FEE","bit":8,"status":"live","statusNote":"In the reel program: bit 8 of PoolParams.blocks, frozen at PoolInit (PROGRAM.md §5).","line":"The fee rises when price turns choppy and eases as it calms, within fixed bounds.","onReel":"Fixed 300 s samples. At a sample's close, target = floor + (ceiling − floor)·min(1, maxdev/500 bps) and level += (target − level)/2; each idle sample halves the gap to the floor (up to 16). Every swap pays the level, protocol share first.","paid":"LPs by default, or the liquidity owner, after reel's share.","requires":[],"conflicts":["dynamic-fees"],"settings":[{"key":"storm_ceiling_pips","label":"Ceiling","unit":"pips","type":"u32","min":500,"max":100000,"default":6000,"step":500,"options":null,"rule":null,"scope":"pool","fixed":false,"help":"The highest level choppy markets can lift the fee to."},{"key":"storm_floor_pips","label":"Floor","unit":"pips","type":"u32","min":0,"max":null,"default":0,"step":500,"options":null,"rule":"At most the ceiling.","scope":"pool","fixed":false,"help":"The level a calm market eases back to."},{"key":"storm_to","label":"Paid to","unit":"choice","type":"u8","min":0,"max":1,"default":0,"step":null,"options":[{"value":0,"label":"LP fee"},{"value":1,"label":"Liquidity owner"}],"rule":null,"scope":"pool","fixed":false,"help":"Where the fee goes after reel's share."}],"page":"/hooks/storm-fee","launch":"/launch?add=storm-fee"},{"id":"swap-cut","name":"Swap Cut","category":"fees","phase":"FEE","bit":5,"status":"live","statusNote":"In the reel program: bit 5 of PoolParams.blocks, frozen at PoolInit (PROGRAM.md §5).","line":"A fixed cut of every buy and sell for the pool's liquidity owner.","onReel":"Charged on X for each side (cut_buy_pips, cut_sell_pips), protocol share first, the rest to the OWNER bucket (the launch owner, or the lock's beneficiary while locked), HOLDER_POT, POT or PAYEE as cut_to and cut_sell_to say.","paid":"The liquidity owner by default, or the Holder Pot, the King of the Pool pot or the payee.","requires":[],"conflicts":[],"settings":[{"key":"cut_buy_pips","label":"Buy cut","unit":"pips","type":"u32","min":0,"max":100000,"default":10000,"step":1000,"options":null,"rule":null,"scope":"pool","fixed":false,"help":"A fixed cut of each buy's quote. reel's share comes off first."},{"key":"cut_sell_pips","label":"Sell cut","unit":"pips","type":"u32","min":0,"max":100000,"default":10000,"step":1000,"options":null,"rule":null,"scope":"pool","fixed":false,"help":"A fixed cut of each sell's quote. reel's share comes off first."},{"key":"cut_to","label":"Buy cut goes to","unit":"choice","type":"u8","min":1,"max":4,"default":1,"step":null,"options":[{"value":1,"label":"Liquidity owner"},{"value":2,"label":"Holder Pot"},{"value":3,"label":"King of the Pool pot"},{"value":4,"label":"Payee"}],"rule":null,"scope":"pool","fixed":false,"help":"The liquidity owner is the launch owner, or the lock beneficiary while the launch is locked."},{"key":"cut_sell_to","label":"Sell cut goes to","unit":"choice","type":"u8","min":1,"max":4,"default":1,"step":null,"options":[{"value":1,"label":"Liquidity owner"},{"value":2,"label":"Holder Pot"},{"value":3,"label":"King of the Pool pot"},{"value":4,"label":"Payee"}],"rule":null,"scope":"pool","fixed":false,"help":"Where the sell side's cut goes, after reel's share."}],"page":"/hooks/swap-cut","launch":"/launch?add=swap-cut"},{"id":"min-fee","name":"Minimum fee","category":"fees","phase":"FEE","bit":22,"status":"live","statusNote":"In the program as bit 22, set by PoolInit itself. Not a hookr block: hookr calls it the Hookr minimum.","line":"A small fee to reel on a new token's pool that pays reel nothing else.","onReel":"PoolInit sets it, not the creator: min_fee_pips = Config.min_fee_pips (0 to 10,000; 1,000 in the spec), 100% to the protocol, with an integrator's share applying. It is decided once, at open.","paid":"reel, 100% (a listed integrator gets its rate of it).","requires":[],"conflicts":[],"settings":[{"key":"min_fee_pips","label":"Minimum fee","unit":"pips","type":"u32","min":0,"max":10000,"default":1000,"step":null,"options":null,"rule":null,"scope":"pool","fixed":true,"help":"Copied by PoolInit from Config.min_fee_pips; the creator doesn't choose it."}],"page":"/hooks/min-fee","launch":"/launch?add=min-fee"},{"id":"market-hours-fee","name":"Market-hours fee","category":"fees","phase":"ADVISORY","bit":15,"status":"live","statusNote":"In the reel program: bit 15 of PoolParams.blocks, frozen at PoolInit (PROGRAM.md §5).","line":"A fee that follows the US stock market's sessions.","onReel":"New York time with US daylight-saving rules. Monday to Friday: pre-market 04:00–09:30, regular 09:30–16:00 (13:00 on early closes), after hours 16:00–20:00, overnight 20:00–04:00; closed from Friday 20:00 to Sunday 20:00 and on Calendar holidays. The open ramp runs pre-market to regular over hours_ramp_secs[0], the close ramp regular to after hours over [1]. Days past covered_until_day count as closed when hours_flags bit 0 is set.","paid":"LPs, 100%.","requires":[],"conflicts":[],"settings":[{"key":"hours_pips[0]","label":"Regular hours","unit":"pips","type":"u32","min":0,"max":50000,"default":0,"step":null,"options":null,"rule":null,"scope":"pool","fixed":false,"help":"LP surcharge during regular hours, New York time. 100% to LPs."},{"key":"hours_pips[1]","label":"Pre-market","unit":"pips","type":"u32","min":0,"max":50000,"default":2000,"step":null,"options":null,"rule":null,"scope":"pool","fixed":false,"help":"LP surcharge during pre-market, New York time. 100% to LPs."},{"key":"hours_pips[2]","label":"After hours","unit":"pips","type":"u32","min":0,"max":50000,"default":2000,"step":null,"options":null,"rule":null,"scope":"pool","fixed":false,"help":"LP surcharge during after hours, New York time. 100% to LPs."},{"key":"hours_pips[3]","label":"Overnight","unit":"pips","type":"u32","min":0,"max":50000,"default":4000,"step":null,"options":null,"rule":null,"scope":"pool","fixed":false,"help":"LP surcharge during overnight, New York time. 100% to LPs."},{"key":"hours_pips[4]","label":"Market closed","unit":"pips","type":"u32","min":0,"max":50000,"default":6000,"step":null,"options":null,"rule":null,"scope":"pool","fixed":false,"help":"LP surcharge during market closed, New York time. 100% to LPs."},{"key":"hours_ramp_secs[0]","label":"Ramp into the open","unit":"secs","type":"u32","min":0,"max":12600,"default":1800,"step":null,"options":null,"rule":"The two ramps add up to at most 12,600 s.","scope":"pool","fixed":false,"help":"From the pre-market rate to the regular rate after 09:30."},{"key":"hours_ramp_secs[1]","label":"Ramp into the close","unit":"secs","type":"u32","min":0,"max":12600,"default":900,"step":null,"options":null,"rule":"The two ramps add up to at most 12,600 s.","scope":"pool","fixed":false,"help":"From the regular rate to the after-hours rate before 16:00."},{"key":"hours_flags","label":"Days off the calendar","unit":"flags","type":"u8","min":0,"max":1,"default":1,"step":null,"options":[{"value":1,"label":"Charge uncovered weekdays as closed"}],"rule":null,"scope":"pool","fixed":false,"help":"Weekdays past the Calendar's covered range are charged the closed rate."}],"page":"/hooks/market-hours-fee","launch":"/launch?add=market-hours-fee"},{"id":"managed-fee","name":"Managed fee","category":"fees","phase":"ADVISORY","bit":16,"status":"live","statusNote":"In the reel program: bit 16 of PoolParams.blocks, frozen at PoolInit (PROGRAM.md §5).","line":"A surcharge reel's keeper moves as price moves, inside a cap you fix at launch.","onReel":"Config.fee_keeper calls ManagedSet(pips, ttl): pips ≤ cap, a change of at most managed_max_step, at least managed_min_interval apart, ttl ≤ managed_max_ttl (ManagedStep otherwise). It lapses to managed_start_pips. The charge is the current setting plus premium[side], all to LPs.","paid":"LPs, 100%.","requires":[],"conflicts":[],"settings":[{"key":"managed_cap_pips","label":"Surcharge cap","unit":"pips","type":"u32","min":1,"max":50000,"default":10000,"step":null,"options":null,"rule":null,"scope":"pool","fixed":false,"help":"The keeper can never set more than this."},{"key":"managed_start_pips","label":"Starting surcharge","unit":"pips","type":"u32","min":0,"max":null,"default":500,"step":null,"options":null,"rule":"At most the cap.","scope":"pool","fixed":false,"help":"Where the surcharge starts, and where an unrenewed setting lapses back to."},{"key":"managed_premium[0]","label":"Premium on buys","unit":"pips","type":"u32","min":0,"max":null,"default":0,"step":null,"options":null,"rule":"At most the cap.","scope":"pool","fixed":false,"help":"Extra on every buy, on top of the current surcharge."},{"key":"managed_premium[1]","label":"Premium on sells","unit":"pips","type":"u32","min":0,"max":null,"default":0,"step":null,"options":null,"rule":"At most the cap.","scope":"pool","fixed":false,"help":"Extra on every sell, on top of the current surcharge."},{"key":"managed_max_step","label":"Largest change per update","unit":"pips","type":"u32","min":1,"max":16777215,"default":1000,"step":null,"options":null,"rule":null,"scope":"pool","fixed":false,"help":"How far one keeper update may move it. 16,777,215 is no limit."},{"key":"managed_min_interval","label":"Least time between updates","unit":"secs","type":"u32","min":1,"max":86400,"default":60,"step":null,"options":null,"rule":null,"scope":"pool","fixed":false,"help":"The keeper waits this long."},{"key":"managed_max_ttl","label":"Longest a setting lasts","unit":"secs","type":"u32","min":1,"max":259200,"default":3600,"step":null,"options":null,"rule":null,"scope":"pool","fixed":false,"help":"Then it lapses to the start."}],"page":"/hooks/managed-fee","launch":"/launch?add=managed-fee"},{"id":"usage-fee","name":"Usage fee","category":"fees","phase":"ADVISORY","bit":21,"status":"live","statusNote":"In the reel program: bit 21 of PoolParams.blocks, frozen at PoolInit (PROGRAM.md §5). Publishing a market block needs Config.bond_mint ($REEL, later), which mainnet's Config doesn't set yet, so no block can be published, bonded or installed today and no backer has anything to claim.","line":"Every swap pays a market block's builder, its backers, reel and a reserve.","onReel":"Every swap pays usage_pips into the USAGE bucket for the MarketBlock in adv[0]. BucketCollect splits it: builder builder_bps, backers backers_bps (into the block's backers' account; reel books each bond's earnings and reel-vaults' BackerPay pays them out), protocol 20%, reserve 10%. It installs only while the block is admitted and bonded at least Config.bond_floor[tier].","paid":"The builder and backers (70% together), reel 20%, the block's reserve 10%.","requires":[],"conflicts":[],"settings":[{"key":"usage_pips","label":"Usage fee","unit":"pips","type":"u32","min":1,"max":100000,"default":5000,"step":null,"options":null,"rule":"At most the block's own fee cap.","scope":"pool","fixed":false,"help":"Every swap pays it into the market block's split: builder, backers, reel 20%, reserve 10%."}],"page":"/hooks/usage-fee","launch":"/launch?add=usage-fee"},{"id":"hook-blocks-market","name":"Hook Blocks Market","category":"fees","phase":"OUTSIDE","bit":null,"status":"partial","statusNote":"Partial: publishing, admission, bonds and the usage-fee split are in the reel program, and reel-vaults' payouts module (live) pays backers. Publishing a market block needs Config.bond_mint ($REEL, later), which mainnet's Config doesn't set yet, so no block can be published, bonded or installed today and no backer has anything to claim.","line":"Builders publish bonded add-on blocks; pools that install one pay its usage fee.","onReel":"MarketPublish writes a MarketBlock [\"mblock\", block_id] with builder_bps 3,000–6,000 and backers_bps 1,000–4,000, which with 3,000 add up to 10,000. MarketAdmit sets its status; BondDeposit and BondWithdraw (7-day notice) hold bonds in its bond vault. A pool installs it through the Usage fee block.","paid":"The block's builder and backers, reel 20%, the block's reserve 10%.","requires":[],"conflicts":[],"settings":[],"page":"/hooks/hook-blocks-market","launch":null},{"id":"creator-royalty","name":"Creator royalty","category":"creator","phase":"SWITCH","bit":4,"status":"live","statusNote":"In the reel program: bit 4 of PoolParams.blocks, frozen at PoolInit (PROGRAM.md §5).","line":"A share of LP Rewards on every buy, paid to a recipient fixed at launch.","onReel":"royalty_bps of LP Rewards after the protocol share accrues in the ROYALTY bucket and is credited to royalty_to's ClaimLedger in the pool's quote; the recipient claims whenever. royalty_to can be a Revenue Router split (reel-vaults), named at PoolInit before it exists.","paid":"Your royalty recipient, out of the LPs' part of LP Rewards.","requires":["lp-rewards"],"conflicts":[],"settings":[{"key":"royalty_bps","label":"Royalty","unit":"bps","type":"u16","min":1,"max":1000,"default":1000,"step":null,"options":null,"rule":null,"scope":"pool","fixed":false,"help":"Share of LP Rewards, after reel's share, credited to royalty_to on every buy. It comes out of the LPs' part."}],"page":"/hooks/creator-royalty","launch":"/launch?add=creator-royalty"},{"id":"tax-conversion","name":"Tax + Conversion","category":"creator","phase":"FEE","bit":null,"status":"partial","statusNote":"Partial: reel runs a fixed creator tax per side as Swap Cut (bit 5). The decaying launch rate, the conversion route and the session tiers are not in the reel program.","line":"A buy tax and a sell tax in the quote, paid to a recipient fixed at launch.","onReel":"reel runs a creator tax as Swap Cut: a fixed cut per side, up to 10%, protocol share first, paid to the liquidity owner or a payee. hookr does the same on its own core.","paid":"Your recipient, after reel's share.","requires":[],"conflicts":[],"settings":[],"page":"/hooks/tax-conversion","launch":null},{"id":"revenue-router","name":"Revenue Router","category":"creator","phase":"LAUNCH","bit":null,"status":"vaults","statusNote":"Live in reel-vaults on Solana mainnet (the `router` module).","line":"Shares the creator royalty among up to 8 payees at fixed shares.","onReel":"reel-vaults' router module: a split PDA whose address follows from its terms, so it can be named as royalty_to at PoolInit; anyone creates it later with exactly those terms. Royalty is credited to its reel ledger, anyone collects it into the split, and each payee claims (or anyone pushes to a payee that is not pull-only).","paid":"Up to 8 payees by fixed share.","requires":[],"conflicts":[],"settings":[],"page":"/hooks/revenue-router","launch":null},{"id":"revenue-tokenizer","name":"Revenue Tokenizer","category":"creator","phase":"OUTSIDE","bit":null,"status":"periphery","statusNote":"Coming: the `tokenizer` module is built and tested in reel-vaults' source, not in the deployed build yet. It arrives with an upgrade at the same address.","line":"Turns a fee right into a fixed supply of tokens whose holders share its income.","onReel":"reel-vaults' tokenizer module: the creator mints a fixed-supply revenue token (mint authority revoked in the same instruction) and hands the tokenizer reel fee rights, a Position or a Launch's ownership. Anyone syncs a right; after the treasury's leg, its income streams to stakers of the revenue token over the release period.","paid":"Revenue-token stakers.","requires":[],"conflicts":[],"settings":[],"page":"/hooks/revenue-tokenizer","launch":null},{"id":"auto-burn","name":"Auto Burn","category":"rewards","phase":"AFTER","bit":2,"status":"live","statusNote":"In the reel program: bit 2 of PoolParams.blocks, frozen at PoolInit (PROGRAM.md §5).","line":"Burns a set share of every buy's tokens in the same swap.","onReel":"On buys, floor(out·burn_bps·(10⁴ − s)/10⁸) of the actual output is burned with BurnChecked from the base vault, and burn_bps·s of the input is paid in quote to the protocol. LP Rewards and Auto Burn share 1,000 bps.","paid":"The burn, and reel's share in quote.","requires":[],"conflicts":[],"settings":[{"key":"burn_bps","label":"Burn share","unit":"bps","type":"u16","min":1,"max":1000,"default":100,"step":null,"options":null,"rule":"LP Rewards + Auto Burn ≤ 1,000 bps.","scope":"pool","fixed":false,"help":"Of each buy's tokens, burn·(1 − s) is burned; burn·s of the input is paid in quote to reel."}],"page":"/hooks/auto-burn","launch":"/launch?add=auto-burn"},{"id":"arb-recapture","name":"Arb recapture","category":"rewards","phase":"FEE","bit":13,"status":"partial","statusNote":"Partial: Solana has no in-swap executor callback like Uniswap v4's, so reel charges the swap that closes a gap against a reference price instead of running a partner's arbitrage (PROGRAM.md §12). A stale or missing reference skips it.","line":"The pool keeps most of the price-gap profit instead of outside bots.","onReel":"The reference r comes from recap_ref: 1 Pyth (oracle), 2 a sibling reel pool of the same pair (aux), 3 a sibling pool × Pyth. If |p0 − r|/r ≥ recap_min_gap_bps and the swap moves toward r, the gap-closing segment p0 → clamp(p1, r) is priced on the curve: profit = Δbase·r − Δquote on a buy, Δquote − Δbase·r on a sell, and the charge C = profit·capture/10⁴ (at most half of X). Of C: protocol C·recapture_protocol/capture, the gap opener (the last on-curve top-level wallet whose swap widened the gap past the least gap; LPs get it if there is none or it is the arber) C·trader/capture, the pot kotp_pot_bps of the rest, LPs the rest through the stream over release_secs. A reference older than recap_max_age is skipped.","paid":"Of each unit of profit at the defaults: arber 25%, reel 15%, the gap opener 10%, the pot and LPs 50%.","requires":[],"conflicts":["zap-relay-target"],"settings":[{"key":"recap_capture_bps","label":"Profit captured","unit":"bps","type":"u16","min":5000,"max":9500,"default":7500,"step":null,"options":null,"rule":null,"scope":"pool","fixed":false,"help":"Share of a gap-closing swap's profit it pays back. The arber keeps the rest."},{"key":"recap_trader_bps","label":"Opener share","unit":"bps","type":"u16","min":0,"max":1000,"default":1000,"step":null,"options":null,"rule":null,"scope":"pool","fixed":false,"help":"Share of the profit credited to the trader whose swap opened the gap; LPs get it if there is none."},{"key":"recap_min_gap_bps","label":"Least gap","unit":"bps","type":"u16","min":10,"max":1000,"default":30,"step":null,"options":null,"rule":null,"scope":"pool","fixed":false,"help":"Distance from the reference price below which nothing is recaptured."},{"key":"release_secs","label":"LP release","unit":"secs","type":"u32","min":120,"max":86400,"default":3600,"step":null,"options":null,"rule":null,"scope":"pool","fixed":false,"help":"The LPs' part streams into fee growth over this long, so liquidity added just in time earns little."},{"key":"recap_ref","label":"Reference price","unit":"choice","type":"u8","min":1,"max":3,"default":null,"step":null,"options":[{"value":1,"label":"Pyth price"},{"value":2,"label":"Sibling reel pool"},{"value":3,"label":"Sibling pool × Pyth"}],"rule":null,"scope":"pool","fixed":false,"help":"1 reads a Pyth feed for the exact pair; 2 a reel pool of the same pair; 3 pool 1 of a multi-pool launch, converted by Pyth. §5a: 1 when a feed is given, 3 for pools 2..n of a new token's multi-pool launch; a single-pool new token has no reference, so recapture stays off."},{"key":"recap_max_age","label":"Reference age limit","unit":"secs","type":"u16","min":5,"max":3600,"default":60,"step":null,"options":null,"rule":null,"scope":"pool","fixed":false,"help":"A reference older than this is skipped, and the swap pays no recapture."}],"page":"/hooks/arb-recapture","launch":"/launch?add=arb-recapture"},{"id":"king-of-the-pool","name":"King of the Pool","category":"rewards","phase":"SWITCH","bit":12,"status":"live","statusNote":"In the reel program: bit 12 of PoolParams.blocks, frozen at PoolInit (PROGRAM.md §5).","line":"Each round's biggest single buy takes a prize from a pot recapture fills.","onReel":"A pool joins the round in progress if at least half remains. The largest buy by gross spend A ≥ kotp_min_buy from an on-curve signer at top level leads; one place per wallet, a tie doesn't pass, and a sell in the same slot restores the podium. Each place's cap = ½·(protocol cut of LP Rewards + burn on that buy)·(1 − integrator). KotpSettle (anyone; the SDK prepends it to the first swap after a round) credits min(pot·share_i, cap_i, spend_i·rate₁) to ledgers and releases 1 − (1 − r)ⁿ of the rest to LPs.","paid":"Kings, to their claim ledgers; LPs, through the released pot.","requires":["arb-recapture"],"conflicts":[],"settings":[{"key":"kotp_pot_bps","label":"Pot share","unit":"bps","type":"u16","min":1,"max":5000,"default":2500,"step":null,"options":null,"rule":null,"scope":"pool","fixed":false,"help":"Share of what the pool keeps from each recapture, after reel and the opener, that fills the pot."},{"key":"kotp_round_secs","label":"Round length","unit":"secs","type":"u32","min":3600,"max":2592000,"default":86400,"step":null,"options":null,"rule":null,"scope":"pool","fixed":false,"help":"Rounds align to UTC. A pool joins the round in progress if at least half of it remains."},{"key":"kotp_release_bps","label":"Pot released per round","unit":"bps","type":"u16","min":2500,"max":10000,"default":5000,"step":null,"options":null,"rule":null,"scope":"pool","fixed":false,"help":"Share of what is left in the pot after prizes that streams to LPs at each close."},{"key":"kotp_min_buy","label":"Least buy that counts","unit":"atoms","type":"u64","min":1,"max":null,"default":null,"step":null,"options":null,"rule":null,"scope":"pool","fixed":false,"help":"Quote atoms of gross spend a buy needs to take a place. Above 0; sized to the quote at launch."},{"key":"kotp_podium","label":"Podium","unit":"choice","type":"u8","min":1,"max":3,"default":1,"step":null,"options":[{"value":1,"label":"One king"},{"value":2,"label":"Top two, 70/30"},{"value":3,"label":"Top three, 50/30/20"}],"rule":null,"scope":"pool","fixed":false,"help":"How each round's pot is shared among its biggest buys."}],"page":"/hooks/king-of-the-pool","launch":"/launch?add=king-of-the-pool"},{"id":"holder-pot","name":"Holder Pot","category":"rewards","phase":"AFTER","bit":7,"status":"live","statusNote":"In the reel program for new reel tokens: bit 7 of PoolParams.blocks, on one pool per launch. reel-hook books what each holder earns on chain, and reel-vaults' payouts module pays it out: anyone can trigger HolderPay, and it lands in the holder's own token account.","line":"Sandwich Guard's charges fill a pot paid to holders by tokens × time held.","onReel":"Charges routed to destination 2 (Sandwich sandwich_to = 2, Swap Cut, Exit Clock) accrue in the HOLDER_POT bucket. BucketCollect (anyone) pays it into the Holder Pot account of reel-vaults' [\"hpot\", mint] payer, and reel-hook streams it over 24 h to eligible holders: on-curve wallets with a holder record (the app opens one on a wallet's first buy), not the creator. reel-hook books each holder's HookHolder.earned; reel-vaults' HolderPay pays what was booked, less what it already paid, to the holder. One pool per launch, whose quote is the pot's pay mint.","paid":"Holders, by tokens × time held: booked on chain by reel-hook, paid out by reel-vaults.","requires":["sandwich-guard"],"conflicts":[],"settings":[],"page":"/hooks/holder-pot","launch":"/launch?add=holder-pot"},{"id":"swap-reward-mint","name":"Swap Reward Mint","category":"rewards","phase":"ADVISORY","bit":20,"status":"live","statusNote":"In the reel program: bit 20 of PoolParams.blocks, frozen at PoolInit (PROGRAM.md §5).","line":"Pays traders a reward token for each swap, funded by a slice of the trade.","onReel":"Charged swaps pay reward_pips[side], protocol share first, the rest to REWARD_CREATOR for the payee. The same swap mints min(slice·rate/10⁹, max_swap, cap − minted) of the adv[0] mint, whose mint authority must be the pool's own PDA [\"reward\", pool] (checked at PoolInit, so no other pool can mint it), to the trader, only if the trader receives the output. No slice once the reward is 0, after reward_ends, or on exact-out sells.","paid":"The payee, after reel's share; traders get the minted reward token.","requires":[],"conflicts":[],"settings":[{"key":"reward_pips[0]","label":"Buy slice","unit":"pips","type":"u32","min":0,"max":50000,"default":10000,"step":null,"options":null,"rule":"At least one side above 0.","scope":"pool","fixed":false,"help":"Of each buy's quote, on top of pool fees. reel's share first; the rest goes to the payee."},{"key":"reward_pips[1]","label":"Sell slice","unit":"pips","type":"u32","min":0,"max":50000,"default":10000,"step":null,"options":null,"rule":"At least one side above 0.","scope":"pool","fixed":false,"help":"Of each sell's quote, on top of pool fees. reel's share first; the rest goes to the payee."},{"key":"reward_rate","label":"Reward rate","unit":"rate","type":"u64","min":1,"max":1000000000000000000,"default":1000000000,"step":null,"options":null,"rule":null,"scope":"pool","fixed":false,"help":"Reward atoms minted per 10⁹ quote atoms of slice. 10⁹ is one for one."},{"key":"reward_max_swap","label":"Most per swap","unit":"atoms","type":"u64","min":1,"max":null,"default":null,"step":null,"options":null,"rule":null,"scope":"pool","fixed":false,"help":"Reward atoms one swap can mint. Named at launch."},{"key":"reward_cap","label":"Total reward","unit":"atoms","type":"u64","min":0,"max":null,"default":null,"step":null,"options":null,"rule":"At least the most per swap.","scope":"pool","fixed":false,"help":"Reward atoms that can ever be minted; after that the slice stops. Named at launch."},{"key":"reward_run_secs","label":"Runs for","unit":"secs","type":"u32","min":0,"max":4294967295,"default":0,"step":null,"options":null,"rule":null,"scope":"pool","fixed":false,"help":"From open; after it the slice stops. 0 = until the total is minted."}],"page":"/hooks/swap-reward-mint","launch":"/launch?add=swap-reward-mint"},{"id":"referrals","name":"Referrals","category":"rewards","phase":"TRADING","bit":null,"status":"live","statusNote":"In the program: ReferrerRegister, ReferralLink and Config.referral_bps paid in each swap. Funded referral campaigns (Merkle epochs) run in reel-vaults' programs module (opens Nov 12).","line":"Ref codes and links that pay referrers part of the protocol's cut.","onReel":"ReferrerRegister stores the code and ReferralLink binds a wallet for 365 days. Config.referral_bps of each swap's protocol cut from block fees, the minimum fee and burn (not recapture) is credited to the referrer's ledger in the same swap, while the link is live.","paid":"Referrers, out of the protocol's cut.","requires":[],"conflicts":[],"settings":[],"page":"/hooks/referrals","launch":null},{"id":"nth-buy-pot","name":"Nth-buy Pot","category":"rewards","phase":"AFTER","bit":null,"status":"unavailable","statusNote":"Not offered: hookr holds it and launches no pool with it; King of the Pool takes its place and is in reel (bit 12).","line":"Held on hookr: King of the Pool takes its place.","onReel":"Not built. A public counter that any buyer can race is a poor fit for Solana's ordering, and King of the Pool covers the same idea.","paid":"The Nth buyer, on hookr's legacy pools.","requires":[],"conflicts":[],"settings":[],"page":"/hooks/nth-buy-pot","launch":null},{"id":"lp-rewards","name":"LP Rewards","category":"liquidity","phase":"AFTER","bit":3,"status":"live","statusNote":"In the reel program: bit 3 of PoolParams.blocks, frozen at PoolInit (PROGRAM.md §5).","line":"An extra fee on buys, kept by the LPs whose liquidity filled them.","onReel":"Buys pay lp_bps of the input as an LP fee into fee growth, protocol share first; a royalty comes out of the LPs' part. LP Rewards and Auto Burn share 1,000 bps.","paid":"LPs in range, after reel's share and any royalty.","requires":[],"conflicts":[],"settings":[{"key":"lp_bps","label":"LP fee on buys","unit":"bps","type":"u16","min":1,"max":1000,"default":200,"step":null,"options":null,"rule":"LP Rewards + Auto Burn ≤ 1,000 bps.","scope":"pool","fixed":false,"help":"Buys pay it on top of the base fee; reel's share comes off first and LPs keep the rest."}],"page":"/hooks/lp-rewards","launch":"/launch?add=lp-rewards"},{"id":"pay-later","name":"Pay Later","category":"liquidity","phase":"OUTSIDE","bit":null,"status":"periphery","statusNote":"Coming: the `paylater` module is built and tested in reel-vaults' source, not in the deployed build yet. It arrives with an upgrade at the same address.","line":"Buyers pay a premium now to reserve tokens at a fixed price for a term.","onReel":"reel-vaults' paylater module: the creator hands the launch to a vault that collects the launch position's fees (quote fees to the creator, base fees to the inventory). Buyers pay a premium to reserve units at a strike floored by reel's TWAP over at least 30 minutes, then exercise before expiry or let the units return.","paid":"The creator: the whole premium and every strike paid.","requires":[],"conflicts":[],"settings":[],"page":"/hooks/pay-later","launch":null},{"id":"entry-ratio-guarantee","name":"Entry Ratio Guarantee","category":"liquidity","phase":"OWN HOOK","bit":null,"status":"periphery","statusNote":"Coming: the `erg` module is built and tested in reel-vaults' source, not in the deployed build yet. It arrives with an upgrade at the same address.","line":"LPs can exit with the token amounts they put in, covered by forfeited fees.","onReel":"reel-vaults' erg module: an LP hands a reel Position to the pool's guarantee, which records its entry amounts. Its LP fees go to the pool's shared cover while guaranteed; on a covered exit the vault pays the shortfall, valued at reel's TWAP over at least 30 minutes and capped at the position's share of the cover. A ticket can leave only once it matures (min_hold to twice that).","paid":"Exiting LPs, from the cover. Every forfeited fee stays in the cover; reel takes no share.","requires":[],"conflicts":[],"settings":[],"page":"/hooks/entry-ratio-guarantee","launch":null},{"id":"floor-bid","name":"Floor bid","category":"liquidity","phase":"OUTSIDE","bit":null,"status":"partial","statusNote":"Partial: live in reel-vaults' orders module as a standing buy order that anyone re-prices to TWAP × (1 − offset) once per cooldown (at least 30 minutes), never past the owner's worst price. reel pools are full-range, so it is a taker order, not a single-sided LP range: it earns no LP fees and closes on its first fill.","line":"A treasury's standing bid below the price that buys the token as it falls.","onReel":"A Floor bid order in reel-vaults' orders module, not a pool block: the owner escrows quote with an offset, a cooldown, a worst price and a fill bounty. FloorRebalance (anyone) re-prices its limit from reel's TWAP; any filler swaps the whole escrow through reel's Swap once the pool pays the limit and takes the bounty.","paid":"The owner's recipient gets the tokens; the filler takes the bounty. reel takes its usual swap fees.","requires":[],"conflicts":[],"settings":[],"page":"/hooks/floor-bid","launch":null},{"id":"fee-bridge","name":"Fee Bridge","category":"liquidity","phase":"OUTSIDE","bit":null,"status":"vaults","statusNote":"Live in reel-vaults on Solana mainnet (the `bridge` module).","line":"Pays a royalty or a tax, a capped drip at a time, to another pool's LPs.","onReel":"reel-vaults' bridge module: reel's fee keeper records the pool and drips at most max_per_drip per min_interval into one destination pool's LP stream through reel's Donate, which releases over the pool's release window, so liquidity added just in time gets little. If the keeper makes no call for 7 days, anyone may record and drip under the same caps.","paid":"Another pool's LPs; the keeper (or fallback caller) earns a tip of at most 1%.","requires":[],"conflicts":[],"settings":[],"page":"/hooks/fee-bridge","launch":null},{"id":"dev-buy","name":"Dev buy and lock","category":"team","phase":"LAUNCH","bit":null,"status":"launch","statusNote":"An option of reel's launch flow, fixed when the launch is created (PROGRAM.md §5, §7).","line":"One first buy per pool inside the launch, then the launch liquidity stays locked.","onReel":"LaunchDevBuy(quote_in, min_out, lock_secs): new tokens only, once per pool, before LaunchFinalize. On a guarded pool it needs snipe_tax > 0 and snipe_cap ≥ quote_in (DevBuyRefused). Finalize checks escrow_left + dev_bought ≤ 5% of supply (RetainedAboveCap), and principal_lock_until = max(guard end, open + dev lock, open + lock end).","paid":"Every fee a buy pays.","requires":[],"conflicts":["zap-relay-target"],"settings":[{"key":"quote_in","label":"Dev buy","unit":"atoms","type":"u64","min":1,"max":null,"default":null,"step":null,"options":null,"rule":"On a guarded pool: Snipe tax above 0 and snipe_cap at least this.","scope":"launch","fixed":false,"help":"Quote atoms for one first buy on a pool, before finalize. It pays every fee a buy pays."},{"key":"dev_lock_secs","label":"Dev-buy lock","unit":"secs","type":"u32","min":0,"max":31536000,"default":604800,"step":null,"options":null,"rule":null,"scope":"launch","fixed":false,"help":"Launch liquidity stays in the pool at least this long after open. Bought tokens are not locked."}],"page":"/hooks/dev-buy","launch":null},{"id":"liquidity-lock","name":"Liquidity lock","category":"team","phase":"LAUNCH","bit":null,"status":"launch","statusNote":"An option of reel's launch flow, fixed when the launch is created (PROGRAM.md §5, §7).","line":"Keeps the launch liquidity in its pools for a set time, or hands the launch to a lock.","onReel":"lock_end_secs ≤ 1,200,000 at LaunchCreate. After launch, LaunchLock(beneficiary, unlock_ts or forever) stops withdrawals and hand-overs; the beneficiary collects every fee and, once unlocked, LaunchUnlock passes the launch on. Forever never releases.","paid":"Nobody: it charges nothing.","requires":[],"conflicts":[],"settings":[{"key":"lock_end_secs","label":"Lock end","unit":"secs","type":"u32","min":0,"max":1200000,"default":0,"step":null,"options":null,"rule":null,"scope":"launch","fixed":false,"help":"Liquidity stays until the latest of the guard end, the dev-buy lock and this. 0 = off. Fees stay collectable."}],"page":"/hooks/liquidity-lock","launch":null},{"id":"supply-you-keep","name":"Supply you keep","category":"team","phase":"LAUNCH","bit":null,"status":"launch","statusNote":"An option of reel's launch flow, fixed when the launch is created (PROGRAM.md §5, §7).","line":"Declares on chain the most of a new token's supply the creator may hold at launch.","onReel":"max_retained_bps at LaunchCreate. LaunchFinalize checks escrow_left + dev_bought ≤ max_retained, and ≤ 5% with a dev buy (RetainedAboveCap); LaunchReturn later sends the escrow's leftover to the creator.","paid":"Nobody: it charges nothing.","requires":[],"conflicts":[],"settings":[{"key":"max_retained_bps","label":"Most you keep","unit":"bps","type":"u16","min":0,"max":10000,"default":10000,"step":null,"options":null,"rule":"With a dev buy, at most 500 (5%) applies on top.","scope":"launch","fixed":false,"help":"Of a new token's supply, dev buys plus what no pool took, checked at finalize. 10,000 is no cap; existing-token launches are forced to 10,000."}],"page":"/hooks/supply-you-keep","launch":null},{"id":"vesting-milestone","name":"Vesting Milestone","category":"team","phase":"LAUNCH","bit":null,"status":"periphery","statusNote":"Coming: the `escrow` module is built and tested in reel-vaults' source, not in the deployed build yet. It arrives with an upgrade at the same address.","line":"Locks a team allocation that vests after a cliff, then linearly.","onReel":"reel-vaults' escrow module, beside the launch: an escrow PDA holds the allocation and vests it after the cliff, then linearly, to the beneficiary. The owner can only slow it, through a 30-minute timelock. Nothing in the pool program reads it.","paid":"The beneficiary.","requires":[],"conflicts":[],"settings":[],"page":"/hooks/vesting-milestone","launch":null},{"id":"dev-drip","name":"Dev Drip","category":"team","phase":"LAUNCH","bit":null,"status":"periphery","statusNote":"Coming: the `escrow` module is built and tested in reel-vaults' source, not in the deployed build yet. It arrives with an upgrade at the same address.","line":"Releases the creator's own allocation through the pool, a slice per window.","onReel":"reel-vaults' escrow module: an escrow PDA that sells through reel's Swap at most max_bps of the allocation per window, never below a floor priced from reel's TWAP; the owner claims the quote proceeds.","paid":"The creator, from the sales.","requires":[],"conflicts":[],"settings":[],"page":"/hooks/dev-drip","launch":null},{"id":"zap-relay-source","name":"Zap Relay source","category":"pools","phase":"ADVISORY","bit":18,"status":"partial","statusNote":"Partial: the cut accrues on reel and is paid to the zap vault named at launch; the vault that buys the target pool is reel-vaults' zap module (coming).","line":"Routes a cut of every buy to a zap vault that buys another pool.","onReel":"Buys pay zap_pips, the pool's protocol share (20–50%) first, into the ZAP bucket; BucketCollect pushes it to the adv[0] token account, a reel-vaults zap vault.","paid":"Another pool, through its zap vault, after reel's share.","requires":[],"conflicts":[],"settings":[{"key":"zap_pips","label":"Cut of each buy","unit":"pips","type":"u32","min":1,"max":100000,"default":10000,"step":null,"options":null,"rule":null,"scope":"pool","fixed":false,"help":"Of what each buyer spends, paid into the zap vault after reel's share. Sells pay nothing."}],"page":"/hooks/zap-relay-source","launch":"/launch?add=zap-relay-source"},{"id":"zap-relay-target","name":"Zap Relay target","category":"pools","phase":"ADVISORY","bit":19,"status":"partial","statusNote":"Partial: the gate is in reel, but the feeder vaults that buy are reel-vaults' zap module (coming), so until it runs nothing can buy the pool.","line":"A pool only its feeder zap vaults may buy; anyone may sell.","onReel":"Only the feeders in adv[0..4] (1 to 4 set) may buy or add, besides the launch position (ZapTargetOnly). Anyone may sell. No recapture and no dev buy.","paid":"Nothing extra; its LPs earn the usual fees on the vaults' buys.","requires":[],"conflicts":["arb-recapture","dev-buy"],"settings":[],"page":"/hooks/zap-relay-target","launch":"/launch?add=zap-relay-target"},{"id":"pool-mesh","name":"Pool Mesh","category":"pools","phase":"ADVISORY","bit":null,"status":"periphery","statusNote":"Coming: the `zap` module is built and tested in reel-vaults' source, not in the deployed build yet. It arrives with an upgrade at the same address.","line":"One zap vault, fed by many pools, that buys up to four target pools.","onReel":"reel-vaults' zap module with 2 to 4 targets: the vault calls reel's Swap by CPI as a feeder of each target, then burns what it buys or adds it as permanent liquidity. Feeders run Zap Relay source (bit 18) and targets Zap Relay target (bit 19).","paid":"The target pools, through the mesh, after reel's share.","requires":[],"conflicts":[],"settings":[],"page":"/hooks/pool-mesh","launch":null},{"id":"family-pinger","name":"Family Pinger","category":"pools","phase":"OUTSIDE","bit":null,"status":"periphery","statusNote":"Coming: the `zap` module is built and tested in reel-vaults' source, not in the deployed build yet. It arrives with an upgrade at the same address.","line":"Runs every due zap and payout of a launch in one call, for a tip.","onReel":"reel-vaults' zap module: a per-launch lamport budget that tips whoever runs a due zap of a vault targeting one of the launch's pools, at most once per interval. KotpSettle and BucketCollect are already permissionless calls a crank can batch.","paid":"The caller, from the crank's tip budget.","requires":[],"conflicts":[],"settings":[],"page":"/hooks/family-pinger","launch":null},{"id":"multi-pool-launch","name":"Multi-pool launch","category":"pools","phase":"LAUNCH","bit":null,"status":"launch","statusNote":"An option of reel's launch flow, fixed when the launch is created (PROGRAM.md §5, §7).","line":"Opens one token in up to 8 pools at once, each with its own quote and blocks.","onReel":"LaunchCreate(pool_count), then PoolInit for each pool (distinct quotes, each validated), PoolSeed for each, and LaunchFinalize once all are seeded. The transactions are linked by the Launch account; LaunchAbort lets launch positions out of pools that never went live.","paid":"Nothing extra; each pool's blocks charge as set.","requires":[],"conflicts":[],"settings":[{"key":"pool_count","label":"Pools","unit":"count","type":"u8","min":1,"max":8,"default":1,"step":null,"options":null,"rule":null,"scope":"launch","fixed":false,"help":"Pools of the launch, each on its own quote."}],"page":"/hooks/multi-pool-launch","launch":null},{"id":"supply-split","name":"Supply split","category":"pools","phase":"LAUNCH","bit":null,"status":"launch","statusNote":"An option of reel's launch flow, fixed when the launch is created (PROGRAM.md §5, §7).","line":"Seeds each pool of a new token with an exact share of the supply.","onReel":"weights[8] at LaunchCreate: all set or none, adding up to at most 10,000, and PoolSeed must move exactly weight·supply/10⁴ (WeightMismatch).","paid":"Nobody: it charges nothing.","requires":[],"conflicts":[],"settings":[{"key":"weights[i]","label":"Weight per pool","unit":"bps","type":"u16","min":0,"max":10000,"default":null,"step":null,"options":null,"rule":"Every pool weighted or none; the weights add up to at most 10,000.","scope":"launch","fixed":false,"help":"Share of supply each pool is seeded with; each seed must equal weight × supply / 10⁴ exactly."}],"page":"/hooks/supply-split","launch":null},{"id":"opening-price-check","name":"Opening price check","category":"pools","phase":"LAUNCH","bit":null,"status":"launch","statusNote":"An option of reel's launch flow, fixed when the launch is created (PROGRAM.md §5, §7).","line":"Fails the launch if a pool opens too far from pool 1's price.","onReel":"opening_tolerance_bps (1 to 1,000; 0 = off) is checked at LaunchFinalize against live reel reference pools (OpeningOutsideTolerance).","paid":"Nobody: it charges nothing.","requires":[],"conflicts":[],"settings":[{"key":"opening_tolerance_bps","label":"Tolerance","unit":"bps","type":"u16","min":0,"max":1000,"default":0,"step":null,"options":null,"rule":null,"scope":"launch","fixed":false,"help":"Each later pool must open within this of pool 1's price, through a live reel reference pool. 0 = off."}],"page":"/hooks/opening-price-check","launch":null},{"id":"limit-orders","name":"Limit orders","category":"pools","phase":"TRADING","bit":null,"status":"vaults","statusNote":"Live in reel-vaults on Solana mainnet (the `orders` module).","line":"Escrow a trade with a price limit; anyone fills it once the pool pays the limit.","onReel":"reel-vaults' orders module: an order escrows one exact-in reel swap with a minimum output, a lifetime of 60 s to 365 days and a lamport bounty of up to 0.01 SOL. Any keeper or agent fills the whole escrow through reel's Swap once the pool pays the limit, and takes the bounty; the output goes straight to the recipient, and the owner can cancel for a full refund.","paid":"Whoever fills the order, from its bounty.","requires":[],"conflicts":[],"settings":[],"page":"/hooks/limit-orders","launch":null},{"id":"best-route","name":"Best route","category":"pools","phase":"TRADING","bit":null,"status":"partial","statusNote":"Partial: an app feature, off the swap path. The swap card shows Jupiter's quote for the same exact-input trade beside the pool's; it compares, and doesn't route the trade elsewhere. No program change.","line":"Compares the pool with other venues before a trade and offers a clearly better route.","onReel":"App-side and off the swap path: the swap card reads Jupiter's quote for the same exact-input trade and shows how much more or less it returns than the pool, before you sign. It never builds or sends the other route.","paid":"Nobody: it charges nothing.","requires":[],"conflicts":[],"settings":[],"page":"/hooks/best-route","launch":null},{"id":"outside-fill","name":"Outside Fill","category":"pools","phase":"DEPLOYING SOON","bit":null,"status":"unavailable","statusNote":"Not offered: reel's swap fills only from its own curve (PROGRAM.md §4), and hookr's version isn't open on any pool yet.","line":"Fills part of a swap from an outside venue when it gives more than the pool.","onReel":"Not in reel. A CPI leg to another Solana AMM inside Swap would be a program change, not a block setting.","paid":"Nothing extra; the outside part pays the pool's take.","requires":[],"conflicts":[],"settings":[],"page":"/hooks/outside-fill","launch":null}],"presets":[{"id":"recommended-new","name":"Recommended for a new token","line":"Snipers pay LPs at launch, fees rise with big moves, and a little burns on every buy.","token":"new","blocks":["anti-snipe","dynamic-fees","auto-burn","lp-rewards"]},{"id":"recommended-existing","name":"Recommended for a token that already trades","line":"No guard on a token that already trades. Fees follow moves; the pool keeps most arbitrage profit.","token":"existing","blocks":["dynamic-fees","lp-rewards","arb-recapture"]},{"id":"fair-launch","name":"Fair launch","line":"Bots and the team buy on the same terms, no wallet takes over 2%, and nobody sells in the first minute.","token":"new","blocks":["anti-snipe","wallet-cap","buy-sell-block","dynamic-fees","lp-rewards"]},{"id":"king-of-the-pool","name":"King of the Pool launch","line":"A daily contest: the biggest buy takes a prize from the arbitrage pot.","token":"new","blocks":["anti-snipe","dynamic-fees","auto-burn","lp-rewards","arb-recapture","king-of-the-pool"]},{"id":"weekly-king-rewards","name":"Weekly King of the Pool with buy rewards","line":"Week-long rounds, a 50% protocol share, and a reward token minted on every buy.","token":"new","blocks":["anti-snipe","dynamic-fees","auto-burn","lp-rewards","arb-recapture","king-of-the-pool","swap-reward-mint"]},{"id":"creator-economy","name":"Creator economy token","line":"A 1% creator cut each way and a 10% royalty, shared among the team.","token":"new","blocks":["anti-snipe","dynamic-fees","lp-rewards","creator-royalty","swap-cut"]},{"id":"charity-token","name":"Charity token","line":"A 10% royalty to the cause and liquidity locked for good.","token":"new","blocks":["anti-snipe","dynamic-fees","auto-burn","lp-rewards","creator-royalty"]},{"id":"treasury-backed","name":"Treasury-backed token","line":"A 3% sell tax to the treasury, and a floor bid beside the pool.","token":"new","blocks":["anti-snipe","dynamic-fees","lp-rewards","swap-cut"]},{"id":"stock-quoted","name":"Stock-quoted token","line":"A pool quoted in a tokenized stock, with a fee that follows the US market's sessions.","token":"new","blocks":["dynamic-fees","lp-rewards","market-hours-fee"]},{"id":"trader-first","name":"Trader-first pools","line":"No LP Rewards or burn; the trader whose swap opened a gap gets the full 10% of its profit.","token":"existing","blocks":["dynamic-fees","arb-recapture","sandwich-guard"]},{"id":"burn-relay","name":"Burn relay","line":"A target pool only zap vaults buy, burning what they buy. Its sources send 1% of their buys.","token":"new","blocks":["dynamic-fees","lp-rewards","zap-relay-target"]},{"id":"stable-pair-fee","name":"Stable-pair project fee","line":"A 0.3% project fee each way on a stablecoin pool at a 0.3% base fee.","token":"existing","blocks":["swap-cut"]},{"id":"bot-resistant","name":"Bot-resistant fair launch","line":"A front-loaded Snipe tax, sandwiches paid back to reel, and LPs paid by the bots.","token":"new","blocks":["anti-snipe","dynamic-fees","auto-burn","lp-rewards","sandwich-guard"]},{"id":"guarded-venue","name":"Guarded SOL/USDC venue","line":"A pool held near Pyth's price: swaps that stray past ±10% pay LPs up to 1%.","token":"existing","blocks":["dynamic-fees","lp-rewards","arb-recapture","market-guard"]},{"id":"hold-to-pay-less","name":"Hold to pay less","line":"Quick flips pay LPs a sell fee that falls to nothing over three days, and sandwiches pay reel.","token":"new","blocks":["anti-snipe","dynamic-fees","lp-rewards","sandwich-guard","exit-clock"]},{"id":"lp-first","name":"LP-first venue","line":"A 0.1% base fee that climbs to 1% on big moves, and recapture paid to LPs, not openers.","token":"existing","blocks":["dynamic-fees","arb-recapture"]},{"id":"blank","name":"Start blank","line":"An empty board at the pool's base fee.","token":"new","blocks":[]}],"caps":{"lpFeeMaxPips":600000,"quoteTakeMaxPips":350000,"lpRewardsPlusBurnMaxBps":1000,"sellChargesMaxPips":200000,"advisoryBlocksMax":1,"protocolShareBps":{"min":2000,"max":5000},"note":"Checked at PoolInit against every block's maximum (PROGRAM.md §4). 10,000 pips = 1%."},"frozen":"A pool's blocks and settings are frozen at PoolInit; nobody can change them afterwards."},"meta":{"apiVersion":"v1","generatedAt":"2026-11-06T11:15:10.829Z","source":"lib/blocks"}}