@zemyth/raise-sdk 0.1.1 → 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/README.md +11 -9
  2. package/dist/accounts/index.cjs +531 -3
  3. package/dist/accounts/index.cjs.map +1 -1
  4. package/dist/accounts/index.d.cts +307 -2
  5. package/dist/accounts/index.d.ts +307 -2
  6. package/dist/accounts/index.js +503 -4
  7. package/dist/accounts/index.js.map +1 -1
  8. package/dist/constants/index.cjs +41 -3
  9. package/dist/constants/index.cjs.map +1 -1
  10. package/dist/constants/index.d.cts +38 -3
  11. package/dist/constants/index.d.ts +38 -3
  12. package/dist/constants/index.js +40 -4
  13. package/dist/constants/index.js.map +1 -1
  14. package/dist/index.cjs +2297 -361
  15. package/dist/index.cjs.map +1 -1
  16. package/dist/index.d.cts +566 -7
  17. package/dist/index.d.ts +566 -7
  18. package/dist/index.js +2279 -379
  19. package/dist/index.js.map +1 -1
  20. package/dist/instructions/index.cjs +783 -40
  21. package/dist/instructions/index.cjs.map +1 -1
  22. package/dist/instructions/index.d.cts +492 -6
  23. package/dist/instructions/index.d.ts +492 -6
  24. package/dist/instructions/index.js +762 -42
  25. package/dist/instructions/index.js.map +1 -1
  26. package/dist/pdas/index.cjs +163 -1
  27. package/dist/pdas/index.cjs.map +1 -1
  28. package/dist/pdas/index.d.cts +131 -1
  29. package/dist/pdas/index.d.ts +131 -1
  30. package/dist/pdas/index.js +151 -2
  31. package/dist/pdas/index.js.map +1 -1
  32. package/dist/types/index.cjs +9 -0
  33. package/dist/types/index.cjs.map +1 -1
  34. package/dist/types/index.d.cts +586 -3
  35. package/dist/types/index.d.ts +586 -3
  36. package/dist/types/index.js +9 -1
  37. package/dist/types/index.js.map +1 -1
  38. package/package.json +5 -3
  39. package/src/__tests__/dynamic-tokenomics.test.ts +358 -0
  40. package/src/accounts/index.ts +852 -1
  41. package/src/client.ts +1130 -1
  42. package/src/constants/index.ts +48 -2
  43. package/src/index.ts +58 -0
  44. package/src/instructions/index.ts +1383 -40
  45. package/src/pdas/index.ts +346 -0
  46. package/src/types/index.ts +698 -2
  47. package/src/utils/index.ts +90 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/constants/index.ts","../../src/pdas/index.ts","../../src/accounts/index.ts"],"names":["BN","PublicKey"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Raise Constants\n *\n * Mirrors the on-chain program constants for client-side validation\n * and display purposes.\n */\n\n// =============================================================================\n// PDA Seeds\n// =============================================================================\n\nexport const SEEDS = {\n PROJECT: 'project',\n MILESTONE: 'milestone',\n INVESTMENT: 'investment',\n VOTE: 'vote',\n ESCROW: 'escrow',\n PIVOT: 'pivot',\n PIVOT_PROPOSAL: 'pivot_proposal',\n TGE_ESCROW: 'tge_escrow',\n TGE_ESCROW_VAULT: 'tge_escrow_vault',\n SCAM_REPORT: 'scam_report',\n ADMIN_CONFIG: 'admin-config',\n NFT_MINT: 'nft_mint',\n AUTHORITY: 'authority',\n} as const;\n\n// =============================================================================\n// Validation Constants\n// =============================================================================\n\nexport const VALIDATION = {\n /** Minimum number of milestones per project */\n MIN_MILESTONES: 2,\n /** Maximum number of milestones per project */\n MAX_MILESTONES: 10,\n /** Milestone percentages must sum to this value */\n MILESTONE_PERCENTAGE_SUM: 100,\n /** Maximum funding buffer (110% of goal) */\n MAX_FUNDING_BUFFER_PERCENT: 110,\n /** Maximum metadata URI length */\n MAX_METADATA_URI_LENGTH: 200,\n /** Maximum pivot description length */\n MAX_PIVOT_DESCRIPTION_LEN: 256,\n /** Maximum pivot vision length */\n MAX_PIVOT_VISION_LEN: 512,\n /** Maximum pivot justification length */\n MAX_PIVOT_JUSTIFICATION_LEN: 512,\n} as const;\n\n// =============================================================================\n// Timing Constants (in seconds)\n// =============================================================================\n\nexport const TIMING = {\n /** Production voting period (14 days) */\n VOTING_PERIOD_SECONDS: 1_209_600,\n /** Production hold period (7 days) */\n HOLD_PERIOD_SECONDS: 604_800,\n /** Inactivity timeout (90 days) */\n INACTIVITY_TIMEOUT_SECONDS: 7_776_000,\n /** Abandonment timeout (90 days) */\n ABANDONMENT_TIMEOUT_SECONDS: 7_776_000,\n /** Refund window (14 days) */\n REFUND_WINDOW_SECONDS: 1_209_600,\n /** Pivot withdrawal window (7 days) */\n PIVOT_WITHDRAWAL_WINDOW_SECONDS: 604_800,\n /** Minimum TGE date (15 days from now) */\n TGE_MIN_DAYS: 1_296_000,\n /** Maximum TGE date (90 days from now) */\n TGE_MAX_DAYS: 7_776_000,\n /** Post-TGE holdback period (30 days) */\n POST_TGE_HOLDBACK_DAYS: 2_592_000,\n} as const;\n\n// =============================================================================\n// Tier Configuration Constraints\n// =============================================================================\n\nexport const TIER_CONSTRAINTS = {\n /** Minimum number of tiers */\n MIN_TIERS: 1,\n /** Maximum number of tiers */\n MAX_TIERS: 10,\n /** Minimum tier amount (10 USDC in lamports) */\n MIN_TIER_AMOUNT: 10_000_000n,\n /** Minimum max_lots per tier */\n MIN_TIER_MAX_LOTS: 1,\n /** Minimum token ratio */\n MIN_TIER_TOKEN_RATIO: 1n,\n /** Minimum vote multiplier (100 = 1.0x) */\n MIN_TIER_VOTE_MULTIPLIER: 100,\n} as const;\n\n// =============================================================================\n// Investment Tiers (Legacy - kept for backwards compatibility)\n// =============================================================================\n\nexport enum InvestmentTier {\n Bronze = 'Bronze',\n Silver = 'Silver',\n Gold = 'Gold',\n Platinum = 'Platinum',\n Diamond = 'Diamond',\n}\n\n/** Investment tier minimum amounts in USDC lamports (6 decimals) - LEGACY */\nexport const TIER_MINIMUMS = {\n [InvestmentTier.Bronze]: 100_000_000n, // 100 USDC\n [InvestmentTier.Silver]: 500_000_000n, // 500 USDC\n [InvestmentTier.Gold]: 1_000_000_000n, // 1,000 USDC\n [InvestmentTier.Platinum]: 5_000_000_000n, // 5,000 USDC\n [InvestmentTier.Diamond]: 10_000_000_000n, // 10,000 USDC\n} as const;\n\n/** Vote weight multipliers (scaled by 100) - LEGACY */\nexport const TIER_VOTE_MULTIPLIERS = {\n [InvestmentTier.Bronze]: 100, // 1.0x\n [InvestmentTier.Silver]: 120, // 1.2x\n [InvestmentTier.Gold]: 150, // 1.5x\n [InvestmentTier.Platinum]: 200, // 2.0x\n [InvestmentTier.Diamond]: 300, // 3.0x\n} as const;\n\n/** Token allocation multipliers (same as vote multipliers) - LEGACY */\nexport const TIER_TOKEN_MULTIPLIERS = {\n [InvestmentTier.Bronze]: 100,\n [InvestmentTier.Silver]: 120,\n [InvestmentTier.Gold]: 150,\n [InvestmentTier.Platinum]: 200,\n [InvestmentTier.Diamond]: 300,\n} as const;\n\n/** Get tier from investment amount (in lamports) - LEGACY, use project.tiers instead */\nexport function getTierFromAmount(amount: bigint): InvestmentTier {\n if (amount >= TIER_MINIMUMS[InvestmentTier.Diamond]) return InvestmentTier.Diamond;\n if (amount >= TIER_MINIMUMS[InvestmentTier.Platinum]) return InvestmentTier.Platinum;\n if (amount >= TIER_MINIMUMS[InvestmentTier.Gold]) return InvestmentTier.Gold;\n if (amount >= TIER_MINIMUMS[InvestmentTier.Silver]) return InvestmentTier.Silver;\n return InvestmentTier.Bronze;\n}\n\n/** Get vote multiplier for an investment amount - LEGACY */\nexport function getVoteMultiplier(amount: bigint): number {\n const tier = getTierFromAmount(amount);\n return TIER_VOTE_MULTIPLIERS[tier] / 100;\n}\n\n/** Get token multiplier for an investment amount - LEGACY */\nexport function getTokenMultiplier(amount: bigint): number {\n const tier = getTierFromAmount(amount);\n return TIER_TOKEN_MULTIPLIERS[tier] / 100;\n}\n\n/**\n * Find matching tier index for an investment amount (threshold-based)\n * Returns the highest tier where amount >= tier.amount\n */\nexport function findTierIndex(tiers: Array<{ amount: bigint }>, amount: bigint): number | null {\n for (let i = tiers.length - 1; i >= 0; i--) {\n if (amount >= tiers[i].amount) {\n return i;\n }\n }\n return null;\n}\n\n// =============================================================================\n// Voting and Governance\n// =============================================================================\n\nexport const GOVERNANCE = {\n /** Scam report threshold (30%) */\n SCAM_THRESHOLD_PERCENT: 30,\n /** Consecutive milestone failures before exit window eligible */\n CONSECUTIVE_FAILURES_THRESHOLD: 3,\n /** Milestone approval threshold (>50% weighted approval per whitepaper voting.md:100-101) */\n MILESTONE_APPROVAL_THRESHOLD_PERCENT: 50,\n} as const;\n\n// =============================================================================\n// NFT Constants\n// =============================================================================\n\nexport const NFT = {\n /** NFT symbol */\n SYMBOL: 'SNI',\n /** NFT name prefix */\n NAME_PREFIX: 'Raise Investment #',\n /** Royalty basis points (2%) */\n ROYALTY_BASIS_POINTS: 200,\n} as const;\n\n// =============================================================================\n// USDC Constants\n// =============================================================================\n\nexport const USDC = {\n /** USDC decimals */\n DECIMALS: 6,\n /** Convert USDC to lamports */\n toAmount: (usdc: number): bigint => BigInt(Math.floor(usdc * 10 ** 6)),\n /** Convert lamports to USDC */\n fromAmount: (lamports: bigint): number => Number(lamports) / 10 ** 6,\n} as const;\n","/**\n * Raise PDA Derivation Helpers\n *\n * All PDA derivation functions for the Raise program.\n * PDAs are deterministic addresses derived from seeds and program ID.\n */\n\nimport { PublicKey } from '@solana/web3.js';\nimport { BN } from '@coral-xyz/anchor';\nimport { SEEDS } from '../constants/index.js';\n\n/**\n * Ensure value is a proper BN instance\n * This handles cases where BN objects lose their prototype chain\n * (e.g., when passing through React state or JSON serialization)\n *\n * Uses duck typing instead of instanceof to handle different BN module instances\n */\nfunction ensureBN(value: BN | number | string | { toString(): string }): BN {\n // Duck typing: if it has toArrayLike, it's BN-like and we can use it\n if (value && typeof (value as BN).toArrayLike === 'function') {\n return value as BN;\n }\n // Always create a fresh BN from the SDK's imported BN class\n return new BN(String(value));\n}\n\n/**\n * Derive Project PDA from project ID\n *\n * @param projectId - Unique project identifier\n * @param programId - Raise program ID\n * @returns Project account PDA\n */\nexport function getProjectPDA(projectId: BN | number | string, programId: PublicKey): PublicKey {\n const projectIdBN = ensureBN(projectId);\n const [pda] = PublicKey.findProgramAddressSync(\n [Buffer.from(SEEDS.PROJECT), projectIdBN.toArrayLike(Buffer, 'le', 8)],\n programId\n );\n return pda;\n}\n\n/**\n * Derive Escrow PDA from project ID\n *\n * @param projectId - Project identifier\n * @param programId - Raise program ID\n * @returns Escrow account PDA\n */\nexport function getEscrowPDA(projectId: BN | number | string, programId: PublicKey): PublicKey {\n const projectIdBN = ensureBN(projectId);\n const [pda] = PublicKey.findProgramAddressSync(\n [Buffer.from(SEEDS.ESCROW), projectIdBN.toArrayLike(Buffer, 'le', 8)],\n programId\n );\n return pda;\n}\n\n/**\n * Derive Milestone PDA from project PDA and milestone index\n *\n * @param projectPda - Project account PDA\n * @param milestoneIndex - Milestone index (0-based)\n * @param programId - Raise program ID\n * @returns Milestone account PDA\n */\nexport function getMilestonePDA(\n projectPda: PublicKey,\n milestoneIndex: number,\n programId: PublicKey\n): PublicKey {\n const [pda] = PublicKey.findProgramAddressSync(\n [\n Buffer.from(SEEDS.MILESTONE),\n projectPda.toBuffer(),\n Buffer.from([milestoneIndex]),\n ],\n programId\n );\n return pda;\n}\n\n/**\n * Derive Investment PDA from project PDA and NFT mint\n *\n * @param projectPda - Project account PDA\n * @param nftMint - Investment NFT mint address\n * @param programId - Raise program ID\n * @returns Investment account PDA\n */\nexport function getInvestmentPDA(\n projectPda: PublicKey,\n nftMint: PublicKey,\n programId: PublicKey\n): PublicKey {\n const [pda] = PublicKey.findProgramAddressSync(\n [\n Buffer.from(SEEDS.INVESTMENT),\n projectPda.toBuffer(),\n nftMint.toBuffer(),\n ],\n programId\n );\n return pda;\n}\n\n/**\n * Derive Vote PDA from milestone PDA, voter key, and voting round\n *\n * @param milestonePda - Milestone account PDA\n * @param voterKey - Voter's public key\n * @param votingRound - Current voting round (0 initially, incremented on resubmit)\n * @param programId - Raise program ID\n * @returns Vote account PDA\n */\nexport function getVotePDA(\n milestonePda: PublicKey,\n voterKey: PublicKey,\n votingRound: number,\n programId: PublicKey\n): PublicKey {\n const [pda] = PublicKey.findProgramAddressSync(\n [Buffer.from(SEEDS.VOTE), milestonePda.toBuffer(), voterKey.toBuffer(), Buffer.from([votingRound])],\n programId\n );\n return pda;\n}\n\n/**\n * Derive PivotProposal PDA from project PDA and pivot count\n *\n * @param projectPda - Project account PDA\n * @param pivotCount - Current pivot count from project account\n * @param programId - Raise program ID\n * @returns PivotProposal account PDA\n */\nexport function getPivotProposalPDA(\n projectPda: PublicKey,\n pivotCount: number,\n programId: PublicKey\n): PublicKey {\n const [pda] = PublicKey.findProgramAddressSync(\n [\n Buffer.from(SEEDS.PIVOT), // Use PIVOT seed, not PIVOT_PROPOSAL\n projectPda.toBuffer(),\n Buffer.from([pivotCount]), // pivot_count is u8 (1 byte) on-chain\n ],\n programId\n );\n return pda;\n}\n\n/**\n * Derive TgeEscrow PDA from project PDA\n *\n * @param projectPda - Project account PDA\n * @param programId - Raise program ID\n * @returns TgeEscrow account PDA\n */\nexport function getTgeEscrowPDA(\n projectPda: PublicKey,\n programId: PublicKey\n): PublicKey {\n const [pda] = PublicKey.findProgramAddressSync(\n [Buffer.from(SEEDS.TGE_ESCROW), projectPda.toBuffer()],\n programId\n );\n return pda;\n}\n\n/**\n * Derive TgeEscrowVault PDA from project PDA\n * Used for holding 10% USDC holdback from final milestone\n *\n * @param projectPda - Project account PDA\n * @param programId - Raise program ID\n * @returns TgeEscrowVault PDA\n */\nexport function getTgeEscrowVaultPDA(\n projectPda: PublicKey,\n programId: PublicKey\n): PublicKey {\n const [pda] = PublicKey.findProgramAddressSync(\n [Buffer.from(SEEDS.TGE_ESCROW_VAULT), projectPda.toBuffer()],\n programId\n );\n return pda;\n}\n\n/**\n * Derive TokenVault PDA from project PDA\n * Used for holding project tokens for investor distribution\n *\n * @param projectPda - Project account PDA\n * @param programId - Raise program ID\n * @returns TokenVault PDA\n */\nexport function getTokenVaultPDA(\n projectPda: PublicKey,\n programId: PublicKey\n): PublicKey {\n const [pda] = PublicKey.findProgramAddressSync(\n [Buffer.from('token_vault'), projectPda.toBuffer()],\n programId\n );\n return pda;\n}\n\n/**\n * Derive ScamReport PDA from project PDA and NFT mint\n *\n * @param projectPda - Project account PDA\n * @param nftMint - Reporter's NFT mint address\n * @param programId - Raise program ID\n * @returns ScamReport account PDA\n */\nexport function getScamReportPDA(\n projectPda: PublicKey,\n nftMint: PublicKey,\n programId: PublicKey\n): PublicKey {\n const [pda] = PublicKey.findProgramAddressSync(\n [\n Buffer.from(SEEDS.SCAM_REPORT),\n projectPda.toBuffer(),\n nftMint.toBuffer(),\n ],\n programId\n );\n return pda;\n}\n\n/**\n * Derive AdminConfig PDA (global admin authority)\n *\n * @param programId - Raise program ID\n * @returns AdminConfig account PDA\n */\nexport function getAdminConfigPDA(programId: PublicKey): PublicKey {\n const [pda] = PublicKey.findProgramAddressSync(\n [Buffer.from(SEEDS.ADMIN_CONFIG)],\n programId\n );\n return pda;\n}\n\n/**\n * Derive NFT Mint PDA\n *\n * @param projectId - Project identifier\n * @param investor - Investor's public key\n * @param investmentCount - Investment count (u64 in Rust, 8 bytes LE)\n * @param programId - Raise program ID\n * @returns NFT Mint PDA and bump\n */\nexport function getNftMintPDA(\n projectId: BN | number | string,\n investor: PublicKey,\n investmentCount: BN | number,\n programId: PublicKey\n): [PublicKey, number] {\n // Ensure both values are proper BN instances (handles prototype chain issues)\n const projectIdBN = ensureBN(projectId);\n const countBN = ensureBN(investmentCount);\n return PublicKey.findProgramAddressSync(\n [\n Buffer.from(SEEDS.NFT_MINT),\n projectIdBN.toArrayLike(Buffer, 'le', 8),\n investor.toBuffer(),\n countBN.toArrayLike(Buffer, 'le', 8), // u64 is 8 bytes LE\n ],\n programId\n );\n}\n\n/**\n * Derive Program Authority PDA\n *\n * @param programId - Raise program ID\n * @returns Program authority PDA and bump\n */\nexport function getProgramAuthorityPDA(programId: PublicKey): [PublicKey, number] {\n return PublicKey.findProgramAddressSync(\n [Buffer.from(SEEDS.AUTHORITY)],\n programId\n );\n}\n\n/**\n * Helper to derive all PDAs for a project\n *\n * @param projectId - Project identifier\n * @param programId - Raise program ID\n * @returns Object with project and escrow PDAs\n */\nexport function getProjectPDAs(projectId: BN, programId: PublicKey) {\n const project = getProjectPDA(projectId, programId);\n const escrow = getEscrowPDA(projectId, programId);\n return { project, escrow };\n}\n\n// =============================================================================\n// ZTM v2.0 PDAs\n// =============================================================================\n\n/**\n * Derive Tokenomics PDA from project PDA\n */\nexport function getTokenomicsPDA(projectPda: PublicKey, programId: PublicKey): PublicKey {\n const [pda] = PublicKey.findProgramAddressSync(\n [Buffer.from('tokenomics'), projectPda.toBuffer()],\n programId\n );\n return pda;\n}\n\n/**\n * Derive Token Mint PDA from project PDA\n */\nexport function getTokenMintPDA(projectPda: PublicKey, programId: PublicKey): PublicKey {\n const [pda] = PublicKey.findProgramAddressSync(\n [Buffer.from('token_mint'), projectPda.toBuffer()],\n programId\n );\n return pda;\n}\n\n/**\n * Derive Vault Authority PDA from project PDA\n */\nexport function getVaultAuthorityPDA(projectPda: PublicKey, programId: PublicKey): PublicKey {\n const [pda] = PublicKey.findProgramAddressSync(\n [Buffer.from('vault_authority'), projectPda.toBuffer()],\n programId\n );\n return pda;\n}\n\n/**\n * Derive Investor Vault PDA from project PDA\n */\nexport function getInvestorVaultPDA(projectPda: PublicKey, programId: PublicKey): PublicKey {\n const [pda] = PublicKey.findProgramAddressSync(\n [Buffer.from('investor_vault'), projectPda.toBuffer()],\n programId\n );\n return pda;\n}\n\n/**\n * Derive Founder Vault PDA from project PDA\n */\nexport function getFounderVaultPDA(projectPda: PublicKey, programId: PublicKey): PublicKey {\n const [pda] = PublicKey.findProgramAddressSync(\n [Buffer.from('founder_vault'), projectPda.toBuffer()],\n programId\n );\n return pda;\n}\n\n/**\n * Derive LP Token Vault PDA from project PDA\n */\nexport function getLpTokenVaultPDA(projectPda: PublicKey, programId: PublicKey): PublicKey {\n const [pda] = PublicKey.findProgramAddressSync(\n [Buffer.from('lp_token_vault'), projectPda.toBuffer()],\n programId\n );\n return pda;\n}\n\n/**\n * Derive Treasury Vault PDA from project PDA\n */\nexport function getTreasuryVaultPDA(projectPda: PublicKey, programId: PublicKey): PublicKey {\n const [pda] = PublicKey.findProgramAddressSync(\n [Buffer.from('treasury_vault'), projectPda.toBuffer()],\n programId\n );\n return pda;\n}\n\n/**\n * Derive LP USDC Vault PDA from project PDA\n */\nexport function getLpUsdcVaultPDA(projectPda: PublicKey, programId: PublicKey): PublicKey {\n const [pda] = PublicKey.findProgramAddressSync(\n [Buffer.from('lp_usdc_vault'), projectPda.toBuffer()],\n programId\n );\n return pda;\n}\n\n/**\n * Derive Founder Vesting PDA from project PDA\n */\nexport function getFounderVestingPDA(projectPda: PublicKey, programId: PublicKey): PublicKey {\n const [pda] = PublicKey.findProgramAddressSync(\n [Buffer.from('founder_vesting'), projectPda.toBuffer()],\n programId\n );\n return pda;\n}\n","/**\n * Raise Account Fetchers\n *\n * Functions to fetch and decode program accounts.\n */\n\nimport { Program, BN } from '@coral-xyz/anchor';\nimport { PublicKey } from '@solana/web3.js';\nimport {\n getProjectPDA,\n getMilestonePDA,\n getInvestmentPDA,\n getVotePDA,\n getPivotProposalPDA,\n getTgeEscrowPDA,\n getAdminConfigPDA,\n} from '../pdas/index.js';\nimport type { InvestmentWithKey, MilestoneWithKey, VoteWithKey } from '../types/index.js';\n\n// Generic type for any Anchor program\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AnyProgram = Program<any>;\n\n// Helper to access account namespace dynamically\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction getAccountNamespace(program: AnyProgram): any {\n return program.account;\n}\n\n/**\n * Fetch project account data\n *\n * @param program - Anchor program instance\n * @param projectId - Project identifier\n * @returns Project account data or null if not found\n */\nexport async function fetchProject(\n program: AnyProgram,\n projectId: BN\n) {\n try {\n const projectPda = getProjectPDA(projectId, program.programId);\n return await getAccountNamespace(program).project.fetch(projectPda);\n } catch (error) {\n if (error instanceof Error && error.message?.includes('Account does not exist')) {\n return null;\n }\n throw error;\n }\n}\n\n/**\n * Fetch project account by PDA\n *\n * @param program - Anchor program instance\n * @param projectPda - Project account PDA\n * @returns Project account data or null if not found\n */\nexport async function fetchProjectByPda(\n program: AnyProgram,\n projectPda: PublicKey\n) {\n try {\n return await getAccountNamespace(program).project.fetch(projectPda);\n } catch (error) {\n if (error instanceof Error && error.message?.includes('Account does not exist')) {\n return null;\n }\n throw error;\n }\n}\n\n/**\n * Fetch milestone account data\n *\n * @param program - Anchor program instance\n * @param projectId - Project identifier\n * @param milestoneIndex - Milestone index\n * @returns Milestone account data or null if not found\n */\nexport async function fetchMilestone(\n program: AnyProgram,\n projectId: BN,\n milestoneIndex: number\n) {\n try {\n const projectPda = getProjectPDA(projectId, program.programId);\n const milestonePda = getMilestonePDA(projectPda, milestoneIndex, program.programId);\n return await getAccountNamespace(program).milestone.fetch(milestonePda);\n } catch (error) {\n if (error instanceof Error && error.message?.includes('Account does not exist')) {\n return null;\n }\n throw error;\n }\n}\n\n/**\n * Fetch all milestones for a project\n *\n * @param program - Anchor program instance\n * @param projectId - Project identifier\n * @returns Array of milestone accounts with their public keys\n */\nexport async function fetchAllMilestones(\n program: AnyProgram,\n projectId: BN\n): Promise<MilestoneWithKey[]> {\n const projectPda = getProjectPDA(projectId, program.programId);\n\n const milestones = await getAccountNamespace(program).milestone.all([\n {\n memcmp: {\n offset: 8, // Skip discriminator\n bytes: projectPda.toBase58(),\n },\n },\n ]);\n\n return milestones.map((m: { publicKey: PublicKey; account: unknown }) => ({\n publicKey: m.publicKey,\n account: m.account,\n })) as MilestoneWithKey[];\n}\n\n/**\n * Fetch investment account data\n *\n * @param program - Anchor program instance\n * @param projectId - Project identifier\n * @param nftMint - Investment NFT mint address\n * @returns Investment account data or null if not found\n */\nexport async function fetchInvestment(\n program: AnyProgram,\n projectId: BN,\n nftMint: PublicKey\n) {\n try {\n const projectPda = getProjectPDA(projectId, program.programId);\n const investmentPda = getInvestmentPDA(projectPda, nftMint, program.programId);\n return await getAccountNamespace(program).investment.fetch(investmentPda);\n } catch (error) {\n if (error instanceof Error && error.message?.includes('Account does not exist')) {\n return null;\n }\n throw error;\n }\n}\n\n/**\n * Fetch all investments for a project\n *\n * @param program - Anchor program instance\n * @param projectId - Project identifier\n * @returns Array of investment accounts with their public keys\n */\nexport async function fetchAllInvestments(\n program: AnyProgram,\n projectId: BN\n): Promise<InvestmentWithKey[]> {\n const projectPda = getProjectPDA(projectId, program.programId);\n\n const investments = await getAccountNamespace(program).investment.all([\n {\n memcmp: {\n offset: 8, // Skip discriminator\n bytes: projectPda.toBase58(),\n },\n },\n ]);\n\n return investments.map((inv: { publicKey: PublicKey; account: unknown }) => ({\n publicKey: inv.publicKey,\n account: inv.account,\n })) as InvestmentWithKey[];\n}\n\n/**\n * Fetch vote account data\n *\n * @param program - Anchor program instance\n * @param projectId - Project identifier\n * @param milestoneIndex - Milestone index\n * @param voterKey - Voter's public key\n * @param votingRound - Current voting round (0 initially, incremented on resubmit)\n * @returns Vote account data or null if not found\n */\nexport async function fetchVote(\n program: AnyProgram,\n projectId: BN,\n milestoneIndex: number,\n voterKey: PublicKey,\n votingRound: number\n) {\n try {\n const projectPda = getProjectPDA(projectId, program.programId);\n const milestonePda = getMilestonePDA(projectPda, milestoneIndex, program.programId);\n const votePda = getVotePDA(milestonePda, voterKey, votingRound, program.programId);\n return await getAccountNamespace(program).vote.fetch(votePda);\n } catch (error) {\n if (error instanceof Error && error.message?.includes('Account does not exist')) {\n return null;\n }\n throw error;\n }\n}\n\n/**\n * Fetch all votes for a milestone\n *\n * @param program - Anchor program instance\n * @param projectId - Project identifier\n * @param milestoneIndex - Milestone index\n * @returns Array of vote accounts with their public keys\n */\nexport async function fetchAllVotes(\n program: AnyProgram,\n projectId: BN,\n milestoneIndex: number\n): Promise<VoteWithKey[]> {\n const projectPda = getProjectPDA(projectId, program.programId);\n const milestonePda = getMilestonePDA(projectPda, milestoneIndex, program.programId);\n\n const votes = await getAccountNamespace(program).vote.all([\n {\n memcmp: {\n offset: 8, // Skip discriminator\n bytes: milestonePda.toBase58(),\n },\n },\n ]);\n\n return votes.map((v: { publicKey: PublicKey; account: unknown }) => ({\n publicKey: v.publicKey,\n account: v.account,\n })) as VoteWithKey[];\n}\n\n/**\n * Fetch pivot proposal account data\n *\n * @param program - Anchor program instance\n * @param projectId - Project identifier\n * @returns PivotProposal account data or null if not found\n */\nexport async function fetchPivotProposal(\n program: AnyProgram,\n projectId: BN\n) {\n try {\n const projectPda = getProjectPDA(projectId, program.programId);\n\n // First fetch the project to get the active pivot or pivot_count\n const projectAccount = await getAccountNamespace(program).project.fetch(projectPda);\n\n // Use active_pivot if available, otherwise derive from pivot_count\n let pivotPda;\n if (projectAccount.activePivot) {\n pivotPda = projectAccount.activePivot;\n } else {\n const pivotCount = projectAccount.pivotCount || 0;\n pivotPda = getPivotProposalPDA(projectPda, pivotCount, program.programId);\n }\n\n return await getAccountNamespace(program).pivotProposal.fetch(pivotPda);\n } catch (error) {\n if (error instanceof Error && error.message?.includes('Account does not exist')) {\n return null;\n }\n throw error;\n }\n}\n\n/**\n * Fetch TGE escrow account data\n *\n * @param program - Anchor program instance\n * @param projectId - Project identifier\n * @returns TgeEscrow account data or null if not found\n */\nexport async function fetchTgeEscrow(\n program: AnyProgram,\n projectId: BN\n) {\n try {\n const projectPda = getProjectPDA(projectId, program.programId);\n const tgeEscrowPda = getTgeEscrowPDA(projectPda, program.programId);\n return await getAccountNamespace(program).tgeEscrow.fetch(tgeEscrowPda);\n } catch (error) {\n if (error instanceof Error && error.message?.includes('Account does not exist')) {\n return null;\n }\n throw error;\n }\n}\n\n/**\n * Fetch admin config account data\n *\n * @param program - Anchor program instance\n * @returns AdminConfig account data\n */\nexport async function fetchAdminConfig(program: AnyProgram) {\n const adminConfigPda = getAdminConfigPDA(program.programId);\n return await getAccountNamespace(program).adminConfig.fetch(adminConfigPda);\n}\n\n/**\n * Check if an account exists\n *\n * @param program - Anchor program instance\n * @param accountType - Account type name\n * @param pda - Account PDA\n * @returns True if account exists\n */\nexport async function accountExists(\n program: AnyProgram,\n accountType: string,\n pda: PublicKey\n): Promise<boolean> {\n try {\n // @ts-expect-error - dynamic account access\n await program.account[accountType].fetch(pda);\n return true;\n } catch {\n return false;\n }\n}\n"]}
1
+ {"version":3,"sources":["../../src/constants/index.ts","../../src/pdas/index.ts","../../src/accounts/index.ts"],"names":["BN","PublicKey"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Raise Constants\n *\n * Mirrors the on-chain program constants for client-side validation\n * and display purposes.\n */\n\n// =============================================================================\n// PDA Seeds\n// =============================================================================\n\nexport const SEEDS = {\n PROJECT: 'project',\n MILESTONE: 'milestone',\n INVESTMENT: 'investment',\n VOTE: 'vote',\n ESCROW: 'escrow',\n PIVOT: 'pivot',\n PIVOT_PROPOSAL: 'pivot_proposal',\n TGE_ESCROW: 'tge_escrow',\n TGE_ESCROW_VAULT: 'tge_escrow_vault',\n SCAM_REPORT: 'scam_report',\n ADMIN_CONFIG: 'admin-config',\n NFT_MINT: 'nft_mint',\n AUTHORITY: 'authority',\n FUTURE_ROUND_VAULT: 'future_round_vault',\n FUTURE_ROUND_STATE: 'future_round_state',\n // Multi-Round Fundraising seeds\n FUNDING_ROUND: 'funding_round',\n ROUND_ESCROW: 'round_escrow',\n INVESTOR_MS_VESTING: 'investor_ms_vesting',\n} as const;\n\n// =============================================================================\n// Validation Constants\n// =============================================================================\n\nexport const VALIDATION = {\n /** Minimum number of milestones per project */\n MIN_MILESTONES: 2,\n /** Maximum number of milestones per project */\n MAX_MILESTONES: 10,\n /** Milestone percentages must sum to this value */\n MILESTONE_PERCENTAGE_SUM: 100,\n /** Maximum funding buffer (110% of goal) */\n MAX_FUNDING_BUFFER_PERCENT: 110,\n /** Maximum metadata URI length */\n MAX_METADATA_URI_LENGTH: 200,\n /** Maximum pivot description length */\n MAX_PIVOT_DESCRIPTION_LEN: 256,\n /** Maximum pivot vision length */\n MAX_PIVOT_VISION_LEN: 512,\n /** Maximum pivot justification length */\n MAX_PIVOT_JUSTIFICATION_LEN: 512,\n} as const;\n\n// =============================================================================\n// Timing Constants (in seconds)\n// =============================================================================\n\nexport const TIMING = {\n /** Production voting period (14 days) */\n VOTING_PERIOD_SECONDS: 1_209_600,\n /** Production hold period (7 days) */\n HOLD_PERIOD_SECONDS: 604_800,\n /** Inactivity timeout (90 days) */\n INACTIVITY_TIMEOUT_SECONDS: 7_776_000,\n /** Abandonment timeout (90 days) */\n ABANDONMENT_TIMEOUT_SECONDS: 7_776_000,\n /** Refund window (14 days) */\n REFUND_WINDOW_SECONDS: 1_209_600,\n /** Pivot withdrawal window (7 days) */\n PIVOT_WITHDRAWAL_WINDOW_SECONDS: 604_800,\n /** Minimum TGE date (15 days from now) */\n TGE_MIN_DAYS: 1_296_000,\n /** Maximum TGE date (90 days from now) */\n TGE_MAX_DAYS: 7_776_000,\n /** Post-TGE holdback period (30 days) */\n POST_TGE_HOLDBACK_DAYS: 2_592_000,\n} as const;\n\n// =============================================================================\n// Tier Configuration Constraints\n// =============================================================================\n\nexport const TIER_CONSTRAINTS = {\n /** Minimum number of tiers */\n MIN_TIERS: 1,\n /** Maximum number of tiers */\n MAX_TIERS: 10,\n /** Minimum tier amount (10 USDC in lamports) */\n MIN_TIER_AMOUNT: 10_000_000n,\n /** Minimum max_lots per tier */\n MIN_TIER_MAX_LOTS: 1,\n /** Minimum token ratio */\n MIN_TIER_TOKEN_RATIO: 1n,\n /** Minimum vote multiplier (100 = 1.0x) */\n MIN_TIER_VOTE_MULTIPLIER: 100,\n} as const;\n\n// =============================================================================\n// Progressive Pricing Constants (add-linear-progressive-pricing)\n// =============================================================================\n\nexport const PROGRESSIVE_PRICING = {\n /** Base price multiplier (10000 BPS = 1.0x) */\n PRICE_MULTIPLIER_BASE: 10000,\n /** Maximum price multiplier (20000 BPS = 2.0x) */\n MAX_MULTIPLIER_BPS: 20000,\n /** Percentage of ZEMYTH increment allocated to time-based component */\n TIME_ALLOCATION_PERCENT: 50,\n /** Percentage of ZEMYTH increment allocated to milestone spike component */\n MILESTONE_ALLOCATION_PERCENT: 50,\n} as const;\n\n// =============================================================================\n// Investment Tiers (Legacy - kept for backwards compatibility)\n// =============================================================================\n\nexport enum InvestmentTier {\n Bronze = 'Bronze',\n Silver = 'Silver',\n Gold = 'Gold',\n Platinum = 'Platinum',\n Diamond = 'Diamond',\n}\n\n/** Investment tier minimum amounts in USDC lamports (6 decimals) - LEGACY */\nexport const TIER_MINIMUMS = {\n [InvestmentTier.Bronze]: 100_000_000n, // 100 USDC\n [InvestmentTier.Silver]: 500_000_000n, // 500 USDC\n [InvestmentTier.Gold]: 1_000_000_000n, // 1,000 USDC\n [InvestmentTier.Platinum]: 5_000_000_000n, // 5,000 USDC\n [InvestmentTier.Diamond]: 10_000_000_000n, // 10,000 USDC\n} as const;\n\n/** Vote weight multipliers (scaled by 100) - LEGACY */\nexport const TIER_VOTE_MULTIPLIERS = {\n [InvestmentTier.Bronze]: 100, // 1.0x\n [InvestmentTier.Silver]: 120, // 1.2x\n [InvestmentTier.Gold]: 150, // 1.5x\n [InvestmentTier.Platinum]: 200, // 2.0x\n [InvestmentTier.Diamond]: 300, // 3.0x\n} as const;\n\n/** Token allocation multipliers (same as vote multipliers) - LEGACY */\nexport const TIER_TOKEN_MULTIPLIERS = {\n [InvestmentTier.Bronze]: 100,\n [InvestmentTier.Silver]: 120,\n [InvestmentTier.Gold]: 150,\n [InvestmentTier.Platinum]: 200,\n [InvestmentTier.Diamond]: 300,\n} as const;\n\n/** Get tier from investment amount (in lamports) - LEGACY, use project.tiers instead */\nexport function getTierFromAmount(amount: bigint): InvestmentTier {\n if (amount >= TIER_MINIMUMS[InvestmentTier.Diamond]) return InvestmentTier.Diamond;\n if (amount >= TIER_MINIMUMS[InvestmentTier.Platinum]) return InvestmentTier.Platinum;\n if (amount >= TIER_MINIMUMS[InvestmentTier.Gold]) return InvestmentTier.Gold;\n if (amount >= TIER_MINIMUMS[InvestmentTier.Silver]) return InvestmentTier.Silver;\n return InvestmentTier.Bronze;\n}\n\n/** Get vote multiplier for an investment amount - LEGACY */\nexport function getVoteMultiplier(amount: bigint): number {\n const tier = getTierFromAmount(amount);\n return TIER_VOTE_MULTIPLIERS[tier] / 100;\n}\n\n/** Get token multiplier for an investment amount - LEGACY */\nexport function getTokenMultiplier(amount: bigint): number {\n const tier = getTierFromAmount(amount);\n return TIER_TOKEN_MULTIPLIERS[tier] / 100;\n}\n\n/**\n * Find matching tier index for an investment amount (threshold-based)\n * Returns the highest tier where amount >= tier.amount\n */\nexport function findTierIndex(tiers: Array<{ amount: bigint }>, amount: bigint): number | null {\n for (let i = tiers.length - 1; i >= 0; i--) {\n if (amount >= tiers[i].amount) {\n return i;\n }\n }\n return null;\n}\n\n// =============================================================================\n// Voting and Governance\n// =============================================================================\n\nexport const GOVERNANCE = {\n /** Scam report threshold (30%) */\n SCAM_THRESHOLD_PERCENT: 30,\n /** Consecutive milestone failures before exit window eligible */\n CONSECUTIVE_FAILURES_THRESHOLD: 3,\n /** Milestone approval threshold (>50% weighted approval per whitepaper voting.md:100-101) */\n MILESTONE_APPROVAL_THRESHOLD_PERCENT: 50,\n} as const;\n\n// =============================================================================\n// NFT Constants\n// =============================================================================\n\nexport const NFT = {\n /** NFT symbol */\n SYMBOL: 'ZRI',\n /** NFT name prefix */\n NAME_PREFIX: 'Zemyth Raise Investment #',\n /** Royalty basis points (2%) */\n ROYALTY_BASIS_POINTS: 200,\n} as const;\n\n// =============================================================================\n// USDC Constants\n// =============================================================================\n\nexport const USDC = {\n /** USDC decimals */\n DECIMALS: 6,\n /** Convert USDC to lamports */\n toAmount: (usdc: number): bigint => BigInt(Math.floor(usdc * 10 ** 6)),\n /** Convert lamports to USDC */\n fromAmount: (lamports: bigint): number => Number(lamports) / 10 ** 6,\n} as const;\n\n// =============================================================================\n// Tokenomics Allocation Constants\n// =============================================================================\n\nexport const TOKENOMICS = {\n /** Minimum investor allocation (20%) */\n MIN_INVESTOR_ALLOCATION_BPS: 2000,\n /** Minimum founder allocation (5%) if > 0 */\n MIN_FOUNDER_ALLOCATION_BPS: 500,\n /** Minimum LP token allocation (5%) */\n MIN_LP_TOKEN_ALLOCATION_BPS: 500,\n /** Minimum LP USDC allocation (5%) */\n MIN_LP_USDC_BPS: 500,\n /** Minimum Zemyth allocation (1%) */\n MIN_ZEMYTH_ALLOCATION_BPS: 100,\n /** Default Zemyth allocation (1%) */\n DEFAULT_ZEMYTH_ALLOCATION_BPS: 100,\n /** Minimum future round allocation (10%) if > 0 */\n MIN_FUTURE_ROUND_ALLOCATION_BPS: 1000,\n /** Maximum token symbol length */\n MAX_TOKEN_SYMBOL_LEN: 8,\n /** Total allocation must sum to this (100% = 10000 bps) */\n TOTAL_ALLOCATION_BPS: 10000,\n} as const;\n","/**\n * Raise PDA Derivation Helpers\n *\n * All PDA derivation functions for the Raise program.\n * PDAs are deterministic addresses derived from seeds and program ID.\n */\n\nimport { PublicKey } from '@solana/web3.js';\nimport { BN } from '@coral-xyz/anchor';\nimport { SEEDS } from '../constants/index.js';\n\n/**\n * Ensure value is a proper BN instance\n * This handles cases where BN objects lose their prototype chain\n * (e.g., when passing through React state or JSON serialization)\n *\n * Uses duck typing instead of instanceof to handle different BN module instances\n */\nfunction ensureBN(value: BN | number | string | { toString(): string }): BN {\n // Duck typing: if it has toArrayLike, it's BN-like and we can use it\n if (value && typeof (value as BN).toArrayLike === 'function') {\n return value as BN;\n }\n // Always create a fresh BN from the SDK's imported BN class\n return new BN(String(value));\n}\n\n/**\n * Derive Project PDA from project ID\n *\n * @param projectId - Unique project identifier\n * @param programId - Raise program ID\n * @returns Project account PDA\n */\nexport function getProjectPDA(projectId: BN | number | string, programId: PublicKey): PublicKey {\n const projectIdBN = ensureBN(projectId);\n const [pda] = PublicKey.findProgramAddressSync(\n [Buffer.from(SEEDS.PROJECT), projectIdBN.toArrayLike(Buffer, 'le', 8)],\n programId\n );\n return pda;\n}\n\n/**\n * Derive Escrow PDA from project ID\n *\n * @param projectId - Project identifier\n * @param programId - Raise program ID\n * @returns Escrow account PDA\n */\nexport function getEscrowPDA(projectId: BN | number | string, programId: PublicKey): PublicKey {\n const projectIdBN = ensureBN(projectId);\n const [pda] = PublicKey.findProgramAddressSync(\n [Buffer.from(SEEDS.ESCROW), projectIdBN.toArrayLike(Buffer, 'le', 8)],\n programId\n );\n return pda;\n}\n\n/**\n * Derive Milestone PDA from project PDA and milestone index\n *\n * @param projectPda - Project account PDA\n * @param milestoneIndex - Milestone index (0-based)\n * @param programId - Raise program ID\n * @returns Milestone account PDA\n */\nexport function getMilestonePDA(\n projectPda: PublicKey,\n milestoneIndex: number,\n programId: PublicKey\n): PublicKey {\n const [pda] = PublicKey.findProgramAddressSync(\n [\n Buffer.from(SEEDS.MILESTONE),\n projectPda.toBuffer(),\n Buffer.from([milestoneIndex]),\n ],\n programId\n );\n return pda;\n}\n\n/**\n * Derive Investment PDA from project PDA and NFT mint\n *\n * @param projectPda - Project account PDA\n * @param nftMint - Investment NFT mint address\n * @param programId - Raise program ID\n * @returns Investment account PDA\n */\nexport function getInvestmentPDA(\n projectPda: PublicKey,\n nftMint: PublicKey,\n programId: PublicKey\n): PublicKey {\n const [pda] = PublicKey.findProgramAddressSync(\n [\n Buffer.from(SEEDS.INVESTMENT),\n projectPda.toBuffer(),\n nftMint.toBuffer(),\n ],\n programId\n );\n return pda;\n}\n\n/**\n * Derive Vote PDA from milestone PDA, voter key, and voting round\n *\n * @param milestonePda - Milestone account PDA\n * @param voterKey - Voter's public key\n * @param votingRound - Current voting round (0 initially, incremented on resubmit)\n * @param programId - Raise program ID\n * @returns Vote account PDA\n */\nexport function getVotePDA(\n milestonePda: PublicKey,\n voterKey: PublicKey,\n votingRound: number,\n programId: PublicKey\n): PublicKey {\n const [pda] = PublicKey.findProgramAddressSync(\n [Buffer.from(SEEDS.VOTE), milestonePda.toBuffer(), voterKey.toBuffer(), Buffer.from([votingRound])],\n programId\n );\n return pda;\n}\n\n/**\n * Derive PivotProposal PDA from project PDA and pivot count\n *\n * @param projectPda - Project account PDA\n * @param pivotCount - Current pivot count from project account\n * @param programId - Raise program ID\n * @returns PivotProposal account PDA\n */\nexport function getPivotProposalPDA(\n projectPda: PublicKey,\n pivotCount: number,\n programId: PublicKey\n): PublicKey {\n const [pda] = PublicKey.findProgramAddressSync(\n [\n Buffer.from(SEEDS.PIVOT), // Use PIVOT seed, not PIVOT_PROPOSAL\n projectPda.toBuffer(),\n Buffer.from([pivotCount]), // pivot_count is u8 (1 byte) on-chain\n ],\n programId\n );\n return pda;\n}\n\n/**\n * Derive TgeEscrow PDA from project PDA\n *\n * @param projectPda - Project account PDA\n * @param programId - Raise program ID\n * @returns TgeEscrow account PDA\n */\nexport function getTgeEscrowPDA(\n projectPda: PublicKey,\n programId: PublicKey\n): PublicKey {\n const [pda] = PublicKey.findProgramAddressSync(\n [Buffer.from(SEEDS.TGE_ESCROW), projectPda.toBuffer()],\n programId\n );\n return pda;\n}\n\n/**\n * Derive TgeEscrowVault PDA from project PDA\n * Used for holding 10% USDC holdback from final milestone\n *\n * @param projectPda - Project account PDA\n * @param programId - Raise program ID\n * @returns TgeEscrowVault PDA\n */\nexport function getTgeEscrowVaultPDA(\n projectPda: PublicKey,\n programId: PublicKey\n): PublicKey {\n const [pda] = PublicKey.findProgramAddressSync(\n [Buffer.from(SEEDS.TGE_ESCROW_VAULT), projectPda.toBuffer()],\n programId\n );\n return pda;\n}\n\n/**\n * Derive TokenVault PDA from project PDA\n * Used for holding project tokens for investor distribution\n *\n * @param projectPda - Project account PDA\n * @param programId - Raise program ID\n * @returns TokenVault PDA\n */\nexport function getTokenVaultPDA(\n projectPda: PublicKey,\n programId: PublicKey\n): PublicKey {\n const [pda] = PublicKey.findProgramAddressSync(\n [Buffer.from('token_vault'), projectPda.toBuffer()],\n programId\n );\n return pda;\n}\n\n/**\n * Derive ScamReport PDA from project PDA and NFT mint\n *\n * @param projectPda - Project account PDA\n * @param nftMint - Reporter's NFT mint address\n * @param programId - Raise program ID\n * @returns ScamReport account PDA\n */\nexport function getScamReportPDA(\n projectPda: PublicKey,\n nftMint: PublicKey,\n programId: PublicKey\n): PublicKey {\n const [pda] = PublicKey.findProgramAddressSync(\n [\n Buffer.from(SEEDS.SCAM_REPORT),\n projectPda.toBuffer(),\n nftMint.toBuffer(),\n ],\n programId\n );\n return pda;\n}\n\n/**\n * Derive AdminConfig PDA (global admin authority)\n *\n * @param programId - Raise program ID\n * @returns AdminConfig account PDA\n */\nexport function getAdminConfigPDA(programId: PublicKey): PublicKey {\n const [pda] = PublicKey.findProgramAddressSync(\n [Buffer.from(SEEDS.ADMIN_CONFIG)],\n programId\n );\n return pda;\n}\n\n/**\n * Derive NFT Mint PDA\n *\n * @param projectId - Project identifier\n * @param investor - Investor's public key\n * @param investmentCount - Investment count (u64 in Rust, 8 bytes LE)\n * @param programId - Raise program ID\n * @returns NFT Mint PDA and bump\n */\nexport function getNftMintPDA(\n projectId: BN | number | string,\n investor: PublicKey,\n investmentCount: BN | number,\n programId: PublicKey\n): [PublicKey, number] {\n // Ensure both values are proper BN instances (handles prototype chain issues)\n const projectIdBN = ensureBN(projectId);\n const countBN = ensureBN(investmentCount);\n return PublicKey.findProgramAddressSync(\n [\n Buffer.from(SEEDS.NFT_MINT),\n projectIdBN.toArrayLike(Buffer, 'le', 8),\n investor.toBuffer(),\n countBN.toArrayLike(Buffer, 'le', 8), // u64 is 8 bytes LE\n ],\n programId\n );\n}\n\n/**\n * Derive Program Authority PDA\n *\n * @param programId - Raise program ID\n * @returns Program authority PDA and bump\n */\nexport function getProgramAuthorityPDA(programId: PublicKey): [PublicKey, number] {\n return PublicKey.findProgramAddressSync(\n [Buffer.from(SEEDS.AUTHORITY)],\n programId\n );\n}\n\n/**\n * Helper to derive all PDAs for a project\n *\n * @param projectId - Project identifier\n * @param programId - Raise program ID\n * @returns Object with project and escrow PDAs\n */\nexport function getProjectPDAs(projectId: BN, programId: PublicKey) {\n const project = getProjectPDA(projectId, programId);\n const escrow = getEscrowPDA(projectId, programId);\n return { project, escrow };\n}\n\n// =============================================================================\n// ZTM v2.0 PDAs\n// =============================================================================\n\n/**\n * Derive Tokenomics PDA from project PDA\n */\nexport function getTokenomicsPDA(projectPda: PublicKey, programId: PublicKey): PublicKey {\n const [pda] = PublicKey.findProgramAddressSync(\n [Buffer.from('tokenomics'), projectPda.toBuffer()],\n programId\n );\n return pda;\n}\n\n/**\n * Derive Token Mint PDA from project PDA\n */\nexport function getTokenMintPDA(projectPda: PublicKey, programId: PublicKey): PublicKey {\n const [pda] = PublicKey.findProgramAddressSync(\n [Buffer.from('token_mint'), projectPda.toBuffer()],\n programId\n );\n return pda;\n}\n\n/**\n * Derive Vault Authority PDA from project PDA\n */\nexport function getVaultAuthorityPDA(projectPda: PublicKey, programId: PublicKey): PublicKey {\n const [pda] = PublicKey.findProgramAddressSync(\n [Buffer.from('vault_authority'), projectPda.toBuffer()],\n programId\n );\n return pda;\n}\n\n/**\n * Derive Investor Vault PDA from project PDA\n */\nexport function getInvestorVaultPDA(projectPda: PublicKey, programId: PublicKey): PublicKey {\n const [pda] = PublicKey.findProgramAddressSync(\n [Buffer.from('investor_vault'), projectPda.toBuffer()],\n programId\n );\n return pda;\n}\n\n/**\n * Derive Founder Vault PDA from project PDA\n */\nexport function getFounderVaultPDA(projectPda: PublicKey, programId: PublicKey): PublicKey {\n const [pda] = PublicKey.findProgramAddressSync(\n [Buffer.from('founder_vault'), projectPda.toBuffer()],\n programId\n );\n return pda;\n}\n\n/**\n * Derive LP Token Vault PDA from project PDA\n */\nexport function getLpTokenVaultPDA(projectPda: PublicKey, programId: PublicKey): PublicKey {\n const [pda] = PublicKey.findProgramAddressSync(\n [Buffer.from('lp_token_vault'), projectPda.toBuffer()],\n programId\n );\n return pda;\n}\n\n/**\n * Derive Treasury Vault PDA from project PDA\n */\nexport function getTreasuryVaultPDA(projectPda: PublicKey, programId: PublicKey): PublicKey {\n const [pda] = PublicKey.findProgramAddressSync(\n [Buffer.from('treasury_vault'), projectPda.toBuffer()],\n programId\n );\n return pda;\n}\n\n/**\n * Derive LP USDC Vault PDA from project PDA\n */\nexport function getLpUsdcVaultPDA(projectPda: PublicKey, programId: PublicKey): PublicKey {\n const [pda] = PublicKey.findProgramAddressSync(\n [Buffer.from('lp_usdc_vault'), projectPda.toBuffer()],\n programId\n );\n return pda;\n}\n\n/**\n * Derive Founder Vesting PDA from project PDA\n */\nexport function getFounderVestingPDA(projectPda: PublicKey, programId: PublicKey): PublicKey {\n const [pda] = PublicKey.findProgramAddressSync(\n [Buffer.from('founder_vesting'), projectPda.toBuffer()],\n programId\n );\n return pda;\n}\n\n// =============================================================================\n// Dynamic Tokenomics PDAs\n// =============================================================================\n\n/**\n * Derive Allocation Proposal PDA\n *\n * @param projectPda - Project account PDA\n * @param proposalIndex - Proposal index (from tokenomics.proposal_count)\n * @param programId - Raise program ID\n * @returns Allocation proposal PDA\n */\nexport function getAllocationProposalPDA(\n projectPda: PublicKey,\n proposalIndex: number,\n programId: PublicKey\n): PublicKey {\n const [pda] = PublicKey.findProgramAddressSync(\n [\n Buffer.from('allocation_proposal'),\n projectPda.toBuffer(),\n Buffer.from([proposalIndex]),\n ],\n programId\n );\n return pda;\n}\n\n/**\n * Derive Allocation Vote PDA\n *\n * @param proposalPda - Allocation proposal PDA\n * @param nftMint - NFT mint used for voting\n * @param programId - Raise program ID\n * @returns Allocation vote PDA\n */\nexport function getAllocationVotePDA(\n proposalPda: PublicKey,\n nftMint: PublicKey,\n programId: PublicKey\n): PublicKey {\n const [pda] = PublicKey.findProgramAddressSync(\n [\n Buffer.from('allocation_vote'),\n proposalPda.toBuffer(),\n nftMint.toBuffer(),\n ],\n programId\n );\n return pda;\n}\n\n/**\n * Derive Sub-Allocation Vesting PDA\n *\n * @param projectPda - Project account PDA\n * @param subAllocationId - Sub-allocation ID (0-9)\n * @param programId - Raise program ID\n * @returns Sub-allocation vesting PDA\n */\nexport function getSubAllocationVestingPDA(\n projectPda: PublicKey,\n subAllocationId: number,\n programId: PublicKey\n): PublicKey {\n const [pda] = PublicKey.findProgramAddressSync(\n [\n Buffer.from('sub_allocation_vesting'),\n projectPda.toBuffer(),\n Buffer.from([subAllocationId]),\n ],\n programId\n );\n return pda;\n}\n\n// =============================================================================\n// Per-Milestone Vesting PDAs (add-per-milestone-vesting)\n// =============================================================================\n\n/**\n * Derive InvestorMilestoneVesting PDA\n * Tracks investor vesting for a specific milestone with configurable schedules\n *\n * @param projectPda - Project account PDA\n * @param milestoneIndex - Milestone index\n * @param investmentPda - Investment account PDA\n * @param programId - Raise program ID\n * @returns Investor milestone vesting PDA\n */\nexport function getInvestorMilestoneVestingPDA(\n projectPda: PublicKey,\n milestoneIndex: number,\n investmentPda: PublicKey,\n programId: PublicKey\n): PublicKey {\n const [pda] = PublicKey.findProgramAddressSync(\n [\n Buffer.from('investor_ms_vesting'),\n projectPda.toBuffer(),\n Buffer.from([milestoneIndex]),\n investmentPda.toBuffer(),\n ],\n programId\n );\n return pda;\n}\n\n/**\n * Derive FounderMilestoneVesting PDA\n * Tracks founder milestone-based vesting with configurable schedules\n *\n * @param projectPda - Project account PDA\n * @param milestoneIndex - Milestone index\n * @param programId - Raise program ID\n * @returns Founder milestone vesting PDA\n */\nexport function getFounderMilestoneVestingPDA(\n projectPda: PublicKey,\n milestoneIndex: number,\n programId: PublicKey\n): PublicKey {\n const [pda] = PublicKey.findProgramAddressSync(\n [\n Buffer.from('founder_ms_vesting'),\n projectPda.toBuffer(),\n Buffer.from([milestoneIndex]),\n ],\n programId\n );\n return pda;\n}\n\n// =============================================================================\n// Future Round Allocation PDAs (add-future-round-allocation)\n// =============================================================================\n\n/**\n * Derive FutureRoundTokenVault PDA - Token account holding reserved tokens\n *\n * @param projectPda - Project account PDA\n * @param programId - Raise program ID\n * @returns Future round token vault PDA\n */\nexport function getFutureRoundTokenVaultPDA(\n projectPda: PublicKey,\n programId: PublicKey\n): PublicKey {\n const [pda] = PublicKey.findProgramAddressSync(\n [Buffer.from(SEEDS.FUTURE_ROUND_VAULT), projectPda.toBuffer()],\n programId\n );\n return pda;\n}\n\n/**\n * Derive FutureRoundVault state PDA - Tracks future round token usage\n *\n * @param projectPda - Project account PDA\n * @param programId - Raise program ID\n * @returns Future round vault state PDA\n */\nexport function getFutureRoundVaultPDA(\n projectPda: PublicKey,\n programId: PublicKey\n): PublicKey {\n const [pda] = PublicKey.findProgramAddressSync(\n [Buffer.from(SEEDS.FUTURE_ROUND_STATE), projectPda.toBuffer()],\n programId\n );\n return pda;\n}\n\n// =============================================================================\n// Multi-Round Fundraising PDAs (add-second-round-fundraising)\n// =============================================================================\n\n/**\n * Derive FundingRound PDA\n * Each round (R2, R3, R4...) has its own FundingRound account\n *\n * @param projectPda - Project account PDA\n * @param roundNumber - Round number (2, 3, 4...)\n * @param programId - Raise program ID\n * @returns Funding round PDA\n */\nexport function getFundingRoundPDA(\n projectPda: PublicKey,\n roundNumber: number,\n programId: PublicKey\n): PublicKey {\n const [pda] = PublicKey.findProgramAddressSync(\n [\n Buffer.from(SEEDS.FUNDING_ROUND),\n projectPda.toBuffer(),\n Buffer.from([roundNumber]),\n ],\n programId\n );\n return pda;\n}\n\n/**\n * Derive Round Escrow PDA\n * Each round has its own USDC escrow account\n *\n * @param projectPda - Project account PDA\n * @param roundNumber - Round number (2, 3, 4...)\n * @param programId - Raise program ID\n * @returns Round escrow PDA\n */\nexport function getRoundEscrowPDA(\n projectPda: PublicKey,\n roundNumber: number,\n programId: PublicKey\n): PublicKey {\n const [pda] = PublicKey.findProgramAddressSync(\n [\n Buffer.from(SEEDS.ROUND_ESCROW),\n projectPda.toBuffer(),\n Buffer.from([roundNumber]),\n ],\n programId\n );\n return pda;\n}\n\n/**\n * Derive Round Milestone PDA\n * Each round has its own milestones (R2M1, R2M2, etc.)\n *\n * @param projectPda - Project account PDA\n * @param roundNumber - Round number (2, 3, 4...)\n * @param milestoneIndex - Milestone index (0-based)\n * @param programId - Raise program ID\n * @returns Round milestone PDA\n */\nexport function getRoundMilestonePDA(\n projectPda: PublicKey,\n roundNumber: number,\n milestoneIndex: number,\n programId: PublicKey\n): PublicKey {\n const [pda] = PublicKey.findProgramAddressSync(\n [\n Buffer.from(SEEDS.MILESTONE),\n projectPda.toBuffer(),\n Buffer.from([roundNumber]),\n Buffer.from([milestoneIndex]),\n ],\n programId\n );\n return pda;\n}\n\n/**\n * Derive Round NFT Mint PDA\n * NFT mints for R2+ investments include round_number in seeds\n *\n * @param projectId - Project identifier\n * @param roundNumber - Round number (2, 3, 4...)\n * @param investor - Investor's public key\n * @param investmentCount - Investment count\n * @param programId - Raise program ID\n * @returns Round NFT mint PDA and bump\n */\nexport function getRoundNftMintPDA(\n projectId: BN | number | string,\n roundNumber: number,\n investor: PublicKey,\n investmentCount: BN | number,\n programId: PublicKey\n): [PublicKey, number] {\n const projectIdBN = ensureBN(projectId);\n const countBN = ensureBN(investmentCount);\n return PublicKey.findProgramAddressSync(\n [\n Buffer.from(SEEDS.NFT_MINT),\n projectIdBN.toArrayLike(Buffer, 'le', 8),\n Buffer.from([roundNumber]),\n investor.toBuffer(),\n countBN.toArrayLike(Buffer, 'le', 8),\n ],\n programId\n );\n}\n\n/**\n * Derive Round Investment PDA\n * R2+ investments include round_number in seeds\n *\n * @param projectPda - Project account PDA\n * @param roundNumber - Round number (2, 3, 4...)\n * @param nftMint - Investment NFT mint address\n * @param programId - Raise program ID\n * @returns Round investment PDA\n */\nexport function getRoundInvestmentPDA(\n projectPda: PublicKey,\n roundNumber: number,\n nftMint: PublicKey,\n programId: PublicKey\n): PublicKey {\n const [pda] = PublicKey.findProgramAddressSync(\n [\n Buffer.from(SEEDS.INVESTMENT),\n projectPda.toBuffer(),\n Buffer.from([roundNumber]),\n nftMint.toBuffer(),\n ],\n programId\n );\n return pda;\n}\n\n/**\n * Derive Round Investor Milestone Vesting PDA\n * R2+ investor vesting includes round_number in seeds\n *\n * @param projectPda - Project account PDA\n * @param roundNumber - Round number (2, 3, 4...)\n * @param milestoneIndex - Milestone index\n * @param investmentPda - Investment account PDA\n * @param programId - Raise program ID\n * @returns Round investor milestone vesting PDA\n */\nexport function getRoundInvestorMilestoneVestingPDA(\n projectPda: PublicKey,\n roundNumber: number,\n milestoneIndex: number,\n investmentPda: PublicKey,\n programId: PublicKey\n): PublicKey {\n const [pda] = PublicKey.findProgramAddressSync(\n [\n Buffer.from(SEEDS.INVESTOR_MS_VESTING),\n projectPda.toBuffer(),\n Buffer.from([roundNumber]),\n Buffer.from([milestoneIndex]),\n investmentPda.toBuffer(),\n ],\n programId\n );\n return pda;\n}\n","/**\n * Raise Account Fetchers\n *\n * Functions to fetch and decode program accounts.\n */\n\nimport { Program, BN } from '@coral-xyz/anchor';\nimport { PublicKey } from '@solana/web3.js';\nimport {\n getProjectPDA,\n getMilestonePDA,\n getInvestmentPDA,\n getVotePDA,\n getPivotProposalPDA,\n getTgeEscrowPDA,\n getAdminConfigPDA,\n getTokenVaultPDA,\n getTokenomicsPDA,\n getAllocationProposalPDA,\n getAllocationVotePDA,\n getSubAllocationVestingPDA,\n getInvestorMilestoneVestingPDA,\n getFounderMilestoneVestingPDA,\n getFundingRoundPDA,\n getRoundMilestonePDA,\n getRoundInvestmentPDA,\n getRoundInvestorMilestoneVestingPDA,\n getFutureRoundVaultPDA,\n} from '../pdas/index.js';\nimport type { InvestmentWithKey, MilestoneWithKey, VoteWithKey, AllocationProposalWithKey, FundingRoundWithKey } from '../types/index.js';\n\n// Generic type for any Anchor program\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AnyProgram = Program<any>;\n\n// Helper to access account namespace dynamically\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction getAccountNamespace(program: AnyProgram): any {\n return program.account;\n}\n\n/**\n * Fetch project account data\n *\n * @param program - Anchor program instance\n * @param projectId - Project identifier\n * @returns Project account data or null if not found\n */\nexport async function fetchProject(\n program: AnyProgram,\n projectId: BN\n) {\n try {\n const projectPda = getProjectPDA(projectId, program.programId);\n return await getAccountNamespace(program).project.fetch(projectPda);\n } catch (error) {\n if (error instanceof Error && error.message?.includes('Account does not exist')) {\n return null;\n }\n throw error;\n }\n}\n\n/**\n * Fetch project account by PDA\n *\n * @param program - Anchor program instance\n * @param projectPda - Project account PDA\n * @returns Project account data or null if not found\n */\nexport async function fetchProjectByPda(\n program: AnyProgram,\n projectPda: PublicKey\n) {\n try {\n return await getAccountNamespace(program).project.fetch(projectPda);\n } catch (error) {\n if (error instanceof Error && error.message?.includes('Account does not exist')) {\n return null;\n }\n throw error;\n }\n}\n\n/**\n * Fetch milestone account data\n *\n * @param program - Anchor program instance\n * @param projectId - Project identifier\n * @param milestoneIndex - Milestone index\n * @returns Milestone account data or null if not found\n */\nexport async function fetchMilestone(\n program: AnyProgram,\n projectId: BN,\n milestoneIndex: number\n) {\n try {\n const projectPda = getProjectPDA(projectId, program.programId);\n const milestonePda = getMilestonePDA(projectPda, milestoneIndex, program.programId);\n return await getAccountNamespace(program).milestone.fetch(milestonePda);\n } catch (error) {\n if (error instanceof Error && error.message?.includes('Account does not exist')) {\n return null;\n }\n throw error;\n }\n}\n\n/**\n * Fetch all milestones for a project\n *\n * @param program - Anchor program instance\n * @param projectId - Project identifier\n * @returns Array of milestone accounts with their public keys\n */\nexport async function fetchAllMilestones(\n program: AnyProgram,\n projectId: BN\n): Promise<MilestoneWithKey[]> {\n const projectPda = getProjectPDA(projectId, program.programId);\n\n const milestones = await getAccountNamespace(program).milestone.all([\n {\n memcmp: {\n offset: 8, // Skip discriminator\n bytes: projectPda.toBase58(),\n },\n },\n ]);\n\n return milestones.map((m: { publicKey: PublicKey; account: unknown }) => ({\n publicKey: m.publicKey,\n account: m.account,\n })) as MilestoneWithKey[];\n}\n\n/**\n * Fetch investment account data\n *\n * @param program - Anchor program instance\n * @param projectId - Project identifier\n * @param nftMint - Investment NFT mint address\n * @returns Investment account data or null if not found\n */\nexport async function fetchInvestment(\n program: AnyProgram,\n projectId: BN,\n nftMint: PublicKey\n) {\n try {\n const projectPda = getProjectPDA(projectId, program.programId);\n const investmentPda = getInvestmentPDA(projectPda, nftMint, program.programId);\n return await getAccountNamespace(program).investment.fetch(investmentPda);\n } catch (error) {\n if (error instanceof Error && error.message?.includes('Account does not exist')) {\n return null;\n }\n throw error;\n }\n}\n\n/**\n * Fetch all investments for a project\n *\n * @param program - Anchor program instance\n * @param projectId - Project identifier\n * @returns Array of investment accounts with their public keys\n */\nexport async function fetchAllInvestments(\n program: AnyProgram,\n projectId: BN\n): Promise<InvestmentWithKey[]> {\n const projectPda = getProjectPDA(projectId, program.programId);\n\n const investments = await getAccountNamespace(program).investment.all([\n {\n memcmp: {\n offset: 8, // Skip discriminator\n bytes: projectPda.toBase58(),\n },\n },\n ]);\n\n return investments.map((inv: { publicKey: PublicKey; account: unknown }) => ({\n publicKey: inv.publicKey,\n account: inv.account,\n })) as InvestmentWithKey[];\n}\n\n/**\n * Fetch vote account data\n *\n * @param program - Anchor program instance\n * @param projectId - Project identifier\n * @param milestoneIndex - Milestone index\n * @param voterKey - Voter's public key\n * @param votingRound - Current voting round (0 initially, incremented on resubmit)\n * @returns Vote account data or null if not found\n */\nexport async function fetchVote(\n program: AnyProgram,\n projectId: BN,\n milestoneIndex: number,\n voterKey: PublicKey,\n votingRound: number\n) {\n try {\n const projectPda = getProjectPDA(projectId, program.programId);\n const milestonePda = getMilestonePDA(projectPda, milestoneIndex, program.programId);\n const votePda = getVotePDA(milestonePda, voterKey, votingRound, program.programId);\n return await getAccountNamespace(program).vote.fetch(votePda);\n } catch (error) {\n if (error instanceof Error && error.message?.includes('Account does not exist')) {\n return null;\n }\n throw error;\n }\n}\n\n/**\n * Fetch all votes for a milestone\n *\n * @param program - Anchor program instance\n * @param projectId - Project identifier\n * @param milestoneIndex - Milestone index\n * @returns Array of vote accounts with their public keys\n */\nexport async function fetchAllVotes(\n program: AnyProgram,\n projectId: BN,\n milestoneIndex: number\n): Promise<VoteWithKey[]> {\n const projectPda = getProjectPDA(projectId, program.programId);\n const milestonePda = getMilestonePDA(projectPda, milestoneIndex, program.programId);\n\n const votes = await getAccountNamespace(program).vote.all([\n {\n memcmp: {\n offset: 8, // Skip discriminator\n bytes: milestonePda.toBase58(),\n },\n },\n ]);\n\n return votes.map((v: { publicKey: PublicKey; account: unknown }) => ({\n publicKey: v.publicKey,\n account: v.account,\n })) as VoteWithKey[];\n}\n\n/**\n * Fetch pivot proposal account data\n *\n * @param program - Anchor program instance\n * @param projectId - Project identifier\n * @returns PivotProposal account data or null if not found\n */\nexport async function fetchPivotProposal(\n program: AnyProgram,\n projectId: BN\n) {\n try {\n const projectPda = getProjectPDA(projectId, program.programId);\n\n // First fetch the project to get the active pivot or pivot_count\n const projectAccount = await getAccountNamespace(program).project.fetch(projectPda);\n\n // Use active_pivot if available, otherwise derive from pivot_count\n let pivotPda;\n if (projectAccount.activePivot) {\n pivotPda = projectAccount.activePivot;\n } else {\n const pivotCount = projectAccount.pivotCount || 0;\n pivotPda = getPivotProposalPDA(projectPda, pivotCount, program.programId);\n }\n\n return await getAccountNamespace(program).pivotProposal.fetch(pivotPda);\n } catch (error) {\n if (error instanceof Error && error.message?.includes('Account does not exist')) {\n return null;\n }\n throw error;\n }\n}\n\n/**\n * Fetch TGE escrow account data\n *\n * @param program - Anchor program instance\n * @param projectId - Project identifier\n * @returns TgeEscrow account data or null if not found\n */\nexport async function fetchTgeEscrow(\n program: AnyProgram,\n projectId: BN\n) {\n try {\n const projectPda = getProjectPDA(projectId, program.programId);\n const tgeEscrowPda = getTgeEscrowPDA(projectPda, program.programId);\n return await getAccountNamespace(program).tgeEscrow.fetch(tgeEscrowPda);\n } catch (error) {\n if (error instanceof Error && error.message?.includes('Account does not exist')) {\n return null;\n }\n throw error;\n }\n}\n\n/**\n * Fetch admin config account data\n *\n * @param program - Anchor program instance\n * @returns AdminConfig account data\n */\nexport async function fetchAdminConfig(program: AnyProgram) {\n const adminConfigPda = getAdminConfigPDA(program.programId);\n return await getAccountNamespace(program).adminConfig.fetch(adminConfigPda);\n}\n\n/**\n * Fetch token vault account data\n *\n * @param program - Anchor program instance\n * @param projectId - Project identifier\n * @returns TokenVault account data or null if not found\n */\nexport async function fetchTokenVault(\n program: AnyProgram,\n projectId: BN\n) {\n try {\n const projectPda = getProjectPDA(projectId, program.programId);\n const tokenVaultPda = getTokenVaultPDA(projectPda, program.programId);\n return await getAccountNamespace(program).tokenVault.fetch(tokenVaultPda);\n } catch (error) {\n if (error instanceof Error && error.message?.includes('Account does not exist')) {\n return null;\n }\n throw error;\n }\n}\n\n/**\n * Check if an account exists\n *\n * @param program - Anchor program instance\n * @param accountType - Account type name\n * @param pda - Account PDA\n * @returns True if account exists\n */\nexport async function accountExists(\n program: AnyProgram,\n accountType: string,\n pda: PublicKey\n): Promise<boolean> {\n try {\n // @ts-expect-error - dynamic account access\n await program.account[accountType].fetch(pda);\n return true;\n } catch {\n return false;\n }\n}\n\n// =============================================================================\n// Dynamic Tokenomics Account Fetchers\n// =============================================================================\n\n/**\n * Fetch tokenomics account data\n *\n * @param program - Anchor program instance\n * @param projectId - Project identifier\n * @returns Tokenomics account data or null if not found\n */\nexport async function fetchTokenomics(\n program: AnyProgram,\n projectId: BN\n) {\n try {\n const projectPda = getProjectPDA(projectId, program.programId);\n const tokenomicsPda = getTokenomicsPDA(projectPda, program.programId);\n return await getAccountNamespace(program).tokenomics.fetch(tokenomicsPda);\n } catch (error) {\n if (error instanceof Error && error.message?.includes('Account does not exist')) {\n return null;\n }\n throw error;\n }\n}\n\n/**\n * Fetch allocation proposal account data\n *\n * @param program - Anchor program instance\n * @param projectId - Project identifier\n * @param proposalIndex - Proposal index\n * @returns AllocationProposal account data or null if not found\n */\nexport async function fetchAllocationProposal(\n program: AnyProgram,\n projectId: BN,\n proposalIndex: number\n) {\n try {\n const projectPda = getProjectPDA(projectId, program.programId);\n const proposalPda = getAllocationProposalPDA(projectPda, proposalIndex, program.programId);\n return await getAccountNamespace(program).allocationProposal.fetch(proposalPda);\n } catch (error) {\n if (error instanceof Error && error.message?.includes('Account does not exist')) {\n return null;\n }\n throw error;\n }\n}\n\n/**\n * Fetch all allocation proposals for a project\n *\n * @param program - Anchor program instance\n * @param projectId - Project identifier\n * @returns Array of allocation proposal accounts with their public keys\n */\nexport async function fetchAllAllocationProposals(\n program: AnyProgram,\n projectId: BN\n): Promise<AllocationProposalWithKey[]> {\n const projectPda = getProjectPDA(projectId, program.programId);\n\n const proposals = await getAccountNamespace(program).allocationProposal.all([\n {\n memcmp: {\n offset: 8, // Skip discriminator\n bytes: projectPda.toBase58(),\n },\n },\n ]);\n\n return proposals.map((p: { publicKey: PublicKey; account: unknown }) => ({\n publicKey: p.publicKey,\n account: p.account,\n })) as AllocationProposalWithKey[];\n}\n\n/**\n * Fetch allocation vote account data\n *\n * @param program - Anchor program instance\n * @param projectId - Project identifier\n * @param proposalIndex - Proposal index\n * @param nftMint - NFT mint used for voting\n * @returns AllocationVote account data or null if not found\n */\nexport async function fetchAllocationVote(\n program: AnyProgram,\n projectId: BN,\n proposalIndex: number,\n nftMint: PublicKey\n) {\n try {\n const projectPda = getProjectPDA(projectId, program.programId);\n const proposalPda = getAllocationProposalPDA(projectPda, proposalIndex, program.programId);\n const votePda = getAllocationVotePDA(proposalPda, nftMint, program.programId);\n return await getAccountNamespace(program).allocationVote.fetch(votePda);\n } catch (error) {\n if (error instanceof Error && error.message?.includes('Account does not exist')) {\n return null;\n }\n throw error;\n }\n}\n\n/**\n * Fetch sub-allocation vesting account data\n *\n * @param program - Anchor program instance\n * @param projectId - Project identifier\n * @param subAllocationId - Sub-allocation ID (0-9)\n * @returns SubAllocationVesting account data or null if not found\n */\nexport async function fetchSubAllocationVesting(\n program: AnyProgram,\n projectId: BN,\n subAllocationId: number\n) {\n try {\n const projectPda = getProjectPDA(projectId, program.programId);\n const vestingPda = getSubAllocationVestingPDA(projectPda, subAllocationId, program.programId);\n return await getAccountNamespace(program).subAllocationVesting.fetch(vestingPda);\n } catch (error) {\n if (error instanceof Error && error.message?.includes('Account does not exist')) {\n return null;\n }\n throw error;\n }\n}\n\n// =============================================================================\n// Per-Milestone Vesting Account Fetchers\n// =============================================================================\n\n/**\n * Fetch investor milestone vesting account data\n *\n * Per-milestone vesting: Each investor has a separate vesting PDA for each\n * milestone they claim tokens from.\n *\n * @param program - Anchor program instance\n * @param projectId - Project identifier\n * @param milestoneIndex - Milestone index\n * @param nftMint - NFT mint that proves investment ownership\n * @returns InvestorMilestoneVesting account data or null if not found\n */\nexport async function fetchInvestorMilestoneVesting(\n program: AnyProgram,\n projectId: BN,\n milestoneIndex: number,\n nftMint: PublicKey\n) {\n try {\n const projectPda = getProjectPDA(projectId, program.programId);\n const investmentPda = getInvestmentPDA(projectPda, nftMint, program.programId);\n const vestingPda = getInvestorMilestoneVestingPDA(projectPda, milestoneIndex, investmentPda, program.programId);\n return await getAccountNamespace(program).investorMilestoneVesting.fetch(vestingPda);\n } catch (error) {\n if (error instanceof Error && error.message?.includes('Account does not exist')) {\n return null;\n }\n throw error;\n }\n}\n\n/**\n * Fetch founder milestone vesting account data\n *\n * Per-milestone vesting: Each milestone has a separate vesting PDA for the\n * founder's milestone-based allocation.\n *\n * @param program - Anchor program instance\n * @param projectId - Project identifier\n * @param milestoneIndex - Milestone index\n * @returns FounderMilestoneVesting account data or null if not found\n */\nexport async function fetchFounderMilestoneVesting(\n program: AnyProgram,\n projectId: BN,\n milestoneIndex: number\n) {\n try {\n const projectPda = getProjectPDA(projectId, program.programId);\n const vestingPda = getFounderMilestoneVestingPDA(projectPda, milestoneIndex, program.programId);\n return await getAccountNamespace(program).founderMilestoneVesting.fetch(vestingPda);\n } catch (error) {\n if (error instanceof Error && error.message?.includes('Account does not exist')) {\n return null;\n }\n throw error;\n }\n}\n\n// =============================================================================\n// Early Token Release Helpers\n// =============================================================================\n\n/** Early token cooling period in seconds (24 hours in production, 10s in dev) */\nexport const EARLY_TOKEN_COOLING_PERIOD_SECONDS = 86_400; // 24 hours\nexport const EARLY_TOKEN_COOLING_PERIOD_SECONDS_DEV = 10; // 10 seconds for dev\n\n/** Early token release percentage in basis points (500 = 5%) */\nexport const EARLY_TOKEN_RELEASE_BPS = 500;\n\n/**\n * Check if an investor can claim early tokens\n *\n * Early Token Release: Investors can claim 5% of their token allocation\n * 24 hours after investing. This helper checks eligibility.\n *\n * @param investment - Investment account data\n * @param currentTimestamp - Current Unix timestamp (optional, uses Date.now() if not provided)\n * @param isDev - Use dev mode (10s) or production mode (24h) cooling period\n * @returns Object with canClaim boolean, reason if ineligible, and time remaining if cooling period not expired\n */\nexport function canClaimEarlyTokens(\n investment: {\n earlyTokensClaimed: boolean;\n investedAt: BN | number;\n votingRightsActive?: boolean;\n withdrawnFromPivot?: boolean;\n },\n currentTimestamp?: number,\n isDev: boolean = false\n): { canClaim: boolean; reason?: string; timeRemainingSeconds?: number } {\n const now = currentTimestamp ?? Math.floor(Date.now() / 1000);\n const coolingPeriod = isDev ? EARLY_TOKEN_COOLING_PERIOD_SECONDS_DEV : EARLY_TOKEN_COOLING_PERIOD_SECONDS;\n\n // Check if already claimed\n if (investment.earlyTokensClaimed) {\n return { canClaim: false, reason: 'Early tokens already claimed' };\n }\n\n // Check if voting rights are active\n if (investment.votingRightsActive === false) {\n return { canClaim: false, reason: 'Voting rights have been revoked' };\n }\n\n // Check if withdrawn from pivot\n if (investment.withdrawnFromPivot === true) {\n return { canClaim: false, reason: 'Investment has been withdrawn from pivot' };\n }\n\n // Check cooling period\n const investedAt = typeof investment.investedAt === 'number'\n ? investment.investedAt\n : investment.investedAt.toNumber();\n\n const coolingEndTime = investedAt + coolingPeriod;\n\n if (now < coolingEndTime) {\n const timeRemaining = coolingEndTime - now;\n return {\n canClaim: false,\n reason: `Cooling period not expired. ${formatTimeRemaining(timeRemaining)} remaining.`,\n timeRemainingSeconds: timeRemaining,\n };\n }\n\n return { canClaim: true };\n}\n\n/**\n * Check if a founder can claim early tokens\n *\n * Early Token Release: Founders can claim 5% of their token allocation\n * when the project becomes Funded. This helper checks eligibility.\n *\n * @param project - Project account data\n * @returns Object with canClaim boolean and reason if ineligible\n */\nexport function canClaimFounderEarlyTokens(\n project: {\n state: unknown;\n founderEarlyTokensClaimed: boolean;\n }\n): { canClaim: boolean; reason?: string } {\n // Check if already claimed\n if (project.founderEarlyTokensClaimed) {\n return { canClaim: false, reason: 'Founder early tokens already claimed' };\n }\n\n // Check project state - must be Funded, InProgress, or Completed\n // These states are represented as objects with a single key in Anchor\n const stateStr = getProjectStateString(project.state);\n const validStates = ['funded', 'inProgress', 'completed'];\n\n if (!validStates.includes(stateStr)) {\n return {\n canClaim: false,\n reason: `Project must be in Funded, InProgress, or Completed state. Current state: ${stateStr}`,\n };\n }\n\n return { canClaim: true };\n}\n\n/**\n * Check if a founder can claim milestone-based tokens\n *\n * Early Token Release: Founders can claim milestone-based tokens when\n * milestones are unlocked. This helper checks eligibility.\n *\n * @param milestone - Milestone account data\n * @returns Object with canClaim boolean and reason if ineligible\n */\nexport function canClaimFounderMilestoneTokens(\n milestone: {\n state: unknown;\n }\n): { canClaim: boolean; reason?: string } {\n // Check milestone state - must be Unlocked\n const stateStr = getMilestoneStateString(milestone.state);\n if (stateStr !== 'unlocked') {\n return {\n canClaim: false,\n reason: `Milestone must be in Unlocked state. Current state: ${stateStr}`,\n };\n }\n\n return { canClaim: true };\n}\n\n/**\n * Check if an investor needs to burn tokens for a refund\n *\n * Early Token Release: If the project has no milestones claimed (cumulative_percentage == 0)\n * AND the investor has claimed early tokens, they must burn those tokens to get a full refund.\n *\n * @param project - Project account data\n * @param investment - Investment account data\n * @returns Object indicating whether burn is required\n */\nexport function requiresBurnForRefund(\n project: {\n cumulativePercentage: number;\n },\n investment: {\n earlyTokensClaimed: boolean;\n earlyTokensAmount: BN | number;\n }\n): { requiresBurn: boolean; burnAmount: number } {\n const isFullRefund = project.cumulativePercentage === 0;\n const requiresBurn = isFullRefund && investment.earlyTokensClaimed;\n\n if (!requiresBurn) {\n return { requiresBurn: false, burnAmount: 0 };\n }\n\n const burnAmount = typeof investment.earlyTokensAmount === 'number'\n ? investment.earlyTokensAmount\n : investment.earlyTokensAmount.toNumber();\n\n return { requiresBurn: true, burnAmount };\n}\n\n/**\n * Calculate early token amount for an investment\n *\n * @param tokensAllocated - Total tokens allocated to the investment\n * @returns Early token amount (5% of allocation)\n */\nexport function calculateEarlyTokenAmount(tokensAllocated: BN | number): BN {\n const allocated = typeof tokensAllocated === 'number'\n ? new BN(tokensAllocated)\n : tokensAllocated;\n\n return allocated.muln(EARLY_TOKEN_RELEASE_BPS).divn(10000);\n}\n\n/**\n * Calculate remaining token allocation after early tokens are claimed\n *\n * @param tokensAllocated - Total tokens allocated\n * @returns Remaining allocation (95% of total)\n */\nexport function calculateRemainingAllocation(tokensAllocated: BN | number): BN {\n const allocated = typeof tokensAllocated === 'number'\n ? new BN(tokensAllocated)\n : tokensAllocated;\n\n const remainingBps = 10000 - EARLY_TOKEN_RELEASE_BPS; // 9500 = 95%\n return allocated.muln(remainingBps).divn(10000);\n}\n\n// =============================================================================\n// Helper Functions\n// =============================================================================\n\n/**\n * Format time remaining in human-readable format\n */\nfunction formatTimeRemaining(seconds: number): string {\n if (seconds <= 0) return '0 seconds';\n\n const hours = Math.floor(seconds / 3600);\n const minutes = Math.floor((seconds % 3600) / 60);\n const secs = seconds % 60;\n\n const parts: string[] = [];\n if (hours > 0) parts.push(`${hours}h`);\n if (minutes > 0) parts.push(`${minutes}m`);\n if (secs > 0 && hours === 0) parts.push(`${secs}s`);\n\n return parts.join(' ') || '0 seconds';\n}\n\n/**\n * Convert Anchor project state object to string\n */\nfunction getProjectStateString(state: unknown): string {\n if (typeof state === 'object' && state !== null) {\n const keys = Object.keys(state);\n return keys[0]?.toLowerCase() ?? 'unknown';\n }\n return 'unknown';\n}\n\n/**\n * Convert Anchor milestone state object to string\n */\nfunction getMilestoneStateString(state: unknown): string {\n if (typeof state === 'object' && state !== null) {\n const keys = Object.keys(state);\n return keys[0]?.toLowerCase() ?? 'unknown';\n }\n return 'unknown';\n}\n\n// =============================================================================\n// Multi-Round Fundraising Account Fetchers\n// =============================================================================\n\n/**\n * Fetch FundingRound account data\n *\n * @param program - Anchor program instance\n * @param projectId - Project identifier\n * @param roundNumber - Round number (2, 3, 4...)\n * @returns FundingRound account data or null if not found\n */\nexport async function fetchFundingRound(\n program: AnyProgram,\n projectId: BN,\n roundNumber: number\n) {\n try {\n const projectPda = getProjectPDA(projectId, program.programId);\n const fundingRoundPda = getFundingRoundPDA(projectPda, roundNumber, program.programId);\n return await getAccountNamespace(program).fundingRound.fetch(fundingRoundPda);\n } catch (error) {\n if (error instanceof Error && error.message?.includes('Account does not exist')) {\n return null;\n }\n throw error;\n }\n}\n\n/**\n * Fetch all FundingRounds for a project\n *\n * @param program - Anchor program instance\n * @param projectId - Project identifier\n * @returns Array of FundingRound accounts with their public keys\n */\nexport async function fetchAllFundingRounds(\n program: AnyProgram,\n projectId: BN\n): Promise<FundingRoundWithKey[]> {\n const projectPda = getProjectPDA(projectId, program.programId);\n\n const rounds = await getAccountNamespace(program).fundingRound.all([\n {\n memcmp: {\n offset: 8, // Skip discriminator\n bytes: projectPda.toBase58(),\n },\n },\n ]);\n\n return rounds.map((r: { publicKey: PublicKey; account: unknown }) => ({\n publicKey: r.publicKey,\n account: r.account,\n })) as FundingRoundWithKey[];\n}\n\n/**\n * Fetch round milestone account data\n *\n * @param program - Anchor program instance\n * @param projectId - Project identifier\n * @param roundNumber - Round number\n * @param milestoneIndex - Milestone index\n * @returns Milestone account data or null if not found\n */\nexport async function fetchRoundMilestone(\n program: AnyProgram,\n projectId: BN,\n roundNumber: number,\n milestoneIndex: number\n) {\n try {\n const projectPda = getProjectPDA(projectId, program.programId);\n const milestonePda = getRoundMilestonePDA(projectPda, roundNumber, milestoneIndex, program.programId);\n return await getAccountNamespace(program).milestone.fetch(milestonePda);\n } catch (error) {\n if (error instanceof Error && error.message?.includes('Account does not exist')) {\n return null;\n }\n throw error;\n }\n}\n\n/**\n * Fetch round investment account data\n *\n * @param program - Anchor program instance\n * @param projectId - Project identifier\n * @param roundNumber - Round number\n * @param nftMint - Investment NFT mint address\n * @returns Investment account data or null if not found\n */\nexport async function fetchRoundInvestment(\n program: AnyProgram,\n projectId: BN,\n roundNumber: number,\n nftMint: PublicKey\n) {\n try {\n const projectPda = getProjectPDA(projectId, program.programId);\n const investmentPda = getRoundInvestmentPDA(projectPda, roundNumber, nftMint, program.programId);\n return await getAccountNamespace(program).investment.fetch(investmentPda);\n } catch (error) {\n if (error instanceof Error && error.message?.includes('Account does not exist')) {\n return null;\n }\n throw error;\n }\n}\n\n/**\n * Fetch round investor milestone vesting account data\n *\n * @param program - Anchor program instance\n * @param projectId - Project identifier\n * @param roundNumber - Round number\n * @param milestoneIndex - Milestone index\n * @param nftMint - NFT mint that proves investment ownership\n * @returns InvestorMilestoneVesting account data or null if not found\n */\nexport async function fetchRoundInvestorMilestoneVesting(\n program: AnyProgram,\n projectId: BN,\n roundNumber: number,\n milestoneIndex: number,\n nftMint: PublicKey\n) {\n try {\n const projectPda = getProjectPDA(projectId, program.programId);\n const investmentPda = getRoundInvestmentPDA(projectPda, roundNumber, nftMint, program.programId);\n const vestingPda = getRoundInvestorMilestoneVestingPDA(\n projectPda,\n roundNumber,\n milestoneIndex,\n investmentPda,\n program.programId\n );\n return await getAccountNamespace(program).investorMilestoneVesting.fetch(vestingPda);\n } catch (error) {\n if (error instanceof Error && error.message?.includes('Account does not exist')) {\n return null;\n }\n throw error;\n }\n}\n\n/**\n * Fetch FutureRoundVault account data\n *\n * @param program - Anchor program instance\n * @param projectId - Project identifier\n * @returns FutureRoundVault account data or null if not found\n */\nexport async function fetchFutureRoundVault(\n program: AnyProgram,\n projectId: BN\n) {\n try {\n const projectPda = getProjectPDA(projectId, program.programId);\n const vaultPda = getFutureRoundVaultPDA(projectPda, program.programId);\n return await getAccountNamespace(program).futureRoundVault.fetch(vaultPda);\n } catch (error) {\n if (error instanceof Error && error.message?.includes('Account does not exist')) {\n return null;\n }\n throw error;\n }\n}\n\n/**\n * Check if an investor can claim R2+ early tokens\n *\n * @param investment - Investment account data (from R2+ round)\n * @param currentTimestamp - Current Unix timestamp\n * @param isDev - Use dev mode cooling period\n * @returns Eligibility check result\n */\nexport function canClaimRoundEarlyTokens(\n investment: {\n earlyTokensClaimed: boolean;\n investedAt: BN | number;\n votingRightsActive?: boolean;\n roundNumber: number;\n },\n currentTimestamp?: number,\n isDev: boolean = false\n): { canClaim: boolean; reason?: string; timeRemainingSeconds?: number } {\n // Must be R2+ investment\n if (investment.roundNumber < 2) {\n return { canClaim: false, reason: 'R1 investments use claim_investor_early_tokens instruction' };\n }\n\n // Delegate to the common early token check\n return canClaimEarlyTokens(investment, currentTimestamp, isDev);\n}\n\n// =============================================================================\n// Multi-Round Funding Eligibility Helpers\n// =============================================================================\n\n/**\n * Check if R1 (Project-based round) is fully funded\n *\n * @param project - Project account data\n * @returns True if total_raised >= funding_goal\n */\nexport function isR1FullyFunded(\n project: {\n totalRaised: BN | number;\n fundingGoal: BN | number;\n }\n): boolean {\n const raised = typeof project.totalRaised === 'number'\n ? new BN(project.totalRaised)\n : project.totalRaised;\n const goal = typeof project.fundingGoal === 'number'\n ? new BN(project.fundingGoal)\n : project.fundingGoal;\n\n return raised.gte(goal);\n}\n\n/**\n * Check if a FundingRound (R2+) is fully funded\n *\n * A round is considered \"fully funded\" when it reaches the Funded, InProgress, or Completed state.\n *\n * @param fundingRound - FundingRound account data\n * @returns True if round state is Funded, InProgress, or Completed\n */\nexport function isFundingRoundFullyFunded(\n fundingRound: {\n state: unknown;\n totalRaised?: BN | number;\n fundingGoal?: BN | number;\n }\n): boolean {\n const stateStr = getRoundStateString(fundingRound.state);\n return ['funded', 'inProgress', 'inprogress', 'completed'].includes(stateStr);\n}\n\n/**\n * Check if a round (R1 or R2+) is fully funded\n *\n * For R1: Checks project.totalRaised >= project.fundingGoal\n * For R2+: Checks fundingRound.state is Funded or beyond\n *\n * @param program - Anchor program instance\n * @param projectId - Project identifier\n * @param roundNumber - Round number (1 for R1, 2+ for subsequent rounds)\n * @returns True if the round is fully funded\n */\nexport async function isRoundFullyFunded(\n program: AnyProgram,\n projectId: BN,\n roundNumber: number\n): Promise<boolean> {\n if (roundNumber === 1) {\n // R1 uses Project state\n const project = await fetchProject(program, projectId);\n if (!project) return false;\n return isR1FullyFunded(project);\n } else {\n // R2+ uses FundingRound state\n const fundingRound = await fetchFundingRound(program, projectId, roundNumber);\n if (!fundingRound) return false;\n return isFundingRoundFullyFunded(fundingRound);\n }\n}\n\n/**\n * Check if a project can open the next funding round\n *\n * Requirements:\n * 1. Project must be InProgress or Completed\n * 2. At least 1 milestone must have passed (for InProgress projects)\n * 3. Current round must be fully funded\n * 4. No other round is currently in Open state\n * 5. Future round allocation must be available\n *\n * @param program - Anchor program instance\n * @param projectId - Project identifier\n * @returns Eligibility check result with reason if ineligible\n */\nexport async function canOpenNextRound(\n program: AnyProgram,\n projectId: BN\n): Promise<{ canOpen: boolean; reason?: string; nextRoundNumber?: number }> {\n // Fetch project\n const project = await fetchProject(program, projectId);\n if (!project) {\n return { canOpen: false, reason: 'Project not found' };\n }\n\n const projectState = getProjectStateString(project.state);\n\n // 1. Project must be InProgress or Completed\n if (!['inProgress', 'inprogress', 'completed'].includes(projectState)) {\n return {\n canOpen: false,\n reason: `Project must be in InProgress or Completed state. Current: ${projectState}`,\n };\n }\n\n // 2. At least 1 milestone must have passed (for InProgress)\n if (projectState !== 'completed' && project.milestonesPassed === 0) {\n return {\n canOpen: false,\n reason: 'At least one milestone must pass before opening next round',\n };\n }\n\n // 3. No other round currently active\n if (project.activeRound !== 0) {\n return {\n canOpen: false,\n reason: `Round ${project.activeRound} is already active`,\n };\n }\n\n // 4. Current round must be fully funded\n const currentRound = project.roundCount;\n const isCurrentFunded = await isRoundFullyFunded(program, projectId, currentRound);\n if (!isCurrentFunded) {\n return {\n canOpen: false,\n reason: `Current round ${currentRound} must be fully funded before opening next round`,\n };\n }\n\n // 5. Future round allocation must be available\n const tokenomics = await fetchTokenomics(program, projectId);\n if (!tokenomics) {\n return { canOpen: false, reason: 'Tokenomics not found' };\n }\n\n if (tokenomics.futureRoundAllocationBps === 0) {\n return {\n canOpen: false,\n reason: 'No future round allocation configured',\n };\n }\n\n const remainingAllocation = tokenomics.futureRoundAllocationBps - (tokenomics.usedFutureRoundBps || 0);\n if (remainingAllocation <= 0) {\n return {\n canOpen: false,\n reason: 'Future round allocation pool exhausted',\n };\n }\n\n return {\n canOpen: true,\n nextRoundNumber: currentRound + 1,\n };\n}\n\n/**\n * Get remaining future round allocation in basis points\n *\n * @param tokenomics - Tokenomics account data\n * @returns Remaining allocation in BPS\n */\nexport function getRemainingFutureRoundAllocation(\n tokenomics: {\n futureRoundAllocationBps: number;\n usedFutureRoundBps?: number;\n }\n): number {\n return tokenomics.futureRoundAllocationBps - (tokenomics.usedFutureRoundBps || 0);\n}\n\n/**\n * Convert Anchor round state object to string\n */\nfunction getRoundStateString(state: unknown): string {\n if (typeof state === 'object' && state !== null) {\n const keys = Object.keys(state);\n return keys[0]?.toLowerCase() ?? 'unknown';\n }\n return 'unknown';\n}\n"]}
@@ -1,6 +1,6 @@
1
1
  import { Program, BN } from '@coral-xyz/anchor';
2
2
  import { PublicKey } from '@solana/web3.js';
3
- import { MilestoneWithKey, InvestmentWithKey, VoteWithKey } from '../types/index.cjs';
3
+ import { MilestoneWithKey, InvestmentWithKey, VoteWithKey, FundingRoundWithKey, AllocationProposalWithKey } from '../types/index.cjs';
4
4
 
5
5
  /**
6
6
  * Raise Account Fetchers
@@ -102,6 +102,14 @@ declare function fetchTgeEscrow(program: AnyProgram, projectId: BN): Promise<any
102
102
  * @returns AdminConfig account data
103
103
  */
104
104
  declare function fetchAdminConfig(program: AnyProgram): Promise<any>;
105
+ /**
106
+ * Fetch token vault account data
107
+ *
108
+ * @param program - Anchor program instance
109
+ * @param projectId - Project identifier
110
+ * @returns TokenVault account data or null if not found
111
+ */
112
+ declare function fetchTokenVault(program: AnyProgram, projectId: BN): Promise<any>;
105
113
  /**
106
114
  * Check if an account exists
107
115
  *
@@ -111,5 +119,302 @@ declare function fetchAdminConfig(program: AnyProgram): Promise<any>;
111
119
  * @returns True if account exists
112
120
  */
113
121
  declare function accountExists(program: AnyProgram, accountType: string, pda: PublicKey): Promise<boolean>;
122
+ /**
123
+ * Fetch tokenomics account data
124
+ *
125
+ * @param program - Anchor program instance
126
+ * @param projectId - Project identifier
127
+ * @returns Tokenomics account data or null if not found
128
+ */
129
+ declare function fetchTokenomics(program: AnyProgram, projectId: BN): Promise<any>;
130
+ /**
131
+ * Fetch allocation proposal account data
132
+ *
133
+ * @param program - Anchor program instance
134
+ * @param projectId - Project identifier
135
+ * @param proposalIndex - Proposal index
136
+ * @returns AllocationProposal account data or null if not found
137
+ */
138
+ declare function fetchAllocationProposal(program: AnyProgram, projectId: BN, proposalIndex: number): Promise<any>;
139
+ /**
140
+ * Fetch all allocation proposals for a project
141
+ *
142
+ * @param program - Anchor program instance
143
+ * @param projectId - Project identifier
144
+ * @returns Array of allocation proposal accounts with their public keys
145
+ */
146
+ declare function fetchAllAllocationProposals(program: AnyProgram, projectId: BN): Promise<AllocationProposalWithKey[]>;
147
+ /**
148
+ * Fetch allocation vote account data
149
+ *
150
+ * @param program - Anchor program instance
151
+ * @param projectId - Project identifier
152
+ * @param proposalIndex - Proposal index
153
+ * @param nftMint - NFT mint used for voting
154
+ * @returns AllocationVote account data or null if not found
155
+ */
156
+ declare function fetchAllocationVote(program: AnyProgram, projectId: BN, proposalIndex: number, nftMint: PublicKey): Promise<any>;
157
+ /**
158
+ * Fetch sub-allocation vesting account data
159
+ *
160
+ * @param program - Anchor program instance
161
+ * @param projectId - Project identifier
162
+ * @param subAllocationId - Sub-allocation ID (0-9)
163
+ * @returns SubAllocationVesting account data or null if not found
164
+ */
165
+ declare function fetchSubAllocationVesting(program: AnyProgram, projectId: BN, subAllocationId: number): Promise<any>;
166
+ /**
167
+ * Fetch investor milestone vesting account data
168
+ *
169
+ * Per-milestone vesting: Each investor has a separate vesting PDA for each
170
+ * milestone they claim tokens from.
171
+ *
172
+ * @param program - Anchor program instance
173
+ * @param projectId - Project identifier
174
+ * @param milestoneIndex - Milestone index
175
+ * @param nftMint - NFT mint that proves investment ownership
176
+ * @returns InvestorMilestoneVesting account data or null if not found
177
+ */
178
+ declare function fetchInvestorMilestoneVesting(program: AnyProgram, projectId: BN, milestoneIndex: number, nftMint: PublicKey): Promise<any>;
179
+ /**
180
+ * Fetch founder milestone vesting account data
181
+ *
182
+ * Per-milestone vesting: Each milestone has a separate vesting PDA for the
183
+ * founder's milestone-based allocation.
184
+ *
185
+ * @param program - Anchor program instance
186
+ * @param projectId - Project identifier
187
+ * @param milestoneIndex - Milestone index
188
+ * @returns FounderMilestoneVesting account data or null if not found
189
+ */
190
+ declare function fetchFounderMilestoneVesting(program: AnyProgram, projectId: BN, milestoneIndex: number): Promise<any>;
191
+ /** Early token cooling period in seconds (24 hours in production, 10s in dev) */
192
+ declare const EARLY_TOKEN_COOLING_PERIOD_SECONDS = 86400;
193
+ declare const EARLY_TOKEN_COOLING_PERIOD_SECONDS_DEV = 10;
194
+ /** Early token release percentage in basis points (500 = 5%) */
195
+ declare const EARLY_TOKEN_RELEASE_BPS = 500;
196
+ /**
197
+ * Check if an investor can claim early tokens
198
+ *
199
+ * Early Token Release: Investors can claim 5% of their token allocation
200
+ * 24 hours after investing. This helper checks eligibility.
201
+ *
202
+ * @param investment - Investment account data
203
+ * @param currentTimestamp - Current Unix timestamp (optional, uses Date.now() if not provided)
204
+ * @param isDev - Use dev mode (10s) or production mode (24h) cooling period
205
+ * @returns Object with canClaim boolean, reason if ineligible, and time remaining if cooling period not expired
206
+ */
207
+ declare function canClaimEarlyTokens(investment: {
208
+ earlyTokensClaimed: boolean;
209
+ investedAt: BN | number;
210
+ votingRightsActive?: boolean;
211
+ withdrawnFromPivot?: boolean;
212
+ }, currentTimestamp?: number, isDev?: boolean): {
213
+ canClaim: boolean;
214
+ reason?: string;
215
+ timeRemainingSeconds?: number;
216
+ };
217
+ /**
218
+ * Check if a founder can claim early tokens
219
+ *
220
+ * Early Token Release: Founders can claim 5% of their token allocation
221
+ * when the project becomes Funded. This helper checks eligibility.
222
+ *
223
+ * @param project - Project account data
224
+ * @returns Object with canClaim boolean and reason if ineligible
225
+ */
226
+ declare function canClaimFounderEarlyTokens(project: {
227
+ state: unknown;
228
+ founderEarlyTokensClaimed: boolean;
229
+ }): {
230
+ canClaim: boolean;
231
+ reason?: string;
232
+ };
233
+ /**
234
+ * Check if a founder can claim milestone-based tokens
235
+ *
236
+ * Early Token Release: Founders can claim milestone-based tokens when
237
+ * milestones are unlocked. This helper checks eligibility.
238
+ *
239
+ * @param milestone - Milestone account data
240
+ * @returns Object with canClaim boolean and reason if ineligible
241
+ */
242
+ declare function canClaimFounderMilestoneTokens(milestone: {
243
+ state: unknown;
244
+ }): {
245
+ canClaim: boolean;
246
+ reason?: string;
247
+ };
248
+ /**
249
+ * Check if an investor needs to burn tokens for a refund
250
+ *
251
+ * Early Token Release: If the project has no milestones claimed (cumulative_percentage == 0)
252
+ * AND the investor has claimed early tokens, they must burn those tokens to get a full refund.
253
+ *
254
+ * @param project - Project account data
255
+ * @param investment - Investment account data
256
+ * @returns Object indicating whether burn is required
257
+ */
258
+ declare function requiresBurnForRefund(project: {
259
+ cumulativePercentage: number;
260
+ }, investment: {
261
+ earlyTokensClaimed: boolean;
262
+ earlyTokensAmount: BN | number;
263
+ }): {
264
+ requiresBurn: boolean;
265
+ burnAmount: number;
266
+ };
267
+ /**
268
+ * Calculate early token amount for an investment
269
+ *
270
+ * @param tokensAllocated - Total tokens allocated to the investment
271
+ * @returns Early token amount (5% of allocation)
272
+ */
273
+ declare function calculateEarlyTokenAmount(tokensAllocated: BN | number): BN;
274
+ /**
275
+ * Calculate remaining token allocation after early tokens are claimed
276
+ *
277
+ * @param tokensAllocated - Total tokens allocated
278
+ * @returns Remaining allocation (95% of total)
279
+ */
280
+ declare function calculateRemainingAllocation(tokensAllocated: BN | number): BN;
281
+ /**
282
+ * Fetch FundingRound account data
283
+ *
284
+ * @param program - Anchor program instance
285
+ * @param projectId - Project identifier
286
+ * @param roundNumber - Round number (2, 3, 4...)
287
+ * @returns FundingRound account data or null if not found
288
+ */
289
+ declare function fetchFundingRound(program: AnyProgram, projectId: BN, roundNumber: number): Promise<any>;
290
+ /**
291
+ * Fetch all FundingRounds for a project
292
+ *
293
+ * @param program - Anchor program instance
294
+ * @param projectId - Project identifier
295
+ * @returns Array of FundingRound accounts with their public keys
296
+ */
297
+ declare function fetchAllFundingRounds(program: AnyProgram, projectId: BN): Promise<FundingRoundWithKey[]>;
298
+ /**
299
+ * Fetch round milestone account data
300
+ *
301
+ * @param program - Anchor program instance
302
+ * @param projectId - Project identifier
303
+ * @param roundNumber - Round number
304
+ * @param milestoneIndex - Milestone index
305
+ * @returns Milestone account data or null if not found
306
+ */
307
+ declare function fetchRoundMilestone(program: AnyProgram, projectId: BN, roundNumber: number, milestoneIndex: number): Promise<any>;
308
+ /**
309
+ * Fetch round investment account data
310
+ *
311
+ * @param program - Anchor program instance
312
+ * @param projectId - Project identifier
313
+ * @param roundNumber - Round number
314
+ * @param nftMint - Investment NFT mint address
315
+ * @returns Investment account data or null if not found
316
+ */
317
+ declare function fetchRoundInvestment(program: AnyProgram, projectId: BN, roundNumber: number, nftMint: PublicKey): Promise<any>;
318
+ /**
319
+ * Fetch round investor milestone vesting account data
320
+ *
321
+ * @param program - Anchor program instance
322
+ * @param projectId - Project identifier
323
+ * @param roundNumber - Round number
324
+ * @param milestoneIndex - Milestone index
325
+ * @param nftMint - NFT mint that proves investment ownership
326
+ * @returns InvestorMilestoneVesting account data or null if not found
327
+ */
328
+ declare function fetchRoundInvestorMilestoneVesting(program: AnyProgram, projectId: BN, roundNumber: number, milestoneIndex: number, nftMint: PublicKey): Promise<any>;
329
+ /**
330
+ * Fetch FutureRoundVault account data
331
+ *
332
+ * @param program - Anchor program instance
333
+ * @param projectId - Project identifier
334
+ * @returns FutureRoundVault account data or null if not found
335
+ */
336
+ declare function fetchFutureRoundVault(program: AnyProgram, projectId: BN): Promise<any>;
337
+ /**
338
+ * Check if an investor can claim R2+ early tokens
339
+ *
340
+ * @param investment - Investment account data (from R2+ round)
341
+ * @param currentTimestamp - Current Unix timestamp
342
+ * @param isDev - Use dev mode cooling period
343
+ * @returns Eligibility check result
344
+ */
345
+ declare function canClaimRoundEarlyTokens(investment: {
346
+ earlyTokensClaimed: boolean;
347
+ investedAt: BN | number;
348
+ votingRightsActive?: boolean;
349
+ roundNumber: number;
350
+ }, currentTimestamp?: number, isDev?: boolean): {
351
+ canClaim: boolean;
352
+ reason?: string;
353
+ timeRemainingSeconds?: number;
354
+ };
355
+ /**
356
+ * Check if R1 (Project-based round) is fully funded
357
+ *
358
+ * @param project - Project account data
359
+ * @returns True if total_raised >= funding_goal
360
+ */
361
+ declare function isR1FullyFunded(project: {
362
+ totalRaised: BN | number;
363
+ fundingGoal: BN | number;
364
+ }): boolean;
365
+ /**
366
+ * Check if a FundingRound (R2+) is fully funded
367
+ *
368
+ * A round is considered "fully funded" when it reaches the Funded, InProgress, or Completed state.
369
+ *
370
+ * @param fundingRound - FundingRound account data
371
+ * @returns True if round state is Funded, InProgress, or Completed
372
+ */
373
+ declare function isFundingRoundFullyFunded(fundingRound: {
374
+ state: unknown;
375
+ totalRaised?: BN | number;
376
+ fundingGoal?: BN | number;
377
+ }): boolean;
378
+ /**
379
+ * Check if a round (R1 or R2+) is fully funded
380
+ *
381
+ * For R1: Checks project.totalRaised >= project.fundingGoal
382
+ * For R2+: Checks fundingRound.state is Funded or beyond
383
+ *
384
+ * @param program - Anchor program instance
385
+ * @param projectId - Project identifier
386
+ * @param roundNumber - Round number (1 for R1, 2+ for subsequent rounds)
387
+ * @returns True if the round is fully funded
388
+ */
389
+ declare function isRoundFullyFunded(program: AnyProgram, projectId: BN, roundNumber: number): Promise<boolean>;
390
+ /**
391
+ * Check if a project can open the next funding round
392
+ *
393
+ * Requirements:
394
+ * 1. Project must be InProgress or Completed
395
+ * 2. At least 1 milestone must have passed (for InProgress projects)
396
+ * 3. Current round must be fully funded
397
+ * 4. No other round is currently in Open state
398
+ * 5. Future round allocation must be available
399
+ *
400
+ * @param program - Anchor program instance
401
+ * @param projectId - Project identifier
402
+ * @returns Eligibility check result with reason if ineligible
403
+ */
404
+ declare function canOpenNextRound(program: AnyProgram, projectId: BN): Promise<{
405
+ canOpen: boolean;
406
+ reason?: string;
407
+ nextRoundNumber?: number;
408
+ }>;
409
+ /**
410
+ * Get remaining future round allocation in basis points
411
+ *
412
+ * @param tokenomics - Tokenomics account data
413
+ * @returns Remaining allocation in BPS
414
+ */
415
+ declare function getRemainingFutureRoundAllocation(tokenomics: {
416
+ futureRoundAllocationBps: number;
417
+ usedFutureRoundBps?: number;
418
+ }): number;
114
419
 
115
- export { accountExists, fetchAdminConfig, fetchAllInvestments, fetchAllMilestones, fetchAllVotes, fetchInvestment, fetchMilestone, fetchPivotProposal, fetchProject, fetchProjectByPda, fetchTgeEscrow, fetchVote };
420
+ export { EARLY_TOKEN_COOLING_PERIOD_SECONDS, EARLY_TOKEN_COOLING_PERIOD_SECONDS_DEV, EARLY_TOKEN_RELEASE_BPS, accountExists, calculateEarlyTokenAmount, calculateRemainingAllocation, canClaimEarlyTokens, canClaimFounderEarlyTokens, canClaimFounderMilestoneTokens, canClaimRoundEarlyTokens, canOpenNextRound, fetchAdminConfig, fetchAllAllocationProposals, fetchAllFundingRounds, fetchAllInvestments, fetchAllMilestones, fetchAllVotes, fetchAllocationProposal, fetchAllocationVote, fetchFounderMilestoneVesting, fetchFundingRound, fetchFutureRoundVault, fetchInvestment, fetchInvestorMilestoneVesting, fetchMilestone, fetchPivotProposal, fetchProject, fetchProjectByPda, fetchRoundInvestment, fetchRoundInvestorMilestoneVesting, fetchRoundMilestone, fetchSubAllocationVesting, fetchTgeEscrow, fetchTokenVault, fetchTokenomics, fetchVote, getRemainingFutureRoundAllocation, isFundingRoundFullyFunded, isR1FullyFunded, isRoundFullyFunded, requiresBurnForRefund };