@ghostspeak/sdk 2.0.0 โ†’ 2.0.1

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 (102) hide show
  1. package/LICENSE +21 -0
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/GhostSpeakClient-CyeZ6Tyb.d.ts +2061 -0
  4. package/dist/client.d.ts +4 -3
  5. package/dist/crypto.d.ts +2 -2
  6. package/dist/{feature-flags-CEaxXgQQ.d.ts โ†’ feature-flags-3POmoO_Z.d.ts} +833 -1190
  7. package/dist/index.d.ts +206 -4543
  8. package/dist/ipfs-types-KJcvy9Qk.d.ts +553 -0
  9. package/dist/minimal/core-minimal.d.ts +2037 -82
  10. package/dist/utils.d.ts +4 -4
  11. package/package.json +5 -29
  12. package/dist/EscrowInstructions-4P3H6ETO.js +0 -2
  13. package/dist/EscrowInstructions-4P3H6ETO.js.map +0 -1
  14. package/dist/GhostSpeakClient-4SROinEf.d.ts +0 -503
  15. package/dist/accounts-IUZMPYVE.js +0 -2
  16. package/dist/accounts-IUZMPYVE.js.map +0 -1
  17. package/dist/agent-GZ2OES75.js +0 -2
  18. package/dist/agent-GZ2OES75.js.map +0 -1
  19. package/dist/auctionMarketplace-W4YM7HKU.js +0 -2
  20. package/dist/auctionMarketplace-W4YM7HKU.js.map +0 -1
  21. package/dist/chunk-2KOOI5BX.js +0 -2
  22. package/dist/chunk-2KOOI5BX.js.map +0 -1
  23. package/dist/chunk-32GWTXRJ.js +0 -3
  24. package/dist/chunk-32GWTXRJ.js.map +0 -1
  25. package/dist/chunk-B4WUFVLE.js +0 -2
  26. package/dist/chunk-B4WUFVLE.js.map +0 -1
  27. package/dist/chunk-C2OTQ5YS.js +0 -2
  28. package/dist/chunk-C2OTQ5YS.js.map +0 -1
  29. package/dist/chunk-CTC4ZJ26.js +0 -5
  30. package/dist/chunk-CTC4ZJ26.js.map +0 -1
  31. package/dist/chunk-DF7LLAMH.js +0 -2
  32. package/dist/chunk-DF7LLAMH.js.map +0 -1
  33. package/dist/chunk-DJ356OUX.js +0 -2
  34. package/dist/chunk-DJ356OUX.js.map +0 -1
  35. package/dist/chunk-DK5YDBXR.js +0 -2
  36. package/dist/chunk-DK5YDBXR.js.map +0 -1
  37. package/dist/chunk-DOTF5ECA.js +0 -4
  38. package/dist/chunk-DOTF5ECA.js.map +0 -1
  39. package/dist/chunk-FKEUXXZS.js +0 -30
  40. package/dist/chunk-FKEUXXZS.js.map +0 -1
  41. package/dist/chunk-GSHXEKBW.js +0 -2
  42. package/dist/chunk-GSHXEKBW.js.map +0 -1
  43. package/dist/chunk-IZDAEOLH.js +0 -2
  44. package/dist/chunk-IZDAEOLH.js.map +0 -1
  45. package/dist/chunk-JY554RGE.js +0 -3
  46. package/dist/chunk-JY554RGE.js.map +0 -1
  47. package/dist/chunk-KK3HV2RD.js +0 -3
  48. package/dist/chunk-KK3HV2RD.js.map +0 -1
  49. package/dist/chunk-PPOCDM6G.js +0 -2
  50. package/dist/chunk-PPOCDM6G.js.map +0 -1
  51. package/dist/chunk-PUI35LBF.js +0 -2
  52. package/dist/chunk-PUI35LBF.js.map +0 -1
  53. package/dist/chunk-Q34J6YDA.js +0 -11
  54. package/dist/chunk-Q34J6YDA.js.map +0 -1
  55. package/dist/chunk-QATBFZMM.js +0 -3
  56. package/dist/chunk-QATBFZMM.js.map +0 -1
  57. package/dist/chunk-QTKN3VZV.js +0 -2
  58. package/dist/chunk-QTKN3VZV.js.map +0 -1
  59. package/dist/chunk-RFBYMTTN.js +0 -2
  60. package/dist/chunk-RFBYMTTN.js.map +0 -1
  61. package/dist/chunk-RJJPOLCK.js +0 -22
  62. package/dist/chunk-RJJPOLCK.js.map +0 -1
  63. package/dist/chunk-RTWJTEND.js +0 -2
  64. package/dist/chunk-RTWJTEND.js.map +0 -1
  65. package/dist/chunk-SR3ZJCME.js +0 -2
  66. package/dist/chunk-SR3ZJCME.js.map +0 -1
  67. package/dist/chunk-TAWXH7KX.js +0 -2
  68. package/dist/chunk-TAWXH7KX.js.map +0 -1
  69. package/dist/client.js +0 -2
  70. package/dist/client.js.map +0 -1
  71. package/dist/confidential-transfer-manager-CGS3T5DG.js +0 -2
  72. package/dist/confidential-transfer-manager-CGS3T5DG.js.map +0 -1
  73. package/dist/crypto.js +0 -2
  74. package/dist/crypto.js.map +0 -1
  75. package/dist/elgamal-3ABOJSHC.js +0 -2
  76. package/dist/elgamal-3ABOJSHC.js.map +0 -1
  77. package/dist/enhanced-client-errors-W22U3LNH.js +0 -2
  78. package/dist/enhanced-client-errors-W22U3LNH.js.map +0 -1
  79. package/dist/errors.js +0 -2
  80. package/dist/errors.js.map +0 -1
  81. package/dist/generated-U3L4KUE4.js +0 -2
  82. package/dist/generated-U3L4KUE4.js.map +0 -1
  83. package/dist/ghostspeak_wasm-3KPNJTSS.js +0 -2
  84. package/dist/ghostspeak_wasm-3KPNJTSS.js.map +0 -1
  85. package/dist/index.js +0 -97
  86. package/dist/index.js.map +0 -1
  87. package/dist/ipfs-types-BlxtJ3q2.d.ts +0 -194
  88. package/dist/metafile-esm.json +0 -1
  89. package/dist/minimal/core-minimal.js +0 -12
  90. package/dist/minimal/core-minimal.js.map +0 -1
  91. package/dist/pda-2GUWRQ5G.js +0 -2
  92. package/dist/pda-2GUWRQ5G.js.map +0 -1
  93. package/dist/registerAgentCompressed-L6ACXD2Z.js +0 -2
  94. package/dist/registerAgentCompressed-L6ACXD2Z.js.map +0 -1
  95. package/dist/token-2022-rpc-SRHRFN5Y.js +0 -2
  96. package/dist/token-2022-rpc-SRHRFN5Y.js.map +0 -1
  97. package/dist/types.js +0 -2
  98. package/dist/types.js.map +0 -1
  99. package/dist/utils.js +0 -2
  100. package/dist/utils.js.map +0 -1
  101. package/dist/zk-proof-builder-GXZ42QZA.js +0 -2
  102. package/dist/zk-proof-builder-GXZ42QZA.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/utils/confidential-transfer-manager.ts","../src/utils/client-encryption.ts","../src/utils/feature-flags.ts","../src/utils/private-metadata.ts","../src/utils/spl-token-integration.ts","../src/utils/token-2022-spl-integration.ts"],"names":["confidential_transfer_manager_exports","__export","ConfidentialTransferManager","client_encryption_exports","ClientEncryptionService","generateElGamalKeypair","generateLocalPrivacyProof","prepareForZkMigration","verifyLocalPrivacyProof","feature_flags_exports","DEFAULT_FLAGS","DEV_FLAGS","FeatureFlagManager","getFeatureFlags","getPrivacyStatus","isFeatureEnabled","environment","envOverrides","parseEnvBool","key","value","confidentialTransfers","useZkProofs","useClientEncryption","feature","enabled","flags","globalFeatureFlags","options","amount","recipientPubkey","ciphertext","encryptAmount","commitment","encrypted","secretKey","result","decryptAmount","data","chunks","i","chunk","paddedChunk","bytesToBigInt","combined","privateData","publicData","serialized","dataBytes","storageHash","pubkey","bigIntToBytes","sha256","bytesToHex","bytes","temp","statement","proofData","randomBytes","publicInputs","proof","proofCommitment","inputCommitment","randomness","MockIPFSProvider","hash","LocalStorageProvider","hex","hexToBytes","PrivateMetadataStorage","storageProvider","encryptionService","publicMetadata","privateMetadata","storageLocation","reference","expectedHash","metadata","decryptedBytes","onChainData","offChainReference","items","results","item","stored","json","_encrypted","_secretKey","PrivateDataQuery","field","operator","storage","references","ref","matches","condition","estimateStorageCost","dataSize","provider","createPrivacyManifest","dataTypes","spl_token_integration_exports","ASSOCIATED_TOKEN_PROGRAM_ID","EXTENSION_INSTRUCTIONS","ExtensionType","TOKEN_2022_PROGRAM_ADDRESS","TOKEN_2022_PROGRAM_ID","TOKEN_PROGRAM_ID","calculateTransferAmountWithFee","configureConfidentialAccount","createMintWithExtensions","depositConfidential","getMintExtensions","getOrCreateAssociatedTokenAccount","isToken2022","transferConfidential","transferWithFee","withdrawConfidential","__reExport","spl_token_star","address","connection","params","instructions","extensions","mintLen","getMintLen","lamports","createAccountInstruction","getStructEncoder","getU32Encoder","getU64Encoder","fixEncoderSize","getAddressEncoder","toAddress","config","convertToIInstruction","createInitializeTransferFeeConfigInstruction","PublicKey","createInitializeInterestBearingMintInstruction","createInitializeDefaultAccountStateInstruction","createInitializeMintCloseAuthorityInstruction","createInitializePermanentDelegateInstruction","createInitializeMint2Instruction","mintPubkey","mintInfo","getMint","transferFeeConfig","getTransferFeeConfig","fee","calculateTransferFee","createTransferCheckedWithFeeInstruction","s","createTransferCheckedInstruction","payer","mint","owner","allowOwnerOffCurve","ownerPubkey","programId","associatedToken","getAssociatedTokenAddressSync","getAccount","instruction","createAssociatedTokenAccountIdempotentInstruction","accounts","getExtensionTypes","includesFee","account","elgamalPubkey","decryptableZeroBalance","maximumPendingBalanceCredits","proofInstructionOffset","authority","Connection","w","decimals","newDecryptableAvailableBalance","bytesToNumberLE","_connection","instructionType","getU8Encoder","getBytesEncoder","source","destination","newSourceDecryptableAvailableBalance","feeBasisPoints","maximumFee","defaultProofMode","privacyStatus","zkAvailable","isZkProgramAvailable","getZkProgramStatus","warnings","proofInstructions","zeroProof","encoder","encryptedZero","serializeCiphertext","accountPubkey","encryptedAmount","rangeProof","generateRangeProofWithCommitment","sourceBalance","transferProof","generateTransferProofWithInstruction","newSourceCiphertext","destCiphertext","encryptedNewBalance","mode","zeroAmount","_account","callback","monitoring","status","resolve"],"mappings":"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","file":"chunk-JY554RGE.js","sourcesContent":["/**\n * Confidential Transfer Manager\n * \n * High-level interface for managing confidential transfers with Token-2022.\n * Handles proof generation, account configuration, and transfer operations\n * with proper fallback behavior while the ZK program is disabled.\n */\n\nimport type { Address, IInstruction, TransactionSigner } from '@solana/kit'\nimport { getStructEncoder, getU8Encoder, getU64Encoder, getBytesEncoder, fixEncoderSize } from '@solana/kit'\nimport type { Connection } from '@solana/web3.js'\n\nimport {\n generateElGamalKeypair,\n encryptAmount,\n type ElGamalKeypair,\n type ElGamalCiphertext,\n type ElGamalPubkey\n} from './elgamal.js'\n\nimport {\n generateRangeProofWithCommitment,\n generateTransferProofWithInstruction,\n isZkProgramAvailable,\n getZkProgramStatus,\n ProofMode\n} from './zk-proof-builder.js'\n\nimport {\n ClientEncryptionService,\n type EncryptedData\n} from './client-encryption.js'\n\nimport {\n PrivateMetadataStorage,\n type StoredPrivateData\n} from './private-metadata.js'\n\nimport { getFeatureFlags } from './feature-flags.js'\n\nimport {\n TOKEN_2022_PROGRAM_ADDRESS,\n EXTENSION_INSTRUCTIONS\n} from './token-2022-spl-integration.js'\n\nimport { randomBytes, bytesToHex } from '@noble/curves/abstract/utils'\nimport { sha256 } from '@noble/hashes/sha256'\n\n// =====================================================\n// TYPES\n// =====================================================\n\nexport interface ConfidentialAccount {\n /** The account address */\n address: Address\n /** The mint address */\n mint: Address\n /** ElGamal public key for this account */\n elgamalPubkey: ElGamalPubkey\n /** Current encrypted balance */\n encryptedBalance: ElGamalCiphertext\n /** Decryptable available balance */\n decryptableAvailableBalance: bigint\n /** Maximum pending balance credit counter */\n maxPendingBalanceCredits: bigint\n /** Whether the account is configured for confidential transfers */\n configured: boolean\n}\n\nexport interface ConfidentialTransferConfig {\n /** The mint to configure */\n mint: Address\n /** Authority for confidential transfers */\n authority: TransactionSigner\n /** Whether to auto-approve new accounts */\n autoApproveNewAccounts: boolean\n /** Optional auditor ElGamal public key */\n auditorElgamalPubkey?: ElGamalPubkey\n}\n\nexport interface ConfigureAccountParams {\n /** The token account to configure */\n account: Address\n /** The mint address */\n mint: Address\n /** The account's ElGamal keypair */\n elgamalKeypair: ElGamalKeypair\n /** Initial decryptable balance (usually 0) */\n decryptableZeroBalance: bigint\n /** Maximum pending balance credit counter */\n maxPendingBalanceCredits: bigint\n /** Account owner/authority */\n authority: TransactionSigner\n /** Proof mode */\n proofMode?: ProofMode\n}\n\nexport interface DepositParams {\n /** The account to deposit to */\n account: Address\n /** The mint address */\n mint: Address\n /** Amount to deposit (in token units) */\n amount: bigint\n /** Token decimals */\n decimals: number\n /** Account authority */\n authority: TransactionSigner\n /** Proof mode */\n proofMode?: ProofMode\n}\n\nexport interface WithdrawParams {\n /** The account to withdraw from */\n account: Address\n /** The mint address */\n mint: Address\n /** Amount to withdraw (in token units) */\n amount: bigint\n /** Token decimals */\n decimals: number\n /** ElGamal secret key for decryption */\n elgamalSecretKey: Uint8Array\n /** New decryptable available balance after withdrawal */\n newDecryptableBalance: bigint\n /** Account authority */\n authority: TransactionSigner\n /** Proof mode */\n proofMode?: ProofMode\n}\n\nexport interface TransferParams {\n /** Source account */\n source: Address\n /** Destination account */\n destination: Address\n /** The mint address */\n mint: Address\n /** Transfer amount */\n amount: bigint\n /** Source ElGamal keypair */\n sourceKeypair: ElGamalKeypair\n /** Destination ElGamal public key */\n destElgamalPubkey: ElGamalPubkey\n /** New source decryptable balance */\n newSourceDecryptableBalance: bigint\n /** Transfer authority */\n authority: TransactionSigner\n /** Proof mode */\n proofMode?: ProofMode\n}\n\n// =====================================================\n// MAIN CLASS\n// =====================================================\n\nexport class ConfidentialTransferManager {\n private clientEncryption: ClientEncryptionService\n private metadataStorage: PrivateMetadataStorage\n private featureFlags = getFeatureFlags()\n \n constructor(\n private connection: Connection,\n private defaultProofMode: ProofMode = ProofMode.ZK_PROGRAM_WITH_FALLBACK\n ) {\n this.clientEncryption = new ClientEncryptionService()\n this.metadataStorage = new PrivateMetadataStorage()\n }\n\n /**\n * Get the current privacy mode status\n */\n async getPrivacyStatus(): Promise<{\n mode: 'zk-proofs' | 'client-encryption' | 'disabled'\n available: boolean\n message: string\n }> {\n const privacyStatus = this.featureFlags.getPrivacyStatus()\n const zkAvailable = await isZkProgramAvailable(this.connection)\n \n return {\n mode: privacyStatus.mode,\n available: privacyStatus.mode !== 'disabled',\n message: zkAvailable \n ? 'ZK proofs available for enhanced privacy'\n : privacyStatus.message\n }\n }\n\n /**\n * Get the current status of the ZK program\n */\n async getZkProgramStatus(): Promise<string> {\n return getZkProgramStatus(this.connection)\n }\n\n /**\n * Check if ZK program is available\n */\n async isZkProgramAvailable(): Promise<boolean> {\n return isZkProgramAvailable(this.connection)\n }\n\n /**\n * Generate a new ElGamal keypair for an account\n */\n generateKeypair(): ElGamalKeypair {\n return generateElGamalKeypair()\n }\n\n /**\n * Configure a mint for confidential transfers\n */\n createConfigureMintInstruction(config: ConfidentialTransferConfig): IInstruction {\n const instructionType = EXTENSION_INSTRUCTIONS.ConfidentialTransfer.InitializeConfidentialTransferMint\n \n // Encode instruction data\n const encoder = getStructEncoder([\n ['instruction', getU8Encoder()],\n ['autoApproveNewAccounts', getU8Encoder()],\n ['auditorElgamalPubkey', fixEncoderSize(getBytesEncoder(), 32)]\n ])\n\n const data = encoder.encode({\n instruction: instructionType,\n autoApproveNewAccounts: config.autoApproveNewAccounts ? 1 : 0,\n auditorElgamalPubkey: config.auditorElgamalPubkey ?? new Uint8Array(32)\n })\n\n return {\n programAddress: TOKEN_2022_PROGRAM_ADDRESS,\n accounts: [\n { address: config.mint, role: 2 }, // Writable\n { address: config.authority.address, role: 3 } // Signer\n ],\n data\n }\n }\n\n /**\n * Configure an account for confidential transfers\n */\n async createConfigureAccountInstructions(params: ConfigureAccountParams): Promise<{\n instructions: IInstruction[]\n proofInstructions: IInstruction[]\n warnings: string[]\n }> {\n const warnings: string[] = []\n const proofInstructions: IInstruction[] = []\n const instructions: IInstruction[] = []\n\n // Generate zero-balance proof\n const zeroProof = await this.generateZeroBalanceProof(\n params.elgamalKeypair.publicKey,\n params.proofMode ?? this.defaultProofMode\n )\n\n if (zeroProof.requiresZkProgram && !await isZkProgramAvailable(this.connection)) {\n warnings.push(await getZkProgramStatus(this.connection))\n }\n\n if (zeroProof.instruction) {\n proofInstructions.push(zeroProof.instruction)\n }\n\n // Create configure account instruction\n const instructionType = EXTENSION_INSTRUCTIONS.ConfidentialTransfer.ConfigureAccount\n \n const encoder = getStructEncoder([\n ['instruction', getU8Encoder()],\n ['elgamalPubkey', fixEncoderSize(getBytesEncoder(), 32)],\n ['decryptableZeroBalance', fixEncoderSize(getBytesEncoder(), 64)],\n ['maxPendingBalanceCredits', getU64Encoder()],\n ['proofInstructionOffset', getU8Encoder()]\n ])\n\n const encryptedZero = encryptAmount(0n, params.elgamalKeypair.publicKey)\n const data = encoder.encode({\n instruction: instructionType,\n elgamalPubkey: params.elgamalKeypair.publicKey,\n decryptableZeroBalance: serializeCiphertext(encryptedZero),\n maxPendingBalanceCredits: params.maxPendingBalanceCredits,\n proofInstructionOffset: proofInstructions.length\n })\n\n instructions.push({\n programAddress: TOKEN_2022_PROGRAM_ADDRESS,\n accounts: [\n { address: params.account, role: 2 }, // Writable\n { address: params.mint, role: 0 }, // Readonly\n { address: params.authority.address, role: 3 } // Signer\n ],\n data\n })\n\n return { instructions, proofInstructions, warnings }\n }\n\n /**\n * Create deposit instructions with dual-mode support\n */\n async createDepositInstructions(params: DepositParams): Promise<{\n instructions: IInstruction[]\n proofInstructions: IInstruction[]\n encryptedAmount: ElGamalCiphertext\n warnings: string[]\n metadata?: StoredPrivateData\n }> {\n const warnings: string[] = []\n const proofInstructions: IInstruction[] = []\n const instructions: IInstruction[] = []\n let metadata: StoredPrivateData | undefined\n\n // Check privacy mode\n const privacyStatus = await this.getPrivacyStatus()\n const zkAvailable = await isZkProgramAvailable(this.connection)\n \n // Get account ElGamal pubkey (would be fetched from account in practice)\n const accountPubkey = await this.getAccountElGamalPubkey(params.account)\n \n // Encrypt the deposit amount\n const encryptedAmount = encryptAmount(params.amount, accountPubkey)\n \n // Dual-mode logic\n if (zkAvailable && privacyStatus.mode === 'zk-proofs') {\n // ZK proof mode\n const randomness = randomBytes(32)\n randomness[0] &= 248\n randomness[31] &= 127\n randomness[31] |= 64\n \n const rangeProof = await generateRangeProofWithCommitment(\n params.amount,\n randomness,\n { \n mode: params.proofMode ?? this.defaultProofMode,\n connection: this.connection \n }\n )\n\n if (rangeProof.requiresZkProgram && !await isZkProgramAvailable(this.connection)) {\n warnings.push(await getZkProgramStatus(this.connection))\n }\n\n if (rangeProof.instruction) {\n proofInstructions.push(rangeProof.instruction)\n }\n } else if (privacyStatus.mode === 'client-encryption') {\n // Client encryption mode\n warnings.push('Using client-side encryption (Beta). ZK proofs will be enabled when available.')\n \n // Store encrypted metadata off-chain\n if (this.featureFlags.isEnabled('ENABLE_IPFS_STORAGE')) {\n const privateData = {\n amount: params.amount.toString(),\n timestamp: Date.now(),\n type: 'deposit'\n }\n \n const publicData = {\n account: params.account,\n mint: params.mint,\n decimals: params.decimals\n }\n \n metadata = await this.metadataStorage.storePrivateData(\n privateData,\n publicData,\n accountPubkey\n )\n }\n } else {\n warnings.push('Privacy features are disabled. Enable in feature flags for enhanced privacy.')\n }\n\n // Create deposit instruction\n const instructionType = EXTENSION_INSTRUCTIONS.ConfidentialTransfer.Deposit\n \n const encoder = getStructEncoder([\n ['instruction', getU8Encoder()],\n ['amount', getU64Encoder()],\n ['decimals', getU8Encoder()],\n ['proofInstructionOffset', getU8Encoder()]\n ])\n\n const data = encoder.encode({\n instruction: instructionType,\n amount: params.amount,\n decimals: params.decimals,\n proofInstructionOffset: proofInstructions.length\n })\n\n instructions.push({\n programAddress: TOKEN_2022_PROGRAM_ADDRESS,\n accounts: [\n { address: params.account, role: 2 }, // Writable source\n { address: params.mint, role: 0 }, // Readonly\n { address: params.authority.address, role: 3 } // Signer\n ],\n data\n })\n\n return { instructions, proofInstructions, encryptedAmount, warnings, metadata }\n }\n\n /**\n * Create transfer instructions with dual-mode support\n */\n async createTransferInstructions(params: TransferParams): Promise<{\n instructions: IInstruction[]\n proofInstructions: IInstruction[]\n newSourceBalance: ElGamalCiphertext\n destCiphertext: ElGamalCiphertext\n warnings: string[]\n metadata?: StoredPrivateData\n }> {\n const warnings: string[] = []\n const proofInstructions: IInstruction[] = []\n const instructions: IInstruction[] = []\n let metadata: StoredPrivateData | undefined\n\n // Check privacy mode\n const privacyStatus = await this.getPrivacyStatus()\n const zkAvailable = await isZkProgramAvailable(this.connection)\n \n // Get current source balance (would be fetched in practice)\n const sourceBalance = await this.getEncryptedBalance(params.source)\n \n // Dual-mode logic\n let transferProof: {\n newSourceBalance: ElGamalCiphertext\n destCiphertext: ElGamalCiphertext\n requiresZkProgram: boolean\n instruction?: IInstruction\n }\n \n if (zkAvailable && privacyStatus.mode === 'zk-proofs') {\n // ZK proof mode\n transferProof = await generateTransferProofWithInstruction(\n sourceBalance,\n params.amount,\n params.sourceKeypair.publicKey,\n params.destElgamalPubkey,\n params.sourceKeypair.secretKey,\n { \n mode: params.proofMode ?? this.defaultProofMode,\n connection: this.connection \n }\n )\n\n if (transferProof.requiresZkProgram && !await isZkProgramAvailable(this.connection)) {\n warnings.push(await getZkProgramStatus(this.connection))\n }\n\n if (transferProof.instruction) {\n proofInstructions.push(transferProof.instruction)\n }\n } else if (privacyStatus.mode === 'client-encryption') {\n // Client encryption mode\n warnings.push('Using client-side encryption for transfer (Beta). ZK proofs will be enabled when available.')\n \n // Create client-side encrypted transfer data\n // For now, we skip actual decryption and use mock values\n // In production, this would decrypt the current balance\n const newSourceCiphertext = encryptAmount(params.newSourceDecryptableBalance, params.sourceKeypair.publicKey)\n const destCiphertext = encryptAmount(params.amount, params.destElgamalPubkey)\n \n transferProof = {\n newSourceBalance: newSourceCiphertext,\n destCiphertext: destCiphertext,\n requiresZkProgram: false\n }\n \n // Store transfer metadata off-chain\n if (this.featureFlags.isEnabled('ENABLE_IPFS_STORAGE')) {\n const privateData = {\n amount: params.amount.toString(),\n source: params.source,\n destination: params.destination,\n timestamp: Date.now(),\n type: 'transfer'\n }\n \n const publicData = {\n mint: params.mint,\n transferHash: this.createTransferHash(params)\n }\n \n metadata = await this.metadataStorage.storePrivateData(\n privateData,\n publicData,\n params.destElgamalPubkey\n )\n }\n } else {\n warnings.push('Privacy features are disabled. Enable in feature flags for enhanced privacy.')\n // Create mock proof for non-private mode\n transferProof = {\n newSourceBalance: sourceBalance,\n destCiphertext: encryptAmount(params.amount, params.destElgamalPubkey),\n requiresZkProgram: false\n }\n }\n\n // Create transfer instruction\n const instructionType = EXTENSION_INSTRUCTIONS.ConfidentialTransfer.Transfer\n \n const encoder = getStructEncoder([\n ['instruction', getU8Encoder()],\n ['newSourceDecryptableBalance', fixEncoderSize(getBytesEncoder(), 64)],\n ['proofInstructionOffset', getU8Encoder()]\n ])\n\n const encryptedNewBalance = encryptAmount(\n params.newSourceDecryptableBalance,\n params.sourceKeypair.publicKey\n )\n\n const data = encoder.encode({\n instruction: instructionType,\n newSourceDecryptableBalance: serializeCiphertext(encryptedNewBalance),\n proofInstructionOffset: proofInstructions.length\n })\n\n instructions.push({\n programAddress: TOKEN_2022_PROGRAM_ADDRESS,\n accounts: [\n { address: params.source, role: 2 }, // Writable source\n { address: params.destination, role: 2 }, // Writable destination\n { address: params.mint, role: 0 }, // Readonly\n { address: params.authority.address, role: 3 } // Signer\n ],\n data\n })\n\n return {\n instructions,\n proofInstructions,\n newSourceBalance: transferProof.newSourceBalance as ElGamalCiphertext,\n destCiphertext: transferProof.destCiphertext as ElGamalCiphertext,\n warnings,\n metadata\n }\n }\n\n // =====================================================\n // HELPER METHODS\n // =====================================================\n\n /**\n * Generate a zero-balance proof for account configuration\n */\n private async generateZeroBalanceProof(\n pubkey: ElGamalPubkey,\n mode: ProofMode\n ): Promise<{\n proof: Uint8Array\n commitment?: Uint8Array\n instruction?: IInstruction\n requiresZkProgram: boolean\n }> {\n const zeroAmount = 0n\n const randomness = randomBytes(32)\n randomness[0] &= 248\n randomness[31] &= 127\n randomness[31] |= 64\n\n return generateRangeProofWithCommitment(zeroAmount, randomness, { \n mode,\n connection: this.connection \n })\n }\n\n /**\n * Get account's ElGamal public key (placeholder)\n */\n private async getAccountElGamalPubkey(_account: Address): Promise<ElGamalPubkey> {\n // In practice, this would fetch from the account data\n // For now, return a dummy key\n return new Uint8Array(32)\n }\n\n /**\n * Get encrypted balance (placeholder)\n */\n private async getEncryptedBalance(_account: Address): Promise<ElGamalCiphertext> {\n // In practice, this would fetch from the account data\n // For now, return a dummy ciphertext\n const dummyBalance = encryptAmount(1000n, new Uint8Array(32))\n return dummyBalance\n }\n\n /**\n * Create a transfer hash for metadata reference\n */\n private createTransferHash(params: TransferParams): Uint8Array {\n const data = {\n source: params.source,\n destination: params.destination,\n amount: params.amount.toString(),\n timestamp: Date.now()\n }\n return sha256(new TextEncoder().encode(JSON.stringify(data)))\n }\n \n /**\n * Monitor ZK program status and switch modes when available\n */\n async monitorZkProgramAvailability(\n callback: (status: { enabled: boolean; message: string }) => void\n ): Promise<() => void> {\n let monitoring = true\n \n const checkStatus = async () => {\n while (monitoring) {\n const zkAvailable = await isZkProgramAvailable(this.connection)\n const status = await getZkProgramStatus(this.connection)\n \n callback({\n enabled: zkAvailable,\n message: status\n })\n \n // Check every 30 seconds\n await new Promise(resolve => setTimeout(resolve, 30000))\n }\n }\n \n // Start monitoring in background\n checkStatus().catch(console.error)\n \n // Return stop function\n return () => {\n monitoring = false\n }\n }\n \n /**\n * Create a privacy-preserving work order\n */\n async createPrivateWorkOrder(params: {\n title: string\n encryptedDetails: EncryptedData\n publicMetadata: Record<string, unknown>\n recipientPubkey: ElGamalPubkey\n }): Promise<{\n workOrderHash: Uint8Array\n metadata: StoredPrivateData\n warnings: string[]\n }> {\n const warnings: string[] = []\n const privacyStatus = await this.getPrivacyStatus()\n \n if (!privacyStatus.available) {\n warnings.push('Privacy features are not available. Work order details will be public.')\n }\n \n // Store encrypted work order details\n const privateData = {\n title: params.title,\n encryptedDetails: {\n commitment: bytesToHex(params.encryptedDetails.commitment),\n timestamp: params.encryptedDetails.timestamp\n },\n createdAt: Date.now()\n }\n \n const metadata = await this.metadataStorage.storePrivateData(\n privateData,\n params.publicMetadata,\n params.recipientPubkey\n )\n \n // Create work order hash for on-chain reference\n const workOrderHash = sha256(\n new TextEncoder().encode(\n JSON.stringify({\n title: params.title,\n metadataHash: bytesToHex(metadata.onChainHash),\n recipient: bytesToHex(params.recipientPubkey)\n })\n )\n )\n \n return {\n workOrderHash,\n metadata,\n warnings\n }\n }\n \n /**\n * Serialize ciphertext for instruction data\n */\n private serializeCiphertext(ciphertext: ElGamalCiphertext): Uint8Array {\n const serialized = new Uint8Array(64)\n serialized.set(ciphertext.commitment.commitment, 0)\n serialized.set(ciphertext.handle.handle, 32)\n return serialized\n }\n}\n\n/**\n * Convenience function to serialize ciphertext\n */\nfunction serializeCiphertext(ciphertext: ElGamalCiphertext): Uint8Array {\n const serialized = new Uint8Array(64)\n serialized.set(ciphertext.commitment.commitment, 0)\n serialized.set(ciphertext.handle.handle, 32)\n return serialized\n}","/**\n * Client-Side Encryption Service\n * \n * Provides client-side encryption for privacy features while the\n * ZK ElGamal Proof Program is disabled. This is a temporary solution\n * that will be replaced/enhanced when ZK proofs are re-enabled.\n */\n\nimport { sha256 } from '@noble/hashes/sha256'\nimport { randomBytes, bytesToHex } from '@noble/curves/abstract/utils'\n\nimport {\n encryptAmount,\n decryptAmount,\n generateElGamalKeypair,\n type ElGamalKeypair,\n type ElGamalCiphertext,\n type ElGamalPubkey\n} from './elgamal.js'\n\nimport { getFeatureFlags } from './feature-flags.js'\n\n// =====================================================\n// TYPES\n// =====================================================\n\nexport interface EncryptedData {\n /** Encrypted payload */\n ciphertext: ElGamalCiphertext\n \n /** Public key used for encryption */\n publicKey: ElGamalPubkey\n \n /** Commitment to the plaintext (for verification) */\n commitment: Uint8Array\n \n /** Timestamp of encryption */\n timestamp: number\n \n /** Version for future compatibility */\n version: number\n}\n\nexport interface PrivateMetadata {\n /** Encrypted data */\n encrypted: EncryptedData\n \n /** Public metadata (not encrypted) */\n public: Record<string, unknown>\n \n /** IPFS hash if stored off-chain */\n ipfsHash?: string\n \n /** On-chain storage hash */\n storageHash: Uint8Array\n}\n\nexport interface ClientEncryptionOptions {\n /** Whether to generate range proofs locally */\n generateLocalProofs?: boolean\n \n /** Whether to store on IPFS */\n useIpfsStorage?: boolean\n \n /** Custom encryption keypair (uses ephemeral if not provided) */\n encryptionKeypair?: ElGamalKeypair\n}\n\n// =====================================================\n// CLIENT ENCRYPTION SERVICE\n// =====================================================\n\nexport class ClientEncryptionService {\n private keypair: ElGamalKeypair\n private featureFlags = getFeatureFlags()\n \n constructor(options: ClientEncryptionOptions = {}) {\n this.keypair = options.encryptionKeypair ?? generateElGamalKeypair()\n }\n \n /**\n * Encrypt an amount for a recipient\n */\n async encryptAmountForRecipient(\n amount: bigint,\n recipientPubkey: ElGamalPubkey\n ): Promise<EncryptedData> {\n // Check if we should use client encryption\n if (!this.featureFlags.shouldUseClientEncryption()) {\n throw new Error('Client encryption is not enabled')\n }\n \n // Encrypt the amount\n const ciphertext = encryptAmount(amount, recipientPubkey)\n \n // Create commitment for verification\n const commitment = this.createCommitment(amount, recipientPubkey)\n \n return {\n ciphertext,\n publicKey: recipientPubkey,\n commitment,\n timestamp: Date.now(),\n version: 1\n }\n }\n \n /**\n * Decrypt an amount (requires private key)\n */\n async decryptAmount(\n encrypted: EncryptedData,\n secretKey: Uint8Array\n ): Promise<bigint> {\n // Verify commitment first\n const isValid = await this.verifyCommitment(encrypted)\n if (!isValid) {\n throw new Error('Invalid commitment - data may be tampered')\n }\n \n // Decrypt the amount\n const result = decryptAmount(encrypted.ciphertext, secretKey)\n if (result === null) {\n throw new Error('Failed to decrypt amount')\n }\n return result\n }\n \n /**\n * Encrypt arbitrary data\n */\n async encryptData(\n data: Uint8Array,\n recipientPubkey: ElGamalPubkey\n ): Promise<EncryptedData> {\n // For arbitrary data, we chunk it and encrypt each chunk\n // This is a simplified version - production would need proper padding\n const chunks: ElGamalCiphertext[] = []\n const chunkSize = 31 // Leave room for padding byte\n \n for (let i = 0; i < data.length; i += chunkSize) {\n const chunk = data.slice(i, i + chunkSize)\n const paddedChunk = new Uint8Array(32)\n paddedChunk[0] = chunk.length // Length prefix\n paddedChunk.set(chunk, 1)\n \n // Convert to bigint for encryption\n const value = bytesToBigInt(paddedChunk)\n const encrypted = encryptAmount(value, recipientPubkey)\n chunks.push(encrypted)\n }\n \n // Combine chunks into single ciphertext\n const combined = this.combineChunks(chunks)\n const commitment = this.createDataCommitment(data, recipientPubkey)\n \n return {\n ciphertext: combined,\n publicKey: recipientPubkey,\n commitment,\n timestamp: Date.now(),\n version: 1\n }\n }\n \n /**\n * Create private metadata with mixed public/private data\n */\n async createPrivateMetadata(\n privateData: Record<string, unknown>,\n publicData: Record<string, unknown>,\n recipientPubkey: ElGamalPubkey\n ): Promise<PrivateMetadata> {\n // Serialize private data\n const serialized = JSON.stringify(privateData)\n const dataBytes = new TextEncoder().encode(serialized)\n \n // Encrypt private data\n const encrypted = await this.encryptData(dataBytes, recipientPubkey)\n \n // Create storage hash\n const storageHash = this.createStorageHash(encrypted, publicData)\n \n return {\n encrypted,\n public: publicData,\n storageHash\n }\n }\n \n /**\n * Verify encrypted data integrity\n */\n async verifyCommitment(encrypted: EncryptedData): Promise<boolean> {\n // In production, this would verify the commitment\n // For now, we do a basic check\n return encrypted.commitment.length === 32 && \n encrypted.version === 1 &&\n encrypted.timestamp > 0\n }\n \n /**\n * Create a commitment to an amount\n */\n private createCommitment(\n amount: bigint,\n pubkey: ElGamalPubkey\n ): Uint8Array {\n const data = new Uint8Array(40)\n data.set(bigIntToBytes(amount), 0)\n data.set(pubkey, 8)\n return sha256(data)\n }\n \n /**\n * Create a commitment to arbitrary data\n */\n private createDataCommitment(\n data: Uint8Array,\n pubkey: ElGamalPubkey\n ): Uint8Array {\n const combined = new Uint8Array(data.length + 32)\n combined.set(data, 0)\n combined.set(pubkey, data.length)\n return sha256(combined)\n }\n \n /**\n * Create storage hash for on-chain reference\n */\n private createStorageHash(\n encrypted: EncryptedData,\n publicData: Record<string, unknown>\n ): Uint8Array {\n const data = {\n encryptedCommitment: bytesToHex(encrypted.commitment),\n publicData,\n timestamp: encrypted.timestamp,\n version: encrypted.version\n }\n \n const serialized = JSON.stringify(data)\n return sha256(new TextEncoder().encode(serialized))\n }\n \n /**\n * Combine multiple ciphertext chunks\n */\n private combineChunks(chunks: ElGamalCiphertext[]): ElGamalCiphertext {\n // For simplicity, we'll use the first chunk\n // In production, this would properly combine all chunks\n if (chunks.length === 0) {\n throw new Error('No chunks to combine')\n }\n return chunks[0]\n }\n}\n\n// =====================================================\n// HELPER FUNCTIONS\n// =====================================================\n\n/**\n * Convert bigint to 32-byte array\n */\nfunction bigIntToBytes(value: bigint): Uint8Array {\n const bytes = new Uint8Array(32)\n let temp = value\n for (let i = 0; i < 32; i++) {\n bytes[i] = Number(temp & 0xffn)\n temp >>= 8n\n }\n return bytes\n}\n\n/**\n * Convert byte array to bigint\n */\nfunction bytesToBigInt(bytes: Uint8Array): bigint {\n let result = 0n\n for (let i = bytes.length - 1; i >= 0; i--) {\n result = (result << 8n) | BigInt(bytes[i])\n }\n return result\n}\n\n// =====================================================\n// PRIVACY VERIFICATION\n// =====================================================\n\n/**\n * Generate a local privacy proof (not verified on-chain)\n * This is a placeholder for when ZK proofs are unavailable\n */\nexport async function generateLocalPrivacyProof(\n encrypted: EncryptedData,\n statement: string\n): Promise<{\n proof: Uint8Array\n publicInputs: Uint8Array\n timestamp: number\n}> {\n // Create a deterministic \"proof\" based on the encrypted data\n const proofData = new Uint8Array(128)\n proofData.set(encrypted.commitment, 0)\n proofData.set(sha256(new TextEncoder().encode(statement)), 32)\n proofData.set(randomBytes(64), 64)\n \n const publicInputs = new Uint8Array(64)\n publicInputs.set(encrypted.commitment, 0)\n publicInputs.set(encrypted.publicKey, 32)\n \n return {\n proof: proofData,\n publicInputs,\n timestamp: Date.now()\n }\n}\n\n/**\n * Verify a local privacy proof\n */\nexport async function verifyLocalPrivacyProof(\n proof: Uint8Array,\n publicInputs: Uint8Array,\n encrypted: EncryptedData\n): Promise<boolean> {\n // Basic verification\n if (proof.length !== 128 || publicInputs.length !== 64) {\n return false\n }\n \n // Check commitment matches\n const proofCommitment = proof.slice(0, 32)\n const inputCommitment = publicInputs.slice(0, 32)\n \n return bytesToHex(proofCommitment) === bytesToHex(encrypted.commitment) &&\n bytesToHex(inputCommitment) === bytesToHex(encrypted.commitment)\n}\n\n// =====================================================\n// MIGRATION HELPERS\n// =====================================================\n\n/**\n * Prepare encrypted data for future ZK proof migration\n */\nexport interface ZkMigrationData {\n /** Current encrypted data */\n clientEncrypted: EncryptedData\n \n /** Metadata for ZK proof generation */\n zkMetadata: {\n amount?: bigint\n randomness?: Uint8Array\n publicKey: ElGamalPubkey\n }\n \n /** Migration version */\n migrationVersion: number\n}\n\n/**\n * Prepare data for future ZK proof migration\n */\nexport function prepareForZkMigration(\n encrypted: EncryptedData,\n amount?: bigint,\n randomness?: Uint8Array\n): ZkMigrationData {\n return {\n clientEncrypted: encrypted,\n zkMetadata: {\n amount,\n randomness,\n publicKey: encrypted.publicKey\n },\n migrationVersion: 1\n }\n}\n\n// =====================================================\n// EXPORTS\n// =====================================================\n\nexport {\n generateElGamalKeypair,\n type ElGamalKeypair,\n type ElGamalCiphertext,\n type ElGamalPubkey\n} from './elgamal.js'","/**\n * Feature Flags for GhostSpeak Protocol\n * \n * Centralized feature flag management for enabling/disabling features\n * based on network conditions and protocol status.\n */\n\nexport interface FeatureFlags {\n /** Enable confidential transfers (currently in beta) */\n CONFIDENTIAL_TRANSFERS_ENABLED: boolean\n \n /** Use ZK proofs for verification (disabled until ZK program re-enabled) */\n USE_ZK_PROOFS: boolean\n \n /** Use client-side encryption as fallback */\n USE_CLIENT_ENCRYPTION: boolean\n \n /** Enable IPFS integration for private metadata */\n ENABLE_IPFS_STORAGE: boolean\n \n /** Enable compressed NFTs for agents */\n ENABLE_COMPRESSED_AGENTS: boolean\n \n /** Enable governance features */\n ENABLE_GOVERNANCE: boolean\n \n /** Enable analytics collection */\n ENABLE_ANALYTICS: boolean\n \n /** Show beta/experimental features in UI */\n SHOW_EXPERIMENTAL_FEATURES: boolean\n}\n\n/**\n * Default feature flags for production\n */\nexport const DEFAULT_FLAGS: FeatureFlags = {\n // Privacy features in beta due to ZK program being disabled\n CONFIDENTIAL_TRANSFERS_ENABLED: false,\n USE_ZK_PROOFS: false,\n USE_CLIENT_ENCRYPTION: true,\n ENABLE_IPFS_STORAGE: true,\n \n // Enabled features\n ENABLE_COMPRESSED_AGENTS: true,\n ENABLE_GOVERNANCE: true,\n ENABLE_ANALYTICS: true,\n \n // UI/UX\n SHOW_EXPERIMENTAL_FEATURES: false\n}\n\n/**\n * Development feature flags (all features enabled)\n */\nexport const DEV_FLAGS: FeatureFlags = {\n CONFIDENTIAL_TRANSFERS_ENABLED: true,\n USE_ZK_PROOFS: true,\n USE_CLIENT_ENCRYPTION: true,\n ENABLE_IPFS_STORAGE: true,\n ENABLE_COMPRESSED_AGENTS: true,\n ENABLE_GOVERNANCE: true,\n ENABLE_ANALYTICS: true,\n SHOW_EXPERIMENTAL_FEATURES: true\n}\n\n/**\n * Feature flag manager\n */\nexport class FeatureFlagManager {\n private flags: FeatureFlags\n private overrides: Partial<FeatureFlags> = {}\n \n constructor(environment: 'production' | 'development' = 'production') {\n this.flags = environment === 'development' ? { ...DEV_FLAGS } : { ...DEFAULT_FLAGS }\n this.loadOverridesFromEnv()\n }\n \n /**\n * Load flag overrides from environment variables\n */\n private loadOverridesFromEnv(): void {\n // Check for environment variable overrides\n if (typeof process !== 'undefined') {\n const envOverrides: Partial<FeatureFlags> = {}\n \n // Parse boolean environment variables\n const parseEnvBool = (key: string): boolean | undefined => {\n const value = process.env[key]\n if (value === undefined) return undefined\n return value.toLowerCase() === 'true'\n }\n \n // Check each flag\n const confidentialTransfers = parseEnvBool('GHOSTSPEAK_CONFIDENTIAL_TRANSFERS')\n if (confidentialTransfers !== undefined) {\n envOverrides.CONFIDENTIAL_TRANSFERS_ENABLED = confidentialTransfers\n }\n \n const useZkProofs = parseEnvBool('GHOSTSPEAK_USE_ZK_PROOFS')\n if (useZkProofs !== undefined) {\n envOverrides.USE_ZK_PROOFS = useZkProofs\n }\n \n const useClientEncryption = parseEnvBool('GHOSTSPEAK_USE_CLIENT_ENCRYPTION')\n if (useClientEncryption !== undefined) {\n envOverrides.USE_CLIENT_ENCRYPTION = useClientEncryption\n }\n \n this.overrides = envOverrides\n }\n }\n \n /**\n * Get current feature flags\n */\n getFlags(): FeatureFlags {\n return { ...this.flags, ...this.overrides }\n }\n \n /**\n * Check if a specific feature is enabled\n */\n isEnabled(feature: keyof FeatureFlags): boolean {\n const flags = this.getFlags()\n return flags[feature]\n }\n \n /**\n * Set a feature flag (runtime override)\n */\n setFlag(feature: keyof FeatureFlags, enabled: boolean): void {\n this.overrides[feature] = enabled\n }\n \n /**\n * Reset all overrides\n */\n resetOverrides(): void {\n this.overrides = {}\n this.loadOverridesFromEnv()\n }\n \n /**\n * Get privacy feature status\n */\n getPrivacyStatus(): {\n mode: 'zk-proofs' | 'client-encryption' | 'disabled'\n beta: boolean\n message: string\n } {\n const flags = this.getFlags()\n \n if (!flags.CONFIDENTIAL_TRANSFERS_ENABLED) {\n return {\n mode: 'disabled',\n beta: false,\n message: 'Confidential transfers are currently disabled'\n }\n }\n \n if (flags.USE_ZK_PROOFS) {\n return {\n mode: 'zk-proofs',\n beta: true,\n message: 'Confidential transfers using ZK proofs (Beta - Limited availability)'\n }\n }\n \n if (flags.USE_CLIENT_ENCRYPTION) {\n return {\n mode: 'client-encryption',\n beta: true,\n message: 'Confidential transfers using client-side encryption (Beta - ZK proofs coming soon)'\n }\n }\n \n return {\n mode: 'disabled',\n beta: false,\n message: 'No privacy features enabled'\n }\n }\n \n /**\n * Check if we should use ZK proofs or client encryption\n */\n shouldUseZkProofs(): boolean {\n const flags = this.getFlags()\n return flags.CONFIDENTIAL_TRANSFERS_ENABLED && flags.USE_ZK_PROOFS\n }\n \n /**\n * Check if we should use client encryption\n */\n shouldUseClientEncryption(): boolean {\n const flags = this.getFlags()\n return flags.CONFIDENTIAL_TRANSFERS_ENABLED && \n flags.USE_CLIENT_ENCRYPTION && \n !flags.USE_ZK_PROOFS\n }\n}\n\n// Global instance\nlet globalFeatureFlags: FeatureFlagManager | null = null\n\n/**\n * Get or create the global feature flag manager\n */\nexport function getFeatureFlags(environment?: 'production' | 'development'): FeatureFlagManager {\n globalFeatureFlags ??= new FeatureFlagManager(environment)\n return globalFeatureFlags\n}\n\n/**\n * Quick helper to check if a feature is enabled\n */\nexport function isFeatureEnabled(feature: keyof FeatureFlags): boolean {\n return getFeatureFlags().isEnabled(feature)\n}\n\n/**\n * Quick helper to get privacy status\n */\nexport function getPrivacyStatus() {\n return getFeatureFlags().getPrivacyStatus()\n}","/**\n * Private Metadata Storage\n * \n * Handles off-chain storage of encrypted data with on-chain references.\n * Supports IPFS and other storage backends for private data while\n * maintaining on-chain integrity verification.\n */\n\nimport { sha256 } from '@noble/hashes/sha256'\nimport { bytesToHex, hexToBytes } from '@noble/curves/abstract/utils'\nimport type { Address } from '@solana/kit'\n\nimport {\n ClientEncryptionService,\n type EncryptedData,\n type PrivateMetadata\n} from './client-encryption.js'\n\nimport { getFeatureFlags } from './feature-flags.js'\n\n// =====================================================\n// TYPES\n// =====================================================\n\nexport interface StorageProvider {\n store(data: Uint8Array): Promise<string>\n retrieve(hash: string): Promise<Uint8Array>\n delete(hash: string): Promise<boolean>\n}\n\nexport interface StoredPrivateData {\n /** On-chain reference hash */\n onChainHash: Uint8Array\n \n /** Storage provider identifier */\n storageProvider: 'ipfs' | 'arweave' | 'custom'\n \n /** Storage location (IPFS hash, Arweave ID, etc) */\n storageLocation: string\n \n /** Encryption metadata */\n encryptionMetadata: {\n version: number\n publicKey: Uint8Array\n timestamp: number\n }\n \n /** Size of stored data */\n size: number\n \n /** Content type hint */\n contentType?: string\n}\n\nexport interface PrivateDataReference {\n /** Account storing the reference */\n account: Address\n \n /** Storage details */\n storage: StoredPrivateData\n \n /** Access control */\n accessControl: {\n owner: Address\n allowedReaders: Address[]\n expiresAt?: number\n }\n}\n\n// =====================================================\n// STORAGE PROVIDERS\n// =====================================================\n\n/**\n * Mock IPFS storage provider (for testing)\n * In production, this would use actual IPFS\n */\nexport class MockIPFSProvider implements StorageProvider {\n private storage = new Map<string, Uint8Array>()\n \n async store(data: Uint8Array): Promise<string> {\n const hash = 'Qm' + bytesToHex(sha256(data)).substring(0, 44)\n this.storage.set(hash, data)\n return hash\n }\n \n async retrieve(hash: string): Promise<Uint8Array> {\n const data = this.storage.get(hash)\n if (!data) {\n throw new Error(`Data not found: ${hash}`)\n }\n return data\n }\n \n async delete(hash: string): Promise<boolean> {\n return this.storage.delete(hash)\n }\n}\n\n/**\n * Local storage provider (for development)\n */\nexport class LocalStorageProvider implements StorageProvider {\n private prefix = 'ghostspeak_private_'\n \n async store(data: Uint8Array): Promise<string> {\n const hash = bytesToHex(sha256(data))\n globalThis.localStorage.setItem(this.prefix + hash, bytesToHex(data))\n return hash\n }\n \n async retrieve(hash: string): Promise<Uint8Array> {\n const hex = globalThis.localStorage.getItem(this.prefix + hash)\n if (hex) {\n return hexToBytes(hex)\n }\n throw new Error(`Data not found: ${hash}`)\n }\n \n async delete(hash: string): Promise<boolean> {\n globalThis.localStorage.removeItem(this.prefix + hash)\n return true\n }\n}\n\n// =====================================================\n// PRIVATE METADATA STORAGE SERVICE\n// =====================================================\n\nexport class PrivateMetadataStorage {\n private encryptionService: ClientEncryptionService\n private storageProvider: StorageProvider\n private featureFlags = getFeatureFlags()\n \n constructor(\n storageProvider?: StorageProvider,\n encryptionService?: ClientEncryptionService\n ) {\n this.storageProvider = storageProvider ?? new MockIPFSProvider()\n this.encryptionService = encryptionService ?? new ClientEncryptionService()\n }\n \n /**\n * Store private data off-chain with on-chain reference\n */\n async storePrivateData(\n data: Record<string, unknown>,\n publicMetadata: Record<string, unknown>,\n recipientPubkey: Uint8Array\n ): Promise<StoredPrivateData> {\n // Check if IPFS storage is enabled\n if (!this.featureFlags.isEnabled('ENABLE_IPFS_STORAGE')) {\n throw new Error('IPFS storage is not enabled')\n }\n \n // Create private metadata\n const privateMetadata = await this.encryptionService.createPrivateMetadata(\n data,\n publicMetadata,\n recipientPubkey\n )\n \n // Serialize for storage\n const serialized = this.serializePrivateMetadata(privateMetadata)\n \n // Store in IPFS (or other provider)\n const storageLocation = await this.storageProvider.store(serialized)\n \n // Create on-chain reference\n const onChainHash = this.createOnChainHash(privateMetadata, storageLocation)\n \n return {\n onChainHash,\n storageProvider: 'ipfs',\n storageLocation,\n encryptionMetadata: {\n version: privateMetadata.encrypted.version,\n publicKey: privateMetadata.encrypted.publicKey,\n timestamp: privateMetadata.encrypted.timestamp\n },\n size: serialized.length,\n contentType: 'application/json'\n }\n }\n \n /**\n * Retrieve private data from off-chain storage\n */\n async retrievePrivateData(\n reference: StoredPrivateData,\n secretKey: Uint8Array\n ): Promise<{\n privateData: Record<string, unknown>\n publicData: Record<string, unknown>\n }> {\n // Retrieve from storage\n const serialized = await this.storageProvider.retrieve(reference.storageLocation)\n \n // Verify integrity\n const expectedHash = this.createOnChainHash(\n this.deserializePrivateMetadata(serialized),\n reference.storageLocation\n )\n \n if (bytesToHex(expectedHash) !== bytesToHex(reference.onChainHash)) {\n throw new Error('Data integrity check failed')\n }\n \n // Deserialize\n const metadata = this.deserializePrivateMetadata(serialized)\n \n // Decrypt private data\n const decryptedBytes = await this.decryptPrivateData(\n metadata.encrypted,\n secretKey\n )\n \n const privateData = JSON.parse(new TextDecoder().decode(decryptedBytes)) as Record<string, unknown>\n \n return {\n privateData,\n publicData: metadata.public\n }\n }\n \n /**\n * Create a verifiable link between on-chain and off-chain data\n */\n createVerifiableLink(\n onChainData: Record<string, unknown>,\n offChainReference: StoredPrivateData\n ): Uint8Array {\n const combined = {\n onChain: onChainData,\n offChain: {\n hash: bytesToHex(offChainReference.onChainHash),\n location: offChainReference.storageLocation,\n provider: offChainReference.storageProvider\n },\n timestamp: Date.now()\n }\n \n return sha256(new TextEncoder().encode(JSON.stringify(combined)))\n }\n \n /**\n * Batch store multiple private data items\n */\n async batchStore(\n items: {\n data: Record<string, unknown>\n publicMetadata: Record<string, unknown>\n recipientPubkey: Uint8Array\n }[]\n ): Promise<StoredPrivateData[]> {\n const results: StoredPrivateData[] = []\n \n for (const item of items) {\n const stored = await this.storePrivateData(\n item.data,\n item.publicMetadata,\n item.recipientPubkey\n )\n results.push(stored)\n }\n \n return results\n }\n \n // =====================================================\n // PRIVATE METHODS\n // =====================================================\n \n private serializePrivateMetadata(metadata: PrivateMetadata): Uint8Array {\n const json = JSON.stringify({\n encrypted: {\n ciphertext: {\n commitment: bytesToHex(metadata.encrypted.ciphertext.commitment.commitment),\n handle: bytesToHex(metadata.encrypted.ciphertext.handle.handle)\n },\n publicKey: bytesToHex(metadata.encrypted.publicKey),\n commitment: bytesToHex(metadata.encrypted.commitment),\n timestamp: metadata.encrypted.timestamp,\n version: metadata.encrypted.version\n },\n public: metadata.public,\n storageHash: bytesToHex(metadata.storageHash),\n ipfsHash: metadata.ipfsHash\n })\n \n return new TextEncoder().encode(json)\n }\n \n private deserializePrivateMetadata(data: Uint8Array): PrivateMetadata {\n const json = JSON.parse(new TextDecoder().decode(data)) as {\n encrypted: {\n ciphertext: {\n commitment: string\n handle: string\n }\n publicKey: string\n commitment: string\n timestamp: number\n version: number\n }\n public: Record<string, unknown>\n storageHash: string\n ipfsHash?: string\n }\n \n return {\n encrypted: {\n ciphertext: {\n commitment: {\n commitment: hexToBytes(json.encrypted.ciphertext.commitment)\n },\n handle: {\n handle: hexToBytes(json.encrypted.ciphertext.handle)\n }\n },\n publicKey: hexToBytes(json.encrypted.publicKey),\n commitment: hexToBytes(json.encrypted.commitment),\n timestamp: json.encrypted.timestamp,\n version: json.encrypted.version\n },\n public: json.public,\n storageHash: hexToBytes(json.storageHash),\n ipfsHash: json.ipfsHash\n }\n }\n \n private createOnChainHash(\n metadata: PrivateMetadata,\n storageLocation: string\n ): Uint8Array {\n const data = {\n storageHash: bytesToHex(metadata.storageHash),\n storageLocation,\n commitment: bytesToHex(metadata.encrypted.commitment),\n timestamp: metadata.encrypted.timestamp\n }\n \n return sha256(new TextEncoder().encode(JSON.stringify(data)))\n }\n \n private async decryptPrivateData(\n _encrypted: EncryptedData,\n _secretKey: Uint8Array\n ): Promise<Uint8Array> {\n // For now, return mock decrypted data\n // In production, this would use proper decryption\n return new TextEncoder().encode('{\"decrypted\": \"data\"}')\n }\n}\n\n// =====================================================\n// PRIVACY-PRESERVING QUERIES\n// =====================================================\n\n/**\n * Query builder for private data\n */\nexport class PrivateDataQuery {\n private conditions: {\n field: string\n operator: 'eq' | 'gt' | 'lt' | 'contains'\n value: unknown\n encrypted: boolean\n }[] = []\n \n where(field: string, operator: 'eq' | 'gt' | 'lt' | 'contains', value: unknown): this {\n this.conditions.push({ field, operator, value, encrypted: false })\n return this\n }\n \n whereEncrypted(field: string, commitment: Uint8Array): this {\n this.conditions.push({\n field,\n operator: 'eq',\n value: commitment,\n encrypted: true\n })\n return this\n }\n \n /**\n * Execute query against encrypted data\n * Note: This is limited compared to on-chain queries\n */\n async execute(\n storage: PrivateMetadataStorage,\n references: StoredPrivateData[]\n ): Promise<StoredPrivateData[]> {\n // For encrypted fields, we can only match by commitment\n // This is a privacy-preserving but limited query capability\n const results: StoredPrivateData[] = []\n \n for (const ref of references) {\n let matches = true\n \n for (const condition of this.conditions) {\n if (condition.encrypted) {\n // Can only check commitments for encrypted data\n // Real implementation would be more sophisticated\n if (condition.field === 'commitment') {\n const match = bytesToHex(ref.onChainHash) === bytesToHex(condition.value as Uint8Array)\n if (!match) {\n matches = false\n break\n }\n }\n }\n }\n \n if (matches) {\n results.push(ref)\n }\n }\n \n return results\n }\n}\n\n// =====================================================\n// UTILITIES\n// =====================================================\n\n/**\n * Calculate storage cost estimate\n */\nexport function estimateStorageCost(\n dataSize: number,\n provider: 'ipfs' | 'arweave'\n): {\n cost: bigint\n currency: string\n} {\n // Mock cost calculation\n // In production, this would query actual storage costs\n if (provider === 'ipfs') {\n return {\n cost: BigInt(Number(dataSize) * 1), // 1 lamport per byte\n currency: 'lamports'\n }\n } else {\n return {\n cost: BigInt(Number(dataSize) * 10), // 10 lamports per byte\n currency: 'lamports'\n }\n }\n}\n\n/**\n * Create a privacy manifest for transparency\n */\nexport interface PrivacyManifest {\n dataTypes: string[]\n encryptionMethod: 'elgamal' | 'aes256'\n storageLocation: 'ipfs' | 'arweave' | 'on-chain'\n retentionPeriod?: number\n accessControl: 'owner-only' | 'public-read' | 'permissioned'\n}\n\nexport function createPrivacyManifest(\n dataTypes: string[],\n options: Partial<PrivacyManifest> = {}\n): PrivacyManifest {\n return {\n dataTypes,\n encryptionMethod: options.encryptionMethod ?? 'elgamal',\n storageLocation: options.storageLocation ?? 'ipfs',\n retentionPeriod: options.retentionPeriod,\n accessControl: options.accessControl ?? 'owner-only'\n }\n}","/**\n * Official SPL Token-2022 Integration\n * \n * This module provides integration with the official @solana/spl-token library\n * for Token-2022 functionality. It replaces custom implementations with\n * battle-tested, official SDK functions.\n */\n\nimport {\n // Core functions\n createInitializeMint2Instruction,\n createTransferCheckedInstruction,\n createTransferCheckedWithFeeInstruction,\n \n // Extension functions\n createInitializeTransferFeeConfigInstruction,\n createInitializeInterestBearingMintInstruction,\n createInitializeDefaultAccountStateInstruction,\n createInitializeMintCloseAuthorityInstruction,\n createInitializePermanentDelegateInstruction,\n \n // Constants and types\n TOKEN_2022_PROGRAM_ID,\n TOKEN_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n \n // Extension types\n ExtensionType,\n \n // Helper functions\n getMintLen,\n getExtensionTypes,\n getTransferFeeConfig,\n \n // Account utilities\n getAccount,\n getMint,\n getAssociatedTokenAddressSync,\n createAssociatedTokenAccountIdempotentInstruction,\n \n // Layout types for decoding\n \n} from '@solana/spl-token'\n\nimport type { \n Address, \n IInstruction, \n TransactionSigner,\n IAccountMeta,\n Commitment\n} from '@solana/kit'\nimport { address } from '@solana/kit'\nimport { \n getU8Encoder,\n getU32Encoder,\n getU64Encoder, \n getStructEncoder, \n getBytesEncoder,\n fixEncoderSize,\n getAddressEncoder\n} from '@solana/kit'\nimport { PublicKey, type Connection } from '@solana/web3.js'\n\n// Re-export everything for convenience\nexport * from '@solana/spl-token'\n\n// =====================================================\n// CONSTANTS\n// =====================================================\n\nexport const TOKEN_2022_PROGRAM_ADDRESS = address(TOKEN_2022_PROGRAM_ID.toString())\n\n// Extension instruction sub-types\nexport const EXTENSION_INSTRUCTIONS = {\n TransferFee: {\n InitializeTransferFeeConfig: 0,\n TransferCheckedWithFee: 1,\n WithdrawWithheldTokensFromMint: 2,\n WithdrawWithheldTokensFromAccounts: 3,\n HarvestWithheldTokensToMint: 4,\n SetTransferFee: 5\n },\n ConfidentialTransfer: {\n InitializeConfidentialTransferMint: 0,\n UpdateConfidentialTransferMint: 1,\n ConfigureAccount: 2,\n ApproveAccount: 3,\n EmptyAccount: 4,\n Deposit: 5,\n Withdraw: 6,\n Transfer: 7,\n ApplyPendingBalance: 8,\n EnableConfidentialCredits: 9,\n DisableConfidentialCredits: 10,\n EnableNonConfidentialCredits: 11,\n DisableNonConfidentialCredits: 12\n },\n InterestBearing: {\n InitializeInterestBearingMint: 0,\n UpdateRate: 1\n },\n DefaultAccountState: {\n Initialize: 0,\n Update: 1\n }\n} as const\n\n// =====================================================\n// HELPER TYPES AND INTERFACES\n// =====================================================\n\nexport interface CreateMintWithExtensionsParams {\n /** The mint to be created */\n mint: TransactionSigner\n /** Number of decimals */\n decimals: number\n /** Mint authority */\n mintAuthority: Address\n /** Freeze authority (optional) */\n freezeAuthority?: Address\n /** Payer for the transaction */\n payer: TransactionSigner\n /** Extensions to enable */\n extensions?: {\n /** Transfer fee configuration */\n transferFeeConfig?: {\n transferFeeBasisPoints: number\n maximumFee: bigint\n transferFeeConfigAuthority?: Address\n withdrawWithheldAuthority?: Address\n }\n /** Confidential transfer configuration */\n confidentialTransfers?: {\n authority?: Address\n autoApproveNewAccounts?: boolean\n auditorElgamalPubkey?: Uint8Array\n }\n /** Interest bearing configuration */\n interestBearing?: {\n rateAuthority: Address\n rate: number\n }\n /** Default account state */\n defaultAccountState?: 'initialized' | 'frozen'\n /** Mint close authority */\n mintCloseAuthority?: Address\n /** Permanent delegate */\n permanentDelegate?: Address\n /** Transfer hook */\n transferHook?: {\n authority: Address\n programId: Address\n }\n /** Metadata pointer */\n metadataPointer?: {\n authority?: Address\n metadataAddress?: Address\n }\n }\n}\n\nexport interface TransferWithFeeParams {\n /** Source token account */\n source: Address\n /** Destination token account */\n destination: Address\n /** Authority for the source account */\n authority: TransactionSigner\n /** Mint address */\n mint: Address\n /** Amount to transfer (before fees) */\n amount: bigint\n /** Number of decimals */\n decimals: number\n /** Additional signers */\n multiSigners?: TransactionSigner[]\n}\n\n// =====================================================\n// HIGH-LEVEL FUNCTIONS\n// =====================================================\n\n/**\n * Create a Token-2022 mint with extensions using the official SPL Token library\n */\nexport async function createMintWithExtensions(\n connection: Connection,\n params: CreateMintWithExtensionsParams\n): Promise<IInstruction[]> {\n const instructions: IInstruction[] = []\n \n // Calculate required extensions\n const extensions: ExtensionType[] = []\n if (params.extensions?.transferFeeConfig) {\n extensions.push(ExtensionType.TransferFeeConfig)\n }\n if (params.extensions?.confidentialTransfers) {\n extensions.push(ExtensionType.ConfidentialTransferMint)\n }\n if (params.extensions?.interestBearing) {\n extensions.push(ExtensionType.InterestBearingConfig)\n }\n if (params.extensions?.defaultAccountState) {\n extensions.push(ExtensionType.DefaultAccountState)\n }\n if (params.extensions?.mintCloseAuthority) {\n extensions.push(ExtensionType.MintCloseAuthority)\n }\n if (params.extensions?.permanentDelegate) {\n extensions.push(ExtensionType.PermanentDelegate)\n }\n if (params.extensions?.transferHook) {\n extensions.push(ExtensionType.TransferHook)\n }\n if (params.extensions?.metadataPointer) {\n extensions.push(ExtensionType.MetadataPointer)\n }\n \n // Calculate space needed\n const mintLen = getMintLen(extensions)\n const lamports = await connection.getMinimumBalanceForRentExemption(mintLen)\n \n // Create account instruction\n const createAccountInstruction: IInstruction = {\n programAddress: address('11111111111111111111111111111111'), // System program\n accounts: [\n { address: params.payer.address, role: 3 }, // WritableSigner\n { address: params.mint.address, role: 3 }, // WritableSigner\n ],\n data: getStructEncoder([\n ['instruction', getU32Encoder()],\n ['lamports', getU64Encoder()],\n ['space', getU64Encoder()],\n ['owner', fixEncoderSize(getAddressEncoder(), 32)]\n ]).encode({\n instruction: 0, // CreateAccount\n lamports: BigInt(lamports),\n space: BigInt(mintLen),\n owner: toAddress(TOKEN_2022_PROGRAM_ID)\n })\n }\n instructions.push(createAccountInstruction)\n \n // Initialize extensions before mint\n if (params.extensions?.transferFeeConfig) {\n const config = params.extensions.transferFeeConfig\n instructions.push(convertToIInstruction(\n createInitializeTransferFeeConfigInstruction(\n new PublicKey(params.mint.address),\n new PublicKey(config.transferFeeConfigAuthority ?? params.mintAuthority),\n new PublicKey(config.withdrawWithheldAuthority ?? params.mintAuthority),\n config.transferFeeBasisPoints,\n BigInt(config.maximumFee),\n TOKEN_2022_PROGRAM_ID\n )\n ))\n }\n \n // Note: Confidential transfer initialization is not directly exposed in @solana/spl-token\n // It requires using raw instructions\n if (params.extensions?.confidentialTransfers) {\n console.warn('Confidential transfer initialization requires manual instruction building')\n }\n \n if (params.extensions?.interestBearing) {\n const config = params.extensions.interestBearing\n instructions.push(convertToIInstruction(\n createInitializeInterestBearingMintInstruction(\n new PublicKey(params.mint.address),\n new PublicKey(config.rateAuthority),\n config.rate,\n TOKEN_2022_PROGRAM_ID\n )\n ))\n }\n \n if (params.extensions?.defaultAccountState) {\n instructions.push(convertToIInstruction(\n createInitializeDefaultAccountStateInstruction(\n new PublicKey(params.mint.address),\n params.extensions.defaultAccountState === 'frozen' ? 1 : 0,\n TOKEN_2022_PROGRAM_ID\n )\n ))\n }\n \n if (params.extensions?.mintCloseAuthority) {\n instructions.push(convertToIInstruction(\n createInitializeMintCloseAuthorityInstruction(\n new PublicKey(params.mint.address),\n new PublicKey(params.extensions.mintCloseAuthority),\n TOKEN_2022_PROGRAM_ID\n )\n ))\n }\n \n if (params.extensions?.permanentDelegate) {\n instructions.push(convertToIInstruction(\n createInitializePermanentDelegateInstruction(\n new PublicKey(params.mint.address),\n new PublicKey(params.extensions.permanentDelegate),\n TOKEN_2022_PROGRAM_ID\n )\n ))\n }\n \n // Initialize mint\n instructions.push(convertToIInstruction(\n createInitializeMint2Instruction(\n new PublicKey(params.mint.address),\n params.decimals,\n new PublicKey(params.mintAuthority),\n params.freezeAuthority ? new PublicKey(params.freezeAuthority) : null,\n TOKEN_2022_PROGRAM_ID\n )\n ))\n \n return instructions\n}\n\n/**\n * Transfer tokens with proper fee calculation for Token-2022\n */\nexport async function transferWithFee(\n connection: Connection,\n params: TransferWithFeeParams\n): Promise<IInstruction> {\n // Get mint info to check for transfer fees\n const mintPubkey = new PublicKey(params.mint)\n const mintInfo = await getMint(\n connection,\n mintPubkey,\n undefined,\n TOKEN_2022_PROGRAM_ID\n )\n \n // Check if mint has transfer fee extension\n const transferFeeConfig = getTransferFeeConfig(mintInfo)\n \n if (transferFeeConfig) {\n // Calculate fee amount\n // Calculate fee amount based on transfer fee config\n const fee = calculateTransferFee(\n BigInt(params.amount),\n transferFeeConfig.newerTransferFee.transferFeeBasisPoints,\n BigInt(transferFeeConfig.newerTransferFee.maximumFee.toString())\n )\n \n // Use transfer with fee instruction\n return convertToIInstruction(\n createTransferCheckedWithFeeInstruction(\n new PublicKey(params.source),\n mintPubkey,\n new PublicKey(params.destination),\n new PublicKey(params.authority.address),\n BigInt(params.amount),\n params.decimals,\n fee,\n params.multiSigners?.map(s => new PublicKey(s.address)) ?? [],\n TOKEN_2022_PROGRAM_ID\n )\n )\n } else {\n // No transfer fee, use regular transfer\n return convertToIInstruction(\n createTransferCheckedInstruction(\n new PublicKey(params.source),\n mintPubkey,\n new PublicKey(params.destination),\n new PublicKey(params.authority.address),\n BigInt(params.amount),\n params.decimals,\n params.multiSigners?.map(s => new PublicKey(s.address)) ?? [],\n TOKEN_2022_PROGRAM_ID\n )\n )\n }\n}\n\n/**\n * Get or create associated token account with Token-2022 support\n */\nexport async function getOrCreateAssociatedTokenAccount(\n connection: Connection,\n payer: TransactionSigner,\n mint: Address,\n owner: Address,\n allowOwnerOffCurve = false,\n commitment?: Commitment\n): Promise<{ address: Address; instruction?: IInstruction }> {\n const mintPubkey = new PublicKey(mint)\n const ownerPubkey = new PublicKey(owner)\n \n // Determine if this is a Token-2022 mint\n let programId = TOKEN_PROGRAM_ID\n try {\n await getMint(\n connection,\n mintPubkey,\n commitment,\n TOKEN_2022_PROGRAM_ID\n )\n // mintInfo exists, use Token 2022\n programId = TOKEN_2022_PROGRAM_ID\n } catch {\n // Try regular token program\n try {\n await getMint(connection, mintPubkey, commitment, TOKEN_PROGRAM_ID)\n } catch {\n throw new Error('Invalid mint')\n }\n }\n \n // Get associated token address\n const associatedToken = getAssociatedTokenAddressSync(\n mintPubkey,\n ownerPubkey,\n allowOwnerOffCurve,\n programId\n )\n \n // Check if account exists\n try {\n await getAccount(\n connection,\n associatedToken,\n commitment,\n programId\n )\n return { address: address(associatedToken.toBase58()) }\n } catch {\n // Account doesn't exist, create instruction\n const instruction = createAssociatedTokenAccountIdempotentInstruction(\n new PublicKey(payer.address),\n associatedToken,\n ownerPubkey,\n mintPubkey,\n programId\n )\n \n return {\n address: address(associatedToken.toBase58()),\n instruction: convertToIInstruction(instruction)\n }\n }\n}\n\n// =====================================================\n// UTILITY FUNCTIONS\n// =====================================================\n\n/**\n * Convert web3.js instruction to IInstruction format\n */\nfunction convertToIInstruction(instruction: {\n programId: PublicKey\n keys: {\n pubkey: PublicKey\n isSigner: boolean\n isWritable: boolean\n }[]\n data: Uint8Array\n}): IInstruction {\n const accounts: IAccountMeta[] = instruction.keys.map((key) => ({\n address: address(key.pubkey.toBase58()),\n role: (key.isSigner ? 1 : 0) + (key.isWritable ? 2 : 0)\n }))\n \n return {\n programAddress: address(instruction.programId.toBase58()),\n accounts,\n data: instruction.data\n }\n}\n\n/**\n * Convert PublicKey to Address type\n */\nfunction toAddress(pubkey: PublicKey): Address {\n return address(pubkey.toBase58())\n}\n\n/**\n * Check if a mint is Token-2022\n */\nexport async function isToken2022(\n connection: Connection,\n mint: Address\n): Promise<boolean> {\n try {\n await getMint(\n connection,\n new PublicKey(mint),\n undefined,\n TOKEN_2022_PROGRAM_ID\n )\n return true\n } catch {\n return false\n }\n}\n\n/**\n * Get mint extensions\n */\nexport async function getMintExtensions(\n connection: Connection,\n mint: Address\n): Promise<ExtensionType[]> {\n const mintInfo = await getMint(\n connection,\n new PublicKey(mint),\n undefined,\n TOKEN_2022_PROGRAM_ID\n )\n \n return getExtensionTypes(mintInfo.tlvData)\n}\n\n/**\n * Calculate transfer amount including fees\n */\nexport async function calculateTransferAmountWithFee(\n connection: Connection,\n mint: Address,\n amount: bigint,\n includesFee = false\n): Promise<{ amount: bigint; fee: bigint }> {\n const mintPubkey = new PublicKey(mint)\n \n try {\n const mintInfo = await getMint(\n connection,\n mintPubkey,\n undefined,\n TOKEN_2022_PROGRAM_ID\n )\n \n const transferFeeConfig = getTransferFeeConfig(mintInfo)\n if (transferFeeConfig) {\n const fee = calculateTransferFee(\n amount,\n transferFeeConfig.newerTransferFee.transferFeeBasisPoints,\n BigInt(transferFeeConfig.newerTransferFee.maximumFee.toString())\n )\n return {\n amount: includesFee ? amount - fee : amount,\n fee\n }\n }\n } catch {\n // No transfer fee\n }\n \n return { amount, fee: 0n }\n}\n\n// =====================================================\n// CONFIDENTIAL TRANSFER HELPERS\n// =====================================================\n\n// =====================================================\n// CONFIDENTIAL TRANSFER HELPERS\n// =====================================================\n\n/**\n * Note: Confidential transfer instructions are not directly exported by @solana/spl-token\n * These functions provide placeholders for the functionality.\n * In production, you would need to use raw instruction building or a specialized library.\n */\n\n/**\n * Configure account for confidential transfers (placeholder)\n */\nexport async function configureConfidentialAccount(\n account: Address,\n mint: Address,\n elgamalPubkey: Uint8Array,\n decryptableZeroBalance: Uint8Array,\n maximumPendingBalanceCredits: bigint,\n proofInstructionOffset: number,\n authority: TransactionSigner\n): Promise<IInstruction> {\n // Import the confidential transfer manager\n const { ConfidentialTransferManager } = await import('./confidential-transfer-manager.js')\n const { Connection } = await import('@solana/web3.js')\n \n // Create manager instance\n const connection = new Connection('https://api.mainnet-beta.solana.com')\n const manager = new ConfidentialTransferManager(connection)\n \n // Use the manager to create the instruction\n const result = await manager.createConfigureAccountInstructions({\n account,\n mint,\n elgamalKeypair: { publicKey: elgamalPubkey, secretKey: new Uint8Array(32) }, // Only pubkey needed\n decryptableZeroBalance: 0n,\n maxPendingBalanceCredits: maximumPendingBalanceCredits,\n authority\n })\n \n if (result.warnings.length > 0) {\n result.warnings.forEach(w => console.warn(w))\n }\n \n return result.instructions[0]\n}\n\n/**\n * Deposit to confidential balance\n */\nexport async function depositConfidential(\n account: Address,\n mint: Address,\n amount: bigint,\n decimals: number,\n proofInstructionOffset: number,\n authority: TransactionSigner\n): Promise<IInstruction> {\n // Import the confidential transfer manager\n const { ConfidentialTransferManager } = await import('./confidential-transfer-manager.js')\n const { Connection } = await import('@solana/web3.js')\n \n // Create manager instance\n const connection = new Connection('https://api.mainnet-beta.solana.com')\n const manager = new ConfidentialTransferManager(connection)\n \n // Use the manager to create deposit instructions\n const result = await manager.createDepositInstructions({\n account,\n mint,\n amount,\n decimals,\n authority\n })\n \n if (result.warnings.length > 0) {\n result.warnings.forEach(w => console.warn(w))\n }\n \n // Return the primary deposit instruction\n // The proof instructions would be included separately in the transaction\n return result.instructions[0]\n}\n\n/**\n * Withdraw from confidential balance\n */\nexport async function withdrawConfidential(\n account: Address,\n mint: Address,\n amount: bigint,\n decimals: number,\n newDecryptableAvailableBalance: Uint8Array,\n proofInstructionOffset: number,\n authority: TransactionSigner\n): Promise<IInstruction> {\n // Import required modules\n const { ConfidentialTransferManager } = await import('./confidential-transfer-manager.js')\n const { Connection } = await import('@solana/web3.js')\n const { bytesToNumberLE } = await import('@noble/curves/abstract/utils')\n \n // Create manager instance\n const _connection = new Connection('https://api.mainnet-beta.solana.com')\n const _manager = new ConfidentialTransferManager(_connection)\n \n // Convert decryptable balance bytes to bigint\n const _newBalance = bytesToNumberLE(newDecryptableAvailableBalance.slice(0, 8))\n \n // Create withdrawal instruction\n const instructionType = EXTENSION_INSTRUCTIONS.ConfidentialTransfer.Withdraw\n \n const encoder = getStructEncoder([\n ['instruction', getU8Encoder()],\n ['amount', getU64Encoder()],\n ['decimals', getU8Encoder()],\n ['newDecryptableAvailableBalance', fixEncoderSize(getBytesEncoder(), 64)],\n ['proofInstructionOffset', getU8Encoder()]\n ])\n\n const data = encoder.encode({\n instruction: instructionType,\n amount,\n decimals,\n newDecryptableAvailableBalance,\n proofInstructionOffset\n })\n\n return {\n programAddress: TOKEN_2022_PROGRAM_ADDRESS,\n accounts: [\n { address: account, role: 2 }, // Writable\n { address: mint, role: 0 }, // Readonly\n { address: authority.address, role: 3 } // Signer\n ],\n data\n }\n}\n\n/**\n * Transfer confidential tokens\n */\nexport async function transferConfidential(\n source: Address,\n destination: Address,\n mint: Address,\n newSourceDecryptableAvailableBalance: Uint8Array,\n proofInstructionOffset: number,\n authority: TransactionSigner\n): Promise<IInstruction> {\n // Import required modules\n const { ConfidentialTransferManager } = await import('./confidential-transfer-manager.js')\n const { Connection } = await import('@solana/web3.js')\n \n // Create manager instance\n const _connection = new Connection('https://api.mainnet-beta.solana.com')\n const _manager = new ConfidentialTransferManager(_connection)\n \n // Create transfer instruction\n const instructionType = EXTENSION_INSTRUCTIONS.ConfidentialTransfer.Transfer\n \n const encoder = getStructEncoder([\n ['instruction', getU8Encoder()],\n ['newSourceDecryptableBalance', fixEncoderSize(getBytesEncoder(), 64)],\n ['proofInstructionOffset', getU8Encoder()]\n ])\n\n const data = encoder.encode({\n instruction: instructionType,\n newSourceDecryptableBalance: newSourceDecryptableAvailableBalance,\n proofInstructionOffset\n })\n\n return {\n programAddress: TOKEN_2022_PROGRAM_ADDRESS,\n accounts: [\n { address: source, role: 2 }, // Writable source\n { address: destination, role: 2 }, // Writable destination\n { address: mint, role: 0 }, // Readonly\n { address: authority.address, role: 3 } // Signer\n ],\n data\n }\n}\n\n// Export for backward compatibility\n/**\n * Helper function to calculate transfer fee\n */\nfunction calculateTransferFee(\n amount: bigint,\n feeBasisPoints: number,\n maximumFee: bigint\n): bigint {\n const fee = (amount * BigInt(feeBasisPoints)) / 10000n\n return fee > maximumFee ? maximumFee : fee\n}\n\nexport {\n TOKEN_2022_PROGRAM_ID,\n TOKEN_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n ExtensionType\n}","/**\n * Token-2022 SPL Integration\n * \n * Real integration with SPL Token-2022 program for production use.\n * This module now properly uses the official @solana/spl-token library\n * instead of custom implementations, ensuring compatibility and\n * access to all Token-2022 features.\n */\n\nimport type { Address, IInstruction, TransactionSigner } from '@solana/kit'\nimport { getU8Encoder, getU16Encoder, getU64Encoder, getStructEncoder, getBytesEncoder, fixEncoderSize, address } from '@solana/kit'\nimport { Connection } from '@solana/web3.js'\n\n// Import from the new official SPL Token integration\nimport {\n createMintWithExtensions as createMintWithExtensionsOfficial,\n transferWithFee as transferWithFeeOfficial,\n getOrCreateAssociatedTokenAccount as getOrCreateAssociatedTokenAccountOfficial,\n isToken2022 as isToken2022Official,\n getMintExtensions as getMintExtensionsOfficial,\n calculateTransferAmountWithFee as calculateTransferAmountWithFeeOfficial,\n configureConfidentialAccount as configureConfidentialAccountOfficial,\n depositConfidential as depositConfidentialOfficial,\n withdrawConfidential as withdrawConfidentialOfficial,\n transferConfidential as transferConfidentialOfficial,\n TOKEN_2022_PROGRAM_ID,\n ExtensionType\n} from './spl-token-integration.js'\n\n// Re-export TOKEN_PROGRAM_ID from the official integration\nexport { TOKEN_PROGRAM_ID } from './spl-token-integration.js'\n\n// Keep the existing TOKEN_2022_PROGRAM_ADDRESS for backward compatibility\nexport const TOKEN_2022_PROGRAM_ADDRESS = address(TOKEN_2022_PROGRAM_ID.toString())\n\n// Re-map extension types for backward compatibility\nexport { ExtensionType as Token2022ExtensionType }\n\n// SPL Token-2022 instruction discriminators\nexport const SPL_TOKEN_2022_INSTRUCTIONS = {\n // Basic instructions\n InitializeMint: 0,\n InitializeAccount: 1,\n InitializeMultisig: 2,\n Transfer: 3,\n Approve: 4,\n Revoke: 5,\n SetAuthority: 6,\n MintTo: 7,\n Burn: 8,\n CloseAccount: 9,\n FreezeAccount: 10,\n ThawAccount: 11,\n TransferChecked: 12,\n ApproveChecked: 13,\n MintToChecked: 14,\n BurnChecked: 15,\n InitializeAccount2: 16,\n SyncNative: 17,\n InitializeAccount3: 18,\n InitializeMultisig2: 19,\n InitializeMint2: 20,\n GetAccountDataSize: 21,\n InitializeImmutableOwner: 22,\n AmountToUiAmount: 23,\n UiAmountToAmount: 24,\n \n // Extension instructions (starting at 25)\n InitializeMintCloseAuthority: 25,\n TransferFeeExtension: 26,\n ConfidentialTransferExtension: 27,\n DefaultAccountStateExtension: 28,\n Reallocate: 29,\n MemoTransferExtension: 30,\n CreateNativeMint: 31,\n InitializeNonTransferableMint: 32,\n InterestBearingMintExtension: 33,\n CpiGuardExtension: 34,\n InitializePermanentDelegate: 35,\n TransferHookExtension: 36,\n ConfidentialTransferFeeExtension: 37,\n WithdrawExcessLamports: 38,\n MetadataPointerExtension: 39,\n GroupPointerExtension: 40,\n GroupMemberPointerExtension: 41\n} as const\n\n// Extension instruction sub-types\nexport const EXTENSION_INSTRUCTIONS = {\n TransferFee: {\n InitializeTransferFeeConfig: 0,\n TransferCheckedWithFee: 1,\n WithdrawWithheldTokensFromMint: 2,\n WithdrawWithheldTokensFromAccounts: 3,\n HarvestWithheldTokensToMint: 4,\n SetTransferFee: 5\n },\n ConfidentialTransfer: {\n InitializeConfidentialTransferMint: 0,\n UpdateConfidentialTransferMint: 1,\n ConfigureAccount: 2,\n ApproveAccount: 3,\n EmptyAccount: 4,\n Deposit: 5,\n Withdraw: 6,\n Transfer: 7,\n ApplyPendingBalance: 8,\n EnableConfidentialCredits: 9,\n DisableConfidentialCredits: 10,\n EnableNonConfidentialCredits: 11,\n DisableNonConfidentialCredits: 12\n },\n InterestBearing: {\n InitializeInterestBearingMint: 0,\n UpdateRate: 1\n },\n DefaultAccountState: {\n Initialize: 0,\n Update: 1\n }\n} as const\n\n// =====================================================\n// MINT CREATION WITH EXTENSIONS\n// =====================================================\n\n/**\n * Parameters for creating a Token-2022 mint with extensions\n */\nexport interface CreateMintWithExtensionsParams {\n /** Mint keypair */\n mint: TransactionSigner\n /** Decimal places */\n decimals: number\n /** Mint authority */\n mintAuthority: Address\n /** Freeze authority (optional) */\n freezeAuthority?: Address\n /** Extensions to enable */\n extensions?: {\n transferFeeConfig?: {\n transferFeeBasisPoints: number\n maximumFee: bigint\n transferFeeConfigAuthority: Address\n withdrawWithheldAuthority: Address\n }\n confidentialTransfers?: {\n authority: Address\n autoApproveNewAccounts: boolean\n auditorElgamalPubkey?: Uint8Array\n }\n interestBearing?: {\n rateAuthority: Address\n rate: number // basis points per year\n }\n defaultAccountState?: 'initialized' | 'frozen'\n mintCloseAuthority?: Address\n permanentDelegate?: Address\n transferHook?: {\n authority: Address\n programId: Address\n }\n metadataPointer?: {\n authority: Address\n metadataAddress: Address\n }\n }\n /** Transaction payer */\n payer: TransactionSigner\n}\n\n// Export the official implementations\nexport {\n getOrCreateAssociatedTokenAccountOfficial as getOrCreateAssociatedTokenAccount,\n isToken2022Official as isToken2022,\n getMintExtensionsOfficial as getMintExtensions,\n calculateTransferAmountWithFeeOfficial as calculateTransferAmountWithFee,\n configureConfidentialAccountOfficial as configureConfidentialAccount,\n depositConfidentialOfficial as depositConfidential,\n withdrawConfidentialOfficial as withdrawConfidential,\n transferConfidentialOfficial as transferConfidential\n}\n\n/**\n * Create instructions to initialize a Token-2022 mint with extensions\n * Now uses the official @solana/spl-token implementation\n */\nexport async function createMintWithExtensions(\n params: CreateMintWithExtensionsParams\n): Promise<IInstruction[]> {\n // Note: We need a Connection object for the official implementation\n // This is a limitation of maintaining backward compatibility\n // In production, pass the connection from the client\n const connection = new Connection('https://api.devnet.solana.com', 'confirmed')\n \n // Convert params to official format\n return createMintWithExtensionsOfficial(connection, params)\n}\n\n// =====================================================\n// TRANSFER FEE INSTRUCTIONS\n// =====================================================\n\n/**\n * Transfer tokens with fee support\n * Delegates to the official SPL Token implementation\n */\nexport async function transferWithFee(\n connection: Connection,\n params: {\n source: Address\n destination: Address\n authority: TransactionSigner\n mint: Address\n amount: bigint\n decimals: number\n multiSigners?: TransactionSigner[]\n }\n): Promise<IInstruction> {\n return transferWithFeeOfficial(connection, params)\n}\n\n// These functions are now delegated to the official implementation\n// The custom implementations below are kept for backward compatibility\n// but should be considered deprecated\n\n/**\n * Create instruction for transfer with fee\n */\nexport function createTransferCheckedWithFeeInstruction(params: {\n source: Address\n mint: Address\n destination: Address\n authority: TransactionSigner\n amount: bigint\n decimals: number\n fee: bigint\n}): IInstruction {\n const dataEncoder = getStructEncoder([\n ['instruction', getU8Encoder()],\n ['extensionInstruction', getU8Encoder()],\n ['amount', getU64Encoder()],\n ['decimals', getU8Encoder()],\n ['fee', getU64Encoder()]\n ])\n \n const data = dataEncoder.encode({\n instruction: SPL_TOKEN_2022_INSTRUCTIONS.TransferFeeExtension,\n extensionInstruction: EXTENSION_INSTRUCTIONS.TransferFee.TransferCheckedWithFee,\n amount: params.amount,\n decimals: params.decimals,\n fee: params.fee\n })\n \n return {\n programAddress: TOKEN_2022_PROGRAM_ADDRESS,\n accounts: [\n { address: params.source, role: 2 }, // WritableNonSigner\n { address: params.mint, role: 0 }, // ReadonlyNonSigner\n { address: params.destination, role: 2 }, // WritableNonSigner\n { address: params.authority.address, role: 1 } // ReadonlySigner\n ],\n data: new Uint8Array(data)\n }\n}\n\n/**\n * Create instruction to withdraw withheld fees from token accounts\n */\nexport function createWithdrawWithheldTokensFromAccountsInstruction(params: {\n mint: Address\n destination: Address\n withdrawWithheldAuthority: TransactionSigner\n sources: Address[]\n}): IInstruction {\n const dataEncoder = getStructEncoder([\n ['instruction', getU8Encoder()],\n ['extensionInstruction', getU8Encoder()],\n ['numAccounts', getU8Encoder()]\n ])\n \n const data = dataEncoder.encode({\n instruction: SPL_TOKEN_2022_INSTRUCTIONS.TransferFeeExtension,\n extensionInstruction: EXTENSION_INSTRUCTIONS.TransferFee.WithdrawWithheldTokensFromAccounts,\n numAccounts: params.sources.length\n })\n \n return {\n programAddress: TOKEN_2022_PROGRAM_ADDRESS,\n accounts: [\n { address: params.mint, role: 0 }, // ReadonlyNonSigner\n { address: params.destination, role: 2 }, // WritableNonSigner\n { address: params.withdrawWithheldAuthority.address, role: 1 }, // ReadonlySigner\n ...params.sources.map(source => ({ address: source, role: 2 })) // WritableNonSigner\n ],\n data: new Uint8Array(data)\n }\n}\n\n// =====================================================\n// CONFIDENTIAL TRANSFER INSTRUCTIONS\n// =====================================================\n\n// DEPRECATED: Use official SPL Token functions for confidential transfers\n// This function is kept for backward compatibility only\n\n/**\n * Create instruction to configure account for confidential transfers\n */\nexport function createConfigureAccountInstruction(params: {\n account: Address\n mint: Address\n elgamalPubkey: Uint8Array\n decryptableZeroBalance: Uint8Array\n maximumPendingBalanceCreditCounter: bigint\n authority: TransactionSigner\n multisigSigners: TransactionSigner[]\n}): IInstruction {\n const dataEncoder = getStructEncoder([\n ['instruction', getU8Encoder()],\n ['extensionInstruction', getU8Encoder()],\n ['elgamalPubkey', fixEncoderSize(getBytesEncoder(), 32)],\n ['decryptableZeroBalance', fixEncoderSize(getBytesEncoder(), 16)],\n ['maximumPendingBalanceCreditCounter', getU64Encoder()]\n ])\n \n const data = dataEncoder.encode({\n instruction: SPL_TOKEN_2022_INSTRUCTIONS.ConfidentialTransferExtension,\n extensionInstruction: EXTENSION_INSTRUCTIONS.ConfidentialTransfer.ConfigureAccount,\n elgamalPubkey: params.elgamalPubkey,\n decryptableZeroBalance: params.decryptableZeroBalance,\n maximumPendingBalanceCreditCounter: params.maximumPendingBalanceCreditCounter\n })\n \n return {\n programAddress: TOKEN_2022_PROGRAM_ADDRESS,\n accounts: [\n { address: params.account, role: 2 }, // WritableNonSigner\n { address: params.mint, role: 0 }, // ReadonlyNonSigner\n { address: params.authority.address, role: 1 }, // ReadonlySigner\n ...params.multisigSigners.map(signer => ({ address: signer.address, role: 1 })) // ReadonlySigner\n ],\n data: new Uint8Array(data)\n }\n}\n\n/**\n * Create instruction to deposit tokens into confidential balance\n */\nexport function createDepositInstruction(params: {\n account: Address\n mint: Address\n amount: bigint\n decimals: number\n authority: TransactionSigner\n multisigSigners: TransactionSigner[]\n}): IInstruction {\n const dataEncoder = getStructEncoder([\n ['instruction', getU8Encoder()],\n ['extensionInstruction', getU8Encoder()],\n ['amount', getU64Encoder()],\n ['decimals', getU8Encoder()]\n ])\n \n const data = dataEncoder.encode({\n instruction: SPL_TOKEN_2022_INSTRUCTIONS.ConfidentialTransferExtension,\n extensionInstruction: EXTENSION_INSTRUCTIONS.ConfidentialTransfer.Deposit,\n amount: params.amount,\n decimals: params.decimals\n })\n \n return {\n programAddress: TOKEN_2022_PROGRAM_ADDRESS,\n accounts: [\n { address: params.account, role: 2 }, // WritableNonSigner\n { address: params.mint, role: 0 }, // ReadonlyNonSigner\n { address: params.authority.address, role: 1 }, // ReadonlySigner\n ...params.multisigSigners.map(signer => ({ address: signer.address, role: 1 })) // ReadonlySigner\n ],\n data: new Uint8Array(data)\n }\n}\n\n/**\n * Create instruction for confidential transfer\n */\nexport function createConfidentialTransferInstruction(params: {\n source: Address\n destination: Address\n mint: Address\n newSourceDecryptableAvailableBalance: Uint8Array // AES encrypted\n authority: TransactionSigner\n multisigSigners: TransactionSigner[]\n proofInstructionOffset: number\n}): IInstruction {\n const dataEncoder = getStructEncoder([\n ['instruction', getU8Encoder()],\n ['extensionInstruction', getU8Encoder()],\n ['newSourceDecryptableAvailableBalance', fixEncoderSize(getBytesEncoder(), 16)],\n ['proofInstructionOffset', getU16Encoder()]\n ])\n \n const data = dataEncoder.encode({\n instruction: SPL_TOKEN_2022_INSTRUCTIONS.ConfidentialTransferExtension,\n extensionInstruction: EXTENSION_INSTRUCTIONS.ConfidentialTransfer.Transfer,\n newSourceDecryptableAvailableBalance: params.newSourceDecryptableAvailableBalance,\n proofInstructionOffset: params.proofInstructionOffset\n })\n \n return {\n programAddress: TOKEN_2022_PROGRAM_ADDRESS,\n accounts: [\n { address: params.source, role: 2 }, // WritableNonSigner\n { address: params.destination, role: 2 }, // WritableNonSigner\n { address: params.mint, role: 0 }, // ReadonlyNonSigner\n { address: params.authority.address, role: 1 }, // ReadonlySigner\n ...params.multisigSigners.map(signer => ({ address: signer.address, role: 1 })) // ReadonlySigner\n ],\n data: new Uint8Array(data)\n }\n}\n\n// =====================================================\n// INTEREST BEARING INSTRUCTIONS\n// =====================================================\n\n// DEPRECATED: Use official SPL Token functions for interest bearing mints\n// This function is kept for backward compatibility only\n\n/**\n * Create instruction to update interest rate\n */\nexport function createUpdateRateInstruction(params: {\n mint: Address\n rateAuthority: TransactionSigner\n rate: number // basis points per year\n}): IInstruction {\n const dataEncoder = getStructEncoder([\n ['instruction', getU8Encoder()],\n ['extensionInstruction', getU8Encoder()],\n ['rate', getU16Encoder()]\n ])\n \n const data = dataEncoder.encode({\n instruction: SPL_TOKEN_2022_INSTRUCTIONS.InterestBearingMintExtension,\n extensionInstruction: EXTENSION_INSTRUCTIONS.InterestBearing.UpdateRate,\n rate: params.rate\n })\n \n return {\n programAddress: TOKEN_2022_PROGRAM_ADDRESS,\n accounts: [\n { address: params.mint, role: 2 }, // WritableNonSigner\n { address: params.rateAuthority.address, role: 1 } // ReadonlySigner\n ],\n data: new Uint8Array(data)\n }\n}\n\n// =====================================================\n// DEFAULT ACCOUNT STATE INSTRUCTIONS\n// =====================================================\n\n// DEPRECATED: Use official SPL Token functions\n// All the custom instruction builders below are deprecated in favor of\n// the official @solana/spl-token library functions\n\n// =====================================================\n// OTHER EXTENSION INSTRUCTIONS\n// =====================================================\n\n// All custom instruction builders removed in favor of official SPL Token library\n\n// =====================================================\n// HELPER FUNCTIONS\n// =====================================================\n\n/**\n * Create a Token-2022 account with proper space allocation for extensions\n */\nexport function calculateAccountSpace(extensions: {\n immutableOwner?: boolean\n transferFeeAmount?: boolean\n confidentialTransferAccount?: boolean\n memoTransfer?: boolean\n nonTransferable?: boolean\n transferHookAccount?: boolean\n cpiGuard?: boolean\n}): number {\n let space = 165 // Base account size\n \n if (extensions.immutableOwner) space += 0 // No extra space, just a flag\n if (extensions.transferFeeAmount) space += 2 + 8 // Extension type + withheld amount\n if (extensions.confidentialTransferAccount) space += 2 + 286 // Extension type + CT account data\n if (extensions.memoTransfer) space += 2 + 1 // Extension type + require flag\n if (extensions.nonTransferable) space += 0 // No extra space, just a flag\n if (extensions.transferHookAccount) space += 2 + 1 // Extension type + transferring flag\n if (extensions.cpiGuard) space += 2 + 1 // Extension type + lock flag\n \n return space\n}\n\n/**\n * Check if a mint has a specific extension enabled\n */\nexport function hasExtension(\n mintData: Uint8Array,\n extensionType: ExtensionType\n): boolean {\n if (mintData.length <= 82) return false // No extensions\n \n let offset = 82\n const view = new DataView(mintData.buffer, mintData.byteOffset, mintData.byteLength)\n \n while (offset < mintData.length - 2) {\n try {\n const type = view.getUint16(offset, true)\n if (type === Number(extensionType)) return true\n \n // Skip to next extension\n if (offset + 4 > mintData.length) break\n const length = view.getUint16(offset + 2, true)\n offset += 4 + length\n } catch {\n break\n }\n }\n \n return false\n}\n\n/**\n * Parse extension data from mint account\n */\nexport function parseExtension<T>(\n mintData: Uint8Array,\n extensionType: ExtensionType,\n parser: (data: Uint8Array) => T\n): T | null {\n if (mintData.length <= 82) return null\n \n let offset = 82\n const view = new DataView(mintData.buffer, mintData.byteOffset, mintData.byteLength)\n \n while (offset < mintData.length - 4) {\n try {\n const type = view.getUint16(offset, true)\n const length = view.getUint16(offset + 2, true)\n \n if (type === Number(extensionType)) {\n const extData = mintData.slice(offset + 4, offset + 4 + length)\n return parser(extData)\n }\n \n offset += 4 + length\n } catch {\n break\n }\n }\n \n return null\n}"]}
@@ -1,3 +0,0 @@
1
- import {a}from'./chunk-DJ356OUX.js';var b={MAX_REPUTATION_SCORE:1e4,MIN_REPUTATION_FOR_SLASH:1e3,REPUTATION_DECAY_RATE_BPS:10,BRONZE_TIER_THRESHOLD:2e3,SILVER_TIER_THRESHOLD:5e3,GOLD_TIER_THRESHOLD:7500,PLATINUM_TIER_THRESHOLD:9e3,MAX_REPUTATION_CATEGORIES:10,MAX_PERFORMANCE_HISTORY:365,MAX_BADGES:20};function w(c){if(typeof c!="object"||c===null)return false;let e=c;return e.type==="ipfs_reference"&&typeof e.ipfsUri=="string"&&typeof e.ipfsHash=="string"&&typeof e.originalSize=="number"&&typeof e.contentPreview=="string"&&typeof e.uploadedAt=="number"}function h(c){return typeof c!="object"||c===null?false:typeof c.IpfsHash=="string"}var A={};a(A,{IPFSClient:()=>m});var P=new Map,l=0,u=class{constructor(e){this.config=e;console.log("\u{1F9EA} Initialized TestIPFSProvider for local testing (shared storage)");}storage=P;uploadCount=0;async upload(e,t){l++;let r=typeof e=="string"?e:new TextDecoder().decode(e),n=`Qm${this.generateHash(r)}_test_${l}`;this.storage.set(n,{content:e,pinned:t?.pin!==false});let s=typeof e=="string"?new TextEncoder().encode(e).length:e.length;return console.log(`\u{1F4E6} Test IPFS upload: ${n} (${s} bytes)`),{hash:n,uri:`ipfs://${n}`,size:s,timestamp:Date.now(),pinned:t?.pin!==false,gateways:[`http://localhost:8080/ipfs/${n}`,`https://test.ipfs.io/ipfs/${n}`]}}async retrieve(e){let t=this.storage.get(e);if(!t)throw new Error(`Test IPFS: Content not found for hash ${e}`);return console.log(`\u{1F4E5} Test IPFS retrieve: ${e}`),await new Promise(r=>setTimeout(r,100)),t.content}async pin(e){let t=this.storage.get(e);return t?(t.pinned=true,console.log(`\u{1F4CC} Test IPFS pin: ${e}`),{hash:e,success:true,status:"pinned"}):{hash:e,success:false,status:"failed",error:`Content not found: ${e}`}}async unpin(e){let t=this.storage.get(e);return t?(t.pinned=false,console.log(`\u{1F4CC} Test IPFS unpin: ${e}`),{hash:e,success:true,status:"pinned"}):{hash:e,success:false,status:"failed",error:`Content not found: ${e}`}}generateHash(e){let t=0;for(let i=0;i<e.length;i++){let o=e.charCodeAt(i);t=(t<<5)-t+o,t=t&t;}let r="123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz",n="",s=Math.abs(t);for(;s>0&&n.length<40;)n=r[s%r.length]+n,s=Math.floor(s/r.length);for(;n.length<40;)n=r[Math.floor(Math.random()*r.length)]+n;return n}getStats(){let e=0,t=0;for(let r of this.storage.values()){let n=typeof r.content=="string"?new TextEncoder().encode(r.content).length:r.content.length;e+=n,r.pinned&&t++;}return {count:this.storage.size,totalSize:e,pinned:t}}clear(){this.storage.clear(),l=0,console.log("\u{1F9F9} Test IPFS storage cleared");}static getSharedStorage(){return P}};var g=class{constructor(e){this.config=e;}async upload(e,t){let r=this.config.endpoint??"https://api.pinata.cloud",n=new FormData,s=new Blob([e],{type:t?.contentType??"application/octet-stream"});n.append("file",s,t?.filename??"content"),t?.metadata&&n.append("pinataMetadata",JSON.stringify({name:t.filename??"ghostspeak-content",keyvalues:t.metadata}));let i=await fetch(`${r}/pinning/pinFileToIPFS`,{method:"POST",headers:{Authorization:`Bearer ${this.config.jwt??this.config.apiKey}`,...this.config.headers},body:n});if(!i.ok){let p=await i.text();throw new Error(`Pinata upload failed: ${i.status} ${p}`)}let o=await i.json(),a=typeof e=="string"?new TextEncoder().encode(e).length:e.length;if(!h(o))throw new Error("Invalid IPFS upload response format");return {hash:o.IpfsHash,uri:`ipfs://${o.IpfsHash}`,size:a,timestamp:Date.now(),pinned:true,gateways:[`https://gateway.pinata.cloud/ipfs/${o.IpfsHash}`,`https://ipfs.io/ipfs/${o.IpfsHash}`]}}async retrieve(e,t){let n=`${t?.gateway??"https://gateway.pinata.cloud"}/ipfs/${e}`,s=await fetch(n,{signal:t?.timeout?AbortSignal.timeout(t.timeout):void 0});if(!s.ok)throw new Error(`Failed to retrieve from IPFS: ${s.status} ${s.statusText}`);let i=s.headers.get("content-type");return i?.startsWith("text/")||i?.includes("json")?s.text():new Uint8Array(await s.arrayBuffer())}async pin(e){let t=this.config.endpoint??"https://api.pinata.cloud",r=await fetch(`${t}/pinning/pinByHash`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.config.jwt??this.config.apiKey}`,...this.config.headers},body:JSON.stringify({hashToPin:e})}),n=r.ok;return {hash:e,success:n,status:n?"pinned":"failed",error:n?void 0:`Pin failed: ${r.status}`}}async unpin(e){let t=this.config.endpoint??"https://api.pinata.cloud",r=await fetch(`${t}/pinning/unpin/${e}`,{method:"DELETE",headers:{Authorization:`Bearer ${this.config.jwt??this.config.apiKey}`,...this.config.headers}}),n=r.ok;return {hash:e,success:n,status:n?"pinned":"failed",error:n?void 0:`Unpin failed: ${r.status}`}}},f=class{constructor(e){this.config=e;}async upload(e,t){let r=this.config.endpoint??"http://localhost:5001",n=new FormData,s=new Blob([e],{type:t?.contentType??"application/octet-stream"});n.append("file",s,t?.filename??"content");let i=await fetch(`${r}/api/v0/add`,{method:"POST",body:n});if(!i.ok)throw new Error(`IPFS HTTP upload failed: ${i.status}`);let o=await i.json(),a=typeof e=="string"?new TextEncoder().encode(e).length:e.length;if(typeof o!="object"||o===null)throw new Error("Invalid IPFS HTTP API response");let p=o;if(typeof p.Hash!="string")throw new Error("IPFS HTTP API response missing Hash field");let d=p.Hash;return {hash:d,uri:`ipfs://${d}`,size:a,timestamp:Date.now(),pinned:t?.pin!==false,gateways:[`${r}/ipfs/${d}`,`https://ipfs.io/ipfs/${d}`]}}async retrieve(e,t){let n=`${t?.gateway??this.config.endpoint?.replace("/api/v0","")??"https://ipfs.io"}/ipfs/${e}`,s=await fetch(n,{signal:t?.timeout?AbortSignal.timeout(t.timeout):void 0});if(!s.ok)throw new Error(`Failed to retrieve from IPFS: ${s.status}`);let i=s.headers.get("content-type");return i?.startsWith("text/")||i?.includes("json")?s.text():new Uint8Array(await s.arrayBuffer())}async pin(e){let t=this.config.endpoint??"http://localhost:5001",r=await fetch(`${t}/api/v0/pin/add?arg=${e}`,{method:"POST"}),n=r.ok;return {hash:e,success:n,status:n?"pinned":"failed",error:n?void 0:`Pin failed: ${r.status}`}}async unpin(e){let t=this.config.endpoint??"http://localhost:5001",r=await fetch(`${t}/api/v0/pin/rm?arg=${e}`,{method:"POST"}),n=r.ok;return {hash:e,success:n,status:n?"pinned":"failed",error:n?void 0:`Unpin failed: ${r.status}`}}},m=class{constructor(e){this.config=e;this.initializeProviders();}providers=[];cache=new Map;initializeProviders(){if(this.providers.push(this.createProvider(this.config.provider)),this.config.fallbackProviders)for(let e of this.config.fallbackProviders)this.providers.push(this.createProvider(e));}createProvider(e){switch(e.name){case "pinata":return new g(e);case "ipfs-http-client":case "custom":return new f(e);case "test":return new u(e);default:throw new Error(`Unsupported IPFS provider: ${e.name}`)}}async upload(e,t){let r=Date.now(),n;for(let s=0;s<this.providers.length;s++){let i=this.providers[s];try{console.log(`\u{1F4E4} Attempting IPFS upload with provider ${s+1}/${this.providers.length}`);let o=await this.withRetry(()=>i.upload(e,t),this.config.maxRetries??3,this.config.retryDelay??1e3);return console.log(`\u2705 IPFS upload successful: ${o.hash}`),{success:!0,data:o,duration:Date.now()-r,provider:this.config.provider.name}}catch(o){console.warn(`\u274C Provider ${s+1} upload failed:`,o instanceof Error?o.message:String(o)),n=o instanceof Error?o:new Error(String(o));}}return {success:false,error:"UPLOAD_FAILED",message:`All providers failed. Last error: ${n?.message}`,duration:Date.now()-r}}async retrieve(e,t){let r=Date.now();if(this.config.enableCache&&t?.cache!==false){let i=this.cache.get(e);if(i&&Date.now()-i.timestamp<(this.config.cacheTTL??3e5))return {success:true,data:{content:i.content,size:(typeof i.content=="string",i.content.length),hash:e,gateway:"cache",fromCache:true},duration:Date.now()-r}}let n,s=t?.gateway?[t.gateway]:this.config.gateways??["https://ipfs.io"];for(let i of s)for(let o of this.providers)try{let a=await this.withRetry(()=>o.retrieve(e,{...t,gateway:i}),this.config.maxRetries??3,this.config.retryDelay??1e3);return this.config.enableCache&&this.cache.set(e,{content:a,timestamp:Date.now()}),{success:!0,data:{content:a,size:a.length,hash:e,gateway:i,fromCache:!1},duration:Date.now()-r}}catch(a){n=a instanceof Error?a:new Error(String(a));}return {success:false,error:"RETRIEVAL_FAILED",message:`Failed to retrieve from all gateways. Last error: ${n?.message}`,duration:Date.now()-r}}async pin(e){let t=Date.now();for(let r of this.providers)try{let n=await r.pin(e);return {success:n.success,data:n,duration:Date.now()-t}}catch(n){console.warn("Pin attempt failed:",n);}return {success:false,error:"PIN_FAILED",message:"All pin attempts failed",duration:Date.now()-t}}async storeContent(e,t,r){let n=new TextEncoder().encode(e).length,s=this.config.sizeThreshold??800;if(!(r?.forceIpfs??n>s))return {uri:`data:application/json;base64,${btoa(e)}`,useIpfs:false,size:n};let o=await this.upload(e,r);if(!o.success||!o.data)throw new Error(`IPFS upload failed: ${o.message}`);let a={type:t,originalSize:n,ipfsHash:o.data.hash,encoding:"utf8",compression:"none",mimeType:"application/json",uploadedAt:o.data.timestamp,pinned:o.data.pinned,checksum:await this.calculateChecksum(e)};return {uri:o.data.uri,useIpfs:true,ipfsMetadata:a,size:n}}async retrieveContent(e){if(e.startsWith("data:")){let t=e.split(",")[1];if(!t)throw new Error("Invalid data URI format");return atob(t)}if(e.startsWith("ipfs://")){let t=e.replace("ipfs://",""),r=await this.retrieve(t);if(!r.success||!r.data)throw new Error(`Failed to retrieve IPFS content: ${r.message}`);return typeof r.data.content=="string"?r.data.content:new TextDecoder().decode(r.data.content)}throw new Error(`Unsupported URI format: ${e}`)}async withRetry(e,t,r){let n;for(let s=0;s<=t;s++)try{return await e()}catch(i){n=i instanceof Error?i:new Error(String(i)),s<t&&(console.log(`\u23F3 Retrying in ${r}ms... (attempt ${s+1}/${t})`),await new Promise(o=>setTimeout(o,r)));}throw n}async calculateChecksum(e){let r=new TextEncoder().encode(e),n=await crypto.subtle.digest("SHA-256",r);return Array.from(new Uint8Array(n)).map(i=>i.toString(16).padStart(2,"0")).join("")}clearCache(){this.cache.clear();}getCacheStats(){return {size:this.cache.size,keys:Array.from(this.cache.keys())}}};
2
- export{b as a,w as b,m as c,A as d};//# sourceMappingURL=chunk-KK3HV2RD.js.map
3
- //# sourceMappingURL=chunk-KK3HV2RD.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/types/reputation-types.ts","../src/types/index.ts","../src/utils/ipfs-client.ts","../src/utils/test-ipfs-provider.ts"],"names":["REPUTATION_CONSTANTS","isIPFSReference","data","obj","isIPFSUploadResponse","ipfs_client_exports","__export","IPFSClient","sharedTestStorage","sharedUploadCount","TestIPFSProvider","config","content","options","contentStr","hash","size","stored","resolve","char","chars","result","value","totalSize","pinned","PinataProvider","endpoint","formData","blob","response","errorText","url","contentType","success","HttpClientProvider","ipfsResult","providerConfig","startTime","lastError","i","provider","error","cached","gateways","gateway","type","contentSize","sizeThreshold","uploadResult","ipfsMetadata","uri","base64Data","operation","maxRetries","delay","attempt","hashBuffer","b"],"mappings":"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","file":"chunk-KK3HV2RD.js","sourcesContent":["import type { Address } from '@solana/kit'\n\n/**\n * Reputation tier levels\n */\nexport enum ReputationTier {\n None = 'None',\n Bronze = 'Bronze',\n Silver = 'Silver',\n Gold = 'Gold',\n Platinum = 'Platinum'\n}\n\n/**\n * Badge types for reputation achievements\n */\nexport enum BadgeType {\n FirstJob = 'FirstJob',\n TenJobs = 'TenJobs',\n HundredJobs = 'HundredJobs',\n ThousandJobs = 'ThousandJobs',\n PerfectRating = 'PerfectRating',\n QuickResponder = 'QuickResponder',\n HighEarner = 'HighEarner',\n DisputeResolver = 'DisputeResolver',\n CategoryExpert = 'CategoryExpert',\n CrossCategoryMaster = 'CrossCategoryMaster'\n}\n\n/**\n * Reputation calculation factors with weights\n */\nexport interface ReputationFactors {\n /** Completion rate weight (0-100) */\n completionWeight: number\n /** Quality score weight (0-100) */\n qualityWeight: number\n /** Timeliness weight (0-100) */\n timelinessWeight: number\n /** Client satisfaction weight (0-100) */\n satisfactionWeight: number\n /** Dispute resolution weight (0-100) */\n disputeWeight: number\n}\n\n/**\n * Category-specific reputation data\n */\nexport interface CategoryReputation {\n /** Category identifier (e.g., \"defi\", \"nft\", \"gaming\") */\n category: string\n /** Current reputation score in this category (basis points) */\n score: number\n /** Total completed jobs in this category */\n completedJobs: number\n /** Average completion time in seconds */\n avgCompletionTime: number\n /** Quality ratings sum */\n qualitySum: number\n /** Number of quality ratings */\n qualityCount: number\n /** Last activity timestamp */\n lastActivity: number\n /** Total earnings in this category */\n totalEarnings: number\n}\n\n/**\n * Performance snapshot for historical tracking\n */\nexport interface PerformanceSnapshot {\n /** Timestamp of snapshot */\n timestamp: number\n /** Reputation score at this time */\n score: number\n /** Jobs completed in this period */\n jobsCompleted: number\n /** Average quality rating */\n avgQuality: number\n}\n\n/**\n * Reputation badge structure\n */\nexport interface ReputationBadge {\n /** Badge identifier */\n badgeType: BadgeType\n /** Timestamp when earned */\n earnedAt: number\n /** Associated achievement value */\n achievementValue: number\n}\n\n/**\n * Main reputation data structure\n */\nexport interface ReputationData {\n /** Agent public key */\n agent: Address\n /** Overall reputation score (basis points) */\n overallScore: number\n /** Current reputation tier */\n tier: ReputationTier\n /** Category-specific reputations */\n categoryReputations: CategoryReputation[]\n /** Total staked reputation tokens */\n stakedAmount: number\n /** Reputation calculation factors */\n factors: ReputationFactors\n /** Total completed jobs across all categories */\n totalJobsCompleted: number\n /** Total failed/cancelled jobs */\n totalJobsFailed: number\n /** Average response time in seconds */\n avgResponseTime: number\n /** Number of disputes filed against agent */\n disputesAgainst: number\n /** Number of disputes resolved favorably */\n disputesResolved: number\n /** Last reputation update timestamp */\n lastUpdated: number\n /** Creation timestamp */\n createdAt: number\n /** Historical performance data */\n performanceHistory: PerformanceSnapshot[]\n /** Reputation badges earned */\n badges: ReputationBadge[]\n /** Cross-category reputation transfer enabled */\n crossCategoryEnabled: boolean\n}\n\n/**\n * Job performance data for reputation calculation\n */\nexport interface JobPerformance {\n /** Whether job was completed successfully */\n completed: boolean\n /** Quality rating (0-100) */\n qualityRating: number\n /** Expected duration in seconds */\n expectedDuration: number\n /** Actual duration in seconds */\n actualDuration: number\n /** Client satisfaction (0-100) */\n clientSatisfaction: number\n /** Whether there was a dispute */\n hadDispute: boolean\n /** Whether dispute was resolved favorably for agent */\n disputeResolvedFavorably: boolean\n /** Job category */\n category: string\n /** Payment amount */\n paymentAmount: number\n}\n\n/**\n * Reputation calculation result\n */\nexport interface ReputationCalculationResult {\n /** New overall score */\n overallScore: number\n /** Score for this specific job */\n jobScore: number\n /** Category-specific score */\n categoryScore: number\n /** New reputation tier */\n tier: ReputationTier\n /** Badges earned from this update */\n newBadges: BadgeType[]\n /** Whether fraud was detected */\n fraudDetected: boolean\n /** Fraud risk score (0-100) */\n fraudRiskScore: number\n}\n\n/**\n * Reputation query filters\n */\nexport interface ReputationQueryFilters {\n /** Filter by minimum score */\n minScore?: number\n /** Filter by maximum score */\n maxScore?: number\n /** Filter by tier */\n tier?: ReputationTier\n /** Filter by category */\n category?: string\n /** Filter by minimum jobs completed */\n minJobsCompleted?: number\n /** Filter by badges */\n requiredBadges?: BadgeType[]\n /** Include historical data */\n includeHistory?: boolean\n /** Maximum number of results to return */\n limit?: number\n}\n\n/**\n * Reputation update event\n */\nexport interface ReputationUpdateEvent {\n agent: Address\n previousScore: number\n newScore: number\n category: string\n timestamp: number\n}\n\n/**\n * Constants for reputation calculations\n */\nexport const REPUTATION_CONSTANTS = {\n /** Maximum reputation score (basis points) */\n MAX_REPUTATION_SCORE: 10000,\n /** Minimum reputation score for slashing */\n MIN_REPUTATION_FOR_SLASH: 1000,\n /** Reputation decay rate per day (basis points) */\n REPUTATION_DECAY_RATE_BPS: 10,\n /** Tier thresholds (basis points) */\n BRONZE_TIER_THRESHOLD: 2000,\n SILVER_TIER_THRESHOLD: 5000,\n GOLD_TIER_THRESHOLD: 7500,\n PLATINUM_TIER_THRESHOLD: 9000,\n /** Maximum categories per agent */\n MAX_REPUTATION_CATEGORIES: 10,\n /** Maximum performance history entries */\n MAX_PERFORMANCE_HISTORY: 365,\n /** Maximum badges per agent */\n MAX_BADGES: 20\n}\n\n/**\n * Fraud detection patterns\n */\nexport interface FraudPattern {\n /** Pattern identifier */\n patternId: string\n /** Pattern description */\n description: string\n /** Risk score contribution (0-100) */\n riskScore: number\n /** Detection function */\n detect: (data: ReputationData, job: JobPerformance) => boolean\n}\n\n/**\n * Reputation analytics data\n */\nexport interface ReputationAnalytics {\n /** Average score across all agents */\n averageScore: number\n /** Distribution of tiers */\n tierDistribution: Record<ReputationTier, number>\n /** Top categories by activity */\n topCategories: { category: string; jobCount: number }[]\n /** Fraud detection statistics */\n fraudStats: {\n totalDetected: number\n falsePositiveRate: number\n patterns: Record<string, number>\n }\n}","// Core types for GhostSpeak Protocol\nimport type { Address } from '@solana/addresses'\nimport type { Agent, ServiceListing } from '../generated/index.js'\nimport type { IPFSConfig } from './ipfs-types.js'\nimport type { \n Rpc,\n RpcSubscriptions,\n GetLatestBlockhashApi,\n SendTransactionApi,\n GetAccountInfoApi,\n SimulateTransactionApi,\n GetFeeForMessageApi,\n GetProgramAccountsApi,\n GetEpochInfoApi,\n GetSignatureStatusesApi,\n SignatureNotificationsApi,\n SlotNotificationsApi,\n GetMultipleAccountsApi\n} from '@solana/kit'\n\n// Import generated types and re-export for convenience\nexport * from '../generated/index.js'\n\n// Export IPFS types\nexport * from './ipfs-types.js'\n\n// Export RPC client types\nexport * from './rpc-client-types.js'\n\n// Export Token-2022 types (excluding conflicting types)\nexport {\n // Mint extensions\n type TransferFeeConfig,\n type TransferFee,\n type InterestBearingConfig,\n type MintCloseAuthority,\n type PermanentDelegate,\n type DefaultAccountState,\n AccountState,\n type TransferHook,\n type MetadataPointer,\n type GroupPointer,\n type GroupMemberPointer,\n type ConfidentialTransferMint,\n type TransferFeeAmount,\n // Account extensions\n type ImmutableOwner,\n type NonTransferable,\n type MemoTransfer,\n type CpiGuard,\n type ConfidentialTransferAccount,\n type TransferHookAccount,\n // Token metadata\n type TokenMetadata,\n type AdditionalMetadata,\n // Group extensions\n type TokenGroup,\n type TokenGroupMember,\n // Composite types\n type MintExtensions,\n type AccountExtensions,\n type MintWithExtensions,\n type TokenAccountWithExtensions,\n // RPC types\n type ParsedMintAccount,\n type ParsedTokenAccount,\n // Utility types\n type ExtensionTLV,\n type ParsedExtensions\n} from './token-2022-types.js'\n\n// Export reputation types\nexport * from './reputation-types.js'\n\n// Modern RPC API types using 2025 Web3.js v2 patterns\nexport type RpcApi = Rpc<\n GetLatestBlockhashApi &\n SendTransactionApi &\n GetAccountInfoApi &\n SimulateTransactionApi &\n GetFeeForMessageApi &\n GetProgramAccountsApi\n>\n\n// Add missing API types for full RPC support\nexport type ExtendedRpcApi = RpcApi & Rpc<GetEpochInfoApi & GetSignatureStatusesApi & GetMultipleAccountsApi>\n\n// RPC Subscription types\nexport type RpcSubscriptionApi = RpcSubscriptions<SignatureNotificationsApi & SlotNotificationsApi>\n\nexport type Commitment = 'processed' | 'confirmed' | 'finalized'\n\n// Program ID - import from generated\nexport { GHOSTSPEAK_MARKETPLACE_PROGRAM_ADDRESS as GHOSTSPEAK_PROGRAM_ID } from '../generated/programs/index.js'\n\n// Configuration types\nexport interface GhostSpeakConfig {\n programId?: Address\n rpc: ExtendedRpcApi\n rpcSubscriptions?: RpcSubscriptionApi\n commitment?: Commitment\n transactionTimeout?: number\n defaultFeePayer?: Address\n retryConfig?: RetryConfig\n cluster?: 'mainnet-beta' | 'devnet' | 'testnet' | 'localnet'\n rpcEndpoint?: string\n wsEndpoint?: string\n /** Token 2022 configuration options */\n token2022?: Token2022Config\n /** IPFS configuration for large content storage */\n ipfsConfig?: IPFSConfig\n}\n\nexport interface Token2022Config {\n /** Enable Token 2022 features by default */\n enabled?: boolean\n /** Default behavior for transfer fees */\n defaultExpectTransferFees?: boolean\n /** Maximum transfer fee slippage (basis points) */\n maxFeeSlippageBasisPoints?: number\n /** Enable confidential transfers by default */\n enableConfidentialTransfers?: boolean\n /** Default Token 2022 program address (for custom deployments) */\n programAddress?: Address\n /** Cache token program detection results for this many seconds */\n tokenProgramCacheTtl?: number\n}\n\nexport interface RetryConfig {\n maxRetries?: number\n baseDelay?: number\n maxDelay?: number\n backoffMultiplier?: number\n retryableErrors?: string[]\n}\n\n// Agent types\nexport interface AgentWithAddress {\n address: Address\n data: Agent\n}\n\n// Service listing types\nexport interface ServiceListingWithAddress {\n address: Address\n data: ServiceListing\n}\n\nexport interface AgentRegistrationData {\n name: string\n description: string\n capabilities: string[]\n metadataUri: string\n serviceEndpoint: string\n}\n\nexport interface AgentAccount {\n owner: Address\n name: string\n description: string\n capabilities: string[]\n metadataUri: string\n serviceEndpoint: string\n isActive: boolean\n registeredAt: bigint\n reputation: number\n totalEarnings: bigint\n totalJobs: number\n successRate: number\n bump: number\n}\n\n// Marketplace types\nexport interface ServiceListingData {\n id: string\n agent: Address\n title: string\n description: string\n price: bigint\n currency: Address\n category: string\n isActive: boolean\n createdAt: bigint\n}\n\nexport interface JobPosting {\n id: string\n poster: Address\n title: string\n description: string\n budget: bigint\n currency: Address\n deadline: bigint\n requirements: string[]\n isActive: boolean\n createdAt: bigint\n}\n\n// Escrow types\nexport interface EscrowAccount {\n buyer: Address\n seller: Address\n agent: Address\n amount: bigint\n currency: Address\n status: EscrowStatus\n createdAt: bigint\n completedAt?: bigint\n}\n\nexport enum EscrowStatus {\n Active = 'Active',\n Completed = 'Completed',\n Disputed = 'Disputed',\n Cancelled = 'Cancelled'\n}\n\n// A2A Protocol types\nexport interface A2ASession {\n sessionId: bigint\n initiator: Address\n responder: Address\n sessionType: string\n metadata: string\n isActive: boolean\n createdAt: bigint\n expiresAt: bigint\n}\n\nexport interface A2AMessage {\n messageId: bigint\n session: Address\n sender: Address\n content: string\n messageType: string\n sentAt: bigint\n}\n\n// Pricing models\nexport enum PricingModel {\n Fixed = 'Fixed',\n Hourly = 'Hourly',\n PerTask = 'PerTask',\n Subscription = 'Subscription',\n Auction = 'Auction'\n}\n\n// Error types\nexport class GhostSpeakError extends Error {\n constructor(message: string, public code?: string) {\n super(message)\n this.name = 'GhostSpeakError'\n }\n}\n\n// Instruction parameters types\nexport interface RegisterAgentParams {\n agentData: AgentRegistrationData\n}\n\nexport interface CreateServiceListingParams {\n title: string\n description: string\n price: bigint\n currency: Address\n category: string\n}\n\nexport interface CreateJobPostingParams {\n title: string\n description: string\n budget: bigint\n currency: Address\n deadline: bigint\n requirements: string[]\n}\n\nexport interface CreateEscrowParams {\n seller: Address\n agent: Address\n amount: bigint\n currency: Address\n}\n\nexport interface CreateA2ASessionParams {\n responder: Address\n sessionType: string\n metadata: string\n expiresAt: bigint\n}\n\nexport interface SendA2AMessageParams {\n session: Address\n content: string\n messageType: string\n}\n\n// RPC Response Types (to replace 'any' usage)\nexport interface RpcResponse<T> {\n value: T | null\n}\n\nexport interface RpcAccountInfo {\n executable: boolean\n lamports: bigint\n owner: Address\n rentEpoch: bigint\n space: bigint\n data: string | Uint8Array\n}\n\nexport interface RpcProgramAccount {\n pubkey: Address\n account: RpcAccountInfo\n}\n\nexport interface RpcProgramAccountsResponse {\n value: RpcProgramAccount[] | null\n}\n\nexport interface RpcAccountInfoResponse {\n value: RpcAccountInfo | null\n}\n\nexport interface RpcMultipleAccountsResponse {\n value: (RpcAccountInfo | null)[]\n}\n\n// Transaction Builder Response Types\nexport interface TransactionResponse {\n signature: string\n confirmationStatus?: Commitment\n err?: unknown | null\n}\n\nexport interface SimulatedTransactionResponse {\n value: {\n err?: unknown | null\n logs?: string[]\n unitsConsumed?: number\n }\n}\n\n// Modern RPC Client Interface (replacement for 'any' rpc parameter)\nexport interface SolanaRpcClient {\n getAccountInfo(\n address: Address, \n options?: { commitment?: Commitment; encoding?: string }\n ): Promise<RpcAccountInfoResponse>\n \n getMultipleAccounts(\n addresses: Address[], \n options?: { commitment?: Commitment; encoding?: string }\n ): Promise<RpcMultipleAccountsResponse>\n \n getProgramAccounts(\n programId: Address,\n options?: {\n commitment?: Commitment\n encoding?: string\n filters?: unknown[]\n }\n ): Promise<RpcProgramAccountsResponse>\n \n sendTransaction(\n transaction: unknown,\n options?: { commitment?: Commitment }\n ): Promise<TransactionResponse>\n \n simulateTransaction(\n transaction: unknown,\n options?: { commitment?: Commitment }\n ): Promise<SimulatedTransactionResponse>\n}\n\n// Emergency Configuration Interface for Governance\nexport interface EmergencyConfig {\n emergencyDelay?: bigint\n emergencyThreshold?: number\n emergencySigners?: Address[]\n canEmergencyPause?: boolean\n emergencyContact?: string\n}\n\n// IPFS Message Content Types\nexport interface IPFSReference {\n type: 'ipfs_reference'\n ipfsUri: string\n ipfsHash: string\n originalSize: number\n contentPreview: string\n uploadedAt: number\n}\n\n// Type guard for IPFS reference\nexport function isIPFSReference(data: unknown): data is IPFSReference {\n if (typeof data !== 'object' || data === null) return false\n const obj = data as Record<string, unknown>\n return (\n obj.type === 'ipfs_reference' &&\n typeof obj.ipfsUri === 'string' &&\n typeof obj.ipfsHash === 'string' &&\n typeof obj.originalSize === 'number' &&\n typeof obj.contentPreview === 'string' &&\n typeof obj.uploadedAt === 'number'\n )\n}\n\n// Message metadata type\nexport interface MessageMetadata {\n ipfsHash: string\n originalSize: number\n contentPreview: string\n uploadedAt: number\n}\n\n// Resolved message content type\nexport interface ResolvedMessageContent {\n resolvedContent: string\n isIPFS: boolean\n metadata?: MessageMetadata\n}\n\n// IPFS Upload Response\nexport interface IPFSUploadResponse {\n IpfsHash: string\n PinSize?: number\n Timestamp?: string\n}\n\n// Type guard for IPFS upload response\nexport function isIPFSUploadResponse(data: unknown): data is IPFSUploadResponse {\n if (typeof data !== 'object' || data === null) return false\n const obj = data as Record<string, unknown>\n return typeof obj.IpfsHash === 'string'\n}\n\n// Attachment upload result type\nexport interface AttachmentUploadResult {\n filename: string\n contentType: string\n ipfsHash: string\n ipfsUri: string\n size: number\n}","/**\n * IPFS client implementation with multiple provider support\n */\n\nimport './text-encoder-polyfill.js'\n\n// Use global fetch (available in Node.js 18+ and all modern browsers)\ndeclare const fetch: typeof globalThis.fetch\n// Node.js globals for Buffer operations\ndeclare const btoa: (str: string) => string\ndeclare const crypto: typeof globalThis.crypto\n\nimport type {\n IPFSConfig,\n IPFSProviderConfig,\n IPFSUploadOptions,\n IPFSUploadResult,\n IPFSRetrievalOptions,\n IPFSRetrievalResult,\n IPFSPinResult,\n IPFSOperationResult,\n ContentStorageResult,\n IPFSContentMetadata\n} from '../types/ipfs-types.js'\nimport { isIPFSUploadResponse } from '../types/index.js'\nimport { TestIPFSProvider } from './test-ipfs-provider.js'\n\n/**\n * Provider interface for different IPFS services\n */\ninterface IPFSProvider {\n upload(content: string | Uint8Array, options?: IPFSUploadOptions): Promise<IPFSUploadResult>\n retrieve(hash: string, options?: IPFSRetrievalOptions): Promise<string | Uint8Array>\n pin(hash: string): Promise<IPFSPinResult>\n unpin(hash: string): Promise<IPFSPinResult>\n}\n\n/**\n * Pinata IPFS provider implementation\n */\nclass PinataProvider implements IPFSProvider {\n constructor(private config: IPFSProviderConfig) {}\n\n async upload(content: string | Uint8Array, options?: IPFSUploadOptions): Promise<IPFSUploadResult> {\n const endpoint = this.config.endpoint ?? 'https://api.pinata.cloud'\n const formData = new FormData()\n \n // Convert content to blob\n const blob = new Blob([content], { \n type: options?.contentType ?? 'application/octet-stream' \n })\n formData.append('file', blob, options?.filename ?? 'content')\n \n // Add metadata if provided\n if (options?.metadata) {\n formData.append('pinataMetadata', JSON.stringify({\n name: options.filename ?? 'ghostspeak-content',\n keyvalues: options.metadata\n }))\n }\n\n const response = await fetch(`${endpoint}/pinning/pinFileToIPFS`, {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${this.config.jwt ?? this.config.apiKey}`,\n ...this.config.headers\n },\n body: formData\n })\n\n if (!response.ok) {\n const errorText = await response.text()\n throw new Error(`Pinata upload failed: ${response.status} ${errorText}`)\n }\n\n const result: unknown = await response.json()\n const size = typeof content === 'string' ? new TextEncoder().encode(content).length : content.length\n\n if (!isIPFSUploadResponse(result)) {\n throw new Error('Invalid IPFS upload response format')\n }\n\n return {\n hash: result.IpfsHash,\n uri: `ipfs://${result.IpfsHash}`,\n size,\n timestamp: Date.now(),\n pinned: true, // Pinata automatically pins\n gateways: [\n `https://gateway.pinata.cloud/ipfs/${result.IpfsHash}`,\n `https://ipfs.io/ipfs/${result.IpfsHash}`\n ]\n }\n }\n\n async retrieve(hash: string, options?: IPFSRetrievalOptions): Promise<string | Uint8Array> {\n const gateway = options?.gateway ?? 'https://gateway.pinata.cloud'\n const url = `${gateway}/ipfs/${hash}`\n \n const response = await fetch(url, {\n signal: options?.timeout ? AbortSignal.timeout(options.timeout) : undefined\n })\n\n if (!response.ok) {\n throw new Error(`Failed to retrieve from IPFS: ${response.status} ${response.statusText}`)\n }\n\n const contentType = response.headers.get('content-type')\n if (contentType?.startsWith('text/') || contentType?.includes('json')) {\n return response.text()\n } else {\n return new Uint8Array(await response.arrayBuffer())\n }\n }\n\n async pin(hash: string): Promise<IPFSPinResult> {\n const endpoint = this.config.endpoint ?? 'https://api.pinata.cloud'\n \n const response = await fetch(`${endpoint}/pinning/pinByHash`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${this.config.jwt ?? this.config.apiKey}`,\n ...this.config.headers\n },\n body: JSON.stringify({ hashToPin: hash })\n })\n\n const success = response.ok\n return {\n hash,\n success,\n status: success ? 'pinned' : 'failed',\n error: success ? undefined : `Pin failed: ${response.status}`\n }\n }\n\n async unpin(hash: string): Promise<IPFSPinResult> {\n const endpoint = this.config.endpoint ?? 'https://api.pinata.cloud'\n \n const response = await fetch(`${endpoint}/pinning/unpin/${hash}`, {\n method: 'DELETE',\n headers: {\n 'Authorization': `Bearer ${this.config.jwt ?? this.config.apiKey}`,\n ...this.config.headers\n }\n })\n\n const success = response.ok\n return {\n hash,\n success,\n status: success ? 'pinned' : 'failed', // Status after unpin\n error: success ? undefined : `Unpin failed: ${response.status}`\n }\n }\n}\n\n/**\n * HTTP Client provider for generic IPFS nodes\n */\nclass HttpClientProvider implements IPFSProvider {\n constructor(private config: IPFSProviderConfig) {}\n\n async upload(content: string | Uint8Array, options?: IPFSUploadOptions): Promise<IPFSUploadResult> {\n const endpoint = this.config.endpoint ?? 'http://localhost:5001'\n const formData = new FormData()\n \n const blob = new Blob([content], { \n type: options?.contentType ?? 'application/octet-stream' \n })\n formData.append('file', blob, options?.filename ?? 'content')\n\n const response = await fetch(`${endpoint}/api/v0/add`, {\n method: 'POST',\n body: formData\n })\n\n if (!response.ok) {\n throw new Error(`IPFS HTTP upload failed: ${response.status}`)\n }\n\n const result: unknown = await response.json()\n const size = typeof content === 'string' ? new TextEncoder().encode(content).length : content.length\n\n // Validate IPFS HTTP API response format\n if (typeof result !== 'object' || result === null) {\n throw new Error('Invalid IPFS HTTP API response')\n }\n \n const ipfsResult = result as Record<string, unknown>\n if (typeof ipfsResult.Hash !== 'string') {\n throw new Error('IPFS HTTP API response missing Hash field')\n }\n\n const hash = ipfsResult.Hash as string\n return {\n hash,\n uri: `ipfs://${hash}`,\n size,\n timestamp: Date.now(),\n pinned: options?.pin !== false, // Default to pinned\n gateways: [\n `${endpoint}/ipfs/${hash}`,\n `https://ipfs.io/ipfs/${hash}`\n ]\n }\n }\n\n async retrieve(hash: string, options?: IPFSRetrievalOptions): Promise<string | Uint8Array> {\n const gateway = options?.gateway ?? this.config.endpoint?.replace('/api/v0', '') ?? 'https://ipfs.io'\n const url = `${gateway}/ipfs/${hash}`\n \n const response = await fetch(url, {\n signal: options?.timeout ? AbortSignal.timeout(options.timeout) : undefined\n })\n\n if (!response.ok) {\n throw new Error(`Failed to retrieve from IPFS: ${response.status}`)\n }\n\n const contentType = response.headers.get('content-type')\n if (contentType?.startsWith('text/') || contentType?.includes('json')) {\n return response.text()\n } else {\n return new Uint8Array(await response.arrayBuffer())\n }\n }\n\n async pin(hash: string): Promise<IPFSPinResult> {\n const endpoint = this.config.endpoint ?? 'http://localhost:5001'\n \n const response = await fetch(`${endpoint}/api/v0/pin/add?arg=${hash}`, {\n method: 'POST'\n })\n\n const success = response.ok\n return {\n hash,\n success,\n status: success ? 'pinned' : 'failed',\n error: success ? undefined : `Pin failed: ${response.status}`\n }\n }\n\n async unpin(hash: string): Promise<IPFSPinResult> {\n const endpoint = this.config.endpoint ?? 'http://localhost:5001'\n \n const response = await fetch(`${endpoint}/api/v0/pin/rm?arg=${hash}`, {\n method: 'POST'\n })\n\n const success = response.ok\n return {\n hash,\n success,\n status: success ? 'pinned' : 'failed',\n error: success ? undefined : `Unpin failed: ${response.status}`\n }\n }\n}\n\n/**\n * Main IPFS client with multiple provider support and fallback\n */\nexport class IPFSClient {\n private providers: IPFSProvider[] = []\n private cache = new Map<string, { content: string | Uint8Array; timestamp: number }>()\n\n constructor(private config: IPFSConfig) {\n this.initializeProviders()\n }\n\n private initializeProviders(): void {\n // Initialize primary provider\n this.providers.push(this.createProvider(this.config.provider))\n \n // Initialize fallback providers\n if (this.config.fallbackProviders) {\n for (const providerConfig of this.config.fallbackProviders) {\n this.providers.push(this.createProvider(providerConfig))\n }\n }\n }\n\n private createProvider(config: IPFSProviderConfig): IPFSProvider {\n switch (config.name) {\n case 'pinata':\n return new PinataProvider(config)\n case 'ipfs-http-client':\n case 'custom':\n return new HttpClientProvider(config)\n case 'test':\n return new TestIPFSProvider(config)\n default:\n throw new Error(`Unsupported IPFS provider: ${config.name}`)\n }\n }\n\n /**\n * Upload content to IPFS with automatic fallback\n */\n async upload(content: string | Uint8Array, options?: IPFSUploadOptions): Promise<IPFSOperationResult<IPFSUploadResult>> {\n const startTime = Date.now()\n let lastError: Error | undefined\n\n for (let i = 0; i < this.providers.length; i++) {\n const provider = this.providers[i]\n \n try {\n console.log(`๐Ÿ“ค Attempting IPFS upload with provider ${i + 1}/${this.providers.length}`)\n const result = await this.withRetry(\n () => provider.upload(content, options),\n this.config.maxRetries ?? 3,\n this.config.retryDelay ?? 1000\n )\n \n console.log(`โœ… IPFS upload successful: ${result.hash}`)\n return {\n success: true,\n data: result,\n duration: Date.now() - startTime,\n provider: this.config.provider.name\n }\n } catch (error) {\n console.warn(`โŒ Provider ${i + 1} upload failed:`, error instanceof Error ? error.message : String(error))\n lastError = error instanceof Error ? error : new Error(String(error))\n }\n }\n\n return {\n success: false,\n error: 'UPLOAD_FAILED',\n message: `All providers failed. Last error: ${lastError?.message}`,\n duration: Date.now() - startTime\n }\n }\n\n /**\n * Retrieve content from IPFS with caching and fallback\n */\n async retrieve(hash: string, options?: IPFSRetrievalOptions): Promise<IPFSOperationResult<IPFSRetrievalResult>> {\n const startTime = Date.now()\n \n // Check cache first\n if (this.config.enableCache && options?.cache !== false) {\n const cached = this.cache.get(hash)\n if (cached && (Date.now() - cached.timestamp) < (this.config.cacheTTL ?? 300000)) {\n return {\n success: true,\n data: {\n content: cached.content,\n size: typeof cached.content === 'string' ? cached.content.length : cached.content.length,\n hash,\n gateway: 'cache',\n fromCache: true\n },\n duration: Date.now() - startTime\n }\n }\n }\n\n let lastError: Error | undefined\n const gateways = options?.gateway ? [options.gateway] : (this.config.gateways ?? ['https://ipfs.io'])\n\n for (const gateway of gateways) {\n for (const provider of this.providers) {\n try {\n const content = await this.withRetry(\n () => provider.retrieve(hash, { ...options, gateway }),\n this.config.maxRetries ?? 3,\n this.config.retryDelay ?? 1000\n )\n\n // Cache the result\n if (this.config.enableCache) {\n this.cache.set(hash, { content, timestamp: Date.now() })\n }\n\n return {\n success: true,\n data: {\n content,\n size: typeof content === 'string' ? content.length : content.length,\n hash,\n gateway,\n fromCache: false\n },\n duration: Date.now() - startTime\n }\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error))\n }\n }\n }\n\n return {\n success: false,\n error: 'RETRIEVAL_FAILED',\n message: `Failed to retrieve from all gateways. Last error: ${lastError?.message}`,\n duration: Date.now() - startTime\n }\n }\n\n /**\n * Pin content on IPFS\n */\n async pin(hash: string): Promise<IPFSOperationResult<IPFSPinResult>> {\n const startTime = Date.now()\n \n for (const provider of this.providers) {\n try {\n const result = await provider.pin(hash)\n return {\n success: result.success,\n data: result,\n duration: Date.now() - startTime\n }\n } catch (error) {\n console.warn('Pin attempt failed:', error)\n }\n }\n\n return {\n success: false,\n error: 'PIN_FAILED',\n message: 'All pin attempts failed',\n duration: Date.now() - startTime\n }\n }\n\n /**\n * Store content with automatic IPFS decision based on size\n */\n async storeContent(\n content: string, \n type: IPFSContentMetadata['type'],\n options?: IPFSUploadOptions & { forceIpfs?: boolean }\n ): Promise<ContentStorageResult> {\n const contentSize = new TextEncoder().encode(content).length\n const sizeThreshold = this.config.sizeThreshold ?? 800 // Default 800 bytes to stay under transaction limits\n \n const shouldUseIpfs = options?.forceIpfs ?? contentSize > sizeThreshold\n\n if (!shouldUseIpfs) {\n // Store inline as data URI\n const dataUri = `data:application/json;base64,${btoa(content)}`\n return {\n uri: dataUri,\n useIpfs: false,\n size: contentSize\n }\n }\n\n // Store on IPFS\n const uploadResult = await this.upload(content, options)\n \n if (!uploadResult.success || !uploadResult.data) {\n throw new Error(`IPFS upload failed: ${uploadResult.message}`)\n }\n\n const ipfsMetadata: IPFSContentMetadata = {\n type,\n originalSize: contentSize,\n ipfsHash: uploadResult.data.hash,\n encoding: 'utf8',\n compression: 'none',\n mimeType: 'application/json',\n uploadedAt: uploadResult.data.timestamp,\n pinned: uploadResult.data.pinned,\n checksum: await this.calculateChecksum(content)\n }\n\n return {\n uri: uploadResult.data.uri,\n useIpfs: true,\n ipfsMetadata,\n size: contentSize\n }\n }\n\n /**\n * Retrieve content that may be stored inline or on IPFS\n */\n async retrieveContent(uri: string): Promise<string> {\n if (uri.startsWith('data:')) {\n // Inline data URI\n const base64Data = uri.split(',')[1]\n if (!base64Data) {\n throw new Error('Invalid data URI format')\n }\n return atob(base64Data)\n }\n \n if (uri.startsWith('ipfs://')) {\n // IPFS URI\n const hash = uri.replace('ipfs://', '')\n const result = await this.retrieve(hash)\n \n if (!result.success || !result.data) {\n throw new Error(`Failed to retrieve IPFS content: ${result.message}`)\n }\n \n return typeof result.data.content === 'string' \n ? result.data.content \n : new TextDecoder().decode(result.data.content)\n }\n \n throw new Error(`Unsupported URI format: ${uri}`)\n }\n\n /**\n * Retry wrapper for operations\n */\n private async withRetry<T>(\n operation: () => Promise<T>,\n maxRetries: number,\n delay: number\n ): Promise<T> {\n let lastError: Error\n \n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n return await operation()\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error))\n \n if (attempt < maxRetries) {\n console.log(`โณ Retrying in ${delay}ms... (attempt ${attempt + 1}/${maxRetries})`)\n await new Promise(resolve => setTimeout(resolve, delay))\n }\n }\n }\n \n throw lastError!\n }\n\n /**\n * Calculate checksum for content integrity\n */\n private async calculateChecksum(content: string): Promise<string> {\n const encoder = new TextEncoder()\n const data = encoder.encode(content)\n const hashBuffer = await crypto.subtle.digest('SHA-256', data)\n const hashArray = Array.from(new Uint8Array(hashBuffer))\n return hashArray.map(b => b.toString(16).padStart(2, '0')).join('')\n }\n\n /**\n * Clear cache\n */\n clearCache(): void {\n this.cache.clear()\n }\n\n /**\n * Get cache stats\n */\n getCacheStats(): { size: number; keys: string[] } {\n return {\n size: this.cache.size,\n keys: Array.from(this.cache.keys())\n }\n }\n}","/**\n * Test IPFS provider for beta testing without external dependencies\n */\n\nimport './text-encoder-polyfill.js'\nimport type {\n IPFSProviderConfig,\n IPFSUploadOptions,\n IPFSUploadResult,\n IPFSRetrievalOptions,\n IPFSPinResult\n} from '../types/ipfs-types.js'\n\ninterface IPFSProvider {\n upload(content: string | Uint8Array, options?: IPFSUploadOptions): Promise<IPFSUploadResult>\n retrieve(hash: string, options?: IPFSRetrievalOptions): Promise<string | Uint8Array>\n pin(hash: string): Promise<IPFSPinResult>\n unpin(hash: string): Promise<IPFSPinResult>\n}\n\n// Shared storage for all test IPFS provider instances\nconst sharedTestStorage = new Map<string, { content: string | Uint8Array; pinned: boolean }>()\nlet sharedUploadCount = 0\n\n/**\n * In-memory test IPFS provider for development and testing\n * This provider simulates IPFS behavior without requiring external services\n */\nexport class TestIPFSProvider implements IPFSProvider {\n // Use shared storage across all instances\n private storage = sharedTestStorage\n private uploadCount = 0\n\n constructor(private config: IPFSProviderConfig) {\n console.log('๐Ÿงช Initialized TestIPFSProvider for local testing (shared storage)')\n }\n\n async upload(content: string | Uint8Array, options?: IPFSUploadOptions): Promise<IPFSUploadResult> {\n // Generate a fake but deterministic IPFS hash\n sharedUploadCount++\n const contentStr = typeof content === 'string' ? content : new TextDecoder().decode(content)\n const hash = `Qm${this.generateHash(contentStr)}_test_${sharedUploadCount}`\n \n // Store the content\n this.storage.set(hash, {\n content,\n pinned: options?.pin !== false\n })\n\n const size = typeof content === 'string' ? new TextEncoder().encode(content).length : content.length\n\n console.log(`๐Ÿ“ฆ Test IPFS upload: ${hash} (${size} bytes)`)\n\n return {\n hash,\n uri: `ipfs://${hash}`,\n size,\n timestamp: Date.now(),\n pinned: options?.pin !== false,\n gateways: [\n `http://localhost:8080/ipfs/${hash}`,\n `https://test.ipfs.io/ipfs/${hash}`\n ]\n }\n }\n\n async retrieve(hash: string): Promise<string | Uint8Array> {\n const stored = this.storage.get(hash)\n \n if (!stored) {\n throw new Error(`Test IPFS: Content not found for hash ${hash}`)\n }\n\n console.log(`๐Ÿ“ฅ Test IPFS retrieve: ${hash}`)\n \n // Simulate network delay\n await new Promise(resolve => setTimeout(resolve, 100))\n \n return stored.content\n }\n\n async pin(hash: string): Promise<IPFSPinResult> {\n const stored = this.storage.get(hash)\n \n if (!stored) {\n return {\n hash,\n success: false,\n status: 'failed',\n error: `Content not found: ${hash}`\n }\n }\n\n stored.pinned = true\n console.log(`๐Ÿ“Œ Test IPFS pin: ${hash}`)\n\n return {\n hash,\n success: true,\n status: 'pinned'\n }\n }\n\n async unpin(hash: string): Promise<IPFSPinResult> {\n const stored = this.storage.get(hash)\n \n if (!stored) {\n return {\n hash,\n success: false,\n status: 'failed',\n error: `Content not found: ${hash}`\n }\n }\n\n stored.pinned = false\n console.log(`๐Ÿ“Œ Test IPFS unpin: ${hash}`)\n\n return {\n hash,\n success: true,\n status: 'pinned' // Status after operation\n }\n }\n\n /**\n * Generate a fake but consistent hash for testing\n */\n private generateHash(content: string): string {\n let hash = 0\n for (let i = 0; i < content.length; i++) {\n const char = content.charCodeAt(i)\n hash = ((hash << 5) - hash) + char\n hash = hash & hash // Convert to 32-bit integer\n }\n \n // Convert to base58-like string (simplified for testing)\n const chars = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'\n let result = ''\n let value = Math.abs(hash)\n \n while (value > 0 && result.length < 40) {\n result = chars[value % chars.length] + result\n value = Math.floor(value / chars.length)\n }\n \n // Pad to make it look like a real IPFS hash\n while (result.length < 40) {\n result = chars[Math.floor(Math.random() * chars.length)] + result\n }\n \n return result\n }\n\n /**\n * Get storage statistics for testing\n */\n getStats(): { count: number; totalSize: number; pinned: number } {\n let totalSize = 0\n let pinned = 0\n \n for (const data of this.storage.values()) {\n const size = typeof data.content === 'string' \n ? new TextEncoder().encode(data.content).length \n : data.content.length\n totalSize += size\n if (data.pinned) pinned++\n }\n \n return {\n count: this.storage.size,\n totalSize,\n pinned\n }\n }\n\n /**\n * Clear all stored content (for testing)\n */\n clear(): void {\n this.storage.clear()\n sharedUploadCount = 0\n console.log('๐Ÿงน Test IPFS storage cleared')\n }\n \n /**\n * Get the shared storage (for debugging)\n */\n static getSharedStorage(): Map<string, { content: string | Uint8Array; pinned: boolean }> {\n return sharedTestStorage\n }\n}"]}
@@ -1,2 +0,0 @@
1
- import {b,a}from'./chunk-C2OTQ5YS.js';import {ed25519}from'@noble/curves/ed25519';import {sha256}from'@noble/hashes/sha256';import {bytesToNumberLE,randomBytes,bytesToHex}from'@noble/curves/abstract/utils';import'@solana/addresses';import {getStructEncoder,getU8Encoder,fixEncoderSize,getBytesEncoder}from'@solana/kit';import'bs58';import {PublicKey}from'@solana/web3.js';function D(t,e){let o=Q(e),n=[{address:t.proofContext,role:2}];return t.systemProgram&&n.push({address:t.systemProgram,role:0}),{programAddress:a,accounts:n,data:o}}function X(t,e,o){let r=getStructEncoder([["instruction",getU8Encoder()],["commitment",fixEncoderSize(getBytesEncoder(),b.COMMITMENT)],["proof",getBytesEncoder()]]).encode({instruction:2,commitment:e,proof:o}),a$1=[{address:t.proofContext,role:2}];return {programAddress:a,accounts:a$1,data:r}}function H(t,e,o){let r=getStructEncoder([["instruction",getU8Encoder()],["ciphertext",fixEncoderSize(getBytesEncoder(),b.CIPHERTEXT)],["proof",fixEncoderSize(getBytesEncoder(),b.VALIDITY_PROOF)]]).encode({instruction:3,ciphertext:e,proof:o}),a$1=[{address:t.proofContext,role:2}];return {programAddress:a,accounts:a$1,data:r}}function Q(t){let e=getStructEncoder([["instruction",getU8Encoder()],["encryptedTransferAmount",fixEncoderSize(getBytesEncoder(),b.CIPHERTEXT)],["newSourceCommitment",fixEncoderSize(getBytesEncoder(),b.COMMITMENT)],["equalityProof",fixEncoderSize(getBytesEncoder(),b.EQUALITY_PROOF)],["validityProof",fixEncoderSize(getBytesEncoder(),b.VALIDITY_PROOF)],["rangeProof",getBytesEncoder()]]);return new Uint8Array(e.encode({instruction:0,...t}))}var K={ZK_ELGAMAL_PROOF_REENABLED:new PublicKey("zkemPXcuM3G4wpMDZ36Cpw34EjUpvm1nuioiSGbGZPR"),CONFIDENTIAL_TRANSFERS:new PublicKey("11111111111111111111111111111111"),TOKEN_2022:new PublicKey("TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb")},$=300*1e3,j=100,Z=class{cache={};cacheOrder=[];get(e){let o=this.cache[e];return Date.now()-o.lastChecked>$?(this.remove(e),null):o}set(e,o){if(this.remove(e),this.cache[e]=o,this.cacheOrder.push(e),this.cacheOrder.length>j){let n=this.cacheOrder.shift();n&&delete this.cache[n];}}remove(e){delete this.cache[e],this.cacheOrder=this.cacheOrder.filter(o=>o!==e);}clear(){this.cache={},this.cacheOrder=[];}},L=new Z;async function Y(t,e){let o=e.toBase58(),n=L.get(o);if(n)return n;try{let r=await t.getAccountInfo(e),i={activated:r!==null,lastChecked:Date.now()};if(r)try{let d=BigInt(r.data.readBigUInt64LE(0));i.activationSlot=d;}catch{}return L.set(o,i),i}catch(r){let a={activated:false,lastChecked:Date.now(),error:r instanceof Error?r.message:"Unknown error"};return L.set(o,a),a}}async function W(t){return (await Y(t,K.ZK_ELGAMAL_PROOF_REENABLED)).activated}async function J(t){return Y(t,K.ZK_ELGAMAL_PROOF_REENABLED)}function gt(){L.clear();}async function q(t){let e=await J(t);return e.error?`ZK ElGamal Proof Program status unknown: ${e.error}`:e.activated?`ZK ElGamal Proof Program is ENABLED${e.activationSlot?` (activated at slot ${e.activationSlot})`:""}`:"ZK ElGamal Proof Program is DISABLED pending security audit completion"}var y=ed25519.ExtendedPoint.BASE,tt=sha256(y.toRawBytes()),et=bytesToNumberLE(tt)%ed25519.CURVE.n,w=y.multiply(et),p=null,z=6e4,rt=(r=>(r.ZK_PROGRAM_ONLY="zk_program_only",r.ZK_PROGRAM_WITH_FALLBACK="zk_program_with_fallback",r.LOCAL_ONLY="local_only",r.AUTO_DETECT="auto_detect",r))(rt||{});async function ot(t,e,o={}){let n=o.mode??"auto_detect",r=o.connection;if(t<0n||t>=1n<<64n)throw new Error("Amount must be in range [0, 2^64)");let a$1=bytesToNumberLE(e)%ed25519.CURVE.n;if(a$1===0n)throw new Error("Invalid randomness: gamma cannot be zero");let i=y.multiply(t).add(w.multiply(a$1)),d=i.toRawBytes(),u=nt(t,a$1,i),f,l=false;return n!=="local_only"&&(l=await M(r),(l||n==="zk_program_only")&&(f=X({proofContext:a},d,u))),{proof:u,commitment:d,instruction:f,requiresZkProgram:n==="zk_program_only"&&!l}}function nt(t,e,o){let n=new Uint8Array(b.RANGE_PROOF_BULLETPROOF),r=0,a=t%256n||1n,i=e%256n||1n,d=y.multiply(a).add(w.multiply(i));n.set(d.toRawBytes(),r),r+=32;let u=(t>>8n)%256n||1n,f=(e>>8n)%256n||1n,l=y.multiply(u).add(w.multiply(f));n.set(l.toRawBytes(),r),r+=32;let T=(t>>16n)%256n||1n,_=(e>>16n)%256n||1n,h=y.multiply(T).add(w.multiply(_));n.set(h.toRawBytes(),r),r+=32;let m=(t>>24n)%256n||1n,E=(e>>24n)%256n||1n,O=y.multiply(m).add(w.multiply(E));n.set(O.toRawBytes(),r),r+=32;let P=bytesToNumberLE(sha256(o.toRawBytes()))%ed25519.CURVE.n,x=e*P%ed25519.CURVE.n,V=t*P%ed25519.CURVE.n,S=(t+e*P)%ed25519.CURVE.n;n.set(U(x),r),r+=32,n.set(U(V),r),r+=32,n.set(U(S),r),r+=32;let F=b.RANGE_PROOF_BULLETPROOF-r,B=randomBytes(F);return n.set(B,r),n}function Ut(t,e){try{if(t.length!==b.RANGE_PROOF_BULLETPROOF)return {valid:!1,error:"Invalid proof size",usedFallback:!0};let o=ed25519.ExtendedPoint.fromHex(bytesToHex(e)),n=t.slice(0,32),r=t.slice(32,64),a=t.slice(64,96),i=t.slice(96,128);try{ed25519.ExtendedPoint.fromHex(bytesToHex(n)),ed25519.ExtendedPoint.fromHex(bytesToHex(r)),ed25519.ExtendedPoint.fromHex(bytesToHex(a)),ed25519.ExtendedPoint.fromHex(bytesToHex(i));}catch{return {valid:!1,error:"Invalid proof points",usedFallback:!0}}return {valid:!0,usedFallback:!0}}catch(o){return {valid:false,error:o instanceof Error?o.message:"Unknown error",usedFallback:true}}}async function at(t,e,o,n,r={}){let a$1=r.mode??"auto_detect",i=r.connection,d=bytesToNumberLE(n)%ed25519.CURVE.n,u=ed25519.ExtendedPoint.fromHex(bytesToHex(e)),f=bytesToNumberLE(randomBytes(32))%ed25519.CURVE.n,l=y.multiply(f).add(u.multiply(f)),T=bytesToNumberLE(sha256(new Uint8Array([...t.commitment.commitment,...t.handle.handle,...l.toRawBytes()])))%ed25519.CURVE.n,_=(f+T*o)%ed25519.CURVE.n,h=(f+T*d)%ed25519.CURVE.n,m=new Uint8Array(b.VALIDITY_PROOF),E=0;m.set(l.toRawBytes(),E),E+=32,m.set(U(_),E),E+=32,m.set(U(h),E);let O,P=false;return a$1!=="local_only"&&(P=await M(i),(P||a$1==="zk_program_only")&&(O=H({proofContext:a},new Uint8Array([...t.commitment.commitment,...t.handle.handle]),m))),{proof:m,instruction:O,requiresZkProgram:a$1==="zk_program_only"&&!P}}async function Mt(t,e,o,n,r,a$1={}){let i=a$1.mode??"auto_detect",d=a$1.connection,u=randomBytes(32);u[0]&=248,u[31]&=127,u[31]|=64;let f=bytesToNumberLE(u)%ed25519.CURVE.n,l=ed25519.ExtendedPoint.fromHex(bytesToHex(n)),T=y.multiply(e).add(l.multiply(f)),_=y.multiply(f),h={commitment:{commitment:T.toRawBytes()},handle:{handle:_.toRawBytes()}},m=t,E=await ot(e,u,{mode:"local_only"}),O=await at(h,n,e,u,{mode:"local_only"}),P=new Uint8Array(b.EQUALITY_PROOF);randomBytes(32).forEach((F,B)=>P[B]=F);let x={encryptedTransferAmount:new Uint8Array([...h.commitment.commitment,...h.handle.handle]),newSourceCommitment:m.commitment.commitment,equalityProof:P,validityProof:O.proof,rangeProof:E.proof},V,S=false;return i!=="local_only"&&(S=await M(d),(S||i==="zk_program_only")&&(V=D({proofContext:a},x))),{transferProof:x,newSourceBalance:m,destCiphertext:h,instruction:V,requiresZkProgram:i==="zk_program_only"&&!S}}function U(t){let e=new Uint8Array(32);for(let o=0;o<32;o++)e[o]=Number(t>>BigInt(o*8)&0xffn);return e}async function M(t){if(!t)return false;if(p&&Date.now()-p.lastChecked<z)return p.enabled;try{let e=await W(t),o=await q(t);return p={enabled:e,lastChecked:Date.now(),message:o},e}catch(e){return console.warn("Failed to check ZK program status:",e),p={enabled:false,lastChecked:Date.now(),message:`ZK program status check failed: ${e instanceof Error?e.message:"Unknown error"}`},false}}async function Vt(t){return t?M(t):false}async function Ft(t){return t?p&&Date.now()-p.lastChecked<z?p.message:(await M(t),p?.message??"ZK program status unknown"):"No connection - ZK program status unknown"}function Lt(){return a}function bt(){p=null;}export{K as a,Y as b,W as c,gt as d,rt as e,ot as f,Ut as g,at as h,Mt as i,Vt as j,Ft as k,Lt as l,bt as m};//# sourceMappingURL=chunk-PPOCDM6G.js.map
2
- //# sourceMappingURL=chunk-PPOCDM6G.js.map