@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.
- package/README.md +11 -9
- package/dist/accounts/index.cjs +531 -3
- package/dist/accounts/index.cjs.map +1 -1
- package/dist/accounts/index.d.cts +307 -2
- package/dist/accounts/index.d.ts +307 -2
- package/dist/accounts/index.js +503 -4
- package/dist/accounts/index.js.map +1 -1
- package/dist/constants/index.cjs +41 -3
- package/dist/constants/index.cjs.map +1 -1
- package/dist/constants/index.d.cts +38 -3
- package/dist/constants/index.d.ts +38 -3
- package/dist/constants/index.js +40 -4
- package/dist/constants/index.js.map +1 -1
- package/dist/index.cjs +2297 -361
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +566 -7
- package/dist/index.d.ts +566 -7
- package/dist/index.js +2279 -379
- package/dist/index.js.map +1 -1
- package/dist/instructions/index.cjs +783 -40
- package/dist/instructions/index.cjs.map +1 -1
- package/dist/instructions/index.d.cts +492 -6
- package/dist/instructions/index.d.ts +492 -6
- package/dist/instructions/index.js +762 -42
- package/dist/instructions/index.js.map +1 -1
- package/dist/pdas/index.cjs +163 -1
- package/dist/pdas/index.cjs.map +1 -1
- package/dist/pdas/index.d.cts +131 -1
- package/dist/pdas/index.d.ts +131 -1
- package/dist/pdas/index.js +151 -2
- package/dist/pdas/index.js.map +1 -1
- package/dist/types/index.cjs +9 -0
- package/dist/types/index.cjs.map +1 -1
- package/dist/types/index.d.cts +586 -3
- package/dist/types/index.d.ts +586 -3
- package/dist/types/index.js +9 -1
- package/dist/types/index.js.map +1 -1
- package/package.json +5 -3
- package/src/__tests__/dynamic-tokenomics.test.ts +358 -0
- package/src/accounts/index.ts +852 -1
- package/src/client.ts +1130 -1
- package/src/constants/index.ts +48 -2
- package/src/index.ts +58 -0
- package/src/instructions/index.ts +1383 -40
- package/src/pdas/index.ts +346 -0
- package/src/types/index.ts +698 -2
- package/src/utils/index.ts +90 -0
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/constants/index.ts","../src/pdas/index.ts","../src/accounts/index.ts","../src/instructions/index.ts","../src/client.ts","../src/types/index.ts","../src/errors/index.ts","../src/events/index.ts","../src/utils/index.ts"],"names":["InvestmentTier","PublicKey","getAccountNamespace","BN","minDeadline","ProjectState","MilestoneState","VoteChoice","PivotState"],"mappings":"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","file":"index.js","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","/**\n * Raise Instruction Builders\n *\n * All instruction builder functions for the Raise program.\n * These return transaction signatures when called with RPC.\n */\n\nimport { Program, BN } from '@coral-xyz/anchor';\nimport { PublicKey, Keypair, SYSVAR_INSTRUCTIONS_PUBKEY, SYSVAR_RENT_PUBKEY, SYSVAR_CLOCK_PUBKEY, SystemProgram, ComputeBudgetProgram } from '@solana/web3.js';\nimport {\n getProjectPDA,\n getEscrowPDA,\n getMilestonePDA,\n getInvestmentPDA,\n getVotePDA,\n getPivotProposalPDA,\n getTgeEscrowPDA,\n getTokenVaultPDA,\n getNftMintPDA,\n getProgramAuthorityPDA,\n getAdminConfigPDA,\n // ZTM v2.0 PDAs\n getTokenomicsPDA,\n getTokenMintPDA,\n getVaultAuthorityPDA,\n getInvestorVaultPDA,\n getFounderVaultPDA,\n getLpTokenVaultPDA,\n getTreasuryVaultPDA,\n getLpUsdcVaultPDA,\n getFounderVestingPDA,\n} from '../pdas/index.js';\nimport { getAssociatedTokenAddressSync, TOKEN_PROGRAM_ID, ASSOCIATED_TOKEN_PROGRAM_ID } from '@solana/spl-token';\n\n// Metaplex Token Metadata Program ID\nconst TOKEN_METADATA_PROGRAM_ID = new PublicKey('metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s');\n\n/**\n * Ensure value is a proper PublicKey instance.\n * Handles cases where PublicKey objects lose their prototype chain\n * (e.g., when passing through React state or JSON serialization).\n */\nfunction ensurePublicKey(value: PublicKey | string | { toString(): string }): PublicKey {\n if (value instanceof PublicKey) {\n return value;\n }\n // Handle string or object with toString method\n return new PublicKey(String(value));\n}\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 get methods namespace - bypasses deep type instantiation\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction getMethods(program: AnyProgram): any {\n return program.methods;\n}\n\n// Helper to get account namespace for fetching accounts\n// Used by voteOnMilestone to fetch milestone.voting_round for vote PDA\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction getAccountNamespace(program: AnyProgram): any {\n return program.account;\n}\n\n// =============================================================================\n// Admin Instructions\n// =============================================================================\n\n/**\n * Initialize admin config (deploy-time only)\n */\nexport async function initializeAdmin(\n program: AnyProgram,\n admin: PublicKey,\n payer: PublicKey\n): Promise<string> {\n return getMethods(program)\n .initializeAdmin()\n .accounts({\n admin,\n payer,\n })\n .rpc();\n}\n\n/**\n * Propose admin transfer to new admin\n */\nexport async function transferAdmin(\n program: AnyProgram,\n adminKeypair: Keypair,\n newAdmin: PublicKey\n): Promise<string> {\n return getMethods(program)\n .transferAdmin()\n .accounts({\n authority: adminKeypair.publicKey,\n newAdmin,\n })\n .signers([adminKeypair])\n .rpc();\n}\n\n/**\n * Accept admin transfer\n */\nexport async function acceptAdmin(\n program: AnyProgram,\n newAuthority: PublicKey\n): Promise<string> {\n return getMethods(program)\n .acceptAdmin()\n .accounts({\n newAuthority,\n })\n .rpc();\n}\n\n// =============================================================================\n// Project Instructions\n// =============================================================================\n\n/**\n * TierConfig input type for initializeProject\n * Matches the on-chain TierConfig struct\n */\ninterface TierConfigInput {\n /** USDC amount per lot */\n amount: BN;\n /** Maximum lots available */\n maxLots: number;\n /** Token allocation per $1 invested */\n tokenRatio: BN;\n /** Vote weight multiplier (basis points, 100 = 1.0x) */\n voteMultiplier: number;\n}\n\n/**\n * TokenomicsArgs input type for initializeProject (ZTM v2.0)\n * Matches the on-chain TokenomicsArgs struct\n */\nexport interface TokenomicsInput {\n /** Token symbol as 8-byte array (2-8 chars uppercase, padded with 0s) */\n tokenSymbol: number[];\n /** Total token supply */\n totalSupply: BN;\n /** Investor allocation in basis points (e.g., 4000 = 40%) */\n investorAllocationBps: number;\n /** LP token allocation in basis points */\n lpTokenAllocationBps: number;\n /** LP USDC allocation in basis points (min 500 = 5% of raised USDC) */\n lpUsdcAllocationBps: number;\n /** Founder allocation in basis points (optional) */\n founderAllocationBps?: number | null;\n /** Treasury allocation in basis points (optional) */\n treasuryAllocationBps?: number | null;\n /** Founder wallet for vesting (required if founder_allocation_bps > 0) */\n founderWallet?: PublicKey | null;\n /** Vesting duration in months (required if founder_allocation_bps > 0) */\n vestingDurationMonths?: number | null;\n /** Cliff period in months (optional) */\n cliffMonths?: number | null;\n}\n\n/**\n * Helper to convert string symbol to 8-byte array\n */\nexport function symbolToBytes(symbol: string): number[] {\n const bytes = new Array(8).fill(0);\n const chars = symbol.toUpperCase().slice(0, 8);\n for (let i = 0; i < chars.length; i++) {\n bytes[i] = chars.charCodeAt(i);\n }\n return bytes;\n}\n\n// =============================================================================\n// Deadline Constants and Helpers\n// =============================================================================\n\n/** Minimum deadline duration from current time (7 days in production, 60s in dev) */\nexport const MIN_DEADLINE_DURATION_SECONDS_PROD = 604_800; // 7 days\nexport const MIN_DEADLINE_DURATION_SECONDS_DEV = 60; // 60 seconds\n\n/** Maximum deadline duration from current time (1 year) */\nexport const MAX_DEADLINE_DURATION_SECONDS = 31_536_000; // 365 days\n\n/**\n * Calculate a valid milestone deadline\n *\n * @param daysFromNow - Number of days from now to set deadline\n * @param isDev - Use dev mode (60s min) or production mode (7 days min)\n * @returns BN timestamp for the deadline\n */\nexport function calculateDeadline(daysFromNow: number, isDev: boolean = false): BN {\n const nowSeconds = Math.floor(Date.now() / 1000);\n const minDuration = isDev ? MIN_DEADLINE_DURATION_SECONDS_DEV : MIN_DEADLINE_DURATION_SECONDS_PROD;\n const daysInSeconds = daysFromNow * 24 * 60 * 60;\n\n // Ensure deadline is at least minimum duration from now\n const deadlineSeconds = nowSeconds + Math.max(daysInSeconds, minDuration);\n\n // Cap at maximum duration\n const maxDeadline = nowSeconds + MAX_DEADLINE_DURATION_SECONDS;\n return new BN(Math.min(deadlineSeconds, maxDeadline));\n}\n\n/**\n * Create a deadline that's the minimum allowed duration from now\n *\n * @param isDev - Use dev mode (60s min) or production mode (7 days min)\n * @returns BN timestamp for the minimum valid deadline\n */\nexport function minDeadline(isDev: boolean = false): BN {\n const nowSeconds = Math.floor(Date.now() / 1000);\n const minDuration = isDev ? MIN_DEADLINE_DURATION_SECONDS_DEV : MIN_DEADLINE_DURATION_SECONDS_PROD;\n return new BN(nowSeconds + minDuration + 1); // +1 for safety margin\n}\n\n/**\n * Validate a deadline is within allowed bounds\n *\n * @param deadline - BN timestamp to validate\n * @param isDev - Use dev mode (60s min) or production mode (7 days min)\n * @returns { valid: boolean, error?: string }\n */\nexport function validateDeadline(\n deadline: BN,\n isDev: boolean = false\n): { valid: boolean; error?: string } {\n const nowSeconds = Math.floor(Date.now() / 1000);\n const deadlineSeconds = deadline.toNumber();\n const minDuration = isDev ? MIN_DEADLINE_DURATION_SECONDS_DEV : MIN_DEADLINE_DURATION_SECONDS_PROD;\n\n const minDeadline = nowSeconds + minDuration;\n const maxDeadline = nowSeconds + MAX_DEADLINE_DURATION_SECONDS;\n\n if (deadlineSeconds < minDeadline) {\n const minDays = isDev ? '60 seconds' : '7 days';\n return {\n valid: false,\n error: `Deadline must be at least ${minDays} from now`,\n };\n }\n\n if (deadlineSeconds > maxDeadline) {\n return {\n valid: false,\n error: 'Deadline must be within 1 year from now',\n };\n }\n\n return { valid: true };\n}\n\n/**\n * Initialize a new project with founder-configured tiers and tokenomics (ZTM v2.0)\n *\n * @param milestone1Deadline - Unix timestamp for M1 deadline (required)\n * Must be >= current_time + MIN_DEADLINE_DURATION_SECONDS (7 days prod, 60s dev)\n * Must be <= current_time + MAX_DEADLINE_DURATION_SECONDS (1 year)\n */\nexport async function initializeProject(\n program: AnyProgram,\n args: {\n projectId: BN;\n fundingGoal: BN;\n metadataUri: string;\n /** Founder-configured tiers (1-10 tiers, sorted ascending by amount) */\n tiers: TierConfigInput[];\n /** ZTM v2.0: Tokenomics configuration */\n tokenomics: TokenomicsInput;\n /** Milestone 1 deadline - Unix timestamp (required) */\n milestone1Deadline: BN;\n },\n founder: PublicKey\n): Promise<string> {\n return getMethods(program)\n .initializeProject({\n projectId: args.projectId,\n fundingGoal: args.fundingGoal,\n metadataUri: args.metadataUri,\n tiers: args.tiers,\n tokenomics: {\n tokenSymbol: args.tokenomics.tokenSymbol,\n totalSupply: args.tokenomics.totalSupply,\n investorAllocationBps: args.tokenomics.investorAllocationBps,\n lpTokenAllocationBps: args.tokenomics.lpTokenAllocationBps,\n lpUsdcAllocationBps: args.tokenomics.lpUsdcAllocationBps,\n founderAllocationBps: args.tokenomics.founderAllocationBps ?? null,\n treasuryAllocationBps: args.tokenomics.treasuryAllocationBps ?? null,\n founderWallet: args.tokenomics.founderWallet ?? null,\n vestingDurationMonths: args.tokenomics.vestingDurationMonths ?? null,\n cliffMonths: args.tokenomics.cliffMonths ?? null,\n },\n milestone1Deadline: args.milestone1Deadline,\n })\n .accounts({\n founder,\n })\n .rpc();\n}\n\n/**\n * Submit project for approval\n */\nexport async function submitForApproval(\n program: AnyProgram,\n projectId: BN,\n founder: PublicKey\n): Promise<string> {\n const projectPda = getProjectPDA(projectId, program.programId);\n\n return getMethods(program)\n .submitForApproval()\n .accounts({\n project: projectPda,\n founder,\n })\n .rpc();\n}\n\n/**\n * Approve project (admin only)\n * ZTM v2.0: This now deploys the token and creates all vaults\n */\nexport async function approveProject(\n program: AnyProgram,\n args: {\n projectId: BN;\n /** USDC mint address (for creating lp_usdc_vault) */\n usdcMint: PublicKey;\n },\n adminKeypair: Keypair\n): Promise<string> {\n const projectPda = getProjectPDA(args.projectId, program.programId);\n const tokenomicsPda = getTokenomicsPDA(projectPda, program.programId);\n const tokenVaultPda = getTokenVaultPDA(projectPda, program.programId);\n const tokenMintPda = getTokenMintPDA(projectPda, program.programId);\n const vaultAuthorityPda = getVaultAuthorityPDA(projectPda, program.programId);\n const investorVaultPda = getInvestorVaultPDA(projectPda, program.programId);\n const founderVaultPda = getFounderVaultPDA(projectPda, program.programId);\n const lpTokenVaultPda = getLpTokenVaultPDA(projectPda, program.programId);\n const treasuryVaultPda = getTreasuryVaultPDA(projectPda, program.programId);\n const lpUsdcVaultPda = getLpUsdcVaultPDA(projectPda, program.programId);\n\n return getMethods(program)\n .approveProject()\n .accounts({\n project: projectPda,\n tokenomics: tokenomicsPda,\n tokenVault: tokenVaultPda,\n tokenMint: tokenMintPda,\n vaultAuthority: vaultAuthorityPda,\n investorVault: investorVaultPda,\n founderVault: founderVaultPda,\n lpTokenVault: lpTokenVaultPda,\n treasuryVault: treasuryVaultPda,\n lpUsdcVault: lpUsdcVaultPda,\n usdcMint: args.usdcMint,\n authority: adminKeypair.publicKey,\n payer: adminKeypair.publicKey,\n })\n .signers([adminKeypair])\n .rpc();\n}\n\n// =============================================================================\n// Milestone Instructions\n// =============================================================================\n\n/**\n * Create a milestone for a project\n */\nexport async function createMilestone(\n program: AnyProgram,\n args: {\n projectId: BN;\n milestoneIndex: number;\n percentage: number;\n description: string;\n },\n founder: PublicKey\n): Promise<string> {\n const projectPda = getProjectPDA(args.projectId, program.programId);\n const milestonePda = getMilestonePDA(projectPda, args.milestoneIndex, program.programId);\n\n return getMethods(program)\n .createMilestone({\n milestoneIndex: args.milestoneIndex,\n percentage: args.percentage,\n description: args.description,\n })\n .accounts({\n project: projectPda,\n milestone: milestonePda,\n founder,\n })\n .rpc();\n}\n\n/**\n * Submit milestone for review\n */\nexport async function submitMilestone(\n program: AnyProgram,\n projectId: BN,\n milestoneIndex: number,\n founder: PublicKey\n): Promise<string> {\n const projectPda = getProjectPDA(projectId, program.programId);\n const milestonePda = getMilestonePDA(projectPda, milestoneIndex, program.programId);\n\n return getMethods(program)\n .submitMilestone()\n .accounts({\n project: projectPda,\n milestone: milestonePda,\n founder,\n })\n .rpc();\n}\n\n/**\n * Vote on a milestone\n *\n * Automatically fetches the milestone to get the current voting_round\n * for proper vote PDA derivation. This supports re-voting after milestone failure.\n */\nexport async function voteOnMilestone(\n program: AnyProgram,\n args: {\n projectId: BN;\n milestoneIndex: number;\n nftMint: PublicKey | string;\n choice: { good: object } | { bad: object };\n },\n voter: PublicKey\n): Promise<string> {\n // Ensure nftMint is a proper PublicKey (handles React state serialization)\n const nftMintPubkey = ensurePublicKey(args.nftMint);\n\n const projectPda = getProjectPDA(args.projectId, program.programId);\n const milestonePda = getMilestonePDA(projectPda, args.milestoneIndex, program.programId);\n const investmentPda = getInvestmentPDA(projectPda, nftMintPubkey, program.programId);\n\n // Fetch milestone to get current voting_round for vote PDA derivation\n // This enables re-voting after milestone failure and resubmit\n const milestone = await getAccountNamespace(program).milestone.fetch(milestonePda);\n const votingRound = milestone.votingRound ?? 0;\n const votePda = getVotePDA(milestonePda, voter, votingRound, program.programId);\n\n // Get voter's NFT token account (ATA)\n const voterNftAccount = getAssociatedTokenAddressSync(\n nftMintPubkey,\n voter,\n false, // allowOwnerOffCurve\n TOKEN_PROGRAM_ID\n );\n\n return getMethods(program)\n .voteOnMilestone({ choice: args.choice })\n .accounts({\n milestone: milestonePda,\n project: projectPda,\n investment: investmentPda,\n vote: votePda,\n nftMint: nftMintPubkey,\n voterNftAccount,\n voter,\n })\n .rpc();\n}\n\n/**\n * Finalize voting on a milestone\n */\nexport async function finalizeVoting(\n program: AnyProgram,\n projectId: BN,\n milestoneIndex: number\n): Promise<string> {\n const projectPda = getProjectPDA(projectId, program.programId);\n const milestonePda = getMilestonePDA(projectPda, milestoneIndex, program.programId);\n\n return getMethods(program)\n .finalizeVoting()\n .accounts({\n project: projectPda,\n milestone: milestonePda,\n })\n .rpc();\n}\n\n/**\n * Claim milestone funds (for founders)\n *\n * ZTM v2.0: Transfers USDC from escrow to founder's account.\n * - Regular milestones: Full payout to founder (no LP deduction)\n * - Final milestone: LP USDC reserved for PCL, triggers MAE\n *\n * @param nextMilestoneDeadline - Deadline for next milestone (required for non-final milestones)\n * Must be >= current_time + MIN_DEADLINE_DURATION_SECONDS (7 days prod, 60s dev)\n * Must be <= current_time + MAX_DEADLINE_DURATION_SECONDS (1 year)\n * Set to BN(0) for final milestone claims (no next milestone exists)\n */\nexport async function claimMilestoneFunds(\n program: AnyProgram,\n args: {\n projectId: BN;\n milestoneIndex: number;\n founderUsdcAccount: PublicKey;\n escrowTokenAccount: PublicKey;\n /** Deadline for next milestone - required for non-final milestones, use BN(0) for final */\n nextMilestoneDeadline: BN;\n /** Next milestone PDA - required for non-final milestones */\n nextMilestonePda?: PublicKey;\n },\n founder: PublicKey\n): Promise<string> {\n const projectPda = getProjectPDA(args.projectId, program.programId);\n const milestonePda = getMilestonePDA(projectPda, args.milestoneIndex, program.programId);\n const escrowPda = getEscrowPDA(args.projectId, program.programId);\n const tokenVaultPda = getTokenVaultPDA(projectPda, program.programId);\n const tokenomicsPda = getTokenomicsPDA(projectPda, program.programId);\n const lpUsdcVaultPda = getLpUsdcVaultPDA(projectPda, program.programId);\n\n // For non-final milestones, derive next milestone PDA if not provided\n const nextMilestonePda = args.nextMilestonePda ??\n (args.nextMilestoneDeadline.gt(new BN(0))\n ? getMilestonePDA(projectPda, args.milestoneIndex + 1, program.programId)\n : null);\n\n return getMethods(program)\n .claimMilestoneFunds({ nextMilestoneDeadline: args.nextMilestoneDeadline })\n .accounts({\n milestone: milestonePda,\n project: projectPda,\n founder,\n projectEscrow: args.escrowTokenAccount,\n founderUsdcAccount: args.founderUsdcAccount,\n escrowPda,\n tokenVault: tokenVaultPda,\n tokenomics: tokenomicsPda,\n lpUsdcVault: lpUsdcVaultPda,\n nextMilestone: nextMilestonePda,\n systemProgram: SystemProgram.programId,\n tokenProgram: TOKEN_PROGRAM_ID,\n })\n .rpc();\n}\n\n/**\n * Resubmit a failed milestone for rework (Failed → InProgress)\n *\n * This allows founders to iterate on a failed milestone by transitioning it\n * back to InProgress state with cleared voting state for a fresh voting cycle.\n * The consecutive_failures counter is NOT reset (tracked at project level).\n * Unlimited rework attempts are allowed.\n */\nexport async function resubmitMilestone(\n program: AnyProgram,\n args: {\n projectId: BN;\n milestoneIndex: number;\n },\n founder: PublicKey\n): Promise<string> {\n const projectPda = getProjectPDA(args.projectId, program.programId);\n const milestonePda = getMilestonePDA(projectPda, args.milestoneIndex, program.programId);\n\n return getMethods(program)\n .resubmitMilestone()\n .accounts({\n project: projectPda,\n milestone: milestonePda,\n founder,\n })\n .rpc();\n}\n\n/**\n * Set milestone deadline for founder to commit submission date\n *\n * Founders must set deadlines for milestones to provide visibility to investors.\n * Deadline must be at least 7 days from now and at most 1 year from now.\n * Can only be set on Proposed, Approved, or InProgress milestones.\n */\nexport async function setMilestoneDeadline(\n program: AnyProgram,\n args: {\n projectId: BN;\n milestoneIndex: number;\n /** Unix timestamp for the deadline */\n deadline: BN;\n },\n founder: PublicKey\n): Promise<string> {\n const projectPda = getProjectPDA(args.projectId, program.programId);\n const milestonePda = getMilestonePDA(projectPda, args.milestoneIndex, program.programId);\n\n return getMethods(program)\n .setMilestoneDeadline({\n milestoneIndex: args.milestoneIndex,\n deadline: args.deadline,\n })\n .accounts({\n project: projectPda,\n milestone: milestonePda,\n founder,\n })\n .rpc();\n}\n\n/**\n * Extend milestone deadline (max 3 extensions per milestone)\n *\n * Founders can extend a deadline up to 3 times before it passes.\n * Must be called BEFORE the current deadline passes.\n * New deadline must be later than current deadline.\n */\nexport async function extendMilestoneDeadline(\n program: AnyProgram,\n args: {\n projectId: BN;\n milestoneIndex: number;\n /** New deadline timestamp (must be > current deadline) */\n newDeadline: BN;\n },\n founder: PublicKey\n): Promise<string> {\n const projectPda = getProjectPDA(args.projectId, program.programId);\n const milestonePda = getMilestonePDA(projectPda, args.milestoneIndex, program.programId);\n\n return getMethods(program)\n .extendMilestoneDeadline({\n milestoneIndex: args.milestoneIndex,\n newDeadline: args.newDeadline,\n })\n .accounts({\n project: projectPda,\n milestone: milestonePda,\n founder,\n })\n .rpc();\n}\n\n// =============================================================================\n// Investment Instructions\n// =============================================================================\n\n/**\n * Derive Metaplex metadata PDA\n */\nfunction getMetadataPDA(mint: PublicKey): PublicKey {\n const [pda] = PublicKey.findProgramAddressSync(\n [\n Buffer.from('metadata'),\n TOKEN_METADATA_PROGRAM_ID.toBuffer(),\n mint.toBuffer(),\n ],\n TOKEN_METADATA_PROGRAM_ID\n );\n return pda;\n}\n\n/**\n * Derive Metaplex master edition PDA\n */\nfunction getMasterEditionPDA(mint: PublicKey): PublicKey {\n const [pda] = PublicKey.findProgramAddressSync(\n [\n Buffer.from('metadata'),\n TOKEN_METADATA_PROGRAM_ID.toBuffer(),\n mint.toBuffer(),\n Buffer.from('edition'),\n ],\n TOKEN_METADATA_PROGRAM_ID\n );\n return pda;\n}\n\n/**\n * Invest in a project\n *\n * This creates an investment NFT and transfers USDC to the project escrow.\n * The investmentCount should be fetched from the project account before calling.\n */\nexport async function invest(\n program: AnyProgram,\n args: {\n projectId: BN;\n amount: BN;\n investorTokenAccount: PublicKey;\n escrowTokenAccount: PublicKey;\n investmentCount: number; // Must be fetched from project.investmentCount\n },\n investor: PublicKey\n): Promise<string> {\n const projectPda = getProjectPDA(args.projectId, program.programId);\n\n // Derive NFT mint PDA using seeds: [NFT_MINT_SEED, project_id, investor, investment_count]\n const [nftMint] = getNftMintPDA(args.projectId, investor, args.investmentCount, program.programId);\n\n // Derive investment PDA using seeds: [INVESTMENT_SEED, project, nft_mint]\n const investmentPda = getInvestmentPDA(projectPda, nftMint, program.programId);\n\n // Derive investor's NFT token account (ATA)\n const investorNftAccount = getAssociatedTokenAddressSync(nftMint, investor);\n\n // Derive Metaplex metadata and master edition PDAs\n const metadataAccount = getMetadataPDA(nftMint);\n const masterEdition = getMasterEditionPDA(nftMint);\n\n // Derive program authority PDA\n const [programAuthority] = getProgramAuthorityPDA(program.programId);\n\n // BUG-1 FIX: Derive first milestone PDA (index 0) for state transition when funded\n const firstMilestonePda = getMilestonePDA(projectPda, 0, program.programId);\n\n // Add compute budget instruction to handle heavy NFT+metadata operations\n // Metaplex NFT minting requires significantly more than the default 200k CU\n return getMethods(program)\n .invest({ amount: args.amount })\n .accounts({\n project: projectPda,\n firstMilestone: firstMilestonePda,\n nftMint: nftMint,\n investment: investmentPda,\n investorNftAccount: investorNftAccount,\n metadataAccount: metadataAccount,\n masterEdition: masterEdition,\n escrowTokenAccount: args.escrowTokenAccount,\n investorTokenAccount: args.investorTokenAccount,\n programAuthority: programAuthority,\n investor,\n tokenProgram: TOKEN_PROGRAM_ID,\n associatedTokenProgram: ASSOCIATED_TOKEN_PROGRAM_ID,\n systemProgram: SystemProgram.programId,\n rent: SYSVAR_RENT_PUBKEY,\n tokenMetadataProgram: TOKEN_METADATA_PROGRAM_ID,\n sysvarInstructions: SYSVAR_INSTRUCTIONS_PUBKEY,\n })\n .preInstructions([\n ComputeBudgetProgram.setComputeUnitLimit({ units: 400_000 }),\n ])\n .rpc();\n}\n\n/**\n * Cancel investment within 24-hour cooling-off period\n */\nexport async function cancelInvestment(\n program: AnyProgram,\n args: {\n projectId: BN;\n nftMint: PublicKey;\n investorNftAccount: PublicKey;\n investorUsdcAccount: PublicKey;\n escrowTokenAccount: PublicKey;\n },\n investor: PublicKey\n): Promise<string> {\n const nftMintPubkey = ensurePublicKey(args.nftMint);\n const projectPda = getProjectPDA(args.projectId, program.programId);\n const investmentPda = getInvestmentPDA(projectPda, nftMintPubkey, program.programId);\n const escrowPda = getEscrowPDA(args.projectId, program.programId);\n\n return getMethods(program)\n .cancelInvestment()\n .accounts({\n investor,\n project: projectPda,\n investment: investmentPda,\n nftMint: nftMintPubkey,\n investorNftAccount: args.investorNftAccount,\n projectEscrow: args.escrowTokenAccount,\n investorUsdcAccount: args.investorUsdcAccount,\n escrowPda,\n })\n .rpc();\n}\n\n// =============================================================================\n// Pivot Instructions\n// =============================================================================\n\n/**\n * Propose a pivot\n */\nexport async function proposePivot(\n program: AnyProgram,\n args: {\n projectId: BN;\n newMetadataUri: string;\n newMilestones: Array<{ percentage: number; description: string }>;\n },\n founder: PublicKey\n): Promise<string> {\n const projectPda = getProjectPDA(args.projectId, program.programId);\n\n // Fetch project to get current pivot_count\n const projectAccount = await getAccountNamespace(program).project.fetch(projectPda);\n const pivotCount = projectAccount.pivotCount || 0;\n\n // Derive pivot proposal PDA using pivot_count\n const pivotProposalPda = getPivotProposalPDA(projectPda, pivotCount, program.programId);\n\n return getMethods(program)\n .proposePivot({\n newMetadataUri: args.newMetadataUri,\n newMilestones: args.newMilestones,\n })\n .accounts({\n project: projectPda,\n founder,\n pivotProposal: pivotProposalPda,\n systemProgram: SystemProgram.programId,\n clock: SYSVAR_CLOCK_PUBKEY,\n })\n .rpc();\n}\n\n/**\n * Approve pivot proposal (admin only)\n */\nexport async function approvePivot(\n program: AnyProgram,\n projectId: BN,\n adminKeypair: Keypair\n): Promise<string> {\n const projectPda = getProjectPDA(projectId, program.programId);\n\n // Fetch project to get the active pivot proposal\n // The active_pivot field contains the actual pivot proposal pubkey\n const projectAccount = await getAccountNamespace(program).project.fetch(projectPda);\n\n // Use the active_pivot directly if available, otherwise derive from pivot_count\n let pivotProposalPda: PublicKey;\n if (projectAccount.activePivot) {\n pivotProposalPda = projectAccount.activePivot;\n } else {\n // Fallback to deriving from pivot_count (pivot_count is NOT incremented until finalize)\n const pivotCount = projectAccount.pivotCount || 0;\n pivotProposalPda = getPivotProposalPDA(projectPda, pivotCount, program.programId);\n }\n\n return getMethods(program)\n .approvePivot()\n .accounts({\n moderator: adminKeypair.publicKey,\n project: projectPda,\n pivotProposal: pivotProposalPda,\n })\n .signers([adminKeypair])\n .rpc();\n}\n\n/**\n * Withdraw from pivot during 7-day window\n */\nexport async function withdrawFromPivot(\n program: AnyProgram,\n args: {\n projectId: BN;\n pivotCount: number; // Current pivot_count from project\n nftMint: PublicKey;\n investorTokenAccount: PublicKey;\n escrowTokenAccount: PublicKey;\n milestoneAccounts: PublicKey[]; // All milestone PDAs for calculating unreleased funds\n },\n investor: PublicKey\n): Promise<string> {\n const nftMintPubkey = ensurePublicKey(args.nftMint);\n const projectPda = getProjectPDA(args.projectId, program.programId);\n const investmentPda = getInvestmentPDA(projectPda, nftMintPubkey, program.programId);\n const escrowPda = getEscrowPDA(args.projectId, program.programId);\n // Active pivot is at pivotCount (incremented only AFTER finalization)\n const pivotProposalPda = getPivotProposalPDA(projectPda, args.pivotCount, program.programId);\n // Get investor's NFT token account (ATA)\n const investorNftAccount = getAssociatedTokenAddressSync(\n nftMintPubkey,\n investor,\n false,\n TOKEN_PROGRAM_ID\n );\n\n // Pass milestone accounts as remaining accounts for unreleased funds calculation\n const remainingAccounts = args.milestoneAccounts.map((pubkey) => ({\n pubkey: ensurePublicKey(pubkey),\n isSigner: false,\n isWritable: false,\n }));\n\n return getMethods(program)\n .withdrawFromPivot()\n .accounts({\n investor,\n project: projectPda,\n pivotProposal: pivotProposalPda,\n investment: investmentPda,\n nftMint: nftMintPubkey,\n investorNftAccount,\n escrowTokenAccount: args.escrowTokenAccount,\n investorTokenAccount: args.investorTokenAccount,\n escrow: escrowPda,\n })\n .remainingAccounts(remainingAccounts)\n .rpc();\n}\n\n/**\n * Finalize pivot after 7-day window\n *\n * IMPORTANT: When old_milestone_count == new_milestone_count, the milestone PDAs are\n * the same and get reinitialized in-place. In this case, only pass the milestone\n * accounts once (not twice as old+new).\n */\nexport async function finalizePivot(\n program: AnyProgram,\n args: {\n projectId: BN;\n pivotCount: number; // Current pivot_count from project (active pivot is at pivotCount)\n milestoneAccounts: PublicKey[]; // All milestone PDAs (reused when old_count == new_count)\n },\n authority: PublicKey\n): Promise<string> {\n const projectPda = getProjectPDA(args.projectId, program.programId);\n // Active pivot is at pivotCount (incremented only AFTER finalization)\n const pivotProposalPda = getPivotProposalPDA(projectPda, args.pivotCount, program.programId);\n\n // Pass milestone accounts as remaining accounts\n // When old_count == new_count, these are reinitialized in-place\n const remainingAccounts = args.milestoneAccounts.map((pubkey) => ({\n pubkey,\n isSigner: false,\n isWritable: true,\n }));\n\n return getMethods(program)\n .finalizePivot()\n .accounts({\n authority,\n project: projectPda,\n pivotProposal: pivotProposalPda,\n })\n .remainingAccounts(remainingAccounts)\n .rpc();\n}\n\n// =============================================================================\n// TGE Instructions\n// =============================================================================\n\n/**\n * Set TGE date and token mint\n */\nexport async function setTgeDate(\n program: AnyProgram,\n args: {\n projectId: BN;\n tgeDate: BN;\n tokenMint: PublicKey;\n },\n founder: PublicKey\n): Promise<string> {\n const projectPda = getProjectPDA(args.projectId, program.programId);\n\n return getMethods(program)\n .setTgeDate({\n tgeDate: args.tgeDate,\n tokenMint: args.tokenMint,\n })\n .accounts({\n project: projectPda,\n founder,\n })\n .rpc();\n}\n\n/**\n * Deposit tokens for investor distribution\n */\nexport async function depositTokens(\n program: AnyProgram,\n args: {\n projectId: BN;\n amount: BN;\n tokenMint: PublicKey;\n founderTokenAccount: PublicKey;\n },\n founder: PublicKey\n): Promise<string> {\n const projectPda = getProjectPDA(args.projectId, program.programId);\n\n return getMethods(program)\n .depositTokens({ amount: args.amount })\n .accounts({\n project: projectPda,\n tokenMint: args.tokenMint,\n founderTokenAccount: args.founderTokenAccount,\n founder,\n })\n .rpc();\n}\n\n/**\n * Claim project tokens using Investment NFT\n */\nexport async function claimTokens(\n program: AnyProgram,\n args: {\n projectId: BN;\n nftMint: PublicKey;\n investorNftAccount: PublicKey;\n investorTokenAccount: PublicKey;\n projectTokenVault: PublicKey;\n },\n investor: PublicKey\n): Promise<string> {\n const projectPda = getProjectPDA(args.projectId, program.programId);\n const investmentPda = getInvestmentPDA(projectPda, args.nftMint, program.programId);\n const tokenVaultPda = getTokenVaultPDA(projectPda, program.programId);\n\n return getMethods(program)\n .claimTokens()\n .accounts({\n investor,\n project: projectPda,\n investment: investmentPda,\n investorNftAccount: args.investorNftAccount,\n projectTokenVault: args.projectTokenVault,\n investorTokenAccount: args.investorTokenAccount,\n tokenVaultPda,\n tokenProgram: TOKEN_PROGRAM_ID,\n })\n .rpc();\n}\n\n/**\n * Report scam during 30-day post-TGE window\n */\nexport async function reportScam(\n program: AnyProgram,\n args: {\n projectId: BN;\n nftMint: PublicKey;\n },\n reporter: PublicKey\n): Promise<string> {\n const projectPda = getProjectPDA(args.projectId, program.programId);\n const tgeEscrowPda = getTgeEscrowPDA(projectPda, program.programId);\n const investmentPda = getInvestmentPDA(projectPda, args.nftMint, program.programId);\n\n return getMethods(program)\n .reportScam()\n .accounts({\n tgeEscrow: tgeEscrowPda,\n project: projectPda,\n investment: investmentPda,\n nftMint: args.nftMint,\n reporter,\n })\n .rpc();\n}\n\n/**\n * Release 10% holdback to founder after 30 days\n */\nexport async function releaseHoldback(\n program: AnyProgram,\n args: {\n projectId: BN;\n founderTokenAccount: PublicKey;\n }\n): Promise<string> {\n const projectPda = getProjectPDA(args.projectId, program.programId);\n const tgeEscrowPda = getTgeEscrowPDA(projectPda, program.programId);\n\n return getMethods(program)\n .releaseHoldback()\n .accounts({\n tgeEscrow: tgeEscrowPda,\n project: projectPda,\n founderTokenAccount: args.founderTokenAccount,\n })\n .rpc();\n}\n\n// =============================================================================\n// Abandonment Instructions\n// =============================================================================\n\n/**\n * Check for abandonment (90 days inactivity)\n */\nexport async function checkAbandonment(\n program: AnyProgram,\n projectId: BN,\n milestoneIndex: number = 0\n): Promise<string> {\n const projectPda = getProjectPDA(projectId, program.programId);\n const milestonePda = getMilestonePDA(projectPda, milestoneIndex, program.programId);\n\n return getMethods(program)\n .checkAbandonment()\n .accounts({\n project: projectPda,\n milestone: milestonePda,\n })\n .rpc();\n}\n\n/**\n * Claim refund after abandonment\n *\n * @param milestoneCount - Number of milestones in the project (used to derive milestone PDAs for remainingAccounts)\n * The program calculates unreleased funds by iterating through milestone accounts.\n */\nexport async function claimRefund(\n program: AnyProgram,\n args: {\n projectId: BN;\n nftMint: PublicKey;\n investorNftAccount: PublicKey;\n investorUsdcAccount: PublicKey;\n escrowTokenAccount: PublicKey;\n milestoneCount?: number; // If not provided, defaults to 1\n },\n investor: PublicKey\n): Promise<string> {\n const nftMintPubkey = ensurePublicKey(args.nftMint);\n const projectPda = getProjectPDA(args.projectId, program.programId);\n const investmentPda = getInvestmentPDA(projectPda, nftMintPubkey, program.programId);\n\n // Derive milestone PDAs and pass as remainingAccounts\n // The program iterates through these to calculate unreleased funds\n const milestoneCount = args.milestoneCount ?? 1;\n const remainingAccounts = [];\n for (let i = 0; i < milestoneCount; i++) {\n const milestonePda = getMilestonePDA(projectPda, i, program.programId);\n remainingAccounts.push({\n pubkey: milestonePda,\n isWritable: false,\n isSigner: false,\n });\n }\n\n return getMethods(program)\n .claimRefund()\n .accounts({\n project: projectPda,\n investment: investmentPda,\n nftMint: nftMintPubkey,\n investorNftAccount: args.investorNftAccount,\n investor,\n investorTokenAccount: args.investorUsdcAccount,\n escrowTokenAccount: args.escrowTokenAccount,\n })\n .remainingAccounts(remainingAccounts)\n .rpc();\n}\n\n// =============================================================================\n// ZTM v2.0 Token Distribution Instructions\n// =============================================================================\n\n/**\n * Claim investor tokens from a passed milestone (whitepaper: manual claim model)\n *\n * ZTM v2.0: Per whitepaper, investors manually claim their tokens after a milestone passes.\n * This replaces the batch distribution model with investor-initiated per-NFT claims.\n *\n * @param milestoneIndex - The milestone index to claim tokens from\n * @param nftMint - The NFT mint that proves investment ownership\n * @param investorTokenAccount - Investor's token account to receive claimed tokens\n */\nexport async function claimInvestorTokens(\n program: AnyProgram,\n args: {\n projectId: BN;\n /** Milestone index to claim tokens from */\n milestoneIndex: number;\n /** NFT mint that proves investment ownership */\n nftMint: PublicKey;\n /** Investor's token account to receive claimed tokens */\n investorTokenAccount: PublicKey;\n },\n investor: PublicKey\n): Promise<string> {\n const nftMintPubkey = ensurePublicKey(args.nftMint);\n const projectPda = getProjectPDA(args.projectId, program.programId);\n const tokenVaultPda = getTokenVaultPDA(projectPda, program.programId);\n const investmentPda = getInvestmentPDA(projectPda, nftMintPubkey, program.programId);\n const investorVaultPda = getInvestorVaultPDA(projectPda, program.programId);\n const vaultAuthorityPda = getVaultAuthorityPDA(projectPda, program.programId);\n\n // Get investor's NFT token account (ATA)\n const investorNftAccount = getAssociatedTokenAddressSync(\n nftMintPubkey,\n investor,\n false,\n TOKEN_PROGRAM_ID\n );\n\n return getMethods(program)\n .claimInvestorTokens({ milestoneIndex: args.milestoneIndex })\n .accounts({\n investor,\n project: projectPda,\n tokenVault: tokenVaultPda,\n investment: investmentPda,\n nftMint: nftMintPubkey,\n investorNftAccount,\n investorVault: investorVaultPda,\n investorTokenAccount: args.investorTokenAccount,\n vaultAuthority: vaultAuthorityPda,\n tokenProgram: TOKEN_PROGRAM_ID,\n })\n .rpc();\n}\n\n/**\n * Distribute tokens to NFT holders for a milestone\n *\n * ZTM v2.0: Called by cranker after finalize_voting sets distribution_pending = true.\n * Processes batch of investments, transferring unlocked tokens to NFT holders.\n *\n * @deprecated Use claimInvestorTokens instead (whitepaper manual claim model)\n *\n * @param investments - Array of { investmentPda, investorTokenAccount } pairs\n * Each pair represents an investor's investment and their token account to receive tokens.\n * Max batch size: 10 investments per call.\n */\nexport async function distributeTokens(\n program: AnyProgram,\n args: {\n projectId: BN;\n milestoneIndex: number;\n /** Investment and token account pairs to process */\n investments: Array<{\n investmentPda: PublicKey;\n investorTokenAccount: PublicKey;\n }>;\n },\n payer: PublicKey\n): Promise<string> {\n const projectPda = getProjectPDA(args.projectId, program.programId);\n const tokenVaultPda = getTokenVaultPDA(projectPda, program.programId);\n const investorVaultPda = getInvestorVaultPDA(projectPda, program.programId);\n const vaultAuthorityPda = getVaultAuthorityPDA(projectPda, program.programId);\n\n // Build remaining accounts: (Investment, TokenAccount) pairs\n const remainingAccounts = args.investments.flatMap((inv) => [\n { pubkey: inv.investmentPda, isSigner: false, isWritable: true },\n { pubkey: inv.investorTokenAccount, isSigner: false, isWritable: true },\n ]);\n\n return getMethods(program)\n .distributeTokens({ milestoneIndex: args.milestoneIndex })\n .accounts({\n project: projectPda,\n tokenVault: tokenVaultPda,\n investorVault: investorVaultPda,\n vaultAuthority: vaultAuthorityPda,\n payer,\n tokenProgram: TOKEN_PROGRAM_ID,\n })\n .remainingAccounts(remainingAccounts)\n .rpc();\n}\n\n/**\n * Complete token distribution for a milestone\n *\n * ZTM v2.0: Marks distribution as complete after all batches have been processed.\n * Permissionless - anyone can call this to finalize a distribution.\n */\nexport async function completeDistribution(\n program: AnyProgram,\n args: {\n projectId: BN;\n milestoneIndex: number;\n },\n payer: PublicKey\n): Promise<string> {\n const projectPda = getProjectPDA(args.projectId, program.programId);\n const tokenVaultPda = getTokenVaultPDA(projectPda, program.programId);\n\n return getMethods(program)\n .completeDistribution({ milestoneIndex: args.milestoneIndex })\n .accounts({\n project: projectPda,\n tokenVault: tokenVaultPda,\n payer,\n })\n .rpc();\n}\n\n// =============================================================================\n// Exit Window Instructions\n// =============================================================================\n\n/**\n * Claim exit window refund during 3-failure voluntary exit window\n * Per whitepaper: 3 consecutive failures trigger 7-day voluntary exit window\n * Investors can claim proportional share of unreleased USDC escrow funds\n */\nexport async function claimExitWindowRefund(\n program: AnyProgram,\n args: {\n projectId: BN;\n nftMint: PublicKey;\n investorNftAccount: PublicKey;\n escrowTokenAccount: PublicKey;\n investorTokenAccount: PublicKey;\n milestoneAccounts?: PublicKey[];\n },\n investor: PublicKey\n): Promise<string> {\n const projectPda = getProjectPDA(args.projectId, program.programId);\n const investmentPda = getInvestmentPDA(projectPda, args.nftMint, program.programId);\n const escrowPda = getEscrowPDA(args.projectId, program.programId);\n\n const remainingAccounts = (args.milestoneAccounts || []).map((pubkey) => ({\n pubkey,\n isSigner: false,\n isWritable: false,\n }));\n\n return getMethods(program)\n .claimExitWindowRefund()\n .accountsPartial({\n project: projectPda,\n investment: investmentPda,\n nftMint: args.nftMint,\n investorNftAccount: args.investorNftAccount,\n escrowTokenAccount: args.escrowTokenAccount,\n investorTokenAccount: args.investorTokenAccount,\n escrowPda,\n investor,\n })\n .remainingAccounts(remainingAccounts)\n .rpc();\n}\n\n// =============================================================================\n// ZTM v2.0 Founder Vesting Instructions\n// =============================================================================\n\n/**\n * Initialize founder vesting after MAE (Market Access Event)\n *\n * ZTM v2.0: Creates FounderVesting PDA with vesting schedule from Tokenomics.\n * Must be called after project reaches Completed state (all milestones done).\n * Permissionless - anyone can pay to initialize.\n */\nexport async function initializeFounderVesting(\n program: AnyProgram,\n args: {\n projectId: BN;\n },\n payer: PublicKey\n): Promise<string> {\n const projectPda = getProjectPDA(args.projectId, program.programId);\n const tokenomicsPda = getTokenomicsPDA(projectPda, program.programId);\n const tokenVaultPda = getTokenVaultPDA(projectPda, program.programId);\n const founderVestingPda = getFounderVestingPDA(projectPda, program.programId);\n\n return getMethods(program)\n .initializeFounderVesting()\n .accounts({\n project: projectPda,\n tokenomics: tokenomicsPda,\n tokenVault: tokenVaultPda,\n founderVesting: founderVestingPda,\n payer,\n systemProgram: SystemProgram.programId,\n })\n .rpc();\n}\n\n/**\n * Claim vested tokens from founder vault\n *\n * ZTM v2.0: Founder claims tokens based on linear vesting schedule.\n * Requires cliff period to pass before any tokens can be claimed.\n */\nexport async function claimVestedTokens(\n program: AnyProgram,\n args: {\n projectId: BN;\n /** Founder's token account to receive vested tokens */\n founderTokenAccount: PublicKey;\n },\n founder: PublicKey\n): Promise<string> {\n const projectPda = getProjectPDA(args.projectId, program.programId);\n const tokenVaultPda = getTokenVaultPDA(projectPda, program.programId);\n const founderVestingPda = getFounderVestingPDA(projectPda, program.programId);\n const founderVaultPda = getFounderVaultPDA(projectPda, program.programId);\n const vaultAuthorityPda = getVaultAuthorityPDA(projectPda, program.programId);\n\n return getMethods(program)\n .claimVestedTokens()\n .accounts({\n project: projectPda,\n tokenVault: tokenVaultPda,\n founderVesting: founderVestingPda,\n founderVault: founderVaultPda,\n vaultAuthority: vaultAuthorityPda,\n founderTokenAccount: args.founderTokenAccount,\n founder,\n tokenProgram: TOKEN_PROGRAM_ID,\n })\n .rpc();\n}\n\n// =============================================================================\n// ZTM v2.0 Circuit Breaker Instructions\n// =============================================================================\n\n/**\n * Force complete a stuck distribution (admin only)\n *\n * ZTM v2.0: Circuit breaker for when token distribution is stuck for >7 days.\n * Marks distribution as complete so project can continue.\n * Affected investors can use claimMissedUnlock to get their tokens.\n */\nexport async function forceCompleteDistribution(\n program: AnyProgram,\n args: {\n projectId: BN;\n },\n adminKeypair: Keypair\n): Promise<string> {\n const projectPda = getProjectPDA(args.projectId, program.programId);\n const tokenVaultPda = getTokenVaultPDA(projectPda, program.programId);\n const adminConfigPda = getAdminConfigPDA(program.programId);\n\n return getMethods(program)\n .forceCompleteDistribution()\n .accounts({\n admin: adminKeypair.publicKey,\n adminConfig: adminConfigPda,\n project: projectPda,\n tokenVault: tokenVaultPda,\n })\n .signers([adminKeypair])\n .rpc();\n}\n\n/**\n * Claim missed token unlock after force-complete distribution\n *\n * ZTM v2.0: Allows investors to claim tokens they missed during a stuck\n * distribution that was force-completed by admin.\n */\nexport async function claimMissedUnlock(\n program: AnyProgram,\n args: {\n projectId: BN;\n nftMint: PublicKey;\n /** Milestone index to claim for */\n milestoneIndex: number;\n /** Claimer's token account to receive tokens */\n claimerTokenAccount: PublicKey;\n },\n claimer: PublicKey\n): Promise<string> {\n const nftMintPubkey = ensurePublicKey(args.nftMint);\n const projectPda = getProjectPDA(args.projectId, program.programId);\n const tokenVaultPda = getTokenVaultPDA(projectPda, program.programId);\n const investmentPda = getInvestmentPDA(projectPda, nftMintPubkey, program.programId);\n const investorVaultPda = getInvestorVaultPDA(projectPda, program.programId);\n const vaultAuthorityPda = getVaultAuthorityPDA(projectPda, program.programId);\n\n // Get claimer's NFT token account (ATA)\n const claimerNftAccount = getAssociatedTokenAddressSync(\n nftMintPubkey,\n claimer,\n false,\n TOKEN_PROGRAM_ID\n );\n\n return getMethods(program)\n .claimMissedUnlock({ milestoneIndex: args.milestoneIndex })\n .accounts({\n claimer,\n project: projectPda,\n tokenVault: tokenVaultPda,\n investment: investmentPda,\n nftMint: nftMintPubkey,\n claimerNftAccount,\n investorVault: investorVaultPda,\n claimerTokenAccount: args.claimerTokenAccount,\n vaultAuthority: vaultAuthorityPda,\n tokenProgram: TOKEN_PROGRAM_ID,\n })\n .rpc();\n}\n","/**\n * Raise Client\n *\n * Main client class for interacting with the Raise program.\n * Provides a high-level API that wraps the instruction and account modules.\n */\n\nimport { Program, AnchorProvider, BN } from '@coral-xyz/anchor';\nimport { Connection, PublicKey, Keypair } from '@solana/web3.js';\n\n// Import all modules\nimport * as pdas from './pdas/index.js';\nimport * as accounts from './accounts/index.js';\nimport * as instructions from './instructions/index.js';\nimport type { TierConfig } from './types/index.js';\n\n/**\n * Wallet interface required by the client\n */\nexport interface Wallet {\n publicKey: PublicKey;\n signTransaction: <T>(tx: T) => Promise<T>;\n signAllTransactions: <T>(txs: T[]) => Promise<T[]>;\n}\n\n/**\n * Main client for interacting with the Raise program\n *\n * @example\n * ```typescript\n * import { RaiseClient } from '@raise/sdk';\n *\n * const client = RaiseClient.load(connection, wallet);\n *\n * // Create a project\n * const tx = await client.initializeProject({\n * projectId: new BN(1),\n * fundingGoal: new BN(100000000000), // 100,000 USDC\n * metadataUri: 'https://example.com/project.json',\n * });\n *\n * // Fetch project data\n * const project = await client.fetchProject(new BN(1));\n * ```\n */\nexport class RaiseClient {\n /**\n * Create a new RaiseClient\n *\n * @param program - Anchor program instance\n * @param provider - Anchor provider\n */\n constructor(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n public readonly program: Program<any>,\n public readonly provider: AnchorProvider\n ) {}\n\n /**\n * Load a new RaiseClient instance\n *\n * @param connection - Solana connection\n * @param wallet - Wallet instance\n * @param programId - Optional program ID override\n * @returns Initialized RaiseClient\n *\n * @example\n * ```typescript\n * const client = RaiseClient.load(connection, wallet);\n * ```\n */\n static load(\n _connection: Connection,\n _wallet: Wallet,\n _programId?: PublicKey\n ): RaiseClient {\n // Note: In production, you would import the IDL from a generated file\n // For now, we'll need the IDL to be provided or loaded separately\n // This is a placeholder that assumes IDL is available\n throw new Error(\n 'RaiseClient.load requires IDL. Use RaiseClient.fromProgram instead, ' +\n 'or ensure the IDL is bundled with your application.'\n );\n }\n\n /**\n * Create client from an existing program instance\n *\n * @param program - Anchor program instance\n * @returns Initialized RaiseClient\n *\n * @example\n * ```typescript\n * import idl from './idl/raise.json';\n *\n * const provider = new AnchorProvider(connection, wallet, {});\n * const program = new Program(idl, provider);\n * const client = RaiseClient.fromProgram(program);\n * ```\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n static fromProgram(program: Program<any>): RaiseClient {\n const provider = program.provider as AnchorProvider;\n return new RaiseClient(program, provider);\n }\n\n /**\n * Get the program ID\n */\n get programId(): PublicKey {\n return this.program.programId;\n }\n\n /**\n * Get the connected wallet public key\n */\n get walletPublicKey(): PublicKey {\n return this.provider.wallet.publicKey;\n }\n\n // ===========================================================================\n // PDA Helpers\n // ===========================================================================\n\n getProjectPDA(projectId: BN): PublicKey {\n return pdas.getProjectPDA(projectId, this.programId);\n }\n\n getEscrowPDA(projectId: BN): PublicKey {\n return pdas.getEscrowPDA(projectId, this.programId);\n }\n\n getMilestonePDA(projectPda: PublicKey, milestoneIndex: number): PublicKey {\n return pdas.getMilestonePDA(projectPda, milestoneIndex, this.programId);\n }\n\n getInvestmentPDA(projectPda: PublicKey, nftMint: PublicKey): PublicKey {\n return pdas.getInvestmentPDA(projectPda, nftMint, this.programId);\n }\n\n getVotePDA(milestonePda: PublicKey, voterKey: PublicKey, votingRound: number): PublicKey {\n return pdas.getVotePDA(milestonePda, voterKey, votingRound, this.programId);\n }\n\n getPivotProposalPDA(projectPda: PublicKey, pivotCount: number): PublicKey {\n return pdas.getPivotProposalPDA(projectPda, pivotCount, this.programId);\n }\n\n getTgeEscrowPDA(projectPda: PublicKey): PublicKey {\n return pdas.getTgeEscrowPDA(projectPda, this.programId);\n }\n\n getTgeEscrowVaultPDA(projectPda: PublicKey): PublicKey {\n return pdas.getTgeEscrowVaultPDA(projectPda, this.programId);\n }\n\n getAdminConfigPDA(): PublicKey {\n return pdas.getAdminConfigPDA(this.programId);\n }\n\n // ===========================================================================\n // Account Fetchers\n // ===========================================================================\n\n async fetchProject(projectId: BN) {\n return accounts.fetchProject(this.program, projectId);\n }\n\n async fetchMilestone(projectId: BN, milestoneIndex: number) {\n return accounts.fetchMilestone(this.program, projectId, milestoneIndex);\n }\n\n async fetchAllMilestones(projectId: BN) {\n return accounts.fetchAllMilestones(this.program, projectId);\n }\n\n async fetchInvestment(projectId: BN, nftMint: PublicKey) {\n return accounts.fetchInvestment(this.program, projectId, nftMint);\n }\n\n async fetchAllInvestments(projectId: BN) {\n return accounts.fetchAllInvestments(this.program, projectId);\n }\n\n async fetchVote(projectId: BN, milestoneIndex: number, voterKey: PublicKey, votingRound: number) {\n return accounts.fetchVote(this.program, projectId, milestoneIndex, voterKey, votingRound);\n }\n\n async fetchAllVotes(projectId: BN, milestoneIndex: number) {\n return accounts.fetchAllVotes(this.program, projectId, milestoneIndex);\n }\n\n async fetchPivotProposal(projectId: BN) {\n return accounts.fetchPivotProposal(this.program, projectId);\n }\n\n async fetchTgeEscrow(projectId: BN) {\n return accounts.fetchTgeEscrow(this.program, projectId);\n }\n\n async fetchAdminConfig() {\n return accounts.fetchAdminConfig(this.program);\n }\n\n // ===========================================================================\n // Admin Instructions\n // ===========================================================================\n\n async initializeAdmin(admin: PublicKey): Promise<string> {\n return instructions.initializeAdmin(\n this.program,\n admin,\n this.walletPublicKey\n );\n }\n\n async transferAdmin(newAdmin: PublicKey, adminKeypair: Keypair): Promise<string> {\n return instructions.transferAdmin(\n this.program,\n adminKeypair,\n newAdmin\n );\n }\n\n async acceptAdmin(): Promise<string> {\n return instructions.acceptAdmin(\n this.program,\n this.walletPublicKey\n );\n }\n\n // ===========================================================================\n // Project Instructions\n // ===========================================================================\n\n async initializeProject(args: {\n projectId: BN;\n fundingGoal: BN;\n metadataUri: string;\n tiers: TierConfig[];\n /** ZTM v2.0: Tokenomics configuration */\n tokenomics: instructions.TokenomicsInput;\n /** Milestone 1 deadline - Unix timestamp (required) */\n milestone1Deadline: BN;\n }): Promise<string> {\n return instructions.initializeProject(\n this.program,\n args,\n this.walletPublicKey\n );\n }\n\n async submitForApproval(projectId: BN): Promise<string> {\n return instructions.submitForApproval(\n this.program,\n projectId,\n this.walletPublicKey\n );\n }\n\n async approveProject(\n args: { projectId: BN; usdcMint: PublicKey },\n adminKeypair: Keypair\n ): Promise<string> {\n return instructions.approveProject(\n this.program,\n args,\n adminKeypair\n );\n }\n\n // ===========================================================================\n // Milestone Instructions\n // ===========================================================================\n\n async createMilestone(args: {\n projectId: BN;\n milestoneIndex: number;\n percentage: number;\n description: string;\n }): Promise<string> {\n return instructions.createMilestone(\n this.program,\n args,\n this.walletPublicKey\n );\n }\n\n async submitMilestone(projectId: BN, milestoneIndex: number): Promise<string> {\n return instructions.submitMilestone(\n this.program,\n projectId,\n milestoneIndex,\n this.walletPublicKey\n );\n }\n\n async voteOnMilestone(args: {\n projectId: BN;\n milestoneIndex: number;\n nftMint: PublicKey | string;\n choice: { good: object } | { bad: object };\n }): Promise<string> {\n return instructions.voteOnMilestone(\n this.program,\n args,\n this.walletPublicKey\n );\n }\n\n async finalizeVoting(projectId: BN, milestoneIndex: number): Promise<string> {\n return instructions.finalizeVoting(\n this.program,\n projectId,\n milestoneIndex\n );\n }\n\n /**\n * Claim milestone funds (ZTM v2.0)\n * - Regular milestones: Full payout to founder\n * - Final milestone: LP USDC reserved for PCL, triggers MAE\n *\n * @param nextMilestoneDeadline - Deadline for next milestone (required for non-final milestones)\n * Set to BN(0) for final milestone claims (no next milestone exists)\n */\n async claimMilestoneFunds(args: {\n projectId: BN;\n milestoneIndex: number;\n founderUsdcAccount: PublicKey;\n escrowTokenAccount: PublicKey;\n /** Deadline for next milestone - required for non-final milestones, use BN(0) for final */\n nextMilestoneDeadline: BN;\n /** Next milestone PDA - optional, auto-derived if not provided */\n nextMilestonePda?: PublicKey;\n }): Promise<string> {\n return instructions.claimMilestoneFunds(\n this.program,\n args,\n this.walletPublicKey\n );\n }\n\n /**\n * Resubmit a failed milestone for rework (Failed → InProgress)\n *\n * Allows founders to iterate on failed milestones. Clears voting state\n * for a fresh voting cycle. consecutive_failures is NOT reset.\n */\n async resubmitMilestone(args: {\n projectId: BN;\n milestoneIndex: number;\n }): Promise<string> {\n return instructions.resubmitMilestone(\n this.program,\n args,\n this.walletPublicKey\n );\n }\n\n /**\n * Set milestone deadline for founder to commit submission date\n *\n * Founders must set deadlines for milestones to provide visibility to investors.\n * Deadline must be at least 7 days from now and at most 1 year from now.\n */\n async setMilestoneDeadline(args: {\n projectId: BN;\n milestoneIndex: number;\n /** Unix timestamp for the deadline */\n deadline: BN;\n }): Promise<string> {\n return instructions.setMilestoneDeadline(\n this.program,\n args,\n this.walletPublicKey\n );\n }\n\n /**\n * Extend milestone deadline (max 3 extensions per milestone)\n *\n * Founders can extend a deadline up to 3 times before it passes.\n * Must be called BEFORE the current deadline passes.\n */\n async extendMilestoneDeadline(args: {\n projectId: BN;\n milestoneIndex: number;\n /** New deadline timestamp (must be > current deadline) */\n newDeadline: BN;\n }): Promise<string> {\n return instructions.extendMilestoneDeadline(\n this.program,\n args,\n this.walletPublicKey\n );\n }\n\n // ===========================================================================\n // Investment Instructions\n // ===========================================================================\n\n async invest(args: {\n projectId: BN;\n amount: BN;\n investorTokenAccount: PublicKey;\n escrowTokenAccount: PublicKey;\n investmentCount: number; // Must be fetched from project.investmentCount\n }): Promise<string> {\n return instructions.invest(\n this.program,\n args,\n this.walletPublicKey\n );\n }\n\n async cancelInvestment(args: {\n projectId: BN;\n nftMint: PublicKey;\n investorNftAccount: PublicKey;\n investorUsdcAccount: PublicKey;\n escrowTokenAccount: PublicKey;\n }): Promise<string> {\n return instructions.cancelInvestment(\n this.program,\n args,\n this.walletPublicKey\n );\n }\n\n // ===========================================================================\n // Pivot Instructions\n // ===========================================================================\n\n async proposePivot(args: {\n projectId: BN;\n newMetadataUri: string;\n newMilestones: Array<{ percentage: number; description: string }>;\n }): Promise<string> {\n return instructions.proposePivot(\n this.program,\n args,\n this.walletPublicKey\n );\n }\n\n async approvePivot(projectId: BN, adminKeypair: Keypair): Promise<string> {\n return instructions.approvePivot(\n this.program,\n projectId,\n adminKeypair\n );\n }\n\n async withdrawFromPivot(args: {\n projectId: BN;\n pivotCount: number;\n nftMint: PublicKey;\n investorTokenAccount: PublicKey;\n escrowTokenAccount: PublicKey;\n milestoneAccounts: PublicKey[]; // All milestone PDAs for calculating unreleased funds\n }): Promise<string> {\n return instructions.withdrawFromPivot(\n this.program,\n args,\n this.walletPublicKey\n );\n }\n\n async finalizePivot(args: {\n projectId: BN;\n pivotCount: number;\n milestoneAccounts: PublicKey[]; // All milestone PDAs (reused when old_count == new_count)\n }): Promise<string> {\n return instructions.finalizePivot(\n this.program,\n args,\n this.walletPublicKey\n );\n }\n\n // ===========================================================================\n // TGE Instructions\n // ===========================================================================\n\n async setTgeDate(args: {\n projectId: BN;\n tgeDate: BN;\n tokenMint: PublicKey;\n }): Promise<string> {\n return instructions.setTgeDate(\n this.program,\n args,\n this.walletPublicKey\n );\n }\n\n async depositTokens(args: {\n projectId: BN;\n amount: BN;\n tokenMint: PublicKey;\n founderTokenAccount: PublicKey;\n }): Promise<string> {\n return instructions.depositTokens(\n this.program,\n args,\n this.walletPublicKey\n );\n }\n\n async claimTokens(args: {\n projectId: BN;\n nftMint: PublicKey;\n investorNftAccount: PublicKey;\n investorTokenAccount: PublicKey;\n projectTokenVault: PublicKey;\n }): Promise<string> {\n return instructions.claimTokens(\n this.program,\n args,\n this.walletPublicKey\n );\n }\n\n async reportScam(args: {\n projectId: BN;\n nftMint: PublicKey;\n }): Promise<string> {\n return instructions.reportScam(\n this.program,\n args,\n this.walletPublicKey\n );\n }\n\n async releaseHoldback(args: {\n projectId: BN;\n founderTokenAccount: PublicKey;\n }): Promise<string> {\n return instructions.releaseHoldback(\n this.program,\n args\n );\n }\n\n // ===========================================================================\n // ZTM v2.0 Token Distribution Instructions\n // ===========================================================================\n\n /**\n * Claim investor tokens from a passed milestone (whitepaper: manual claim model)\n *\n * ZTM v2.0: Per whitepaper, investors manually claim their tokens after a milestone passes.\n * This replaces the batch distribution model with investor-initiated per-NFT claims.\n */\n async claimInvestorTokens(args: {\n projectId: BN;\n milestoneIndex: number;\n nftMint: PublicKey;\n investorTokenAccount: PublicKey;\n }): Promise<string> {\n return instructions.claimInvestorTokens(\n this.program,\n args,\n this.walletPublicKey\n );\n }\n\n /**\n * Distribute tokens to NFT holders for a milestone\n *\n * ZTM v2.0: Called by cranker after finalize_voting sets distribution_pending = true.\n * Processes batch of investments, transferring unlocked tokens to NFT holders.\n * Max batch size: 10 investments per call.\n *\n * @deprecated Use claimInvestorTokens instead (whitepaper manual claim model)\n */\n async distributeTokens(args: {\n projectId: BN;\n milestoneIndex: number;\n investments: Array<{\n investmentPda: PublicKey;\n investorTokenAccount: PublicKey;\n }>;\n }): Promise<string> {\n return instructions.distributeTokens(\n this.program,\n args,\n this.walletPublicKey\n );\n }\n\n /**\n * Complete token distribution for a milestone\n *\n * ZTM v2.0: Marks distribution as complete after all batches have been processed.\n * Permissionless - anyone can call this to finalize a distribution.\n */\n async completeDistribution(args: {\n projectId: BN;\n milestoneIndex: number;\n }): Promise<string> {\n return instructions.completeDistribution(\n this.program,\n args,\n this.walletPublicKey\n );\n }\n\n // ===========================================================================\n // ZTM v2.0: Founder Vesting Instructions\n // ===========================================================================\n\n /**\n * Initialize founder vesting after MAE (Market Access Event)\n *\n * ZTM v2.0: Creates FounderVesting PDA with vesting schedule from Tokenomics.\n * Must be called after project reaches Completed state (all milestones done).\n * Permissionless - anyone can pay to initialize.\n */\n async initializeFounderVesting(args: {\n projectId: BN;\n }): Promise<string> {\n return instructions.initializeFounderVesting(\n this.program,\n args,\n this.walletPublicKey\n );\n }\n\n /**\n * Claim vested tokens from founder vault\n *\n * ZTM v2.0: Founder claims tokens based on linear vesting schedule.\n * Requires cliff period to pass before any tokens can be claimed.\n */\n async claimVestedTokens(args: {\n projectId: BN;\n founderTokenAccount: PublicKey;\n }): Promise<string> {\n return instructions.claimVestedTokens(\n this.program,\n args,\n this.walletPublicKey\n );\n }\n\n // ===========================================================================\n // ZTM v2.0: Circuit Breaker Instructions\n // ===========================================================================\n\n /**\n * Force complete a stuck distribution (admin only)\n *\n * ZTM v2.0: Circuit breaker for when token distribution is stuck for >7 days.\n * Marks distribution as complete so project can continue.\n * Affected investors can use claimMissedUnlock to get their tokens.\n */\n async forceCompleteDistribution(\n args: { projectId: BN },\n adminKeypair: Keypair\n ): Promise<string> {\n return instructions.forceCompleteDistribution(\n this.program,\n args,\n adminKeypair\n );\n }\n\n /**\n * Claim missed token unlock after force-complete distribution\n *\n * ZTM v2.0: Allows investors to claim tokens they missed during a stuck\n * distribution that was force-completed by admin.\n */\n async claimMissedUnlock(args: {\n projectId: BN;\n nftMint: PublicKey;\n milestoneIndex: number;\n claimerTokenAccount: PublicKey;\n }): Promise<string> {\n return instructions.claimMissedUnlock(\n this.program,\n args,\n this.walletPublicKey\n );\n }\n\n // ===========================================================================\n // Abandonment Instructions\n // ===========================================================================\n\n async checkAbandonment(projectId: BN, milestoneIndex: number = 0): Promise<string> {\n return instructions.checkAbandonment(\n this.program,\n projectId,\n milestoneIndex\n );\n }\n\n async claimRefund(args: {\n projectId: BN;\n nftMint: PublicKey;\n investorNftAccount: PublicKey;\n investorUsdcAccount: PublicKey;\n escrowTokenAccount: PublicKey;\n milestoneCount?: number;\n }): Promise<string> {\n return instructions.claimRefund(\n this.program,\n args,\n this.walletPublicKey\n );\n }\n}\n","/**\n * Raise Type Definitions\n *\n * Re-exports types from the IDL and provides additional utility types.\n */\n\nimport { PublicKey } from '@solana/web3.js';\nimport { BN } from '@coral-xyz/anchor';\n\n// =============================================================================\n// Project State Enums\n// =============================================================================\n\nexport enum ProjectState {\n Draft = 'draft',\n PendingApproval = 'pendingApproval',\n Open = 'open',\n Funded = 'funded',\n InProgress = 'inProgress',\n Completed = 'completed',\n Abandoned = 'abandoned',\n Failed = 'failed',\n TGEFailed = 'tgeFailed',\n Cancelled = 'cancelled',\n}\n\nexport enum MilestoneState {\n Proposed = 'proposed',\n Approved = 'approved',\n InProgress = 'inProgress',\n UnderReview = 'underReview',\n Passed = 'passed',\n Failed = 'failed',\n Unlocked = 'unlocked',\n}\n\nexport enum VoteChoice {\n Good = 'good',\n Bad = 'bad',\n}\n\nexport enum PivotState {\n PendingModeratorApproval = 'pendingModeratorApproval',\n ApprovedAwaitingInvestorWindow = 'approvedAwaitingInvestorWindow',\n Finalized = 'finalized',\n}\n\n// =============================================================================\n// Account Types\n// =============================================================================\n\n/**\n * Tier configuration stored on-chain (includes filled_lots)\n */\nexport interface Tier {\n /** USDC amount per lot */\n amount: BN;\n /** Maximum lots available */\n maxLots: number;\n /** Currently filled lots */\n filledLots: number;\n /** Token allocation per $1 invested */\n tokenRatio: BN;\n /** Vote weight multiplier (basis points, 100 = 1.0x) */\n voteMultiplier: number;\n}\n\n/**\n * Tier configuration input for project initialization\n * Founders pass these when creating a project\n */\nexport interface TierConfig {\n /** USDC amount per lot (must be >= 10 USDC = 10_000_000 lamports) */\n amount: BN;\n /** Maximum lots available (must be >= 1) */\n maxLots: number;\n /** Token allocation per $1 invested (must be >= 1) */\n tokenRatio: BN;\n /** Vote weight multiplier (basis points, must be >= 100 = 1.0x) */\n voteMultiplier: number;\n}\n\nexport interface ProjectAccount {\n founder: PublicKey;\n projectId: BN;\n fundingGoal: BN;\n amountRaised: BN;\n state: ProjectState;\n metadataUri: string;\n escrow: PublicKey;\n currentMilestone: number;\n totalMilestones: number;\n /** Number of active tiers (1-10) */\n tierCount: number;\n /** All tier slots (only first tierCount are active) */\n tiers: Tier[];\n tokenMint: PublicKey | null;\n tgeDate: BN | null;\n tokensDeposited: BN;\n tokenAllocationBps: number;\n totalTokenAllocation: BN;\n consecutiveFailures: number;\n investorCount: number;\n bump: number;\n}\n\nexport interface MilestoneAccount {\n project: PublicKey;\n milestoneIndex: number;\n percentage: number;\n description: string;\n state: MilestoneState;\n yesVotes: BN;\n noVotes: BN;\n totalWeight: BN;\n voterCount: number;\n votingEndsAt: BN | null;\n bump: number;\n}\n\nexport interface InvestmentAccount {\n project: PublicKey;\n investor: PublicKey;\n nftMint: PublicKey;\n amount: BN;\n voteWeight: BN;\n tokenAllocation: BN;\n tier: number;\n investedAt: BN;\n tokensClaimed: boolean;\n withdrawnFromPivot: boolean;\n refundClaimed: boolean;\n bump: number;\n}\n\nexport interface VoteAccount {\n milestone: PublicKey;\n voter: PublicKey;\n choice: VoteChoice;\n weight: BN;\n votedAt: BN;\n bump: number;\n}\n\nexport interface AdminConfigAccount {\n admin: PublicKey;\n pendingAdmin: PublicKey | null;\n bump: number;\n}\n\nexport interface PivotProposalAccount {\n project: PublicKey;\n newMetadataUri: string;\n newMilestones: Array<{ percentage: number; description: string }>;\n state: PivotState;\n proposedAt: BN;\n approvedAt: BN | null;\n withdrawalWindowEndsAt: BN | null;\n withdrawnAmount: BN;\n withdrawnCount: number;\n bump: number;\n}\n\nexport interface TgeEscrowAccount {\n project: PublicKey;\n holdbackAmount: BN;\n scamReports: BN;\n scamWeight: BN;\n scamConfirmed: boolean;\n holdbackReleased: boolean;\n bump: number;\n}\n\n// =============================================================================\n// Instruction Arguments\n// =============================================================================\n\nexport interface InitializeProjectArgs {\n projectId: BN;\n fundingGoal: BN;\n metadataUri: string;\n /** Founder-configured tiers (1-10 tiers) */\n tiers: TierConfig[];\n}\n\nexport interface CreateMilestoneArgs {\n milestoneIndex: number;\n percentage: number;\n description: string;\n}\n\nexport interface InvestArgs {\n amount: BN;\n}\n\nexport interface VoteOnMilestoneArgs {\n choice: VoteChoice;\n}\n\nexport interface SetTgeDateArgs {\n tgeDate: BN;\n tokenMint: PublicKey;\n}\n\nexport interface DepositTokensArgs {\n amount: BN;\n}\n\nexport interface ProposePivotArgs {\n newMetadataUri: string;\n newMilestones: Array<{ percentage: number; description: string }>;\n}\n\n// =============================================================================\n// Event Types\n// =============================================================================\n\nexport interface ProjectCreatedEvent {\n projectId: BN;\n founder: PublicKey;\n fundingGoal: BN;\n metadataUri: string;\n}\n\nexport interface InvestmentMadeEvent {\n projectId: BN;\n investor: PublicKey;\n amount: BN;\n nftMint: PublicKey;\n tier: number;\n voteWeight: BN;\n}\n\nexport interface MilestoneVoteCastEvent {\n projectId: BN;\n milestoneIndex: number;\n voter: PublicKey;\n choice: VoteChoice;\n weight: BN;\n}\n\nexport interface MilestoneVoteFinalizedEvent {\n projectId: BN;\n milestoneIndex: number;\n passed: boolean;\n yesVotes: BN;\n noVotes: BN;\n}\n\n// =============================================================================\n// Utility Types\n// =============================================================================\n\nexport interface InvestmentWithKey {\n publicKey: PublicKey;\n account: InvestmentAccount;\n}\n\nexport interface MilestoneWithKey {\n publicKey: PublicKey;\n account: MilestoneAccount;\n}\n\nexport interface VoteWithKey {\n publicKey: PublicKey;\n account: VoteAccount;\n}\n","/**\n * Raise Error Handling\n *\n * Maps program error codes to SDK errors with helpful messages.\n */\n\nimport { AnchorError } from '@coral-xyz/anchor';\n\n// =============================================================================\n// Error Codes (matching Rust program)\n// =============================================================================\n\nexport const ERROR_CODES = {\n // State Transition Errors (6000-6099)\n InvalidStateTransition: 6000,\n ProjectNotInOpenState: 6001,\n ProjectNotInProgress: 6002,\n MilestoneNotUnderReview: 6003,\n VotingPeriodEnded: 6004,\n VotingPeriodNotEnded: 6005,\n MilestoneNotPassed: 6006,\n MilestoneAlreadyUnlocked: 6007,\n ProjectAlreadyFunded: 6008,\n ProjectNotFunded: 6009,\n\n // Authorization Errors (6100-6199)\n UnauthorizedFounder: 6100,\n UnauthorizedAdmin: 6101,\n NotInvestor: 6102,\n AlreadyVoted: 6103,\n\n // Investment Errors (6200-6299)\n InvestmentBelowMinimum: 6200,\n FundingGoalExceeded: 6201,\n InvalidTier: 6202,\n CoolingOffPeriodActive: 6203,\n CoolingOffPeriodExpired: 6204,\n\n // Milestone Errors (6300-6399)\n InvalidMilestoneIndex: 6300,\n MilestonePercentageInvalid: 6301,\n TotalPercentageExceeded: 6302,\n MilestoneNotInProgress: 6303,\n MilestoneNotApproved: 6304,\n\n // TGE Errors (6400-6499)\n TgeDateNotSet: 6400,\n TgeDateAlreadySet: 6401,\n TgeDateTooSoon: 6402,\n TgeDateTooLate: 6403,\n TgeNotReached: 6404,\n TokensAlreadyClaimed: 6405,\n InsufficientTokensDeposited: 6406,\n\n // Pivot Errors (6500-6599)\n PivotAlreadyProposed: 6500,\n NoPivotProposed: 6501,\n PivotNotApproved: 6502,\n PivotWindowNotEnded: 6503,\n PivotWindowEnded: 6504,\n AlreadyWithdrawnFromPivot: 6505,\n\n // Refund Errors (6800-6899)\n RefundAlreadyClaimed: 6800,\n RefundNotAvailable: 6801,\n ProjectNotAbandoned: 6802,\n\n // Scam Errors (6900-6999)\n ScamReportPeriodEnded: 6900,\n ScamAlreadyReported: 6901,\n ScamNotConfirmed: 6902,\n HoldbackAlreadyReleased: 6903,\n HoldbackPeriodNotEnded: 6904,\n} as const;\n\n// =============================================================================\n// Error Messages\n// =============================================================================\n\nexport const ERROR_MESSAGES: Record<number, string> = {\n // State Transition Errors\n [ERROR_CODES.InvalidStateTransition]: 'Invalid project state transition',\n [ERROR_CODES.ProjectNotInOpenState]: 'Project must be in Open state to accept investments',\n [ERROR_CODES.ProjectNotInProgress]: 'Project must be InProgress to perform this action',\n [ERROR_CODES.MilestoneNotUnderReview]: 'Milestone must be under review to vote',\n [ERROR_CODES.VotingPeriodEnded]: 'Voting period has ended',\n [ERROR_CODES.VotingPeriodNotEnded]: 'Voting period has not ended yet',\n [ERROR_CODES.MilestoneNotPassed]: 'Milestone did not pass voting',\n [ERROR_CODES.MilestoneAlreadyUnlocked]: 'Milestone funds already unlocked',\n [ERROR_CODES.ProjectAlreadyFunded]: 'Project has already reached funding goal',\n [ERROR_CODES.ProjectNotFunded]: 'Project has not reached funding goal',\n\n // Authorization Errors\n [ERROR_CODES.UnauthorizedFounder]: 'Only the project founder can perform this action',\n [ERROR_CODES.UnauthorizedAdmin]: 'Only the admin can perform this action',\n [ERROR_CODES.NotInvestor]: 'You must be an investor to perform this action',\n [ERROR_CODES.AlreadyVoted]: 'You have already voted on this',\n\n // Investment Errors\n [ERROR_CODES.InvestmentBelowMinimum]: 'Investment amount below minimum tier requirement',\n [ERROR_CODES.FundingGoalExceeded]: 'Investment would exceed funding goal',\n [ERROR_CODES.InvalidTier]: 'Invalid investment tier',\n [ERROR_CODES.CoolingOffPeriodActive]: 'Investment is within 24-hour cooling-off period',\n [ERROR_CODES.CoolingOffPeriodExpired]: 'Cooling-off period has expired, cannot cancel',\n\n // Milestone Errors\n [ERROR_CODES.InvalidMilestoneIndex]: 'Invalid milestone index',\n [ERROR_CODES.MilestonePercentageInvalid]: 'Milestone percentage must be between 1-100',\n [ERROR_CODES.TotalPercentageExceeded]: 'Total milestone percentages exceed 100%',\n [ERROR_CODES.MilestoneNotInProgress]: 'Milestone must be in progress',\n [ERROR_CODES.MilestoneNotApproved]: 'Milestone must be approved first',\n\n // TGE Errors\n [ERROR_CODES.TgeDateNotSet]: 'TGE date has not been set',\n [ERROR_CODES.TgeDateAlreadySet]: 'TGE date has already been set',\n [ERROR_CODES.TgeDateTooSoon]: 'TGE date must be at least 15 days in the future',\n [ERROR_CODES.TgeDateTooLate]: 'TGE date must be within 90 days',\n [ERROR_CODES.TgeNotReached]: 'TGE date has not been reached',\n [ERROR_CODES.TokensAlreadyClaimed]: 'Tokens have already been claimed',\n [ERROR_CODES.InsufficientTokensDeposited]: 'Insufficient tokens deposited by founder',\n\n // Pivot Errors\n [ERROR_CODES.PivotAlreadyProposed]: 'A pivot is already pending',\n [ERROR_CODES.NoPivotProposed]: 'No pivot has been proposed',\n [ERROR_CODES.PivotNotApproved]: 'Pivot has not been approved by admin',\n [ERROR_CODES.PivotWindowNotEnded]: '7-day withdrawal window has not ended',\n [ERROR_CODES.PivotWindowEnded]: '7-day withdrawal window has ended',\n [ERROR_CODES.AlreadyWithdrawnFromPivot]: 'Already withdrawn from this pivot',\n\n // Refund Errors\n [ERROR_CODES.RefundAlreadyClaimed]: 'Refund has already been claimed',\n [ERROR_CODES.RefundNotAvailable]: 'Refund is not available',\n [ERROR_CODES.ProjectNotAbandoned]: 'Project has not been abandoned',\n\n // Scam Errors\n [ERROR_CODES.ScamReportPeriodEnded]: '30-day scam report period has ended',\n [ERROR_CODES.ScamAlreadyReported]: 'Already reported this project for scam',\n [ERROR_CODES.ScamNotConfirmed]: 'Scam has not been confirmed',\n [ERROR_CODES.HoldbackAlreadyReleased]: 'Holdback has already been released',\n [ERROR_CODES.HoldbackPeriodNotEnded]: '30-day holdback period has not ended',\n};\n\n// =============================================================================\n// SDK Error Class\n// =============================================================================\n\nexport class RaiseError extends Error {\n constructor(\n public readonly code: number,\n message: string,\n public readonly logs?: string[]\n ) {\n super(message);\n this.name = 'RaiseError';\n }\n\n /**\n * Create from an Anchor error\n */\n static fromAnchorError(error: AnchorError): RaiseError {\n const code = error.error.errorCode.number;\n const message = ERROR_MESSAGES[code] || error.error.errorMessage;\n return new RaiseError(code, message, error.logs);\n }\n\n /**\n * Check if this is a specific error type\n */\n is(errorCode: number): boolean {\n return this.code === errorCode;\n }\n}\n\n// =============================================================================\n// Error Handling Utilities\n// =============================================================================\n\n/**\n * Parse an error and return a RaiseError if it's a program error\n */\nexport function parseError(error: unknown): RaiseError | Error {\n if (error instanceof AnchorError) {\n return RaiseError.fromAnchorError(error);\n }\n if (error instanceof Error) {\n return error;\n }\n return new Error(String(error));\n}\n\n/**\n * Check if an error is a specific Raise error\n */\nexport function isRaiseError(\n error: unknown,\n code?: number\n): error is RaiseError {\n if (!(error instanceof RaiseError)) {\n return false;\n }\n if (code !== undefined) {\n return error.code === code;\n }\n return true;\n}\n\n/**\n * Get a user-friendly error message\n */\nexport function getErrorMessage(error: unknown): string {\n if (error instanceof RaiseError) {\n return error.message;\n }\n if (error instanceof AnchorError) {\n const code = error.error.errorCode.number;\n return ERROR_MESSAGES[code] || error.error.errorMessage;\n }\n if (error instanceof Error) {\n return error.message;\n }\n return 'An unknown error occurred';\n}\n","/**\n * Raise Event Parsing\n *\n * Helpers for parsing program events from transaction logs.\n */\n\nimport { BN } from '@coral-xyz/anchor';\nimport { PublicKey } from '@solana/web3.js';\n\n// =============================================================================\n// Event Types\n// =============================================================================\n\nexport interface ProjectCreatedEvent {\n name: 'ProjectCreated';\n data: {\n projectId: BN;\n founder: PublicKey;\n fundingGoal: BN;\n metadataUri: string;\n };\n}\n\nexport interface ProjectApprovedEvent {\n name: 'ProjectApproved';\n data: {\n projectId: BN;\n };\n}\n\nexport interface ProjectFundedEvent {\n name: 'ProjectFunded';\n data: {\n projectId: BN;\n amountRaised: BN;\n };\n}\n\nexport interface InvestmentMadeEvent {\n name: 'InvestmentMade';\n data: {\n projectId: BN;\n investor: PublicKey;\n amount: BN;\n nftMint: PublicKey;\n tier: number;\n voteWeight: BN;\n };\n}\n\nexport interface InvestmentCancelledEvent {\n name: 'InvestmentCancelled';\n data: {\n projectId: BN;\n investor: PublicKey;\n amount: BN;\n nftMint: PublicKey;\n };\n}\n\nexport interface MilestoneCreatedEvent {\n name: 'MilestoneCreated';\n data: {\n projectId: BN;\n milestoneIndex: number;\n percentage: number;\n description: string;\n };\n}\n\nexport interface MilestoneSubmittedEvent {\n name: 'MilestoneSubmitted';\n data: {\n projectId: BN;\n milestoneIndex: number;\n votingEndsAt: BN;\n };\n}\n\nexport interface VoteCastEvent {\n name: 'VoteCast';\n data: {\n projectId: BN;\n milestoneIndex: number;\n voter: PublicKey;\n choice: { good: object } | { bad: object };\n weight: BN;\n };\n}\n\nexport interface MilestoneVoteFinalizedEvent {\n name: 'MilestoneVoteFinalized';\n data: {\n projectId: BN;\n milestoneIndex: number;\n passed: boolean;\n yesVotes: BN;\n noVotes: BN;\n };\n}\n\nexport interface FundsUnlockedEvent {\n name: 'FundsUnlocked';\n data: {\n projectId: BN;\n milestoneIndex: number;\n amount: BN;\n };\n}\n\nexport interface TgeDateSetEvent {\n name: 'TgeDateSet';\n data: {\n projectId: BN;\n tgeDate: BN;\n tokenMint: PublicKey;\n };\n}\n\nexport interface TokensDepositedEvent {\n name: 'TokensDeposited';\n data: {\n projectId: BN;\n amount: BN;\n };\n}\n\nexport interface TokensClaimedEvent {\n name: 'TokensClaimed';\n data: {\n projectId: BN;\n investor: PublicKey;\n amount: BN;\n };\n}\n\nexport interface RefundClaimedEvent {\n name: 'RefundClaimed';\n data: {\n projectId: BN;\n investor: PublicKey;\n amount: BN;\n };\n}\n\nexport interface PivotProposedEvent {\n name: 'PivotProposed';\n data: {\n projectId: BN;\n newMetadataUri: string;\n };\n}\n\nexport interface PivotApprovedEvent {\n name: 'PivotApproved';\n data: {\n projectId: BN;\n withdrawalWindowEndsAt: BN;\n };\n}\n\nexport interface PivotFinalizedEvent {\n name: 'PivotFinalized';\n data: {\n projectId: BN;\n withdrawnAmount: BN;\n withdrawnCount: number;\n };\n}\n\nexport interface MilestoneReworkedEvent {\n name: 'MilestoneReworked';\n data: {\n projectId: BN;\n milestoneIndex: number;\n milestoneKey: PublicKey;\n consecutiveFailures: number;\n reworkedAt: BN;\n };\n}\n\nexport type RaiseEvent =\n | ProjectCreatedEvent\n | ProjectApprovedEvent\n | ProjectFundedEvent\n | InvestmentMadeEvent\n | InvestmentCancelledEvent\n | MilestoneCreatedEvent\n | MilestoneSubmittedEvent\n | VoteCastEvent\n | MilestoneVoteFinalizedEvent\n | FundsUnlockedEvent\n | TgeDateSetEvent\n | TokensDepositedEvent\n | TokensClaimedEvent\n | RefundClaimedEvent\n | PivotProposedEvent\n | PivotApprovedEvent\n | PivotFinalizedEvent\n | MilestoneReworkedEvent;\n\n// =============================================================================\n// Event Parsing\n// =============================================================================\n\n/**\n * Event name constants\n */\nexport const EVENT_NAMES = {\n ProjectCreated: 'ProjectCreated',\n ProjectApproved: 'ProjectApproved',\n ProjectFunded: 'ProjectFunded',\n InvestmentMade: 'InvestmentMade',\n InvestmentCancelled: 'InvestmentCancelled',\n MilestoneCreated: 'MilestoneCreated',\n MilestoneSubmitted: 'MilestoneSubmitted',\n VoteCast: 'VoteCast',\n MilestoneVoteFinalized: 'MilestoneVoteFinalized',\n FundsUnlocked: 'FundsUnlocked',\n TgeDateSet: 'TgeDateSet',\n TokensDeposited: 'TokensDeposited',\n TokensClaimed: 'TokensClaimed',\n RefundClaimed: 'RefundClaimed',\n PivotProposed: 'PivotProposed',\n PivotApproved: 'PivotApproved',\n PivotFinalized: 'PivotFinalized',\n MilestoneReworked: 'MilestoneReworked',\n} as const;\n\n/**\n * Filter events by name\n *\n * @param events - Array of events\n * @param name - Event name to filter\n * @returns Filtered events\n */\nexport function filterEventsByName<T extends RaiseEvent>(\n events: RaiseEvent[],\n name: T['name']\n): T[] {\n return events.filter((e) => e.name === name) as T[];\n}\n\n/**\n * Get the first event of a specific type\n *\n * @param events - Array of events\n * @param name - Event name to find\n * @returns First matching event or undefined\n */\nexport function findEvent<T extends RaiseEvent>(\n events: RaiseEvent[],\n name: T['name']\n): T | undefined {\n return events.find((e) => e.name === name) as T | undefined;\n}\n","/**\n * Raise Utilities\n *\n * Helper functions for common operations.\n */\n\nimport { BN } from '@coral-xyz/anchor';\nimport { PublicKey, Connection, TransactionSignature } from '@solana/web3.js';\n\n// =============================================================================\n// Transaction Utilities\n// =============================================================================\n\n/**\n * Wait for transaction confirmation\n *\n * @param connection - Solana connection\n * @param signature - Transaction signature\n * @param commitment - Confirmation commitment level\n * @returns Confirmation result\n */\nexport async function confirmTransaction(\n connection: Connection,\n signature: TransactionSignature,\n commitment: 'confirmed' | 'finalized' = 'confirmed'\n) {\n const latestBlockhash = await connection.getLatestBlockhash();\n\n return connection.confirmTransaction(\n {\n signature,\n blockhash: latestBlockhash.blockhash,\n lastValidBlockHeight: latestBlockhash.lastValidBlockHeight,\n },\n commitment\n );\n}\n\n/**\n * Get transaction details with retry\n *\n * @param connection - Solana connection\n * @param signature - Transaction signature\n * @param maxRetries - Maximum number of retries\n * @returns Transaction details\n */\nexport async function getTransactionWithRetry(\n connection: Connection,\n signature: TransactionSignature,\n maxRetries: number = 3\n) {\n for (let i = 0; i < maxRetries; i++) {\n const tx = await connection.getTransaction(signature, {\n maxSupportedTransactionVersion: 0,\n });\n\n if (tx) {\n return tx;\n }\n\n // Wait before retrying\n await new Promise((resolve) => setTimeout(resolve, 1000 * (i + 1)));\n }\n\n throw new Error(`Transaction ${signature} not found after ${maxRetries} retries`);\n}\n\n// =============================================================================\n// BN Utilities\n// =============================================================================\n\n/**\n * Convert BN to number safely\n *\n * @param bn - BN value\n * @returns Number value\n * @throws If value is too large for safe integer\n */\nexport function bnToNumber(bn: BN): number {\n const num = bn.toNumber();\n if (!Number.isSafeInteger(num)) {\n throw new Error(`BN value ${bn.toString()} is too large to convert to number`);\n }\n return num;\n}\n\n/**\n * Convert BN to bigint\n *\n * @param bn - BN value\n * @returns BigInt value\n */\nexport function bnToBigInt(bn: BN): bigint {\n return BigInt(bn.toString());\n}\n\n/**\n * Convert bigint to BN\n *\n * @param value - BigInt value\n * @returns BN value\n */\nexport function bigIntToBN(value: bigint): BN {\n return new BN(value.toString());\n}\n\n// =============================================================================\n// Time Utilities\n// =============================================================================\n\n/**\n * Get current Unix timestamp in seconds\n *\n * @returns Current timestamp\n */\nexport function getCurrentTimestamp(): number {\n return Math.floor(Date.now() / 1000);\n}\n\n/**\n * Convert Unix timestamp to Date\n *\n * @param timestamp - Unix timestamp in seconds\n * @returns Date object\n */\nexport function timestampToDate(timestamp: number | BN): Date {\n const ts = typeof timestamp === 'number' ? timestamp : timestamp.toNumber();\n return new Date(ts * 1000);\n}\n\n/**\n * Check if a timestamp has passed\n *\n * @param timestamp - Unix timestamp in seconds\n * @returns True if timestamp has passed\n */\nexport function hasTimestampPassed(timestamp: number | BN): boolean {\n const ts = typeof timestamp === 'number' ? timestamp : timestamp.toNumber();\n return getCurrentTimestamp() > ts;\n}\n\n/**\n * Calculate time remaining until timestamp\n *\n * @param timestamp - Unix timestamp in seconds\n * @returns Seconds remaining (0 if passed)\n */\nexport function timeRemaining(timestamp: number | BN): number {\n const ts = typeof timestamp === 'number' ? timestamp : timestamp.toNumber();\n const remaining = ts - getCurrentTimestamp();\n return remaining > 0 ? remaining : 0;\n}\n\n/**\n * Format duration in human-readable format\n *\n * @param seconds - Duration in seconds\n * @returns Formatted string (e.g., \"2d 5h 30m\")\n */\nexport function formatDuration(seconds: number): string {\n if (seconds <= 0) return '0s';\n\n const days = Math.floor(seconds / 86400);\n const hours = Math.floor((seconds % 86400) / 3600);\n const minutes = Math.floor((seconds % 3600) / 60);\n const secs = seconds % 60;\n\n const parts: string[] = [];\n if (days > 0) parts.push(`${days}d`);\n if (hours > 0) parts.push(`${hours}h`);\n if (minutes > 0) parts.push(`${minutes}m`);\n if (secs > 0 && days === 0) parts.push(`${secs}s`);\n\n return parts.join(' ') || '0s';\n}\n\n// =============================================================================\n// Percentage Utilities\n// =============================================================================\n\n/**\n * Calculate percentage from basis points\n *\n * @param bps - Basis points (1% = 100 bps)\n * @returns Percentage as decimal\n */\nexport function bpsToPercent(bps: number): number {\n return bps / 10000;\n}\n\n/**\n * Calculate basis points from percentage\n *\n * @param percent - Percentage as decimal\n * @returns Basis points\n */\nexport function percentToBps(percent: number): number {\n return Math.floor(percent * 10000);\n}\n\n/**\n * Calculate percentage of amount\n *\n * @param amount - Total amount\n * @param percentage - Percentage (0-100)\n * @returns Calculated amount\n */\nexport function percentageOf(amount: bigint, percentage: number): bigint {\n return (amount * BigInt(Math.floor(percentage * 100))) / 10000n;\n}\n\n// =============================================================================\n// Validation Utilities\n// =============================================================================\n\n/**\n * Validate milestone percentages sum to 100\n *\n * @param percentages - Array of percentage values\n * @returns True if valid\n */\nexport function validateMilestonePercentages(percentages: number[]): boolean {\n const sum = percentages.reduce((acc, p) => acc + p, 0);\n return sum === 100;\n}\n\n/**\n * Validate metadata URI format\n *\n * @param uri - URI string\n * @param maxLength - Maximum allowed length\n * @returns True if valid\n */\nexport function validateMetadataUri(uri: string, maxLength: number = 200): boolean {\n if (uri.length > maxLength) return false;\n\n try {\n new URL(uri);\n return true;\n } catch {\n return false;\n }\n}\n\n// =============================================================================\n// Account Utilities\n// =============================================================================\n\n/**\n * Check if a public key is valid\n *\n * @param pubkey - String or PublicKey\n * @returns True if valid\n */\nexport function isValidPublicKey(pubkey: string | PublicKey): boolean {\n try {\n if (typeof pubkey === 'string') {\n new PublicKey(pubkey);\n }\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Shorten a public key for display\n *\n * @param pubkey - Public key\n * @param chars - Number of characters to show on each end\n * @returns Shortened string (e.g., \"ABC...XYZ\")\n */\nexport function shortenPublicKey(pubkey: PublicKey | string, chars: number = 4): string {\n const str = pubkey.toString();\n if (str.length <= chars * 2 + 3) return str;\n return `${str.slice(0, chars)}...${str.slice(-chars)}`;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/constants/index.ts","../src/pdas/index.ts","../src/accounts/index.ts","../src/instructions/index.ts","../src/client.ts","../src/types/index.ts","../src/errors/index.ts","../src/events/index.ts","../src/utils/index.ts"],"names":["InvestmentTier","timeRemaining","BN","PublicKey","getAccountNamespace","minDeadline","ProjectState","MilestoneState","VoteChoice","PivotState","FundingRoundState"],"mappings":"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","file":"index.js","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","/**\n * Raise Instruction Builders\n *\n * All instruction builder functions for the Raise program.\n * These return transaction signatures when called with RPC.\n */\n\nimport { Program, BN } from '@coral-xyz/anchor';\nimport { PublicKey, Keypair, SYSVAR_INSTRUCTIONS_PUBKEY, SYSVAR_RENT_PUBKEY, SYSVAR_CLOCK_PUBKEY, SystemProgram, ComputeBudgetProgram } from '@solana/web3.js';\nimport {\n getProjectPDA,\n getEscrowPDA,\n getMilestonePDA,\n getInvestmentPDA,\n getVotePDA,\n getPivotProposalPDA,\n getTgeEscrowPDA,\n getTokenVaultPDA,\n getNftMintPDA,\n getProgramAuthorityPDA,\n getAdminConfigPDA,\n // ZTM v2.0 PDAs\n getTokenomicsPDA,\n getTokenMintPDA,\n getVaultAuthorityPDA,\n getInvestorVaultPDA,\n getFounderVaultPDA,\n getLpTokenVaultPDA,\n getTreasuryVaultPDA,\n getLpUsdcVaultPDA,\n getFounderVestingPDA,\n getSubAllocationVestingPDA,\n // Per-Milestone Vesting PDAs\n getInvestorMilestoneVestingPDA,\n getFounderMilestoneVestingPDA,\n // Future Round PDAs\n getFutureRoundTokenVaultPDA,\n getFutureRoundVaultPDA,\n // Multi-Round Fundraising PDAs\n getFundingRoundPDA,\n getRoundEscrowPDA,\n getRoundMilestonePDA,\n getRoundNftMintPDA,\n getRoundInvestmentPDA,\n getRoundInvestorMilestoneVestingPDA,\n} from '../pdas/index.js';\nimport { getAssociatedTokenAddressSync, TOKEN_PROGRAM_ID, ASSOCIATED_TOKEN_PROGRAM_ID } from '@solana/spl-token';\n\n// Metaplex Token Metadata Program ID\nconst TOKEN_METADATA_PROGRAM_ID = new PublicKey('metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s');\n\n/**\n * Ensure value is a proper PublicKey instance.\n * Handles cases where PublicKey objects lose their prototype chain\n * (e.g., when passing through React state or JSON serialization).\n */\nfunction ensurePublicKey(value: PublicKey | string | { toString(): string }): PublicKey {\n if (value instanceof PublicKey) {\n return value;\n }\n // Handle string or object with toString method\n return new PublicKey(String(value));\n}\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 get methods namespace - bypasses deep type instantiation\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction getMethods(program: AnyProgram): any {\n return program.methods;\n}\n\n// Helper to get account namespace for fetching accounts\n// Used by voteOnMilestone to fetch milestone.voting_round for vote PDA\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction getAccountNamespace(program: AnyProgram): any {\n return program.account;\n}\n\n// =============================================================================\n// Admin Instructions\n// =============================================================================\n\n/**\n * Initialize admin config (deploy-time only)\n */\nexport async function initializeAdmin(\n program: AnyProgram,\n admin: PublicKey,\n payer: PublicKey\n): Promise<string> {\n return getMethods(program)\n .initializeAdmin()\n .accountsPartial({\n admin,\n payer,\n })\n .rpc();\n}\n\n/**\n * Propose admin transfer to new admin\n */\nexport async function transferAdmin(\n program: AnyProgram,\n adminKeypair: Keypair,\n newAdmin: PublicKey\n): Promise<string> {\n return getMethods(program)\n .transferAdmin()\n .accountsPartial({\n authority: adminKeypair.publicKey,\n newAdmin,\n })\n .signers([adminKeypair])\n .rpc();\n}\n\n/**\n * Accept admin transfer\n */\nexport async function acceptAdmin(\n program: AnyProgram,\n newAuthority: PublicKey\n): Promise<string> {\n return getMethods(program)\n .acceptAdmin()\n .accountsPartial({\n newAuthority,\n })\n .rpc();\n}\n\n// =============================================================================\n// Project Instructions\n// =============================================================================\n\n/**\n * TierConfig input type for initializeProject\n * Matches the on-chain TierConfig struct\n * Note: voteMultiplier is auto-calculated on-chain using logarithmic formula\n */\ninterface TierConfigInput {\n /** USDC amount per lot */\n amount: BN;\n /** Maximum lots available */\n maxLots: number;\n /** Token allocation per $1 invested */\n tokenRatio: BN;\n}\n\n/**\n * TokenomicsArgs input type for initializeProject (ZTM v2.0)\n * Matches the on-chain TokenomicsArgs struct\n */\nexport interface TokenomicsInput {\n /** Token symbol as 8-byte array (2-8 chars uppercase, padded with 0s) */\n tokenSymbol: number[];\n /** Total token supply */\n totalSupply: BN;\n /** Investor allocation in basis points (e.g., 4000 = 40%) */\n investorAllocationBps: number;\n /** LP token allocation in basis points */\n lpTokenAllocationBps: number;\n /** LP USDC allocation in basis points (min 500 = 5% of raised USDC) */\n lpUsdcAllocationBps: number;\n /** Founder allocation in basis points (optional). Sub-allocations (treasury, advisors, marketing) draw from this pool. */\n founderAllocationBps?: number | null;\n /** Zemyth platform fee in basis points (minimum 100 = 1%). Vests proportionally per milestone. */\n zemythAllocationBps?: number | null;\n /** Founder wallet for vesting (required if founder_allocation_bps > 0) */\n founderWallet?: PublicKey | null;\n /** Vesting duration in months (required if founder_allocation_bps > 0) */\n vestingDurationMonths?: number | null;\n /** Cliff period in months (optional) */\n cliffMonths?: number | null;\n /** Early Token Release: Founder milestone-based vesting BPS (optional, default: 4750 = 47.5% of founder allocation) */\n founderMilestoneVestingBps?: number | null;\n /** Early Token Release: Founder time-based vesting BPS (optional, default: 4750 = 47.5% of founder allocation) */\n founderTimeVestingBps?: number | null;\n /** Future round allocation in basis points (optional, 0 = none, >= 1000 = 10% minimum if enabled) */\n futureRoundAllocationBps?: number | null;\n}\n\n/**\n * Helper to convert string symbol to 8-byte array\n */\nexport function symbolToBytes(symbol: string): number[] {\n const bytes = new Array(8).fill(0);\n const chars = symbol.toUpperCase().slice(0, 8);\n for (let i = 0; i < chars.length; i++) {\n bytes[i] = chars.charCodeAt(i);\n }\n return bytes;\n}\n\n// =============================================================================\n// Deadline Constants and Helpers\n// =============================================================================\n\n/** Minimum deadline duration from current time (7 days in production, 60s in dev) */\nexport const MIN_DEADLINE_DURATION_SECONDS_PROD = 604_800; // 7 days\nexport const MIN_DEADLINE_DURATION_SECONDS_DEV = 60; // 60 seconds\n\n/** Maximum deadline duration from current time (1 year) */\nexport const MAX_DEADLINE_DURATION_SECONDS = 31_536_000; // 365 days\n\n/**\n * Calculate a valid milestone deadline\n *\n * @param daysFromNow - Number of days from now to set deadline\n * @param isDev - Use dev mode (60s min) or production mode (7 days min)\n * @returns BN timestamp for the deadline\n */\nexport function calculateDeadline(daysFromNow: number, isDev: boolean = false): BN {\n const nowSeconds = Math.floor(Date.now() / 1000);\n const minDuration = isDev ? MIN_DEADLINE_DURATION_SECONDS_DEV : MIN_DEADLINE_DURATION_SECONDS_PROD;\n const daysInSeconds = daysFromNow * 24 * 60 * 60;\n\n // Ensure deadline is at least minimum duration from now\n const deadlineSeconds = nowSeconds + Math.max(daysInSeconds, minDuration);\n\n // Cap at maximum duration\n const maxDeadline = nowSeconds + MAX_DEADLINE_DURATION_SECONDS;\n return new BN(Math.min(deadlineSeconds, maxDeadline));\n}\n\n/**\n * Create a deadline that's the minimum allowed duration from now\n *\n * @param isDev - Use dev mode (60s min) or production mode (7 days min)\n * @returns BN timestamp for the minimum valid deadline\n */\nexport function minDeadline(isDev: boolean = false): BN {\n const nowSeconds = Math.floor(Date.now() / 1000);\n const minDuration = isDev ? MIN_DEADLINE_DURATION_SECONDS_DEV : MIN_DEADLINE_DURATION_SECONDS_PROD;\n return new BN(nowSeconds + minDuration + 1); // +1 for safety margin\n}\n\n/**\n * Validate a deadline is within allowed bounds\n *\n * @param deadline - BN timestamp to validate\n * @param isDev - Use dev mode (60s min) or production mode (7 days min)\n * @returns { valid: boolean, error?: string }\n */\nexport function validateDeadline(\n deadline: BN,\n isDev: boolean = false\n): { valid: boolean; error?: string } {\n const nowSeconds = Math.floor(Date.now() / 1000);\n const deadlineSeconds = deadline.toNumber();\n const minDuration = isDev ? MIN_DEADLINE_DURATION_SECONDS_DEV : MIN_DEADLINE_DURATION_SECONDS_PROD;\n\n const minDeadline = nowSeconds + minDuration;\n const maxDeadline = nowSeconds + MAX_DEADLINE_DURATION_SECONDS;\n\n if (deadlineSeconds < minDeadline) {\n const minDays = isDev ? '60 seconds' : '7 days';\n return {\n valid: false,\n error: `Deadline must be at least ${minDays} from now`,\n };\n }\n\n if (deadlineSeconds > maxDeadline) {\n return {\n valid: false,\n error: 'Deadline must be within 1 year from now',\n };\n }\n\n return { valid: true };\n}\n\n/**\n * Initialize a new project with founder-configured tiers and tokenomics (ZTM v2.0)\n *\n * @param milestone1Deadline - Unix timestamp for M1 deadline (required)\n * Must be >= current_time + MIN_DEADLINE_DURATION_SECONDS (7 days prod, 60s dev)\n * Must be <= current_time + MAX_DEADLINE_DURATION_SECONDS (1 year)\n * @param priceMultipliers - Optional price multipliers in BPS for each milestone\n * - If not provided (default): Uses DYNAMIC mode - multipliers calculated automatically\n * via ZEMYTH formula when founder claims milestone funds and sets next deadline\n * - If provided: Uses STATIC mode - pre-configured multipliers array (legacy behavior)\n * multipliers[i] = price after milestone i passes (10000 = 1.0x, 15000 = 1.5x)\n */\nexport async function initializeProject(\n program: AnyProgram,\n args: {\n projectId: BN;\n fundingGoal: BN;\n metadataUri: string;\n /** Founder-configured tiers (1-10 tiers, sorted ascending by amount) */\n tiers: TierConfigInput[];\n /** ZTM v2.0: Tokenomics configuration */\n tokenomics: TokenomicsInput;\n /** Milestone 1 deadline - Unix timestamp (required) */\n milestone1Deadline: BN;\n /** Price multipliers: Optional pre-configured BPS array (defaults to dynamic ZEMYTH formula) */\n priceMultipliers?: number[];\n },\n founder: PublicKey\n): Promise<string> {\n return getMethods(program)\n .initializeProject({\n projectId: args.projectId,\n fundingGoal: args.fundingGoal,\n metadataUri: args.metadataUri,\n tiers: args.tiers,\n tokenomics: {\n tokenSymbol: args.tokenomics.tokenSymbol,\n totalSupply: args.tokenomics.totalSupply,\n investorAllocationBps: args.tokenomics.investorAllocationBps,\n lpTokenAllocationBps: args.tokenomics.lpTokenAllocationBps,\n lpUsdcAllocationBps: args.tokenomics.lpUsdcAllocationBps,\n founderAllocationBps: args.tokenomics.founderAllocationBps ?? null,\n zemythAllocationBps: args.tokenomics.zemythAllocationBps ?? null,\n founderWallet: args.tokenomics.founderWallet ?? null,\n vestingDurationMonths: args.tokenomics.vestingDurationMonths ?? null,\n cliffMonths: args.tokenomics.cliffMonths ?? null,\n founderMilestoneVestingBps: args.tokenomics.founderMilestoneVestingBps ?? null,\n founderTimeVestingBps: args.tokenomics.founderTimeVestingBps ?? null,\n futureRoundAllocationBps: args.tokenomics.futureRoundAllocationBps ?? null,\n },\n milestone1Deadline: args.milestone1Deadline,\n priceMultipliers: args.priceMultipliers ?? null,\n })\n .accountsPartial({\n founder,\n })\n .rpc();\n}\n\n/**\n * Submit project for approval\n */\nexport async function submitForApproval(\n program: AnyProgram,\n projectId: BN,\n founder: PublicKey\n): Promise<string> {\n const projectPda = getProjectPDA(projectId, program.programId);\n\n return getMethods(program)\n .submitForApproval()\n .accountsPartial({\n project: projectPda,\n founder,\n })\n .rpc();\n}\n\n/**\n * Approve project (admin only)\n * ZTM v2.0: This now deploys the token and creates all vaults\n */\nexport async function approveProject(\n program: AnyProgram,\n args: {\n projectId: BN;\n /** USDC mint address (for creating lp_usdc_vault) */\n usdcMint: PublicKey;\n },\n adminKeypair: Keypair\n): Promise<string> {\n const projectPda = getProjectPDA(args.projectId, program.programId);\n const tokenomicsPda = getTokenomicsPDA(projectPda, program.programId);\n const tokenVaultPda = getTokenVaultPDA(projectPda, program.programId);\n const tokenMintPda = getTokenMintPDA(projectPda, program.programId);\n const vaultAuthorityPda = getVaultAuthorityPDA(projectPda, program.programId);\n const investorVaultPda = getInvestorVaultPDA(projectPda, program.programId);\n const founderVaultPda = getFounderVaultPDA(projectPda, program.programId);\n const lpTokenVaultPda = getLpTokenVaultPDA(projectPda, program.programId);\n const treasuryVaultPda = getTreasuryVaultPDA(projectPda, program.programId);\n const lpUsdcVaultPda = getLpUsdcVaultPDA(projectPda, program.programId);\n const futureRoundTokenVaultPda = getFutureRoundTokenVaultPDA(projectPda, program.programId);\n const futureRoundVaultPda = getFutureRoundVaultPDA(projectPda, program.programId);\n\n // Request 400k CUs - this instruction creates 10 accounts + 7 CPIs + 5 events\n const computeBudgetIx = ComputeBudgetProgram.setComputeUnitLimit({\n units: 400_000,\n });\n\n return getMethods(program)\n .approveProject()\n .accountsPartial({\n project: projectPda,\n tokenomics: tokenomicsPda,\n tokenVault: tokenVaultPda,\n tokenMint: tokenMintPda,\n vaultAuthority: vaultAuthorityPda,\n investorVault: investorVaultPda,\n founderVault: founderVaultPda,\n lpTokenVault: lpTokenVaultPda,\n treasuryVault: treasuryVaultPda,\n lpUsdcVault: lpUsdcVaultPda,\n futureRoundTokenVault: futureRoundTokenVaultPda,\n futureRoundVault: futureRoundVaultPda,\n usdcMint: args.usdcMint,\n authority: adminKeypair.publicKey,\n payer: adminKeypair.publicKey,\n })\n .preInstructions([computeBudgetIx])\n .signers([adminKeypair])\n .rpc();\n}\n\n// =============================================================================\n// Milestone Instructions\n// =============================================================================\n\n/**\n * Create a milestone for a project\n *\n * @param vestingDurationMonths - Vesting duration in months (6-24), null for default (12)\n * @param cliffMonths - Cliff duration in months (0-3), null for default (0)\n * @param instantReleaseBps - Instant release basis points (500-5000), null for default (500 = 5%)\n */\nexport async function createMilestone(\n program: AnyProgram,\n args: {\n projectId: BN;\n milestoneIndex: number;\n percentage: number;\n description: string;\n vestingDurationMonths?: number | null;\n cliffMonths?: number | null;\n instantReleaseBps?: number | null;\n },\n founder: PublicKey\n): Promise<string> {\n const projectPda = getProjectPDA(args.projectId, program.programId);\n const milestonePda = getMilestonePDA(projectPda, args.milestoneIndex, program.programId);\n\n return getMethods(program)\n .createMilestone({\n milestoneIndex: args.milestoneIndex,\n percentage: args.percentage,\n description: args.description,\n vestingDurationMonths: args.vestingDurationMonths ?? null,\n cliffMonths: args.cliffMonths ?? null,\n instantReleaseBps: args.instantReleaseBps ?? null,\n })\n .accountsPartial({\n project: projectPda,\n milestone: milestonePda,\n founder,\n })\n .rpc();\n}\n\n/**\n * Submit milestone for review\n */\nexport async function submitMilestone(\n program: AnyProgram,\n projectId: BN,\n milestoneIndex: number,\n founder: PublicKey\n): Promise<string> {\n const projectPda = getProjectPDA(projectId, program.programId);\n const milestonePda = getMilestonePDA(projectPda, milestoneIndex, program.programId);\n\n return getMethods(program)\n .submitMilestone()\n .accountsPartial({\n project: projectPda,\n milestone: milestonePda,\n founder,\n })\n .rpc();\n}\n\n/**\n * Vote on a milestone\n *\n * Automatically fetches the milestone to get the current voting_round\n * for proper vote PDA derivation. This supports re-voting after milestone failure.\n */\nexport async function voteOnMilestone(\n program: AnyProgram,\n args: {\n projectId: BN;\n milestoneIndex: number;\n nftMint: PublicKey | string;\n choice: { good: object } | { bad: object };\n },\n voter: PublicKey\n): Promise<string> {\n // Ensure nftMint is a proper PublicKey (handles React state serialization)\n const nftMintPubkey = ensurePublicKey(args.nftMint);\n\n const projectPda = getProjectPDA(args.projectId, program.programId);\n const milestonePda = getMilestonePDA(projectPda, args.milestoneIndex, program.programId);\n const investmentPda = getInvestmentPDA(projectPda, nftMintPubkey, program.programId);\n\n // Fetch milestone to get current voting_round for vote PDA derivation\n // This enables re-voting after milestone failure and resubmit\n const milestone = await getAccountNamespace(program).milestone.fetch(milestonePda);\n const votingRound = milestone.votingRound ?? 0;\n const votePda = getVotePDA(milestonePda, voter, votingRound, program.programId);\n\n // Get voter's NFT token account (ATA)\n const voterNftAccount = getAssociatedTokenAddressSync(\n nftMintPubkey,\n voter,\n false, // allowOwnerOffCurve\n TOKEN_PROGRAM_ID\n );\n\n return getMethods(program)\n .voteOnMilestone({ choice: args.choice })\n .accountsPartial({\n milestone: milestonePda,\n project: projectPda,\n investment: investmentPda,\n vote: votePda,\n nftMint: nftMintPubkey,\n voterNftAccount,\n voter,\n })\n .rpc();\n}\n\n/**\n * Finalize voting on a milestone\n */\nexport async function finalizeVoting(\n program: AnyProgram,\n projectId: BN,\n milestoneIndex: number\n): Promise<string> {\n const projectPda = getProjectPDA(projectId, program.programId);\n const milestonePda = getMilestonePDA(projectPda, milestoneIndex, program.programId);\n\n return getMethods(program)\n .finalizeVoting()\n .accountsPartial({\n project: projectPda,\n milestone: milestonePda,\n })\n .rpc();\n}\n\n/**\n * Claim milestone funds (for founders)\n *\n * ZTM v2.0: Transfers USDC from escrow to founder's account.\n * - Regular milestones: Full payout to founder (no LP deduction)\n * - Final milestone: LP USDC reserved for PCL, triggers MAE\n *\n * @param nextMilestoneDeadline - Deadline for next milestone (required for non-final milestones)\n * Must be >= current_time + MIN_DEADLINE_DURATION_SECONDS (7 days prod, 60s dev)\n * Must be <= current_time + MAX_DEADLINE_DURATION_SECONDS (1 year)\n * Set to BN(0) for final milestone claims (no next milestone exists)\n */\nexport async function claimMilestoneFunds(\n program: AnyProgram,\n args: {\n projectId: BN;\n milestoneIndex: number;\n founderUsdcAccount: PublicKey;\n escrowTokenAccount: PublicKey;\n /** Deadline for next milestone - required for non-final milestones, use BN(0) for final */\n nextMilestoneDeadline: BN;\n /** Next milestone PDA - required for non-final milestones */\n nextMilestonePda?: PublicKey;\n },\n founder: PublicKey\n): Promise<string> {\n const projectPda = getProjectPDA(args.projectId, program.programId);\n const milestonePda = getMilestonePDA(projectPda, args.milestoneIndex, program.programId);\n const escrowPda = getEscrowPDA(args.projectId, program.programId);\n const tokenVaultPda = getTokenVaultPDA(projectPda, program.programId);\n const tokenomicsPda = getTokenomicsPDA(projectPda, program.programId);\n const lpUsdcVaultPda = getLpUsdcVaultPDA(projectPda, program.programId);\n\n // For non-final milestones, derive next milestone PDA if not provided\n const nextMilestonePda = args.nextMilestonePda ??\n (args.nextMilestoneDeadline.gt(new BN(0))\n ? getMilestonePDA(projectPda, args.milestoneIndex + 1, program.programId)\n : null);\n\n return getMethods(program)\n .claimMilestoneFunds({ nextMilestoneDeadline: args.nextMilestoneDeadline })\n .accountsPartial({\n milestone: milestonePda,\n project: projectPda,\n founder,\n projectEscrow: args.escrowTokenAccount,\n founderUsdcAccount: args.founderUsdcAccount,\n escrowPda,\n tokenVault: tokenVaultPda,\n tokenomics: tokenomicsPda,\n lpUsdcVault: lpUsdcVaultPda,\n nextMilestone: nextMilestonePda,\n systemProgram: SystemProgram.programId,\n tokenProgram: TOKEN_PROGRAM_ID,\n })\n .rpc();\n}\n\n/**\n * Resubmit a failed milestone for rework (Failed → InProgress)\n *\n * This allows founders to iterate on a failed milestone by transitioning it\n * back to InProgress state with cleared voting state for a fresh voting cycle.\n * The consecutive_failures counter is NOT reset (tracked at project level).\n * Unlimited rework attempts are allowed.\n */\nexport async function resubmitMilestone(\n program: AnyProgram,\n args: {\n projectId: BN;\n milestoneIndex: number;\n },\n founder: PublicKey\n): Promise<string> {\n const projectPda = getProjectPDA(args.projectId, program.programId);\n const milestonePda = getMilestonePDA(projectPda, args.milestoneIndex, program.programId);\n\n return getMethods(program)\n .resubmitMilestone()\n .accountsPartial({\n project: projectPda,\n milestone: milestonePda,\n founder,\n })\n .rpc();\n}\n\n/**\n * Set milestone deadline for founder to commit submission date\n *\n * Founders must set deadlines for milestones to provide visibility to investors.\n * Deadline must be at least 7 days from now and at most 1 year from now.\n * Can only be set on Proposed, Approved, or InProgress milestones.\n */\nexport async function setMilestoneDeadline(\n program: AnyProgram,\n args: {\n projectId: BN;\n milestoneIndex: number;\n /** Unix timestamp for the deadline */\n deadline: BN;\n },\n founder: PublicKey\n): Promise<string> {\n const projectPda = getProjectPDA(args.projectId, program.programId);\n const milestonePda = getMilestonePDA(projectPda, args.milestoneIndex, program.programId);\n\n return getMethods(program)\n .setMilestoneDeadline({\n milestoneIndex: args.milestoneIndex,\n deadline: args.deadline,\n })\n .accountsPartial({\n project: projectPda,\n milestone: milestonePda,\n founder,\n })\n .rpc();\n}\n\n/**\n * Extend milestone deadline (max 3 extensions per milestone)\n *\n * Founders can extend a deadline up to 3 times before it passes.\n * Must be called BEFORE the current deadline passes.\n * New deadline must be later than current deadline.\n */\nexport async function extendMilestoneDeadline(\n program: AnyProgram,\n args: {\n projectId: BN;\n milestoneIndex: number;\n /** New deadline timestamp (must be > current deadline) */\n newDeadline: BN;\n },\n founder: PublicKey\n): Promise<string> {\n const projectPda = getProjectPDA(args.projectId, program.programId);\n const milestonePda = getMilestonePDA(projectPda, args.milestoneIndex, program.programId);\n\n return getMethods(program)\n .extendMilestoneDeadline({\n milestoneIndex: args.milestoneIndex,\n newDeadline: args.newDeadline,\n })\n .accountsPartial({\n project: projectPda,\n milestone: milestonePda,\n founder,\n })\n .rpc();\n}\n\n// =============================================================================\n// Investment Instructions\n// =============================================================================\n\n/**\n * Derive Metaplex metadata PDA\n */\nfunction getMetadataPDA(mint: PublicKey): PublicKey {\n const [pda] = PublicKey.findProgramAddressSync(\n [\n Buffer.from('metadata'),\n TOKEN_METADATA_PROGRAM_ID.toBuffer(),\n mint.toBuffer(),\n ],\n TOKEN_METADATA_PROGRAM_ID\n );\n return pda;\n}\n\n/**\n * Derive Metaplex master edition PDA\n */\nfunction getMasterEditionPDA(mint: PublicKey): PublicKey {\n const [pda] = PublicKey.findProgramAddressSync(\n [\n Buffer.from('metadata'),\n TOKEN_METADATA_PROGRAM_ID.toBuffer(),\n mint.toBuffer(),\n Buffer.from('edition'),\n ],\n TOKEN_METADATA_PROGRAM_ID\n );\n return pda;\n}\n\n/**\n * Invest in a project\n *\n * This creates an investment NFT and transfers USDC to the project escrow.\n * The investmentCount should be fetched from the project account before calling.\n */\nexport async function invest(\n program: AnyProgram,\n args: {\n projectId: BN;\n amount: BN;\n investorTokenAccount: PublicKey;\n escrowTokenAccount: PublicKey;\n investmentCount: number; // Must be fetched from project.investmentCount\n },\n investor: PublicKey\n): Promise<string> {\n const projectPda = getProjectPDA(args.projectId, program.programId);\n\n // Derive NFT mint PDA using seeds: [NFT_MINT_SEED, project_id, investor, investment_count]\n const [nftMint] = getNftMintPDA(args.projectId, investor, args.investmentCount, program.programId);\n\n // Derive investment PDA using seeds: [INVESTMENT_SEED, project, nft_mint]\n const investmentPda = getInvestmentPDA(projectPda, nftMint, program.programId);\n\n // Derive investor's NFT token account (ATA)\n const investorNftAccount = getAssociatedTokenAddressSync(nftMint, investor);\n\n // Derive Metaplex metadata and master edition PDAs\n const metadataAccount = getMetadataPDA(nftMint);\n const masterEdition = getMasterEditionPDA(nftMint);\n\n // Derive program authority PDA\n const [programAuthority] = getProgramAuthorityPDA(program.programId);\n\n // BUG-1 FIX: Derive first milestone PDA (index 0) for state transition when funded\n const firstMilestonePda = getMilestonePDA(projectPda, 0, program.programId);\n\n // Add compute budget instruction to handle heavy NFT+metadata operations\n // Metaplex NFT minting requires significantly more than the default 200k CU\n return getMethods(program)\n .invest({ amount: args.amount })\n .accountsPartial({\n project: projectPda,\n firstMilestone: firstMilestonePda,\n nftMint: nftMint,\n investment: investmentPda,\n investorNftAccount: investorNftAccount,\n metadataAccount: metadataAccount,\n masterEdition: masterEdition,\n escrowTokenAccount: args.escrowTokenAccount,\n investorTokenAccount: args.investorTokenAccount,\n programAuthority: programAuthority,\n investor,\n tokenProgram: TOKEN_PROGRAM_ID,\n associatedTokenProgram: ASSOCIATED_TOKEN_PROGRAM_ID,\n systemProgram: SystemProgram.programId,\n rent: SYSVAR_RENT_PUBKEY,\n tokenMetadataProgram: TOKEN_METADATA_PROGRAM_ID,\n sysvarInstructions: SYSVAR_INSTRUCTIONS_PUBKEY,\n })\n .preInstructions([\n ComputeBudgetProgram.setComputeUnitLimit({ units: 400_000 }),\n ])\n .rpc();\n}\n\n/**\n * Cancel investment within 24-hour cooling-off period\n */\nexport async function cancelInvestment(\n program: AnyProgram,\n args: {\n projectId: BN;\n nftMint: PublicKey;\n investorNftAccount: PublicKey;\n investorUsdcAccount: PublicKey;\n escrowTokenAccount: PublicKey;\n },\n investor: PublicKey\n): Promise<string> {\n const nftMintPubkey = ensurePublicKey(args.nftMint);\n const projectPda = getProjectPDA(args.projectId, program.programId);\n const investmentPda = getInvestmentPDA(projectPda, nftMintPubkey, program.programId);\n const escrowPda = getEscrowPDA(args.projectId, program.programId);\n\n return getMethods(program)\n .cancelInvestment()\n .accountsPartial({\n investor,\n project: projectPda,\n investment: investmentPda,\n nftMint: nftMintPubkey,\n investorNftAccount: args.investorNftAccount,\n projectEscrow: args.escrowTokenAccount,\n investorUsdcAccount: args.investorUsdcAccount,\n escrowPda,\n })\n .rpc();\n}\n\n// =============================================================================\n// Pivot Instructions\n// =============================================================================\n\n/**\n * Propose a pivot\n */\nexport async function proposePivot(\n program: AnyProgram,\n args: {\n projectId: BN;\n newMetadataUri: string;\n newMilestones: Array<{ percentage: number; description: string }>;\n },\n founder: PublicKey\n): Promise<string> {\n const projectPda = getProjectPDA(args.projectId, program.programId);\n\n // Fetch project to get current pivot_count\n const projectAccount = await getAccountNamespace(program).project.fetch(projectPda);\n const pivotCount = projectAccount.pivotCount || 0;\n\n // Derive pivot proposal PDA using pivot_count\n const pivotProposalPda = getPivotProposalPDA(projectPda, pivotCount, program.programId);\n\n return getMethods(program)\n .proposePivot({\n newMetadataUri: args.newMetadataUri,\n newMilestones: args.newMilestones,\n })\n .accountsPartial({\n project: projectPda,\n founder,\n pivotProposal: pivotProposalPda,\n systemProgram: SystemProgram.programId,\n clock: SYSVAR_CLOCK_PUBKEY,\n })\n .rpc();\n}\n\n/**\n * Approve pivot proposal (admin only)\n */\nexport async function approvePivot(\n program: AnyProgram,\n projectId: BN,\n adminKeypair: Keypair\n): Promise<string> {\n const projectPda = getProjectPDA(projectId, program.programId);\n\n // Fetch project to get the active pivot proposal\n // The active_pivot field contains the actual pivot proposal pubkey\n const projectAccount = await getAccountNamespace(program).project.fetch(projectPda);\n\n // Use the active_pivot directly if available, otherwise derive from pivot_count\n let pivotProposalPda: PublicKey;\n if (projectAccount.activePivot) {\n pivotProposalPda = projectAccount.activePivot;\n } else {\n // Fallback to deriving from pivot_count (pivot_count is NOT incremented until finalize)\n const pivotCount = projectAccount.pivotCount || 0;\n pivotProposalPda = getPivotProposalPDA(projectPda, pivotCount, program.programId);\n }\n\n return getMethods(program)\n .approvePivot()\n .accountsPartial({\n moderator: adminKeypair.publicKey,\n project: projectPda,\n pivotProposal: pivotProposalPda,\n })\n .signers([adminKeypair])\n .rpc();\n}\n\n/**\n * Withdraw from pivot during 7-day window\n */\nexport async function withdrawFromPivot(\n program: AnyProgram,\n args: {\n projectId: BN;\n pivotCount: number; // Current pivot_count from project\n nftMint: PublicKey;\n investorTokenAccount: PublicKey;\n escrowTokenAccount: PublicKey;\n milestoneAccounts: PublicKey[]; // All milestone PDAs for calculating unreleased funds\n },\n investor: PublicKey\n): Promise<string> {\n const nftMintPubkey = ensurePublicKey(args.nftMint);\n const projectPda = getProjectPDA(args.projectId, program.programId);\n const investmentPda = getInvestmentPDA(projectPda, nftMintPubkey, program.programId);\n const escrowPda = getEscrowPDA(args.projectId, program.programId);\n // Active pivot is at pivotCount (incremented only AFTER finalization)\n const pivotProposalPda = getPivotProposalPDA(projectPda, args.pivotCount, program.programId);\n // Get investor's NFT token account (ATA)\n const investorNftAccount = getAssociatedTokenAddressSync(\n nftMintPubkey,\n investor,\n false,\n TOKEN_PROGRAM_ID\n );\n\n // Pass milestone accounts as remaining accounts for unreleased funds calculation\n const remainingAccounts = args.milestoneAccounts.map((pubkey) => ({\n pubkey: ensurePublicKey(pubkey),\n isSigner: false,\n isWritable: false,\n }));\n\n return getMethods(program)\n .withdrawFromPivot()\n .accountsPartial({\n investor,\n project: projectPda,\n pivotProposal: pivotProposalPda,\n investment: investmentPda,\n nftMint: nftMintPubkey,\n investorNftAccount,\n escrowTokenAccount: args.escrowTokenAccount,\n investorTokenAccount: args.investorTokenAccount,\n escrow: escrowPda,\n })\n .remainingAccounts(remainingAccounts)\n .rpc();\n}\n\n/**\n * Finalize pivot after 7-day window\n *\n * IMPORTANT: When old_milestone_count == new_milestone_count, the milestone PDAs are\n * the same and get reinitialized in-place. In this case, only pass the milestone\n * accounts once (not twice as old+new).\n */\nexport async function finalizePivot(\n program: AnyProgram,\n args: {\n projectId: BN;\n pivotCount: number; // Current pivot_count from project (active pivot is at pivotCount)\n milestoneAccounts: PublicKey[]; // All milestone PDAs (reused when old_count == new_count)\n },\n authority: PublicKey\n): Promise<string> {\n const projectPda = getProjectPDA(args.projectId, program.programId);\n // Active pivot is at pivotCount (incremented only AFTER finalization)\n const pivotProposalPda = getPivotProposalPDA(projectPda, args.pivotCount, program.programId);\n\n // Pass milestone accounts as remaining accounts\n // When old_count == new_count, these are reinitialized in-place\n const remainingAccounts = args.milestoneAccounts.map((pubkey) => ({\n pubkey,\n isSigner: false,\n isWritable: true,\n }));\n\n return getMethods(program)\n .finalizePivot()\n .accountsPartial({\n authority,\n project: projectPda,\n pivotProposal: pivotProposalPda,\n })\n .remainingAccounts(remainingAccounts)\n .rpc();\n}\n\n// =============================================================================\n// TGE Instructions\n// =============================================================================\n\n/**\n * Set TGE date and token mint\n */\nexport async function setTgeDate(\n program: AnyProgram,\n args: {\n projectId: BN;\n tgeDate: BN;\n tokenMint: PublicKey;\n },\n founder: PublicKey\n): Promise<string> {\n const projectPda = getProjectPDA(args.projectId, program.programId);\n\n return getMethods(program)\n .setTgeDate({\n tgeDate: args.tgeDate,\n tokenMint: args.tokenMint,\n })\n .accountsPartial({\n project: projectPda,\n founder,\n })\n .rpc();\n}\n\n/**\n * Deposit tokens for investor distribution\n */\nexport async function depositTokens(\n program: AnyProgram,\n args: {\n projectId: BN;\n amount: BN;\n tokenMint: PublicKey;\n founderTokenAccount: PublicKey;\n },\n founder: PublicKey\n): Promise<string> {\n const projectPda = getProjectPDA(args.projectId, program.programId);\n\n return getMethods(program)\n .depositTokens({ amount: args.amount })\n .accountsPartial({\n project: projectPda,\n tokenMint: args.tokenMint,\n founderTokenAccount: args.founderTokenAccount,\n founder,\n })\n .rpc();\n}\n\n/**\n * Claim project tokens using Investment NFT\n */\nexport async function claimTokens(\n program: AnyProgram,\n args: {\n projectId: BN;\n nftMint: PublicKey;\n investorNftAccount: PublicKey;\n investorTokenAccount: PublicKey;\n projectTokenVault: PublicKey;\n },\n investor: PublicKey\n): Promise<string> {\n const projectPda = getProjectPDA(args.projectId, program.programId);\n const investmentPda = getInvestmentPDA(projectPda, args.nftMint, program.programId);\n const tokenVaultPda = getTokenVaultPDA(projectPda, program.programId);\n\n return getMethods(program)\n .claimTokens()\n .accountsPartial({\n investor,\n project: projectPda,\n investment: investmentPda,\n investorNftAccount: args.investorNftAccount,\n projectTokenVault: args.projectTokenVault,\n investorTokenAccount: args.investorTokenAccount,\n tokenVaultPda,\n tokenProgram: TOKEN_PROGRAM_ID,\n })\n .rpc();\n}\n\n/**\n * Report scam during 30-day post-TGE window\n */\nexport async function reportScam(\n program: AnyProgram,\n args: {\n projectId: BN;\n nftMint: PublicKey;\n },\n reporter: PublicKey\n): Promise<string> {\n const projectPda = getProjectPDA(args.projectId, program.programId);\n const tgeEscrowPda = getTgeEscrowPDA(projectPda, program.programId);\n const investmentPda = getInvestmentPDA(projectPda, args.nftMint, program.programId);\n\n return getMethods(program)\n .reportScam()\n .accountsPartial({\n tgeEscrow: tgeEscrowPda,\n project: projectPda,\n investment: investmentPda,\n nftMint: args.nftMint,\n reporter,\n })\n .rpc();\n}\n\n/**\n * Release 10% holdback to founder after 30 days\n */\nexport async function releaseHoldback(\n program: AnyProgram,\n args: {\n projectId: BN;\n founderTokenAccount: PublicKey;\n }\n): Promise<string> {\n const projectPda = getProjectPDA(args.projectId, program.programId);\n const tgeEscrowPda = getTgeEscrowPDA(projectPda, program.programId);\n\n return getMethods(program)\n .releaseHoldback()\n .accountsPartial({\n tgeEscrow: tgeEscrowPda,\n project: projectPda,\n founderTokenAccount: args.founderTokenAccount,\n })\n .rpc();\n}\n\n// =============================================================================\n// Abandonment Instructions\n// =============================================================================\n\n/**\n * Check for abandonment (90 days inactivity)\n */\nexport async function checkAbandonment(\n program: AnyProgram,\n projectId: BN,\n milestoneIndex: number = 0\n): Promise<string> {\n const projectPda = getProjectPDA(projectId, program.programId);\n const milestonePda = getMilestonePDA(projectPda, milestoneIndex, program.programId);\n\n return getMethods(program)\n .checkAbandonment()\n .accountsPartial({\n project: projectPda,\n milestone: milestonePda,\n })\n .rpc();\n}\n\n/**\n * Claim refund after abandonment\n *\n * @param milestoneCount - Number of milestones in the project (used to derive milestone PDAs for remainingAccounts)\n * The program calculates unreleased funds by iterating through milestone accounts.\n */\nexport async function claimRefund(\n program: AnyProgram,\n args: {\n projectId: BN;\n nftMint: PublicKey;\n investorNftAccount: PublicKey;\n investorUsdcAccount: PublicKey;\n escrowTokenAccount: PublicKey;\n milestoneCount?: number; // If not provided, defaults to 1\n },\n investor: PublicKey\n): Promise<string> {\n const nftMintPubkey = ensurePublicKey(args.nftMint);\n const projectPda = getProjectPDA(args.projectId, program.programId);\n const investmentPda = getInvestmentPDA(projectPda, nftMintPubkey, program.programId);\n\n // Derive milestone PDAs and pass as remainingAccounts\n // The program iterates through these to calculate unreleased funds\n const milestoneCount = args.milestoneCount ?? 1;\n const remainingAccounts = [];\n for (let i = 0; i < milestoneCount; i++) {\n const milestonePda = getMilestonePDA(projectPda, i, program.programId);\n remainingAccounts.push({\n pubkey: milestonePda,\n isWritable: false,\n isSigner: false,\n });\n }\n\n return getMethods(program)\n .claimRefund()\n .accountsPartial({\n project: projectPda,\n investment: investmentPda,\n nftMint: nftMintPubkey,\n investorNftAccount: args.investorNftAccount,\n investor,\n investorTokenAccount: args.investorUsdcAccount,\n escrowTokenAccount: args.escrowTokenAccount,\n })\n .remainingAccounts(remainingAccounts)\n .rpc();\n}\n\n// =============================================================================\n// ZTM v2.0 Token Distribution Instructions\n// =============================================================================\n\n/**\n * Claim investor tokens from a passed milestone (whitepaper: manual claim model)\n *\n * ZTM v2.0: Per whitepaper, investors manually claim their tokens after a milestone passes.\n * This replaces the batch distribution model with investor-initiated per-NFT claims.\n *\n * @param milestoneIndex - The milestone index to claim tokens from\n * @param nftMint - The NFT mint that proves investment ownership\n * @param investorTokenAccount - Investor's token account to receive claimed tokens\n */\nexport async function claimInvestorTokens(\n program: AnyProgram,\n args: {\n projectId: BN;\n /** Milestone index to claim tokens from */\n milestoneIndex: number;\n /** NFT mint that proves investment ownership */\n nftMint: PublicKey;\n /** Investor's token account to receive claimed tokens */\n investorTokenAccount: PublicKey;\n },\n investor: PublicKey\n): Promise<string> {\n const nftMintPubkey = ensurePublicKey(args.nftMint);\n const projectPda = getProjectPDA(args.projectId, program.programId);\n const tokenVaultPda = getTokenVaultPDA(projectPda, program.programId);\n const investmentPda = getInvestmentPDA(projectPda, nftMintPubkey, program.programId);\n const investorVaultPda = getInvestorVaultPDA(projectPda, program.programId);\n const vaultAuthorityPda = getVaultAuthorityPDA(projectPda, program.programId);\n\n // Get investor's NFT token account (ATA)\n const investorNftAccount = getAssociatedTokenAddressSync(\n nftMintPubkey,\n investor,\n false,\n TOKEN_PROGRAM_ID\n );\n\n return getMethods(program)\n .claimInvestorTokens({ milestoneIndex: args.milestoneIndex })\n .accountsPartial({\n investor,\n project: projectPda,\n tokenVault: tokenVaultPda,\n investment: investmentPda,\n nftMint: nftMintPubkey,\n investorNftAccount,\n investorVault: investorVaultPda,\n investorTokenAccount: args.investorTokenAccount,\n vaultAuthority: vaultAuthorityPda,\n tokenProgram: TOKEN_PROGRAM_ID,\n })\n .rpc();\n}\n\n/**\n * Distribute tokens to NFT holders for a milestone\n *\n * ZTM v2.0: Called by cranker after finalize_voting sets distribution_pending = true.\n * Processes batch of investments, transferring unlocked tokens to NFT holders.\n *\n * @deprecated Use claimInvestorTokens instead (whitepaper manual claim model)\n *\n * @param investments - Array of { investmentPda, investorTokenAccount } pairs\n * Each pair represents an investor's investment and their token account to receive tokens.\n * Max batch size: 10 investments per call.\n */\nexport async function distributeTokens(\n program: AnyProgram,\n args: {\n projectId: BN;\n milestoneIndex: number;\n /** Investment and token account pairs to process */\n investments: Array<{\n investmentPda: PublicKey;\n investorTokenAccount: PublicKey;\n }>;\n },\n payer: PublicKey\n): Promise<string> {\n const projectPda = getProjectPDA(args.projectId, program.programId);\n const tokenVaultPda = getTokenVaultPDA(projectPda, program.programId);\n const investorVaultPda = getInvestorVaultPDA(projectPda, program.programId);\n const vaultAuthorityPda = getVaultAuthorityPDA(projectPda, program.programId);\n\n // Build remaining accounts: (Investment, TokenAccount) pairs\n const remainingAccounts = args.investments.flatMap((inv) => [\n { pubkey: inv.investmentPda, isSigner: false, isWritable: true },\n { pubkey: inv.investorTokenAccount, isSigner: false, isWritable: true },\n ]);\n\n return getMethods(program)\n .distributeTokens({ milestoneIndex: args.milestoneIndex })\n .accountsPartial({\n project: projectPda,\n tokenVault: tokenVaultPda,\n investorVault: investorVaultPda,\n vaultAuthority: vaultAuthorityPda,\n payer,\n tokenProgram: TOKEN_PROGRAM_ID,\n })\n .remainingAccounts(remainingAccounts)\n .rpc();\n}\n\n/**\n * Complete token distribution for a milestone\n *\n * ZTM v2.0: Marks distribution as complete after all batches have been processed.\n * Permissionless - anyone can call this to finalize a distribution.\n */\nexport async function completeDistribution(\n program: AnyProgram,\n args: {\n projectId: BN;\n milestoneIndex: number;\n },\n payer: PublicKey\n): Promise<string> {\n const projectPda = getProjectPDA(args.projectId, program.programId);\n const tokenVaultPda = getTokenVaultPDA(projectPda, program.programId);\n\n return getMethods(program)\n .completeDistribution({ milestoneIndex: args.milestoneIndex })\n .accountsPartial({\n project: projectPda,\n tokenVault: tokenVaultPda,\n payer,\n })\n .rpc();\n}\n\n// =============================================================================\n// Exit Window Instructions\n// =============================================================================\n\n/**\n * Claim exit window refund during 3-failure voluntary exit window\n * Per whitepaper: 3 consecutive failures trigger 7-day voluntary exit window\n * Investors can claim proportional share of unreleased USDC escrow funds\n */\nexport async function claimExitWindowRefund(\n program: AnyProgram,\n args: {\n projectId: BN;\n nftMint: PublicKey;\n investorNftAccount: PublicKey;\n escrowTokenAccount: PublicKey;\n investorTokenAccount: PublicKey;\n milestoneAccounts?: PublicKey[];\n },\n investor: PublicKey\n): Promise<string> {\n const projectPda = getProjectPDA(args.projectId, program.programId);\n const investmentPda = getInvestmentPDA(projectPda, args.nftMint, program.programId);\n const escrowPda = getEscrowPDA(args.projectId, program.programId);\n\n const remainingAccounts = (args.milestoneAccounts || []).map((pubkey) => ({\n pubkey,\n isSigner: false,\n isWritable: false,\n }));\n\n return getMethods(program)\n .claimExitWindowRefund()\n .accountsPartial({\n project: projectPda,\n investment: investmentPda,\n nftMint: args.nftMint,\n investorNftAccount: args.investorNftAccount,\n escrowTokenAccount: args.escrowTokenAccount,\n investorTokenAccount: args.investorTokenAccount,\n escrowPda,\n investor,\n })\n .remainingAccounts(remainingAccounts)\n .rpc();\n}\n\n// =============================================================================\n// ZTM v2.0 Founder Vesting Instructions\n// =============================================================================\n\n/**\n * Initialize founder vesting after MAE (Market Access Event)\n *\n * ZTM v2.0: Creates FounderVesting PDA with vesting schedule from Tokenomics.\n * Must be called after project reaches Completed state (all milestones done).\n * Permissionless - anyone can pay to initialize.\n */\nexport async function initializeFounderVesting(\n program: AnyProgram,\n args: {\n projectId: BN;\n },\n payer: PublicKey\n): Promise<string> {\n const projectPda = getProjectPDA(args.projectId, program.programId);\n const tokenomicsPda = getTokenomicsPDA(projectPda, program.programId);\n const tokenVaultPda = getTokenVaultPDA(projectPda, program.programId);\n const founderVestingPda = getFounderVestingPDA(projectPda, program.programId);\n\n return getMethods(program)\n .initializeFounderVesting()\n .accountsPartial({\n project: projectPda,\n tokenomics: tokenomicsPda,\n tokenVault: tokenVaultPda,\n founderVesting: founderVestingPda,\n payer,\n systemProgram: SystemProgram.programId,\n })\n .rpc();\n}\n\n/**\n * Claim vested tokens from founder vault\n *\n * ZTM v2.0: Founder claims tokens based on linear vesting schedule.\n * Requires cliff period to pass before any tokens can be claimed.\n */\nexport async function claimVestedTokens(\n program: AnyProgram,\n args: {\n projectId: BN;\n /** Founder's token account to receive vested tokens */\n founderTokenAccount: PublicKey;\n },\n founder: PublicKey\n): Promise<string> {\n const projectPda = getProjectPDA(args.projectId, program.programId);\n const tokenVaultPda = getTokenVaultPDA(projectPda, program.programId);\n const founderVestingPda = getFounderVestingPDA(projectPda, program.programId);\n const founderVaultPda = getFounderVaultPDA(projectPda, program.programId);\n const vaultAuthorityPda = getVaultAuthorityPDA(projectPda, program.programId);\n\n return getMethods(program)\n .claimVestedTokens()\n .accountsPartial({\n project: projectPda,\n tokenVault: tokenVaultPda,\n founderVesting: founderVestingPda,\n founderVault: founderVaultPda,\n vaultAuthority: vaultAuthorityPda,\n founderTokenAccount: args.founderTokenAccount,\n founder,\n tokenProgram: TOKEN_PROGRAM_ID,\n })\n .rpc();\n}\n\n// =============================================================================\n// ZTM v2.0 Circuit Breaker Instructions\n// =============================================================================\n\n/**\n * Force complete a stuck distribution (admin only)\n *\n * ZTM v2.0: Circuit breaker for when token distribution is stuck for >7 days.\n * Marks distribution as complete so project can continue.\n * Affected investors can use claimMissedUnlock to get their tokens.\n */\nexport async function forceCompleteDistribution(\n program: AnyProgram,\n args: {\n projectId: BN;\n },\n adminKeypair: Keypair\n): Promise<string> {\n const projectPda = getProjectPDA(args.projectId, program.programId);\n const tokenVaultPda = getTokenVaultPDA(projectPda, program.programId);\n const adminConfigPda = getAdminConfigPDA(program.programId);\n\n return getMethods(program)\n .forceCompleteDistribution()\n .accountsPartial({\n admin: adminKeypair.publicKey,\n adminConfig: adminConfigPda,\n project: projectPda,\n tokenVault: tokenVaultPda,\n })\n .signers([adminKeypair])\n .rpc();\n}\n\n/**\n * Claim missed token unlock after force-complete distribution\n *\n * ZTM v2.0: Allows investors to claim tokens they missed during a stuck\n * distribution that was force-completed by admin.\n */\nexport async function claimMissedUnlock(\n program: AnyProgram,\n args: {\n projectId: BN;\n nftMint: PublicKey;\n /** Milestone index to claim for */\n milestoneIndex: number;\n /** Claimer's token account to receive tokens */\n claimerTokenAccount: PublicKey;\n },\n claimer: PublicKey\n): Promise<string> {\n const nftMintPubkey = ensurePublicKey(args.nftMint);\n const projectPda = getProjectPDA(args.projectId, program.programId);\n const tokenVaultPda = getTokenVaultPDA(projectPda, program.programId);\n const investmentPda = getInvestmentPDA(projectPda, nftMintPubkey, program.programId);\n const investorVaultPda = getInvestorVaultPDA(projectPda, program.programId);\n const vaultAuthorityPda = getVaultAuthorityPDA(projectPda, program.programId);\n\n // Get claimer's NFT token account (ATA)\n const claimerNftAccount = getAssociatedTokenAddressSync(\n nftMintPubkey,\n claimer,\n false,\n TOKEN_PROGRAM_ID\n );\n\n return getMethods(program)\n .claimMissedUnlock({ milestoneIndex: args.milestoneIndex })\n .accountsPartial({\n claimer,\n project: projectPda,\n tokenVault: tokenVaultPda,\n investment: investmentPda,\n nftMint: nftMintPubkey,\n claimerNftAccount,\n investorVault: investorVaultPda,\n claimerTokenAccount: args.claimerTokenAccount,\n vaultAuthority: vaultAuthorityPda,\n tokenProgram: TOKEN_PROGRAM_ID,\n })\n .rpc();\n}\n\n// =============================================================================\n// Dynamic Tokenomics Instructions\n// =============================================================================\n\nimport {\n getAllocationProposalPDA,\n getAllocationVotePDA,\n} from '../pdas/index.js';\n\n/**\n * Add a sub-allocation from the reserve pool (Draft state only)\n *\n * Allows founders to add named allocations (advisors, marketing, etc.)\n * from their reserve pool before submitting for approval.\n *\n * @param name - Sub-allocation name (1-32 ASCII chars)\n * @param bps - Basis points from reserve pool\n * @param recipient - Token destination wallet\n * @param vestingMonths - Vesting duration (0 = immediate)\n * @param cliffMonths - Cliff period before vesting starts\n */\nexport async function addSubAllocation(\n program: AnyProgram,\n args: {\n projectId: BN;\n name: string;\n bps: number;\n recipient: PublicKey;\n vestingMonths: number;\n cliffMonths: number;\n },\n founder: PublicKey\n): Promise<string> {\n const projectPda = getProjectPDA(args.projectId, program.programId);\n const tokenomicsPda = getTokenomicsPDA(projectPda, program.programId);\n\n return getMethods(program)\n .addSubAllocation({\n name: args.name,\n bps: args.bps,\n recipient: args.recipient,\n vestingMonths: args.vestingMonths,\n cliffMonths: args.cliffMonths,\n })\n .accountsPartial({\n project: projectPda,\n tokenomics: tokenomicsPda,\n founder,\n })\n .rpc();\n}\n\n/**\n * Propose an allocation change via governance (post-Draft states)\n *\n * Creates a 7-day voting period for investors to approve/reject\n * a new sub-allocation from the reserve pool.\n */\nexport async function proposeAllocationChange(\n program: AnyProgram,\n args: {\n projectId: BN;\n name: string;\n bps: number;\n recipient: PublicKey;\n vestingMonths: number;\n cliffMonths: number;\n },\n founder: PublicKey\n): Promise<string> {\n const projectPda = getProjectPDA(args.projectId, program.programId);\n const tokenomicsPda = getTokenomicsPDA(projectPda, program.programId);\n\n // Fetch tokenomics to get current proposal_count\n const tokenomics = await getAccountNamespace(program).tokenomics.fetch(tokenomicsPda);\n const proposalIndex = tokenomics.proposalCount || 0;\n const proposalPda = getAllocationProposalPDA(projectPda, proposalIndex, program.programId);\n\n return getMethods(program)\n .proposeAllocationChange({\n name: args.name,\n bps: args.bps,\n recipient: args.recipient,\n vestingMonths: args.vestingMonths,\n cliffMonths: args.cliffMonths,\n })\n .accountsPartial({\n project: projectPda,\n tokenomics: tokenomicsPda,\n proposal: proposalPda,\n founder,\n systemProgram: SystemProgram.programId,\n })\n .rpc();\n}\n\n/**\n * Vote on an allocation change proposal\n *\n * Investors can vote for/against using their Investment NFT.\n * Must meet 7-day hold period for voting eligibility.\n * One vote per NFT (prevents double voting).\n */\nexport async function voteAllocationChange(\n program: AnyProgram,\n args: {\n projectId: BN;\n proposalIndex: number;\n nftMint: PublicKey;\n voteFor: boolean;\n },\n voter: PublicKey\n): Promise<string> {\n const nftMintPubkey = ensurePublicKey(args.nftMint);\n const projectPda = getProjectPDA(args.projectId, program.programId);\n const proposalPda = getAllocationProposalPDA(projectPda, args.proposalIndex, program.programId);\n const investmentPda = getInvestmentPDA(projectPda, nftMintPubkey, program.programId);\n const votePda = getAllocationVotePDA(proposalPda, nftMintPubkey, program.programId);\n\n // Get voter's NFT token account (ATA)\n const investorNftAccount = getAssociatedTokenAddressSync(\n nftMintPubkey,\n voter,\n false,\n TOKEN_PROGRAM_ID\n );\n\n return getMethods(program)\n .voteAllocationChange({ voteFor: args.voteFor })\n .accountsPartial({\n project: projectPda,\n proposal: proposalPda,\n investment: investmentPda,\n nftMint: nftMintPubkey,\n investorNftAccount,\n voteRecord: votePda,\n voter,\n systemProgram: SystemProgram.programId,\n })\n .rpc();\n}\n\n/**\n * Execute an approved allocation change proposal\n *\n * Permissionless - anyone can call after voting ends.\n * Proposal must have passed (>51% approval).\n * Adds the sub-allocation to tokenomics.\n */\nexport async function executeAllocationChange(\n program: AnyProgram,\n args: {\n projectId: BN;\n proposalIndex: number;\n },\n executor: PublicKey\n): Promise<string> {\n const projectPda = getProjectPDA(args.projectId, program.programId);\n const tokenomicsPda = getTokenomicsPDA(projectPda, program.programId);\n const proposalPda = getAllocationProposalPDA(projectPda, args.proposalIndex, program.programId);\n\n return getMethods(program)\n .executeAllocationChange()\n .accountsPartial({\n project: projectPda,\n tokenomics: tokenomicsPda,\n proposal: proposalPda,\n executor,\n })\n .rpc();\n}\n\n// =============================================================================\n// Early Token Release Instructions\n// =============================================================================\n\n/**\n * Claim early tokens as an investor (5% of token allocation)\n *\n * Early Token Release: Investors can claim 5% of their token allocation\n * 24 hours after investing. These tokens are fully liquid immediately.\n *\n * Prerequisites:\n * - 24h cooling period must have passed since investment\n * - Investment must not have already claimed early tokens\n * - Investment must have active voting rights (not withdrawn from pivot)\n *\n * @param nftMint - The NFT mint that proves investment ownership\n * @param investorTokenAccount - Investor's token account to receive claimed tokens\n */\nexport async function claimEarlyTokens(\n program: AnyProgram,\n args: {\n projectId: BN;\n /** NFT mint that proves investment ownership */\n nftMint: PublicKey;\n /** Investor's token account to receive claimed tokens */\n investorTokenAccount: PublicKey;\n },\n investor: PublicKey\n): Promise<string> {\n const nftMintPubkey = ensurePublicKey(args.nftMint);\n const projectPda = getProjectPDA(args.projectId, program.programId);\n const tokenVaultPda = getTokenVaultPDA(projectPda, program.programId);\n const investmentPda = getInvestmentPDA(projectPda, nftMintPubkey, program.programId);\n const investorVaultPda = getInvestorVaultPDA(projectPda, program.programId);\n const vaultAuthorityPda = getVaultAuthorityPDA(projectPda, program.programId);\n\n // Get investor's NFT token account (ATA)\n const investorNftAccount = getAssociatedTokenAddressSync(\n nftMintPubkey,\n investor,\n false,\n TOKEN_PROGRAM_ID\n );\n\n return getMethods(program)\n .claimEarlyTokens()\n .accountsPartial({\n investor,\n project: projectPda,\n tokenVault: tokenVaultPda,\n investment: investmentPda,\n nftMint: nftMintPubkey,\n investorNftAccount,\n investorVault: investorVaultPda,\n investorTokenAccount: args.investorTokenAccount,\n vaultAuthority: vaultAuthorityPda,\n tokenProgram: TOKEN_PROGRAM_ID,\n })\n .rpc();\n}\n\n/**\n * Claim early tokens as a founder (5% of founder allocation)\n *\n * Early Token Release: Founders can claim 5% of their token allocation\n * when the project becomes Funded. These tokens are fully liquid immediately.\n *\n * Prerequisites:\n * - Project must be in Funded, InProgress, or Completed state\n * - Founder must not have already claimed early tokens\n * - Founder allocation must be configured in tokenomics\n *\n * @param founderTokenAccount - Founder's token account to receive claimed tokens\n */\nexport async function claimFounderEarlyTokens(\n program: AnyProgram,\n args: {\n projectId: BN;\n /** Founder's token account to receive claimed tokens */\n founderTokenAccount: PublicKey;\n },\n founder: PublicKey\n): Promise<string> {\n const projectPda = getProjectPDA(args.projectId, program.programId);\n const tokenomicsPda = getTokenomicsPDA(projectPda, program.programId);\n const tokenVaultPda = getTokenVaultPDA(projectPda, program.programId);\n const founderVaultPda = getFounderVaultPDA(projectPda, program.programId);\n const vaultAuthorityPda = getVaultAuthorityPDA(projectPda, program.programId);\n\n return getMethods(program)\n .claimFounderEarlyTokens()\n .accountsPartial({\n founder,\n project: projectPda,\n tokenomics: tokenomicsPda,\n tokenVault: tokenVaultPda,\n founderVault: founderVaultPda,\n founderTokenAccount: args.founderTokenAccount,\n vaultAuthority: vaultAuthorityPda,\n tokenProgram: TOKEN_PROGRAM_ID,\n })\n .rpc();\n}\n\n/**\n * Claim founder milestone-based tokens for a specific milestone\n *\n * Early Token Release: Founders can claim their milestone-based portion\n * (default 47.5% of founder allocation) when milestones are unlocked.\n * Amount per milestone = milestone_tokens * milestone_percentage / 100\n *\n * Prerequisites:\n * - Milestone must be in Unlocked state\n * - Founder must not have already claimed tokens for this milestone\n * - Founder milestone vesting must be configured in tokenomics\n *\n * @param milestoneIndex - The milestone index to claim tokens from\n * @param founderTokenAccount - Founder's token account to receive claimed tokens\n */\nexport async function claimFounderMilestoneTokens(\n program: AnyProgram,\n args: {\n projectId: BN;\n /** Milestone index to claim tokens from */\n milestoneIndex: number;\n /** Founder's token account to receive claimed tokens */\n founderTokenAccount: PublicKey;\n },\n founder: PublicKey\n): Promise<string> {\n const projectPda = getProjectPDA(args.projectId, program.programId);\n const milestonePda = getMilestonePDA(projectPda, args.milestoneIndex, program.programId);\n const tokenomicsPda = getTokenomicsPDA(projectPda, program.programId);\n const tokenVaultPda = getTokenVaultPDA(projectPda, program.programId);\n const founderVaultPda = getFounderVaultPDA(projectPda, program.programId);\n const vaultAuthorityPda = getVaultAuthorityPDA(projectPda, program.programId);\n\n return getMethods(program)\n .claimFounderMilestoneTokens({ milestoneIndex: args.milestoneIndex })\n .accountsPartial({\n founder,\n project: projectPda,\n milestone: milestonePda,\n tokenomics: tokenomicsPda,\n tokenVault: tokenVaultPda,\n founderVault: founderVaultPda,\n founderTokenAccount: args.founderTokenAccount,\n vaultAuthority: vaultAuthorityPda,\n tokenProgram: TOKEN_PROGRAM_ID,\n })\n .rpc();\n}\n\n// =============================================================================\n// Sub-Allocation Vesting Instructions\n// =============================================================================\n\n/**\n * Initialize sub-allocation vesting after MAE (Market Access Event)\n *\n * Creates SubAllocationVesting PDA for a specific sub-allocation ID.\n * Project must be in Completed state with MAE completed.\n * Permissionless - anyone can pay to initialize.\n *\n * @param subAllocationId - Sub-allocation ID to initialize vesting for (0-9)\n */\nexport async function initializeSubAllocationVesting(\n program: AnyProgram,\n args: {\n projectId: BN;\n /** Sub-allocation ID to initialize vesting for */\n subAllocationId: number;\n },\n payer: PublicKey\n): Promise<string> {\n const projectPda = getProjectPDA(args.projectId, program.programId);\n const tokenomicsPda = getTokenomicsPDA(projectPda, program.programId);\n const tokenVaultPda = getTokenVaultPDA(projectPda, program.programId);\n const subAllocationVestingPda = getSubAllocationVestingPDA(projectPda, args.subAllocationId, program.programId);\n\n return getMethods(program)\n .initializeSubAllocationVesting({ subAllocationId: args.subAllocationId })\n .accountsPartial({\n project: projectPda,\n tokenomics: tokenomicsPda,\n tokenVault: tokenVaultPda,\n subAllocationVesting: subAllocationVestingPda,\n payer,\n systemProgram: SystemProgram.programId,\n })\n .rpc();\n}\n\n/**\n * Claim vested tokens from a sub-allocation\n *\n * Only the designated recipient wallet can claim tokens.\n * Project must be Completed and MAE must be completed.\n * Calculates claimable amount based on cliff + linear vesting schedule.\n *\n * @param subAllocationId - Sub-allocation ID to claim from (0-9)\n * @param recipientTokenAccount - Recipient's token account to receive claimed tokens\n */\nexport async function claimSubAllocationTokens(\n program: AnyProgram,\n args: {\n projectId: BN;\n /** Sub-allocation ID to claim from */\n subAllocationId: number;\n /** Recipient's token account to receive claimed tokens */\n recipientTokenAccount: PublicKey;\n },\n recipient: PublicKey\n): Promise<string> {\n const projectPda = getProjectPDA(args.projectId, program.programId);\n const tokenomicsPda = getTokenomicsPDA(projectPda, program.programId);\n const tokenVaultPda = getTokenVaultPDA(projectPda, program.programId);\n const subAllocationVestingPda = getSubAllocationVestingPDA(projectPda, args.subAllocationId, program.programId);\n const treasuryVaultPda = getTreasuryVaultPDA(projectPda, program.programId);\n const vaultAuthorityPda = getVaultAuthorityPDA(projectPda, program.programId);\n\n return getMethods(program)\n .claimSubAllocationTokens({ subAllocationId: args.subAllocationId })\n .accountsPartial({\n project: projectPda,\n tokenomics: tokenomicsPda,\n tokenVault: tokenVaultPda,\n subAllocationVesting: subAllocationVestingPda,\n reserveVault: treasuryVaultPda,\n vaultAuthority: vaultAuthorityPda,\n recipientTokenAccount: args.recipientTokenAccount,\n recipient,\n tokenProgram: TOKEN_PROGRAM_ID,\n })\n .rpc();\n}\n\n// =============================================================================\n// Per-Milestone Vesting Instructions (add-per-milestone-vesting)\n// =============================================================================\n\n/**\n * Claim instant tokens for a passed milestone (investor)\n *\n * Per-milestone vesting: Investors claim the instant portion (e.g., 5-50%)\n * immediately when a milestone passes. Creates vesting PDA on first claim.\n *\n * Prerequisites:\n * - Milestone must be in Passed or Unlocked state\n * - Milestone must use per-milestone vesting (instant_release_bps < 10000)\n * - Investor must hold the NFT proving ownership\n *\n * @param milestoneIndex - The milestone index to claim tokens from\n * @param nftMint - The NFT mint proving investment ownership\n * @param investorTokenAccount - Investor's token account to receive claimed tokens\n */\nexport async function claimMilestoneInstantTokens(\n program: AnyProgram,\n args: {\n projectId: BN;\n /** Milestone index to claim instant tokens from */\n milestoneIndex: number;\n /** NFT mint that proves investment ownership */\n nftMint: PublicKey;\n /** Investor's token account to receive claimed tokens */\n investorTokenAccount: PublicKey;\n },\n investor: PublicKey\n): Promise<string> {\n const nftMintPubkey = ensurePublicKey(args.nftMint);\n const projectPda = getProjectPDA(args.projectId, program.programId);\n const milestonePda = getMilestonePDA(projectPda, args.milestoneIndex, program.programId);\n const investmentPda = getInvestmentPDA(projectPda, nftMintPubkey, program.programId);\n const tokenVaultPda = getTokenVaultPDA(projectPda, program.programId);\n const vestingPda = getInvestorMilestoneVestingPDA(projectPda, args.milestoneIndex, investmentPda, program.programId);\n const investorVaultPda = getInvestorVaultPDA(projectPda, program.programId);\n const vaultAuthorityPda = getVaultAuthorityPDA(projectPda, program.programId);\n\n // Get investor's NFT token account (ATA)\n const investorNftAccount = getAssociatedTokenAddressSync(\n nftMintPubkey,\n investor,\n false,\n TOKEN_PROGRAM_ID\n );\n\n return getMethods(program)\n .claimMilestoneInstantTokens({ milestoneIndex: args.milestoneIndex })\n .accountsPartial({\n investor,\n project: projectPda,\n milestone: milestonePda,\n investment: investmentPda,\n tokenVault: tokenVaultPda,\n vesting: vestingPda,\n nftMint: nftMintPubkey,\n investorNftAccount,\n investorVault: investorVaultPda,\n investorTokenAccount: args.investorTokenAccount,\n vaultAuthority: vaultAuthorityPda,\n tokenProgram: TOKEN_PROGRAM_ID,\n systemProgram: SystemProgram.programId,\n })\n .rpc();\n}\n\n/**\n * Claim vested tokens for a milestone after cliff period (investor)\n *\n * Per-milestone vesting: Investors claim vested tokens linearly after\n * the cliff period passes. Must have already claimed instant tokens\n * to initialize the vesting PDA.\n *\n * Prerequisites:\n * - Vesting PDA must exist (created by claimMilestoneInstantTokens)\n * - Cliff period must have passed\n * - Investor must hold the NFT proving ownership\n *\n * @param milestoneIndex - The milestone index to claim vested tokens from\n * @param nftMint - The NFT mint proving investment ownership\n * @param investorTokenAccount - Investor's token account to receive claimed tokens\n */\nexport async function claimMilestoneVestedTokens(\n program: AnyProgram,\n args: {\n projectId: BN;\n /** Milestone index to claim vested tokens from */\n milestoneIndex: number;\n /** NFT mint that proves investment ownership */\n nftMint: PublicKey;\n /** Investor's token account to receive claimed tokens */\n investorTokenAccount: PublicKey;\n },\n investor: PublicKey\n): Promise<string> {\n const nftMintPubkey = ensurePublicKey(args.nftMint);\n const projectPda = getProjectPDA(args.projectId, program.programId);\n const milestonePda = getMilestonePDA(projectPda, args.milestoneIndex, program.programId);\n const investmentPda = getInvestmentPDA(projectPda, nftMintPubkey, program.programId);\n const tokenVaultPda = getTokenVaultPDA(projectPda, program.programId);\n const vestingPda = getInvestorMilestoneVestingPDA(projectPda, args.milestoneIndex, investmentPda, program.programId);\n const investorVaultPda = getInvestorVaultPDA(projectPda, program.programId);\n const vaultAuthorityPda = getVaultAuthorityPDA(projectPda, program.programId);\n\n // Get investor's NFT token account (ATA)\n const investorNftAccount = getAssociatedTokenAddressSync(\n nftMintPubkey,\n investor,\n false,\n TOKEN_PROGRAM_ID\n );\n\n return getMethods(program)\n .claimMilestoneVestedTokens({ milestoneIndex: args.milestoneIndex })\n .accountsPartial({\n investor,\n project: projectPda,\n milestone: milestonePda,\n investment: investmentPda,\n tokenVault: tokenVaultPda,\n vesting: vestingPda,\n nftMint: nftMintPubkey,\n investorNftAccount,\n investorVault: investorVaultPda,\n investorTokenAccount: args.investorTokenAccount,\n vaultAuthority: vaultAuthorityPda,\n tokenProgram: TOKEN_PROGRAM_ID,\n })\n .rpc();\n}\n\n/**\n * Claim instant tokens for a passed milestone (founder)\n *\n * Per-milestone vesting: Founders claim the instant portion (e.g., 5-50%)\n * of their milestone-based allocation when a milestone passes.\n * Creates vesting PDA on first claim.\n *\n * Prerequisites:\n * - Milestone must be in Passed or Unlocked state\n * - Milestone must use per-milestone vesting (instant_release_bps < 10000)\n * - Founder must have milestone-based allocation configured\n * - Caller must be the project founder\n *\n * @param milestoneIndex - The milestone index to claim tokens from\n * @param founderTokenAccount - Founder's token account to receive claimed tokens\n */\nexport async function claimFounderMsInstantTokens(\n program: AnyProgram,\n args: {\n projectId: BN;\n /** Milestone index to claim instant tokens from */\n milestoneIndex: number;\n /** Founder's token account to receive claimed tokens */\n founderTokenAccount: PublicKey;\n },\n founder: PublicKey\n): Promise<string> {\n const projectPda = getProjectPDA(args.projectId, program.programId);\n const milestonePda = getMilestonePDA(projectPda, args.milestoneIndex, program.programId);\n const tokenomicsPda = getTokenomicsPDA(projectPda, program.programId);\n const tokenVaultPda = getTokenVaultPDA(projectPda, program.programId);\n const vestingPda = getFounderMilestoneVestingPDA(projectPda, args.milestoneIndex, program.programId);\n const founderVaultPda = getFounderVaultPDA(projectPda, program.programId);\n const vaultAuthorityPda = getVaultAuthorityPDA(projectPda, program.programId);\n\n return getMethods(program)\n .claimFounderMsInstantTokens({ milestoneIndex: args.milestoneIndex })\n .accountsPartial({\n founder,\n project: projectPda,\n tokenomics: tokenomicsPda,\n milestone: milestonePda,\n tokenVault: tokenVaultPda,\n vesting: vestingPda,\n founderVault: founderVaultPda,\n founderTokenAccount: args.founderTokenAccount,\n vaultAuthority: vaultAuthorityPda,\n tokenProgram: TOKEN_PROGRAM_ID,\n systemProgram: SystemProgram.programId,\n })\n .rpc();\n}\n\n/**\n * Claim vested tokens for a milestone after cliff period (founder)\n *\n * Per-milestone vesting: Founders claim vested tokens linearly after\n * the cliff period passes. Must have already claimed instant tokens\n * to initialize the vesting PDA.\n *\n * Prerequisites:\n * - Vesting PDA must exist (created by claimFounderMsInstantTokens)\n * - Cliff period must have passed\n * - Caller must be the project founder\n *\n * @param milestoneIndex - The milestone index to claim vested tokens from\n * @param founderTokenAccount - Founder's token account to receive claimed tokens\n */\nexport async function claimFounderMsVestedTokens(\n program: AnyProgram,\n args: {\n projectId: BN;\n /** Milestone index to claim vested tokens from */\n milestoneIndex: number;\n /** Founder's token account to receive claimed tokens */\n founderTokenAccount: PublicKey;\n },\n founder: PublicKey\n): Promise<string> {\n const projectPda = getProjectPDA(args.projectId, program.programId);\n const tokenVaultPda = getTokenVaultPDA(projectPda, program.programId);\n const vestingPda = getFounderMilestoneVestingPDA(projectPda, args.milestoneIndex, program.programId);\n const founderVaultPda = getFounderVaultPDA(projectPda, program.programId);\n const vaultAuthorityPda = getVaultAuthorityPDA(projectPda, program.programId);\n\n return getMethods(program)\n .claimFounderMsVestedTokens({ milestoneIndex: args.milestoneIndex })\n .accountsPartial({\n founder,\n project: projectPda,\n tokenVault: tokenVaultPda,\n vesting: vestingPda,\n founderVault: founderVaultPda,\n founderTokenAccount: args.founderTokenAccount,\n vaultAuthority: vaultAuthorityPda,\n tokenProgram: TOKEN_PROGRAM_ID,\n })\n .rpc();\n}\n\n// =============================================================================\n// Multi-Round Fundraising Instructions (add-second-round-fundraising)\n// =============================================================================\n\n/**\n * TierConfig input type for openFundingRound\n */\ninterface RoundTierConfigInput {\n /** USDC amount per lot */\n amount: BN;\n /** Maximum lots available */\n maxLots: number;\n /** Token allocation per $1 invested */\n tokenRatio: BN;\n}\n\n/**\n * Milestone configuration for new funding round\n */\ninterface RoundMilestoneConfigInput {\n /** Percentage of funding_goal (1-100) */\n percentage: number;\n /** Milestone description (max 32 chars) */\n description: string;\n /** Vesting duration in months (6-24, 0 = instant unlock) */\n vestingDurationMonths?: number | null;\n /** Cliff duration in months (0-3) */\n cliffMonths?: number | null;\n /** Instant release basis points (500-5000) */\n instantReleaseBps?: number | null;\n}\n\n/**\n * Derive Round Escrow Authority PDA\n */\nfunction getRoundEscrowAuthorityPDA(\n projectPda: PublicKey,\n roundNumber: number,\n programId: PublicKey\n): [PublicKey, number] {\n return PublicKey.findProgramAddressSync(\n [\n Buffer.from('round_escrow'),\n projectPda.toBuffer(),\n Buffer.from([roundNumber]),\n Buffer.from('authority'),\n ],\n programId\n );\n}\n\n/**\n * Open a new funding round (R2, R3, R4...)\n *\n * Multi-Round Fundraising: Creates FundingRound PDA, round escrow,\n * and milestone PDAs for the new round. Tokens come from FutureRoundVault.\n *\n * Prerequisites:\n * - Project must be InProgress or Completed state\n * - At least 1 milestone must have passed (for InProgress projects)\n * - No other round currently Open\n * - Current round must be fully funded before opening next\n * - Must have future_round_allocation configured in tokenomics\n *\n * @param roundAllocationBps - BPS from future_round_allocation to use (e.g., 1000 = 10%)\n * @param fundingGoal - USDC funding goal for this round\n * @param tiers - Tier configuration (1-10 tiers)\n * @param milestones - Milestone configuration (2-10 milestones, sum to 100%)\n * @param previousFundingRoundPda - Previous round PDA (required for R3+)\n */\nexport async function openFundingRound(\n program: AnyProgram,\n args: {\n projectId: BN;\n /** BPS from future_round_allocation to use (e.g., 1000 = 10%) */\n roundAllocationBps: number;\n /** USDC funding goal for this round */\n fundingGoal: BN;\n /** Tier configuration (1-10 tiers) */\n tiers: RoundTierConfigInput[];\n /** Milestone configuration (2-10 milestones) */\n milestones: RoundMilestoneConfigInput[];\n /** USDC mint address */\n usdcMint: PublicKey;\n /** Previous funding round PDA (required for R3+, optional for R2) */\n previousFundingRoundPda?: PublicKey | null;\n },\n founder: PublicKey\n): Promise<string> {\n const projectPda = getProjectPDA(args.projectId, program.programId);\n const tokenomicsPda = getTokenomicsPDA(projectPda, program.programId);\n\n // Fetch project to get round_count\n const project = await getAccountNamespace(program).project.fetch(projectPda);\n const newRoundNumber = (project.roundCount || 1) + 1;\n\n // Derive new round PDAs\n const fundingRoundPda = getFundingRoundPDA(projectPda, newRoundNumber, program.programId);\n const roundEscrowPda = getRoundEscrowPDA(projectPda, newRoundNumber, program.programId);\n const [roundEscrowAuthorityPda] = getRoundEscrowAuthorityPDA(projectPda, newRoundNumber, program.programId);\n\n // Build milestone PDAs as remaining accounts\n const remainingAccounts = args.milestones.map((_, i) => {\n const milestonePda = getRoundMilestonePDA(projectPda, newRoundNumber, i, program.programId);\n return {\n pubkey: milestonePda,\n isSigner: false,\n isWritable: true,\n };\n });\n\n // Transform milestones for instruction\n const milestonesParam = args.milestones.map((m) => ({\n percentage: m.percentage,\n description: m.description,\n vestingDurationMonths: m.vestingDurationMonths ?? null,\n cliffMonths: m.cliffMonths ?? null,\n instantReleaseBps: m.instantReleaseBps ?? null,\n }));\n\n return getMethods(program)\n .openFundingRound({\n roundAllocationBps: args.roundAllocationBps,\n fundingGoal: args.fundingGoal,\n tiers: args.tiers,\n milestones: milestonesParam,\n })\n .accountsPartial({\n project: projectPda,\n tokenomics: tokenomicsPda,\n fundingRound: fundingRoundPda,\n roundEscrow: roundEscrowPda,\n roundEscrowAuthority: roundEscrowAuthorityPda,\n usdcMint: args.usdcMint,\n previousFundingRound: args.previousFundingRoundPda ?? null,\n founder,\n tokenProgram: TOKEN_PROGRAM_ID,\n systemProgram: SystemProgram.programId,\n rent: SYSVAR_RENT_PUBKEY,\n })\n .remainingAccounts(remainingAccounts)\n .rpc();\n}\n\n/**\n * Invest in a funding round (R2, R3, R4...)\n *\n * Multi-Round Fundraising: Creates investment NFT and deposits USDC\n * to the round-specific escrow. Tokens come from FutureRoundVault.\n *\n * @param roundNumber - Round number to invest in (2, 3, 4...)\n * @param amount - USDC amount to invest\n * @param investorTokenAccount - Investor's USDC token account\n * @param investmentCount - Current investment count from FundingRound\n */\nexport async function investInRound(\n program: AnyProgram,\n args: {\n projectId: BN;\n /** Round number to invest in */\n roundNumber: number;\n /** USDC amount to invest */\n amount: BN;\n /** Investor's USDC token account */\n investorTokenAccount: PublicKey;\n /** Current investment count from FundingRound */\n investmentCount: number;\n },\n investor: PublicKey\n): Promise<string> {\n const projectPda = getProjectPDA(args.projectId, program.programId);\n const fundingRoundPda = getFundingRoundPDA(projectPda, args.roundNumber, program.programId);\n const roundEscrowPda = getRoundEscrowPDA(projectPda, args.roundNumber, program.programId);\n\n // Derive first round milestone PDA (for state transition when funded)\n const firstRoundMilestonePda = getRoundMilestonePDA(projectPda, args.roundNumber, 0, program.programId);\n\n // Derive NFT mint PDA with round number\n const [nftMint] = getRoundNftMintPDA(args.projectId, args.roundNumber, investor, args.investmentCount, program.programId);\n\n // Derive investment PDA with round number\n const investmentPda = getRoundInvestmentPDA(projectPda, args.roundNumber, nftMint, program.programId);\n\n // Derive investor's NFT token account (ATA)\n const investorNftAccount = getAssociatedTokenAddressSync(nftMint, investor);\n\n // Derive Metaplex metadata and master edition PDAs\n const metadataAccount = getMetadataPDA(nftMint);\n const masterEdition = getMasterEditionPDA(nftMint);\n\n // Derive program authority PDA\n const [programAuthority] = getProgramAuthorityPDA(program.programId);\n\n // Add compute budget for NFT minting\n return getMethods(program)\n .investInRound({ amount: args.amount })\n .accountsPartial({\n project: projectPda,\n fundingRound: fundingRoundPda,\n firstRoundMilestone: firstRoundMilestonePda,\n nftMint: nftMint,\n investment: investmentPda,\n investorNftAccount: investorNftAccount,\n metadataAccount: metadataAccount,\n masterEdition: masterEdition,\n roundEscrow: roundEscrowPda,\n investorTokenAccount: args.investorTokenAccount,\n programAuthority: programAuthority,\n investor,\n tokenProgram: TOKEN_PROGRAM_ID,\n associatedTokenProgram: ASSOCIATED_TOKEN_PROGRAM_ID,\n systemProgram: SystemProgram.programId,\n rent: SYSVAR_RENT_PUBKEY,\n tokenMetadataProgram: TOKEN_METADATA_PROGRAM_ID,\n sysvarInstructions: SYSVAR_INSTRUCTIONS_PUBKEY,\n })\n .preInstructions([\n ComputeBudgetProgram.setComputeUnitLimit({ units: 400_000 }),\n ])\n .rpc();\n}\n\n/**\n * Cancel round investment within 24-hour cooling-off period\n *\n * Multi-Round Fundraising: Returns USDC from round escrow,\n * closes investment account.\n */\nexport async function cancelRoundInvestment(\n program: AnyProgram,\n args: {\n projectId: BN;\n /** Round number of the investment */\n roundNumber: number;\n /** NFT mint of the investment */\n nftMint: PublicKey;\n /** Investor's NFT token account */\n investorNftAccount: PublicKey;\n /** Investor's USDC token account for refund */\n investorUsdcAccount: PublicKey;\n },\n investor: PublicKey\n): Promise<string> {\n const nftMintPubkey = ensurePublicKey(args.nftMint);\n const projectPda = getProjectPDA(args.projectId, program.programId);\n const fundingRoundPda = getFundingRoundPDA(projectPda, args.roundNumber, program.programId);\n const investmentPda = getRoundInvestmentPDA(projectPda, args.roundNumber, nftMintPubkey, program.programId);\n const roundEscrowPda = getRoundEscrowPDA(projectPda, args.roundNumber, program.programId);\n const [roundEscrowAuthorityPda] = getRoundEscrowAuthorityPDA(projectPda, args.roundNumber, program.programId);\n\n return getMethods(program)\n .cancelRoundInvestment()\n .accountsPartial({\n investor,\n project: projectPda,\n fundingRound: fundingRoundPda,\n investment: investmentPda,\n nftMint: nftMintPubkey,\n investorNftAccount: args.investorNftAccount,\n roundEscrow: roundEscrowPda,\n roundEscrowAuthority: roundEscrowAuthorityPda,\n investorUsdcAccount: args.investorUsdcAccount,\n tokenProgram: TOKEN_PROGRAM_ID,\n })\n .rpc();\n}\n\n/**\n * Submit round milestone for investor review\n *\n * Multi-Round Fundraising: Transitions milestone to UnderReview,\n * sets voting deadline.\n */\nexport async function submitRoundMilestone(\n program: AnyProgram,\n args: {\n projectId: BN;\n /** Round number */\n roundNumber: number;\n /** Milestone index to submit */\n milestoneIndex: number;\n },\n founder: PublicKey\n): Promise<string> {\n const projectPda = getProjectPDA(args.projectId, program.programId);\n const fundingRoundPda = getFundingRoundPDA(projectPda, args.roundNumber, program.programId);\n const milestonePda = getRoundMilestonePDA(projectPda, args.roundNumber, args.milestoneIndex, program.programId);\n\n return getMethods(program)\n .submitRoundMilestone()\n .accountsPartial({\n founder,\n project: projectPda,\n fundingRound: fundingRoundPda,\n milestone: milestonePda,\n clock: SYSVAR_CLOCK_PUBKEY,\n })\n .rpc();\n}\n\n/**\n * Vote on a round milestone (unified voting - ANY investor can vote)\n *\n * Multi-Round Fundraising: R1, R2, R3... investors can all vote\n * on any round's milestones. Investment can be from any round.\n *\n * @param roundNumber - Round number of the milestone being voted on\n * @param milestoneIndex - Milestone index to vote on\n * @param nftMint - Voter's NFT mint (can be from any round)\n * @param choice - Vote choice (good or bad)\n * @param investmentRoundNumber - Round number of the voter's investment\n */\nexport async function voteOnRoundMilestone(\n program: AnyProgram,\n args: {\n projectId: BN;\n /** Round number of the milestone being voted on */\n roundNumber: number;\n /** Milestone index to vote on */\n milestoneIndex: number;\n /** Voter's NFT mint (can be from any round) */\n nftMint: PublicKey | string;\n /** Vote choice */\n choice: { good: object } | { bad: object };\n /** Round number of the voter's investment (for PDA derivation) */\n investmentRoundNumber: number;\n },\n voter: PublicKey\n): Promise<string> {\n const nftMintPubkey = ensurePublicKey(args.nftMint);\n const projectPda = getProjectPDA(args.projectId, program.programId);\n const fundingRoundPda = getFundingRoundPDA(projectPda, args.roundNumber, program.programId);\n const milestonePda = getRoundMilestonePDA(projectPda, args.roundNumber, args.milestoneIndex, program.programId);\n\n // Investment can be from any round (unified voting)\n let investmentPda: PublicKey;\n if (args.investmentRoundNumber === 1) {\n // R1 investments use standard PDA without round number\n investmentPda = getInvestmentPDA(projectPda, nftMintPubkey, program.programId);\n } else {\n // R2+ investments include round number\n investmentPda = getRoundInvestmentPDA(projectPda, args.investmentRoundNumber, nftMintPubkey, program.programId);\n }\n\n // Fetch milestone to get current voting_round for vote PDA derivation\n const milestone = await getAccountNamespace(program).milestone.fetch(milestonePda);\n const votingRound = milestone.votingRound ?? 0;\n const votePda = getVotePDA(milestonePda, voter, votingRound, program.programId);\n\n // Get voter's NFT token account (ATA)\n const voterNftAccount = getAssociatedTokenAddressSync(\n nftMintPubkey,\n voter,\n false,\n TOKEN_PROGRAM_ID\n );\n\n return getMethods(program)\n .voteOnRoundMilestone({ choice: args.choice })\n .accountsPartial({\n vote: votePda,\n project: projectPda,\n fundingRound: fundingRoundPda,\n milestone: milestonePda,\n investment: investmentPda,\n nftMint: nftMintPubkey,\n voterNftAccount,\n voter,\n systemProgram: SystemProgram.programId,\n })\n .rpc();\n}\n\n/**\n * Finalize voting on a round milestone\n *\n * Multi-Round Fundraising: Processes vote results, transitions\n * milestone to Passed or Failed state.\n */\nexport async function finalizeRoundVoting(\n program: AnyProgram,\n args: {\n projectId: BN;\n /** Round number */\n roundNumber: number;\n /** Milestone index to finalize */\n milestoneIndex: number;\n }\n): Promise<string> {\n const projectPda = getProjectPDA(args.projectId, program.programId);\n const fundingRoundPda = getFundingRoundPDA(projectPda, args.roundNumber, program.programId);\n const milestonePda = getRoundMilestonePDA(projectPda, args.roundNumber, args.milestoneIndex, program.programId);\n\n return getMethods(program)\n .finalizeRoundVoting()\n .accountsPartial({\n project: projectPda,\n fundingRound: fundingRoundPda,\n milestone: milestonePda,\n clock: SYSVAR_CLOCK_PUBKEY,\n })\n .rpc();\n}\n\n/**\n * Claim milestone funds from a round (founder)\n *\n * Multi-Round Fundraising: Transfers USDC from round escrow\n * to founder's account.\n *\n * @param nextMilestoneDeadline - Deadline for next milestone (required for non-final)\n * Set to BN(0) for final milestone claims\n */\nexport async function claimRoundMilestoneFunds(\n program: AnyProgram,\n args: {\n projectId: BN;\n /** Round number */\n roundNumber: number;\n /** Milestone index to claim */\n milestoneIndex: number;\n /** Founder's USDC token account */\n founderUsdcAccount: PublicKey;\n /** Deadline for next milestone - required for non-final milestones, use BN(0) for final */\n nextMilestoneDeadline: BN;\n },\n founder: PublicKey\n): Promise<string> {\n const projectPda = getProjectPDA(args.projectId, program.programId);\n const fundingRoundPda = getFundingRoundPDA(projectPda, args.roundNumber, program.programId);\n const milestonePda = getRoundMilestonePDA(projectPda, args.roundNumber, args.milestoneIndex, program.programId);\n const roundEscrowPda = getRoundEscrowPDA(projectPda, args.roundNumber, program.programId);\n const [roundEscrowAuthorityPda] = getRoundEscrowAuthorityPDA(projectPda, args.roundNumber, program.programId);\n\n // For non-final milestones, derive next milestone PDA\n const nextMilestonePda = args.nextMilestoneDeadline.gt(new BN(0))\n ? getRoundMilestonePDA(projectPda, args.roundNumber, args.milestoneIndex + 1, program.programId)\n : null;\n\n return getMethods(program)\n .claimRoundMilestoneFunds({ nextMilestoneDeadline: args.nextMilestoneDeadline })\n .accountsPartial({\n project: projectPda,\n fundingRound: fundingRoundPda,\n milestone: milestonePda,\n founder,\n roundEscrow: roundEscrowPda,\n roundEscrowAuthority: roundEscrowAuthorityPda,\n founderUsdcAccount: args.founderUsdcAccount,\n nextMilestone: nextMilestonePda,\n systemProgram: SystemProgram.programId,\n tokenProgram: TOKEN_PROGRAM_ID,\n })\n .rpc();\n}\n\n/**\n * Claim instant tokens for a round milestone (investor)\n *\n * Multi-Round Fundraising: R2+ investors claim instant portion\n * when milestone passes. Tokens come from FutureRoundVault.\n */\nexport async function claimRoundInstantTokens(\n program: AnyProgram,\n args: {\n projectId: BN;\n /** Round number of the investment */\n roundNumber: number;\n /** Milestone index to claim tokens from */\n milestoneIndex: number;\n /** NFT mint proving investment ownership */\n nftMint: PublicKey;\n /** Investor's token account to receive claimed tokens */\n investorTokenAccount: PublicKey;\n },\n investor: PublicKey\n): Promise<string> {\n const nftMintPubkey = ensurePublicKey(args.nftMint);\n const projectPda = getProjectPDA(args.projectId, program.programId);\n const fundingRoundPda = getFundingRoundPDA(projectPda, args.roundNumber, program.programId);\n const milestonePda = getRoundMilestonePDA(projectPda, args.roundNumber, args.milestoneIndex, program.programId);\n const investmentPda = getRoundInvestmentPDA(projectPda, args.roundNumber, nftMintPubkey, program.programId);\n const tokenVaultPda = getTokenVaultPDA(projectPda, program.programId);\n const futureRoundVaultPda = getFutureRoundVaultPDA(projectPda, program.programId);\n const futureRoundTokenVaultPda = getFutureRoundTokenVaultPDA(projectPda, program.programId);\n const vaultAuthorityPda = getVaultAuthorityPDA(projectPda, program.programId);\n\n // Vesting PDA with round number\n const vestingPda = getRoundInvestorMilestoneVestingPDA(\n projectPda,\n args.roundNumber,\n args.milestoneIndex,\n investmentPda,\n program.programId\n );\n\n // Get investor's NFT token account (ATA)\n const investorNftAccount = getAssociatedTokenAddressSync(\n nftMintPubkey,\n investor,\n false,\n TOKEN_PROGRAM_ID\n );\n\n return getMethods(program)\n .claimRoundInstantTokens({ milestoneIndex: args.milestoneIndex })\n .accountsPartial({\n investor,\n project: projectPda,\n fundingRound: fundingRoundPda,\n milestone: milestonePda,\n investment: investmentPda,\n tokenVault: tokenVaultPda,\n futureRoundVault: futureRoundVaultPda,\n vesting: vestingPda,\n nftMint: nftMintPubkey,\n investorNftAccount,\n futureRoundTokenVault: futureRoundTokenVaultPda,\n investorTokenAccount: args.investorTokenAccount,\n vaultAuthority: vaultAuthorityPda,\n tokenProgram: TOKEN_PROGRAM_ID,\n systemProgram: SystemProgram.programId,\n })\n .rpc();\n}\n\n/**\n * Claim vested tokens for a round milestone (investor)\n *\n * Multi-Round Fundraising: R2+ investors claim vested portion\n * after cliff period. Tokens come from FutureRoundVault.\n */\nexport async function claimRoundVestedTokens(\n program: AnyProgram,\n args: {\n projectId: BN;\n /** Round number of the investment */\n roundNumber: number;\n /** Milestone index to claim tokens from */\n milestoneIndex: number;\n /** NFT mint proving investment ownership */\n nftMint: PublicKey;\n /** Investor's token account to receive claimed tokens */\n investorTokenAccount: PublicKey;\n },\n investor: PublicKey\n): Promise<string> {\n const nftMintPubkey = ensurePublicKey(args.nftMint);\n const projectPda = getProjectPDA(args.projectId, program.programId);\n const fundingRoundPda = getFundingRoundPDA(projectPda, args.roundNumber, program.programId);\n const milestonePda = getRoundMilestonePDA(projectPda, args.roundNumber, args.milestoneIndex, program.programId);\n const investmentPda = getRoundInvestmentPDA(projectPda, args.roundNumber, nftMintPubkey, program.programId);\n const tokenVaultPda = getTokenVaultPDA(projectPda, program.programId);\n const futureRoundVaultPda = getFutureRoundVaultPDA(projectPda, program.programId);\n const futureRoundTokenVaultPda = getFutureRoundTokenVaultPDA(projectPda, program.programId);\n const vaultAuthorityPda = getVaultAuthorityPDA(projectPda, program.programId);\n\n // Vesting PDA with round number\n const vestingPda = getRoundInvestorMilestoneVestingPDA(\n projectPda,\n args.roundNumber,\n args.milestoneIndex,\n investmentPda,\n program.programId\n );\n\n // Get investor's NFT token account (ATA)\n const investorNftAccount = getAssociatedTokenAddressSync(\n nftMintPubkey,\n investor,\n false,\n TOKEN_PROGRAM_ID\n );\n\n return getMethods(program)\n .claimRoundVestedTokens({ milestoneIndex: args.milestoneIndex })\n .accountsPartial({\n investor,\n project: projectPda,\n fundingRound: fundingRoundPda,\n milestone: milestonePda,\n investment: investmentPda,\n tokenVault: tokenVaultPda,\n futureRoundVault: futureRoundVaultPda,\n vesting: vestingPda,\n nftMint: nftMintPubkey,\n investorNftAccount,\n futureRoundTokenVault: futureRoundTokenVaultPda,\n investorTokenAccount: args.investorTokenAccount,\n vaultAuthority: vaultAuthorityPda,\n tokenProgram: TOKEN_PROGRAM_ID,\n })\n .rpc();\n}\n\n/**\n * Claim early tokens for a round investment (5% after 24h)\n *\n * Multi-Round Fundraising: R2+ investors claim 5% of token allocation\n * 24 hours after investing. Tokens come from FutureRoundVault.\n */\nexport async function claimRoundEarlyTokens(\n program: AnyProgram,\n args: {\n projectId: BN;\n /** Round number of the investment */\n roundNumber: number;\n /** NFT mint proving investment ownership */\n nftMint: PublicKey;\n /** Investor's token account to receive claimed tokens */\n investorTokenAccount: PublicKey;\n },\n investor: PublicKey\n): Promise<string> {\n const nftMintPubkey = ensurePublicKey(args.nftMint);\n const projectPda = getProjectPDA(args.projectId, program.programId);\n const fundingRoundPda = getFundingRoundPDA(projectPda, args.roundNumber, program.programId);\n const investmentPda = getRoundInvestmentPDA(projectPda, args.roundNumber, nftMintPubkey, program.programId);\n const tokenVaultPda = getTokenVaultPDA(projectPda, program.programId);\n const futureRoundVaultPda = getFutureRoundVaultPDA(projectPda, program.programId);\n const futureRoundTokenVaultPda = getFutureRoundTokenVaultPDA(projectPda, program.programId);\n const vaultAuthorityPda = getVaultAuthorityPDA(projectPda, program.programId);\n\n // Get investor's NFT token account (ATA)\n const investorNftAccount = getAssociatedTokenAddressSync(\n nftMintPubkey,\n investor,\n false,\n TOKEN_PROGRAM_ID\n );\n\n return getMethods(program)\n .claimRoundEarlyTokens()\n .accountsPartial({\n investor,\n project: projectPda,\n fundingRound: fundingRoundPda,\n investment: investmentPda,\n tokenVault: tokenVaultPda,\n futureRoundVault: futureRoundVaultPda,\n nftMint: nftMintPubkey,\n investorNftAccount,\n futureRoundTokenVault: futureRoundTokenVaultPda,\n investorTokenAccount: args.investorTokenAccount,\n vaultAuthority: vaultAuthorityPda,\n tokenProgram: TOKEN_PROGRAM_ID,\n })\n .rpc();\n}\n","/**\n * Raise Client\n *\n * Main client class for interacting with the Raise program.\n * Provides a high-level API that wraps the instruction and account modules.\n */\n\nimport { Program, AnchorProvider, BN } from '@coral-xyz/anchor';\nimport { Connection, PublicKey, Keypair } from '@solana/web3.js';\n\n// Import all modules\nimport * as pdas from './pdas/index.js';\nimport * as accounts from './accounts/index.js';\nimport * as instructions from './instructions/index.js';\nimport type { TierConfig, SubAllocation } from './types/index.js';\n\n/**\n * Wallet interface required by the client\n */\nexport interface Wallet {\n publicKey: PublicKey;\n signTransaction: <T>(tx: T) => Promise<T>;\n signAllTransactions: <T>(txs: T[]) => Promise<T[]>;\n}\n\n/**\n * Main client for interacting with the Raise program\n *\n * @example\n * ```typescript\n * import { RaiseClient } from '@raise/sdk';\n *\n * const client = RaiseClient.load(connection, wallet);\n *\n * // Create a project\n * const tx = await client.initializeProject({\n * projectId: new BN(1),\n * fundingGoal: new BN(100000000000), // 100,000 USDC\n * metadataUri: 'https://example.com/project.json',\n * });\n *\n * // Fetch project data\n * const project = await client.fetchProject(new BN(1));\n * ```\n */\nexport class RaiseClient {\n /**\n * Create a new RaiseClient\n *\n * @param program - Anchor program instance\n * @param provider - Anchor provider\n */\n constructor(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n public readonly program: Program<any>,\n public readonly provider: AnchorProvider\n ) {}\n\n /**\n * Load a new RaiseClient instance\n *\n * @param connection - Solana connection\n * @param wallet - Wallet instance\n * @param programId - Optional program ID override\n * @returns Initialized RaiseClient\n *\n * @example\n * ```typescript\n * const client = RaiseClient.load(connection, wallet);\n * ```\n */\n static load(\n _connection: Connection,\n _wallet: Wallet,\n _programId?: PublicKey\n ): RaiseClient {\n // Note: In production, you would import the IDL from a generated file\n // For now, we'll need the IDL to be provided or loaded separately\n // This is a placeholder that assumes IDL is available\n throw new Error(\n 'RaiseClient.load requires IDL. Use RaiseClient.fromProgram instead, ' +\n 'or ensure the IDL is bundled with your application.'\n );\n }\n\n /**\n * Create client from an existing program instance\n *\n * @param program - Anchor program instance\n * @returns Initialized RaiseClient\n *\n * @example\n * ```typescript\n * import idl from './idl/raise.json';\n *\n * const provider = new AnchorProvider(connection, wallet, {});\n * const program = new Program(idl, provider);\n * const client = RaiseClient.fromProgram(program);\n * ```\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n static fromProgram(program: Program<any>): RaiseClient {\n const provider = program.provider as AnchorProvider;\n return new RaiseClient(program, provider);\n }\n\n /**\n * Get the program ID\n */\n get programId(): PublicKey {\n return this.program.programId;\n }\n\n /**\n * Get the connected wallet public key\n */\n get walletPublicKey(): PublicKey {\n return this.provider.wallet.publicKey;\n }\n\n // ===========================================================================\n // PDA Helpers\n // ===========================================================================\n\n getProjectPDA(projectId: BN): PublicKey {\n return pdas.getProjectPDA(projectId, this.programId);\n }\n\n getEscrowPDA(projectId: BN): PublicKey {\n return pdas.getEscrowPDA(projectId, this.programId);\n }\n\n getMilestonePDA(projectPda: PublicKey, milestoneIndex: number): PublicKey {\n return pdas.getMilestonePDA(projectPda, milestoneIndex, this.programId);\n }\n\n getInvestmentPDA(projectPda: PublicKey, nftMint: PublicKey): PublicKey {\n return pdas.getInvestmentPDA(projectPda, nftMint, this.programId);\n }\n\n getVotePDA(milestonePda: PublicKey, voterKey: PublicKey, votingRound: number): PublicKey {\n return pdas.getVotePDA(milestonePda, voterKey, votingRound, this.programId);\n }\n\n getPivotProposalPDA(projectPda: PublicKey, pivotCount: number): PublicKey {\n return pdas.getPivotProposalPDA(projectPda, pivotCount, this.programId);\n }\n\n getTgeEscrowPDA(projectPda: PublicKey): PublicKey {\n return pdas.getTgeEscrowPDA(projectPda, this.programId);\n }\n\n getTgeEscrowVaultPDA(projectPda: PublicKey): PublicKey {\n return pdas.getTgeEscrowVaultPDA(projectPda, this.programId);\n }\n\n getAdminConfigPDA(): PublicKey {\n return pdas.getAdminConfigPDA(this.programId);\n }\n\n getAllocationProposalPDA(projectPda: PublicKey, proposalIndex: number): PublicKey {\n return pdas.getAllocationProposalPDA(projectPda, proposalIndex, this.programId);\n }\n\n getAllocationVotePDA(proposalPda: PublicKey, nftMint: PublicKey): PublicKey {\n return pdas.getAllocationVotePDA(proposalPda, nftMint, this.programId);\n }\n\n getSubAllocationVestingPDA(projectPda: PublicKey, subAllocationId: number): PublicKey {\n return pdas.getSubAllocationVestingPDA(projectPda, subAllocationId, this.programId);\n }\n\n getTokenomicsPDA(projectPda: PublicKey): PublicKey {\n return pdas.getTokenomicsPDA(projectPda, this.programId);\n }\n\n // Per-Milestone Vesting PDAs\n getInvestorMilestoneVestingPDA(projectPda: PublicKey, milestoneIndex: number, investmentPda: PublicKey): PublicKey {\n return pdas.getInvestorMilestoneVestingPDA(projectPda, milestoneIndex, investmentPda, this.programId);\n }\n\n getFounderMilestoneVestingPDA(projectPda: PublicKey, milestoneIndex: number): PublicKey {\n return pdas.getFounderMilestoneVestingPDA(projectPda, milestoneIndex, this.programId);\n }\n\n // ===========================================================================\n // Account Fetchers\n // ===========================================================================\n\n async fetchProject(projectId: BN) {\n return accounts.fetchProject(this.program, projectId);\n }\n\n async fetchMilestone(projectId: BN, milestoneIndex: number) {\n return accounts.fetchMilestone(this.program, projectId, milestoneIndex);\n }\n\n async fetchAllMilestones(projectId: BN) {\n return accounts.fetchAllMilestones(this.program, projectId);\n }\n\n async fetchInvestment(projectId: BN, nftMint: PublicKey) {\n return accounts.fetchInvestment(this.program, projectId, nftMint);\n }\n\n async fetchAllInvestments(projectId: BN) {\n return accounts.fetchAllInvestments(this.program, projectId);\n }\n\n async fetchVote(projectId: BN, milestoneIndex: number, voterKey: PublicKey, votingRound: number) {\n return accounts.fetchVote(this.program, projectId, milestoneIndex, voterKey, votingRound);\n }\n\n async fetchAllVotes(projectId: BN, milestoneIndex: number) {\n return accounts.fetchAllVotes(this.program, projectId, milestoneIndex);\n }\n\n async fetchPivotProposal(projectId: BN) {\n return accounts.fetchPivotProposal(this.program, projectId);\n }\n\n async fetchTgeEscrow(projectId: BN) {\n return accounts.fetchTgeEscrow(this.program, projectId);\n }\n\n async fetchAdminConfig() {\n return accounts.fetchAdminConfig(this.program);\n }\n\n async fetchTokenVault(projectId: BN) {\n return accounts.fetchTokenVault(this.program, projectId);\n }\n\n async fetchTokenomics(projectId: BN) {\n return accounts.fetchTokenomics(this.program, projectId);\n }\n\n async fetchAllocationProposal(projectId: BN, proposalIndex: number) {\n return accounts.fetchAllocationProposal(this.program, projectId, proposalIndex);\n }\n\n async fetchAllAllocationProposals(projectId: BN) {\n return accounts.fetchAllAllocationProposals(this.program, projectId);\n }\n\n async fetchAllocationVote(projectId: BN, proposalIndex: number, nftMint: PublicKey) {\n return accounts.fetchAllocationVote(this.program, projectId, proposalIndex, nftMint);\n }\n\n async fetchSubAllocationVesting(projectId: BN, subAllocationId: number) {\n return accounts.fetchSubAllocationVesting(this.program, projectId, subAllocationId);\n }\n\n async fetchInvestorMilestoneVesting(projectId: BN, milestoneIndex: number, nftMint: PublicKey) {\n return accounts.fetchInvestorMilestoneVesting(this.program, projectId, milestoneIndex, nftMint);\n }\n\n async fetchFounderMilestoneVesting(projectId: BN, milestoneIndex: number) {\n return accounts.fetchFounderMilestoneVesting(this.program, projectId, milestoneIndex);\n }\n\n // ===========================================================================\n // Admin Instructions\n // ===========================================================================\n\n async initializeAdmin(admin: PublicKey): Promise<string> {\n return instructions.initializeAdmin(\n this.program,\n admin,\n this.walletPublicKey\n );\n }\n\n async transferAdmin(newAdmin: PublicKey, adminKeypair: Keypair): Promise<string> {\n return instructions.transferAdmin(\n this.program,\n adminKeypair,\n newAdmin\n );\n }\n\n async acceptAdmin(): Promise<string> {\n return instructions.acceptAdmin(\n this.program,\n this.walletPublicKey\n );\n }\n\n // ===========================================================================\n // Project Instructions\n // ===========================================================================\n\n async initializeProject(args: {\n projectId: BN;\n fundingGoal: BN;\n metadataUri: string;\n tiers: TierConfig[];\n /** ZTM v2.0: Tokenomics configuration */\n tokenomics: instructions.TokenomicsInput;\n /** Milestone 1 deadline - Unix timestamp (required) */\n milestone1Deadline: BN;\n /** Milestone Price Increases: Price multipliers in BPS (optional, defaults to all 10000) */\n priceMultipliers?: number[];\n }): Promise<string> {\n return instructions.initializeProject(\n this.program,\n args,\n this.walletPublicKey\n );\n }\n\n async submitForApproval(projectId: BN): Promise<string> {\n return instructions.submitForApproval(\n this.program,\n projectId,\n this.walletPublicKey\n );\n }\n\n async approveProject(\n args: { projectId: BN; usdcMint: PublicKey },\n adminKeypair: Keypair\n ): Promise<string> {\n return instructions.approveProject(\n this.program,\n args,\n adminKeypair\n );\n }\n\n // ===========================================================================\n // Milestone Instructions\n // ===========================================================================\n\n async createMilestone(args: {\n projectId: BN;\n milestoneIndex: number;\n percentage: number;\n description: string;\n vestingDurationMonths?: number | null;\n cliffMonths?: number | null;\n instantReleaseBps?: number | null;\n }): Promise<string> {\n return instructions.createMilestone(\n this.program,\n args,\n this.walletPublicKey\n );\n }\n\n async submitMilestone(projectId: BN, milestoneIndex: number): Promise<string> {\n return instructions.submitMilestone(\n this.program,\n projectId,\n milestoneIndex,\n this.walletPublicKey\n );\n }\n\n async voteOnMilestone(args: {\n projectId: BN;\n milestoneIndex: number;\n nftMint: PublicKey | string;\n choice: { good: object } | { bad: object };\n }): Promise<string> {\n return instructions.voteOnMilestone(\n this.program,\n args,\n this.walletPublicKey\n );\n }\n\n async finalizeVoting(projectId: BN, milestoneIndex: number): Promise<string> {\n return instructions.finalizeVoting(\n this.program,\n projectId,\n milestoneIndex\n );\n }\n\n /**\n * Claim milestone funds (ZTM v2.0)\n * - Regular milestones: Full payout to founder\n * - Final milestone: LP USDC reserved for PCL, triggers MAE\n *\n * @param nextMilestoneDeadline - Deadline for next milestone (required for non-final milestones)\n * Set to BN(0) for final milestone claims (no next milestone exists)\n */\n async claimMilestoneFunds(args: {\n projectId: BN;\n milestoneIndex: number;\n founderUsdcAccount: PublicKey;\n escrowTokenAccount: PublicKey;\n /** Deadline for next milestone - required for non-final milestones, use BN(0) for final */\n nextMilestoneDeadline: BN;\n /** Next milestone PDA - optional, auto-derived if not provided */\n nextMilestonePda?: PublicKey;\n }): Promise<string> {\n return instructions.claimMilestoneFunds(\n this.program,\n args,\n this.walletPublicKey\n );\n }\n\n /**\n * Resubmit a failed milestone for rework (Failed → InProgress)\n *\n * Allows founders to iterate on failed milestones. Clears voting state\n * for a fresh voting cycle. consecutive_failures is NOT reset.\n */\n async resubmitMilestone(args: {\n projectId: BN;\n milestoneIndex: number;\n }): Promise<string> {\n return instructions.resubmitMilestone(\n this.program,\n args,\n this.walletPublicKey\n );\n }\n\n /**\n * Set milestone deadline for founder to commit submission date\n *\n * Founders must set deadlines for milestones to provide visibility to investors.\n * Deadline must be at least 7 days from now and at most 1 year from now.\n */\n async setMilestoneDeadline(args: {\n projectId: BN;\n milestoneIndex: number;\n /** Unix timestamp for the deadline */\n deadline: BN;\n }): Promise<string> {\n return instructions.setMilestoneDeadline(\n this.program,\n args,\n this.walletPublicKey\n );\n }\n\n /**\n * Extend milestone deadline (max 3 extensions per milestone)\n *\n * Founders can extend a deadline up to 3 times before it passes.\n * Must be called BEFORE the current deadline passes.\n */\n async extendMilestoneDeadline(args: {\n projectId: BN;\n milestoneIndex: number;\n /** New deadline timestamp (must be > current deadline) */\n newDeadline: BN;\n }): Promise<string> {\n return instructions.extendMilestoneDeadline(\n this.program,\n args,\n this.walletPublicKey\n );\n }\n\n // ===========================================================================\n // Investment Instructions\n // ===========================================================================\n\n async invest(args: {\n projectId: BN;\n amount: BN;\n investorTokenAccount: PublicKey;\n escrowTokenAccount: PublicKey;\n investmentCount: number; // Must be fetched from project.investmentCount\n }): Promise<string> {\n return instructions.invest(\n this.program,\n args,\n this.walletPublicKey\n );\n }\n\n async cancelInvestment(args: {\n projectId: BN;\n nftMint: PublicKey;\n investorNftAccount: PublicKey;\n investorUsdcAccount: PublicKey;\n escrowTokenAccount: PublicKey;\n }): Promise<string> {\n return instructions.cancelInvestment(\n this.program,\n args,\n this.walletPublicKey\n );\n }\n\n // ===========================================================================\n // Pivot Instructions\n // ===========================================================================\n\n async proposePivot(args: {\n projectId: BN;\n newMetadataUri: string;\n newMilestones: Array<{ percentage: number; description: string }>;\n }): Promise<string> {\n return instructions.proposePivot(\n this.program,\n args,\n this.walletPublicKey\n );\n }\n\n async approvePivot(projectId: BN, adminKeypair: Keypair): Promise<string> {\n return instructions.approvePivot(\n this.program,\n projectId,\n adminKeypair\n );\n }\n\n async withdrawFromPivot(args: {\n projectId: BN;\n pivotCount: number;\n nftMint: PublicKey;\n investorTokenAccount: PublicKey;\n escrowTokenAccount: PublicKey;\n milestoneAccounts: PublicKey[]; // All milestone PDAs for calculating unreleased funds\n }): Promise<string> {\n return instructions.withdrawFromPivot(\n this.program,\n args,\n this.walletPublicKey\n );\n }\n\n async finalizePivot(args: {\n projectId: BN;\n pivotCount: number;\n milestoneAccounts: PublicKey[]; // All milestone PDAs (reused when old_count == new_count)\n }): Promise<string> {\n return instructions.finalizePivot(\n this.program,\n args,\n this.walletPublicKey\n );\n }\n\n // ===========================================================================\n // TGE Instructions\n // ===========================================================================\n\n async setTgeDate(args: {\n projectId: BN;\n tgeDate: BN;\n tokenMint: PublicKey;\n }): Promise<string> {\n return instructions.setTgeDate(\n this.program,\n args,\n this.walletPublicKey\n );\n }\n\n async depositTokens(args: {\n projectId: BN;\n amount: BN;\n tokenMint: PublicKey;\n founderTokenAccount: PublicKey;\n }): Promise<string> {\n return instructions.depositTokens(\n this.program,\n args,\n this.walletPublicKey\n );\n }\n\n async claimTokens(args: {\n projectId: BN;\n nftMint: PublicKey;\n investorNftAccount: PublicKey;\n investorTokenAccount: PublicKey;\n projectTokenVault: PublicKey;\n }): Promise<string> {\n return instructions.claimTokens(\n this.program,\n args,\n this.walletPublicKey\n );\n }\n\n async reportScam(args: {\n projectId: BN;\n nftMint: PublicKey;\n }): Promise<string> {\n return instructions.reportScam(\n this.program,\n args,\n this.walletPublicKey\n );\n }\n\n async releaseHoldback(args: {\n projectId: BN;\n founderTokenAccount: PublicKey;\n }): Promise<string> {\n return instructions.releaseHoldback(\n this.program,\n args\n );\n }\n\n // ===========================================================================\n // ZTM v2.0 Token Distribution Instructions\n // ===========================================================================\n\n /**\n * Claim investor tokens from a passed milestone (whitepaper: manual claim model)\n *\n * ZTM v2.0: Per whitepaper, investors manually claim their tokens after a milestone passes.\n * This replaces the batch distribution model with investor-initiated per-NFT claims.\n */\n async claimInvestorTokens(args: {\n projectId: BN;\n milestoneIndex: number;\n nftMint: PublicKey;\n investorTokenAccount: PublicKey;\n }): Promise<string> {\n return instructions.claimInvestorTokens(\n this.program,\n args,\n this.walletPublicKey\n );\n }\n\n /**\n * Distribute tokens to NFT holders for a milestone\n *\n * ZTM v2.0: Called by cranker after finalize_voting sets distribution_pending = true.\n * Processes batch of investments, transferring unlocked tokens to NFT holders.\n * Max batch size: 10 investments per call.\n *\n * @deprecated Use claimInvestorTokens instead (whitepaper manual claim model)\n */\n async distributeTokens(args: {\n projectId: BN;\n milestoneIndex: number;\n investments: Array<{\n investmentPda: PublicKey;\n investorTokenAccount: PublicKey;\n }>;\n }): Promise<string> {\n return instructions.distributeTokens(\n this.program,\n args,\n this.walletPublicKey\n );\n }\n\n /**\n * Complete token distribution for a milestone\n *\n * ZTM v2.0: Marks distribution as complete after all batches have been processed.\n * Permissionless - anyone can call this to finalize a distribution.\n */\n async completeDistribution(args: {\n projectId: BN;\n milestoneIndex: number;\n }): Promise<string> {\n return instructions.completeDistribution(\n this.program,\n args,\n this.walletPublicKey\n );\n }\n\n // ===========================================================================\n // ZTM v2.0: Founder Vesting Instructions\n // ===========================================================================\n\n /**\n * Initialize founder vesting after MAE (Market Access Event)\n *\n * ZTM v2.0: Creates FounderVesting PDA with vesting schedule from Tokenomics.\n * Must be called after project reaches Completed state (all milestones done).\n * Permissionless - anyone can pay to initialize.\n */\n async initializeFounderVesting(args: {\n projectId: BN;\n }): Promise<string> {\n return instructions.initializeFounderVesting(\n this.program,\n args,\n this.walletPublicKey\n );\n }\n\n /**\n * Claim vested tokens from founder vault\n *\n * ZTM v2.0: Founder claims tokens based on linear vesting schedule.\n * Requires cliff period to pass before any tokens can be claimed.\n */\n async claimVestedTokens(args: {\n projectId: BN;\n founderTokenAccount: PublicKey;\n }): Promise<string> {\n return instructions.claimVestedTokens(\n this.program,\n args,\n this.walletPublicKey\n );\n }\n\n // ===========================================================================\n // ZTM v2.0: Circuit Breaker Instructions\n // ===========================================================================\n\n /**\n * Force complete a stuck distribution (admin only)\n *\n * ZTM v2.0: Circuit breaker for when token distribution is stuck for >7 days.\n * Marks distribution as complete so project can continue.\n * Affected investors can use claimMissedUnlock to get their tokens.\n */\n async forceCompleteDistribution(\n args: { projectId: BN },\n adminKeypair: Keypair\n ): Promise<string> {\n return instructions.forceCompleteDistribution(\n this.program,\n args,\n adminKeypair\n );\n }\n\n /**\n * Claim missed token unlock after force-complete distribution\n *\n * ZTM v2.0: Allows investors to claim tokens they missed during a stuck\n * distribution that was force-completed by admin.\n */\n async claimMissedUnlock(args: {\n projectId: BN;\n nftMint: PublicKey;\n milestoneIndex: number;\n claimerTokenAccount: PublicKey;\n }): Promise<string> {\n return instructions.claimMissedUnlock(\n this.program,\n args,\n this.walletPublicKey\n );\n }\n\n // ===========================================================================\n // Early Token Release Instructions\n // ===========================================================================\n\n /**\n * Claim early tokens as an investor (5% of token allocation)\n *\n * Early Token Release: Investors can claim 5% of their token allocation\n * 24 hours after investing. These tokens are fully liquid immediately.\n *\n * Prerequisites:\n * - 24h cooling period must have passed since investment\n * - Investment must not have already claimed early tokens\n * - Investment must have active voting rights\n */\n async claimEarlyTokens(args: {\n projectId: BN;\n nftMint: PublicKey;\n investorTokenAccount: PublicKey;\n }): Promise<string> {\n return instructions.claimEarlyTokens(\n this.program,\n args,\n this.walletPublicKey\n );\n }\n\n /**\n * Claim early tokens as a founder (5% of founder allocation)\n *\n * Early Token Release: Founders can claim 5% of their token allocation\n * when the project becomes Funded. These tokens are fully liquid immediately.\n *\n * Prerequisites:\n * - Project must be in Funded, InProgress, or Completed state\n * - Founder must not have already claimed early tokens\n */\n async claimFounderEarlyTokens(args: {\n projectId: BN;\n founderTokenAccount: PublicKey;\n }): Promise<string> {\n return instructions.claimFounderEarlyTokens(\n this.program,\n args,\n this.walletPublicKey\n );\n }\n\n /**\n * Claim founder milestone-based tokens for a specific milestone\n *\n * Early Token Release: Founders can claim their milestone-based portion\n * (default 47.5% of founder allocation) when milestones are unlocked.\n *\n * Prerequisites:\n * - Milestone must be in Unlocked state\n * - Founder must not have already claimed tokens for this milestone\n */\n async claimFounderMilestoneTokens(args: {\n projectId: BN;\n milestoneIndex: number;\n founderTokenAccount: PublicKey;\n }): Promise<string> {\n return instructions.claimFounderMilestoneTokens(\n this.program,\n args,\n this.walletPublicKey\n );\n }\n\n // ===========================================================================\n // Per-Milestone Vesting Instructions (add-per-milestone-vesting)\n // ===========================================================================\n\n /**\n * Claim instant tokens for a passed milestone (investor)\n *\n * Per-milestone vesting: Investors claim the instant portion (e.g., 5-50%)\n * immediately when a milestone passes. Creates vesting PDA on first claim.\n *\n * @param milestoneIndex - The milestone index to claim tokens from\n * @param nftMint - The NFT mint proving investment ownership\n * @param investorTokenAccount - Investor's token account to receive claimed tokens\n */\n async claimMilestoneInstantTokens(args: {\n projectId: BN;\n milestoneIndex: number;\n nftMint: PublicKey;\n investorTokenAccount: PublicKey;\n }): Promise<string> {\n return instructions.claimMilestoneInstantTokens(\n this.program,\n args,\n this.walletPublicKey\n );\n }\n\n /**\n * Claim vested tokens for a milestone after cliff period (investor)\n *\n * Per-milestone vesting: Investors claim vested tokens linearly after\n * the cliff period passes. Must have already claimed instant tokens\n * to initialize the vesting PDA.\n *\n * @param milestoneIndex - The milestone index to claim vested tokens from\n * @param nftMint - The NFT mint proving investment ownership\n * @param investorTokenAccount - Investor's token account to receive claimed tokens\n */\n async claimMilestoneVestedTokens(args: {\n projectId: BN;\n milestoneIndex: number;\n nftMint: PublicKey;\n investorTokenAccount: PublicKey;\n }): Promise<string> {\n return instructions.claimMilestoneVestedTokens(\n this.program,\n args,\n this.walletPublicKey\n );\n }\n\n /**\n * Claim instant tokens for a passed milestone (founder)\n *\n * Per-milestone vesting: Founders claim the instant portion (e.g., 5-50%)\n * of their milestone-based allocation when a milestone passes.\n *\n * @param milestoneIndex - The milestone index to claim tokens from\n * @param founderTokenAccount - Founder's token account to receive claimed tokens\n */\n async claimFounderMsInstantTokens(args: {\n projectId: BN;\n milestoneIndex: number;\n founderTokenAccount: PublicKey;\n }): Promise<string> {\n return instructions.claimFounderMsInstantTokens(\n this.program,\n args,\n this.walletPublicKey\n );\n }\n\n /**\n * Claim vested tokens for a milestone after cliff period (founder)\n *\n * Per-milestone vesting: Founders claim vested tokens linearly after\n * the cliff period passes. Must have already claimed instant tokens\n * to initialize the vesting PDA.\n *\n * @param milestoneIndex - The milestone index to claim vested tokens from\n * @param founderTokenAccount - Founder's token account to receive claimed tokens\n */\n async claimFounderMsVestedTokens(args: {\n projectId: BN;\n milestoneIndex: number;\n founderTokenAccount: PublicKey;\n }): Promise<string> {\n return instructions.claimFounderMsVestedTokens(\n this.program,\n args,\n this.walletPublicKey\n );\n }\n\n // ===========================================================================\n // Abandonment Instructions\n // ===========================================================================\n\n async checkAbandonment(projectId: BN, milestoneIndex: number = 0): Promise<string> {\n return instructions.checkAbandonment(\n this.program,\n projectId,\n milestoneIndex\n );\n }\n\n async claimRefund(args: {\n projectId: BN;\n nftMint: PublicKey;\n investorNftAccount: PublicKey;\n investorUsdcAccount: PublicKey;\n escrowTokenAccount: PublicKey;\n milestoneCount?: number;\n }): Promise<string> {\n return instructions.claimRefund(\n this.program,\n args,\n this.walletPublicKey\n );\n }\n\n // ===========================================================================\n // Sub-Allocation Vesting Instructions\n // ===========================================================================\n\n /**\n * Initialize sub-allocation vesting after MAE (Market Access Event)\n *\n * Creates SubAllocationVesting PDA for a specific sub-allocation ID.\n * Project must be in Completed state with MAE completed.\n * Permissionless - anyone can pay to initialize.\n */\n async initializeSubAllocationVesting(args: {\n projectId: BN;\n subAllocationId: number;\n }): Promise<string> {\n return instructions.initializeSubAllocationVesting(\n this.program,\n args,\n this.walletPublicKey\n );\n }\n\n /**\n * Claim vested tokens from a sub-allocation\n *\n * Only the designated recipient wallet can claim tokens.\n * Project must be Completed and MAE must be completed.\n */\n async claimSubAllocationTokens(args: {\n projectId: BN;\n subAllocationId: number;\n recipientTokenAccount: PublicKey;\n }): Promise<string> {\n return instructions.claimSubAllocationTokens(\n this.program,\n args,\n this.walletPublicKey\n );\n }\n\n // ===========================================================================\n // Dynamic Tokenomics Instructions\n // ===========================================================================\n\n /**\n * Add a sub-allocation from the reserve pool (Draft state only)\n *\n * Allows founders to add named allocations (advisors, marketing, etc.)\n * from their reserve pool before submitting for approval.\n */\n async addSubAllocation(args: {\n projectId: BN;\n name: string;\n bps: number;\n recipient: PublicKey;\n vestingMonths: number;\n cliffMonths: number;\n }): Promise<string> {\n return instructions.addSubAllocation(\n this.program,\n args,\n this.walletPublicKey\n );\n }\n\n /**\n * Propose an allocation change via governance (post-Draft states)\n *\n * Creates a 7-day voting period for investors to approve/reject\n * a new sub-allocation from the reserve pool.\n */\n async proposeAllocationChange(args: {\n projectId: BN;\n name: string;\n bps: number;\n recipient: PublicKey;\n vestingMonths: number;\n cliffMonths: number;\n }): Promise<string> {\n return instructions.proposeAllocationChange(\n this.program,\n args,\n this.walletPublicKey\n );\n }\n\n /**\n * Vote on an allocation change proposal\n *\n * Investors can vote for/against using their Investment NFT.\n * Must meet 7-day hold period for voting eligibility.\n */\n async voteAllocationChange(args: {\n projectId: BN;\n proposalIndex: number;\n nftMint: PublicKey;\n voteFor: boolean;\n }): Promise<string> {\n return instructions.voteAllocationChange(\n this.program,\n args,\n this.walletPublicKey\n );\n }\n\n /**\n * Execute an approved allocation change proposal\n *\n * Permissionless - anyone can call after voting ends.\n * Proposal must have passed (>51% approval).\n */\n async executeAllocationChange(args: {\n projectId: BN;\n proposalIndex: number;\n }): Promise<string> {\n return instructions.executeAllocationChange(\n this.program,\n args,\n this.walletPublicKey\n );\n }\n\n // ===========================================================================\n // Dynamic Tokenomics Helpers\n // ===========================================================================\n\n /**\n * Get remaining founder pool capacity for sub-allocations in basis points\n *\n * Calculates: founder_allocation_bps - sum(sub_allocations.bps)\n * Sub-allocations (treasury, advisors, marketing) draw from founder's allocation pool.\n */\n async getRemainingFounderPool(projectId: BN): Promise<number> {\n const tokenomics = await this.fetchTokenomics(projectId);\n if (!tokenomics) {\n throw new Error('Tokenomics account not found');\n }\n\n const founderBps = tokenomics.founderAllocationBps || 0;\n const usedBps = (tokenomics.subAllocations || [])\n .filter((sa: SubAllocation) => sa.bps > 0)\n .reduce((sum: number, sa: SubAllocation) => sum + sa.bps, 0);\n\n return founderBps - usedBps;\n }\n\n /**\n * Get all active (non-executed, non-expired) allocation proposals\n */\n async getActiveProposals(projectId: BN) {\n const proposals = await this.fetchAllAllocationProposals(projectId);\n const now = Math.floor(Date.now() / 1000);\n\n return proposals.filter((p) => {\n const account = p.account;\n // Filter for non-executed proposals that haven't expired\n return !account.executed && account.votingEndsAt.toNumber() > now;\n });\n }\n\n /**\n * Get vesting status for a sub-allocation\n *\n * Returns claimable amount, total vested, and remaining locked tokens.\n */\n async getSubAllocationVestingStatus(projectId: BN, subAllocationId: number) {\n const vesting = await this.fetchSubAllocationVesting(projectId, subAllocationId);\n if (!vesting) {\n return null;\n }\n\n const now = Math.floor(Date.now() / 1000);\n // Use the pre-computed timestamps from the on-chain account\n const cliffEnd = vesting.cliffEnd.toNumber();\n const vestingEnd = vesting.vestingEnd.toNumber();\n const totalAmount = vesting.totalAmount.toNumber();\n const claimedAmount = vesting.claimedAmount.toNumber();\n\n // Before cliff - nothing vested\n if (now < cliffEnd) {\n return {\n totalAmount,\n vestedAmount: 0,\n claimedAmount,\n claimableAmount: 0,\n lockedAmount: totalAmount - claimedAmount,\n vestingProgress: 0,\n cliffPassed: false,\n };\n }\n\n // After full vesting period - everything vested\n if (now >= vestingEnd) {\n return {\n totalAmount,\n vestedAmount: totalAmount,\n claimedAmount,\n claimableAmount: totalAmount - claimedAmount,\n lockedAmount: 0,\n vestingProgress: 100,\n cliffPassed: true,\n };\n }\n\n // Linear vesting calculation\n const vestingDuration = vestingEnd - cliffEnd;\n const elapsed = now - cliffEnd;\n const vestedAmount = Math.floor((totalAmount * elapsed) / vestingDuration);\n\n return {\n totalAmount,\n vestedAmount,\n claimedAmount,\n claimableAmount: vestedAmount - claimedAmount,\n lockedAmount: totalAmount - vestedAmount,\n vestingProgress: Math.floor((elapsed / vestingDuration) * 100),\n cliffPassed: true,\n };\n }\n\n // ===========================================================================\n // Milestone Price Increase Helpers\n // ===========================================================================\n\n /** Base price multiplier constant (10000 BPS = 1.0x) */\n static readonly PRICE_MULTIPLIER_BASE = 10000;\n\n /**\n * Get the current price multiplier for a project\n *\n * Returns the multiplier in BPS (10000 = 1.0x, 15000 = 1.5x)\n *\n * Supports two modes:\n * - Dynamic mode (priceMultipliers[0] === 0): Uses currentPriceMultiplierBps\n * calculated dynamically via ZEMYTH formula at each milestone claim\n * - Static mode (legacy): Uses pre-configured priceMultipliers array lookup\n */\n async getCurrentMultiplier(projectId: BN): Promise<number> {\n const project = await this.fetchProject(projectId);\n if (!project) {\n throw new Error('Project account not found');\n }\n\n const { priceMultipliers, milestonesPassed, milestoneCount, currentPriceMultiplierBps } = project;\n\n // Check for dynamic mode sentinel (priceMultipliers[0] === 0)\n if (priceMultipliers[0] === 0) {\n // Dynamic mode: return the dynamically calculated multiplier\n return currentPriceMultiplierBps || RaiseClient.PRICE_MULTIPLIER_BASE;\n }\n\n // Static mode (legacy): use array lookup\n // Clamp index to valid range (0 to milestoneCount - 1)\n const index = milestoneCount === 0\n ? 0\n : Math.min(milestonesPassed, milestoneCount - 1);\n\n return priceMultipliers[index] || RaiseClient.PRICE_MULTIPLIER_BASE;\n }\n\n /**\n * Check if a project uses dynamic price multiplier mode\n */\n async isDynamicMultiplierMode(projectId: BN): Promise<boolean> {\n const project = await this.fetchProject(projectId);\n if (!project) {\n throw new Error('Project account not found');\n }\n\n return project.priceMultipliers[0] === 0;\n }\n\n /**\n * Calculate effective tier prices with current multiplier\n *\n * Returns array of tiers with their effective prices after applying\n * the current milestone multiplier.\n */\n async getEffectiveTierPrices(projectId: BN): Promise<Array<{\n tierIndex: number;\n baseAmount: BN;\n effectiveAmount: BN;\n multiplierBps: number;\n }>> {\n const project = await this.fetchProject(projectId);\n if (!project) {\n throw new Error('Project account not found');\n }\n\n const multiplier = await this.getCurrentMultiplier(projectId);\n const tiers = project.tiers.slice(0, project.tierCount);\n\n return tiers.map((tier: { amount: BN }, index: number) => ({\n tierIndex: index,\n baseAmount: tier.amount,\n effectiveAmount: tier.amount\n .mul(new BN(multiplier))\n .div(new BN(RaiseClient.PRICE_MULTIPLIER_BASE)),\n multiplierBps: multiplier,\n }));\n }\n\n /**\n * Get price schedule showing multipliers after each milestone\n *\n * Returns array showing what the price multiplier will be\n * after each milestone passes.\n *\n * For dynamic mode projects (priceMultipliers[0] === 0), returns null\n * as multipliers are calculated dynamically based on deadline timing.\n */\n async getPriceSchedule(projectId: BN): Promise<Array<{\n afterMilestone: number;\n multiplierBps: number;\n multiplierPercent: number;\n }> | null> {\n const project = await this.fetchProject(projectId);\n if (!project) {\n throw new Error('Project account not found');\n }\n\n const { priceMultipliers, milestoneCount } = project;\n\n // Dynamic mode: no pre-set schedule\n if (priceMultipliers[0] === 0) {\n return null;\n }\n\n // Static mode: return pre-configured schedule\n return priceMultipliers\n .slice(0, milestoneCount)\n .map((multiplier: number, index: number) => ({\n afterMilestone: index,\n multiplierBps: multiplier,\n multiplierPercent: multiplier / 100, // 10000 -> 100%\n }));\n }\n\n /**\n * Preview multiplier calculation for dynamic mode projects\n *\n * Uses the ZEMYTH formula to calculate what the multiplier would be\n * given a specific number of remaining milestones and days to deadline.\n *\n * Formula: totalMultiplier = 1 + (sqrt(n) / sqrt(15)) × (1 / ln(d/7 + e))\n *\n * @param remainingMilestones Number of milestones left (1-10)\n * @param daysToDeadline Days until next milestone deadline (1-365)\n * @returns Preview of the multiplier in BPS (10000 = 1.0x, max 20000 = 2.0x)\n */\n previewDynamicMultiplier(remainingMilestones: number, daysToDeadline: number): number {\n // Edge case: 0 remaining milestones = base multiplier\n if (remainingMilestones === 0) {\n return RaiseClient.PRICE_MULTIPLIER_BASE;\n }\n\n // Clamp days to reasonable range\n const days = Math.max(1, Math.min(365, daysToDeadline));\n\n // Integer approximation of ZEMYTH formula\n // sqrt(n) / sqrt(15) ≈ (sqrt(n) * 1000) / 3873\n const sqrtN = Math.sqrt(remainingMilestones) * 1000;\n const milestoneFactor = sqrtN / 3.873;\n\n // 1/ln(d/7 + e) approximation\n const timeFactor = this.timeFactorLookup(days);\n\n // Combined factor\n const combined = (milestoneFactor * timeFactor) / 1000;\n const bonusBps = Math.min(combined, 10000);\n\n // Base + bonus, clamped to [10000, 20000]\n return Math.min(20000, Math.max(10000, Math.round(10000 + bonusBps)));\n }\n\n /** Time factor lookup for dynamic multiplier preview (approximates 1/ln(d/7 + e) × 1000) */\n private timeFactorLookup(days: number): number {\n if (days <= 7) return 950 - (days * 25);\n if (days <= 14) return 775 - ((days - 7) * 20);\n if (days <= 30) return 635 - ((days - 14) * 8);\n if (days <= 60) return 507 - ((days - 30) * 4);\n if (days <= 90) return 387 - ((days - 60) * 3);\n if (days <= 180) return 297 - ((days - 90) * 1);\n return 250;\n }\n\n // ===========================================================================\n // Linear Progressive Pricing Helpers (add-linear-progressive-pricing)\n // ===========================================================================\n\n /** Constants for progressive pricing */\n static readonly TIME_ALLOCATION_PERCENT = 50;\n static readonly MILESTONE_ALLOCATION_PERCENT = 50;\n /** DEV MODE: Time acceleration multiplier (10 real seconds = 1 simulated day) */\n static readonly PROGRESSIVE_TIME_MULTIPLIER = 8640;\n\n /**\n * Check if progressive pricing is active for a project\n *\n * Progressive pricing is active when milestonePeriodStartedAt > 0,\n * meaning the first milestone period has been initialized.\n */\n isProgressivePricingActive(project: { milestonePeriodStartedAt: BN }): boolean {\n return project.milestonePeriodStartedAt.gt(new BN(0));\n }\n\n /**\n * Calculate time progress for a milestone period\n *\n * @param project Project account with progressive pricing fields\n * @param currentTime Current unix timestamp (seconds)\n * @returns Progress as ratio 0-1 (capped at 1.0)\n */\n getTimeProgress(\n project: {\n milestonePeriodStartedAt: BN;\n expectedMilestoneDeadlineTs: BN;\n },\n currentTime: number\n ): number {\n const startedAt = project.milestonePeriodStartedAt.toNumber();\n const deadline = project.expectedMilestoneDeadlineTs.toNumber();\n\n if (startedAt === 0 || deadline <= startedAt) {\n return 0;\n }\n\n // DEV MODE: Apply time acceleration (10 real seconds = 1 simulated day)\n const rawElapsed = Math.max(0, currentTime - startedAt);\n const elapsed = rawElapsed * RaiseClient.PROGRESSIVE_TIME_MULTIPLIER;\n const expectedDuration = Math.max(1, deadline - startedAt);\n\n return Math.min(1, elapsed / expectedDuration);\n }\n\n /**\n * Calculate the effective multiplier including time-based component\n *\n * @param project Project account with progressive pricing fields\n * @param currentTime Current unix timestamp (seconds)\n * @returns Effective multiplier in BPS (10000 = 1.0x)\n */\n calculateEffectiveMultiplier(\n project: {\n milestonePeriodStartedAt: BN;\n expectedMilestoneDeadlineTs: BN;\n milestoneBaseMultiplierBps: number;\n timeAllocationBps: number;\n currentPriceMultiplierBps: number;\n priceMultipliers: number[];\n },\n currentTime: number\n ): number {\n // If progressive pricing not active, use legacy behavior\n if (!this.isProgressivePricingActive(project)) {\n // Legacy: use currentPriceMultiplierBps or static array\n if (project.priceMultipliers[0] === 0) {\n return project.currentPriceMultiplierBps || RaiseClient.PRICE_MULTIPLIER_BASE;\n }\n return project.currentPriceMultiplierBps || RaiseClient.PRICE_MULTIPLIER_BASE;\n }\n\n // Progressive pricing active: base + time increment\n const timeProgress = this.getTimeProgress(project, currentTime);\n const timeIncrement = Math.floor(project.timeAllocationBps * timeProgress);\n\n return project.milestoneBaseMultiplierBps + timeIncrement;\n }\n\n /**\n * Preview what the milestone spike will be at a given claim time\n *\n * If founder claims early, unused time allocation accumulates to spike.\n *\n * @param project Project account with progressive pricing fields\n * @param claimTime Unix timestamp when claim will happen\n * @returns Object with spike details\n */\n previewMilestoneSpike(\n project: {\n milestonePeriodStartedAt: BN;\n expectedMilestoneDeadlineTs: BN;\n milestoneBaseMultiplierBps: number;\n timeAllocationBps: number;\n milestoneAllocationBps: number;\n },\n claimTime: number\n ): {\n timeProgress: number;\n consumedTimeBps: number;\n unusedTimeBps: number;\n milestoneSpikeBps: number;\n effectiveMultiplierBps: number;\n newBaseBps: number;\n } {\n const timeProgress = this.getTimeProgress(project, claimTime);\n\n const consumedTimeBps = Math.floor(project.timeAllocationBps * timeProgress);\n const unusedTimeBps = project.timeAllocationBps - consumedTimeBps;\n const milestoneSpikeBps = project.milestoneAllocationBps + unusedTimeBps;\n\n const effectiveMultiplierBps = project.milestoneBaseMultiplierBps + consumedTimeBps;\n const newBaseBps = effectiveMultiplierBps + milestoneSpikeBps;\n\n return {\n timeProgress,\n consumedTimeBps,\n unusedTimeBps,\n milestoneSpikeBps,\n effectiveMultiplierBps,\n newBaseBps,\n };\n }\n\n /**\n * Get effective tier prices with time-based progressive pricing\n *\n * Unlike getEffectiveTierPrices which fetches the project, this takes\n * the project and current time to calculate prices including time component.\n */\n getProgressiveTierPrices(\n project: {\n tiers: Array<{ amount: BN }>;\n tierCount: number;\n milestonePeriodStartedAt: BN;\n expectedMilestoneDeadlineTs: BN;\n milestoneBaseMultiplierBps: number;\n timeAllocationBps: number;\n currentPriceMultiplierBps: number;\n priceMultipliers: number[];\n },\n currentTime: number\n ): Array<{\n tierIndex: number;\n baseAmount: BN;\n effectiveAmount: BN;\n multiplierBps: number;\n timeProgressPercent: number;\n }> {\n const multiplier = this.calculateEffectiveMultiplier(project, currentTime);\n const timeProgress = this.getTimeProgress(project, currentTime);\n const tiers = project.tiers.slice(0, project.tierCount);\n\n return tiers.map((tier, index) => ({\n tierIndex: index,\n baseAmount: tier.amount,\n effectiveAmount: tier.amount\n .mul(new BN(multiplier))\n .div(new BN(RaiseClient.PRICE_MULTIPLIER_BASE)),\n multiplierBps: multiplier,\n timeProgressPercent: Math.round(timeProgress * 100),\n }));\n }\n\n // ===========================================================================\n // Multi-Round Fundraising PDAs\n // ===========================================================================\n\n getFundingRoundPDA(projectPda: PublicKey, roundNumber: number): PublicKey {\n return pdas.getFundingRoundPDA(projectPda, roundNumber, this.programId);\n }\n\n getRoundEscrowPDA(projectPda: PublicKey, roundNumber: number): PublicKey {\n return pdas.getRoundEscrowPDA(projectPda, roundNumber, this.programId);\n }\n\n getRoundMilestonePDA(projectPda: PublicKey, roundNumber: number, milestoneIndex: number): PublicKey {\n return pdas.getRoundMilestonePDA(projectPda, roundNumber, milestoneIndex, this.programId);\n }\n\n getRoundInvestmentPDA(projectPda: PublicKey, roundNumber: number, nftMint: PublicKey): PublicKey {\n return pdas.getRoundInvestmentPDA(projectPda, roundNumber, nftMint, this.programId);\n }\n\n getRoundInvestorMilestoneVestingPDA(\n projectPda: PublicKey,\n roundNumber: number,\n milestoneIndex: number,\n investmentPda: PublicKey\n ): PublicKey {\n return pdas.getRoundInvestorMilestoneVestingPDA(\n projectPda,\n roundNumber,\n milestoneIndex,\n investmentPda,\n this.programId\n );\n }\n\n getFutureRoundVaultPDA(projectPda: PublicKey): PublicKey {\n return pdas.getFutureRoundVaultPDA(projectPda, this.programId);\n }\n\n getFutureRoundTokenVaultPDA(projectPda: PublicKey): PublicKey {\n return pdas.getFutureRoundTokenVaultPDA(projectPda, this.programId);\n }\n\n // ===========================================================================\n // Multi-Round Fundraising Account Fetchers\n // ===========================================================================\n\n async fetchFundingRound(projectId: BN, roundNumber: number) {\n return accounts.fetchFundingRound(this.program, projectId, roundNumber);\n }\n\n async fetchAllFundingRounds(projectId: BN) {\n return accounts.fetchAllFundingRounds(this.program, projectId);\n }\n\n async fetchRoundMilestone(projectId: BN, roundNumber: number, milestoneIndex: number) {\n return accounts.fetchRoundMilestone(this.program, projectId, roundNumber, milestoneIndex);\n }\n\n async fetchRoundInvestment(projectId: BN, roundNumber: number, nftMint: PublicKey) {\n return accounts.fetchRoundInvestment(this.program, projectId, roundNumber, nftMint);\n }\n\n async fetchFutureRoundVault(projectId: BN) {\n return accounts.fetchFutureRoundVault(this.program, projectId);\n }\n\n // ===========================================================================\n // Multi-Round Fundraising Instructions\n // ===========================================================================\n\n /**\n * Open a new funding round (R2, R3, R4...)\n *\n * Multi-Round Fundraising: Creates FundingRound PDA, round escrow,\n * and milestone PDAs for the new round. Tokens come from FutureRoundVault.\n *\n * Prerequisites:\n * - Project must be InProgress or Completed state\n * - At least 1 milestone must have passed (for InProgress projects)\n * - No other round currently Open\n * - Current round must be fully funded before opening next\n * - Must have future_round_allocation configured in tokenomics\n */\n async openFundingRound(args: {\n projectId: BN;\n roundAllocationBps: number;\n fundingGoal: BN;\n tiers: Array<{ amount: BN; maxLots: number; tokenRatio: BN }>;\n milestones: Array<{\n percentage: number;\n description: string;\n vestingDurationMonths?: number | null;\n cliffMonths?: number | null;\n instantReleaseBps?: number | null;\n }>;\n usdcMint: PublicKey;\n previousFundingRoundPda?: PublicKey | null;\n }): Promise<string> {\n return instructions.openFundingRound(\n this.program,\n args,\n this.walletPublicKey\n );\n }\n\n /**\n * Invest in a funding round (R2, R3, R4...)\n *\n * Multi-Round Fundraising: Creates investment NFT and deposits USDC\n * to the round-specific escrow. Tokens come from FutureRoundVault.\n */\n async investInRound(args: {\n projectId: BN;\n roundNumber: number;\n amount: BN;\n investorTokenAccount: PublicKey;\n investmentCount: number;\n }): Promise<string> {\n return instructions.investInRound(\n this.program,\n args,\n this.walletPublicKey\n );\n }\n\n /**\n * Cancel round investment within 24-hour cooling-off period\n *\n * Multi-Round Fundraising: Returns USDC from round escrow,\n * closes investment account.\n */\n async cancelRoundInvestment(args: {\n projectId: BN;\n roundNumber: number;\n nftMint: PublicKey;\n investorNftAccount: PublicKey;\n investorUsdcAccount: PublicKey;\n }): Promise<string> {\n return instructions.cancelRoundInvestment(\n this.program,\n args,\n this.walletPublicKey\n );\n }\n\n /**\n * Submit round milestone for investor review\n *\n * Multi-Round Fundraising: Transitions milestone to UnderReview,\n * sets voting deadline.\n */\n async submitRoundMilestone(args: {\n projectId: BN;\n roundNumber: number;\n milestoneIndex: number;\n }): Promise<string> {\n return instructions.submitRoundMilestone(\n this.program,\n args,\n this.walletPublicKey\n );\n }\n\n /**\n * Vote on a round milestone (unified voting - ANY investor can vote)\n *\n * Multi-Round Fundraising: R1, R2, R3... investors can all vote\n * on any round's milestones. Investment can be from any round.\n */\n async voteOnRoundMilestone(args: {\n projectId: BN;\n roundNumber: number;\n milestoneIndex: number;\n nftMint: PublicKey | string;\n choice: { good: object } | { bad: object };\n investmentRoundNumber: number;\n }): Promise<string> {\n return instructions.voteOnRoundMilestone(\n this.program,\n args,\n this.walletPublicKey\n );\n }\n\n /**\n * Finalize voting on a round milestone\n *\n * Multi-Round Fundraising: Processes vote results, transitions\n * milestone to Passed or Failed state.\n */\n async finalizeRoundVoting(args: {\n projectId: BN;\n roundNumber: number;\n milestoneIndex: number;\n }): Promise<string> {\n return instructions.finalizeRoundVoting(\n this.program,\n args\n );\n }\n\n /**\n * Claim milestone funds from a round (founder)\n *\n * Multi-Round Fundraising: Transfers USDC from round escrow\n * to founder's account.\n *\n * @param nextMilestoneDeadline - Deadline for next milestone (required for non-final)\n * Set to BN(0) for final milestone claims\n */\n async claimRoundMilestoneFunds(args: {\n projectId: BN;\n roundNumber: number;\n milestoneIndex: number;\n founderUsdcAccount: PublicKey;\n nextMilestoneDeadline: BN;\n }): Promise<string> {\n return instructions.claimRoundMilestoneFunds(\n this.program,\n args,\n this.walletPublicKey\n );\n }\n\n /**\n * Claim instant tokens for a round milestone (investor)\n *\n * Multi-Round Fundraising: R2+ investors claim instant portion\n * when milestone passes. Tokens come from FutureRoundVault.\n */\n async claimRoundInstantTokens(args: {\n projectId: BN;\n roundNumber: number;\n milestoneIndex: number;\n nftMint: PublicKey;\n investorTokenAccount: PublicKey;\n }): Promise<string> {\n return instructions.claimRoundInstantTokens(\n this.program,\n args,\n this.walletPublicKey\n );\n }\n\n /**\n * Claim vested tokens for a round milestone (investor)\n *\n * Multi-Round Fundraising: R2+ investors claim vested portion\n * after cliff period. Tokens come from FutureRoundVault.\n */\n async claimRoundVestedTokens(args: {\n projectId: BN;\n roundNumber: number;\n milestoneIndex: number;\n nftMint: PublicKey;\n investorTokenAccount: PublicKey;\n }): Promise<string> {\n return instructions.claimRoundVestedTokens(\n this.program,\n args,\n this.walletPublicKey\n );\n }\n\n /**\n * Claim early tokens for a round investment (5% after 24h)\n *\n * Multi-Round Fundraising: R2+ investors claim 5% of token allocation\n * 24 hours after investing. Tokens come from FutureRoundVault.\n */\n async claimRoundEarlyTokens(args: {\n projectId: BN;\n roundNumber: number;\n nftMint: PublicKey;\n investorTokenAccount: PublicKey;\n }): Promise<string> {\n return instructions.claimRoundEarlyTokens(\n this.program,\n args,\n this.walletPublicKey\n );\n }\n\n // ===========================================================================\n // Multi-Round Fundraising Helpers\n // ===========================================================================\n\n /**\n * Check if the next funding round can be opened\n *\n * Returns eligibility status with reason and next round number.\n */\n async canOpenNextRound(projectId: BN): Promise<{\n canOpen: boolean;\n reason?: string;\n nextRoundNumber?: number;\n }> {\n return accounts.canOpenNextRound(this.program, projectId);\n }\n\n /**\n * Get remaining future round allocation in BPS\n */\n getRemainingFutureRoundAllocation(tokenomics: {\n futureRoundAllocationBps: number;\n usedFutureRoundBps?: number;\n }): number {\n return accounts.getRemainingFutureRoundAllocation(tokenomics);\n }\n\n /**\n * Check if a specific round is fully funded\n */\n async isRoundFullyFunded(projectId: BN, roundNumber: number): Promise<boolean> {\n return accounts.isRoundFullyFunded(this.program, projectId, roundNumber);\n }\n\n /**\n * Get round details with computed state\n *\n * Returns funding round data with additional computed fields.\n */\n async getRoundDetails(projectId: BN, roundNumber: number) {\n const fundingRound = await this.fetchFundingRound(projectId, roundNumber);\n if (!fundingRound) {\n return null;\n }\n\n const milestones = [];\n for (let i = 0; i < fundingRound.milestoneCount; i++) {\n const milestone = await this.fetchRoundMilestone(projectId, roundNumber, i);\n if (milestone) {\n milestones.push(milestone);\n }\n }\n\n const totalRaised = fundingRound.totalRaised.toNumber();\n const fundingGoal = fundingRound.fundingGoal.toNumber();\n const fundingProgress = fundingGoal > 0 ? (totalRaised / fundingGoal) * 100 : 0;\n\n return {\n ...fundingRound,\n milestones,\n fundingProgress,\n isFullyFunded: totalRaised >= fundingGoal,\n };\n }\n}\n","/**\n * Raise Type Definitions\n *\n * Re-exports types from the IDL and provides additional utility types.\n */\n\nimport { PublicKey } from '@solana/web3.js';\nimport { BN } from '@coral-xyz/anchor';\n\n// =============================================================================\n// Project State Enums\n// =============================================================================\n\nexport enum ProjectState {\n Draft = 'draft',\n PendingApproval = 'pendingApproval',\n Open = 'open',\n Funded = 'funded',\n InProgress = 'inProgress',\n Completed = 'completed',\n Abandoned = 'abandoned',\n Failed = 'failed',\n TGEFailed = 'tgeFailed',\n Cancelled = 'cancelled',\n}\n\nexport enum MilestoneState {\n Proposed = 'proposed',\n Approved = 'approved',\n InProgress = 'inProgress',\n UnderReview = 'underReview',\n Passed = 'passed',\n Failed = 'failed',\n Unlocked = 'unlocked',\n}\n\nexport enum VoteChoice {\n Good = 'good',\n Bad = 'bad',\n}\n\nexport enum PivotState {\n PendingModeratorApproval = 'pendingModeratorApproval',\n ApprovedAwaitingInvestorWindow = 'approvedAwaitingInvestorWindow',\n Finalized = 'finalized',\n}\n\n// =============================================================================\n// Account Types\n// =============================================================================\n\n/**\n * Tier configuration stored on-chain (includes filled_lots)\n */\nexport interface Tier {\n /** USDC amount per lot */\n amount: BN;\n /** Maximum lots available */\n maxLots: number;\n /** Currently filled lots */\n filledLots: number;\n /** Token allocation per $1 invested */\n tokenRatio: BN;\n /** Vote weight multiplier (basis points, 100 = 1.0x) */\n voteMultiplier: number;\n}\n\n/**\n * Tier configuration input for project initialization\n * Founders pass these when creating a project\n * Note: voteMultiplier is auto-calculated on-chain using logarithmic formula\n */\nexport interface TierConfig {\n /** USDC amount per lot (must be >= 10 USDC = 10_000_000 lamports) */\n amount: BN;\n /** Maximum lots available (must be >= 1) */\n maxLots: number;\n /** Token allocation per $1 invested (must be >= 1) */\n tokenRatio: BN;\n}\n\nexport interface ProjectAccount {\n founder: PublicKey;\n projectId: BN;\n fundingGoal: BN;\n amountRaised: BN;\n state: ProjectState;\n metadataUri: string;\n escrow: PublicKey;\n currentMilestone: number;\n totalMilestones: number;\n /** Number of active tiers (1-10) */\n tierCount: number;\n /** All tier slots (only first tierCount are active) */\n tiers: Tier[];\n tokenMint: PublicKey | null;\n tgeDate: BN | null;\n tokensDeposited: BN;\n tokenAllocationBps: number;\n totalTokenAllocation: BN;\n consecutiveFailures: number;\n investorCount: number;\n /** Milestone Price Increases: BPS multipliers per milestone (10000 = 1.0x)\n * NOTE: If priceMultipliers[0] === 0, project uses dynamic mode (ZEMYTH formula)\n * Otherwise uses static mode (legacy pre-configured multipliers) */\n priceMultipliers: number[];\n /** Milestone Price Increases: Number of milestones that have passed */\n milestonesPassed: number;\n /** Dynamic Price Multiplier: Current calculated multiplier in BPS (10000 = 1.0x)\n * Used when priceMultipliers[0] === 0 (dynamic mode) */\n currentPriceMultiplierBps: number;\n // === Linear Progressive Pricing Fields (add-linear-progressive-pricing) ===\n /** Base multiplier at start of current milestone period (BPS) */\n milestoneBaseMultiplierBps: number;\n /** Timestamp when current milestone period started (0 = legacy mode) */\n milestonePeriodStartedAt: BN;\n /** Expected deadline for current milestone period */\n expectedMilestoneDeadlineTs: BN;\n /** Time-based allocation for current period (50% of ZEMYTH increment) */\n timeAllocationBps: number;\n /** Milestone-based allocation (50% of ZEMYTH increment) */\n milestoneAllocationBps: number;\n bump: number;\n}\n\nexport interface MilestoneAccount {\n project: PublicKey;\n milestoneIndex: number;\n percentage: number;\n description: string;\n state: MilestoneState;\n yesVotes: BN;\n noVotes: BN;\n totalWeight: BN;\n voterCount: number;\n votingEndsAt: BN | null;\n bump: number;\n}\n\nexport interface InvestmentAccount {\n project: PublicKey;\n investor: PublicKey;\n nftMint: PublicKey;\n amount: BN;\n voteWeight: BN;\n tokenAllocation: BN;\n tier: number;\n investedAt: BN;\n tokensClaimed: boolean;\n withdrawnFromPivot: boolean;\n refundClaimed: boolean;\n /** Early Token Release: Whether 5% early tokens have been claimed */\n earlyTokensClaimed: boolean;\n /** Early Token Release: Amount of early tokens claimed (for burn-for-refund tracking) */\n earlyTokensAmount: BN;\n /** Preserve Pivot Vesting Rights: Milestone index at which vesting was frozen (on refund) */\n vestingFrozenAtMilestone: number | null;\n bump: number;\n}\n\nexport interface VoteAccount {\n milestone: PublicKey;\n voter: PublicKey;\n choice: VoteChoice;\n weight: BN;\n votedAt: BN;\n bump: number;\n}\n\nexport interface AdminConfigAccount {\n admin: PublicKey;\n pendingAdmin: PublicKey | null;\n /** Zemyth treasury wallet for platform token allocations */\n zemythTreasury: PublicKey | null;\n bump: number;\n}\n\nexport interface PivotProposalAccount {\n project: PublicKey;\n newMetadataUri: string;\n newMilestones: Array<{ percentage: number; description: string }>;\n state: PivotState;\n proposedAt: BN;\n approvedAt: BN | null;\n withdrawalWindowEndsAt: BN | null;\n withdrawnAmount: BN;\n withdrawnCount: number;\n bump: number;\n}\n\nexport interface TgeEscrowAccount {\n project: PublicKey;\n holdbackAmount: BN;\n scamReports: BN;\n scamWeight: BN;\n scamConfirmed: boolean;\n holdbackReleased: boolean;\n bump: number;\n}\n\n// =============================================================================\n// Instruction Arguments\n// =============================================================================\n\nexport interface InitializeProjectArgs {\n projectId: BN;\n fundingGoal: BN;\n metadataUri: string;\n /** Founder-configured tiers (1-10 tiers) */\n tiers: TierConfig[];\n}\n\nexport interface CreateMilestoneArgs {\n milestoneIndex: number;\n percentage: number;\n description: string;\n}\n\nexport interface InvestArgs {\n amount: BN;\n}\n\nexport interface VoteOnMilestoneArgs {\n choice: VoteChoice;\n}\n\nexport interface SetTgeDateArgs {\n tgeDate: BN;\n tokenMint: PublicKey;\n}\n\nexport interface DepositTokensArgs {\n amount: BN;\n}\n\nexport interface ProposePivotArgs {\n newMetadataUri: string;\n newMilestones: Array<{ percentage: number; description: string }>;\n}\n\n// =============================================================================\n// Event Types\n// =============================================================================\n\nexport interface ProjectCreatedEvent {\n projectId: BN;\n founder: PublicKey;\n fundingGoal: BN;\n metadataUri: string;\n}\n\nexport interface InvestmentMadeEvent {\n projectId: BN;\n investor: PublicKey;\n amount: BN;\n nftMint: PublicKey;\n tier: number;\n voteWeight: BN;\n /** Milestone Price Increases: Effective tier price with multiplier applied */\n effectivePrice: BN;\n /** Milestone Price Increases: Current price multiplier in BPS (10000 = 1.0x) */\n multiplierBps: number;\n}\n\nexport interface MilestoneVoteCastEvent {\n projectId: BN;\n milestoneIndex: number;\n voter: PublicKey;\n choice: VoteChoice;\n weight: BN;\n}\n\nexport interface MilestoneVoteFinalizedEvent {\n projectId: BN;\n milestoneIndex: number;\n passed: boolean;\n yesVotes: BN;\n noVotes: BN;\n}\n\n// =============================================================================\n// Utility Types\n// =============================================================================\n\nexport interface InvestmentWithKey {\n publicKey: PublicKey;\n account: InvestmentAccount;\n}\n\nexport interface MilestoneWithKey {\n publicKey: PublicKey;\n account: MilestoneAccount;\n}\n\nexport interface VoteWithKey {\n publicKey: PublicKey;\n account: VoteAccount;\n}\n\n// =============================================================================\n// Dynamic Tokenomics Types\n// =============================================================================\n\n/**\n * Sub-allocation within a project's founder allocation pool\n * Sub-allocations are founder team tokens (advisors, marketing, etc.)\n */\nexport interface SubAllocation {\n /** Unique ID within project (0-9, max 10 sub-allocations) */\n id: number;\n /** Name of the allocation (UTF-8, e.g., \"advisors\", \"marketing\") */\n name: string;\n /** Basis points from founder allocation pool (e.g., 500 = 5% of total supply) */\n bps: number;\n /** Token destination wallet */\n recipient: PublicKey;\n /** Vesting duration in months (0 = immediate, >0 = linear vesting) */\n vestingMonths: number;\n /** Cliff period in months before vesting starts */\n cliffMonths: number;\n /** Timestamp when sub-allocation was created */\n createdAt: BN;\n /** True if this was added via governance vote (post-Open state) */\n approvedViaGovernance: boolean;\n}\n\n/**\n * Allocation proposal for governance voting\n */\nexport interface AllocationProposalAccount {\n /** Parent project */\n project: PublicKey;\n /** Proposer (must be founder) */\n proposer: PublicKey;\n /** The proposed sub-allocation */\n subAllocation: SubAllocation;\n /** Total vote weight in favor */\n votesFor: BN;\n /** Total vote weight against */\n votesAgainst: BN;\n /** Timestamp when voting ends (7 days from creation) */\n votingEndsAt: BN;\n /** Whether the proposal has been executed */\n executed: boolean;\n /** Proposal index (for unique PDA derivation) */\n proposalIndex: number;\n /** PDA bump seed */\n bump: number;\n}\n\n/**\n * Vote record for an allocation proposal\n */\nexport interface AllocationVoteAccount {\n /** The proposal being voted on */\n proposal: PublicKey;\n /** The investment NFT used to vote */\n nftMint: PublicKey;\n /** Voter's wallet */\n voter: PublicKey;\n /** Vote weight */\n voteWeight: BN;\n /** True = for, False = against */\n voteFor: boolean;\n /** Timestamp of vote */\n votedAt: BN;\n /** PDA bump seed */\n bump: number;\n}\n\n/**\n * Extended Tokenomics account with dynamic allocation fields\n */\nexport interface TokenomicsAccount {\n /** Parent project */\n project: PublicKey;\n /** Token symbol (2-8 chars uppercase) */\n tokenSymbol: string;\n /** Token decimals (default: 9) */\n tokenDecimals: number;\n /** Total token supply */\n totalSupply: BN;\n /** Investor allocation in basis points */\n investorAllocationBps: number;\n /** LP token allocation in basis points */\n lpTokenAllocationBps: number;\n /** LP USDC allocation in basis points */\n lpUsdcAllocationBps: number;\n /** Founder allocation in basis points (includes sub-allocations for team) */\n founderAllocationBps: number;\n /** Zemyth platform allocation in basis points (minimum 1%, vests per milestone) */\n zemythAllocationBps: number;\n /** Number of active sub-allocations (draw from founder allocation) */\n subAllocationCount: number;\n /** Sub-allocations from founder pool (advisors, marketing, etc.) */\n subAllocations: SubAllocation[];\n /** Number of allocation proposals created */\n proposalCount: number;\n /** Founder wallet for vesting */\n founderWallet: PublicKey | null;\n /** Vesting duration in months */\n vestingDurationMonths: number;\n /** Cliff period in months */\n cliffMonths: number;\n /** Early Token Release: Founder milestone-based vesting BPS (e.g., 4750 = 47.5% of founder allocation) */\n founderMilestoneVestingBps: number;\n /** Early Token Release: Founder time-based vesting BPS (e.g., 4750 = 47.5% of founder allocation) */\n founderTimeVestingBps: number;\n /** Future round allocation in basis points (0 or >= 1000, reserved for second-round fundraising) */\n futureRoundAllocationBps: number;\n /** PDA bump seed */\n bump: number;\n}\n\n// =============================================================================\n// Dynamic Tokenomics Instruction Arguments\n// =============================================================================\n\nexport interface AddSubAllocationArgs {\n /** Name of the sub-allocation (e.g., \"advisors\", \"marketing\") */\n name: string;\n /** Basis points from founder allocation pool */\n bps: number;\n /** Token destination wallet */\n recipient: PublicKey;\n /** Vesting duration in months (0 = immediate) */\n vestingMonths: number;\n /** Cliff period in months */\n cliffMonths: number;\n}\n\nexport interface ProposeAllocationChangeArgs {\n /** Name of the sub-allocation */\n name: string;\n /** Basis points from founder allocation pool */\n bps: number;\n /** Token destination wallet */\n recipient: PublicKey;\n /** Vesting duration in months */\n vestingMonths: number;\n /** Cliff period in months */\n cliffMonths: number;\n}\n\nexport interface VoteAllocationChangeArgs {\n /** True = vote for, False = vote against */\n voteFor: boolean;\n}\n\n// =============================================================================\n// Dynamic Tokenomics Events\n// =============================================================================\n\nexport interface SubAllocationAddedEvent {\n projectId: BN;\n projectKey: PublicKey;\n subAllocationId: number;\n name: string;\n bps: number;\n recipient: PublicKey;\n vestingMonths: number;\n cliffMonths: number;\n timestamp: BN;\n}\n\nexport interface AllocationProposalCreatedEvent {\n projectId: BN;\n projectKey: PublicKey;\n proposalKey: PublicKey;\n name: string;\n bps: number;\n recipient: PublicKey;\n votingEndsAt: BN;\n timestamp: BN;\n}\n\nexport interface AllocationVoteCastEvent {\n projectId: BN;\n projectKey: PublicKey;\n proposalKey: PublicKey;\n voter: PublicKey;\n nftMint: PublicKey;\n voteWeight: BN;\n voteFor: boolean;\n timestamp: BN;\n}\n\nexport interface AllocationChangeExecutedEvent {\n projectId: BN;\n projectKey: PublicKey;\n proposalKey: PublicKey;\n subAllocationId: number;\n votesFor: BN;\n votesAgainst: BN;\n timestamp: BN;\n}\n\n// =============================================================================\n// Dynamic Tokenomics Utility Types\n// =============================================================================\n\nexport interface AllocationProposalWithKey {\n publicKey: PublicKey;\n account: AllocationProposalAccount;\n}\n\nexport interface AllocationVoteWithKey {\n publicKey: PublicKey;\n account: AllocationVoteAccount;\n}\n\n// =============================================================================\n// Sub-Allocation Vesting Types\n// =============================================================================\n\n/**\n * Sub-allocation vesting account for tracking vesting schedules\n * Similar to FounderVesting but for sub-allocations (treasury, advisors, etc.)\n */\nexport interface SubAllocationVestingAccount {\n /** Parent project */\n project: PublicKey;\n /** Sub-allocation ID (0-9) */\n subAllocationId: number;\n /** Recipient wallet (only this wallet can claim) */\n recipientWallet: PublicKey;\n /** Total token amount for this sub-allocation */\n totalAmount: BN;\n /** Timestamp when vesting starts (MAE completion) */\n startTimestamp: BN;\n /** Timestamp when cliff ends */\n cliffEnd: BN;\n /** Timestamp when vesting fully ends */\n vestingEnd: BN;\n /** Amount already claimed */\n claimedAmount: BN;\n /** Pending wallet update (for wallet migration) */\n pendingWallet: PublicKey | null;\n /** Timestamp when wallet update was initiated */\n walletUpdateTimestamp: BN | null;\n /** PDA bump seed */\n bump: number;\n}\n\nexport interface SubAllocationVestingWithKey {\n publicKey: PublicKey;\n account: SubAllocationVestingAccount;\n}\n\n/**\n * Arguments for claiming sub-allocation tokens\n */\nexport interface ClaimSubAllocationTokensArgs {\n /** Sub-allocation ID to claim from (0-9) */\n subAllocationId: number;\n}\n\n// =============================================================================\n// Sub-Allocation Vesting Events\n// =============================================================================\n\nexport interface SubAllocationVestingInitializedEvent {\n projectId: BN;\n projectKey: PublicKey;\n subAllocationId: number;\n recipientWallet: PublicKey;\n totalAmount: BN;\n cliffMonths: number;\n vestingMonths: number;\n startTimestamp: BN;\n timestamp: BN;\n}\n\nexport interface SubAllocationTokensClaimedEvent {\n projectId: BN;\n projectKey: PublicKey;\n subAllocationId: number;\n recipient: PublicKey;\n amountClaimed: BN;\n totalClaimed: BN;\n remaining: BN;\n vestingProgressPercent: number;\n timestamp: BN;\n}\n\n// =============================================================================\n// Early Token Release Types\n// =============================================================================\n\n/**\n * Arguments for claim_investor_tokens instruction\n */\nexport interface ClaimInvestorTokensArgs {\n /** Milestone index to claim tokens from */\n milestoneIndex: number;\n}\n\n/**\n * Arguments for claim_founder_milestone_tokens instruction\n */\nexport interface ClaimFounderMilestoneTokensArgs {\n /** Milestone index to claim tokens from */\n milestoneIndex: number;\n}\n\n// =============================================================================\n// Early Token Release Events\n// =============================================================================\n\nexport interface EarlyTokensClaimedEvent {\n projectId: BN;\n projectKey: PublicKey;\n investor: PublicKey;\n nftMint: PublicKey;\n amount: BN;\n timestamp: BN;\n}\n\nexport interface FounderEarlyTokensClaimedEvent {\n projectId: BN;\n projectKey: PublicKey;\n founder: PublicKey;\n amount: BN;\n timestamp: BN;\n}\n\nexport interface FounderMilestoneTokensClaimedEvent {\n projectId: BN;\n projectKey: PublicKey;\n founder: PublicKey;\n milestoneIndex: number;\n amount: BN;\n cumulativeClaimed: BN;\n timestamp: BN;\n}\n\nexport interface TokensBurnedForRefundEvent {\n projectId: BN;\n projectKey: PublicKey;\n investor: PublicKey;\n nftMint: PublicKey;\n amountBurned: BN;\n timestamp: BN;\n}\n\n// =============================================================================\n// Milestone Price Increase Events\n// =============================================================================\n\nexport interface PriceMultiplierActivatedEvent {\n projectId: BN;\n projectKey: PublicKey;\n milestoneIndex: number;\n newMultiplierBps: number;\n timestamp: BN;\n}\n\n// =============================================================================\n// Dynamic Price Multiplier Events (refactor-dynamic-price-multiplier)\n// =============================================================================\n\n/** Emitted when claim_milestone_funds dynamically calculates and updates the price multiplier */\nexport interface PriceMultiplierUpdatedEvent {\n projectId: BN;\n projectKey: PublicKey;\n /** Index of the milestone just claimed */\n milestoneIndex: number;\n /** Number of milestones remaining after this claim */\n remainingMilestones: number;\n /** Days until the next milestone deadline */\n daysToDeadline: BN;\n /** New price multiplier in BPS (10000 = 1.0x) */\n newMultiplierBps: number;\n /** Previous price multiplier in BPS */\n previousMultiplierBps: number;\n timestamp: BN;\n}\n\n// =============================================================================\n// Zemyth Platform Allocation Types (refactor-sub-allocation-to-founder)\n// =============================================================================\n\n/**\n * Zemyth vesting account for platform token allocation\n * Created at project approval, tokens vest proportionally per milestone\n */\nexport interface ZemythVestingAccount {\n /** Parent project */\n project: PublicKey;\n /** Total Zemyth token allocation */\n totalTokens: BN;\n /** Tokens already claimed by Zemyth treasury */\n claimedTokens: BN;\n /** Number of milestones claimed for (0 to milestone_count) */\n milestonesClaimed: number;\n /** Destination treasury wallet for claims */\n treasuryWallet: PublicKey;\n /** Account creation timestamp */\n createdAt: BN;\n /** PDA bump seed */\n bump: number;\n}\n\nexport interface ZemythVestingWithKey {\n publicKey: PublicKey;\n account: ZemythVestingAccount;\n}\n\n// =============================================================================\n// Zemyth Platform Allocation Events (refactor-sub-allocation-to-founder)\n// =============================================================================\n\n/** Emitted when ZemythVesting account is created at project approval */\nexport interface ZemythVestingCreatedEvent {\n projectId: BN;\n projectKey: PublicKey;\n totalTokens: BN;\n treasuryWallet: PublicKey;\n timestamp: BN;\n}\n\n/** Emitted when Zemyth claims tokens for passed milestones */\nexport interface ZemythTokensClaimedEvent {\n projectId: BN;\n projectKey: PublicKey;\n amountClaimed: BN;\n totalClaimed: BN;\n milestonesClaimed: number;\n treasuryWallet: PublicKey;\n timestamp: BN;\n}\n\n// =============================================================================\n// Future Round Allocation Types (add-future-round-allocation)\n// =============================================================================\n\n/**\n * FutureRoundVault account for tracking reserved tokens for future fundraising\n * Created at project approval if future_round_allocation_bps > 0\n */\nexport interface FutureRoundVaultAccount {\n /** Parent project */\n project: PublicKey;\n /** Token mint for the project */\n tokenMint: PublicKey;\n /** Total tokens reserved for future rounds */\n totalAmount: BN;\n /** Tokens already used in subsequent rounds */\n usedAmount: BN;\n /** PDA bump seed */\n bump: number;\n}\n\nexport interface FutureRoundVaultWithKey {\n publicKey: PublicKey;\n account: FutureRoundVaultAccount;\n}\n\n// =============================================================================\n// Multi-Round Fundraising Types (add-second-round-fundraising)\n// =============================================================================\n\n/**\n * FundingRound state enum\n */\nexport enum FundingRoundState {\n Open = 'open',\n Funded = 'funded',\n InProgress = 'inProgress',\n Completed = 'completed',\n Failed = 'failed',\n}\n\n/**\n * Milestone configuration input for funding rounds\n */\nexport interface RoundMilestoneConfig {\n /** Percentage of round funds for this milestone */\n percentage: number;\n /** Milestone description */\n description: string;\n /** Instant release percentage in basis points (e.g., 1000 = 10%) */\n instantReleaseBps: number;\n /** Cliff period in months */\n cliffMonths: number;\n /** Vesting duration in months */\n vestingDurationMonths: number;\n}\n\n/**\n * FundingRound account for R2, R3, R4... rounds\n */\nexport interface FundingRoundAccount {\n /** Parent project */\n project: PublicKey;\n /** Round number (2, 3, 4...) */\n roundNumber: number;\n /** Funding goal for this round */\n fundingGoal: BN;\n /** Amount raised in this round */\n amountRaised: BN;\n /** Round state */\n state: FundingRoundState;\n /** Number of investors in this round */\n investorCount: number;\n /** Allocation from future round pool (basis points) */\n roundAllocationBps: number;\n /** Number of tiers */\n tierCount: number;\n /** Tier configurations */\n tiers: Tier[];\n /** Number of milestones */\n milestoneCount: number;\n /** Current milestone index */\n currentMilestone: number;\n /** Consecutive milestone failures */\n consecutiveFailures: number;\n /** Round creation timestamp */\n createdAt: BN;\n /** PDA bump seed */\n bump: number;\n}\n\nexport interface FundingRoundWithKey {\n publicKey: PublicKey;\n account: FundingRoundAccount;\n}\n\n// =============================================================================\n// Multi-Round Fundraising Instruction Arguments\n// =============================================================================\n\n/**\n * Arguments for open_funding_round instruction\n */\nexport interface OpenFundingRoundArgs {\n /** Allocation from future round pool in basis points */\n roundAllocationBps: number;\n /** Funding goal for this round */\n fundingGoal: BN;\n /** Tier configurations (token_ratio must be <= R1's best tier) */\n tiers: TierConfig[];\n /** Milestone configurations for this round */\n milestones: RoundMilestoneConfig[];\n}\n\n/**\n * Arguments for invest_in_round instruction\n */\nexport interface InvestInRoundArgs {\n /** Round number to invest in */\n roundNumber: number;\n /** Investment amount in USDC lamports */\n amount: BN;\n}\n\n/**\n * Arguments for vote_on_round_milestone instruction\n */\nexport interface VoteOnRoundMilestoneArgs {\n /** Round number */\n roundNumber: number;\n /** Milestone index */\n milestoneIndex: number;\n /** Vote choice */\n choice: VoteChoice;\n}\n\n/**\n * Arguments for claim_round_instant_tokens instruction\n */\nexport interface ClaimRoundInstantTokensArgs {\n /** Milestone index */\n milestoneIndex: number;\n}\n\n/**\n * Arguments for claim_round_vested_tokens instruction\n */\nexport interface ClaimRoundVestedTokensArgs {\n /** Milestone index */\n milestoneIndex: number;\n}\n\n// =============================================================================\n// Multi-Round Fundraising Events\n// =============================================================================\n\nexport interface FundingRoundOpenedEvent {\n projectId: BN;\n projectKey: PublicKey;\n roundNumber: number;\n fundingGoal: BN;\n roundAllocationBps: number;\n tierCount: number;\n milestoneCount: number;\n timestamp: BN;\n}\n\nexport interface RoundInvestmentMadeEvent {\n projectId: BN;\n projectKey: PublicKey;\n roundNumber: number;\n investor: PublicKey;\n amount: BN;\n nftMint: PublicKey;\n tier: number;\n tokensAllocated: BN;\n timestamp: BN;\n}\n\nexport interface RoundMilestoneVoteEvent {\n projectId: BN;\n projectKey: PublicKey;\n roundNumber: number;\n milestoneIndex: number;\n voter: PublicKey;\n choice: VoteChoice;\n weight: BN;\n timestamp: BN;\n}\n\nexport interface RoundMilestoneFinalizedEvent {\n projectId: BN;\n projectKey: PublicKey;\n roundNumber: number;\n milestoneIndex: number;\n passed: boolean;\n yesVotes: BN;\n noVotes: BN;\n timestamp: BN;\n}\n\nexport interface RoundEarlyTokensClaimedEvent {\n projectId: BN;\n roundNumber: number;\n investmentKey: PublicKey;\n nftHolder: PublicKey;\n amount: BN;\n timestamp: BN;\n}\n\nexport interface RoundInstantTokensClaimedEvent {\n projectId: BN;\n roundNumber: number;\n milestoneIndex: number;\n investmentKey: PublicKey;\n nftHolder: PublicKey;\n tokensClaimed: BN;\n timestamp: BN;\n}\n\nexport interface RoundVestedTokensClaimedEvent {\n projectId: BN;\n roundNumber: number;\n milestoneIndex: number;\n investmentKey: PublicKey;\n nftHolder: PublicKey;\n tokensClaimed: BN;\n cumulativeClaimed: BN;\n vestingProgressPercent: number;\n timestamp: BN;\n}\n","/**\n * Raise Error Handling\n *\n * Maps program error codes to SDK errors with helpful messages.\n */\n\nimport { AnchorError } from '@coral-xyz/anchor';\n\n// =============================================================================\n// Error Codes (matching Rust program)\n// =============================================================================\n\nexport const ERROR_CODES = {\n // State Transition Errors (6000-6099)\n InvalidStateTransition: 6000,\n ProjectNotInOpenState: 6001,\n ProjectNotInProgress: 6002,\n MilestoneNotUnderReview: 6003,\n VotingPeriodEnded: 6004,\n VotingPeriodNotEnded: 6005,\n MilestoneNotPassed: 6006,\n MilestoneAlreadyUnlocked: 6007,\n ProjectAlreadyFunded: 6008,\n ProjectNotFunded: 6009,\n\n // Authorization Errors (6100-6199)\n UnauthorizedFounder: 6100,\n UnauthorizedAdmin: 6101,\n NotInvestor: 6102,\n AlreadyVoted: 6103,\n\n // Investment Errors (6200-6299)\n InvestmentBelowMinimum: 6200,\n FundingGoalExceeded: 6201,\n InvalidTier: 6202,\n CoolingOffPeriodActive: 6203,\n CoolingOffPeriodExpired: 6204,\n\n // Milestone Errors (6300-6399)\n InvalidMilestoneIndex: 6300,\n MilestonePercentageInvalid: 6301,\n TotalPercentageExceeded: 6302,\n MilestoneNotInProgress: 6303,\n MilestoneNotApproved: 6304,\n\n // TGE Errors (6400-6499)\n TgeDateNotSet: 6400,\n TgeDateAlreadySet: 6401,\n TgeDateTooSoon: 6402,\n TgeDateTooLate: 6403,\n TgeNotReached: 6404,\n TokensAlreadyClaimed: 6405,\n InsufficientTokensDeposited: 6406,\n\n // Pivot Errors (6500-6599)\n PivotAlreadyProposed: 6500,\n NoPivotProposed: 6501,\n PivotNotApproved: 6502,\n PivotWindowNotEnded: 6503,\n PivotWindowEnded: 6504,\n AlreadyWithdrawnFromPivot: 6505,\n\n // Refund Errors (6800-6899)\n RefundAlreadyClaimed: 6800,\n RefundNotAvailable: 6801,\n ProjectNotAbandoned: 6802,\n\n // Scam Errors (6900-6999)\n ScamReportPeriodEnded: 6900,\n ScamAlreadyReported: 6901,\n ScamNotConfirmed: 6902,\n HoldbackAlreadyReleased: 6903,\n HoldbackPeriodNotEnded: 6904,\n} as const;\n\n// =============================================================================\n// Error Messages\n// =============================================================================\n\nexport const ERROR_MESSAGES: Record<number, string> = {\n // State Transition Errors\n [ERROR_CODES.InvalidStateTransition]: 'Invalid project state transition',\n [ERROR_CODES.ProjectNotInOpenState]: 'Project must be in Open state to accept investments',\n [ERROR_CODES.ProjectNotInProgress]: 'Project must be InProgress to perform this action',\n [ERROR_CODES.MilestoneNotUnderReview]: 'Milestone must be under review to vote',\n [ERROR_CODES.VotingPeriodEnded]: 'Voting period has ended',\n [ERROR_CODES.VotingPeriodNotEnded]: 'Voting period has not ended yet',\n [ERROR_CODES.MilestoneNotPassed]: 'Milestone did not pass voting',\n [ERROR_CODES.MilestoneAlreadyUnlocked]: 'Milestone funds already unlocked',\n [ERROR_CODES.ProjectAlreadyFunded]: 'Project has already reached funding goal',\n [ERROR_CODES.ProjectNotFunded]: 'Project has not reached funding goal',\n\n // Authorization Errors\n [ERROR_CODES.UnauthorizedFounder]: 'Only the project founder can perform this action',\n [ERROR_CODES.UnauthorizedAdmin]: 'Only the admin can perform this action',\n [ERROR_CODES.NotInvestor]: 'You must be an investor to perform this action',\n [ERROR_CODES.AlreadyVoted]: 'You have already voted on this',\n\n // Investment Errors\n [ERROR_CODES.InvestmentBelowMinimum]: 'Investment amount below minimum tier requirement',\n [ERROR_CODES.FundingGoalExceeded]: 'Investment would exceed funding goal',\n [ERROR_CODES.InvalidTier]: 'Invalid investment tier',\n [ERROR_CODES.CoolingOffPeriodActive]: 'Investment is within 24-hour cooling-off period',\n [ERROR_CODES.CoolingOffPeriodExpired]: 'Cooling-off period has expired, cannot cancel',\n\n // Milestone Errors\n [ERROR_CODES.InvalidMilestoneIndex]: 'Invalid milestone index',\n [ERROR_CODES.MilestonePercentageInvalid]: 'Milestone percentage must be between 1-100',\n [ERROR_CODES.TotalPercentageExceeded]: 'Total milestone percentages exceed 100%',\n [ERROR_CODES.MilestoneNotInProgress]: 'Milestone must be in progress',\n [ERROR_CODES.MilestoneNotApproved]: 'Milestone must be approved first',\n\n // TGE Errors\n [ERROR_CODES.TgeDateNotSet]: 'TGE date has not been set',\n [ERROR_CODES.TgeDateAlreadySet]: 'TGE date has already been set',\n [ERROR_CODES.TgeDateTooSoon]: 'TGE date must be at least 15 days in the future',\n [ERROR_CODES.TgeDateTooLate]: 'TGE date must be within 90 days',\n [ERROR_CODES.TgeNotReached]: 'TGE date has not been reached',\n [ERROR_CODES.TokensAlreadyClaimed]: 'Tokens have already been claimed',\n [ERROR_CODES.InsufficientTokensDeposited]: 'Insufficient tokens deposited by founder',\n\n // Pivot Errors\n [ERROR_CODES.PivotAlreadyProposed]: 'A pivot is already pending',\n [ERROR_CODES.NoPivotProposed]: 'No pivot has been proposed',\n [ERROR_CODES.PivotNotApproved]: 'Pivot has not been approved by admin',\n [ERROR_CODES.PivotWindowNotEnded]: '7-day withdrawal window has not ended',\n [ERROR_CODES.PivotWindowEnded]: '7-day withdrawal window has ended',\n [ERROR_CODES.AlreadyWithdrawnFromPivot]: 'Already withdrawn from this pivot',\n\n // Refund Errors\n [ERROR_CODES.RefundAlreadyClaimed]: 'Refund has already been claimed',\n [ERROR_CODES.RefundNotAvailable]: 'Refund is not available',\n [ERROR_CODES.ProjectNotAbandoned]: 'Project has not been abandoned',\n\n // Scam Errors\n [ERROR_CODES.ScamReportPeriodEnded]: '30-day scam report period has ended',\n [ERROR_CODES.ScamAlreadyReported]: 'Already reported this project for scam',\n [ERROR_CODES.ScamNotConfirmed]: 'Scam has not been confirmed',\n [ERROR_CODES.HoldbackAlreadyReleased]: 'Holdback has already been released',\n [ERROR_CODES.HoldbackPeriodNotEnded]: '30-day holdback period has not ended',\n};\n\n// =============================================================================\n// SDK Error Class\n// =============================================================================\n\nexport class RaiseError extends Error {\n constructor(\n public readonly code: number,\n message: string,\n public readonly logs?: string[]\n ) {\n super(message);\n this.name = 'RaiseError';\n }\n\n /**\n * Create from an Anchor error\n */\n static fromAnchorError(error: AnchorError): RaiseError {\n const code = error.error.errorCode.number;\n const message = ERROR_MESSAGES[code] || error.error.errorMessage;\n return new RaiseError(code, message, error.logs);\n }\n\n /**\n * Check if this is a specific error type\n */\n is(errorCode: number): boolean {\n return this.code === errorCode;\n }\n}\n\n// =============================================================================\n// Error Handling Utilities\n// =============================================================================\n\n/**\n * Parse an error and return a RaiseError if it's a program error\n */\nexport function parseError(error: unknown): RaiseError | Error {\n if (error instanceof AnchorError) {\n return RaiseError.fromAnchorError(error);\n }\n if (error instanceof Error) {\n return error;\n }\n return new Error(String(error));\n}\n\n/**\n * Check if an error is a specific Raise error\n */\nexport function isRaiseError(\n error: unknown,\n code?: number\n): error is RaiseError {\n if (!(error instanceof RaiseError)) {\n return false;\n }\n if (code !== undefined) {\n return error.code === code;\n }\n return true;\n}\n\n/**\n * Get a user-friendly error message\n */\nexport function getErrorMessage(error: unknown): string {\n if (error instanceof RaiseError) {\n return error.message;\n }\n if (error instanceof AnchorError) {\n const code = error.error.errorCode.number;\n return ERROR_MESSAGES[code] || error.error.errorMessage;\n }\n if (error instanceof Error) {\n return error.message;\n }\n return 'An unknown error occurred';\n}\n","/**\n * Raise Event Parsing\n *\n * Helpers for parsing program events from transaction logs.\n */\n\nimport { BN } from '@coral-xyz/anchor';\nimport { PublicKey } from '@solana/web3.js';\n\n// =============================================================================\n// Event Types\n// =============================================================================\n\nexport interface ProjectCreatedEvent {\n name: 'ProjectCreated';\n data: {\n projectId: BN;\n founder: PublicKey;\n fundingGoal: BN;\n metadataUri: string;\n };\n}\n\nexport interface ProjectApprovedEvent {\n name: 'ProjectApproved';\n data: {\n projectId: BN;\n };\n}\n\nexport interface ProjectFundedEvent {\n name: 'ProjectFunded';\n data: {\n projectId: BN;\n amountRaised: BN;\n };\n}\n\nexport interface InvestmentMadeEvent {\n name: 'InvestmentMade';\n data: {\n projectId: BN;\n investor: PublicKey;\n amount: BN;\n nftMint: PublicKey;\n tier: number;\n voteWeight: BN;\n };\n}\n\nexport interface InvestmentCancelledEvent {\n name: 'InvestmentCancelled';\n data: {\n projectId: BN;\n investor: PublicKey;\n amount: BN;\n nftMint: PublicKey;\n };\n}\n\nexport interface MilestoneCreatedEvent {\n name: 'MilestoneCreated';\n data: {\n projectId: BN;\n milestoneIndex: number;\n percentage: number;\n description: string;\n };\n}\n\nexport interface MilestoneSubmittedEvent {\n name: 'MilestoneSubmitted';\n data: {\n projectId: BN;\n milestoneIndex: number;\n votingEndsAt: BN;\n };\n}\n\nexport interface VoteCastEvent {\n name: 'VoteCast';\n data: {\n projectId: BN;\n milestoneIndex: number;\n voter: PublicKey;\n choice: { good: object } | { bad: object };\n weight: BN;\n };\n}\n\nexport interface MilestoneVoteFinalizedEvent {\n name: 'MilestoneVoteFinalized';\n data: {\n projectId: BN;\n milestoneIndex: number;\n passed: boolean;\n yesVotes: BN;\n noVotes: BN;\n };\n}\n\nexport interface FundsUnlockedEvent {\n name: 'FundsUnlocked';\n data: {\n projectId: BN;\n milestoneIndex: number;\n amount: BN;\n };\n}\n\nexport interface TgeDateSetEvent {\n name: 'TgeDateSet';\n data: {\n projectId: BN;\n tgeDate: BN;\n tokenMint: PublicKey;\n };\n}\n\nexport interface TokensDepositedEvent {\n name: 'TokensDeposited';\n data: {\n projectId: BN;\n amount: BN;\n };\n}\n\nexport interface TokensClaimedEvent {\n name: 'TokensClaimed';\n data: {\n projectId: BN;\n investor: PublicKey;\n amount: BN;\n };\n}\n\nexport interface RefundClaimedEvent {\n name: 'RefundClaimed';\n data: {\n projectId: BN;\n investor: PublicKey;\n amount: BN;\n };\n}\n\nexport interface PivotProposedEvent {\n name: 'PivotProposed';\n data: {\n projectId: BN;\n newMetadataUri: string;\n };\n}\n\nexport interface PivotApprovedEvent {\n name: 'PivotApproved';\n data: {\n projectId: BN;\n withdrawalWindowEndsAt: BN;\n };\n}\n\nexport interface PivotFinalizedEvent {\n name: 'PivotFinalized';\n data: {\n projectId: BN;\n withdrawnAmount: BN;\n withdrawnCount: number;\n };\n}\n\nexport interface MilestoneReworkedEvent {\n name: 'MilestoneReworked';\n data: {\n projectId: BN;\n milestoneIndex: number;\n milestoneKey: PublicKey;\n consecutiveFailures: number;\n reworkedAt: BN;\n };\n}\n\nexport type RaiseEvent =\n | ProjectCreatedEvent\n | ProjectApprovedEvent\n | ProjectFundedEvent\n | InvestmentMadeEvent\n | InvestmentCancelledEvent\n | MilestoneCreatedEvent\n | MilestoneSubmittedEvent\n | VoteCastEvent\n | MilestoneVoteFinalizedEvent\n | FundsUnlockedEvent\n | TgeDateSetEvent\n | TokensDepositedEvent\n | TokensClaimedEvent\n | RefundClaimedEvent\n | PivotProposedEvent\n | PivotApprovedEvent\n | PivotFinalizedEvent\n | MilestoneReworkedEvent;\n\n// =============================================================================\n// Event Parsing\n// =============================================================================\n\n/**\n * Event name constants\n */\nexport const EVENT_NAMES = {\n ProjectCreated: 'ProjectCreated',\n ProjectApproved: 'ProjectApproved',\n ProjectFunded: 'ProjectFunded',\n InvestmentMade: 'InvestmentMade',\n InvestmentCancelled: 'InvestmentCancelled',\n MilestoneCreated: 'MilestoneCreated',\n MilestoneSubmitted: 'MilestoneSubmitted',\n VoteCast: 'VoteCast',\n MilestoneVoteFinalized: 'MilestoneVoteFinalized',\n FundsUnlocked: 'FundsUnlocked',\n TgeDateSet: 'TgeDateSet',\n TokensDeposited: 'TokensDeposited',\n TokensClaimed: 'TokensClaimed',\n RefundClaimed: 'RefundClaimed',\n PivotProposed: 'PivotProposed',\n PivotApproved: 'PivotApproved',\n PivotFinalized: 'PivotFinalized',\n MilestoneReworked: 'MilestoneReworked',\n} as const;\n\n/**\n * Filter events by name\n *\n * @param events - Array of events\n * @param name - Event name to filter\n * @returns Filtered events\n */\nexport function filterEventsByName<T extends RaiseEvent>(\n events: RaiseEvent[],\n name: T['name']\n): T[] {\n return events.filter((e) => e.name === name) as T[];\n}\n\n/**\n * Get the first event of a specific type\n *\n * @param events - Array of events\n * @param name - Event name to find\n * @returns First matching event or undefined\n */\nexport function findEvent<T extends RaiseEvent>(\n events: RaiseEvent[],\n name: T['name']\n): T | undefined {\n return events.find((e) => e.name === name) as T | undefined;\n}\n","/**\n * Raise Utilities\n *\n * Helper functions for common operations.\n */\n\nimport { BN } from '@coral-xyz/anchor';\nimport { PublicKey, Connection, TransactionSignature } from '@solana/web3.js';\n\n// =============================================================================\n// Transaction Utilities\n// =============================================================================\n\n/**\n * Wait for transaction confirmation\n *\n * @param connection - Solana connection\n * @param signature - Transaction signature\n * @param commitment - Confirmation commitment level\n * @returns Confirmation result\n */\nexport async function confirmTransaction(\n connection: Connection,\n signature: TransactionSignature,\n commitment: 'confirmed' | 'finalized' = 'confirmed'\n) {\n const latestBlockhash = await connection.getLatestBlockhash();\n\n return connection.confirmTransaction(\n {\n signature,\n blockhash: latestBlockhash.blockhash,\n lastValidBlockHeight: latestBlockhash.lastValidBlockHeight,\n },\n commitment\n );\n}\n\n/**\n * Get transaction details with retry\n *\n * @param connection - Solana connection\n * @param signature - Transaction signature\n * @param maxRetries - Maximum number of retries\n * @returns Transaction details\n */\nexport async function getTransactionWithRetry(\n connection: Connection,\n signature: TransactionSignature,\n maxRetries: number = 3\n) {\n for (let i = 0; i < maxRetries; i++) {\n const tx = await connection.getTransaction(signature, {\n maxSupportedTransactionVersion: 0,\n });\n\n if (tx) {\n return tx;\n }\n\n // Wait before retrying\n await new Promise((resolve) => setTimeout(resolve, 1000 * (i + 1)));\n }\n\n throw new Error(`Transaction ${signature} not found after ${maxRetries} retries`);\n}\n\n// =============================================================================\n// BN Utilities\n// =============================================================================\n\n/**\n * Convert BN to number safely\n *\n * @param bn - BN value\n * @returns Number value\n * @throws If value is too large for safe integer\n */\nexport function bnToNumber(bn: BN): number {\n const num = bn.toNumber();\n if (!Number.isSafeInteger(num)) {\n throw new Error(`BN value ${bn.toString()} is too large to convert to number`);\n }\n return num;\n}\n\n/**\n * Convert BN to bigint\n *\n * @param bn - BN value\n * @returns BigInt value\n */\nexport function bnToBigInt(bn: BN): bigint {\n return BigInt(bn.toString());\n}\n\n/**\n * Convert bigint to BN\n *\n * @param value - BigInt value\n * @returns BN value\n */\nexport function bigIntToBN(value: bigint): BN {\n return new BN(value.toString());\n}\n\n// =============================================================================\n// Time Utilities\n// =============================================================================\n\n/**\n * Get current Unix timestamp in seconds\n *\n * @returns Current timestamp\n */\nexport function getCurrentTimestamp(): number {\n return Math.floor(Date.now() / 1000);\n}\n\n/**\n * Convert Unix timestamp to Date\n *\n * @param timestamp - Unix timestamp in seconds\n * @returns Date object\n */\nexport function timestampToDate(timestamp: number | BN): Date {\n const ts = typeof timestamp === 'number' ? timestamp : timestamp.toNumber();\n return new Date(ts * 1000);\n}\n\n/**\n * Check if a timestamp has passed\n *\n * @param timestamp - Unix timestamp in seconds\n * @returns True if timestamp has passed\n */\nexport function hasTimestampPassed(timestamp: number | BN): boolean {\n const ts = typeof timestamp === 'number' ? timestamp : timestamp.toNumber();\n return getCurrentTimestamp() > ts;\n}\n\n/**\n * Calculate time remaining until timestamp\n *\n * @param timestamp - Unix timestamp in seconds\n * @returns Seconds remaining (0 if passed)\n */\nexport function timeRemaining(timestamp: number | BN): number {\n const ts = typeof timestamp === 'number' ? timestamp : timestamp.toNumber();\n const remaining = ts - getCurrentTimestamp();\n return remaining > 0 ? remaining : 0;\n}\n\n/**\n * Format duration in human-readable format\n *\n * @param seconds - Duration in seconds\n * @returns Formatted string (e.g., \"2d 5h 30m\")\n */\nexport function formatDuration(seconds: number): string {\n if (seconds <= 0) return '0s';\n\n const days = Math.floor(seconds / 86400);\n const hours = Math.floor((seconds % 86400) / 3600);\n const minutes = Math.floor((seconds % 3600) / 60);\n const secs = seconds % 60;\n\n const parts: string[] = [];\n if (days > 0) parts.push(`${days}d`);\n if (hours > 0) parts.push(`${hours}h`);\n if (minutes > 0) parts.push(`${minutes}m`);\n if (secs > 0 && days === 0) parts.push(`${secs}s`);\n\n return parts.join(' ') || '0s';\n}\n\n// =============================================================================\n// Percentage Utilities\n// =============================================================================\n\n/**\n * Calculate percentage from basis points\n *\n * @param bps - Basis points (1% = 100 bps)\n * @returns Percentage as decimal\n */\nexport function bpsToPercent(bps: number): number {\n return bps / 10000;\n}\n\n/**\n * Calculate basis points from percentage\n *\n * @param percent - Percentage as decimal\n * @returns Basis points\n */\nexport function percentToBps(percent: number): number {\n return Math.floor(percent * 10000);\n}\n\n/**\n * Calculate percentage of amount\n *\n * @param amount - Total amount\n * @param percentage - Percentage (0-100)\n * @returns Calculated amount\n */\nexport function percentageOf(amount: bigint, percentage: number): bigint {\n return (amount * BigInt(Math.floor(percentage * 100))) / 10000n;\n}\n\n// =============================================================================\n// Validation Utilities\n// =============================================================================\n\n/**\n * Validate milestone percentages sum to 100\n *\n * @param percentages - Array of percentage values\n * @returns True if valid\n */\nexport function validateMilestonePercentages(percentages: number[]): boolean {\n const sum = percentages.reduce((acc, p) => acc + p, 0);\n return sum === 100;\n}\n\n/**\n * Validate metadata URI format\n *\n * @param uri - URI string\n * @param maxLength - Maximum allowed length\n * @returns True if valid\n */\nexport function validateMetadataUri(uri: string, maxLength: number = 200): boolean {\n if (uri.length > maxLength) return false;\n\n try {\n new URL(uri);\n return true;\n } catch {\n return false;\n }\n}\n\n// =============================================================================\n// Account Utilities\n// =============================================================================\n\n/**\n * Check if a public key is valid\n *\n * @param pubkey - String or PublicKey\n * @returns True if valid\n */\nexport function isValidPublicKey(pubkey: string | PublicKey): boolean {\n try {\n if (typeof pubkey === 'string') {\n new PublicKey(pubkey);\n }\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Shorten a public key for display\n *\n * @param pubkey - Public key\n * @param chars - Number of characters to show on each end\n * @returns Shortened string (e.g., \"ABC...XYZ\")\n */\nexport function shortenPublicKey(pubkey: PublicKey | string, chars: number = 4): string {\n const str = pubkey.toString();\n if (str.length <= chars * 2 + 3) return str;\n return `${str.slice(0, chars)}...${str.slice(-chars)}`;\n}\n\n// =============================================================================\n// Preserve Pivot Vesting Rights Utilities\n// =============================================================================\n\n/**\n * Check if an investor can claim vesting for a specific milestone\n * Investors who refunded have their vesting frozen at a specific milestone index.\n * They can only claim vesting from milestones at or before that index.\n *\n * @param vestingFrozenAtMilestone - The milestone index at which vesting was frozen (null if not frozen)\n * @param milestoneIndex - The milestone index to check\n * @returns True if investor can claim vesting for this milestone\n */\nexport function canClaimVestingForMilestone(\n vestingFrozenAtMilestone: number | null,\n milestoneIndex: number\n): boolean {\n // If vesting is not frozen, investor can claim from any milestone\n if (vestingFrozenAtMilestone === null) {\n return true;\n }\n // If vesting is frozen, investor can only claim from milestones at or before the freeze point\n return milestoneIndex <= vestingFrozenAtMilestone;\n}\n\n/**\n * Check if an investment is refunded (any type of refund)\n *\n * @param investment - Investment account\n * @returns True if investment is refunded\n */\nexport function isInvestmentRefunded(investment: {\n withdrawnFromPivot?: boolean;\n refundClaimed?: boolean;\n refundedFromAbandon?: boolean;\n refundedFromExitWindow?: boolean;\n refundedFromShutdown?: boolean;\n vestingFrozenAtMilestone?: number | null;\n}): boolean {\n return (\n investment.withdrawnFromPivot ||\n investment.refundClaimed ||\n investment.refundedFromAbandon ||\n investment.refundedFromExitWindow ||\n investment.refundedFromShutdown ||\n investment.vestingFrozenAtMilestone !== null\n );\n}\n\n/**\n * Check if a project has available investment slots due to refunds\n * Slots become available when investors refund, allowing succession.\n *\n * @param tiers - Array of tier objects with filledLots and maxLots\n * @param tierCount - Number of active tiers\n * @returns True if any tier has available slots\n */\nexport function hasAvailableSlots(\n tiers: Array<{ filledLots: number; maxLots: number }>,\n tierCount: number\n): boolean {\n const activeTiers = tiers.slice(0, tierCount);\n return activeTiers.some((tier) => tier.filledLots < tier.maxLots);\n}\n\n/**\n * Get available slots count for a specific tier\n *\n * @param tier - Tier object with filledLots and maxLots\n * @returns Number of available slots\n */\nexport function getAvailableSlotsForTier(tier: { filledLots: number; maxLots: number }): number {\n return Math.max(0, tier.maxLots - tier.filledLots);\n}\n\n/**\n * Get total available slots across all tiers\n *\n * @param tiers - Array of tier objects with filledLots and maxLots\n * @param tierCount - Number of active tiers\n * @returns Total number of available slots\n */\nexport function getTotalAvailableSlots(\n tiers: Array<{ filledLots: number; maxLots: number }>,\n tierCount: number\n): number {\n const activeTiers = tiers.slice(0, tierCount);\n return activeTiers.reduce((total, tier) => total + getAvailableSlotsForTier(tier), 0);\n}\n"]}
|