a study in the venue as a source of fees, in the geometry of laminar flow, and in the protocols by which patience is paid from outside the float
Most yield a token offers is a claim on its own future inflow. A holder is paid, when paid at all, out of the price the next participant agrees to pay, which means the distribution stays solvent exactly as long as new capital continues to arrive and turns insolvent the moment it stops. Poiseuille proceeds from a different source. Underneath the token sits a matching venue that executes trades off the chain and settles them on it, and that venue charges a fee on every match it clears. The fee is paid by the act of trading, not by the arrival of new holders, which makes it exogenous to the float. It is generated by activity the protocol does not have to manufacture, and it continues to issue in a market that has stopped appreciating. The stream you are watching is that fee, in motion, on its way to the wallets that hold the token.
The venue distributes the fee the way a pipe distributes flow. In laminar flow through a cylinder, the rate at which fluid moves is not uniform across the cross section. It is fastest along the central axis and falls to zero at the wall, tracing a parabola from one edge to the other. The total volume the pipe carries is governed by Poiseuille's law, in which flow rises with the fourth power of the radius, so that a pipe of twice the radius carries sixteen times the flow. The protocol assigns each holder a radius equal to the duration the position has been held without an outbound transfer. A holder's share of the fee stream is then the flow through their pipe, which is to say it grows with the fourth power of their tenure. The difference between a wallet that has held for one week and a wallet that has held for four is not a difference of four. It is a difference of two hundred and fifty-six. Patience, in this system, is not rewarded in proportion. It is rewarded by a power law.
The gauge above renders the stream as it stands. Volume entering the venue appears at the source, on the left, as pressure at the head of the pipe. The rate is read from real trading activity and shown as a single figure, or as a dash when no figure is available. The interior of the pipe carries the flow itself, drawn as streamlines whose velocity follows the parabolic profile, fastest at the center and still at the walls, the visible signature of laminar motion. At the far end the flow leaves the pipe as a series of drips, each falling toward the holders in proportion to the radius of the pipe it came through. Nothing in the image is aggregated or smoothed into an average. The stream is shown at the rate the venue is actually clearing, so that a fast market and a still one produce visibly different pictures, and a holder can see, without reading a number, whether the source is presently full or nearly dry.
The property that separates this arrangement from the redistribution it resembles is the location of the money. A redistribution scheme moves value between holders. The patient are paid by the impatient, the late by the early, and the total available to distribute is bounded by how much new conviction arrives to be taxed. A fee stream is paid from outside that set entirely. The venue earns whether the token is rising or falling, whether holders are accumulating or distributing, because it is compensated for clearing trades and not for issuing tokens. A holder is therefore exposed to a cash flow that does not depend on their own community continuing to grow, only on the venue continuing to clear. This is what real yield means in a setting where the phrase is used loosely. It is the difference between being paid by the next person to hold and being paid by the work the system performs regardless of who holds.
The name poiseuille is taken from Jean Leonard Marie Poiseuille, the physician who, studying the flow of blood through narrow vessels in the eighteen forties, measured the law that now carries his name: that the flow a vessel carries rises with the fourth power of its radius. The reference is exact rather than decorative. The protocol does not approximate the law or borrow it as a figure of speech. It computes each holder's share of the stream as a fourth power function of held duration, the same relation Poiseuille found in the vessel, applied to the pipe through which a fee earned elsewhere reaches the wallet that waited for it. To hold without moving is to widen the vessel. To widen the vessel is to take, by a power law, a larger share of a flow the protocol never had to ask anyone new to provide.
1use anchor_lang::prelude::*;23declare_id!(""); // set at deploy45// poiseuille settlement. a holder's share of the venue fee stream6// scales with the fourth power of held duration, the relation7// poiseuille measured for laminar flow through a vessel:8// q proportional to r^4, with r read as tenure held without moving.910pub const FEE_SHARE_BPS: u16 = 4_000; // venue fee fraction routed to the stream11pub const SLOTS_PER_WEEK: u64 = 1_512_000; // approx, at current slot time1213#[account]14pub struct HolderPosition {15 pub owner: Pubkey,16 pub amount: u64, // tokens held17 pub held_since_slot: u64, // reset on any outbound transfer18 pub conviction_weight: u128, // r^4 of tenure in weeks19}2021#[account]22pub struct StreamState {23 pub venue: Pubkey, // off-chain matching venue authority24 pub pool: u64, // fees accrued, awaiting distribution25 pub total_weight: u128, // sum of holder weights this cycle26 pub last_settled_slot: u64,27}2829// radius is tenure in weeks. weight is radius to the fourth power.30fn conviction_weight(amount: u64, held_slots: u64) -> u128 {31 let weeks = (held_slots / SLOTS_PER_WEEK) as u128;32 let r2 = weeks.saturating_mul(weeks);33 let r4 = r2.saturating_mul(r2);34 (amount as u128).saturating_mul(r4)35}3637#[program]38pub mod poiseuille {39 use super::*;4041 // recompute one position's weight against the current slot.42 pub fn accrue(ctx: Context<Accrue>) -> Result<()> {43 let pos = &mut ctx.accounts.position;44 let now = Clock::get()?.slot;45 let held = now.saturating_sub(pos.held_since_slot);46 pos.conviction_weight = conviction_weight(pos.amount, held);47 Ok(())48 }4950 // any outbound transfer returns the radius to zero.51 pub fn on_outbound_transfer(ctx: Context<Reset>) -> Result<()> {52 let pos = &mut ctx.accounts.position;53 pos.held_since_slot = Clock::get()?.slot;54 pos.conviction_weight = 0;55 Ok(())56 }5758 // route a matched venue fee into the pool. paid by trading,59 // not by new holders, so the source is exogenous to the float.60 pub fn route_fee(ctx: Context<RouteFee>, matched_fee: u64) -> Result<()> {61 let s = &mut ctx.accounts.stream;62 let share = (matched_fee as u128)63 .saturating_mul(FEE_SHARE_BPS as u128) / 10_000;64 s.pool = s.pool.saturating_add(share as u64);65 Ok(())66 }6768 // settle one cycle. each position draws from the pool in69 // proportion to its weight, the flow through a pipe of its radius.70 pub fn settle(ctx: Context<Settle>) -> Result<()> {71 let s = &mut ctx.accounts.stream;72 let pos = &ctx.accounts.position;73 require!(s.total_weight > 0, StreamError::NoWeight);74 let draw = (s.pool as u128)75 .saturating_mul(pos.conviction_weight) / s.total_weight;76 s.pool = s.pool.saturating_sub(draw as u64);77 s.last_settled_slot = Clock::get()?.slot;78 Ok(())79 }80}8182#[derive(Accounts)]83pub struct Accrue<'info> {84 #[account(mut, has_one = owner)]85 pub position: Account<'info, HolderPosition>,86 pub owner: Signer<'info>,87}8889#[derive(Accounts)]90pub struct Reset<'info> {91 #[account(mut, has_one = owner)]92 pub position: Account<'info, HolderPosition>,93 pub owner: Signer<'info>,94}9596#[derive(Accounts)]97pub struct RouteFee<'info> {98 #[account(mut)]99 pub stream: Account<'info, StreamState>,100 #[account(address = stream.venue)]101 pub venue: Signer<'info>,102}103104#[derive(Accounts)]105pub struct Settle<'info> {106 #[account(mut)]107 pub stream: Account<'info, StreamState>,108 #[account(mut, has_one = owner)]109 pub position: Account<'info, HolderPosition>,110 /// CHECK: payout destination owned by the holder111 pub owner: UncheckedAccount<'info>,112}113114#[error_code]115pub enum StreamError {116 #[msg("no conviction weight present in this cycle")]117 NoWeight,118}