{"version":3,"file":"util.mjs","sources":["../../../src/util.ts"],"sourcesContent":["import {\n  Commitment,\n  ComputeBudgetProgram,\n  Connection,\n  Finality,\n  Keypair,\n  PublicKey,\n  SendTransactionError,\n  Transaction,\n  TransactionMessage,\n  VersionedTransaction,\n  VersionedTransactionResponse,\n} from \"@solana/web3.js\";\nimport { PriorityFee, TransactionResult } from \"./types.js\";\n\nexport const DEFAULT_COMMITMENT: Commitment = \"finalized\";\nexport const DEFAULT_FINALITY: Finality = \"finalized\";\n\nexport const calculateWithSlippageBuy = (\n  amount: bigint,\n  basisPoints: bigint\n) => {\n  return amount + (amount * basisPoints) / 10000n;\n};\n\nexport const calculateWithSlippageSell = (\n  amount: bigint,\n  basisPoints: bigint\n) => {\n  return amount - (amount * basisPoints) / 10000n;\n};\n\nexport async function sendTx(\n  connection: Connection,\n  tx: Transaction,\n  payer: PublicKey,\n  signers: Keypair[],\n  priorityFees?: PriorityFee,\n  commitment: Commitment = DEFAULT_COMMITMENT,\n  finality: Finality = DEFAULT_FINALITY\n): Promise<TransactionResult> {\n  let newTx = new Transaction();\n\n  if (priorityFees) {\n    const modifyComputeUnits = ComputeBudgetProgram.setComputeUnitLimit({\n      units: priorityFees.unitLimit,\n    });\n\n    const addPriorityFee = ComputeBudgetProgram.setComputeUnitPrice({\n      microLamports: priorityFees.unitPrice,\n    });\n    newTx.add(modifyComputeUnits);\n    newTx.add(addPriorityFee);\n  }\n\n  newTx.add(tx);\n\n  let versionedTx = await buildVersionedTx(\n    connection,\n    payer,\n    newTx,\n    commitment\n  );\n  versionedTx.sign(signers);\n\n  try {\n    const sig = await connection.sendTransaction(versionedTx, {\n      skipPreflight: false,\n    });\n    console.log(\"sig:\", `https://solscan.io/tx/${sig}`);\n\n    let txResult = await getTxDetails(connection, sig, commitment, finality);\n    if (!txResult) {\n      return {\n        success: false,\n        error: \"Transaction failed\",\n      };\n    }\n    return {\n      success: true,\n      signature: sig,\n      results: txResult,\n    };\n  } catch (e) {\n    if (e instanceof SendTransactionError) {\n      let ste = e as SendTransactionError;\n      console.log(\"SendTransactionError\" + (await ste.getLogs(connection)));\n    } else {\n      console.error(e);\n    }\n    return {\n      error: e,\n      success: false,\n    };\n  }\n}\n\nexport const buildVersionedTx = async (\n  connection: Connection,\n  payer: PublicKey,\n  tx: Transaction,\n  commitment: Commitment = DEFAULT_COMMITMENT\n): Promise<VersionedTransaction> => {\n  const blockHash = (await connection.getLatestBlockhash(commitment)).blockhash;\n\n  let messageV0 = new TransactionMessage({\n    payerKey: payer,\n    recentBlockhash: blockHash,\n    instructions: tx.instructions,\n  }).compileToV0Message();\n\n  return new VersionedTransaction(messageV0);\n};\n\nexport const getTxDetails = async (\n  connection: Connection,\n  sig: string,\n  commitment: Commitment = DEFAULT_COMMITMENT,\n  finality: Finality = DEFAULT_FINALITY\n): Promise<VersionedTransactionResponse | null> => {\n  const latestBlockHash = await connection.getLatestBlockhash();\n  await connection.confirmTransaction(\n    {\n      blockhash: latestBlockHash.blockhash,\n      lastValidBlockHeight: latestBlockHash.lastValidBlockHeight,\n      signature: sig,\n    },\n    commitment\n  );\n\n  return connection.getTransaction(sig, {\n    maxSupportedTransactionVersion: 0,\n    commitment: finality,\n  });\n};\n\nexport const estimateTokenReceived = (\n  buyAmountSol: bigint,\n  solDecimals: number = 9,\n  tokenDecimals: number = 6\n) => {\n  const solInLp = 85000000000n; // 85 SOL, adjust based on solDecimals\n  const tokenInLp = 206900000000000n; // 206,900,000 tokens, adjust based on tokenDecimals\n\n  // Adjust for decimals\n  const solInLpAdjusted = solInLp * 10n ** BigInt(solDecimals - 9);\n  const tokenInLpAdjusted = tokenInLp * 10n ** BigInt(tokenDecimals - 6);\n  const buyAmountSolAdjusted = buyAmountSol * 10n ** BigInt(solDecimals - 9);\n\n  // Constant product: solInLp * tokenInLp = k\n  const k = solInLpAdjusted * tokenInLpAdjusted;\n\n  // After buying, new SOL in LP\n  const newSolInLp = solInLpAdjusted + buyAmountSolAdjusted;\n\n  // New token amount based on constant product: k / newSolInLp\n  const newTokenInLp = k / newSolInLp;\n\n  // Tokens received = old amount - new amount\n  const tokensReceived = tokenInLpAdjusted - newTokenInLp;\n\n  // Adjust tokens received back to original decimal scale for return value\n  const tokensReceivedAdjusted =\n    tokensReceived / 10n ** BigInt(tokenDecimals - 6);\n\n  return tokensReceivedAdjusted;\n};\n"],"names":[],"mappings":"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"}