Protocol
Accounts & PDAs

Accounts & PDAs

Complete reference for all on-chain accounts and Program Derived Addresses.

VaultConfig Account

Main vault configuration PDA.

Seeds: ["vault", authority, nonce]

Size: 859 bytes

Fields:

FieldTypeDescription
authorityPubkeyVault owner (32 bytes)
agent_signerPubkeyAuthorized AI agent (32 bytes)
daily_limitu64Max lamports per day
spent_todayu64Amount spent today
last_reseti64Unix timestamp of last reset
whitelist[Pubkey; 20]Whitelisted addresses
whitelist_countu8Number of active addresses
tierVaultTierVault tier enum
fee_basis_pointsu16Fee (default: 5 = 0.05%)
name[u8; 50]Vault name (UTF-8)
name_lenu8Actual name length
pausedboolIs vault paused
override_nonceu64Next override nonce
vault_nonceu64Vault nonce
bumpu8PDA bump seed

Vault Authority PDA

Holds actual SOL for the vault.

Seeds: ["vault_authority", vault_pda]

Type: System Program account

This is the deposit address where users send SOL to fund vaults.

PendingOverride Account

Stores override requests for blocked transactions.

Seeds: ["override", vault_pda, override_nonce]

Fields:

FieldTypeDescription
vaultPubkeyVault address
nonceu64Override nonce
destinationPubkeyBlocked destination
amountu64Blocked amount
reasonBlockReasonWhy blocked
approvedboolApproval status
executedboolExecution status
expires_ati64Expiration timestamp
created_ati64Creation timestamp

FeeTreasury Account

Singleton account collecting protocol fees.

Seeds: ["fee_treasury"]

Fields:

FieldTypeDescription
authorityPubkeyTreasury owner
total_collectedu64Total fees collected
bumpu8PDA bump seed

Enums

VaultTier

pub enum VaultTier {
    Personal,
    Team,
    Enterprise,
}

BlockReason

pub enum BlockReason {
    NotWhitelisted = 0,
    ExceededDailyLimit = 1,
    InsufficientFunds = 2,
}

PDA Derivation Examples

Derive Vault PDA (TypeScript)

import { PublicKey } from '@solana/web3.js';
 
function deriveVaultPda(
  authority: PublicKey,
  programId: PublicKey,
  nonce: bigint
): [PublicKey, number] {
  const nonceBuffer = Buffer.alloc(8);
  nonceBuffer.writeBigUInt64LE(nonce);
 
  return PublicKey.findProgramAddressSync(
    [
      Buffer.from('vault'),
      authority.toBuffer(),
      nonceBuffer,
    ],
    programId
  );
}

Derive Vault Authority (TypeScript)

function deriveVaultAuthority(
  vaultPda: PublicKey,
  programId: PublicKey
): [PublicKey, number] {
  return PublicKey.findProgramAddressSync(
    [
      Buffer.from('vault_authority'),
      vaultPda.toBuffer(),
    ],
    programId
  );
}

Rent Exemption

All accounts are rent-exempt:

  • VaultConfig: ~0.006 SOL
  • PendingOverride: ~0.002 SOL
  • FeeTreasury: ~0.001 SOL