@zemyth/raise-sdk 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/README.md +416 -0
  2. package/dist/accounts/index.cjs +258 -0
  3. package/dist/accounts/index.cjs.map +1 -0
  4. package/dist/accounts/index.d.cts +115 -0
  5. package/dist/accounts/index.d.ts +115 -0
  6. package/dist/accounts/index.js +245 -0
  7. package/dist/accounts/index.js.map +1 -0
  8. package/dist/constants/index.cjs +174 -0
  9. package/dist/constants/index.cjs.map +1 -0
  10. package/dist/constants/index.d.cts +143 -0
  11. package/dist/constants/index.d.ts +143 -0
  12. package/dist/constants/index.js +158 -0
  13. package/dist/constants/index.js.map +1 -0
  14. package/dist/errors/index.cjs +177 -0
  15. package/dist/errors/index.cjs.map +1 -0
  16. package/dist/errors/index.d.cts +83 -0
  17. package/dist/errors/index.d.ts +83 -0
  18. package/dist/errors/index.js +170 -0
  19. package/dist/errors/index.js.map +1 -0
  20. package/dist/index.cjs +2063 -0
  21. package/dist/index.cjs.map +1 -0
  22. package/dist/index.d.cts +680 -0
  23. package/dist/index.d.ts +680 -0
  24. package/dist/index.js +1926 -0
  25. package/dist/index.js.map +1 -0
  26. package/dist/instructions/index.cjs +852 -0
  27. package/dist/instructions/index.cjs.map +1 -0
  28. package/dist/instructions/index.d.cts +452 -0
  29. package/dist/instructions/index.d.ts +452 -0
  30. package/dist/instructions/index.js +809 -0
  31. package/dist/instructions/index.js.map +1 -0
  32. package/dist/pdas/index.cjs +241 -0
  33. package/dist/pdas/index.cjs.map +1 -0
  34. package/dist/pdas/index.d.cts +171 -0
  35. package/dist/pdas/index.d.ts +171 -0
  36. package/dist/pdas/index.js +217 -0
  37. package/dist/pdas/index.js.map +1 -0
  38. package/dist/types/index.cjs +44 -0
  39. package/dist/types/index.cjs.map +1 -0
  40. package/dist/types/index.d.cts +229 -0
  41. package/dist/types/index.d.ts +229 -0
  42. package/dist/types/index.js +39 -0
  43. package/dist/types/index.js.map +1 -0
  44. package/package.json +130 -0
  45. package/src/accounts/index.ts +329 -0
  46. package/src/client.ts +715 -0
  47. package/src/constants/index.ts +205 -0
  48. package/src/errors/index.ts +222 -0
  49. package/src/events/index.ts +256 -0
  50. package/src/index.ts +253 -0
  51. package/src/instructions/index.ts +1504 -0
  52. package/src/pdas/index.ts +404 -0
  53. package/src/types/index.ts +267 -0
  54. package/src/utils/index.ts +277 -0
@@ -0,0 +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"]}