Technical Architecture
Deep dive into the program structure, state management, and core algorithms
System Flow Diagram
Interactive SVG diagram showing the complete fee routing flow from pool to final distribution
Four-Instruction Design
1. initialize_policy
Creates immutable Policy PDA with distribution configuration (Y0, fee shares, caps, thresholds).
2. initialize_progress
Creates mutable Progress PDA for daily distribution tracking and pagination state.
3. initialize_position
Creates honorary DAMM V2 position owned by program PDA. Validates pool configuration and program IDs.
4. distribute_fees
Permissionless 24h crank that claims fees and executes real SPL token transfers. Distributes quote token (Token B) pro-rata to investors and sends remainder to creator. FAILS deterministically if any Token A (base fees) are detected, ensuring quote-only compliance.
State Accounts
Policy (Immutable)
Progress (Mutable)
Why 4 Instructions Instead of 2?
Bounty Requirements Analysis
Bounty specifies:
- Work Package A: Initialize honorary position (1 instruction)
- Work Package B: Permissionless distribution crank (1 instruction)
- → Implied total: 2 functional instructions
BUT bounty also requires (line 96):
- "Policy PDA (fee share, caps, dust)"
- "Progress PDA (last ts, daily spent, carry, cursor, day state)"
- → Must exist BEFORE distribute_fees runs, but HOW to initialize? Not specified!
❌ 2-Instruction Approach (Messy)
- • Cram Policy init into
initialize_position - • Cram Progress init into
initialize_position - • Violates single responsibility principle
- • initialize_position becomes bloated (3 accounts init)
- • Less flexible for different setups
- • Harder to test each component
✅ 4-Instruction Approach (Clean)
- •
initialize_policy- Setup config (single purpose) - •
initialize_progress- Setup state (single purpose) - •
initialize_position- Create position (single purpose) - •
distribute_fees- Distribution logic (single purpose) - • Modular & maintainable
- • Easier integration & testing
- • Follows Anchor best practices
✅ Verdict: 4 Instructions is Superior
PDA Seeds & Derivation
// Core PDA seeds
pub const VAULT_SEED: &[u8] = b"vault";
pub const INVESTOR_FEE_POS_OWNER_SEED: &[u8] = b"investor_fee_pos_owner";
pub const POLICY_SEED: &[u8] = b"policy";
pub const PROGRESS_SEED: &[u8] = b"progress";
pub const TREASURY_SEED: &[u8] = b"treasury";
// Position owner PDA derivation
let (position_owner, bump) = Pubkey::find_program_address(
&[
VAULT_SEED,
vault.key().as_ref(),
INVESTOR_FEE_POS_OWNER_SEED
],
&fee_routing::ID
);