{"version":3,"sources":["../../../src/common/txTool/txUtils.ts","../../../src/common/logger.ts","../../../src/common/txTool/txType.ts"],"sourcesContent":["import {\n  Connection,\n  PublicKey,\n  ComputeBudgetProgram,\n  SimulatedTransactionResponse,\n  Transaction,\n  TransactionInstruction,\n  TransactionMessage,\n  Keypair,\n  EpochInfo,\n  VersionedTransaction,\n} from \"@solana/web3.js\";\nimport { TOKEN_PROGRAM_ID } from \"@solana/spl-token\";\n\nimport { createLogger } from \"../logger\";\nimport { InstructionType } from \"./txType\";\nimport { CacheLTA } from \"./lookupTable\";\n\nimport { ComputeBudgetConfig } from \"@/raydium/type\";\n\nconst logger = createLogger(\"Raydium_txUtil\");\n\nexport const MAX_BASE64_SIZE = 1644;\n\nexport function addComputeBudget(config: ComputeBudgetConfig): {\n  instructions: TransactionInstruction[];\n  instructionTypes: string[];\n} {\n  const ins: TransactionInstruction[] = [];\n  const insTypes: string[] = [];\n  if (config.microLamports) {\n    ins.push(ComputeBudgetProgram.setComputeUnitPrice({ microLamports: config.microLamports }));\n    insTypes.push(InstructionType.SetComputeUnitPrice);\n  }\n  if (config.units) {\n    ins.push(ComputeBudgetProgram.setComputeUnitLimit({ units: config.units }));\n    insTypes.push(InstructionType.SetComputeUnitLimit);\n  }\n\n  return {\n    instructions: ins,\n    instructionTypes: insTypes,\n  };\n}\n\nexport async function getRecentBlockHash(connection: Connection): Promise<string> {\n  try {\n    return (await connection.getLatestBlockhash?.())?.blockhash || (await connection.getRecentBlockhash()).blockhash;\n  } catch {\n    return (await connection.getRecentBlockhash()).blockhash;\n  }\n}\n\n/**\n * Forecast transaction size\n */\nexport function forecastTransactionSize(instructions: TransactionInstruction[], signers: PublicKey[]): boolean {\n  if (instructions.length < 1) logger.logWithError(`no instructions provided: ${instructions.toString()}`);\n  if (signers.length < 1) logger.logWithError(`no signers provided:, ${signers.toString()}`);\n\n  const transaction = new Transaction();\n  transaction.recentBlockhash = \"11111111111111111111111111111111\";\n  transaction.feePayer = signers[0];\n  transaction.add(...instructions);\n\n  try {\n    return Buffer.from(transaction.serialize({ verifySignatures: false })).toString(\"base64\").length < MAX_BASE64_SIZE;\n  } catch (error) {\n    return false;\n  }\n}\n\n/**\n * Simulates multiple instruction\n */\n/**\n * Simulates multiple instruction\n */\nexport async function simulateMultipleInstruction(\n  connection: Connection,\n  instructions: TransactionInstruction[],\n  keyword: string,\n  batchRequest = true,\n): Promise<string[]> {\n  const feePayer = new PublicKey(\"RaydiumSimuLateTransaction11111111111111111\");\n\n  const transactions: Transaction[] = [];\n\n  let transaction = new Transaction();\n  transaction.feePayer = feePayer;\n\n  for (const instruction of instructions) {\n    if (!forecastTransactionSize([...transaction.instructions, instruction], [feePayer])) {\n      transactions.push(transaction);\n      transaction = new Transaction();\n      transaction.feePayer = feePayer;\n    }\n    transaction.add(instruction);\n  }\n  if (transaction.instructions.length > 0) {\n    transactions.push(transaction);\n  }\n\n  let results: SimulatedTransactionResponse[] = [];\n\n  try {\n    results = await simulateTransaction(connection, transactions, batchRequest);\n    if (results.find((i) => i.err !== null)) throw Error(\"rpc simulateTransaction error\");\n  } catch (error) {\n    if (error instanceof Error) {\n      logger.logWithError(\"failed to simulate for instructions\", \"RPC_ERROR\", {\n        message: error.message,\n      });\n    }\n  }\n\n  const logs: string[] = [];\n  for (const result of results) {\n    logger.debug(\"simulate result:\", result);\n\n    if (result.logs) {\n      const filteredLog = result.logs.filter((log) => log && log.includes(keyword));\n      logger.debug(\"filteredLog:\", logs);\n      if (!filteredLog.length) logger.logWithError(\"simulate log not match keyword\", \"keyword\", keyword);\n      logs.push(...filteredLog);\n    }\n  }\n\n  return logs;\n}\n\nexport function parseSimulateLogToJson(log: string, keyword: string): any {\n  const results = log.match(/{[\"\\w:,]+}/g);\n  if (!results || results.length !== 1) {\n    return logger.logWithError(`simulate log fail to match json, keyword: ${keyword}`);\n  }\n\n  return results[0];\n}\n\nexport function parseSimulateValue(log: string, key: string): any {\n  const reg = new RegExp(`\"${key}\":(\\\\d+)`, \"g\");\n\n  const results = reg.exec(log);\n  if (!results || results.length !== 2) {\n    return logger.logWithError(`simulate log fail to match key\", key: ${key}`);\n  }\n\n  return results[1];\n}\n\nexport interface ProgramAddress {\n  publicKey: PublicKey;\n  nonce: number;\n}\nexport function findProgramAddress(\n  seeds: Array<Buffer | Uint8Array>,\n  programId: PublicKey,\n): {\n  publicKey: PublicKey;\n  nonce: number;\n} {\n  const [publicKey, nonce] = PublicKey.findProgramAddressSync(seeds, programId);\n  return { publicKey, nonce };\n}\n\nexport async function simulateTransaction(\n  connection: Connection,\n  transactions: Transaction[],\n  batchRequest?: boolean,\n): Promise<any[]> {\n  let results: any[] = [];\n  if (batchRequest) {\n    const getLatestBlockhash = await connection.getLatestBlockhash();\n\n    const encodedTransactions: string[] = [];\n    for (const transaction of transactions) {\n      transaction.recentBlockhash = getLatestBlockhash.blockhash;\n      transaction.lastValidBlockHeight = getLatestBlockhash.lastValidBlockHeight;\n\n      // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n      // @ts-ignore\n      const message = transaction._compile();\n      const signData = message.serialize();\n\n      // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n      // @ts-ignore\n      const wireTransaction = transaction._serialize(signData);\n      const encodedTransaction = wireTransaction.toString(\"base64\");\n\n      encodedTransactions.push(encodedTransaction);\n    }\n\n    const batch = encodedTransactions.map((keys) => {\n      const args = connection._buildArgs([keys], undefined, \"base64\");\n      return {\n        methodName: \"simulateTransaction\",\n        args,\n      };\n    });\n\n    const reqData: { methodName: string; args: any[] }[][] = [];\n    const itemReqIndex = 20;\n    for (let i = 0; i < Math.ceil(batch.length / itemReqIndex); i++) {\n      reqData.push(batch.slice(i * itemReqIndex, (i + 1) * itemReqIndex));\n    }\n    // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n    // @ts-ignore\n    results = await (\n      await Promise.all(\n        reqData.map(async (i) => (await (connection as any)._rpcBatchRequest(i)).map((ii) => ii.result.value)),\n      )\n    ).flat();\n  } else {\n    try {\n      results = await Promise.all(\n        transactions.map(async (transaction) => await (await connection.simulateTransaction(transaction)).value),\n      );\n    } catch (error) {\n      if (error instanceof Error) {\n        logger.logWithError(\"failed to get info for multiple accounts\", \"RPC_ERROR\", {\n          message: error.message,\n        });\n      }\n    }\n  }\n\n  return results;\n}\n\nexport function checkLegacyTxSize({\n  instructions,\n  payer,\n  signers,\n}: {\n  instructions: TransactionInstruction[];\n  payer: PublicKey;\n  signers: PublicKey[];\n}): boolean {\n  return forecastTransactionSize(instructions, [payer, ...signers]);\n}\n\nexport function checkV0TxSize({\n  instructions,\n  payer,\n  lookupTableAddressAccount,\n  recentBlockhash = Keypair.generate().publicKey.toString(),\n}: {\n  instructions: TransactionInstruction[];\n  payer: PublicKey;\n  lookupTableAddressAccount?: CacheLTA;\n  recentBlockhash?: string;\n}): boolean {\n  const transactionMessage = new TransactionMessage({\n    payerKey: payer,\n    recentBlockhash,\n    instructions,\n  });\n\n  const messageV0 = transactionMessage.compileToV0Message(Object.values(lookupTableAddressAccount ?? {}));\n  try {\n    const buildLength = Buffer.from(new VersionedTransaction(messageV0).serialize()).toString(\"base64\").length;\n    return buildLength < MAX_BASE64_SIZE;\n  } catch (error) {\n    return false;\n  }\n}\n\nlet epochInfoCache: { time: number; data?: EpochInfo } = {\n  time: 0,\n  data: undefined,\n};\n\nexport async function getEpochInfo(connection: Connection): Promise<EpochInfo> {\n  if (!epochInfoCache.data || (Date.now() - epochInfoCache.time) / 1000 > 30) {\n    const data = await connection.getEpochInfo();\n    epochInfoCache = {\n      time: Date.now(),\n      data,\n    };\n    return data;\n  } else {\n    return epochInfoCache.data;\n  }\n}\n\nexport const toBuffer = (arr: Buffer | Uint8Array | Array<number>): Buffer => {\n  if (Buffer.isBuffer(arr)) {\n    return arr;\n  } else if (arr instanceof Uint8Array) {\n    return Buffer.from(arr.buffer, arr.byteOffset, arr.byteLength);\n  } else {\n    return Buffer.from(arr);\n  }\n};\n\nexport function printSimulate(transactions: Transaction[] | VersionedTransaction[]): string[] {\n  const allBase64: string[] = [];\n  transactions.forEach((transaction) => {\n    if (transaction instanceof Transaction) {\n      if (!transaction.recentBlockhash) transaction.recentBlockhash = TOKEN_PROGRAM_ID.toBase58();\n      if (!transaction.feePayer) transaction.feePayer = Keypair.generate().publicKey;\n    }\n    let serialized = transaction.serialize({ requireAllSignatures: false, verifySignatures: false });\n    if (transaction instanceof VersionedTransaction) serialized = toBuffer(serialized);\n    const base64 = serialized.toString(\"base64\");\n    allBase64.push(base64);\n  });\n  console.log(\"simulate tx string:\", allBase64);\n\n  return allBase64;\n}\n","import { get, set } from \"lodash\";\nimport dayjs from \"dayjs\";\nimport utc from \"dayjs/plugin/utc\";\ndayjs.extend(utc);\n\nexport type ModuleName = \"Common.Api\";\n\nexport enum LogLevel {\n  Error,\n  Warning,\n  Info,\n  Debug,\n}\nexport class Logger {\n  private logLevel: LogLevel;\n  private name: string;\n  constructor(params: { name: string; logLevel?: LogLevel }) {\n    this.logLevel = params.logLevel !== undefined ? params.logLevel : LogLevel.Error;\n    this.name = params.name;\n  }\n\n  set level(logLevel: LogLevel) {\n    this.logLevel = logLevel;\n  }\n  get time(): string {\n    return dayjs().utc().format(\"YYYY/MM/DD HH:mm:ss UTC\");\n  }\n  get moduleName(): string {\n    return this.name;\n  }\n\n  private isLogLevel(level: LogLevel): boolean {\n    return level <= this.logLevel;\n  }\n\n  public error(...props): Logger {\n    if (!this.isLogLevel(LogLevel.Error)) return this;\n    console.error(this.time, this.name, \"sdk logger error\", ...props);\n    return this;\n  }\n\n  public logWithError(...props): Logger {\n    // this.error(...props)\n    const msg = props.map((arg) => (typeof arg === \"object\" ? JSON.stringify(arg) : arg)).join(\", \");\n    throw new Error(msg);\n  }\n\n  public warning(...props): Logger {\n    if (!this.isLogLevel(LogLevel.Warning)) return this;\n    console.warn(this.time, this.name, \"sdk logger warning\", ...props);\n    return this;\n  }\n\n  public info(...props): Logger {\n    if (!this.isLogLevel(LogLevel.Info)) return this;\n    console.info(this.time, this.name, \"sdk logger info\", ...props);\n    return this;\n  }\n\n  public debug(...props): Logger {\n    if (!this.isLogLevel(LogLevel.Debug)) return this;\n    console.debug(this.time, this.name, \"sdk logger debug\", ...props);\n    return this;\n  }\n}\n\nconst moduleLoggers: { [key in ModuleName]?: Logger } = {};\nconst moduleLevels: { [key in ModuleName]?: LogLevel } = {};\n\nexport function createLogger(moduleName: string): Logger {\n  let logger = get(moduleLoggers, moduleName);\n  if (!logger) {\n    // default level is error\n    const logLevel = get(moduleLevels, moduleName);\n\n    logger = new Logger({ name: moduleName, logLevel });\n    set(moduleLoggers, moduleName, logger);\n  }\n\n  return logger;\n}\n\nexport function setLoggerLevel(moduleName: string, level: LogLevel): void {\n  set(moduleLevels, moduleName, level);\n\n  const logger = get(moduleLoggers, moduleName);\n  if (logger) logger.level = level;\n}\n","export enum TxVersion {\n  \"V0\",\n  \"LEGACY\",\n}\n\nexport const InstructionType = {\n  CreateAccount: \"CreateAccount\",\n  InitAccount: \"InitAccount\",\n  CreateATA: \"CreateATA\",\n  CloseAccount: \"CloseAccount\",\n  TransferAmount: \"TransferAmount\",\n  InitMint: \"InitMint\",\n  MintTo: \"MintTo\",\n\n  InitMarket: \"InitMarket\", // create market main ins\n  Util1216OwnerClaim: \"Util1216OwnerClaim\", // owner claim token ins\n\n  SetComputeUnitPrice: \"SetComputeUnitPrice\",\n  SetComputeUnitLimit: \"SetComputeUnitLimit\",\n\n  // CLMM\n  ClmmCreatePool: \"ClmmCreatePool\",\n  ClmmOpenPosition: \"ClmmOpenPosition\",\n  ClmmIncreasePosition: \"ClmmIncreasePosition\",\n  ClmmDecreasePosition: \"ClmmDecreasePosition\",\n  ClmmClosePosition: \"ClmmClosePosition\",\n  ClmmSwapBaseIn: \"ClmmSwapBaseIn\",\n  ClmmSwapBaseOut: \"ClmmSwapBaseOut\",\n  ClmmInitReward: \"ClmmInitReward\",\n  ClmmSetReward: \"ClmmSetReward\",\n  ClmmCollectReward: \"ClmmCollectReward\",\n\n  AmmV4Swap: \"AmmV4Swap\",\n  AmmV4AddLiquidity: \"AmmV4AddLiquidity\",\n  AmmV4RemoveLiquidity: \"AmmV4RemoveLiquidity\",\n  AmmV4SimulatePoolInfo: \"AmmV4SimulatePoolInfo\",\n  AmmV4SwapBaseIn: \"AmmV4SwapBaseIn\",\n  AmmV4SwapBaseOut: \"AmmV4SwapBaseOut\",\n  AmmV4CreatePool: \"AmmV4CreatePool\",\n  AmmV4InitPool: \"AmmV4InitPool\",\n\n  AmmV5AddLiquidity: \"AmmV5AddLiquidity\",\n  AmmV5RemoveLiquidity: \"AmmV5RemoveLiquidity\",\n  AmmV5SimulatePoolInfo: \"AmmV5SimulatePoolInfo\",\n  AmmV5SwapBaseIn: \"AmmV5SwapBaseIn\",\n  AmmV5SwapBaseOut: \"AmmV5SwapBaseOut\",\n\n  RouteSwap: \"RouteSwap\",\n  RouteSwap1: \"RouteSwap1\",\n  RouteSwap2: \"RouteSwap2\",\n\n  FarmV3Deposit: \"FarmV3Deposit\",\n  FarmV3Withdraw: \"FarmV3Withdraw\",\n  FarmV3CreateLedger: \"FarmV3CreateLedger\",\n\n  FarmV5Deposit: \"FarmV5Deposit\",\n  FarmV5Withdraw: \"FarmV5Withdraw\",\n  FarmV5CreateLedger: \"FarmV5CreateLedger\",\n\n  FarmV6Deposit: \"FarmV6Deposit\",\n  FarmV6Withdraw: \"FarmV6Withdraw\",\n  FarmV6Create: \"FarmV6Create\",\n  FarmV6Restart: \"FarmV6Restart\",\n  FarmV6CreatorAddReward: \"FarmV6CreatorAddReward\",\n  FarmV6CreatorWithdraw: \"FarmV6CreatorWithdraw\",\n};\n"],"mappings":"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","names":[]}