Solana Program Architecture

Deep dive into the Solana program implementation, account management, and program-derived addresses (PDAs) for StyxPay.

Table of Contents


Program Structure

Program Entry Point

use anchor_lang::prelude::*;

declare_id!("STYXpaydm3KVEKCUNb4QJdYsV7KJbBywKq8Qn5X2VUK");

#[program]
pub mod styxpay_settlement {
    use super::*;

    pub fn initialize(
        ctx: Context<Initialize>,
        params: InitializeParams,
    ) -> Result<()> {
        initialize::handler(ctx, params)
    }

    pub fn create_user_account(
        ctx: Context<CreateUserAccount>,
    ) -> Result<()> {
        create_user_account::handler(ctx)
    }

    pub fn deposit(
        ctx: Context<Deposit>,
        amount: u64,
    ) -> Result<()> {
        deposit::handler(ctx, amount)
    }

    pub fn settle_transaction(
        ctx: Context<SettleTransaction>,
        proof: CompressedProof,
        public_inputs: PublicInputs,
    ) -> Result<()> {
        settle_transaction::handler(ctx, proof, public_inputs)
    }

    pub fn withdraw(
        ctx: Context<Withdraw>,
        amount: u64,
        proof: WithdrawalProof,
    ) -> Result<()> {
        withdraw::handler(ctx, amount, proof)
    }

    pub fn update_policy(
        ctx: Context<UpdatePolicy>,
        new_policy: AuthorizationPolicy,
    ) -> Result<()> {
        update_policy::handler(ctx, new_policy)
    }
}

Module Organization


Account Model

Account Layout

Solana accounts have a strict layout:

Settlement State Account

User Account

Nullifier Set Account


Program Derived Addresses

PDA Derivation

PDA Signing


Instruction Processing

Initialize Instruction

Create User Account Instruction


Cross-Program Invocations

Invoking SPL Token

Invoking System Program


Compute Budget Management

Compute Unit Calculation

Request Compute Units


Security Model

Access Control

Emergency Pause



Last Updated: January 2026 Version: 1.0.0

Last updated