UNPKG

@solsdk/tokenflow_sdk

Version:

A simple SDK for interacting with tokenflow

1 lines 30 kB
{"version":3,"file":"happy_pump.cjs","sources":["../../../src/happy_pump.ts"],"sourcesContent":["import { BN } from \"bn.js\";\nimport { Program, Provider } from \"@coral-xyz/anchor\";\nimport { createAssociatedTokenAccountInstruction, getAccount, getAssociatedTokenAddress } from \"@solana/spl-token\";\nimport { Commitment, Connection, Finality, Keypair, PublicKey, TransactionInstruction } from \"@solana/web3.js\";\nimport { calculateWithSlippageBuy, calculateWithSlippageSell, DEFAULT_COMMITMENT, DEFAULT_FINALITY, sendTx } from \"./util.js\";\nimport { CreateTokenMetadata, PriorityFee, TransactionResult } from \"./types.js\";\nimport { BondingCurveAccount } from \"./bondingCurveAccount.js\";\nimport { GlobalAccount } from \"./globalAccount.js\";\nimport { HappyPumpEventHandlers, HappyPumpEventType, toCompleteEvent, toCreateEvent, toSetGlobalCfgEvent, toTradeEvent } from \"./events.js\";\nimport { HappyPumpProgram, IDL } from \"./IDL/index.js\";\n\n\n// const MPL_TOKEN_METADATA_PROGRAM_ID = \"metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s\";\n\nexport const GLOBAL_ACCOUNT_SEED = \"global\";\nexport const MINT_AUTHORITY_SEED = \"mint-authority\";\nexport const BONDING_CURVE_SEED = \"bonding-curve\";\nexport const METADATA_SEED = \"metadata\";\n\nexport const DEFAULT_DECIMALS = 6;\n\n\nexport class HappyPumpSDK {\n public program: Program<HappyPumpProgram>;\n public connection: Connection;\n \n constructor(provider?: Provider) {\n this.program = new Program<HappyPumpProgram>(IDL as HappyPumpProgram, provider);\n this.connection = this.program.provider.connection;\n }\n\n async create(\n creator: Keypair,\n mint: Keypair,\n createTokenMetadata: CreateTokenMetadata,\n tradeAuthority?: PublicKey,\n priorityFees?: PriorityFee,\n commitment: Commitment = DEFAULT_COMMITMENT,\n finality: Finality = DEFAULT_FINALITY,\n ) {\n const globalAccount = await this.getGlobalAccount(commitment);\n\n const tokenMetadata = await this.createTokenMetadata(createTokenMetadata);\n\n const instructions = await this.getCreateInstructions(\n creator.publicKey,\n mint,\n createTokenMetadata.name,\n createTokenMetadata.symbol,\n tokenMetadata.uri,\n globalAccount.feeRecipient,\n tradeAuthority,\n );\n\n return await sendTx(\n this.connection,\n instructions,\n creator.publicKey,\n [creator, mint],\n priorityFees,\n commitment,\n finality,\n );\n }\n\n async createAndBuy(\n creator: Keypair,\n mint: Keypair,\n createTokenMetadata: CreateTokenMetadata,\n buyAmountSol: bigint,\n slippageBasisPoints: bigint = BigInt(500),\n tradeAuthority?: Keypair,\n priorityFees?: PriorityFee,\n commitment: Commitment = DEFAULT_COMMITMENT,\n finality: Finality = DEFAULT_FINALITY,\n ) {\n const globalAccount = await this.getGlobalAccount(commitment);\n\n const instructions: TransactionInstruction[] = [];\n\n const tokenMetadata = await this.createTokenMetadata(createTokenMetadata);\n\n const createIxs = await this.getCreateInstructions(\n creator.publicKey,\n mint,\n createTokenMetadata.name,\n createTokenMetadata.symbol,\n tokenMetadata.uri,\n globalAccount.feeRecipient,\n tradeAuthority?.publicKey,\n );\n\n instructions.push(...createIxs);\n\n if (buyAmountSol > 0) {\n const globalAccount = await this.getGlobalAccount(commitment);\n const buyAmount = globalAccount.getInitialBuyPrice(buyAmountSol);\n const buyAmountWithSlippage = calculateWithSlippageBuy(\n buyAmountSol,\n slippageBasisPoints,\n );\n\n const buyIxs = await this.getBuyInstructions(\n creator.publicKey,\n mint.publicKey,\n globalAccount.feeRecipient,\n creator.publicKey,\n buyAmount,\n buyAmountWithSlippage,\n tradeAuthority?.publicKey,\n commitment,\n );\n\n instructions.push(...buyIxs);\n }\n\n const signers = [creator, mint];\n if (!!tradeAuthority) {\n signers.push(tradeAuthority);\n } \n\n return await sendTx(\n this.connection,\n instructions,\n creator.publicKey,\n signers,\n priorityFees,\n commitment,\n finality,\n );\n }\n\n async setBondingCurveCfg(\n user: Keypair,\n mint: PublicKey, \n tradeAuthority?: PublicKey, \n priorityFees?: PriorityFee,\n commitment: Commitment = DEFAULT_COMMITMENT,\n finality: Finality = DEFAULT_FINALITY,\n ) {\n const instructions = await this.getSetBondingCurveCfgInstructions(\n user.publicKey,\n mint,\n tradeAuthority,\n );\n\n return await sendTx(\n this.connection,\n instructions,\n user.publicKey,\n [user],\n priorityFees,\n commitment,\n finality,\n );\n }\n\n async buy(\n buyer: Keypair,\n mint: PublicKey, \n buyAmountSol: bigint,\n slippageBasisPoints: bigint = BigInt(500),\n tradeAuthority?: Keypair, \n priorityFees?: PriorityFee,\n commitment: Commitment = DEFAULT_COMMITMENT,\n finality: Finality = DEFAULT_FINALITY,\n ) {\n const instructions = await this.getBuyInstructionsBySolAmount(\n buyer.publicKey,\n mint,\n buyAmountSol,\n slippageBasisPoints,\n tradeAuthority?.publicKey,\n commitment,\n );\n\n const signers = [buyer];\n if (!!tradeAuthority) {\n signers.push(tradeAuthority);\n }\n\n\n return await sendTx(\n this.connection,\n instructions,\n buyer.publicKey,\n signers,\n priorityFees,\n commitment,\n finality,\n );\n }\n\n async sell(\n seller: Keypair,\n mint: PublicKey,\n sellTokenAmount: bigint,\n slippageBasisPoints: bigint = 500n,\n priorityFees?: PriorityFee,\n commitment: Commitment = DEFAULT_COMMITMENT,\n finality: Finality = DEFAULT_FINALITY,\n ): Promise<TransactionResult> {\n const sellIxs = await this.getSellInstructionsByTokenAmount(\n seller.publicKey,\n mint,\n sellTokenAmount,\n slippageBasisPoints,\n commitment,\n );\n\n return await sendTx(\n this.connection,\n sellIxs,\n seller.publicKey,\n [seller],\n priorityFees,\n commitment,\n finality,\n );\n }\n\n async getCreateInstructions(\n creator: PublicKey,\n mint: Keypair,\n name: string,\n symbol: string,\n uri: string,\n feeRecipient: PublicKey,\n tradeAuthority?: PublicKey,\n ) {\n /*\n const mplTokenMetadata = new PublicKey(MPL_TOKEN_METADATA_PROGRAM_ID);\n const [metadataPDA] = PublicKey.findProgramAddressSync(\n [\n Buffer.from(METADATA_SEED), \n mplTokenMetadata.toBuffer(), \n mint.publicKey.toBuffer(),\n ],\n mplTokenMetadata,\n );\n */\n \n const createIx = await this.program.methods\n .create({ \n name, \n symbol, \n uri,\n // @ts-ignore\n tradeAuthority: tradeAuthority ?? null,\n creator,\n })\n .accounts({\n program: this.program.programId,\n mint: mint.publicKey,\n creator,\n feeRecipient, \n }).instruction();\n\n return [createIx];\n }\n\n async getBuyInstructionsBySolAmount(\n buyer: PublicKey,\n mint: PublicKey,\n buyAmountSol: bigint,\n slippageBasisPoints: bigint = 500n,\n tradeAuthority?: PublicKey,\n commitment: Commitment = DEFAULT_COMMITMENT,\n ) {\n const globalAccount = await this.getGlobalAccount(commitment); \n \n const bondingCurveAccount = await this.getBondingCurveAccount(\n mint,\n commitment\n );\n\n if (!bondingCurveAccount) {\n throw new Error(`Bonding curve account not found: ${mint.toBase58()}`);\n }\n \n const totalFeeBasisPoints = globalAccount.systemFeeBasisPoints + globalAccount.creatorFeeBasisPoints;\n const effectiveBuyAmountSol = buyAmountSol - (buyAmountSol * totalFeeBasisPoints) / 10000n;\n\n const buyAmount = bondingCurveAccount.getBuyPrice(effectiveBuyAmountSol);\n const buyAmountWithSlippage = calculateWithSlippageBuy(\n buyAmountSol,\n slippageBasisPoints,\n );\n console.log(`buyAmountSol: ${buyAmountSol}, effectiveBuyAmountSol: ${effectiveBuyAmountSol}, buyAmount: ${buyAmount}, buyAmountWithSlippage: ${buyAmountWithSlippage}`);\n\n return await this.getBuyInstructions(\n buyer,\n mint,\n globalAccount.feeRecipient,\n bondingCurveAccount.creator,\n buyAmount,\n buyAmountWithSlippage,\n tradeAuthority,\n commitment,\n );\n }\n\n async getBuyInstructions(\n buyer: PublicKey,\n mint: PublicKey,\n feeRecipient: PublicKey,\n creatorFeeRecipient: PublicKey,\n amount: bigint,\n solAmount: bigint,\n tradeAuthority?: PublicKey,\n commitment: Commitment = DEFAULT_COMMITMENT,\n ) {\n const instructions: TransactionInstruction[] = [];\n\n const associatedUser = await getAssociatedTokenAddress(mint, buyer, false);\n \n try {\n await getAccount(this.connection, associatedUser, commitment);\n } catch (e) {\n // console.log('catch createAssociatedTokenAccountInstruction: ', e);\n instructions.push(\n createAssociatedTokenAccountInstruction(\n buyer,\n associatedUser,\n buyer,\n mint,\n )\n );\n }\n\n console.log(\"amount: \", amount);\n console.log(\"solAmount: \", solAmount);\n\n instructions.push(\n await this.program.methods.buy({\n tokenAmount: new BN(amount.toString()), \n maxSolCost: new BN(solAmount.toString()),\n }).accounts({\n user: buyer,\n mint,\n feeRecipient,\n creatorFeeRecipient, // 换掉报错否\n // @ts-ignore\n tradeAuthority: tradeAuthority ?? null,\n }).instruction(),\n );\n\n return instructions;\n }\n\n // sell\n async getSellInstructionsByTokenAmount(\n seller: PublicKey,\n mint: PublicKey,\n sellTokenAmount: bigint,\n slippageBasisPoints: bigint = 500n,\n commitment: Commitment = DEFAULT_COMMITMENT\n ) {\n const bondingCurveAccount = await this.getBondingCurveAccount(\n mint,\n commitment\n );\n \n if (!bondingCurveAccount) {\n throw new Error(`Bonding curve account not found: ${mint.toBase58()}`);\n }\n\n const globalAccount = await this.getGlobalAccount(commitment);\n\n const minSolOutput = bondingCurveAccount.getSellPrice(\n sellTokenAmount,\n globalAccount.systemFeeBasisPoints + globalAccount.creatorFeeBasisPoints,\n );\n\n const sellAmountWithSlippage = calculateWithSlippageSell(\n minSolOutput,\n slippageBasisPoints\n );\n\n console.log(`minSolOutput: ${minSolOutput}, sellTokenAmount: ${sellTokenAmount}`);\n\n return await this.getSellInstructions(\n seller,\n mint,\n globalAccount.feeRecipient,\n bondingCurveAccount.creator,\n sellTokenAmount,\n sellAmountWithSlippage\n );\n }\n\n async getSellInstructions(\n seller: PublicKey,\n mint: PublicKey,\n feeRecipient: PublicKey,\n creatorFeeRecipient: PublicKey,\n amount: bigint,\n minSolOutput: bigint\n ) {\n const instructions: TransactionInstruction[] = [];\n instructions.push(\n await this.program.methods\n .sell({\n tokenAmount: new BN(amount.toString()), \n minSolOutput: new BN(minSolOutput.toString()),\n })\n .accounts({\n program: this.program.programId,\n user: seller,\n mint,\n feeRecipient,\n creatorFeeRecipient,\n })\n .instruction()\n );\n\n return instructions;\n }\n\n async getSetBondingCurveCfgInstructions(\n user: PublicKey,\n mint: PublicKey, \n tradeAuthority?: PublicKey,\n ) {\n const setBondingCurveCfgIx = await this.program.methods.setBondingCurveCfg({\n tradeAuthority,\n }).accounts({\n user,\n mint,\n }).instruction();\n \n return [setBondingCurveCfgIx];\n }\n\n async getGlobalAccount(commitment: Commitment = DEFAULT_COMMITMENT): Promise<GlobalAccount> {\n const [globalAccountPDA] = PublicKey.findProgramAddressSync(\n [Buffer.from(GLOBAL_ACCOUNT_SEED)],\n this.program.programId\n );\n\n /*\n const tokenAccount = await this.connection.getAccountInfo(\n globalAccountPDA,\n commitment,\n );\n */\n\n const res = await this.program.account.global.fetch(globalAccountPDA, commitment);\n\n return GlobalAccount.fromObject(res);\n }\n\n getBondingCurvePDA(mint: PublicKey) {\n return PublicKey.findProgramAddressSync(\n [Buffer.from(\"bonding-curve\"), mint.toBuffer()],\n this.program.programId\n )[0];\n }\n\n async getBondingCurveAccount(\n mint: PublicKey,\n commitment: Commitment = DEFAULT_COMMITMENT,\n ): Promise<BondingCurveAccount | undefined> {\n const tokenAccount = await this.connection.getAccountInfo(\n this.getBondingCurvePDA(mint),\n commitment\n );\n\n if (!tokenAccount) {\n return undefined;\n }\n\n return BondingCurveAccount.fromBuffer(tokenAccount.data);\n }\n\n async createTokenMetadata(create: CreateTokenMetadata) {\n // Validate file\n if (!(create.file instanceof Blob)) {\n throw new Error('File must be a Blob or File object');\n }\n \n let formData = new FormData();\n formData.append(\"file\", create.file, 'image.png'); // Add filename\n formData.append(\"name\", create.name);\n formData.append(\"symbol\", create.symbol);\n formData.append(\"description\", create.description);\n formData.append(\"twitter\", create.twitter || \"\");\n formData.append(\"telegram\", create.telegram || \"\");\n formData.append(\"website\", create.website || \"\");\n formData.append(\"showName\", \"true\");\n \n try {\n const request = await fetch(\"https://happypump.io/api/ipfs\", {\n method: \"POST\",\n headers: {\n 'Accept': 'application/json',\n },\n body: formData,\n credentials: 'same-origin'\n });\n \n if (request.status === 500) {\n // Try to get more error details\n const errorText = await request.text();\n throw new Error(`Server error (500): ${errorText || 'No error details available'}`);\n }\n \n if (!request.ok) {\n throw new Error(`HTTP error! status: ${request.status}`);\n }\n \n const responseText = await request.text();\n if (!responseText) {\n throw new Error('Empty response received from server');\n }\n \n try {\n return JSON.parse(responseText);\n } catch (e) {\n throw new Error(`Invalid JSON response: ${responseText}`);\n }\n } catch (error) {\n console.error('Error in createTokenMetadata:', error);\n // throw error;\n return {\n uri: \"http://www.foo.com\",\n };\n }\n }\n\n // events\n addEventListener<T extends HappyPumpEventType>(\n eventType: T, \n callback: (\n event: HappyPumpEventHandlers[T],\n slot: number,\n signature: string,\n ) => void\n ) {\n return this.program.addEventListener(\n eventType,\n (event: any, slot: number, signature: string) => { \n let processedEvent;\n switch (eventType) {\n case \"createEvent\":\n processedEvent = toCreateEvent(event);\n callback(\n processedEvent,\n slot,\n signature,\n );\n break;\n case \"tradeEvent\":\n processedEvent = toTradeEvent(event);\n callback(\n processedEvent,\n slot,\n signature,\n );\n break;\n case \"completeEvent\":\n processedEvent = toCompleteEvent(event);\n callback(\n processedEvent,\n slot,\n signature,\n );\n break;\n case \"setGlobalCfgEvent\":\n processedEvent = toSetGlobalCfgEvent(event);\n callback(\n processedEvent,\n slot,\n signature,\n );\n break;\n default:\n console.error(`Unhandled event type: ${eventType}`);\n break;\n } \n }\n );\n }\n\n removeEventListener(eventId: number) {\n this.program.removeEventListener(eventId);\n }\n}"],"names":["Program","IDL","DEFAULT_COMMITMENT","DEFAULT_FINALITY","sendTx","calculateWithSlippageBuy","getAssociatedTokenAddress","getAccount","createAssociatedTokenAccountInstruction","BN","calculateWithSlippageSell","PublicKey","GlobalAccount","BondingCurveAccount","toCreateEvent","toTradeEvent","toCompleteEvent","toSetGlobalCfgEvent"],"mappings":"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"}