@paul.lumberwork/bonding-curve-sdk 1.7.1 → 1.7.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/sdk/index.ts"],"names":["PublicKey","LAMPORTS_PER_SOL","getAssociatedTokenAddressSync","SystemProgram","Keypair","TOKEN_PROGRAM_ID","ASSOCIATED_TOKEN_PROGRAM_ID","SYSVAR_RENT_PUBKEY","getAccount","BN","ComputeBudgetProgram","createAssociatedTokenAccountIdempotentInstruction","nacl","Ed25519Program","SYSVAR_INSTRUCTIONS_PUBKEY","Transaction"],"mappings":"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","file":"index.js","sourcesContent":["import * as anchor from \"@coral-xyz/anchor\";\nimport { Program, BN } from \"@coral-xyz/anchor\";\nimport { KickFunProgram } from \"../types/kick_fun_program\";\nimport {\n Keypair,\n SystemProgram,\n PublicKey,\n LAMPORTS_PER_SOL,\n ComputeBudgetProgram,\n Connection,\n TransactionInstruction,\n Transaction,\n SYSVAR_RENT_PUBKEY,\n SYSVAR_INSTRUCTIONS_PUBKEY,\n Ed25519Program,\n} from \"@solana/web3.js\";\nimport {\n TOKEN_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n getAssociatedTokenAddressSync,\n getAccount,\n createAssociatedTokenAccountIdempotentInstruction,\n} from \"@solana/spl-token\";\nimport nacl from \"tweetnacl\";\n\n// ═══════════════════════════════════════════════════════════════════════════\n// Constants\n// ═══════════════════════════════════════════════════════════════════════════\n\nexport const PROGRAM_ID = new PublicKey(\"6o7oTqg2CfvcMCJTLNEJsef7c875zGpTvcnFctNAjudL\");\nexport const ADMIN_WALLET = new PublicKey(\"7eGpbyRpcM7WpNKQtd6XkteNQWHbWXP7icZjKzNK2aTk\");\nexport const METADATA_PROGRAM_ID = new PublicKey(\"metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s\");\nexport const STREAMER_PROGRAM_ID = new PublicKey(\"BZHZ5pSZLi4zRBrCmG1VD65fqKnrPYC2bBb2HQ4VKiJ1\");\nexport const K_SCALE = 10_000_000_000_000_000_000_000n; // 10^22\nexport const LAMPORTS = LAMPORTS_PER_SOL;\nexport const TOKEN_DECIMALS = 6;\nexport const FEE_BPS = 100; // 1% total fee (0.5% admin immediate + 0.5% accumulated)\nexport const CURVE_PERCENT = 70; // 70% for bonding curve\nexport const LP_PERCENT = 20; // 20% for LP\nexport const TREASURY_PERCENT = 10; // 10% for treasury\n\n// ═══════════════════════════════════════════════════════════════════════════\n// Types\n// ═══════════════════════════════════════════════════════════════════════════\n\nexport interface TokenLaunchConfig {\n name: string;\n symbol: string;\n uri: string;\n creatorWallet?: PublicKey; // Optional: custom creator wallet, defaults to SDK wallet\n}\n\nexport interface BondingCurveState {\n tokenLaunch: PublicKey;\n k: bigint;\n totalSupply: bigint;\n soldSupply: bigint;\n realSolReserves: bigint;\n tokenReservesForLp: bigint;\n tokenReservesForTreasury: bigint;\n tokensForCurve: bigint;\n accumulatedFees: bigint;\n complete: boolean;\n bump: number;\n}\n\nexport interface TokenLaunchState {\n creator: PublicKey;\n mint: PublicKey;\n vault: PublicKey;\n bondingCurve: PublicKey;\n totalSupply: bigint;\n curveAllocation: bigint;\n lpAllocation: bigint;\n treasuryAllocation: bigint;\n totalSolRaised: bigint;\n tradingActive: boolean;\n migrated: boolean;\n initialK: bigint;\n name: string;\n symbol: string;\n}\n\nexport interface LaunchAddresses {\n mint: PublicKey;\n tokenLaunch: PublicKey;\n bondingCurve: PublicKey;\n vault: PublicKey;\n curveTokenAccount: PublicKey;\n metadata: PublicKey; // Metaplex metadata PDA\n}\n\nexport interface TradeResult {\n txSignature: string;\n tokensTraded: bigint;\n solTraded: bigint;\n newProgress: number;\n isCurveComplete: boolean;\n}\n\nexport interface EstimateBuyResult {\n solIn: bigint; // Total SOL user pays (including fee)\n solAfterFee: bigint; // SOL that goes into the curve (after fee)\n tokensOut: bigint; // Tokens user receives\n fee: bigint; // Fee in SOL (lamports)\n pricePerToken: bigint;\n priceImpactBps: number;\n}\n\nexport interface EstimateSellResult {\n tokensIn: bigint; // Tokens user sells\n solBeforeFee: bigint; // Gross SOL from curve (before fee)\n solOut: bigint; // Net SOL user receives (after fee)\n fee: bigint; // Fee in SOL (lamports)\n pricePerToken: bigint;\n priceImpactBps: number;\n}\n\n// ═══════════════════════════════════════════════════════════════════════════\n// Event Types\n// ═══════════════════════════════════════════════════════════════════════════\n\nexport interface LaunchCreatedEvent {\n tokenLaunch: PublicKey;\n mint: PublicKey;\n creator: PublicKey;\n name: string;\n symbol: string;\n totalSupply: bigint;\n curveAllocation: bigint;\n lpAllocation: bigint;\n treasuryAllocation: bigint;\n initialK: bigint;\n initialPrice: bigint;\n timestamp: bigint;\n}\n\nexport interface TokensPurchasedEvent {\n tokenLaunch: PublicKey;\n mint: PublicKey;\n buyer: PublicKey;\n solAmount: bigint;\n solAfterFees: bigint;\n tokensReceived: bigint;\n curveFee: bigint;\n adminFee: bigint;\n priceAfter: bigint;\n totalSold: bigint;\n progress: number;\n timestamp: bigint;\n isCurveComplete: boolean;\n}\n\nexport interface TokensSoldEvent {\n tokenLaunch: PublicKey;\n mint: PublicKey;\n seller: PublicKey;\n tokensSold: bigint;\n grossSolRefund: bigint;\n netSolRefund: bigint;\n curveFee: bigint;\n adminFee: bigint;\n priceAfter: bigint;\n totalSold: bigint;\n progress: number;\n timestamp: bigint;\n}\n\nexport interface CurveCompleteEvent {\n tokenLaunch: PublicKey;\n mint: PublicKey;\n totalSolRaised: bigint;\n finalPrice: bigint;\n timestamp: bigint;\n}\n\nexport interface AdminWithdrawEvent {\n tokenLaunch: PublicKey;\n mint: PublicKey;\n admin: PublicKey;\n creator: PublicKey;\n treasury: PublicKey;\n solWithdrawn: bigint;\n tokensWithdrawn: bigint;\n feesToTreasury: bigint;\n treasuryTokens: bigint;\n timestamp: bigint;\n}\n\nexport type KickFunEvent =\n | { name: \"LaunchCreated\"; data: LaunchCreatedEvent }\n | { name: \"TokensPurchased\"; data: TokensPurchasedEvent }\n | { name: \"TokensSold\"; data: TokensSoldEvent }\n | { name: \"CurveComplete\"; data: CurveCompleteEvent }\n | { name: \"AdminWithdraw\"; data: AdminWithdrawEvent };\n\nexport type EventCallback<T> = (event: T, slot: number, signature: string) => void;\n\n// ═══════════════════════════════════════════════════════════════════════════\n// KickFunSDK Class\n// ═══════════════════════════════════════════════════════════════════════════\n\nexport class KickFunSDK {\n public program: Program<KickFunProgram>;\n public connection: Connection;\n public wallet: anchor.Wallet;\n public launchpadPda: PublicKey;\n\n constructor(\n program: Program<KickFunProgram>,\n wallet: anchor.Wallet\n ) {\n this.program = program;\n this.connection = program.provider.connection;\n this.wallet = wallet;\n\n [this.launchpadPda] = PublicKey.findProgramAddressSync(\n [Buffer.from(\"launchpad\")],\n program.programId\n );\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // PDA Derivation Helpers\n // ═══════════════════════════════════════════════════════════════════════════\n\n deriveAddresses(mint: PublicKey): LaunchAddresses {\n const [tokenLaunch] = PublicKey.findProgramAddressSync(\n [Buffer.from(\"token_launch\"), mint.toBuffer()],\n this.program.programId\n );\n const [bondingCurve] = PublicKey.findProgramAddressSync(\n [Buffer.from(\"bonding_curve\"), tokenLaunch.toBuffer()],\n this.program.programId\n );\n const [vault] = PublicKey.findProgramAddressSync(\n [Buffer.from(\"vault\"), tokenLaunch.toBuffer()],\n this.program.programId\n );\n const curveTokenAccount = getAssociatedTokenAddressSync(mint, bondingCurve, true);\n\n // Metaplex metadata PDA\n const [metadata] = PublicKey.findProgramAddressSync(\n [Buffer.from(\"metadata\"), METADATA_PROGRAM_ID.toBuffer(), mint.toBuffer()],\n METADATA_PROGRAM_ID\n );\n\n return { mint, tokenLaunch, bondingCurve, vault, curveTokenAccount, metadata };\n }\n\n deriveUserPosition(tokenLaunch: PublicKey, user: PublicKey): PublicKey {\n const [userPosition] = PublicKey.findProgramAddressSync(\n [Buffer.from(\"user_position\"), tokenLaunch.toBuffer(), user.toBuffer()],\n this.program.programId\n );\n return userPosition;\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // Initialize Launchpad (one-time setup)\n // ═══════════════════════════════════════════════════════════════════════════\n\n async initializeLaunchpad(platformFeeBps: number = 200): Promise<string> {\n try {\n await this.program.account.launchpad.fetch(this.launchpadPda);\n return \"already_initialized\";\n } catch {\n const tx = await this.program.methods\n .initializeLaunchpad(platformFeeBps)\n .accountsPartial({\n authority: this.wallet.publicKey,\n launchpad: this.launchpadPda,\n treasury: this.wallet.publicKey,\n systemProgram: SystemProgram.programId,\n })\n .rpc();\n return tx;\n }\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // Create Token Launch\n // ═══════════════════════════════════════════════════════════════════════════\n\n async createTokenLaunch(config: TokenLaunchConfig): Promise<{\n txSignature: string;\n addresses: LaunchAddresses;\n mintKeypair: Keypair;\n }> {\n const mintKeypair = Keypair.generate();\n const addresses = this.deriveAddresses(mintKeypair.publicKey);\n\n // Use custom creator wallet or default to SDK wallet\n const creatorWallet = config.creatorWallet || this.wallet.publicKey;\n\n const tx = await this.program.methods\n .createTokenLaunch(config.name, config.symbol, config.uri)\n .accountsPartial({\n creator: creatorWallet,\n launchpad: this.launchpadPda,\n mint: mintKeypair.publicKey,\n tokenLaunch: addresses.tokenLaunch,\n bondingCurve: addresses.bondingCurve,\n vault: addresses.vault,\n curveTokenAccount: addresses.curveTokenAccount,\n metadata: addresses.metadata,\n tokenProgram: TOKEN_PROGRAM_ID,\n associatedTokenProgram: ASSOCIATED_TOKEN_PROGRAM_ID,\n metadataProgram: METADATA_PROGRAM_ID,\n systemProgram: SystemProgram.programId,\n rent: SYSVAR_RENT_PUBKEY,\n })\n .signers([mintKeypair])\n .transaction();\n\n const { blockhash } = await this.connection.getLatestBlockhash();\n tx.recentBlockhash = blockhash;\n tx.feePayer = this.wallet.publicKey;\n tx.partialSign(mintKeypair);\n const signedTx = await this.wallet.signTransaction(tx);\n const txSignature = await this.connection.sendRawTransaction(signedTx.serialize(), {\n skipPreflight: true,\n });\n\n await this.connection.confirmTransaction({\n signature: txSignature,\n ...(await this.connection.getLatestBlockhash()),\n });\n \n return { txSignature, addresses, mintKeypair };\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // Buy Tokens\n // ═══════════════════════════════════════════════════════════════════════════\n\n async buy(\n mint: PublicKey,\n solAmount: number, // In SOL (e.g., 1.5 for 1.5 SOL)\n options?: { computeUnits?: number }\n ): Promise<TradeResult> {\n const addresses = this.deriveAddresses(mint);\n const userTokenAccount = getAssociatedTokenAddressSync(mint, this.wallet.publicKey);\n const userPosition = this.deriveUserPosition(addresses.tokenLaunch, this.wallet.publicKey);\n\n // Get token balance before\n let tokensBefore = 0n;\n try {\n const account = await getAccount(this.connection, userTokenAccount);\n tokensBefore = account.amount;\n } catch {\n // Account doesn't exist yet\n }\n\n const solLamports = new BN(Math.floor(solAmount * LAMPORTS_PER_SOL));\n\n // Always derive auto-withdraw accounts so they're available when curve completes\n // These are optional accounts - the program only uses them when curve hits 100%\n const [streamerVaultPda] = PublicKey.findProgramAddressSync(\n [Buffer.from(\"vault\")],\n STREAMER_PROGRAM_ID\n );\n const streamerVault = streamerVaultPda;\n const streamerTokenAccount = getAssociatedTokenAddressSync(mint, streamerVaultPda, true);\n const adminTokenAccount = getAssociatedTokenAddressSync(mint, ADMIN_WALLET, true);\n\n const preInstructions: TransactionInstruction[] = [];\n const computeUnits = options?.computeUnits || 400_000;\n preInstructions.push(\n ComputeBudgetProgram.setComputeUnitLimit({ units: computeUnits })\n );\n\n // Pre-create ATAs for auto-withdraw (idempotent — no-op if already exists)\n preInstructions.push(\n createAssociatedTokenAccountIdempotentInstruction(\n this.wallet.publicKey, streamerTokenAccount, streamerVaultPda, mint\n )\n );\n preInstructions.push(\n createAssociatedTokenAccountIdempotentInstruction(\n this.wallet.publicKey, adminTokenAccount, ADMIN_WALLET, mint\n )\n );\n\n const tx = await this.program.methods\n .buyTokens(solLamports)\n .accountsPartial({\n contributor: this.wallet.publicKey,\n launchpad: this.launchpadPda,\n adminWallet: ADMIN_WALLET,\n tokenLaunch: addresses.tokenLaunch,\n bondingCurve: addresses.bondingCurve,\n mint: mint,\n vault: addresses.vault,\n curveTokenAccount: addresses.curveTokenAccount,\n userTokenAccount: userTokenAccount,\n userPosition: userPosition,\n systemProgram: SystemProgram.programId,\n tokenProgram: TOKEN_PROGRAM_ID,\n associatedTokenProgram: ASSOCIATED_TOKEN_PROGRAM_ID,\n streamerVault: streamerVault,\n streamerTokenAccount: streamerTokenAccount,\n adminTokenAccount: adminTokenAccount,\n })\n .preInstructions(preInstructions)\n .rpc();\n\n // Get state after\n const curveAfter = await this.program.account.bondingCurve.fetch(addresses.bondingCurve);\n const tokensAfter = (await getAccount(this.connection, userTokenAccount)).amount;\n\n const tokensReceived = tokensAfter - tokensBefore;\n const progress = Number(curveAfter.soldSupply.toString()) / Number(curveAfter.tokensForCurve.toString()) * 100;\n\n return {\n txSignature: tx,\n tokensTraded: tokensReceived,\n solTraded: BigInt(solLamports.toString()),\n newProgress: progress,\n isCurveComplete: curveAfter.complete,\n };\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // Sell Tokens\n // ═══════════════════════════════════════════════════════════════════════════\n\n async sell(\n mint: PublicKey,\n tokenAmount: number, // In tokens (e.g., 1000000 for 1M tokens)\n minSolOut: number = 0, // Minimum SOL to receive (slippage protection)\n options?: { computeUnits?: number }\n ): Promise<TradeResult> {\n const addresses = this.deriveAddresses(mint);\n const userTokenAccount = getAssociatedTokenAddressSync(mint, this.wallet.publicKey);\n const userPosition = this.deriveUserPosition(addresses.tokenLaunch, this.wallet.publicKey);\n\n // Get state before\n const curveBefore = await this.program.account.bondingCurve.fetch(addresses.bondingCurve);\n const walletBefore = await this.connection.getBalance(this.wallet.publicKey);\n\n const tokensRaw = new BN(tokenAmount).mul(new BN(10 ** TOKEN_DECIMALS));\n const minSolLamports = new BN(Math.floor(minSolOut * LAMPORTS_PER_SOL));\n\n const preInstructions: TransactionInstruction[] = [];\n if (options?.computeUnits) {\n preInstructions.push(\n ComputeBudgetProgram.setComputeUnitLimit({ units: options.computeUnits })\n );\n }\n\n const tx = await this.program.methods\n .sellTokens(tokensRaw, minSolLamports)\n .accountsPartial({\n contributor: this.wallet.publicKey,\n launchpad: this.launchpadPda,\n adminWallet: ADMIN_WALLET,\n tokenLaunch: addresses.tokenLaunch,\n bondingCurve: addresses.bondingCurve,\n mint: mint,\n vault: addresses.vault,\n curveTokenAccount: addresses.curveTokenAccount,\n userTokenAccount: userTokenAccount,\n userPosition: userPosition,\n systemProgram: SystemProgram.programId,\n tokenProgram: TOKEN_PROGRAM_ID,\n })\n .preInstructions(preInstructions)\n .rpc();\n\n // Get state after\n const curveAfter = await this.program.account.bondingCurve.fetch(addresses.bondingCurve);\n const walletAfter = await this.connection.getBalance(this.wallet.publicKey);\n\n const solReceived = BigInt(walletAfter - walletBefore);\n const progress = Number(curveAfter.soldSupply.toString()) / Number(curveAfter.tokensForCurve.toString()) * 100;\n\n return {\n txSignature: tx,\n tokensTraded: BigInt(tokensRaw.toString()),\n solTraded: solReceived,\n newProgress: progress,\n isCurveComplete: curveAfter.complete,\n };\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // Admin Withdraw\n // ═══════════════════════════════════════════════════════════════════════════\n\n async adminWithdraw(mint: PublicKey): Promise<{\n txSignature: string;\n solWithdrawn: bigint;\n tokensWithdrawn: bigint;\n feesToTreasury: bigint;\n treasuryTokens: bigint;\n }> {\n const addresses = this.deriveAddresses(mint);\n const adminTokenAccount = getAssociatedTokenAddressSync(mint, this.wallet.publicKey);\n\n // Get launchpad to find treasury\n const launchpad = await this.program.account.launchpad.fetch(this.launchpadPda);\n const treasuryWallet = launchpad.treasury;\n const treasuryTokenAccount = getAssociatedTokenAddressSync(mint, treasuryWallet, true);\n\n // Get state before\n const curve = await this.program.account.bondingCurve.fetch(addresses.bondingCurve);\n const lpSol = BigInt(curve.realSolReserves.toString());\n const lpTokens = BigInt(curve.tokenReservesForLp.toString());\n const accumulatedFees = BigInt(curve.accumulatedFees.toString());\n const treasuryTokensAmount = BigInt(curve.tokenReservesForTreasury.toString());\n\n const tx = await this.program.methods\n .adminWithdraw()\n .accountsPartial({\n admin: this.wallet.publicKey,\n launchpad: this.launchpadPda,\n tokenLaunch: addresses.tokenLaunch,\n bondingCurve: addresses.bondingCurve,\n mint: mint,\n vault: addresses.vault,\n curveTokenAccount: addresses.curveTokenAccount,\n adminTokenAccount: adminTokenAccount,\n treasuryWallet: treasuryWallet,\n treasuryTokenAccount: treasuryTokenAccount,\n systemProgram: SystemProgram.programId,\n tokenProgram: TOKEN_PROGRAM_ID,\n associatedTokenProgram: ASSOCIATED_TOKEN_PROGRAM_ID,\n })\n .rpc();\n\n return {\n txSignature: tx,\n solWithdrawn: lpSol,\n tokensWithdrawn: lpTokens,\n feesToTreasury: accumulatedFees,\n treasuryTokens: treasuryTokensAmount,\n };\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // Estimate Buy (input SOL → output tokens)\n // ═══════════════════════════════════════════════════════════════════════════\n\n async estimateBuy(mint: PublicKey, solAmount: number): Promise<EstimateBuyResult> {\n const addresses = this.deriveAddresses(mint);\n const curve = await this.program.account.bondingCurve.fetch(addresses.bondingCurve);\n\n const k = BigInt(curve.k.toString());\n const soldSupply = BigInt(curve.soldSupply.toString());\n const tokensForCurve = BigInt(curve.tokensForCurve.toString());\n\n const solIn = BigInt(Math.floor(solAmount * LAMPORTS_PER_SOL));\n\n // Deduct 1% fee first\n const fee = solIn / 100n;\n const solAfterFee = solIn - fee;\n\n // Calculate tokens out\n const tokensOut = this.calculateTokensForSol(k, soldSupply, solAfterFee);\n\n // Cap at available\n const available = tokensForCurve - soldSupply;\n const actualTokensOut = tokensOut > available ? available : tokensOut;\n\n // Calculate price per token\n const tokenUnits = actualTokensOut / BigInt(10 ** TOKEN_DECIMALS);\n const pricePerToken = tokenUnits > 0n ? solAfterFee / tokenUnits : 0n;\n\n // Calculate price impact\n const newSoldSupply = soldSupply + actualTokensOut;\n const priceBefore = this.calculatePrice(k, soldSupply);\n const priceAfter = this.calculatePrice(k, newSoldSupply);\n const priceImpactBps = priceBefore > 0n\n ? Number((priceAfter - priceBefore) * 10000n / priceBefore)\n : 0;\n\n return { solIn, solAfterFee, tokensOut: actualTokensOut, fee, pricePerToken, priceImpactBps };\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // Estimate Buy by Tokens (input tokens → output SOL needed)\n // ═══════════════════════════════════════════════════════════════════════════\n\n async estimateBuyByTokens(mint: PublicKey, tokenAmount: number): Promise<EstimateBuyResult> {\n const addresses = this.deriveAddresses(mint);\n const curve = await this.program.account.bondingCurve.fetch(addresses.bondingCurve);\n\n const k = BigInt(curve.k.toString());\n const soldSupply = BigInt(curve.soldSupply.toString());\n const tokensForCurve = BigInt(curve.tokensForCurve.toString());\n\n const tokensRaw = BigInt(Math.floor(tokenAmount)) * BigInt(10 ** TOKEN_DECIMALS);\n\n // Cap at available\n const available = tokensForCurve - soldSupply;\n const actualTokensOut = tokensRaw > available ? available : tokensRaw;\n\n // Calculate gross SOL cost (before fee)\n const solAfterFee = this.calculateCost(k, soldSupply, soldSupply + actualTokensOut);\n\n // Add 1% fee on top: user pays solAfterFee / 0.99\n const solIn = solAfterFee * 100n / 99n;\n const fee = solIn - solAfterFee;\n\n // Calculate price per token (lamports per display token)\n const tokenUnits = actualTokensOut / BigInt(10 ** TOKEN_DECIMALS);\n const pricePerToken = tokenUnits > 0n ? solAfterFee / tokenUnits : 0n;\n\n // Calculate price impact\n const newSoldSupply = soldSupply + actualTokensOut;\n const priceBefore = this.calculatePrice(k, soldSupply);\n const priceAfter = this.calculatePrice(k, newSoldSupply);\n const priceImpactBps = priceBefore > 0n\n ? Number((priceAfter - priceBefore) * 10000n / priceBefore)\n : 0;\n\n return { solIn, solAfterFee, tokensOut: actualTokensOut, fee, pricePerToken, priceImpactBps };\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // Estimate Sell (input tokens → output SOL)\n // ═══════════════════════════════════════════════════════════════════════════\n\n async estimateSell(mint: PublicKey, tokenAmount: number): Promise<EstimateSellResult> {\n const addresses = this.deriveAddresses(mint);\n const curve = await this.program.account.bondingCurve.fetch(addresses.bondingCurve);\n\n const k = BigInt(curve.k.toString());\n const soldSupply = BigInt(curve.soldSupply.toString());\n const realSolReserves = BigInt(curve.realSolReserves.toString());\n\n // Floor to handle decimal inputs safely (BigInt cannot accept floats)\n const tokensIn = BigInt(Math.floor(tokenAmount)) * BigInt(10 ** TOKEN_DECIMALS);\n\n // Can't sell more than sold\n if (tokensIn > soldSupply) {\n throw new Error(`Cannot sell ${tokenAmount} tokens. Only ${soldSupply / BigInt(10 ** TOKEN_DECIMALS)} available.`);\n }\n\n // Calculate gross SOL refund\n const grossRefund = this.calculateRefund(k, soldSupply, soldSupply - tokensIn);\n\n // Cap at available SOL\n const solBeforeFee = grossRefund > realSolReserves ? realSolReserves : grossRefund;\n\n // Deduct 1% fee\n const fee = solBeforeFee / 100n;\n const solOut = solBeforeFee - fee;\n\n // Calculate price per token (lamports per display token)\n const tokenDisplayAmount = BigInt(Math.floor(tokenAmount));\n const pricePerToken = tokenDisplayAmount > 0n ? solOut / tokenDisplayAmount : 0n;\n\n // Calculate price impact\n const newSoldSupply = soldSupply - tokensIn;\n const priceBefore = this.calculatePrice(k, soldSupply);\n const priceAfter = this.calculatePrice(k, newSoldSupply);\n const priceImpactBps = priceBefore > 0n\n ? Number((priceBefore - priceAfter) * 10000n / priceBefore)\n : 0;\n\n return { tokensIn, solBeforeFee, solOut, fee, pricePerToken, priceImpactBps };\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // Estimate Sell by SOL (input SOL desired → output tokens to sell)\n // ═══════════════════════════════════════════════════════════════════════════\n\n async estimateSellBySol(mint: PublicKey, solAmount: number): Promise<EstimateSellResult> {\n const addresses = this.deriveAddresses(mint);\n const curve = await this.program.account.bondingCurve.fetch(addresses.bondingCurve);\n\n const k = BigInt(curve.k.toString());\n const soldSupply = BigInt(curve.soldSupply.toString());\n const realSolReserves = BigInt(curve.realSolReserves.toString());\n\n const solDesired = BigInt(Math.floor(solAmount * LAMPORTS_PER_SOL));\n\n // Reverse fee: user wants solDesired after fee, so gross = solDesired / 0.99\n const solBeforeFee = solDesired * 100n / 99n;\n\n // Cap at available SOL reserves\n const cappedGross = solBeforeFee > realSolReserves ? realSolReserves : solBeforeFee;\n\n // Calculate tokens needed to sell\n const tokensIn = this.calculateTokensForSolSell(k, soldSupply, cappedGross);\n\n // Cap at sold supply\n const actualTokensIn = tokensIn > soldSupply ? soldSupply : tokensIn;\n\n // Recalculate actual SOL from capped tokens\n const actualGross = this.calculateRefund(k, soldSupply, soldSupply - actualTokensIn);\n const actualSolBeforeFee = actualGross > realSolReserves ? realSolReserves : actualGross;\n const fee = actualSolBeforeFee / 100n;\n const solOut = actualSolBeforeFee - fee;\n\n // Calculate price per token\n const tokenUnits = actualTokensIn / BigInt(10 ** TOKEN_DECIMALS);\n const pricePerToken = tokenUnits > 0n ? solOut / tokenUnits : 0n;\n\n // Calculate price impact\n const newSoldSupply = soldSupply - actualTokensIn;\n const priceBefore = this.calculatePrice(k, soldSupply);\n const priceAfter = this.calculatePrice(k, newSoldSupply);\n const priceImpactBps = priceBefore > 0n\n ? Number((priceBefore - priceAfter) * 10000n / priceBefore)\n : 0;\n\n return { tokensIn: actualTokensIn, solBeforeFee: actualSolBeforeFee, solOut, fee, pricePerToken, priceImpactBps };\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // Get Curve State\n // ═══════════════════════════════════════════════════════════════════════════\n\n async getCurveState(mint: PublicKey): Promise<BondingCurveState> {\n const addresses = this.deriveAddresses(mint);\n const curve = await this.program.account.bondingCurve.fetch(addresses.bondingCurve);\n\n return {\n tokenLaunch: curve.tokenLaunch,\n k: BigInt(curve.k.toString()),\n totalSupply: BigInt(curve.totalSupply.toString()),\n soldSupply: BigInt(curve.soldSupply.toString()),\n realSolReserves: BigInt(curve.realSolReserves.toString()),\n tokenReservesForLp: BigInt(curve.tokenReservesForLp.toString()),\n tokenReservesForTreasury: BigInt(curve.tokenReservesForTreasury.toString()),\n tokensForCurve: BigInt(curve.tokensForCurve.toString()),\n accumulatedFees: BigInt(curve.accumulatedFees.toString()),\n complete: curve.complete,\n bump: curve.bump,\n };\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // Get Token Launch State\n // ═══════════════════════════════════════════════════════════════════════════\n\n async getTokenLaunchState(mint: PublicKey): Promise<TokenLaunchState> {\n const addresses = this.deriveAddresses(mint);\n const launch = await this.program.account.tokenLaunch.fetch(addresses.tokenLaunch);\n\n return {\n creator: launch.creator,\n mint: launch.mint,\n vault: launch.vault,\n bondingCurve: launch.bondingCurve,\n totalSupply: BigInt(launch.totalSupply.toString()),\n curveAllocation: BigInt(launch.curveAllocation.toString()),\n lpAllocation: BigInt(launch.lpAllocation.toString()),\n treasuryAllocation: BigInt(launch.treasuryAllocation.toString()),\n totalSolRaised: BigInt(launch.totalSolRaised.toString()),\n tradingActive: launch.tradingActive,\n migrated: launch.migrated,\n initialK: BigInt(launch.initialK.toString()),\n name: launch.name,\n symbol: launch.symbol,\n };\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // Get Progress\n // ═══════════════════════════════════════════════════════════════════════════\n\n async getProgress(mint: PublicKey): Promise<{\n percent: number;\n soldSupply: bigint;\n tokensForCurve: bigint;\n solRaised: bigint;\n currentPrice: bigint;\n currentPriceSol: number;\n isComplete: boolean;\n }> {\n const curve = await this.getCurveState(mint);\n\n // Use 10000x multiplier then divide by 100 for 2 decimal places precision\n const percent = Number(curve.soldSupply * 10000n / curve.tokensForCurve) / 100;\n const currentPrice = this.calculatePrice(curve.k, curve.soldSupply);\n const currentPriceSol = this.calculatePriceSol(curve.k, curve.soldSupply);\n\n return {\n percent,\n soldSupply: curve.soldSupply,\n tokensForCurve: curve.tokensForCurve,\n solRaised: curve.realSolReserves,\n currentPrice,\n currentPriceSol,\n isComplete: curve.complete,\n };\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // Initial Price (for candlestick chart open price)\n // ═══════════════════════════════════════════════════════════════════════════\n\n /**\n * Get the initial/starting price for a token launch.\n * Linear curve starts at price=0, so this returns the theoretical price\n * after 1 display token is sold — useful as the \"open\" price for the first candle.\n */\n async getInitialPrice(mint: PublicKey): Promise<{\n priceLamports: bigint;\n priceSol: number;\n }> {\n const curve = await this.getCurveState(mint);\n const oneTokenRaw = BigInt(10 ** TOKEN_DECIMALS);\n return {\n priceLamports: this.calculatePrice(curve.k, oneTokenRaw),\n priceSol: this.calculatePriceSol(curve.k, oneTokenRaw),\n };\n }\n\n /**\n * Get the price at any given sold supply (display tokens).\n * Useful for calculating open/close prices on candlestick charts.\n */\n getPriceAtSupply(k: bigint, soldDisplayTokens: number): {\n priceLamports: bigint;\n priceSol: number;\n } {\n const supplyRaw = BigInt(Math.floor(soldDisplayTokens)) * BigInt(10 ** TOKEN_DECIMALS);\n return {\n priceLamports: this.calculatePrice(k, supplyRaw),\n priceSol: this.calculatePriceSol(k, supplyRaw),\n };\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // Event Listeners\n // ═══════════════════════════════════════════════════════════════════════════\n\n /**\n * Listen for LaunchCreated events\n * @param callback Function to call when event is emitted\n * @returns Listener ID for removal\n */\n onLaunchCreated(callback: EventCallback<LaunchCreatedEvent>): number {\n return this.program.addEventListener(\"launchCreated\", (event: any, slot: number, signature: string) => {\n callback({\n tokenLaunch: event.tokenLaunch,\n mint: event.mint,\n creator: event.creator,\n name: event.name,\n symbol: event.symbol,\n totalSupply: BigInt(event.totalSupply.toString()),\n curveAllocation: BigInt(event.curveAllocation.toString()),\n lpAllocation: BigInt(event.lpAllocation.toString()),\n treasuryAllocation: BigInt(event.treasuryAllocation.toString()),\n initialK: BigInt(event.initialK.toString()),\n initialPrice: BigInt(event.initialPrice.toString()),\n timestamp: BigInt(event.timestamp.toString()),\n }, slot, signature);\n });\n }\n\n /**\n * Listen for TokensPurchased events\n * @param callback Function to call when event is emitted\n * @returns Listener ID for removal\n */\n onTokensPurchased(callback: EventCallback<TokensPurchasedEvent>): number {\n return this.program.addEventListener(\"tokensPurchased\", (event: any, slot: number, signature: string) => {\n callback({\n tokenLaunch: event.tokenLaunch,\n mint: event.mint,\n buyer: event.buyer,\n solAmount: BigInt(event.solAmount.toString()),\n solAfterFees: BigInt(event.solAfterFees.toString()),\n tokensReceived: BigInt(event.tokensReceived.toString()),\n curveFee: BigInt(event.curveFee.toString()),\n adminFee: BigInt(event.adminFee.toString()),\n priceAfter: BigInt(event.priceAfter.toString()),\n totalSold: BigInt(event.totalSold.toString()),\n progress: event.progress,\n timestamp: BigInt(event.timestamp.toString()),\n isCurveComplete: event.isCurveComplete,\n }, slot, signature);\n });\n }\n\n /**\n * Listen for TokensSold events\n * @param callback Function to call when event is emitted\n * @returns Listener ID for removal\n */\n onTokensSold(callback: EventCallback<TokensSoldEvent>): number {\n return this.program.addEventListener(\"tokensSold\", (event: any, slot: number, signature: string) => {\n callback({\n tokenLaunch: event.tokenLaunch,\n mint: event.mint,\n seller: event.seller,\n tokensSold: BigInt(event.tokensSold.toString()),\n grossSolRefund: BigInt(event.grossSolRefund.toString()),\n netSolRefund: BigInt(event.netSolRefund.toString()),\n curveFee: BigInt(event.curveFee.toString()),\n adminFee: BigInt(event.adminFee.toString()),\n priceAfter: BigInt(event.priceAfter.toString()),\n totalSold: BigInt(event.totalSold.toString()),\n progress: event.progress,\n timestamp: BigInt(event.timestamp.toString()),\n }, slot, signature);\n });\n }\n\n /**\n * Listen for CurveComplete events\n * @param callback Function to call when event is emitted\n * @returns Listener ID for removal\n */\n onCurveComplete(callback: EventCallback<CurveCompleteEvent>): number {\n return this.program.addEventListener(\"curveComplete\", (event: any, slot: number, signature: string) => {\n callback({\n tokenLaunch: event.tokenLaunch,\n mint: event.mint,\n totalSolRaised: BigInt(event.totalSolRaised.toString()),\n finalPrice: BigInt(event.finalPrice.toString()),\n timestamp: BigInt(event.timestamp.toString()),\n }, slot, signature);\n });\n }\n\n /**\n * Listen for AdminWithdraw events\n * @param callback Function to call when event is emitted\n * @returns Listener ID for removal\n */\n onAdminWithdraw(callback: EventCallback<AdminWithdrawEvent>): number {\n return this.program.addEventListener(\"adminWithdraw\", (event: any, slot: number, signature: string) => {\n callback({\n tokenLaunch: event.tokenLaunch,\n mint: event.mint,\n admin: event.admin,\n creator: event.creator,\n treasury: event.treasury,\n solWithdrawn: BigInt(event.solWithdrawn.toString()),\n tokensWithdrawn: BigInt(event.tokensWithdrawn.toString()),\n feesToTreasury: BigInt(event.feesToTreasury.toString()),\n treasuryTokens: BigInt(event.treasuryTokens.toString()),\n timestamp: BigInt(event.timestamp.toString()),\n }, slot, signature);\n });\n }\n\n /**\n * Remove an event listener\n * @param listenerId The ID returned from addEventListener\n */\n async removeEventListener(listenerId: number): Promise<void> {\n await this.program.removeEventListener(listenerId);\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // Math Helpers (Pure functions, no async)\n // ═══════════════════════════════════════════════════════════════════════════\n\n /** Calculate price at a given supply in lamports per display token.\n * Formula: price = k × supply × 10^DECIMALS / K_SCALE\n * Returns lamports per 1 display token (not per raw token). */\n calculatePrice(k: bigint, supply: bigint): bigint {\n if (supply === 0n) return 0n;\n return (k * supply * BigInt(10 ** TOKEN_DECIMALS)) / K_SCALE;\n }\n\n /** Calculate price per display token in SOL (float).\n * Useful for charts where sub-lamport precision matters. */\n calculatePriceSol(k: bigint, supply: bigint): number {\n if (supply === 0n) return 0;\n // price_sol = k * supply_raw * 10^DECIMALS / K_SCALE / LAMPORTS_PER_SOL\n // = k * supply_raw / (K_SCALE / 10^DECIMALS / LAMPORTS_PER_SOL)\n // = k * supply_raw / 10^25\n return Number(k) * Number(supply) / 1e25;\n }\n\n /** Calculate cost to buy from s1 to s2: cost = (k/2) × (s2² - s1²) / K_SCALE */\n calculateCost(k: bigint, s1: bigint, s2: bigint): bigint {\n if (s2 <= s1) return 0n;\n const s1Sq = s1 * s1;\n const s2Sq = s2 * s2;\n const diffSq = s2Sq - s1Sq;\n return (k * diffSq) / 2n / K_SCALE;\n }\n\n /** Calculate tokens received for SOL: s2 = sqrt(s1² + 2×sol×K_SCALE/k) */\n calculateTokensForSol(k: bigint, currentSupply: bigint, solIn: bigint): bigint {\n if (solIn === 0n || k === 0n) return 0n;\n\n const s1Sq = currentSupply * currentSupply;\n const addition = (2n * solIn * K_SCALE) / k;\n const s2Sq = s1Sq + addition;\n const s2 = this.isqrt(s2Sq);\n\n return s2 - currentSupply;\n }\n\n /** Calculate tokens to sell to receive target SOL: inverse of refund formula\n * s2 = sqrt(s1² - 2×solOut×K_SCALE/k), return s1 - s2 */\n calculateTokensForSolSell(k: bigint, currentSupply: bigint, solOut: bigint): bigint {\n if (solOut === 0n || k === 0n) return 0n;\n\n const s1Sq = currentSupply * currentSupply;\n const subtraction = (2n * solOut * K_SCALE) / k;\n\n // If subtraction exceeds s1², need to sell all tokens\n if (subtraction >= s1Sq) return currentSupply;\n\n const s2Sq = s1Sq - subtraction;\n const s2 = this.isqrt(s2Sq);\n\n return currentSupply - s2;\n }\n\n /** Calculate refund for selling tokens: refund = (k/2) × (s1² - s2²) / K_SCALE */\n calculateRefund(k: bigint, s1: bigint, s2: bigint): bigint {\n if (s1 <= s2) return 0n;\n const s1Sq = s1 * s1;\n const s2Sq = s2 * s2;\n const diffSq = s1Sq - s2Sq;\n return (k * diffSq) / 2n / K_SCALE;\n }\n\n /** Integer square root using Newton's method */\n isqrt(n: bigint): bigint {\n if (n === 0n) return 0n;\n if (n === 1n) return 1n;\n\n let x = n;\n let y = (x + 1n) / 2n;\n\n while (y < x) {\n x = y;\n y = (x + n / x) / 2n;\n }\n\n return x;\n }\n\n /** Calculate K for a given target SOL and curve supply */\n static calculateK(curveSupply: bigint, targetSol: bigint): bigint {\n // k = 2 × target_sol × K_SCALE / curve_supply²\n const numerator = 2n * targetSol * K_SCALE;\n const denominator = curveSupply * curveSupply;\n return numerator / denominator;\n }\n}\n\n// ═══════════════════════════════════════════════════════════════════════════\n// StreamerSDK Class\n// ═══════════════════════════════════════════════════════════════════════════\n\nexport interface RegisterStreamerParams {\n streamerId: string;\n streamerKeypair: Keypair;\n}\n\nexport interface RegisterStreamerResult {\n txSignature: string;\n streamerRegistrationPda: PublicKey;\n}\n\nexport interface ClaimFundsParams {\n streamerId: string;\n streamerKeypair: Keypair;\n mint: PublicKey;\n solAmount: BN;\n tokenAmount: BN;\n}\n\nexport interface ClaimFundsResult {\n txSignature: string;\n}\n\nexport class StreamerSDK {\n public program: Program<any>;\n public connection: Connection;\n public wallet: anchor.Wallet;\n\n constructor(program: Program<any>, wallet: anchor.Wallet) {\n this.program = program;\n this.connection = program.provider.connection;\n this.wallet = wallet;\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // PDA Derivation Helpers\n // ═══════════════════════════════════════════════════════════════════════════\n\n derivePlatformConfig(): PublicKey {\n const [pda] = PublicKey.findProgramAddressSync(\n [Buffer.from(\"platform_config\")],\n this.program.programId\n );\n return pda;\n }\n\n deriveWhitelistEntry(wallet: PublicKey): PublicKey {\n const [pda] = PublicKey.findProgramAddressSync(\n [Buffer.from(\"whitelist\"), wallet.toBuffer()],\n this.program.programId\n );\n return pda;\n }\n\n deriveStreamerRegistration(streamerId: string): PublicKey {\n const [pda] = PublicKey.findProgramAddressSync(\n [Buffer.from(\"streamer\"), Buffer.from(streamerId)],\n this.program.programId\n );\n return pda;\n }\n\n deriveVault(): PublicKey {\n const [pda] = PublicKey.findProgramAddressSync(\n [Buffer.from(\"vault\")],\n this.program.programId\n );\n return pda;\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // Helpers\n // ═══════════════════════════════════════════════════════════════════════════\n\n private async getSolanaTimestamp(): Promise<number> {\n const slot = await this.connection.getSlot();\n const blockTime = await this.connection.getBlockTime(slot);\n if (!blockTime) throw new Error(\"Failed to get block time\");\n return blockTime;\n }\n\n private createEd25519Instruction(\n keypair: Keypair,\n message: Buffer\n ): TransactionInstruction {\n const signature = nacl.sign.detached(message, keypair.secretKey);\n return Ed25519Program.createInstructionWithPublicKey({\n publicKey: keypair.publicKey.toBytes(),\n message,\n signature,\n });\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // Register Streamer\n // ═══════════════════════════════════════════════════════════════════════════\n\n async registerStreamer(\n params: RegisterStreamerParams\n ): Promise<RegisterStreamerResult> {\n const { streamerId, streamerKeypair } = params;\n\n const timestamp = await this.getSolanaTimestamp();\n\n // Ed25519 message: \"register_streamer:{streamer_id}:{wallet}:{timestamp}\"\n const message = `register_streamer:${streamerId}:${streamerKeypair.publicKey.toBase58()}:${timestamp}`;\n const ed25519Ix = this.createEd25519Instruction(\n streamerKeypair,\n Buffer.from(message, \"utf-8\")\n );\n\n const whitelistPda = this.deriveWhitelistEntry(this.wallet.publicKey);\n const streamerRegPda = this.deriveStreamerRegistration(streamerId);\n\n const registerIx = await (this.program.methods as any)\n .registerStreamer(\n streamerId,\n streamerKeypair.publicKey,\n new BN(timestamp)\n )\n .accounts({\n caller: this.wallet.publicKey,\n whitelistEntry: whitelistPda,\n streamerRegistration: streamerRegPda,\n instructionsSysvar: SYSVAR_INSTRUCTIONS_PUBKEY,\n })\n .instruction();\n\n const tx = new Transaction().add(ed25519Ix).add(registerIx);\n const provider = this.program.provider as anchor.AnchorProvider;\n const txSignature = await provider.sendAndConfirm(tx);\n\n return { txSignature, streamerRegistrationPda: streamerRegPda };\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // Claim Funds\n // ═══════════════════════════════════════════════════════════════════════════\n\n async claimFunds(params: ClaimFundsParams): Promise<ClaimFundsResult> {\n const { streamerId, streamerKeypair, mint, solAmount, tokenAmount } =\n params;\n\n const timestamp = await this.getSolanaTimestamp();\n\n // Ed25519 message: \"claim_funds:{streamer_id}:{wallet}:{mint}:{token_amount}:{sol_amount}:{timestamp}\"\n const message = `claim_funds:${streamerId}:${streamerKeypair.publicKey.toBase58()}:${mint.toBase58()}:${tokenAmount.toString()}:${solAmount.toString()}:${timestamp}`;\n const ed25519Ix = this.createEd25519Instruction(\n streamerKeypair,\n Buffer.from(message, \"utf-8\")\n );\n\n const whitelistPda = this.deriveWhitelistEntry(this.wallet.publicKey);\n const streamerRegPda = this.deriveStreamerRegistration(streamerId);\n const vaultPda = this.deriveVault();\n const programTokenAccount = getAssociatedTokenAddressSync(\n mint,\n vaultPda,\n true\n );\n const streamerTokenAccount = getAssociatedTokenAddressSync(\n mint,\n streamerKeypair.publicKey,\n false\n );\n\n const claimIx = await (this.program.methods as any)\n .claimFunds(streamerId, solAmount, tokenAmount, new BN(timestamp))\n .accounts({\n caller: this.wallet.publicKey,\n whitelistEntry: whitelistPda,\n streamerRegistration: streamerRegPda,\n streamerWallet: streamerKeypair.publicKey,\n vault: vaultPda,\n mint,\n programTokenAccount,\n streamerTokenAccount,\n instructionsSysvar: SYSVAR_INSTRUCTIONS_PUBKEY,\n })\n .instruction();\n\n const tx = new Transaction().add(ed25519Ix).add(claimIx);\n const provider = this.program.provider as anchor.AnchorProvider;\n const txSignature = await provider.sendAndConfirm(tx);\n\n return { txSignature };\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // Read State\n // ═══════════════════════════════════════════════════════════════════════════\n\n async getStreamerRegistration(\n streamerId: string\n ): Promise<{\n streamerId: string;\n wallet: PublicKey;\n verifiedAt: number;\n registeredBy: PublicKey;\n createdAt: number;\n } | null> {\n const pda = this.deriveStreamerRegistration(streamerId);\n try {\n const account = await (this.program.account as any)\n .streamerRegistration.fetch(pda);\n return {\n streamerId: account.streamerId,\n wallet: account.wallet,\n verifiedAt: account.verifiedAt.toNumber(),\n registeredBy: account.registeredBy,\n createdAt: account.createdAt.toNumber(),\n };\n } catch {\n return null;\n }\n }\n\n async isWhitelisted(wallet: PublicKey): Promise<boolean> {\n const pda = this.deriveWhitelistEntry(wallet);\n try {\n const account = await (this.program.account as any)\n .whitelistEntry.fetch(pda);\n return account.active;\n } catch {\n return false;\n }\n }\n\n async getVaultBalance(\n mint?: PublicKey\n ): Promise<{ sol: bigint; tokens: bigint }> {\n const vaultPda = this.deriveVault();\n const sol = BigInt(await this.connection.getBalance(vaultPda));\n\n let tokens = 0n;\n if (mint) {\n const ata = getAssociatedTokenAddressSync(mint, vaultPda, true);\n try {\n const account = await getAccount(this.connection, ata);\n tokens = account.amount;\n } catch {\n // ATA doesn't exist\n }\n }\n\n return { sol, tokens };\n }\n}\n\n// ═══════════════════════════════════════════════════════════════════════════\n// Utility Functions\n// ═══════════════════════════════════════════════════════════════════════════\n\n/** Format raw token amount to human-readable */\nexport function formatTokens(raw: bigint): string {\n const tokens = Number(raw) / (10 ** TOKEN_DECIMALS);\n return tokens.toLocaleString(undefined, { maximumFractionDigits: 2 });\n}\n\n/** Format lamports to SOL */\nexport function formatSol(lamports: bigint): string {\n const sol = Number(lamports) / LAMPORTS_PER_SOL;\n return sol.toFixed(4);\n}\n\n/** Parse SOL to lamports */\nexport function parseSol(sol: number): bigint {\n return BigInt(Math.floor(sol * LAMPORTS_PER_SOL));\n}\n\n/** Parse tokens to raw */\nexport function parseTokens(tokens: number): bigint {\n return BigInt(Math.floor(tokens * (10 ** TOKEN_DECIMALS)));\n}\n\nexport default KickFunSDK;\n"]}
1
+ {"version":3,"sources":["../src/sdk/index.ts"],"names":["PublicKey","LAMPORTS_PER_SOL","getAssociatedTokenAddressSync","SystemProgram","Keypair","TOKEN_PROGRAM_ID","ASSOCIATED_TOKEN_PROGRAM_ID","SYSVAR_RENT_PUBKEY","getAccount","BN","ComputeBudgetProgram","createAssociatedTokenAccountIdempotentInstruction","Ed25519Program","nacl","SYSVAR_INSTRUCTIONS_PUBKEY","Transaction"],"mappings":"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","file":"index.js","sourcesContent":["import * as anchor from \"@coral-xyz/anchor\";\nimport { Program, BN } from \"@coral-xyz/anchor\";\nimport { KickFunProgram } from \"../types/kick_fun_program\";\nimport {\n Keypair,\n SystemProgram,\n PublicKey,\n LAMPORTS_PER_SOL,\n ComputeBudgetProgram,\n Connection,\n TransactionInstruction,\n Transaction,\n SYSVAR_RENT_PUBKEY,\n SYSVAR_INSTRUCTIONS_PUBKEY,\n Ed25519Program,\n} from \"@solana/web3.js\";\nimport {\n TOKEN_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n getAssociatedTokenAddressSync,\n getAccount,\n createAssociatedTokenAccountIdempotentInstruction,\n} from \"@solana/spl-token\";\nimport nacl from \"tweetnacl\";\n\n// ═══════════════════════════════════════════════════════════════════════════\n// Constants\n// ═══════════════════════════════════════════════════════════════════════════\n\nexport const PROGRAM_ID = new PublicKey(\"6o7oTqg2CfvcMCJTLNEJsef7c875zGpTvcnFctNAjudL\");\nexport const ADMIN_WALLET = new PublicKey(\"7eGpbyRpcM7WpNKQtd6XkteNQWHbWXP7icZjKzNK2aTk\");\nexport const METADATA_PROGRAM_ID = new PublicKey(\"metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s\");\nexport const STREAMER_PROGRAM_ID = new PublicKey(\"BZHZ5pSZLi4zRBrCmG1VD65fqKnrPYC2bBb2HQ4VKiJ1\");\nexport const K_SCALE = 10_000_000_000_000_000_000_000n; // 10^22\nexport const LAMPORTS = LAMPORTS_PER_SOL;\nexport const TOKEN_DECIMALS = 6;\nexport const FEE_BPS = 100; // 1% total fee (0.5% admin immediate + 0.5% accumulated)\nexport const CURVE_PERCENT = 70; // 70% for bonding curve\nexport const LP_PERCENT = 20; // 20% for LP\nexport const TREASURY_PERCENT = 10; // 10% for treasury\n\n// ═══════════════════════════════════════════════════════════════════════════\n// Types\n// ═══════════════════════════════════════════════════════════════════════════\n\nexport interface TokenLaunchConfig {\n name: string;\n symbol: string;\n uri: string;\n creatorWallet?: PublicKey; // Optional: custom creator wallet, defaults to SDK wallet\n}\n\nexport interface BondingCurveState {\n tokenLaunch: PublicKey;\n k: bigint;\n totalSupply: bigint;\n soldSupply: bigint;\n realSolReserves: bigint;\n tokenReservesForLp: bigint;\n tokenReservesForTreasury: bigint;\n tokensForCurve: bigint;\n accumulatedFees: bigint;\n complete: boolean;\n bump: number;\n}\n\nexport interface TokenLaunchState {\n creator: PublicKey;\n mint: PublicKey;\n vault: PublicKey;\n bondingCurve: PublicKey;\n totalSupply: bigint;\n curveAllocation: bigint;\n lpAllocation: bigint;\n treasuryAllocation: bigint;\n totalSolRaised: bigint;\n tradingActive: boolean;\n migrated: boolean;\n initialK: bigint;\n name: string;\n symbol: string;\n}\n\nexport interface LaunchAddresses {\n mint: PublicKey;\n tokenLaunch: PublicKey;\n bondingCurve: PublicKey;\n vault: PublicKey;\n curveTokenAccount: PublicKey;\n metadata: PublicKey; // Metaplex metadata PDA\n}\n\nexport interface TradeResult {\n txSignature: string;\n tokensTraded: bigint;\n solTraded: bigint;\n newProgress: number;\n isCurveComplete: boolean;\n}\n\nexport interface EstimateBuyResult {\n solIn: bigint; // Total SOL user pays (including fee)\n solAfterFee: bigint; // SOL that goes into the curve (after fee)\n tokensOut: bigint; // Tokens user receives\n fee: bigint; // Fee in SOL (lamports)\n pricePerToken: bigint;\n priceImpactBps: number;\n}\n\nexport interface EstimateSellResult {\n tokensIn: bigint; // Tokens user sells\n solBeforeFee: bigint; // Gross SOL from curve (before fee)\n solOut: bigint; // Net SOL user receives (after fee)\n fee: bigint; // Fee in SOL (lamports)\n pricePerToken: bigint;\n priceImpactBps: number;\n}\n\n// ═══════════════════════════════════════════════════════════════════════════\n// Event Types\n// ═══════════════════════════════════════════════════════════════════════════\n\nexport interface LaunchCreatedEvent {\n tokenLaunch: PublicKey;\n mint: PublicKey;\n creator: PublicKey;\n name: string;\n symbol: string;\n totalSupply: bigint;\n curveAllocation: bigint;\n lpAllocation: bigint;\n treasuryAllocation: bigint;\n initialK: bigint;\n initialPrice: bigint;\n timestamp: bigint;\n}\n\nexport interface TokensPurchasedEvent {\n tokenLaunch: PublicKey;\n mint: PublicKey;\n buyer: PublicKey;\n solAmount: bigint;\n solAfterFees: bigint;\n tokensReceived: bigint;\n curveFee: bigint;\n adminFee: bigint;\n priceAfter: bigint;\n totalSold: bigint;\n progress: number;\n timestamp: bigint;\n isCurveComplete: boolean;\n}\n\nexport interface TokensSoldEvent {\n tokenLaunch: PublicKey;\n mint: PublicKey;\n seller: PublicKey;\n tokensSold: bigint;\n grossSolRefund: bigint;\n netSolRefund: bigint;\n curveFee: bigint;\n adminFee: bigint;\n priceAfter: bigint;\n totalSold: bigint;\n progress: number;\n timestamp: bigint;\n}\n\nexport interface CurveCompleteEvent {\n tokenLaunch: PublicKey;\n mint: PublicKey;\n totalSolRaised: bigint;\n finalPrice: bigint;\n timestamp: bigint;\n}\n\nexport interface AdminWithdrawEvent {\n tokenLaunch: PublicKey;\n mint: PublicKey;\n admin: PublicKey;\n creator: PublicKey;\n treasury: PublicKey;\n solWithdrawn: bigint;\n tokensWithdrawn: bigint;\n feesToTreasury: bigint;\n treasuryTokens: bigint;\n timestamp: bigint;\n}\n\nexport type KickFunEvent =\n | { name: \"LaunchCreated\"; data: LaunchCreatedEvent }\n | { name: \"TokensPurchased\"; data: TokensPurchasedEvent }\n | { name: \"TokensSold\"; data: TokensSoldEvent }\n | { name: \"CurveComplete\"; data: CurveCompleteEvent }\n | { name: \"AdminWithdraw\"; data: AdminWithdrawEvent };\n\nexport type EventCallback<T> = (event: T, slot: number, signature: string) => void;\n\n// ═══════════════════════════════════════════════════════════════════════════\n// KickFunSDK Class\n// ═══════════════════════════════════════════════════════════════════════════\n\nexport class KickFunSDK {\n public program: Program<KickFunProgram>;\n public connection: Connection;\n public wallet: anchor.Wallet;\n public launchpadPda: PublicKey;\n\n constructor(\n program: Program<KickFunProgram>,\n wallet: anchor.Wallet\n ) {\n this.program = program;\n this.connection = program.provider.connection;\n this.wallet = wallet;\n\n [this.launchpadPda] = PublicKey.findProgramAddressSync(\n [Buffer.from(\"launchpad\")],\n program.programId\n );\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // PDA Derivation Helpers\n // ═══════════════════════════════════════════════════════════════════════════\n\n deriveAddresses(mint: PublicKey): LaunchAddresses {\n const [tokenLaunch] = PublicKey.findProgramAddressSync(\n [Buffer.from(\"token_launch\"), mint.toBuffer()],\n this.program.programId\n );\n const [bondingCurve] = PublicKey.findProgramAddressSync(\n [Buffer.from(\"bonding_curve\"), tokenLaunch.toBuffer()],\n this.program.programId\n );\n const [vault] = PublicKey.findProgramAddressSync(\n [Buffer.from(\"vault\"), tokenLaunch.toBuffer()],\n this.program.programId\n );\n const curveTokenAccount = getAssociatedTokenAddressSync(mint, bondingCurve, true);\n\n // Metaplex metadata PDA\n const [metadata] = PublicKey.findProgramAddressSync(\n [Buffer.from(\"metadata\"), METADATA_PROGRAM_ID.toBuffer(), mint.toBuffer()],\n METADATA_PROGRAM_ID\n );\n\n return { mint, tokenLaunch, bondingCurve, vault, curveTokenAccount, metadata };\n }\n\n deriveUserPosition(tokenLaunch: PublicKey, user: PublicKey): PublicKey {\n const [userPosition] = PublicKey.findProgramAddressSync(\n [Buffer.from(\"user_position\"), tokenLaunch.toBuffer(), user.toBuffer()],\n this.program.programId\n );\n return userPosition;\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // Initialize Launchpad (one-time setup)\n // ═══════════════════════════════════════════════════════════════════════════\n\n async initializeLaunchpad(platformFeeBps: number = 200): Promise<string> {\n try {\n await this.program.account.launchpad.fetch(this.launchpadPda);\n return \"already_initialized\";\n } catch {\n const tx = await this.program.methods\n .initializeLaunchpad(platformFeeBps)\n .accountsPartial({\n authority: this.wallet.publicKey,\n launchpad: this.launchpadPda,\n treasury: this.wallet.publicKey,\n systemProgram: SystemProgram.programId,\n })\n .rpc();\n return tx;\n }\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // Create Token Launch\n // ═══════════════════════════════════════════════════════════════════════════\n\n async createTokenLaunch(config: TokenLaunchConfig): Promise<{\n txSignature: string;\n addresses: LaunchAddresses;\n mintKeypair: Keypair;\n }> {\n const mintKeypair = Keypair.generate();\n const addresses = this.deriveAddresses(mintKeypair.publicKey);\n\n // Use custom creator wallet or default to SDK wallet\n const creatorWallet = config.creatorWallet || this.wallet.publicKey;\n\n const tx = await this.program.methods\n .createTokenLaunch(config.name, config.symbol, config.uri)\n .accountsPartial({\n creator: creatorWallet,\n launchpad: this.launchpadPda,\n mint: mintKeypair.publicKey,\n tokenLaunch: addresses.tokenLaunch,\n bondingCurve: addresses.bondingCurve,\n vault: addresses.vault,\n curveTokenAccount: addresses.curveTokenAccount,\n metadata: addresses.metadata,\n tokenProgram: TOKEN_PROGRAM_ID,\n associatedTokenProgram: ASSOCIATED_TOKEN_PROGRAM_ID,\n metadataProgram: METADATA_PROGRAM_ID,\n systemProgram: SystemProgram.programId,\n rent: SYSVAR_RENT_PUBKEY,\n })\n .signers([mintKeypair])\n .transaction();\n\n const { blockhash } = await this.connection.getLatestBlockhash();\n tx.recentBlockhash = blockhash;\n tx.feePayer = this.wallet.publicKey;\n tx.partialSign(mintKeypair);\n const signedTx = await this.wallet.signTransaction(tx);\n const txSignature = await this.connection.sendRawTransaction(signedTx.serialize(), {\n skipPreflight: true,\n });\n\n await this.connection.confirmTransaction({\n signature: txSignature,\n ...(await this.connection.getLatestBlockhash()),\n });\n \n return { txSignature, addresses, mintKeypair };\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // Buy Tokens\n // ═══════════════════════════════════════════════════════════════════════════\n\n async buy(\n mint: PublicKey,\n solAmount: number, // In SOL (e.g., 1.5 for 1.5 SOL)\n options?: { computeUnits?: number }\n ): Promise<TradeResult> {\n const addresses = this.deriveAddresses(mint);\n const userTokenAccount = getAssociatedTokenAddressSync(mint, this.wallet.publicKey);\n const userPosition = this.deriveUserPosition(addresses.tokenLaunch, this.wallet.publicKey);\n\n // Get token balance before\n let tokensBefore = 0n;\n try {\n const account = await getAccount(this.connection, userTokenAccount);\n tokensBefore = account.amount;\n } catch {\n // Account doesn't exist yet\n }\n\n const solLamports = new BN(Math.floor(solAmount * LAMPORTS_PER_SOL));\n\n // Always derive auto-withdraw accounts so they're available when curve completes\n // These are optional accounts - the program only uses them when curve hits 100%\n const [streamerVaultPda] = PublicKey.findProgramAddressSync(\n [Buffer.from(\"vault\")],\n STREAMER_PROGRAM_ID\n );\n const streamerVault = streamerVaultPda;\n const streamerTokenAccount = getAssociatedTokenAddressSync(mint, streamerVaultPda, true);\n const adminTokenAccount = getAssociatedTokenAddressSync(mint, ADMIN_WALLET, true);\n\n const preInstructions: TransactionInstruction[] = [];\n const computeUnits = options?.computeUnits || 400_000;\n preInstructions.push(\n ComputeBudgetProgram.setComputeUnitLimit({ units: computeUnits })\n );\n\n // Pre-create ATAs for auto-withdraw (idempotent — no-op if already exists)\n preInstructions.push(\n createAssociatedTokenAccountIdempotentInstruction(\n this.wallet.publicKey, streamerTokenAccount, streamerVaultPda, mint\n )\n );\n preInstructions.push(\n createAssociatedTokenAccountIdempotentInstruction(\n this.wallet.publicKey, adminTokenAccount, ADMIN_WALLET, mint\n )\n );\n\n const tx = await this.program.methods\n .buyTokens(solLamports)\n .accountsPartial({\n contributor: this.wallet.publicKey,\n launchpad: this.launchpadPda,\n adminWallet: ADMIN_WALLET,\n tokenLaunch: addresses.tokenLaunch,\n bondingCurve: addresses.bondingCurve,\n mint: mint,\n vault: addresses.vault,\n curveTokenAccount: addresses.curveTokenAccount,\n userTokenAccount: userTokenAccount,\n userPosition: userPosition,\n systemProgram: SystemProgram.programId,\n tokenProgram: TOKEN_PROGRAM_ID,\n associatedTokenProgram: ASSOCIATED_TOKEN_PROGRAM_ID,\n streamerVault: streamerVault,\n streamerTokenAccount: streamerTokenAccount,\n adminTokenAccount: adminTokenAccount,\n })\n .preInstructions(preInstructions)\n .rpc();\n\n // Get state after\n const curveAfter = await this.program.account.bondingCurve.fetch(addresses.bondingCurve);\n const tokensAfter = (await getAccount(this.connection, userTokenAccount)).amount;\n\n const tokensReceived = tokensAfter - tokensBefore;\n const progress = Number(curveAfter.soldSupply.toString()) / Number(curveAfter.tokensForCurve.toString()) * 100;\n\n return {\n txSignature: tx,\n tokensTraded: tokensReceived,\n solTraded: BigInt(solLamports.toString()),\n newProgress: progress,\n isCurveComplete: curveAfter.complete,\n };\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // Sell Tokens\n // ═══════════════════════════════════════════════════════════════════════════\n\n async sell(\n mint: PublicKey,\n tokenAmount: number, // In tokens (e.g., 1000000 for 1M tokens)\n minSolOut: number = 0, // Minimum SOL to receive (slippage protection)\n options?: { computeUnits?: number }\n ): Promise<TradeResult> {\n const addresses = this.deriveAddresses(mint);\n const userTokenAccount = getAssociatedTokenAddressSync(mint, this.wallet.publicKey);\n const userPosition = this.deriveUserPosition(addresses.tokenLaunch, this.wallet.publicKey);\n\n // Get state before\n const curveBefore = await this.program.account.bondingCurve.fetch(addresses.bondingCurve);\n const walletBefore = await this.connection.getBalance(this.wallet.publicKey);\n\n const tokensRaw = new BN(tokenAmount).mul(new BN(10 ** TOKEN_DECIMALS));\n const minSolLamports = new BN(Math.floor(minSolOut * LAMPORTS_PER_SOL));\n\n const preInstructions: TransactionInstruction[] = [];\n if (options?.computeUnits) {\n preInstructions.push(\n ComputeBudgetProgram.setComputeUnitLimit({ units: options.computeUnits })\n );\n }\n\n const tx = await this.program.methods\n .sellTokens(tokensRaw, minSolLamports)\n .accountsPartial({\n contributor: this.wallet.publicKey,\n launchpad: this.launchpadPda,\n adminWallet: ADMIN_WALLET,\n tokenLaunch: addresses.tokenLaunch,\n bondingCurve: addresses.bondingCurve,\n mint: mint,\n vault: addresses.vault,\n curveTokenAccount: addresses.curveTokenAccount,\n userTokenAccount: userTokenAccount,\n userPosition: userPosition,\n systemProgram: SystemProgram.programId,\n tokenProgram: TOKEN_PROGRAM_ID,\n })\n .preInstructions(preInstructions)\n .rpc();\n\n // Get state after\n const curveAfter = await this.program.account.bondingCurve.fetch(addresses.bondingCurve);\n const walletAfter = await this.connection.getBalance(this.wallet.publicKey);\n\n const solReceived = BigInt(walletAfter - walletBefore);\n const progress = Number(curveAfter.soldSupply.toString()) / Number(curveAfter.tokensForCurve.toString()) * 100;\n\n return {\n txSignature: tx,\n tokensTraded: BigInt(tokensRaw.toString()),\n solTraded: solReceived,\n newProgress: progress,\n isCurveComplete: curveAfter.complete,\n };\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // Admin Withdraw\n // ═══════════════════════════════════════════════════════════════════════════\n\n async adminWithdraw(mint: PublicKey): Promise<{\n txSignature: string;\n solWithdrawn: bigint;\n tokensWithdrawn: bigint;\n feesToTreasury: bigint;\n treasuryTokens: bigint;\n }> {\n const addresses = this.deriveAddresses(mint);\n const adminTokenAccount = getAssociatedTokenAddressSync(mint, this.wallet.publicKey);\n\n // Get launchpad to find treasury\n const launchpad = await this.program.account.launchpad.fetch(this.launchpadPda);\n const treasuryWallet = launchpad.treasury;\n const treasuryTokenAccount = getAssociatedTokenAddressSync(mint, treasuryWallet, true);\n\n // Get state before\n const curve = await this.program.account.bondingCurve.fetch(addresses.bondingCurve);\n const lpSol = BigInt(curve.realSolReserves.toString());\n const lpTokens = BigInt(curve.tokenReservesForLp.toString());\n const accumulatedFees = BigInt(curve.accumulatedFees.toString());\n const treasuryTokensAmount = BigInt(curve.tokenReservesForTreasury.toString());\n\n const tx = await this.program.methods\n .adminWithdraw()\n .accountsPartial({\n admin: this.wallet.publicKey,\n launchpad: this.launchpadPda,\n tokenLaunch: addresses.tokenLaunch,\n bondingCurve: addresses.bondingCurve,\n mint: mint,\n vault: addresses.vault,\n curveTokenAccount: addresses.curveTokenAccount,\n adminTokenAccount: adminTokenAccount,\n treasuryWallet: treasuryWallet,\n treasuryTokenAccount: treasuryTokenAccount,\n systemProgram: SystemProgram.programId,\n tokenProgram: TOKEN_PROGRAM_ID,\n associatedTokenProgram: ASSOCIATED_TOKEN_PROGRAM_ID,\n })\n .rpc();\n\n return {\n txSignature: tx,\n solWithdrawn: lpSol,\n tokensWithdrawn: lpTokens,\n feesToTreasury: accumulatedFees,\n treasuryTokens: treasuryTokensAmount,\n };\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // Estimate Buy (input SOL → output tokens)\n // ═══════════════════════════════════════════════════════════════════════════\n\n async estimateBuy(mint: PublicKey, solAmount: number): Promise<EstimateBuyResult> {\n const addresses = this.deriveAddresses(mint);\n const curve = await this.program.account.bondingCurve.fetch(addresses.bondingCurve);\n\n const k = BigInt(curve.k.toString());\n const soldSupply = BigInt(curve.soldSupply.toString());\n const tokensForCurve = BigInt(curve.tokensForCurve.toString());\n\n const solIn = BigInt(Math.floor(solAmount * LAMPORTS_PER_SOL));\n\n // Deduct 1% fee first\n const fee = solIn / 100n;\n const solAfterFee = solIn - fee;\n\n // Calculate tokens out\n const tokensOut = this.calculateTokensForSol(k, soldSupply, solAfterFee);\n\n // Cap at available\n const available = tokensForCurve - soldSupply;\n const actualTokensOut = tokensOut > available ? available : tokensOut;\n\n // Calculate price per token\n const tokenUnits = actualTokensOut / BigInt(10 ** TOKEN_DECIMALS);\n const pricePerToken = tokenUnits > 0n ? solAfterFee / tokenUnits : 0n;\n\n // Calculate price impact\n const newSoldSupply = soldSupply + actualTokensOut;\n const priceBefore = this.calculatePrice(k, soldSupply);\n const priceAfter = this.calculatePrice(k, newSoldSupply);\n const priceImpactBps = priceBefore > 0n\n ? Number((priceAfter - priceBefore) * 10000n / priceBefore)\n : 0;\n\n return { solIn, solAfterFee, tokensOut: actualTokensOut, fee, pricePerToken, priceImpactBps };\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // Estimate Buy by Tokens (input tokens → output SOL needed)\n // ═══════════════════════════════════════════════════════════════════════════\n\n async estimateBuyByTokens(mint: PublicKey, tokenAmount: number): Promise<EstimateBuyResult> {\n const addresses = this.deriveAddresses(mint);\n const curve = await this.program.account.bondingCurve.fetch(addresses.bondingCurve);\n\n const k = BigInt(curve.k.toString());\n const soldSupply = BigInt(curve.soldSupply.toString());\n const tokensForCurve = BigInt(curve.tokensForCurve.toString());\n\n const tokensRaw = BigInt(Math.floor(tokenAmount)) * BigInt(10 ** TOKEN_DECIMALS);\n\n // Cap at available\n const available = tokensForCurve - soldSupply;\n const actualTokensOut = tokensRaw > available ? available : tokensRaw;\n\n // Calculate gross SOL cost (before fee)\n const solAfterFee = this.calculateCost(k, soldSupply, soldSupply + actualTokensOut);\n\n // Add 1% fee on top: user pays solAfterFee / 0.99\n const solIn = solAfterFee * 100n / 99n;\n const fee = solIn - solAfterFee;\n\n // Calculate price per token (lamports per display token)\n const tokenUnits = actualTokensOut / BigInt(10 ** TOKEN_DECIMALS);\n const pricePerToken = tokenUnits > 0n ? solAfterFee / tokenUnits : 0n;\n\n // Calculate price impact\n const newSoldSupply = soldSupply + actualTokensOut;\n const priceBefore = this.calculatePrice(k, soldSupply);\n const priceAfter = this.calculatePrice(k, newSoldSupply);\n const priceImpactBps = priceBefore > 0n\n ? Number((priceAfter - priceBefore) * 10000n / priceBefore)\n : 0;\n\n return { solIn, solAfterFee, tokensOut: actualTokensOut, fee, pricePerToken, priceImpactBps };\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // Estimate Sell (input tokens → output SOL)\n // ═══════════════════════════════════════════════════════════════════════════\n\n async estimateSell(mint: PublicKey, tokenAmount: number): Promise<EstimateSellResult> {\n const addresses = this.deriveAddresses(mint);\n const curve = await this.program.account.bondingCurve.fetch(addresses.bondingCurve);\n\n const k = BigInt(curve.k.toString());\n const soldSupply = BigInt(curve.soldSupply.toString());\n const realSolReserves = BigInt(curve.realSolReserves.toString());\n\n // Floor to handle decimal inputs safely (BigInt cannot accept floats)\n const tokensIn = BigInt(Math.floor(tokenAmount)) * BigInt(10 ** TOKEN_DECIMALS);\n\n // Can't sell more than sold\n if (tokensIn > soldSupply) {\n throw new Error(`Cannot sell ${tokenAmount} tokens. Only ${soldSupply / BigInt(10 ** TOKEN_DECIMALS)} available.`);\n }\n\n // Calculate gross SOL refund\n const grossRefund = this.calculateRefund(k, soldSupply, soldSupply - tokensIn);\n\n // Cap at available SOL\n const solBeforeFee = grossRefund > realSolReserves ? realSolReserves : grossRefund;\n\n // Deduct 1% fee\n const fee = solBeforeFee / 100n;\n const solOut = solBeforeFee - fee;\n\n // Calculate price per token (lamports per display token)\n const tokenDisplayAmount = BigInt(Math.floor(tokenAmount));\n const pricePerToken = tokenDisplayAmount > 0n ? solOut / tokenDisplayAmount : 0n;\n\n // Calculate price impact\n const newSoldSupply = soldSupply - tokensIn;\n const priceBefore = this.calculatePrice(k, soldSupply);\n const priceAfter = this.calculatePrice(k, newSoldSupply);\n const priceImpactBps = priceBefore > 0n\n ? Number((priceBefore - priceAfter) * 10000n / priceBefore)\n : 0;\n\n return { tokensIn, solBeforeFee, solOut, fee, pricePerToken, priceImpactBps };\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // Estimate Sell by SOL (input SOL desired → output tokens to sell)\n // ═══════════════════════════════════════════════════════════════════════════\n\n async estimateSellBySol(mint: PublicKey, solAmount: number): Promise<EstimateSellResult> {\n const addresses = this.deriveAddresses(mint);\n const curve = await this.program.account.bondingCurve.fetch(addresses.bondingCurve);\n\n const k = BigInt(curve.k.toString());\n const soldSupply = BigInt(curve.soldSupply.toString());\n const realSolReserves = BigInt(curve.realSolReserves.toString());\n\n const solDesired = BigInt(Math.floor(solAmount * LAMPORTS_PER_SOL));\n\n // Reverse fee: user wants solDesired after fee, so gross = solDesired / 0.99\n const solBeforeFee = solDesired * 100n / 99n;\n\n // Cap at available SOL reserves\n const cappedGross = solBeforeFee > realSolReserves ? realSolReserves : solBeforeFee;\n\n // Calculate tokens needed to sell\n const tokensIn = this.calculateTokensForSolSell(k, soldSupply, cappedGross);\n\n // Cap at sold supply\n const actualTokensIn = tokensIn > soldSupply ? soldSupply : tokensIn;\n\n // Recalculate actual SOL from capped tokens\n const actualGross = this.calculateRefund(k, soldSupply, soldSupply - actualTokensIn);\n const actualSolBeforeFee = actualGross > realSolReserves ? realSolReserves : actualGross;\n const fee = actualSolBeforeFee / 100n;\n const solOut = actualSolBeforeFee - fee;\n\n // Calculate price per token\n const tokenUnits = actualTokensIn / BigInt(10 ** TOKEN_DECIMALS);\n const pricePerToken = tokenUnits > 0n ? solOut / tokenUnits : 0n;\n\n // Calculate price impact\n const newSoldSupply = soldSupply - actualTokensIn;\n const priceBefore = this.calculatePrice(k, soldSupply);\n const priceAfter = this.calculatePrice(k, newSoldSupply);\n const priceImpactBps = priceBefore > 0n\n ? Number((priceBefore - priceAfter) * 10000n / priceBefore)\n : 0;\n\n return { tokensIn: actualTokensIn, solBeforeFee: actualSolBeforeFee, solOut, fee, pricePerToken, priceImpactBps };\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // Get Curve State\n // ═══════════════════════════════════════════════════════════════════════════\n\n async getCurveState(mint: PublicKey): Promise<BondingCurveState> {\n const addresses = this.deriveAddresses(mint);\n const curve = await this.program.account.bondingCurve.fetch(addresses.bondingCurve);\n\n return {\n tokenLaunch: curve.tokenLaunch,\n k: BigInt(curve.k.toString()),\n totalSupply: BigInt(curve.totalSupply.toString()),\n soldSupply: BigInt(curve.soldSupply.toString()),\n realSolReserves: BigInt(curve.realSolReserves.toString()),\n tokenReservesForLp: BigInt(curve.tokenReservesForLp.toString()),\n tokenReservesForTreasury: BigInt(curve.tokenReservesForTreasury.toString()),\n tokensForCurve: BigInt(curve.tokensForCurve.toString()),\n accumulatedFees: BigInt(curve.accumulatedFees.toString()),\n complete: curve.complete,\n bump: curve.bump,\n };\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // Get Token Launch State\n // ═══════════════════════════════════════════════════════════════════════════\n\n async getTokenLaunchState(mint: PublicKey): Promise<TokenLaunchState> {\n const addresses = this.deriveAddresses(mint);\n const launch = await this.program.account.tokenLaunch.fetch(addresses.tokenLaunch);\n\n return {\n creator: launch.creator,\n mint: launch.mint,\n vault: launch.vault,\n bondingCurve: launch.bondingCurve,\n totalSupply: BigInt(launch.totalSupply.toString()),\n curveAllocation: BigInt(launch.curveAllocation.toString()),\n lpAllocation: BigInt(launch.lpAllocation.toString()),\n treasuryAllocation: BigInt(launch.treasuryAllocation.toString()),\n totalSolRaised: BigInt(launch.totalSolRaised.toString()),\n tradingActive: launch.tradingActive,\n migrated: launch.migrated,\n initialK: BigInt(launch.initialK.toString()),\n name: launch.name,\n symbol: launch.symbol,\n };\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // Get Progress\n // ═══════════════════════════════════════════════════════════════════════════\n\n async getProgress(mint: PublicKey): Promise<{\n percent: number;\n soldSupply: bigint;\n tokensForCurve: bigint;\n solRaised: bigint;\n currentPrice: bigint;\n currentPriceSol: number;\n isComplete: boolean;\n }> {\n const curve = await this.getCurveState(mint);\n\n // Use 10000x multiplier then divide by 100 for 2 decimal places precision\n const percent = Number(curve.soldSupply * 10000n / curve.tokensForCurve) / 100;\n const currentPrice = this.calculatePrice(curve.k, curve.soldSupply);\n const currentPriceSol = this.calculatePriceSol(curve.k, curve.soldSupply);\n\n return {\n percent,\n soldSupply: curve.soldSupply,\n tokensForCurve: curve.tokensForCurve,\n solRaised: curve.realSolReserves,\n currentPrice,\n currentPriceSol,\n isComplete: curve.complete,\n };\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // Initial Price (for candlestick chart open price)\n // ═══════════════════════════════════════════════════════════════════════════\n\n /**\n * Get the initial/starting price for a token launch.\n * Linear curve starts at price=0, so this returns the theoretical price\n * after 1 display token is sold — useful as the \"open\" price for the first candle.\n */\n async getInitialPrice(mint: PublicKey): Promise<{\n priceLamports: bigint;\n priceSol: number;\n }> {\n const curve = await this.getCurveState(mint);\n const oneTokenRaw = BigInt(10 ** TOKEN_DECIMALS);\n return {\n priceLamports: this.calculatePrice(curve.k, oneTokenRaw),\n priceSol: this.calculatePriceSol(curve.k, oneTokenRaw),\n };\n }\n\n /**\n * Get the price at any given sold supply (display tokens).\n * Useful for calculating open/close prices on candlestick charts.\n */\n getPriceAtSupply(k: bigint, soldDisplayTokens: number): {\n priceLamports: bigint;\n priceSol: number;\n } {\n const supplyRaw = BigInt(Math.floor(soldDisplayTokens)) * BigInt(10 ** TOKEN_DECIMALS);\n return {\n priceLamports: this.calculatePrice(k, supplyRaw),\n priceSol: this.calculatePriceSol(k, supplyRaw),\n };\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // Event Listeners\n // ═══════════════════════════════════════════════════════════════════════════\n\n /**\n * Listen for LaunchCreated events\n * @param callback Function to call when event is emitted\n * @returns Listener ID for removal\n */\n onLaunchCreated(callback: EventCallback<LaunchCreatedEvent>): number {\n return this.program.addEventListener(\"launchCreated\", (event: any, slot: number, signature: string) => {\n callback({\n tokenLaunch: event.tokenLaunch,\n mint: event.mint,\n creator: event.creator,\n name: event.name,\n symbol: event.symbol,\n totalSupply: BigInt(event.totalSupply.toString()),\n curveAllocation: BigInt(event.curveAllocation.toString()),\n lpAllocation: BigInt(event.lpAllocation.toString()),\n treasuryAllocation: BigInt(event.treasuryAllocation.toString()),\n initialK: BigInt(event.initialK.toString()),\n initialPrice: BigInt(event.initialPrice.toString()),\n timestamp: BigInt(event.timestamp.toString()),\n }, slot, signature);\n });\n }\n\n /**\n * Listen for TokensPurchased events\n * @param callback Function to call when event is emitted\n * @returns Listener ID for removal\n */\n onTokensPurchased(callback: EventCallback<TokensPurchasedEvent>): number {\n return this.program.addEventListener(\"tokensPurchased\", (event: any, slot: number, signature: string) => {\n callback({\n tokenLaunch: event.tokenLaunch,\n mint: event.mint,\n buyer: event.buyer,\n solAmount: BigInt(event.solAmount.toString()),\n solAfterFees: BigInt(event.solAfterFees.toString()),\n tokensReceived: BigInt(event.tokensReceived.toString()),\n curveFee: BigInt(event.curveFee.toString()),\n adminFee: BigInt(event.adminFee.toString()),\n priceAfter: BigInt(event.priceAfter.toString()),\n totalSold: BigInt(event.totalSold.toString()),\n progress: event.progress,\n timestamp: BigInt(event.timestamp.toString()),\n isCurveComplete: event.isCurveComplete,\n }, slot, signature);\n });\n }\n\n /**\n * Listen for TokensSold events\n * @param callback Function to call when event is emitted\n * @returns Listener ID for removal\n */\n onTokensSold(callback: EventCallback<TokensSoldEvent>): number {\n return this.program.addEventListener(\"tokensSold\", (event: any, slot: number, signature: string) => {\n callback({\n tokenLaunch: event.tokenLaunch,\n mint: event.mint,\n seller: event.seller,\n tokensSold: BigInt(event.tokensSold.toString()),\n grossSolRefund: BigInt(event.grossSolRefund.toString()),\n netSolRefund: BigInt(event.netSolRefund.toString()),\n curveFee: BigInt(event.curveFee.toString()),\n adminFee: BigInt(event.adminFee.toString()),\n priceAfter: BigInt(event.priceAfter.toString()),\n totalSold: BigInt(event.totalSold.toString()),\n progress: event.progress,\n timestamp: BigInt(event.timestamp.toString()),\n }, slot, signature);\n });\n }\n\n /**\n * Listen for CurveComplete events\n * @param callback Function to call when event is emitted\n * @returns Listener ID for removal\n */\n onCurveComplete(callback: EventCallback<CurveCompleteEvent>): number {\n return this.program.addEventListener(\"curveComplete\", (event: any, slot: number, signature: string) => {\n callback({\n tokenLaunch: event.tokenLaunch,\n mint: event.mint,\n totalSolRaised: BigInt(event.totalSolRaised.toString()),\n finalPrice: BigInt(event.finalPrice.toString()),\n timestamp: BigInt(event.timestamp.toString()),\n }, slot, signature);\n });\n }\n\n /**\n * Listen for AdminWithdraw events\n * @param callback Function to call when event is emitted\n * @returns Listener ID for removal\n */\n onAdminWithdraw(callback: EventCallback<AdminWithdrawEvent>): number {\n return this.program.addEventListener(\"adminWithdraw\", (event: any, slot: number, signature: string) => {\n callback({\n tokenLaunch: event.tokenLaunch,\n mint: event.mint,\n admin: event.admin,\n creator: event.creator,\n treasury: event.treasury,\n solWithdrawn: BigInt(event.solWithdrawn.toString()),\n tokensWithdrawn: BigInt(event.tokensWithdrawn.toString()),\n feesToTreasury: BigInt(event.feesToTreasury.toString()),\n treasuryTokens: BigInt(event.treasuryTokens.toString()),\n timestamp: BigInt(event.timestamp.toString()),\n }, slot, signature);\n });\n }\n\n /**\n * Remove an event listener\n * @param listenerId The ID returned from addEventListener\n */\n async removeEventListener(listenerId: number): Promise<void> {\n await this.program.removeEventListener(listenerId);\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // Math Helpers (Pure functions, no async)\n // ═══════════════════════════════════════════════════════════════════════════\n\n /** Calculate price at a given supply in lamports per display token.\n * Formula: price = k × supply × 10^DECIMALS / K_SCALE\n * Returns lamports per 1 display token (not per raw token). */\n calculatePrice(k: bigint, supply: bigint): bigint {\n if (supply === 0n) return 0n;\n return (k * supply * BigInt(10 ** TOKEN_DECIMALS)) / K_SCALE;\n }\n\n /** Calculate price per display token in SOL (float).\n * Useful for charts where sub-lamport precision matters. */\n calculatePriceSol(k: bigint, supply: bigint): number {\n if (supply === 0n) return 0;\n // price_sol = k * supply_raw * 10^DECIMALS / K_SCALE / LAMPORTS_PER_SOL\n // = k * supply_raw / (K_SCALE / 10^DECIMALS / LAMPORTS_PER_SOL)\n // = k * supply_raw / 10^25\n return Number(k) * Number(supply) / 1e25;\n }\n\n /** Calculate cost to buy from s1 to s2: cost = (k/2) × (s2² - s1²) / K_SCALE */\n calculateCost(k: bigint, s1: bigint, s2: bigint): bigint {\n if (s2 <= s1) return 0n;\n const s1Sq = s1 * s1;\n const s2Sq = s2 * s2;\n const diffSq = s2Sq - s1Sq;\n return (k * diffSq) / 2n / K_SCALE;\n }\n\n /** Calculate tokens received for SOL: s2 = sqrt(s1² + 2×sol×K_SCALE/k) */\n calculateTokensForSol(k: bigint, currentSupply: bigint, solIn: bigint): bigint {\n if (solIn === 0n || k === 0n) return 0n;\n\n const s1Sq = currentSupply * currentSupply;\n const addition = (2n * solIn * K_SCALE) / k;\n const s2Sq = s1Sq + addition;\n const s2 = this.isqrt(s2Sq);\n\n return s2 - currentSupply;\n }\n\n /** Calculate tokens to sell to receive target SOL: inverse of refund formula\n * s2 = sqrt(s1² - 2×solOut×K_SCALE/k), return s1 - s2 */\n calculateTokensForSolSell(k: bigint, currentSupply: bigint, solOut: bigint): bigint {\n if (solOut === 0n || k === 0n) return 0n;\n\n const s1Sq = currentSupply * currentSupply;\n const subtraction = (2n * solOut * K_SCALE) / k;\n\n // If subtraction exceeds s1², need to sell all tokens\n if (subtraction >= s1Sq) return currentSupply;\n\n const s2Sq = s1Sq - subtraction;\n const s2 = this.isqrt(s2Sq);\n\n return currentSupply - s2;\n }\n\n /** Calculate refund for selling tokens: refund = (k/2) × (s1² - s2²) / K_SCALE */\n calculateRefund(k: bigint, s1: bigint, s2: bigint): bigint {\n if (s1 <= s2) return 0n;\n const s1Sq = s1 * s1;\n const s2Sq = s2 * s2;\n const diffSq = s1Sq - s2Sq;\n return (k * diffSq) / 2n / K_SCALE;\n }\n\n /** Integer square root using Newton's method */\n isqrt(n: bigint): bigint {\n if (n === 0n) return 0n;\n if (n === 1n) return 1n;\n\n let x = n;\n let y = (x + 1n) / 2n;\n\n while (y < x) {\n x = y;\n y = (x + n / x) / 2n;\n }\n\n return x;\n }\n\n /** Calculate K for a given target SOL and curve supply */\n static calculateK(curveSupply: bigint, targetSol: bigint): bigint {\n // k = 2 × target_sol × K_SCALE / curve_supply²\n const numerator = 2n * targetSol * K_SCALE;\n const denominator = curveSupply * curveSupply;\n return numerator / denominator;\n }\n}\n\n// ═══════════════════════════════════════════════════════════════════════════\n// StreamerSDK Class\n// ═══════════════════════════════════════════════════════════════════════════\n\n// Keypair-based (server-side / test)\nexport interface RegisterStreamerParams {\n streamerId: string;\n streamerKeypair: Keypair;\n}\n\n// Signature-based (browser wallet / Phantom)\nexport interface RegisterStreamerWithSignatureParams {\n streamerId: string;\n streamerPublicKey: PublicKey;\n signature: Uint8Array;\n timestamp: number;\n}\n\nexport interface RegisterStreamerResult {\n txSignature: string;\n streamerRegistrationPda: PublicKey;\n}\n\n// Keypair-based (server-side / test)\nexport interface ClaimFundsParams {\n streamerId: string;\n streamerKeypair: Keypair;\n mint: PublicKey;\n solAmount: BN;\n tokenAmount: BN;\n}\n\n// Signature-based (browser wallet / Phantom)\nexport interface ClaimFundsWithSignatureParams {\n streamerId: string;\n streamerPublicKey: PublicKey;\n mint: PublicKey;\n solAmount: BN;\n tokenAmount: BN;\n signature: Uint8Array;\n timestamp: number;\n}\n\nexport interface ClaimFundsResult {\n txSignature: string;\n}\n\nexport class StreamerSDK {\n public program: Program<any>;\n public connection: Connection;\n public wallet: anchor.Wallet;\n\n constructor(program: Program<any>, wallet: anchor.Wallet) {\n this.program = program;\n this.connection = program.provider.connection;\n this.wallet = wallet;\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // PDA Derivation Helpers\n // ═══════════════════════════════════════════════════════════════════════════\n\n derivePlatformConfig(): PublicKey {\n const [pda] = PublicKey.findProgramAddressSync(\n [Buffer.from(\"platform_config\")],\n this.program.programId\n );\n return pda;\n }\n\n deriveWhitelistEntry(wallet: PublicKey): PublicKey {\n const [pda] = PublicKey.findProgramAddressSync(\n [Buffer.from(\"whitelist\"), wallet.toBuffer()],\n this.program.programId\n );\n return pda;\n }\n\n deriveStreamerRegistration(streamerId: string): PublicKey {\n const [pda] = PublicKey.findProgramAddressSync(\n [Buffer.from(\"streamer\"), Buffer.from(streamerId)],\n this.program.programId\n );\n return pda;\n }\n\n deriveVault(): PublicKey {\n const [pda] = PublicKey.findProgramAddressSync(\n [Buffer.from(\"vault\")],\n this.program.programId\n );\n return pda;\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // Helpers\n // ═══════════════════════════════════════════════════════════════════════════\n\n async getSolanaTimestamp(): Promise<number> {\n const slot = await this.connection.getSlot();\n const blockTime = await this.connection.getBlockTime(slot);\n if (!blockTime) throw new Error(\"Failed to get block time\");\n return blockTime;\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // Ed25519 Signing Utilities (for browser wallets / external signers)\n // ═══════════════════════════════════════════════════════════════════════════\n\n /**\n * Build the message that the streamer must sign for register_streamer.\n * The streamer signs this with their wallet (e.g. Phantom signMessage).\n *\n * Format: \"register_streamer:{streamer_id}:{wallet}:{timestamp}\"\n */\n buildRegisterMessage(\n streamerId: string,\n streamerWallet: PublicKey,\n timestamp: number\n ): Uint8Array {\n const msg = `register_streamer:${streamerId}:${streamerWallet.toBase58()}:${timestamp}`;\n return Buffer.from(msg, \"utf-8\");\n }\n\n /**\n * Build the message that the streamer must sign for claim_funds.\n * The streamer signs this with their wallet (e.g. Phantom signMessage).\n *\n * Format: \"claim_funds:{streamer_id}:{wallet}:{mint}:{token_amount}:{sol_amount}:{timestamp}\"\n */\n buildClaimMessage(\n streamerId: string,\n streamerWallet: PublicKey,\n mint: PublicKey,\n tokenAmount: BN,\n solAmount: BN,\n timestamp: number\n ): Uint8Array {\n const msg = `claim_funds:${streamerId}:${streamerWallet.toBase58()}:${mint.toBase58()}:${tokenAmount.toString()}:${solAmount.toString()}:${timestamp}`;\n return Buffer.from(msg, \"utf-8\");\n }\n\n /**\n * Create an Ed25519 instruction from an externally-signed signature.\n * Use this when the streamer signs via browser wallet (Phantom, Solflare, etc.)\n * instead of exposing a Keypair.\n *\n * @param streamerWallet - Public key of the streamer\n * @param message - The message bytes (from buildRegisterMessage / buildClaimMessage)\n * @param signature - The Ed25519 signature from wallet.signMessage(message)\n */\n createEd25519Instruction(\n streamerWallet: PublicKey,\n message: Uint8Array,\n signature: Uint8Array\n ): TransactionInstruction {\n return Ed25519Program.createInstructionWithPublicKey({\n publicKey: streamerWallet.toBytes(),\n message,\n signature,\n });\n }\n\n /**\n * Sign a message using a Keypair directly (server-side / test usage).\n * Returns the Ed25519 signature bytes.\n */\n static signMessage(message: Uint8Array, keypair: Keypair): Uint8Array {\n return nacl.sign.detached(message, keypair.secretKey);\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // Register Streamer\n // ═══════════════════════════════════════════════════════════════════════════\n\n async registerStreamer(\n params: RegisterStreamerParams\n ): Promise<RegisterStreamerResult> {\n const { streamerId, streamerKeypair } = params;\n\n const timestamp = await this.getSolanaTimestamp();\n\n const msgBytes = this.buildRegisterMessage(streamerId, streamerKeypair.publicKey, timestamp);\n const sig = StreamerSDK.signMessage(msgBytes, streamerKeypair);\n const ed25519Ix = this.createEd25519Instruction(streamerKeypair.publicKey, msgBytes, sig);\n\n const whitelistPda = this.deriveWhitelistEntry(this.wallet.publicKey);\n const streamerRegPda = this.deriveStreamerRegistration(streamerId);\n\n const registerIx = await (this.program.methods as any)\n .registerStreamer(\n streamerId,\n streamerKeypair.publicKey,\n new BN(timestamp)\n )\n .accounts({\n caller: this.wallet.publicKey,\n whitelistEntry: whitelistPda,\n streamerRegistration: streamerRegPda,\n instructionsSysvar: SYSVAR_INSTRUCTIONS_PUBKEY,\n })\n .instruction();\n\n const tx = new Transaction().add(ed25519Ix).add(registerIx);\n const provider = this.program.provider as anchor.AnchorProvider;\n const txSignature = await provider.sendAndConfirm(tx);\n\n return { txSignature, streamerRegistrationPda: streamerRegPda };\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // Claim Funds\n // ═══════════════════════════════════════════════════════════════════════════\n\n async claimFunds(params: ClaimFundsParams): Promise<ClaimFundsResult> {\n const { streamerId, streamerKeypair, mint, solAmount, tokenAmount } =\n params;\n\n const timestamp = await this.getSolanaTimestamp();\n\n const msgBytes = this.buildClaimMessage(streamerId, streamerKeypair.publicKey, mint, tokenAmount, solAmount, timestamp);\n const sig = StreamerSDK.signMessage(msgBytes, streamerKeypair);\n const ed25519Ix = this.createEd25519Instruction(streamerKeypair.publicKey, msgBytes, sig);\n\n const whitelistPda = this.deriveWhitelistEntry(this.wallet.publicKey);\n const streamerRegPda = this.deriveStreamerRegistration(streamerId);\n const vaultPda = this.deriveVault();\n const programTokenAccount = getAssociatedTokenAddressSync(\n mint,\n vaultPda,\n true\n );\n const streamerTokenAccount = getAssociatedTokenAddressSync(\n mint,\n streamerKeypair.publicKey,\n false\n );\n\n const claimIx = await (this.program.methods as any)\n .claimFunds(streamerId, solAmount, tokenAmount, new BN(timestamp))\n .accounts({\n caller: this.wallet.publicKey,\n whitelistEntry: whitelistPda,\n streamerRegistration: streamerRegPda,\n streamerWallet: streamerKeypair.publicKey,\n vault: vaultPda,\n mint,\n programTokenAccount,\n streamerTokenAccount,\n instructionsSysvar: SYSVAR_INSTRUCTIONS_PUBKEY,\n })\n .instruction();\n\n const tx = new Transaction().add(ed25519Ix).add(claimIx);\n const provider = this.program.provider as anchor.AnchorProvider;\n const txSignature = await provider.sendAndConfirm(tx);\n\n return { txSignature };\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // Register Streamer (browser wallet — signature from Phantom/Solflare)\n // ═══════════════════════════════════════════════════════════════════════════\n\n async registerStreamerWithSignature(\n params: RegisterStreamerWithSignatureParams\n ): Promise<RegisterStreamerResult> {\n const { streamerId, streamerPublicKey, signature, timestamp } = params;\n\n const msgBytes = this.buildRegisterMessage(streamerId, streamerPublicKey, timestamp);\n const ed25519Ix = this.createEd25519Instruction(streamerPublicKey, msgBytes, signature);\n\n const whitelistPda = this.deriveWhitelistEntry(this.wallet.publicKey);\n const streamerRegPda = this.deriveStreamerRegistration(streamerId);\n\n const registerIx = await (this.program.methods as any)\n .registerStreamer(streamerId, streamerPublicKey, new BN(timestamp))\n .accounts({\n caller: this.wallet.publicKey,\n whitelistEntry: whitelistPda,\n streamerRegistration: streamerRegPda,\n instructionsSysvar: SYSVAR_INSTRUCTIONS_PUBKEY,\n })\n .instruction();\n\n const tx = new Transaction().add(ed25519Ix).add(registerIx);\n const provider = this.program.provider as anchor.AnchorProvider;\n const txSignature = await provider.sendAndConfirm(tx);\n\n return { txSignature, streamerRegistrationPda: streamerRegPda };\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // Claim Funds (browser wallet — signature from Phantom/Solflare)\n // ═══════════════════════════════════════════════════════════════════════════\n\n async claimFundsWithSignature(\n params: ClaimFundsWithSignatureParams\n ): Promise<ClaimFundsResult> {\n const { streamerId, streamerPublicKey, mint, solAmount, tokenAmount, signature, timestamp } = params;\n\n const msgBytes = this.buildClaimMessage(streamerId, streamerPublicKey, mint, tokenAmount, solAmount, timestamp);\n const ed25519Ix = this.createEd25519Instruction(streamerPublicKey, msgBytes, signature);\n\n const whitelistPda = this.deriveWhitelistEntry(this.wallet.publicKey);\n const streamerRegPda = this.deriveStreamerRegistration(streamerId);\n const vaultPda = this.deriveVault();\n const programTokenAccount = getAssociatedTokenAddressSync(mint, vaultPda, true);\n const streamerTokenAccount = getAssociatedTokenAddressSync(mint, streamerPublicKey, false);\n\n const claimIx = await (this.program.methods as any)\n .claimFunds(streamerId, solAmount, tokenAmount, new BN(timestamp))\n .accounts({\n caller: this.wallet.publicKey,\n whitelistEntry: whitelistPda,\n streamerRegistration: streamerRegPda,\n streamerWallet: streamerPublicKey,\n vault: vaultPda,\n mint,\n programTokenAccount,\n streamerTokenAccount,\n instructionsSysvar: SYSVAR_INSTRUCTIONS_PUBKEY,\n })\n .instruction();\n\n const tx = new Transaction().add(ed25519Ix).add(claimIx);\n const provider = this.program.provider as anchor.AnchorProvider;\n const txSignature = await provider.sendAndConfirm(tx);\n\n return { txSignature };\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // Read State\n // ═══════════════════════════════════════════════════════════════════════════\n\n async getStreamerRegistration(\n streamerId: string\n ): Promise<{\n streamerId: string;\n wallet: PublicKey;\n verifiedAt: number;\n registeredBy: PublicKey;\n createdAt: number;\n } | null> {\n const pda = this.deriveStreamerRegistration(streamerId);\n try {\n const account = await (this.program.account as any)\n .streamerRegistration.fetch(pda);\n return {\n streamerId: account.streamerId,\n wallet: account.wallet,\n verifiedAt: account.verifiedAt.toNumber(),\n registeredBy: account.registeredBy,\n createdAt: account.createdAt.toNumber(),\n };\n } catch {\n return null;\n }\n }\n\n async isWhitelisted(wallet: PublicKey): Promise<boolean> {\n const pda = this.deriveWhitelistEntry(wallet);\n try {\n const account = await (this.program.account as any)\n .whitelistEntry.fetch(pda);\n return account.active;\n } catch {\n return false;\n }\n }\n\n async getVaultBalance(\n mint?: PublicKey\n ): Promise<{ sol: bigint; tokens: bigint }> {\n const vaultPda = this.deriveVault();\n const sol = BigInt(await this.connection.getBalance(vaultPda));\n\n let tokens = 0n;\n if (mint) {\n const ata = getAssociatedTokenAddressSync(mint, vaultPda, true);\n try {\n const account = await getAccount(this.connection, ata);\n tokens = account.amount;\n } catch {\n // ATA doesn't exist\n }\n }\n\n return { sol, tokens };\n }\n}\n\n// ═══════════════════════════════════════════════════════════════════════════\n// Utility Functions\n// ═══════════════════════════════════════════════════════════════════════════\n\n/** Format raw token amount to human-readable */\nexport function formatTokens(raw: bigint): string {\n const tokens = Number(raw) / (10 ** TOKEN_DECIMALS);\n return tokens.toLocaleString(undefined, { maximumFractionDigits: 2 });\n}\n\n/** Format lamports to SOL */\nexport function formatSol(lamports: bigint): string {\n const sol = Number(lamports) / LAMPORTS_PER_SOL;\n return sol.toFixed(4);\n}\n\n/** Parse SOL to lamports */\nexport function parseSol(sol: number): bigint {\n return BigInt(Math.floor(sol * LAMPORTS_PER_SOL));\n}\n\n/** Parse tokens to raw */\nexport function parseTokens(tokens: number): bigint {\n return BigInt(Math.floor(tokens * (10 ** TOKEN_DECIMALS)));\n}\n\nexport default KickFunSDK;\n"]}
package/dist/index.mjs CHANGED
@@ -633,7 +633,7 @@ var KickFunSDK = class {
633
633
  return numerator / denominator;
634
634
  }
635
635
  };
636
- var StreamerSDK = class {
636
+ var StreamerSDK = class _StreamerSDK {
637
637
  constructor(program, wallet) {
638
638
  this.program = program;
639
639
  this.connection = program.provider.connection;
@@ -679,25 +679,61 @@ var StreamerSDK = class {
679
679
  if (!blockTime) throw new Error("Failed to get block time");
680
680
  return blockTime;
681
681
  }
682
- createEd25519Instruction(keypair, message) {
683
- const signature = nacl.sign.detached(message, keypair.secretKey);
682
+ // ═══════════════════════════════════════════════════════════════════════════
683
+ // Ed25519 Signing Utilities (for browser wallets / external signers)
684
+ // ═══════════════════════════════════════════════════════════════════════════
685
+ /**
686
+ * Build the message that the streamer must sign for register_streamer.
687
+ * The streamer signs this with their wallet (e.g. Phantom signMessage).
688
+ *
689
+ * Format: "register_streamer:{streamer_id}:{wallet}:{timestamp}"
690
+ */
691
+ buildRegisterMessage(streamerId, streamerWallet, timestamp) {
692
+ const msg = `register_streamer:${streamerId}:${streamerWallet.toBase58()}:${timestamp}`;
693
+ return Buffer.from(msg, "utf-8");
694
+ }
695
+ /**
696
+ * Build the message that the streamer must sign for claim_funds.
697
+ * The streamer signs this with their wallet (e.g. Phantom signMessage).
698
+ *
699
+ * Format: "claim_funds:{streamer_id}:{wallet}:{mint}:{token_amount}:{sol_amount}:{timestamp}"
700
+ */
701
+ buildClaimMessage(streamerId, streamerWallet, mint, tokenAmount, solAmount, timestamp) {
702
+ const msg = `claim_funds:${streamerId}:${streamerWallet.toBase58()}:${mint.toBase58()}:${tokenAmount.toString()}:${solAmount.toString()}:${timestamp}`;
703
+ return Buffer.from(msg, "utf-8");
704
+ }
705
+ /**
706
+ * Create an Ed25519 instruction from an externally-signed signature.
707
+ * Use this when the streamer signs via browser wallet (Phantom, Solflare, etc.)
708
+ * instead of exposing a Keypair.
709
+ *
710
+ * @param streamerWallet - Public key of the streamer
711
+ * @param message - The message bytes (from buildRegisterMessage / buildClaimMessage)
712
+ * @param signature - The Ed25519 signature from wallet.signMessage(message)
713
+ */
714
+ createEd25519Instruction(streamerWallet, message, signature) {
684
715
  return Ed25519Program.createInstructionWithPublicKey({
685
- publicKey: keypair.publicKey.toBytes(),
716
+ publicKey: streamerWallet.toBytes(),
686
717
  message,
687
718
  signature
688
719
  });
689
720
  }
721
+ /**
722
+ * Sign a message using a Keypair directly (server-side / test usage).
723
+ * Returns the Ed25519 signature bytes.
724
+ */
725
+ static signMessage(message, keypair) {
726
+ return nacl.sign.detached(message, keypair.secretKey);
727
+ }
690
728
  // ═══════════════════════════════════════════════════════════════════════════
691
729
  // Register Streamer
692
730
  // ═══════════════════════════════════════════════════════════════════════════
693
731
  async registerStreamer(params) {
694
732
  const { streamerId, streamerKeypair } = params;
695
733
  const timestamp = await this.getSolanaTimestamp();
696
- const message = `register_streamer:${streamerId}:${streamerKeypair.publicKey.toBase58()}:${timestamp}`;
697
- const ed25519Ix = this.createEd25519Instruction(
698
- streamerKeypair,
699
- Buffer.from(message, "utf-8")
700
- );
734
+ const msgBytes = this.buildRegisterMessage(streamerId, streamerKeypair.publicKey, timestamp);
735
+ const sig = _StreamerSDK.signMessage(msgBytes, streamerKeypair);
736
+ const ed25519Ix = this.createEd25519Instruction(streamerKeypair.publicKey, msgBytes, sig);
701
737
  const whitelistPda = this.deriveWhitelistEntry(this.wallet.publicKey);
702
738
  const streamerRegPda = this.deriveStreamerRegistration(streamerId);
703
739
  const registerIx = await this.program.methods.registerStreamer(
@@ -721,11 +757,9 @@ var StreamerSDK = class {
721
757
  async claimFunds(params) {
722
758
  const { streamerId, streamerKeypair, mint, solAmount, tokenAmount } = params;
723
759
  const timestamp = await this.getSolanaTimestamp();
724
- const message = `claim_funds:${streamerId}:${streamerKeypair.publicKey.toBase58()}:${mint.toBase58()}:${tokenAmount.toString()}:${solAmount.toString()}:${timestamp}`;
725
- const ed25519Ix = this.createEd25519Instruction(
726
- streamerKeypair,
727
- Buffer.from(message, "utf-8")
728
- );
760
+ const msgBytes = this.buildClaimMessage(streamerId, streamerKeypair.publicKey, mint, tokenAmount, solAmount, timestamp);
761
+ const sig = _StreamerSDK.signMessage(msgBytes, streamerKeypair);
762
+ const ed25519Ix = this.createEd25519Instruction(streamerKeypair.publicKey, msgBytes, sig);
729
763
  const whitelistPda = this.deriveWhitelistEntry(this.wallet.publicKey);
730
764
  const streamerRegPda = this.deriveStreamerRegistration(streamerId);
731
765
  const vaultPda = this.deriveVault();
@@ -756,6 +790,54 @@ var StreamerSDK = class {
756
790
  return { txSignature };
757
791
  }
758
792
  // ═══════════════════════════════════════════════════════════════════════════
793
+ // Register Streamer (browser wallet — signature from Phantom/Solflare)
794
+ // ═══════════════════════════════════════════════════════════════════════════
795
+ async registerStreamerWithSignature(params) {
796
+ const { streamerId, streamerPublicKey, signature, timestamp } = params;
797
+ const msgBytes = this.buildRegisterMessage(streamerId, streamerPublicKey, timestamp);
798
+ const ed25519Ix = this.createEd25519Instruction(streamerPublicKey, msgBytes, signature);
799
+ const whitelistPda = this.deriveWhitelistEntry(this.wallet.publicKey);
800
+ const streamerRegPda = this.deriveStreamerRegistration(streamerId);
801
+ const registerIx = await this.program.methods.registerStreamer(streamerId, streamerPublicKey, new BN(timestamp)).accounts({
802
+ caller: this.wallet.publicKey,
803
+ whitelistEntry: whitelistPda,
804
+ streamerRegistration: streamerRegPda,
805
+ instructionsSysvar: SYSVAR_INSTRUCTIONS_PUBKEY
806
+ }).instruction();
807
+ const tx = new Transaction().add(ed25519Ix).add(registerIx);
808
+ const provider = this.program.provider;
809
+ const txSignature = await provider.sendAndConfirm(tx);
810
+ return { txSignature, streamerRegistrationPda: streamerRegPda };
811
+ }
812
+ // ═══════════════════════════════════════════════════════════════════════════
813
+ // Claim Funds (browser wallet — signature from Phantom/Solflare)
814
+ // ═══════════════════════════════════════════════════════════════════════════
815
+ async claimFundsWithSignature(params) {
816
+ const { streamerId, streamerPublicKey, mint, solAmount, tokenAmount, signature, timestamp } = params;
817
+ const msgBytes = this.buildClaimMessage(streamerId, streamerPublicKey, mint, tokenAmount, solAmount, timestamp);
818
+ const ed25519Ix = this.createEd25519Instruction(streamerPublicKey, msgBytes, signature);
819
+ const whitelistPda = this.deriveWhitelistEntry(this.wallet.publicKey);
820
+ const streamerRegPda = this.deriveStreamerRegistration(streamerId);
821
+ const vaultPda = this.deriveVault();
822
+ const programTokenAccount = getAssociatedTokenAddressSync(mint, vaultPda, true);
823
+ const streamerTokenAccount = getAssociatedTokenAddressSync(mint, streamerPublicKey, false);
824
+ const claimIx = await this.program.methods.claimFunds(streamerId, solAmount, tokenAmount, new BN(timestamp)).accounts({
825
+ caller: this.wallet.publicKey,
826
+ whitelistEntry: whitelistPda,
827
+ streamerRegistration: streamerRegPda,
828
+ streamerWallet: streamerPublicKey,
829
+ vault: vaultPda,
830
+ mint,
831
+ programTokenAccount,
832
+ streamerTokenAccount,
833
+ instructionsSysvar: SYSVAR_INSTRUCTIONS_PUBKEY
834
+ }).instruction();
835
+ const tx = new Transaction().add(ed25519Ix).add(claimIx);
836
+ const provider = this.program.provider;
837
+ const txSignature = await provider.sendAndConfirm(tx);
838
+ return { txSignature };
839
+ }
840
+ // ═══════════════════════════════════════════════════════════════════════════
759
841
  // Read State
760
842
  // ═══════════════════════════════════════════════════════════════════════════
761
843
  async getStreamerRegistration(streamerId) {