{"version":3,"sources":["../../src/common/logger.ts","../../src/common/txTool/txTool.ts","../../src/common/txTool/lookupTable.ts","../../src/common/accountInfo.ts","../../src/common/bignumber.ts","../../src/module/amount.ts","../../src/module/formatter.ts","../../src/module/fraction.ts","../../src/common/constant.ts","../../src/sega/token/constant.ts","../../src/module/token.ts","../../src/common/pubKey.ts","../../src/module/currency.ts","../../src/module/percent.ts","../../src/module/price.ts","../../src/common/utility.ts","../../src/common/lodash.ts","../../src/common/pda.ts","../../src/common/txTool/txUtils.ts","../../src/common/txTool/txType.ts","../../src/common/programId.ts","../../src/common/transfer.ts","../../src/common/network.ts","../../src/sega/moduleBase.ts"],"sourcesContent":["import { get, set } from \"lodash\";\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 Date.now().toString();\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","import {\n  Commitment,\n  Connection,\n  PublicKey,\n  sendAndConfirmTransaction,\n  SignatureResult,\n  Signer,\n  SystemProgram,\n  Transaction,\n  TransactionInstruction,\n  TransactionMessage,\n  VersionedTransaction,\n} from \"@solana/web3.js\";\nimport axios from \"axios\";\n\nimport { Api } from \"../../api\";\nimport { ComputeBudgetConfig, SignAllTransactions, TxTipConfig } from \"@/sega/type\";\nimport { Cluster } from \"../../solana\";\nimport { Owner } from \"../owner\";\nimport { CacheLTA, getMultipleLookupTableInfo, LOOKUP_TABLE_CACHE } from \"./lookupTable\";\nimport { InstructionType, TxVersion } from \"./txType\";\nimport {\n  addComputeBudget,\n  checkLegacyTxSize,\n  checkV0TxSize,\n  confirmTransaction,\n  getRecentBlockHash,\n  printSimulate,\n} from \"./txUtils\";\n\ninterface SolanaFeeInfo {\n  min: number;\n  max: number;\n  avg: number;\n  priorityTx: number;\n  nonVotes: number;\n  priorityRatio: number;\n  avgCuPerBlock: number;\n  blockspaceUsageRatio: number;\n}\ntype SolanaFeeInfoJson = {\n  \"1\": SolanaFeeInfo;\n  \"5\": SolanaFeeInfo;\n  \"15\": SolanaFeeInfo;\n};\n\ninterface ExecuteParams {\n  skipPreflight?: boolean;\n  recentBlockHash?: string;\n  sendAndConfirm?: boolean;\n}\n\ninterface TxBuilderInit {\n  connection: Connection;\n  feePayer: PublicKey;\n  cluster: Cluster;\n  owner?: Owner;\n  blockhashCommitment?: Commitment;\n  loopMultiTxStatus?: boolean;\n  api?: Api;\n  signAllTransactions?: SignAllTransactions;\n}\n\nexport interface AddInstructionParam {\n  addresses?: Record<string, PublicKey>;\n  instructions?: TransactionInstruction[];\n  endInstructions?: TransactionInstruction[];\n  lookupTableAddress?: string[];\n  signers?: Signer[];\n  instructionTypes?: string[];\n  endInstructionTypes?: string[];\n}\n\nexport interface TxBuildData<T = Record<string, any>> {\n  builder: TxBuilder;\n  transaction: Transaction;\n  instructionTypes: string[];\n  signers: Signer[];\n  execute: (params?: ExecuteParams) => Promise<{ txId: string; signedTx: Transaction }>;\n  extInfo: T;\n}\n\nexport interface TxV0BuildData<T = Record<string, any>> extends Omit<TxBuildData<T>, \"transaction\" | \"execute\"> {\n  builder: TxBuilder;\n  transaction: VersionedTransaction;\n  buildProps?: {\n    lookupTableCache?: CacheLTA;\n    lookupTableAddress?: string[];\n  };\n  execute: (params?: ExecuteParams) => Promise<{ txId: string; signedTx: VersionedTransaction }>;\n}\n\ntype TxUpdateParams = {\n  txId: string;\n  status: \"success\" | \"error\" | \"sent\";\n  signedTx: Transaction | VersionedTransaction;\n};\nexport interface MultiTxExecuteParam extends ExecuteParams {\n  sequentially: boolean;\n  skipTxCount?: number;\n  onTxUpdate?: (completeTxs: TxUpdateParams[]) => void;\n}\nexport interface MultiTxBuildData<T = Record<string, any>> {\n  builder: TxBuilder;\n  transactions: Transaction[];\n  instructionTypes: string[];\n  signers: Signer[][];\n  execute: (executeParams?: MultiTxExecuteParam) => Promise<{ txIds: string[]; signedTxs: Transaction[] }>;\n  extInfo: T;\n}\n\nexport interface MultiTxV0BuildData<T = Record<string, any>>\n  extends Omit<MultiTxBuildData<T>, \"transactions\" | \"execute\"> {\n  builder: TxBuilder;\n  transactions: VersionedTransaction[];\n  buildProps?: {\n    lookupTableCache?: CacheLTA;\n    lookupTableAddress?: string[];\n  };\n  execute: (executeParams?: MultiTxExecuteParam) => Promise<{ txIds: string[]; signedTxs: VersionedTransaction[] }>;\n}\n\nexport type MakeMultiTxData<T = TxVersion.LEGACY, O = Record<string, any>> = T extends TxVersion.LEGACY\n  ? MultiTxBuildData<O>\n  : MultiTxV0BuildData<O>;\n\nexport type MakeTxData<T = TxVersion.LEGACY, O = Record<string, any>> = T extends TxVersion.LEGACY\n  ? TxBuildData<O>\n  : TxV0BuildData<O>;\n\nconst LOOP_INTERVAL = 2000;\n\nexport class TxBuilder {\n  private connection: Connection;\n  private owner?: Owner;\n  private instructions: TransactionInstruction[] = [];\n  private endInstructions: TransactionInstruction[] = [];\n  private lookupTableAddress: string[] = [];\n  private signers: Signer[] = [];\n  private instructionTypes: string[] = [];\n  private endInstructionTypes: string[] = [];\n  private feePayer: PublicKey;\n  private cluster: Cluster;\n  private signAllTransactions?: SignAllTransactions;\n  private blockhashCommitment?: Commitment;\n  private loopMultiTxStatus: boolean;\n\n  constructor(params: TxBuilderInit) {\n    this.connection = params.connection;\n    this.feePayer = params.feePayer;\n    this.signAllTransactions = params.signAllTransactions;\n    this.owner = params.owner;\n    this.cluster = params.cluster;\n    this.blockhashCommitment = params.blockhashCommitment;\n    this.loopMultiTxStatus = !!params.loopMultiTxStatus;\n  }\n\n  get AllTxData(): {\n    instructions: TransactionInstruction[];\n    endInstructions: TransactionInstruction[];\n    signers: Signer[];\n    instructionTypes: string[];\n    endInstructionTypes: string[];\n    lookupTableAddress: string[];\n  } {\n    return {\n      instructions: this.instructions,\n      endInstructions: this.endInstructions,\n      signers: this.signers,\n      instructionTypes: this.instructionTypes,\n      endInstructionTypes: this.endInstructionTypes,\n      lookupTableAddress: this.lookupTableAddress,\n    };\n  }\n\n  get allInstructions(): TransactionInstruction[] {\n    return [...this.instructions, ...this.endInstructions];\n  }\n\n  public async getComputeBudgetConfig(): Promise<ComputeBudgetConfig | undefined> {\n    const json = (\n      await axios.get<SolanaFeeInfoJson>(`https://solanacompass.com/api/fees?cacheFreshTime=${5 * 60 * 1000}`)\n    ).data;\n    const { avg } = json?.[15] ?? {};\n    if (!avg) return undefined;\n    return {\n      units: 600000,\n      microLamports: Math.min(Math.ceil((avg * 1000000) / 600000), 25000),\n    };\n  }\n\n  public addCustomComputeBudget(config?: ComputeBudgetConfig): boolean {\n    if (config) {\n      const { instructions, instructionTypes } = addComputeBudget(config);\n      this.instructions.unshift(...instructions);\n      this.instructionTypes.unshift(...instructionTypes);\n      return true;\n    }\n    return false;\n  }\n\n  public addTipInstruction(tipConfig?: TxTipConfig): boolean {\n    if (tipConfig) {\n      this.endInstructions.push(\n        SystemProgram.transfer({\n          fromPubkey: tipConfig.feePayer ?? this.feePayer,\n          toPubkey: new PublicKey(tipConfig.address),\n          lamports: BigInt(tipConfig.amount.toString()),\n        }),\n      );\n      this.endInstructionTypes.push(InstructionType.TransferTip);\n      return true;\n    }\n    return false;\n  }\n\n  public async calComputeBudget({\n    config: propConfig,\n    defaultIns,\n  }: {\n    config?: ComputeBudgetConfig;\n    defaultIns?: TransactionInstruction[];\n  }): Promise<void> {\n    try {\n      const config = propConfig || (await this.getComputeBudgetConfig());\n      if (this.addCustomComputeBudget(config)) return;\n      defaultIns && this.instructions.unshift(...defaultIns);\n    } catch {\n      defaultIns && this.instructions.unshift(...defaultIns);\n    }\n  }\n\n  public addInstruction({\n    instructions = [],\n    endInstructions = [],\n    signers = [],\n    instructionTypes = [],\n    endInstructionTypes = [],\n    lookupTableAddress = [],\n  }: AddInstructionParam): TxBuilder {\n    this.instructions.push(...instructions);\n    this.endInstructions.push(...endInstructions);\n    this.signers.push(...signers);\n    this.instructionTypes.push(...instructionTypes);\n    this.endInstructionTypes.push(...endInstructionTypes);\n    this.lookupTableAddress.push(...lookupTableAddress.filter((address) => address !== PublicKey.default.toString()));\n    return this;\n  }\n\n  public async versionBuild<O = Record<string, any>>({\n    txVersion,\n    extInfo,\n  }: {\n    txVersion?: TxVersion;\n    extInfo?: O;\n  }): Promise<MakeTxData<TxVersion.LEGACY, O> | MakeTxData<TxVersion.V0, O>> {\n    if (txVersion === TxVersion.V0) return (await this.buildV0({ ...(extInfo || {}) })) as MakeTxData<TxVersion.V0, O>;\n    return this.build<O>(extInfo) as MakeTxData<TxVersion.LEGACY, O>;\n  }\n\n  public build<O = Record<string, any>>(extInfo?: O): MakeTxData<TxVersion.LEGACY, O> {\n    const transaction = new Transaction();\n    if (this.allInstructions.length) transaction.add(...this.allInstructions);\n    transaction.feePayer = this.feePayer;\n    if (this.owner?.signer && !this.signers.some((s) => s.publicKey.equals(this.owner!.publicKey)))\n      this.signers.push(this.owner.signer);\n\n    return {\n      builder: this,\n      transaction,\n      signers: this.signers,\n      instructionTypes: [...this.instructionTypes, ...this.endInstructionTypes],\n      execute: async (params) => {\n        const { recentBlockHash: propBlockHash, skipPreflight = true, sendAndConfirm } = params || {};\n        const recentBlockHash = propBlockHash ?? (await getRecentBlockHash(this.connection, this.blockhashCommitment));\n        transaction.recentBlockhash = recentBlockHash;\n        if (this.signers.length) transaction.sign(...this.signers);\n\n        printSimulate([transaction]);\n        if (this.owner?.isKeyPair) {\n          const txId = sendAndConfirm\n            ? await sendAndConfirmTransaction(\n              this.connection,\n              transaction,\n              this.signers.find((s) => s.publicKey.equals(this.owner!.publicKey))\n                ? this.signers\n                : [...this.signers, this.owner.signer!],\n              { skipPreflight },\n            )\n            : await this.connection.sendRawTransaction(transaction.serialize(), { skipPreflight });\n\n          return {\n            txId,\n            signedTx: transaction,\n          };\n        }\n        if (this.signAllTransactions) {\n          const txs = await this.signAllTransactions([transaction]);\n          if (this.signers.length) {\n            for (const item of txs) {\n              try {\n                item.sign(...this.signers)\n              } catch (e) {\n                //\n              }\n            }\n          }\n          return {\n            txId: await this.connection.sendRawTransaction(txs[0].serialize(), { skipPreflight }),\n            signedTx: txs[0],\n          };\n        }\n        throw new Error(\"please provide owner in keypair format or signAllTransactions function\");\n      },\n      extInfo: extInfo || ({} as O),\n    };\n  }\n\n  public buildMultiTx<T = Record<string, any>>(params: {\n    extraPreBuildData?: MakeTxData<TxVersion.LEGACY>[];\n    extInfo?: T;\n  }): MultiTxBuildData {\n    const { extraPreBuildData = [], extInfo } = params;\n    const { transaction } = this.build(extInfo);\n\n    const filterExtraBuildData = extraPreBuildData.filter((data) => data.transaction.instructions.length > 0);\n\n    const allTransactions: Transaction[] = [transaction, ...filterExtraBuildData.map((data) => data.transaction)];\n    const allSigners: Signer[][] = [this.signers, ...filterExtraBuildData.map((data) => data.signers)];\n    const allInstructionTypes: string[] = [\n      ...this.instructionTypes,\n      ...filterExtraBuildData.map((data) => data.instructionTypes).flat(),\n    ];\n\n    if (this.owner?.signer) {\n      allSigners.forEach((signers) => {\n        if (!signers.some((s) => s.publicKey.equals(this.owner!.publicKey))) this.signers.push(this.owner!.signer!);\n      });\n    }\n\n    return {\n      builder: this,\n      transactions: allTransactions,\n      signers: allSigners,\n      instructionTypes: allInstructionTypes,\n      execute: async (executeParams?: MultiTxExecuteParam) => {\n        const {\n          sequentially,\n          onTxUpdate,\n          skipTxCount = 0,\n          recentBlockHash: propBlockHash,\n          skipPreflight = true,\n        } = executeParams || {};\n        const recentBlockHash = propBlockHash ?? (await getRecentBlockHash(this.connection, this.blockhashCommitment));\n        if (this.owner?.isKeyPair) {\n          if (sequentially) {\n            const txIds: string[] = [];\n            let i = 0;\n            for (const tx of allTransactions) {\n              ++i;\n              if (i <= skipTxCount) continue;\n              const txId = await sendAndConfirmTransaction(\n                this.connection,\n                tx,\n                this.signers.find((s) => s.publicKey.equals(this.owner!.publicKey))\n                  ? this.signers\n                  : [...this.signers, this.owner.signer!],\n                { skipPreflight },\n              );\n              txIds.push(txId);\n            }\n\n            return {\n              txIds,\n              signedTxs: allTransactions,\n            };\n          }\n          return {\n            txIds: await await Promise.all(\n              allTransactions.map(async (tx) => {\n                tx.recentBlockhash = recentBlockHash;\n                return await this.connection.sendRawTransaction(tx.serialize(), { skipPreflight });\n              }),\n            ),\n            signedTxs: allTransactions,\n          };\n        }\n\n        if (this.signAllTransactions) {\n          const partialSignedTxs = allTransactions.map((tx, idx) => {\n            tx.recentBlockhash = recentBlockHash;\n            if (allSigners[idx].length) tx.sign(...allSigners[idx]);\n            return tx;\n          });\n          printSimulate(partialSignedTxs);\n          const signedTxs = await this.signAllTransactions(partialSignedTxs);\n          if (sequentially) {\n            let i = 0;\n            const processedTxs: TxUpdateParams[] = [];\n            const checkSendTx = async (): Promise<void> => {\n              if (!signedTxs[i]) return;\n              const txId = await this.connection.sendRawTransaction(signedTxs[i].serialize(), { skipPreflight });\n              processedTxs.push({ txId, status: \"sent\", signedTx: signedTxs[i] });\n              onTxUpdate?.([...processedTxs]);\n              i++;\n              let confirmed = false;\n              // eslint-disable-next-line\n              let intervalId: any = null,\n                subSignatureId: number | null = null;\n              const cbk = (signatureResult: SignatureResult): void => {\n                intervalId !== null && clearInterval(intervalId);\n                subSignatureId !== null && this.connection.removeSignatureListener(subSignatureId);\n                const targetTxIdx = processedTxs.findIndex((tx) => tx.txId === txId);\n                if (targetTxIdx > -1) {\n                  if (processedTxs[targetTxIdx].status === \"error\" || processedTxs[targetTxIdx].status === \"success\")\n                    return;\n                  processedTxs[targetTxIdx].status = signatureResult.err ? \"error\" : \"success\";\n                }\n                onTxUpdate?.([...processedTxs]);\n                if (!signatureResult.err) checkSendTx();\n              };\n\n              if (this.loopMultiTxStatus)\n                intervalId = setInterval(async () => {\n                  if (confirmed) {\n                    clearInterval(intervalId!);\n                    return;\n                  }\n                  try {\n                    const r = await this.connection.getTransaction(txId, {\n                      commitment: \"confirmed\",\n                      maxSupportedTransactionVersion: TxVersion.V0,\n                    });\n                    if (r) {\n                      confirmed = true;\n                      clearInterval(intervalId!);\n                      cbk({ err: r.meta?.err || null });\n                      console.log(\"tx status from getTransaction:\", txId);\n                    }\n                  } catch (e) {\n                    confirmed = true;\n                    clearInterval(intervalId!);\n                    console.error(\"getTransaction timeout:\", e, txId);\n                  }\n                }, LOOP_INTERVAL);\n\n              subSignatureId = this.connection.onSignature(\n                txId,\n                (result) => {\n                  if (confirmed) {\n                    this.connection.removeSignatureListener(subSignatureId!);\n                    return;\n                  }\n                  confirmed = true;\n                  cbk(result);\n                },\n                \"confirmed\",\n              );\n              this.connection.getSignatureStatus(txId);\n            };\n            await checkSendTx();\n            return {\n              txIds: processedTxs.map((d) => d.txId),\n              signedTxs,\n            };\n          } else {\n            const txIds: string[] = [];\n            for (let i = 0; i < signedTxs.length; i += 1) {\n              const txId = await this.connection.sendRawTransaction(signedTxs[i].serialize(), { skipPreflight });\n              txIds.push(txId);\n            }\n            return {\n              txIds,\n              signedTxs,\n            };\n          }\n        }\n        throw new Error(\"please provide owner in keypair format or signAllTransactions function\");\n      },\n      extInfo: extInfo || {},\n    };\n  }\n\n  public async versionMultiBuild<T extends TxVersion, O = Record<string, any>>({\n    extraPreBuildData,\n    txVersion,\n    extInfo,\n  }: {\n    extraPreBuildData?: MakeTxData<TxVersion.V0>[] | MakeTxData<TxVersion.LEGACY>[];\n    txVersion?: T;\n    extInfo?: O;\n  }): Promise<MakeMultiTxData<T, O>> {\n    if (txVersion === TxVersion.V0)\n      return (await this.buildV0MultiTx({\n        extraPreBuildData: extraPreBuildData as MakeTxData<TxVersion.V0>[],\n        buildProps: extInfo || {},\n      })) as MakeMultiTxData<T, O>;\n    return this.buildMultiTx<O>({\n      extraPreBuildData: extraPreBuildData as MakeTxData<TxVersion.LEGACY>[],\n      extInfo,\n    }) as MakeMultiTxData<T, O>;\n  }\n\n  public async buildV0<O = Record<string, any>>(\n    props?: O & {\n      lookupTableCache?: CacheLTA;\n      lookupTableAddress?: string[];\n      forerunCreate?: boolean;\n      recentBlockhash?: string;\n    },\n  ): Promise<MakeTxData<TxVersion.V0, O>> {\n    const {\n      lookupTableCache = {},\n      lookupTableAddress = [],\n      forerunCreate,\n      recentBlockhash: propRecentBlockhash,\n      ...extInfo\n    } = props || {};\n    const lookupTableAddressAccount = {\n      ...(this.cluster === \"devnet\" ? {} : LOOKUP_TABLE_CACHE),\n      ...lookupTableCache,\n    };\n    const allLTA = Array.from(new Set<string>([...lookupTableAddress, ...this.lookupTableAddress]));\n    const needCacheLTA: PublicKey[] = [];\n    for (const item of allLTA) {\n      if (lookupTableAddressAccount[item] === undefined) needCacheLTA.push(new PublicKey(item));\n    }\n    const newCacheLTA = await getMultipleLookupTableInfo({ connection: this.connection, address: needCacheLTA });\n    for (const [key, value] of Object.entries(newCacheLTA)) lookupTableAddressAccount[key] = value;\n\n    const recentBlockhash = forerunCreate\n      ? PublicKey.default.toBase58()\n      : propRecentBlockhash ?? (await getRecentBlockHash(this.connection, this.blockhashCommitment));\n\n    const messageV0 = new TransactionMessage({\n      payerKey: this.feePayer,\n      recentBlockhash,\n      instructions: [...this.allInstructions],\n    }).compileToV0Message(Object.values(lookupTableAddressAccount));\n\n    if (this.owner?.signer && !this.signers.some((s) => s.publicKey.equals(this.owner!.publicKey)))\n      this.signers.push(this.owner.signer);\n    const transaction = new VersionedTransaction(messageV0);\n    transaction.sign(this.signers);\n    return {\n      builder: this,\n      transaction,\n      signers: this.signers,\n      instructionTypes: [...this.instructionTypes, ...this.endInstructionTypes],\n      execute: async (params) => {\n        const { skipPreflight = true, sendAndConfirm } = params || {};\n        printSimulate([transaction]);\n        if (this.owner?.isKeyPair) {\n          const txId = await this.connection.sendTransaction(transaction, { skipPreflight });\n          if (sendAndConfirm) {\n            await confirmTransaction(this.connection, txId);\n          }\n\n          return {\n            txId,\n            signedTx: transaction,\n          };\n        }\n        if (this.signAllTransactions) {\n          const txs = await this.signAllTransactions<VersionedTransaction>([transaction]);\n          if (this.signers.length) {\n            for (const item of txs) {\n              try {\n                item.sign(this.signers)\n              } catch (e) {\n                //\n              }\n            }\n          }\n          return {\n            txId: await this.connection.sendTransaction(txs[0], { skipPreflight }),\n            signedTx: txs[0],\n          };\n        }\n        throw new Error(\"please provide owner in keypair format or signAllTransactions function\");\n      },\n      extInfo: (extInfo || {}) as O,\n    };\n  }\n\n  public async buildV0MultiTx<T = Record<string, any>>(params: {\n    extraPreBuildData?: MakeTxData<TxVersion.V0>[];\n    buildProps?: T & {\n      lookupTableCache?: CacheLTA;\n      lookupTableAddress?: string[];\n      forerunCreate?: boolean;\n      recentBlockhash?: string;\n    };\n  }): Promise<MultiTxV0BuildData> {\n    const { extraPreBuildData = [], buildProps } = params;\n    const { transaction } = await this.buildV0(buildProps);\n\n    const filterExtraBuildData = extraPreBuildData.filter((data) => data.builder.instructions.length > 0);\n\n    const allTransactions: VersionedTransaction[] = [\n      transaction,\n      ...filterExtraBuildData.map((data) => data.transaction),\n    ];\n    const allSigners: Signer[][] = [this.signers, ...filterExtraBuildData.map((data) => data.signers)];\n    const allInstructionTypes: string[] = [\n      ...this.instructionTypes,\n      ...filterExtraBuildData.map((data) => data.instructionTypes).flat(),\n    ];\n\n    if (this.owner?.signer) {\n      allSigners.forEach((signers) => {\n        if (!signers.some((s) => s.publicKey.equals(this.owner!.publicKey))) this.signers.push(this.owner!.signer!);\n      });\n    }\n\n    allTransactions.forEach(async (tx, idx) => {\n      tx.sign(allSigners[idx]);\n    });\n\n    return {\n      builder: this,\n      transactions: allTransactions,\n      signers: allSigners,\n      instructionTypes: allInstructionTypes,\n      buildProps,\n      execute: async (executeParams?: MultiTxExecuteParam) => {\n        const { sequentially, onTxUpdate, recentBlockHash: propBlockHash, skipPreflight = true } = executeParams || {};\n        if (propBlockHash) allTransactions.forEach((tx) => (tx.message.recentBlockhash = propBlockHash));\n        printSimulate(allTransactions);\n        if (this.owner?.isKeyPair) {\n          if (sequentially) {\n            const txIds: string[] = [];\n            for (const tx of allTransactions) {\n              const txId = await this.connection.sendTransaction(tx, { skipPreflight });\n              await confirmTransaction(this.connection, txId);\n              txIds.push(txId);\n            }\n\n            return { txIds, signedTxs: allTransactions };\n          }\n\n          return {\n            txIds: await Promise.all(\n              allTransactions.map(async (tx) => {\n                return await this.connection.sendTransaction(tx, { skipPreflight });\n              }),\n            ),\n            signedTxs: allTransactions,\n          };\n        }\n\n        if (this.signAllTransactions) {\n          const signedTxs = await this.signAllTransactions(allTransactions);\n\n          if (sequentially) {\n            let i = 0;\n            const processedTxs: TxUpdateParams[] = [];\n            const checkSendTx = async (): Promise<void> => {\n              if (!signedTxs[i]) return;\n              const txId = await this.connection.sendTransaction(signedTxs[i], { skipPreflight });\n              processedTxs.push({ txId, status: \"sent\", signedTx: signedTxs[i] });\n              onTxUpdate?.([...processedTxs]);\n              i++;\n\n              let confirmed = false;\n              // eslint-disable-next-line\n              let intervalId: NodeJS.Timer | null = null,\n                subSignatureId: number | null = null;\n              const cbk = (signatureResult: SignatureResult): void => {\n                intervalId !== null && clearInterval(intervalId);\n                subSignatureId !== null && this.connection.removeSignatureListener(subSignatureId);\n                const targetTxIdx = processedTxs.findIndex((tx) => tx.txId === txId);\n                if (targetTxIdx > -1) {\n                  if (processedTxs[targetTxIdx].status === \"error\" || processedTxs[targetTxIdx].status === \"success\")\n                    return;\n                  processedTxs[targetTxIdx].status = signatureResult.err ? \"error\" : \"success\";\n                }\n                onTxUpdate?.([...processedTxs]);\n                if (!signatureResult.err) checkSendTx();\n              };\n\n              if (this.loopMultiTxStatus)\n                intervalId = setInterval(async () => {\n                  if (confirmed) {\n                    clearInterval(intervalId!);\n                    return;\n                  }\n                  try {\n                    const r = await this.connection.getTransaction(txId, {\n                      commitment: \"confirmed\",\n                      maxSupportedTransactionVersion: TxVersion.V0,\n                    });\n                    if (r) {\n                      confirmed = true;\n                      clearInterval(intervalId!);\n                      cbk({ err: r.meta?.err || null });\n                      console.log(\"tx status from getTransaction:\", txId);\n                    }\n                  } catch (e) {\n                    confirmed = true;\n                    clearInterval(intervalId!);\n                    console.error(\"getTransaction timeout:\", e, txId);\n                  }\n                }, LOOP_INTERVAL);\n\n              subSignatureId = this.connection.onSignature(\n                txId,\n                (result) => {\n                  if (confirmed) {\n                    this.connection.removeSignatureListener(subSignatureId!);\n                    return;\n                  }\n                  confirmed = true;\n                  cbk(result);\n                },\n                \"confirmed\",\n              );\n              this.connection.getSignatureStatus(txId);\n            };\n            checkSendTx();\n            return {\n              txIds: [],\n              signedTxs,\n            };\n          } else {\n            const txIds: string[] = [];\n            for (let i = 0; i < signedTxs.length; i += 1) {\n              const txId = await this.connection.sendTransaction(signedTxs[i], { skipPreflight });\n              txIds.push(txId);\n            }\n            return { txIds, signedTxs };\n          }\n        }\n        throw new Error(\"please provide owner in keypair format or signAllTransactions function\");\n      },\n      extInfo: buildProps || {},\n    };\n  }\n\n  public async sizeCheckBuild(\n    props?: Record<string, any> & { computeBudgetConfig?: ComputeBudgetConfig; splitIns?: TransactionInstruction[] },\n  ): Promise<MultiTxBuildData> {\n    const { splitIns = [], computeBudgetConfig, ...extInfo } = props || {};\n    const computeBudgetData: { instructions: TransactionInstruction[]; instructionTypes: string[] } =\n      computeBudgetConfig\n        ? addComputeBudget(computeBudgetConfig)\n        : {\n          instructions: [],\n          instructionTypes: [],\n        };\n\n    const signerKey: { [key: string]: Signer } = this.signers.reduce(\n      (acc, cur) => ({ ...acc, [cur.publicKey.toBase58()]: cur }),\n      {},\n    );\n\n    const allTransactions: Transaction[] = [];\n    const allSigners: Signer[][] = [];\n\n    let instructionQueue: TransactionInstruction[] = [];\n    let splitInsIdx = 0;\n    this.allInstructions.forEach((item) => {\n      const _itemIns = [...instructionQueue, item];\n      const _itemInsWithCompute = computeBudgetConfig ? [...computeBudgetData.instructions, ..._itemIns] : _itemIns;\n      const _signerStrs = new Set<string>(\n        _itemIns.map((i) => i.keys.filter((ii) => ii.isSigner).map((ii) => ii.pubkey.toString())).flat(),\n      );\n      const _signer = [..._signerStrs.values()].map((i) => new PublicKey(i));\n\n      if (\n        item !== splitIns[splitInsIdx] &&\n        instructionQueue.length < 12 &&\n        (checkLegacyTxSize({ instructions: _itemInsWithCompute, payer: this.feePayer, signers: _signer }) ||\n          checkLegacyTxSize({ instructions: _itemIns, payer: this.feePayer, signers: _signer }))\n      ) {\n        // current ins add to queue still not exceed tx size limit\n        instructionQueue.push(item);\n      } else {\n        if (instructionQueue.length === 0) throw Error(\"item ins too big\");\n        splitInsIdx += item === splitIns[splitInsIdx] ? 1 : 0;\n        // if add computeBudget still not exceed tx size limit\n        if (\n          checkLegacyTxSize({\n            instructions: computeBudgetConfig\n              ? [...computeBudgetData.instructions, ...instructionQueue]\n              : [...instructionQueue],\n            payer: this.feePayer,\n            signers: _signer,\n          })\n        ) {\n          allTransactions.push(new Transaction().add(...computeBudgetData.instructions, ...instructionQueue));\n        } else {\n          allTransactions.push(new Transaction().add(...instructionQueue));\n        }\n        allSigners.push(\n          Array.from(\n            new Set<string>(\n              instructionQueue.map((i) => i.keys.filter((ii) => ii.isSigner).map((ii) => ii.pubkey.toString())).flat(),\n            ),\n          )\n            .map((i) => signerKey[i])\n            .filter((i) => i !== undefined),\n        );\n        instructionQueue = [item];\n      }\n    });\n\n    if (instructionQueue.length > 0) {\n      const _signerStrs = new Set<string>(\n        instructionQueue.map((i) => i.keys.filter((ii) => ii.isSigner).map((ii) => ii.pubkey.toString())).flat(),\n      );\n      const _signers = [..._signerStrs.values()].map((i) => signerKey[i]).filter((i) => i !== undefined);\n\n      if (\n        checkLegacyTxSize({\n          instructions: computeBudgetConfig\n            ? [...computeBudgetData.instructions, ...instructionQueue]\n            : [...instructionQueue],\n          payer: this.feePayer,\n          signers: _signers.map((s) => s.publicKey),\n        })\n      ) {\n        allTransactions.push(new Transaction().add(...computeBudgetData.instructions, ...instructionQueue));\n      } else {\n        allTransactions.push(new Transaction().add(...instructionQueue));\n      }\n      allSigners.push(_signers);\n    }\n    allTransactions.forEach((tx) => (tx.feePayer = this.feePayer));\n\n    if (this.owner?.signer) {\n      allSigners.forEach((signers) => {\n        if (!signers.some((s) => s.publicKey.equals(this.owner!.publicKey))) signers.push(this.owner!.signer!);\n      });\n    }\n\n    return {\n      builder: this,\n      transactions: allTransactions,\n      signers: allSigners,\n      instructionTypes: this.instructionTypes,\n      execute: async (executeParams?: MultiTxExecuteParam) => {\n        const {\n          sequentially,\n          onTxUpdate,\n          skipTxCount = 0,\n          recentBlockHash: propBlockHash,\n          skipPreflight = true,\n        } = executeParams || {};\n        const recentBlockHash = propBlockHash ?? (await getRecentBlockHash(this.connection, this.blockhashCommitment));\n        allTransactions.forEach(async (tx, idx) => {\n          tx.recentBlockhash = recentBlockHash;\n          if (allSigners[idx].length) tx.sign(...allSigners[idx]);\n        });\n        printSimulate(allTransactions);\n        if (this.owner?.isKeyPair) {\n          if (sequentially) {\n            let i = 0;\n            const txIds: string[] = [];\n            for (const tx of allTransactions) {\n              ++i;\n              if (i <= skipTxCount) {\n                txIds.push(\"tx skipped\");\n                continue;\n              }\n              const txId = await sendAndConfirmTransaction(\n                this.connection,\n                tx,\n                this.signers.find((s) => s.publicKey.equals(this.owner!.publicKey))\n                  ? this.signers\n                  : [...this.signers, this.owner.signer!],\n                { skipPreflight },\n              );\n              txIds.push(txId);\n            }\n\n            return {\n              txIds,\n              signedTxs: allTransactions,\n            };\n          }\n          return {\n            txIds: await Promise.all(\n              allTransactions.map(async (tx) => {\n                return await this.connection.sendRawTransaction(tx.serialize(), { skipPreflight });\n              }),\n            ),\n            signedTxs: allTransactions,\n          };\n        }\n        if (this.signAllTransactions) {\n          const needSignedTx = await this.signAllTransactions(\n            allTransactions.slice(skipTxCount, allTransactions.length),\n          );\n          const signedTxs = [...allTransactions.slice(0, skipTxCount), ...needSignedTx];\n          if (sequentially) {\n            let i = 0;\n            const processedTxs: TxUpdateParams[] = [];\n            const checkSendTx = async (): Promise<void> => {\n              if (!signedTxs[i]) return;\n              if (i < skipTxCount) {\n                // success before, do not send again\n                processedTxs.push({ txId: \"\", status: \"success\", signedTx: signedTxs[i] });\n                onTxUpdate?.([...processedTxs]);\n                i++;\n                checkSendTx();\n              }\n              const txId = await this.connection.sendRawTransaction(signedTxs[i].serialize(), { skipPreflight });\n              processedTxs.push({ txId, status: \"sent\", signedTx: signedTxs[i] });\n              onTxUpdate?.([...processedTxs]);\n              i++;\n\n              let confirmed = false;\n              // eslint-disable-next-line\n              let intervalId: NodeJS.Timer | null = null,\n                subSignatureId: number | null = null;\n              const cbk = (signatureResult: SignatureResult): void => {\n                intervalId !== null && clearInterval(intervalId);\n                subSignatureId !== null && this.connection.removeSignatureListener(subSignatureId);\n                const targetTxIdx = processedTxs.findIndex((tx) => tx.txId === txId);\n                if (targetTxIdx > -1) {\n                  if (processedTxs[targetTxIdx].status === \"error\" || processedTxs[targetTxIdx].status === \"success\")\n                    return;\n                  processedTxs[targetTxIdx].status = signatureResult.err ? \"error\" : \"success\";\n                }\n                onTxUpdate?.([...processedTxs]);\n                if (!signatureResult.err) checkSendTx();\n              };\n\n              if (this.loopMultiTxStatus)\n                intervalId = setInterval(async () => {\n                  if (confirmed) {\n                    clearInterval(intervalId!);\n                    return;\n                  }\n                  try {\n                    const r = await this.connection.getTransaction(txId, {\n                      commitment: \"confirmed\",\n                      maxSupportedTransactionVersion: TxVersion.V0,\n                    });\n                    if (r) {\n                      confirmed = true;\n                      clearInterval(intervalId!);\n                      cbk({ err: r.meta?.err || null });\n                      console.log(\"tx status from getTransaction:\", txId);\n                    }\n                  } catch (e) {\n                    confirmed = true;\n                    clearInterval(intervalId!);\n                    console.error(\"getTransaction timeout:\", e, txId);\n                  }\n                }, LOOP_INTERVAL);\n\n              subSignatureId = this.connection.onSignature(\n                txId,\n                (result) => {\n                  if (confirmed) {\n                    this.connection.removeSignatureListener(subSignatureId!);\n                    return;\n                  }\n                  confirmed = true;\n                  cbk(result);\n                },\n                \"confirmed\",\n              );\n              this.connection.getSignatureStatus(txId);\n            };\n            await checkSendTx();\n            return {\n              txIds: processedTxs.map((d) => d.txId),\n              signedTxs,\n            };\n          } else {\n            const txIds: string[] = [];\n            for (let i = 0; i < signedTxs.length; i += 1) {\n              const txId = await this.connection.sendRawTransaction(signedTxs[i].serialize(), { skipPreflight });\n              txIds.push(txId);\n            }\n            return { txIds, signedTxs };\n          }\n        }\n        throw new Error(\"please provide owner in keypair format or signAllTransactions function\");\n      },\n      extInfo: extInfo || {},\n    };\n  }\n\n  public async sizeCheckBuildV0(\n    props?: Record<string, any> & {\n      computeBudgetConfig?: ComputeBudgetConfig;\n      lookupTableCache?: CacheLTA;\n      lookupTableAddress?: string[];\n      splitIns?: TransactionInstruction[];\n    },\n  ): Promise<MultiTxV0BuildData> {\n    const {\n      computeBudgetConfig,\n      splitIns = [],\n      lookupTableCache = {},\n      lookupTableAddress = [],\n      ...extInfo\n    } = props || {};\n    const lookupTableAddressAccount = {\n      ...(this.cluster === \"devnet\" ? {} : LOOKUP_TABLE_CACHE),\n      ...lookupTableCache,\n    };\n    const allLTA = Array.from(new Set<string>([...this.lookupTableAddress, ...lookupTableAddress]));\n    const needCacheLTA: PublicKey[] = [];\n    for (const item of allLTA) {\n      if (lookupTableAddressAccount[item] === undefined) needCacheLTA.push(new PublicKey(item));\n    }\n    const newCacheLTA = await getMultipleLookupTableInfo({ connection: this.connection, address: needCacheLTA });\n    for (const [key, value] of Object.entries(newCacheLTA)) lookupTableAddressAccount[key] = value;\n\n    const computeBudgetData: { instructions: TransactionInstruction[]; instructionTypes: string[] } =\n      computeBudgetConfig\n        ? addComputeBudget(computeBudgetConfig)\n        : {\n          instructions: [],\n          instructionTypes: [],\n        };\n\n    const blockHash = await getRecentBlockHash(this.connection, this.blockhashCommitment);\n\n    const signerKey: { [key: string]: Signer } = this.signers.reduce(\n      (acc, cur) => ({ ...acc, [cur.publicKey.toBase58()]: cur }),\n      {},\n    );\n    const allTransactions: VersionedTransaction[] = [];\n    const allSigners: Signer[][] = [];\n\n    let instructionQueue: TransactionInstruction[] = [];\n    let splitInsIdx = 0;\n    this.allInstructions.forEach((item) => {\n      const _itemIns = [...instructionQueue, item];\n      const _itemInsWithCompute = computeBudgetConfig ? [...computeBudgetData.instructions, ..._itemIns] : _itemIns;\n      if (\n        item !== splitIns[splitInsIdx] &&\n        instructionQueue.length < 12 &&\n        (checkV0TxSize({ instructions: _itemInsWithCompute, payer: this.feePayer, lookupTableAddressAccount }) ||\n          checkV0TxSize({ instructions: _itemIns, payer: this.feePayer, lookupTableAddressAccount }))\n      ) {\n        // current ins add to queue still not exceed tx size limit\n        instructionQueue.push(item);\n      } else {\n        if (instructionQueue.length === 0) throw Error(\"item ins too big\");\n        splitInsIdx += item === splitIns[splitInsIdx] ? 1 : 0;\n        const lookupTableAddress: undefined | CacheLTA = {};\n        for (const item of [...new Set<string>(allLTA)]) {\n          if (lookupTableAddressAccount[item] !== undefined) lookupTableAddress[item] = lookupTableAddressAccount[item];\n        }\n        // if add computeBudget still not exceed tx size limit\n        if (\n          computeBudgetConfig &&\n          checkV0TxSize({\n            instructions: [...computeBudgetData.instructions, ...instructionQueue],\n            payer: this.feePayer,\n            lookupTableAddressAccount,\n            recentBlockhash: blockHash,\n          })\n        ) {\n          const messageV0 = new TransactionMessage({\n            payerKey: this.feePayer,\n            recentBlockhash: blockHash,\n\n            instructions: [...computeBudgetData.instructions, ...instructionQueue],\n          }).compileToV0Message(Object.values(lookupTableAddressAccount));\n          allTransactions.push(new VersionedTransaction(messageV0));\n        } else {\n          const messageV0 = new TransactionMessage({\n            payerKey: this.feePayer,\n            recentBlockhash: blockHash,\n            instructions: [...instructionQueue],\n          }).compileToV0Message(Object.values(lookupTableAddressAccount));\n          allTransactions.push(new VersionedTransaction(messageV0));\n        }\n        allSigners.push(\n          Array.from(\n            new Set<string>(\n              instructionQueue.map((i) => i.keys.filter((ii) => ii.isSigner).map((ii) => ii.pubkey.toString())).flat(),\n            ),\n          )\n            .map((i) => signerKey[i])\n            .filter((i) => i !== undefined),\n        );\n        instructionQueue = [item];\n      }\n    });\n\n    if (instructionQueue.length > 0) {\n      const _signerStrs = new Set<string>(\n        instructionQueue.map((i) => i.keys.filter((ii) => ii.isSigner).map((ii) => ii.pubkey.toString())).flat(),\n      );\n      const _signers = [..._signerStrs.values()].map((i) => signerKey[i]).filter((i) => i !== undefined);\n\n      if (\n        computeBudgetConfig &&\n        checkV0TxSize({\n          instructions: [...computeBudgetData.instructions, ...instructionQueue],\n          payer: this.feePayer,\n          lookupTableAddressAccount,\n          recentBlockhash: blockHash,\n        })\n      ) {\n        const messageV0 = new TransactionMessage({\n          payerKey: this.feePayer,\n          recentBlockhash: blockHash,\n          instructions: [...computeBudgetData.instructions, ...instructionQueue],\n        }).compileToV0Message(Object.values(lookupTableAddressAccount));\n        allTransactions.push(new VersionedTransaction(messageV0));\n      } else {\n        const messageV0 = new TransactionMessage({\n          payerKey: this.feePayer,\n          recentBlockhash: blockHash,\n          instructions: [...instructionQueue],\n        }).compileToV0Message(Object.values(lookupTableAddressAccount));\n        allTransactions.push(new VersionedTransaction(messageV0));\n      }\n      allSigners.push(_signers);\n    }\n\n    if (this.owner?.signer) {\n      allSigners.forEach((signers) => {\n        if (!signers.some((s) => s.publicKey.equals(this.owner!.publicKey))) signers.push(this.owner!.signer!);\n      });\n    }\n\n    return {\n      builder: this,\n      transactions: allTransactions,\n      buildProps: props,\n      signers: allSigners,\n      instructionTypes: this.instructionTypes,\n      execute: async (executeParams?: MultiTxExecuteParam) => {\n        const {\n          sequentially,\n          onTxUpdate,\n          skipTxCount = 0,\n          recentBlockHash: propBlockHash,\n          skipPreflight = true,\n        } = executeParams || {};\n        allTransactions.map(async (tx, idx) => {\n          if (allSigners[idx].length) tx.sign(allSigners[idx]);\n          if (propBlockHash) tx.message.recentBlockhash = propBlockHash;\n        });\n        printSimulate(allTransactions);\n        if (this.owner?.isKeyPair) {\n          if (sequentially) {\n            let i = 0;\n            const txIds: string[] = [];\n            for (const tx of allTransactions) {\n              ++i;\n              if (i <= skipTxCount) {\n                console.log(\"skip tx: \", i);\n                txIds.push(\"tx skipped\");\n                continue;\n              }\n              const txId = await this.connection.sendTransaction(tx, { skipPreflight });\n              await confirmTransaction(this.connection, txId);\n\n              txIds.push(txId);\n            }\n\n            return { txIds, signedTxs: allTransactions };\n          }\n\n          return {\n            txIds: await Promise.all(\n              allTransactions.map(async (tx) => {\n                return await this.connection.sendTransaction(tx, { skipPreflight });\n              }),\n            ),\n            signedTxs: allTransactions,\n          };\n        }\n        if (this.signAllTransactions) {\n          const needSignedTx = await this.signAllTransactions(\n            allTransactions.slice(skipTxCount, allTransactions.length),\n          );\n          const signedTxs = [...allTransactions.slice(0, skipTxCount), ...needSignedTx];\n          if (sequentially) {\n            let i = 0;\n            const processedTxs: TxUpdateParams[] = [];\n            const checkSendTx = async (): Promise<void> => {\n              if (!signedTxs[i]) return;\n              if (i < skipTxCount) {\n                // success before, do not send again\n                processedTxs.push({ txId: \"\", status: \"success\", signedTx: signedTxs[i] });\n                onTxUpdate?.([...processedTxs]);\n                i++;\n                checkSendTx();\n                return;\n              }\n              const txId = await this.connection.sendTransaction(signedTxs[i], { skipPreflight });\n              processedTxs.push({ txId, status: \"sent\", signedTx: signedTxs[i] });\n              onTxUpdate?.([...processedTxs]);\n              i++;\n\n              let confirmed = false;\n              // eslint-disable-next-line\n              let intervalId: NodeJS.Timer | null = null,\n                subSignatureId: number | null = null;\n              const cbk = (signatureResult: SignatureResult): void => {\n                intervalId !== null && clearInterval(intervalId);\n                subSignatureId !== null && this.connection.removeSignatureListener(subSignatureId);\n                const targetTxIdx = processedTxs.findIndex((tx) => tx.txId === txId);\n                if (targetTxIdx > -1) {\n                  if (processedTxs[targetTxIdx].status === \"error\" || processedTxs[targetTxIdx].status === \"success\")\n                    return;\n                  processedTxs[targetTxIdx].status = signatureResult.err ? \"error\" : \"success\";\n                }\n                onTxUpdate?.([...processedTxs]);\n                if (!signatureResult.err) checkSendTx();\n              };\n\n              if (this.loopMultiTxStatus)\n                intervalId = setInterval(async () => {\n                  if (confirmed) {\n                    clearInterval(intervalId!);\n                    return;\n                  }\n                  try {\n                    const r = await this.connection.getTransaction(txId, {\n                      commitment: \"confirmed\",\n                      maxSupportedTransactionVersion: TxVersion.V0,\n                    });\n                    if (r) {\n                      confirmed = true;\n                      clearInterval(intervalId!);\n                      cbk({ err: r.meta?.err || null });\n                      console.log(\"tx status from getTransaction:\", txId);\n                    }\n                  } catch (e) {\n                    confirmed = true;\n                    clearInterval(intervalId!);\n                    console.error(\"getTransaction timeout:\", e, txId);\n                  }\n                }, LOOP_INTERVAL);\n\n              subSignatureId = this.connection.onSignature(\n                txId,\n                (result) => {\n                  if (confirmed) {\n                    this.connection.removeSignatureListener(subSignatureId!);\n                    return;\n                  }\n                  confirmed = true;\n                  cbk(result);\n                },\n                \"confirmed\",\n              );\n              this.connection.getSignatureStatus(txId);\n            };\n            checkSendTx();\n            return {\n              txIds: [],\n              signedTxs,\n            };\n          } else {\n            const txIds: string[] = [];\n            for (let i = 0; i < signedTxs.length; i += 1) {\n              const txId = await this.connection.sendTransaction(signedTxs[i], { skipPreflight });\n              txIds.push(txId);\n            }\n            return { txIds, signedTxs };\n          }\n        }\n        throw new Error(\"please provide owner in keypair format or signAllTransactions function\");\n      },\n      extInfo: extInfo || {},\n    };\n  }\n}\n","import { Connection, PublicKey, AddressLookupTableAccount } from \"@solana/web3.js\";\nimport { getMultipleAccountsInfo } from \"../accountInfo\";\n\nexport interface CacheLTA {\n  [key: string]: AddressLookupTableAccount;\n}\n\nexport async function getMultipleLookupTableInfo({\n  connection,\n  address,\n}: {\n  connection: Connection;\n  address: PublicKey[];\n}): Promise<CacheLTA> {\n  const dataInfos = await getMultipleAccountsInfo(\n    connection,\n    [...new Set<string>(address.map((i) => i.toString()))].map((i) => new PublicKey(i)),\n  );\n\n  const outDict: CacheLTA = {};\n  for (let i = 0; i < address.length; i++) {\n    const info = dataInfos[i];\n    const key = address[i];\n    if (!info) continue;\n    const lookupAccount = new AddressLookupTableAccount({\n      key,\n      state: AddressLookupTableAccount.deserialize(info.data),\n    });\n    outDict[key.toString()] = lookupAccount;\n    LOOKUP_TABLE_CACHE[key.toString()] = lookupAccount;\n  }\n\n  return outDict;\n}\n\nexport const LOOKUP_TABLE_CACHE: CacheLTA = {};\n","import { AccountInfo, Commitment, Connection, PublicKey } from \"@solana/web3.js\";\nimport { ReturnTypeFetchMultipleMintInfos } from \"@/sega/type\";\nimport { WSOLMint, chunkArray, solToWSol } from \"./\";\nimport { createLogger } from \"./logger\";\nimport { MINT_SIZE, TOKEN_PROGRAM_ID, getTransferFeeConfig, unpackMint } from \"@solana/spl-token\";\n\ninterface MultipleAccountsJsonRpcResponse {\n  jsonrpc: string;\n  id: string;\n  error?: {\n    code: number;\n    message: string;\n  };\n  result: {\n    context: { slot: number };\n    value: { data: Array<string>; executable: boolean; lamports: number; owner: string; rentEpoch: number }[];\n  };\n}\n\nexport interface GetMultipleAccountsInfoConfig {\n  batchRequest?: boolean;\n  commitment?: Commitment;\n  chunkCount?: number;\n}\n\nconst logger = createLogger(\"Sega_accountInfo_util\");\n\nexport async function getMultipleAccountsInfo(\n  connection: Connection,\n  publicKeys: PublicKey[],\n  config?: GetMultipleAccountsInfoConfig,\n): Promise<(AccountInfo<Buffer> | null)[]> {\n  const {\n    batchRequest,\n    commitment = \"confirmed\",\n    chunkCount = 100,\n  } = {\n    batchRequest: false,\n    ...config,\n  };\n\n  const chunkedKeys = chunkArray(publicKeys, chunkCount);\n  let results: (AccountInfo<Buffer> | null)[][] = new Array(chunkedKeys.length).fill([]);\n\n  if (batchRequest) {\n    const batch = chunkedKeys.map((keys) => {\n      const args = connection._buildArgs([keys.map((key) => key.toBase58())], commitment, \"base64\");\n      return {\n        methodName: \"getMultipleAccounts\",\n        args,\n      };\n    });\n\n    const _batch = chunkArray(batch, 10);\n\n    const unsafeResponse: MultipleAccountsJsonRpcResponse[] = await (\n      await Promise.all(_batch.map(async (i) => await (connection as any)._rpcBatchRequest(i)))\n    ).flat();\n    results = unsafeResponse.map((unsafeRes: MultipleAccountsJsonRpcResponse) => {\n      if (unsafeRes.error)\n        logger.logWithError(`failed to get info for multiple accounts, RPC_ERROR, ${unsafeRes.error.message}`);\n\n      return unsafeRes.result.value.map((accountInfo) => {\n        if (accountInfo) {\n          const { data, executable, lamports, owner, rentEpoch } = accountInfo;\n\n          if (data.length !== 2 && data[1] !== \"base64\") logger.logWithError(`info must be base64 encoded, RPC_ERROR`);\n\n          return {\n            data: Buffer.from(data[0], \"base64\"),\n            executable,\n            lamports,\n            owner: new PublicKey(owner),\n            rentEpoch,\n          };\n        }\n        return null;\n      });\n    });\n  } else {\n    try {\n      results = (await Promise.all(\n        chunkedKeys.map((keys) => connection.getMultipleAccountsInfo(keys, commitment)),\n      )) as (AccountInfo<Buffer> | null)[][];\n    } catch (error) {\n      if (error instanceof Error) {\n        logger.logWithError(`failed to get info for multiple accounts, RPC_ERROR, ${error.message}`);\n      }\n    }\n  }\n\n  return results.flat();\n}\n\nexport async function getMultipleAccountsInfoWithCustomFlags<T extends { pubkey: PublicKey }>(\n  connection: Connection,\n  publicKeysWithCustomFlag: T[],\n  config?: GetMultipleAccountsInfoConfig,\n): Promise<({ accountInfo: AccountInfo<Buffer> | null } & T)[]> {\n  const multipleAccountsInfo = await getMultipleAccountsInfo(\n    connection,\n    publicKeysWithCustomFlag.map((o) => o.pubkey),\n    config,\n  );\n\n  return publicKeysWithCustomFlag.map((o, idx) => ({ ...o, accountInfo: multipleAccountsInfo[idx] }));\n}\n\nexport enum AccountType {\n  Uninitialized,\n  Mint,\n  Account,\n}\nexport const ACCOUNT_TYPE_SIZE = 1;\n\nexport async function fetchMultipleMintInfos({\n  connection,\n  mints,\n  config,\n}: {\n  connection: Connection;\n  mints: PublicKey[];\n  config?: { batchRequest?: boolean };\n}): Promise<ReturnTypeFetchMultipleMintInfos> {\n  if (mints.length === 0) return {};\n  const mintInfos = await getMultipleAccountsInfoWithCustomFlags(\n    connection,\n    mints.map((i) => ({ pubkey: solToWSol(i) })),\n    config,\n  );\n\n  const mintK: ReturnTypeFetchMultipleMintInfos = {};\n  for (const i of mintInfos) {\n    if (!i.accountInfo || i.accountInfo.data.length < MINT_SIZE) {\n      console.log(\"invalid mint account\", i.pubkey.toBase58());\n      continue;\n    }\n    const t = unpackMint(i.pubkey, i.accountInfo, i.accountInfo?.owner);\n    mintK[i.pubkey.toString()] = {\n      ...t,\n      programId: i.accountInfo?.owner || TOKEN_PROGRAM_ID,\n      feeConfig: getTransferFeeConfig(t) ?? undefined,\n    };\n  }\n  mintK[PublicKey.default.toBase58()] = mintK[WSOLMint.toBase58()];\n\n  return mintK;\n}\n","import BN from \"bn.js\";\nimport Decimal from \"decimal.js\";\nimport { CurrencyAmount, TokenAmount } from \"../module/amount\";\nimport { Currency } from \"../module/currency\";\nimport { Fraction } from \"../module/fraction\";\nimport { Percent } from \"../module/percent\";\nimport { Price } from \"../module/price\";\nimport { Token } from \"../module/token\";\nimport { SplToken, TokenJson } from \"@/sega/token/type\";\nimport { ReplaceType } from \"@/sega/type\";\nimport { parseBigNumberish } from \"./constant\";\nimport { mul } from \"./fractionUtil\";\nimport { notInnerObject } from \"./utility\";\n\nexport const BN_ZERO = new BN(0);\nexport const BN_ONE = new BN(1);\nexport const BN_TWO = new BN(2);\nexport const BN_THREE = new BN(3);\nexport const BN_FIVE = new BN(5);\nexport const BN_TEN = new BN(10);\nexport const BN_100 = new BN(100);\nexport const BN_1000 = new BN(1000);\nexport const BN_10000 = new BN(10000);\nexport type BigNumberish = BN | string | number | bigint;\nexport type Numberish = number | string | bigint | Fraction | BN;\n\n\nexport function tenExponential(shift: BigNumberish): BN {\n  return BN_TEN.pow(parseBigNumberish(shift));\n}\n\n/**\n *\n * @example\n * getIntInfo(0.34) => { numerator: '34', denominator: '100'}\n * getIntInfo('0.34') //=> { numerator: '34', denominator: '100'}\n */\nexport function parseNumberInfo(n: Numberish | undefined): {\n  denominator: string;\n  numerator: string;\n  sign?: string;\n  int?: string;\n  dec?: string;\n} {\n  if (n === undefined) return { denominator: \"1\", numerator: \"0\" };\n  if (n instanceof BN) {\n    return { numerator: n.toString(), denominator: \"1\" };\n  }\n\n  if (n instanceof Fraction) {\n    return { denominator: n.denominator.toString(), numerator: n.numerator.toString() };\n  }\n\n  const s = String(n);\n  const [, sign = \"\", int = \"\", dec = \"\"] = s.replace(\",\", \"\").match(/(-?)(\\d*)\\.?(\\d*)/) ?? [];\n  const denominator = \"1\" + \"0\".repeat(dec.length);\n  const numerator = sign + (int === \"0\" ? \"\" : int) + dec || \"0\";\n  return { denominator, numerator, sign, int, dec };\n}\n\n// round up\nexport function divCeil(a: BN, b: BN): BN {\n  // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n  // @ts-ignore\n  const dm = a.divmod(b);\n\n  // Fast case - exact division\n  if (dm.mod.isZero()) return dm.div;\n\n  // Round up\n  return dm.div.isNeg() ? dm.div.isubn(1) : dm.div.iaddn(1);\n}\n\nexport function shakeFractionDecimal(n: Fraction): string {\n  const [, sign = \"\", int = \"\"] = n.toFixed(2).match(/(-?)(\\d*)\\.?(\\d*)/) ?? [];\n  return `${sign}${int}`;\n}\n\nexport function toBN(n: Numberish, decimal: BigNumberish = 0): BN {\n  if (n instanceof BN) return n;\n  return new BN(shakeFractionDecimal(toFraction(n).mul(BN_TEN.pow(new BN(String(decimal))))));\n}\n\nexport function toFraction(value: Numberish): Fraction {\n  //  to complete math format(may have decimal), not int\n  if (value instanceof Percent) return new Fraction(value.numerator, value.denominator);\n\n  if (value instanceof Price) return value.adjusted;\n\n  // to complete math format(may have decimal), not BN\n  if (value instanceof TokenAmount)\n    try {\n      return toFraction(value.toExact());\n    } catch {\n      return new Fraction(BN_ZERO);\n    }\n\n  // do not ideal with other fraction value\n  if (value instanceof Fraction) return value;\n\n  // wrap to Fraction\n  const n = String(value);\n  const details = parseNumberInfo(n);\n  return new Fraction(details.numerator, details.denominator);\n}\n\n/**\n * @example\n * toPercent(3.14) // => Percent { 314.00% }\n * toPercent(3.14, { alreadyDecimaled: true }) // => Percent {3.14%}\n */\nexport function toPercent(\n  n: Numberish,\n  options?: { /* usually used for backend data */ alreadyDecimaled?: boolean },\n): Percent {\n  const { numerator, denominator } = parseNumberInfo(n);\n  return new Percent(new BN(numerator), new BN(denominator).mul(options?.alreadyDecimaled ? new BN(100) : new BN(1)));\n}\n\nexport function toTokenPrice(params: {\n  token: TokenJson | Token | SplToken;\n  numberPrice: Numberish;\n  decimalDone?: boolean;\n}): Price {\n  const { token, numberPrice, decimalDone } = params;\n  const usdCurrency = new Token({ mint: \"\", decimals: 6, symbol: \"usd\", name: \"usd\", skipMint: true });\n  const { numerator, denominator } = parseNumberInfo(numberPrice);\n  const parsedNumerator = decimalDone ? new BN(numerator).mul(BN_TEN.pow(new BN(token.decimals))) : numerator;\n  const parsedDenominator = new BN(denominator).mul(BN_TEN.pow(new BN(usdCurrency.decimals)));\n\n  return new Price({\n    baseToken: usdCurrency,\n    denominator: parsedDenominator.toString(),\n    quoteToken: new Token({ ...token, skipMint: true, mint: \"\" }),\n    numerator: parsedNumerator.toString(),\n  });\n}\n\nexport function toUsdCurrency(amount: Numberish): CurrencyAmount {\n  const usdCurrency = new Currency({ decimals: 6, symbol: \"usd\", name: \"usd\" });\n  const amountBigNumber = toBN(mul(amount, 10 ** usdCurrency.decimals)!);\n  return new CurrencyAmount(usdCurrency, amountBigNumber);\n}\n\nexport function toTotalPrice(amount: Numberish | undefined, price: Price | undefined): CurrencyAmount {\n  if (!price || !amount) return toUsdCurrency(0);\n  return toUsdCurrency(mul(amount, price)!);\n}\n\nexport function decimalToFraction(n: Decimal | undefined): Fraction | undefined {\n  if (n == null) return undefined;\n  const { numerator, denominator } = parseNumberInfo(n.toString());\n  return new Fraction(numerator, denominator);\n}\n\nexport function isDecimal(val: unknown): boolean {\n  return val instanceof Decimal;\n}\nexport function recursivelyDecimalToFraction<T>(info: T): ReplaceType<T, Decimal, Fraction> {\n  return isDecimal(info)\n    ? decimalToFraction(info as any) as ReplaceType<T, Decimal, Fraction>\n    : Array.isArray(info)\n      ? info.map((k) => recursivelyDecimalToFraction(k)) as ReplaceType<T, Decimal, Fraction>\n      : notInnerObject(info)\n        ? Object.fromEntries(Object.entries(info as any).map(([k, v]) => [k, recursivelyDecimalToFraction(v)])) as ReplaceType<T, Decimal, Fraction>\n        : info as ReplaceType<T, Decimal, Fraction>;\n}\n","import _Big from \"big.js\";\nimport BN from \"bn.js\";\n\nimport { BigNumberish, BN_TEN } from \"../common/bignumber\";\nimport { createLogger, Logger } from \"../common/logger\";\n\nimport { parseBigNumberish, Rounding } from \"../common\";\nimport { Currency } from \"./currency\";\nimport toFormat, { WrappedBig } from \"./formatter\";\nimport { Fraction } from \"./fraction\";\nimport { Token } from \"./token\";\n\nconst logger = createLogger(\"Sega_amount\");\n\nconst Big = toFormat(_Big);\ntype Big = WrappedBig;\n\nexport function splitNumber(num: string, decimals: number): [string, string] {\n  let integral = \"0\";\n  let fractional = \"0\";\n\n  if (num.includes(\".\")) {\n    const splited = num.split(\".\");\n    if (splited.length === 2) {\n      [integral, fractional] = splited;\n      fractional = fractional.padEnd(decimals, \"0\");\n    } else {\n      logger.logWithError(`invalid number string, num: ${num}`);\n    }\n  } else {\n    integral = num;\n  }\n\n  // fix decimals is 0\n  return [integral, fractional.slice(0, decimals) || fractional];\n}\n\nexport class TokenAmount extends Fraction {\n  public readonly token: Token;\n  protected logger: Logger;\n\n  public constructor(token: Token, amount: BigNumberish, isRaw = true, name?: string) {\n    let parsedAmount = new BN(0);\n    const multiplier = BN_TEN.pow(new BN(token.decimals));\n\n    if (isRaw) {\n      parsedAmount = parseBigNumberish(amount);\n    } else {\n      let integralAmount = new BN(0);\n      let fractionalAmount = new BN(0);\n\n      // parse fractional string\n      if (typeof amount === \"string\" || typeof amount === \"number\" || typeof amount === \"bigint\") {\n        const [integral, fractional] = splitNumber(amount.toString(), token.decimals);\n        integralAmount = parseBigNumberish(integral);\n        fractionalAmount = parseBigNumberish(fractional);\n      }\n\n      integralAmount = integralAmount.mul(multiplier);\n      parsedAmount = integralAmount.add(fractionalAmount);\n    }\n\n    super(parsedAmount, multiplier);\n    this.logger = createLogger(name || \"TokenAmount\");\n    this.token = token;\n  }\n\n  public get raw(): BN {\n    return this.numerator;\n  }\n  public isZero(): boolean {\n    return this.raw.isZero();\n  }\n  public gt(other: TokenAmount): boolean {\n    if (!this.token.equals(other.token)) this.logger.logWithError(\"gt token not equals\");\n    return this.raw.gt(other.raw);\n  }\n\n  /**\n   * a less than b\n   */\n  public lt(other: TokenAmount): boolean {\n    if (!this.token.equals(other.token)) this.logger.logWithError(\"lt token not equals\");\n    return this.raw.lt(other.raw);\n  }\n\n  public add(other: TokenAmount): TokenAmount {\n    if (!this.token.equals(other.token)) this.logger.logWithError(\"add token not equals\");\n    return new TokenAmount(this.token, this.raw.add(other.raw));\n  }\n\n  public subtract(other: TokenAmount): TokenAmount {\n    if (!this.token.equals(other.token)) this.logger.logWithError(\"sub token not equals\");\n    return new TokenAmount(this.token, this.raw.sub(other.raw));\n  }\n\n  public toSignificant(\n    significantDigits = this.token.decimals,\n    format?: object,\n    rounding: Rounding = Rounding.ROUND_DOWN,\n  ): string {\n    return super.toSignificant(significantDigits, format, rounding);\n  }\n\n  /**\n   * To fixed\n   *\n   * @example\n   * ```\n   * 1 -> 1.000000000\n   * 1.234 -> 1.234000000\n   * 1.123456789876543 -> 1.123456789\n   * ```\n   */\n  public toFixed(\n    decimalPlaces = this.token.decimals,\n    format?: object,\n    rounding: Rounding = Rounding.ROUND_DOWN,\n  ): string {\n    if (decimalPlaces > this.token.decimals) this.logger.logWithError(\"decimals overflow\");\n    return super.toFixed(decimalPlaces, format, rounding);\n  }\n\n  /**\n   * To exact\n   *\n   * @example\n   * ```\n   * 1 -> 1\n   * 1.234 -> 1.234\n   * 1.123456789876543 -> 1.123456789\n   * ```\n   */\n  public toExact(format: object = { groupSeparator: \"\" }): string {\n    Big.DP = this.token.decimals;\n    return new Big(this.numerator.toString()).div(this.denominator.toString()).toFormat(format);\n  }\n}\n\nexport class CurrencyAmount extends Fraction {\n  public readonly currency: Currency;\n  protected logger: Logger;\n\n  public constructor(currency: Currency, amount: BigNumberish, isRaw = true, name?: string) {\n    let parsedAmount = new BN(0);\n    const multiplier = BN_TEN.pow(new BN(currency.decimals));\n\n    if (isRaw) {\n      parsedAmount = parseBigNumberish(amount);\n    } else {\n      let integralAmount = new BN(0);\n      let fractionalAmount = new BN(0);\n\n      // parse fractional string\n      if (typeof amount === \"string\" || typeof amount === \"number\" || typeof amount === \"bigint\") {\n        const [integral, fractional] = splitNumber(amount.toString(), currency.decimals);\n        integralAmount = parseBigNumberish(integral);\n        fractionalAmount = parseBigNumberish(fractional);\n      }\n\n      integralAmount = integralAmount.mul(multiplier);\n      parsedAmount = integralAmount.add(fractionalAmount);\n    }\n\n    super(parsedAmount, multiplier);\n    this.logger = createLogger(name || \"TokenAmount\");\n    this.currency = currency;\n  }\n\n  public get raw(): BN {\n    return this.numerator;\n  }\n\n  public isZero(): boolean {\n    return this.raw.isZero();\n  }\n\n  /**\n   * a greater than b\n   */\n  public gt(other: CurrencyAmount): boolean {\n    if (!this.currency.equals(other.currency)) this.logger.logWithError(\"gt currency not equals\");\n    return this.raw.gt(other.raw);\n  }\n\n  /**\n   * a less than b\n   */\n  public lt(other: CurrencyAmount): boolean {\n    if (!this.currency.equals(other.currency)) this.logger.logWithError(\"lt currency not equals\");\n    return this.raw.lt(other.raw);\n  }\n\n  public add(other: CurrencyAmount): CurrencyAmount {\n    if (!this.currency.equals(other.currency)) this.logger.logWithError(\"add currency not equals\");\n    return new CurrencyAmount(this.currency, this.raw.add(other.raw));\n  }\n\n  public sub(other: CurrencyAmount): CurrencyAmount {\n    if (!this.currency.equals(other.currency)) this.logger.logWithError(\"sub currency not equals\");\n    return new CurrencyAmount(this.currency, this.raw.sub(other.raw));\n  }\n\n  public toSignificant(\n    significantDigits = this.currency.decimals,\n    format?: object,\n    rounding: Rounding = Rounding.ROUND_DOWN,\n  ): string {\n    return super.toSignificant(significantDigits, format, rounding);\n  }\n\n  /**\n   * To fixed\n   *\n   * @example\n   * ```\n   * 1 -> 1.000000000\n   * 1.234 -> 1.234000000\n   * 1.123456789876543 -> 1.123456789\n   * ```\n   */\n  public toFixed(\n    decimalPlaces = this.currency.decimals,\n    format?: object,\n    rounding: Rounding = Rounding.ROUND_DOWN,\n  ): string {\n    if (decimalPlaces > this.currency.decimals) this.logger.logWithError(\"decimals overflow\");\n\n    return super.toFixed(decimalPlaces, format, rounding);\n  }\n\n  /**\n   * To exact\n   *\n   * @example\n   * ```\n   * 1 -> 1\n   * 1.234 -> 1.234\n   * 1.123456789876543 -> 1.123456789\n   * ```\n   */\n  public toExact(format: object = { groupSeparator: \"\" }): string {\n    Big.DP = this.currency.decimals;\n    return new Big(this.numerator.toString()).div(this.denominator.toString()).toFormat(format);\n  }\n}\n","import Big, { BigConstructor, BigSource, RoundingMode } from \"big.js\";\nimport Decimal, { Config, Numeric } from \"decimal.js-light\";\nimport _toFarmat from \"toformat\";\n\ntype TakeStatic<T> = { [P in keyof T]: T[P] };\ninterface FormatOptions {\n  decimalSeparator?: string;\n  groupSeparator?: string;\n  groupSize?: number;\n  fractionGroupSeparator?: string;\n  fractionGroupSize?: number;\n}\ninterface WrappedBigConstructor extends TakeStatic<BigConstructor> {\n  new (value: BigSource): WrappedBig;\n  (value: BigSource): WrappedBig;\n  (): WrappedBigConstructor;\n\n  format: FormatOptions;\n}\nexport interface WrappedBig extends Big {\n  add(n: BigSource): WrappedBig;\n  abs(): WrappedBig;\n  div(n: BigSource): WrappedBig;\n  minus(n: BigSource): WrappedBig;\n  mod(n: BigSource): WrappedBig;\n  mul(n: BigSource): WrappedBig;\n  plus(n: BigSource): WrappedBig;\n  pow(exp: number): WrappedBig;\n  round(dp?: number, rm?: RoundingMode): WrappedBig;\n  sqrt(): WrappedBig;\n  sub(n: BigSource): WrappedBig;\n  times(n: BigSource): WrappedBig;\n  toFormat(): string;\n  toFormat(options: FormatOptions): string;\n  toFormat(fractionLength: number): string;\n  toFormat(fractionLength: number, options: FormatOptions): string;\n  toFormat(fractionLength: number, missionUnknown: number): string;\n  toFormat(fractionLength: number, missionUnknown: number, options: FormatOptions): string;\n}\n\ntype DecimalConstructor = typeof Decimal;\ninterface WrappedDecimalConstructor extends TakeStatic<DecimalConstructor> {\n  new (value: Numeric): WrappedDecimal;\n  clone(config?: Config): WrappedDecimalConstructor;\n  config(config: Config): WrappedDecimal;\n  set(config: Config): WrappedDecimal;\n  format: FormatOptions;\n}\nexport interface WrappedDecimal extends Decimal {\n  absoluteValue(): WrappedDecimal;\n  abs(): WrappedDecimal;\n  dividedBy(y: Numeric): WrappedDecimal;\n  div(y: Numeric): WrappedDecimal;\n  dividedToIntegerBy(y: Numeric): WrappedDecimal;\n  idiv(y: Numeric): WrappedDecimal;\n  logarithm(base?: Numeric): WrappedDecimal;\n  log(base?: Numeric): WrappedDecimal;\n  minus(y: Numeric): WrappedDecimal;\n  sub(y: Numeric): WrappedDecimal;\n  modulo(y: Numeric): WrappedDecimal;\n  mod(y: Numeric): WrappedDecimal;\n  naturalExponetial(): WrappedDecimal;\n  exp(): WrappedDecimal;\n  naturalLogarithm(): WrappedDecimal;\n  ln(): WrappedDecimal;\n  negated(): WrappedDecimal;\n  neg(): WrappedDecimal;\n  plus(y: Numeric): WrappedDecimal;\n  add(y: Numeric): WrappedDecimal;\n  squareRoot(): WrappedDecimal;\n  sqrt(): WrappedDecimal;\n  times(y: Numeric): WrappedDecimal;\n  mul(y: Numeric): WrappedDecimal;\n  toWrappedDecimalPlaces(dp?: number, rm?: number): WrappedDecimal;\n  todp(dp?: number, rm?: number): WrappedDecimal;\n  toInteger(): WrappedDecimal;\n  toint(): WrappedDecimal;\n  toPower(y: Numeric): WrappedDecimal;\n  pow(y: Numeric): WrappedDecimal;\n  toSignificantDigits(sd?: number, rm?: number): WrappedDecimal;\n  tosd(sd?: number, rm?: number): WrappedDecimal;\n  toFormat(options: FormatOptions): string;\n  toFormat(fractionLength: number): string;\n  toFormat(fractionLength: number, options: FormatOptions): string;\n  toFormat(fractionLength: number, missionUnknown: number): string;\n  toFormat(fractionLength: number, missionUnknown: number, options: FormatOptions): string;\n}\n\nconst toFormat: {\n  (fn: BigConstructor): WrappedBigConstructor;\n  (fn: DecimalConstructor): WrappedDecimalConstructor;\n} = _toFarmat;\nexport default toFormat;\n","import _Big from \"big.js\";\nimport BN from \"bn.js\";\nimport _Decimal from \"decimal.js-light\";\n\nimport { BigNumberish } from \"../common/bignumber\";\nimport { createLogger } from \"../common/logger\";\n\nimport { parseBigNumberish, Rounding } from \"../common/constant\";\nimport toFormat, { WrappedBig } from \"./formatter\";\n\nconst logger = createLogger(\"module/fraction\");\n\nconst Big = toFormat(_Big);\ntype Big = WrappedBig;\n\nconst Decimal = toFormat(_Decimal);\n\nconst toSignificantRounding = {\n  [Rounding.ROUND_DOWN]: Decimal.ROUND_DOWN,\n  [Rounding.ROUND_HALF_UP]: Decimal.ROUND_HALF_UP,\n  [Rounding.ROUND_UP]: Decimal.ROUND_UP,\n};\n\nconst toFixedRounding = {\n  [Rounding.ROUND_DOWN]: _Big.roundDown,\n  [Rounding.ROUND_HALF_UP]: _Big.roundHalfUp,\n  [Rounding.ROUND_UP]: _Big.roundUp,\n};\n\nexport class Fraction {\n  public readonly numerator: BN;\n  public readonly denominator: BN;\n\n  public constructor(numerator: BigNumberish, denominator: BigNumberish = new BN(1)) {\n    this.numerator = parseBigNumberish(numerator);\n    this.denominator = parseBigNumberish(denominator);\n  }\n\n  public get quotient(): BN {\n    return this.numerator.div(this.denominator);\n  }\n\n  public invert(): Fraction {\n    return new Fraction(this.denominator, this.numerator);\n  }\n\n  public add(other: Fraction | BigNumberish): Fraction {\n    const otherParsed = other instanceof Fraction ? other : new Fraction(parseBigNumberish(other));\n\n    if (this.denominator.eq(otherParsed.denominator)) {\n      return new Fraction(this.numerator.add(otherParsed.numerator), this.denominator);\n    }\n\n    return new Fraction(\n      this.numerator.mul(otherParsed.denominator).add(otherParsed.numerator.mul(this.denominator)),\n      this.denominator.mul(otherParsed.denominator),\n    );\n  }\n\n  public sub(other: Fraction | BigNumberish): Fraction {\n    const otherParsed = other instanceof Fraction ? other : new Fraction(parseBigNumberish(other));\n\n    if (this.denominator.eq(otherParsed.denominator)) {\n      return new Fraction(this.numerator.sub(otherParsed.numerator), this.denominator);\n    }\n\n    return new Fraction(\n      this.numerator.mul(otherParsed.denominator).sub(otherParsed.numerator.mul(this.denominator)),\n      this.denominator.mul(otherParsed.denominator),\n    );\n  }\n\n  public mul(other: Fraction | BigNumberish): Fraction {\n    const otherParsed = other instanceof Fraction ? other : new Fraction(parseBigNumberish(other));\n\n    return new Fraction(this.numerator.mul(otherParsed.numerator), this.denominator.mul(otherParsed.denominator));\n  }\n\n  public div(other: Fraction | BigNumberish): Fraction {\n    const otherParsed = other instanceof Fraction ? other : new Fraction(parseBigNumberish(other));\n\n    return new Fraction(this.numerator.mul(otherParsed.denominator), this.denominator.mul(otherParsed.numerator));\n  }\n\n  public toSignificant(\n    significantDigits: number,\n    format: object = { groupSeparator: \"\" },\n    rounding: Rounding = Rounding.ROUND_HALF_UP,\n  ): string {\n    if (!Number.isInteger(significantDigits)) logger.logWithError(`${significantDigits} is not an integer.`);\n    if (significantDigits <= 0) logger.logWithError(`${significantDigits} is not positive.`);\n\n    Decimal.set({ precision: significantDigits + 1, rounding: toSignificantRounding[rounding] });\n    const quotient = new Decimal(this.numerator.toString())\n      .div(this.denominator.toString())\n      .toSignificantDigits(significantDigits);\n    return quotient.toFormat(quotient.decimalPlaces(), format);\n  }\n\n  public toFixed(\n    decimalPlaces: number,\n    format: object = { groupSeparator: \"\" },\n    rounding: Rounding = Rounding.ROUND_HALF_UP,\n  ): string {\n    if (!Number.isInteger(decimalPlaces)) logger.logWithError(`${decimalPlaces} is not an integer.`);\n    if (decimalPlaces < 0) logger.logWithError(`${decimalPlaces} is negative.`);\n\n    Big.DP = decimalPlaces;\n    Big.RM = toFixedRounding[rounding] || 1;\n    return new Big(this.numerator.toString()).div(this.denominator.toString()).toFormat(decimalPlaces, format);\n  }\n\n  public isZero(): boolean {\n    return this.numerator.isZero();\n  }\n}\n","import BN from \"bn.js\";\nimport { BigNumberish } from \"./bignumber\";\nimport { createLogger } from \"./logger\";\n\nexport enum Rounding {\n  ROUND_DOWN,\n  ROUND_HALF_UP,\n  ROUND_UP,\n}\n\nconst MAX_SAFE = 0x1fffffffffffff;\n\nexport function parseBigNumberish(value: BigNumberish): BN {\n  const logger = createLogger(\"Sega_parseBigNumberish\");\n  // BN\n  if (value instanceof BN) {\n    return value;\n  }\n\n  if (typeof value === \"string\") {\n    if (value.match(/^-?[0-9]+$/)) {\n      return new BN(value);\n    }\n    logger.logWithError(`invalid BigNumberish string: ${value}`);\n  }\n\n  if (typeof value === \"number\") {\n    if (value % 1) {\n      logger.logWithError(`BigNumberish number underflow: ${value}`);\n    }\n\n    if (value >= MAX_SAFE || value <= -MAX_SAFE) {\n      logger.logWithError(`BigNumberish number overflow: ${value}`);\n    }\n\n    return new BN(String(value));\n  }\n\n  if (typeof value === \"bigint\") {\n    return new BN(value.toString());\n  }\n  logger.error(`invalid BigNumberish value: ${value}`);\n  return new BN(0); // never reach, because logWithError will throw error\n}\n","import { PublicKey } from \"@solana/web3.js\";\nimport { TOKEN_PROGRAM_ID } from \"@solana/spl-token\";\nimport { TokenInfo } from \"./type\";\n\nexport const SOL_INFO: TokenInfo = {\n  chainId: 101,\n  address: PublicKey.default.toBase58(),\n  programId: TOKEN_PROGRAM_ID.toBase58(),\n  decimals: 9,\n  symbol: \"SOL\",\n  name: \"solana\",\n  logoURI: `https://img-v1.raydium.io/icon/So11111111111111111111111111111111111111112.png`,\n  tags: [],\n  priority: 2,\n  type: \"sega\",\n  extensions: {\n    coingeckoId: \"solana\",\n  },\n};\n\nexport const TOKEN_WSOL: TokenInfo = {\n  chainId: 101,\n  address: \"So11111111111111111111111111111111111111112\",\n  programId: TOKEN_PROGRAM_ID.toBase58(),\n  decimals: 9,\n  symbol: \"WSOL\",\n  name: \"Wrapped SOL\",\n  logoURI: `https://img-v1.raydium.io/icon/So11111111111111111111111111111111111111112.png`,\n  tags: [],\n  priority: 2,\n  type: \"sega\",\n  extensions: {\n    coingeckoId: \"solana\",\n  },\n};\n","import { PublicKey } from \"@solana/web3.js\";\n\nimport { PublicKeyish, SOLMint, validateAndParsePublicKey } from \"../common/pubKey\";\nimport { TOKEN_WSOL } from \"@/sega/token/constant\";\n\n/**\n * A token is any fungible financial instrument on Solana, including SOL and all SPL tokens.\n */\nexport interface TokenProps {\n  mint: PublicKeyish;\n  decimals: number;\n  symbol?: string;\n  name?: string;\n  skipMint?: boolean;\n  isToken2022?: boolean;\n}\n\nexport class Token {\n  public readonly symbol?: string;\n  public readonly name?: string;\n  public readonly decimals: number;\n  public readonly isToken2022: boolean;\n\n  public readonly mint: PublicKey;\n  public static readonly WSOL: Token = new Token({\n    ...TOKEN_WSOL,\n    mint: TOKEN_WSOL.address,\n  });\n\n  /**\n   *\n   * @param mint - pass \"sol\" as mint will auto generate wsol token config\n   */\n  public constructor({ mint, decimals, symbol, name, skipMint = false, isToken2022 = false }: TokenProps) {\n    if (mint === SOLMint.toBase58() || (mint instanceof PublicKey && SOLMint.equals(mint))) {\n      this.decimals = TOKEN_WSOL.decimals;\n      this.symbol = TOKEN_WSOL.symbol;\n      this.name = TOKEN_WSOL.name;\n      this.mint = new PublicKey(TOKEN_WSOL.address);\n      this.isToken2022 = false;\n      return;\n    }\n\n    this.decimals = decimals;\n    this.symbol = symbol || mint.toString().substring(0, 6);\n    this.name = name || mint.toString().substring(0, 6);\n    this.mint = skipMint ? PublicKey.default : validateAndParsePublicKey({ publicKey: mint });\n    this.isToken2022 = isToken2022;\n  }\n\n  public equals(other: Token): boolean {\n    // short circuit on reference equality\n    if (this === other) {\n      return true;\n    }\n    return this.mint.equals(other.mint);\n  }\n}\n","import { AccountMeta, PublicKey, SystemProgram, SYSVAR_RENT_PUBKEY } from \"@solana/web3.js\";\nimport { TOKEN_PROGRAM_ID } from \"@solana/spl-token\";\n\ninterface AccountMetaProps {\n  pubkey: PublicKey;\n  isSigner?: boolean;\n  isWritable?: boolean;\n}\n\nexport function accountMeta({ pubkey, isSigner = false, isWritable = true }: AccountMetaProps): AccountMeta {\n  return {\n    pubkey,\n    isWritable,\n    isSigner,\n  };\n}\n\nexport const commonSystemAccountMeta = [\n  accountMeta({ pubkey: TOKEN_PROGRAM_ID, isWritable: false }),\n  accountMeta({ pubkey: SystemProgram.programId, isWritable: false }),\n  accountMeta({ pubkey: SYSVAR_RENT_PUBKEY, isWritable: false }),\n];\n\nexport type PublicKeyish = PublicKey | string;\n\nexport function validateAndParsePublicKey({\n  publicKey: orgPubKey,\n  transformSol,\n}: {\n  publicKey: PublicKeyish;\n  transformSol?: boolean;\n}): PublicKey {\n  const publicKey = tryParsePublicKey(orgPubKey.toString());\n\n  if (publicKey instanceof PublicKey) {\n    if (transformSol && publicKey.equals(SOLMint)) return WSOLMint;\n    return publicKey;\n  }\n\n  if (transformSol && publicKey.toString() === SOLMint.toBase58()) return WSOLMint;\n\n  if (typeof publicKey === \"string\") {\n    if (publicKey === PublicKey.default.toBase58()) return PublicKey.default;\n    try {\n      const key = new PublicKey(publicKey);\n      return key;\n    } catch {\n      throw new Error(\"invalid public key\");\n    }\n  }\n\n  throw new Error(\"invalid public key\");\n}\n\nexport function tryParsePublicKey(v: string): PublicKey | string {\n  try {\n    return new PublicKey(v);\n  } catch (e) {\n    return v;\n  }\n}\n\nexport const MEMO_PROGRAM_ID = new PublicKey(\"MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr\");\nexport const MEMO_PROGRAM_ID2 = new PublicKey(\"MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr\");\nexport const RENT_PROGRAM_ID = new PublicKey(\"SysvarRent111111111111111111111111111111111\");\nexport const CLOCK_PROGRAM_ID = new PublicKey(\"SysvarC1ock11111111111111111111111111111111\");\nexport const METADATA_PROGRAM_ID = new PublicKey(\"metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s\");\nexport const INSTRUCTION_PROGRAM_ID = new PublicKey(\"Sysvar1nstructions1111111111111111111111111\");\nexport const SYSTEM_PROGRAM_ID = SystemProgram.programId;\n\nexport const RAYMint = new PublicKey(\"4k3Dyjzvzp8eMZWUXbBCjEvwSkkk59S5iCNLY3QrkX6R\");\nexport const PAIMint = new PublicKey(\"Ea5SjE2Y6yvCeW5dYTn7PYMuW5ikXkvbGdcmSnXeaLjS\");\nexport const SRMMint = new PublicKey(\"SRMuApVNdxXokk5GT7XD5cUUgXMBCoAz2LHeuAoKWRt\");\nexport const USDCMint = new PublicKey(\"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v\");\nexport const USDTMint = new PublicKey(\"Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB\");\nexport const mSOLMint = new PublicKey(\"mSoLzYCxHdYgdzU16g5QSh3i5K3z3KZK7ytfqcJm7So\");\nexport const stSOLMint = new PublicKey(\"7dHbWXmci3dT8UFYWYZweBLXgycu7Y3iL6trKn1Y7ARj\");\nexport const USDHMint = new PublicKey(\"USDH1SM1ojwWUga67PGrgFWUHibbjqMvuMaDkRJTgkX\");\nexport const NRVMint = new PublicKey(\"NRVwhjBQiUPYtfDT5zRBVJajzFQHaBUNtC7SNVvqRFa\");\nexport const ANAMint = new PublicKey(\"ANAxByE6G2WjFp7A4NqtWYXb3mgruyzZYg3spfxe6Lbo\");\nexport const ETHMint = new PublicKey(\"7vfCXTUXx5WJV5JADk17DUJ4ksgau7utNKj4b963voxs\");\nexport const WSOLMint = new PublicKey(\"So11111111111111111111111111111111111111112\");\nexport const SOLMint = PublicKey.default;\n\nexport function solToWSol(mint: PublicKeyish): PublicKey {\n  return validateAndParsePublicKey({ publicKey: mint, transformSol: true });\n}\n","import { SOL_INFO } from \"@/sega/token/constant\";\n\nimport { Token } from \"./token\";\n\ninterface CurrencyProps {\n  decimals: number;\n  symbol?: string;\n  name?: string;\n}\n/**\n * A currency is any fungible financial instrument on Solana, including SOL and all SPL tokens.\n * The only instance of the base class `Currency` is SOL.\n */\nexport class Currency {\n  public readonly symbol?: string;\n  public readonly name?: string;\n  public readonly decimals: number;\n\n  /**\n   * The only instance of the base class `Currency`.\n   */\n  public static readonly SOL: Currency = new Currency(SOL_INFO);\n\n  /**\n   * Constructs an instance of the base class `Currency`. The only instance of the base class `Currency` is `Currency.SOL`.\n   * @param decimals - decimals of the currency\n   * @param symbol - symbol of the currency\n   * @param name - name of the currency\n   */\n  public constructor({ decimals, symbol = \"UNKNOWN\", name = \"UNKNOWN\" }: CurrencyProps) {\n    this.decimals = decimals;\n    this.symbol = symbol;\n    this.name = name;\n  }\n\n  public equals(other: Currency): boolean {\n    return this === other;\n  }\n}\n\n/**\n * Compares two currencies for equality\n */\nexport function currencyEquals(currencyA: Currency, currencyB: Currency): boolean {\n  if (currencyA instanceof Token && currencyB instanceof Token) {\n    return currencyA.equals(currencyB);\n  } else if (currencyA instanceof Token || currencyB instanceof Token) {\n    return false;\n  } else {\n    return currencyA === currencyB;\n  }\n}\n","import BN from \"bn.js\";\nimport { Rounding } from \"../common\";\nimport { Fraction } from \"./fraction\";\n\nexport const _100_PERCENT = new Fraction(new BN(100));\n\nexport class Percent extends Fraction {\n  public toSignificant(significantDigits = 5, format?: object, rounding?: Rounding): string {\n    return this.mul(_100_PERCENT).toSignificant(significantDigits, format, rounding);\n  }\n\n  public toFixed(decimalPlaces = 2, format?: object, rounding?: Rounding): string {\n    return this.mul(_100_PERCENT).toFixed(decimalPlaces, format, rounding);\n  }\n}\n","import { Rounding } from \"../common\";\nimport { BigNumberish, tenExponential } from \"../common/bignumber\";\nimport { createLogger } from \"../common/logger\";\n\nimport { Fraction } from \"./fraction\";\nimport { Token } from \"./token\";\n\nconst logger = createLogger(\"Sega_price\");\n\ninterface PriceProps {\n  baseToken: Token;\n  denominator: BigNumberish;\n  quoteToken: Token;\n  numerator: BigNumberish;\n}\n\nexport class Price extends Fraction {\n  public readonly baseToken: Token; // input i.e. denominator\n  public readonly quoteToken: Token; // output i.e. numerator\n  // used to adjust the raw fraction w/r/t the decimals of the {base,quote}Token\n  public readonly scalar: Fraction;\n\n  // denominator and numerator _must_ be raw, i.e. in the native representation\n  public constructor(params: PriceProps) {\n    const { baseToken, quoteToken, numerator, denominator } = params;\n    super(numerator, denominator);\n\n    this.baseToken = baseToken;\n    this.quoteToken = quoteToken;\n    this.scalar = new Fraction(tenExponential(baseToken.decimals), tenExponential(quoteToken.decimals));\n  }\n\n  public get raw(): Fraction {\n    return new Fraction(this.numerator, this.denominator);\n  }\n\n  public get adjusted(): Fraction {\n    return super.mul(this.scalar);\n  }\n\n  public invert(): Price {\n    return new Price({\n      baseToken: this.quoteToken,\n      quoteToken: this.baseToken,\n      denominator: this.numerator,\n      numerator: this.denominator,\n    });\n  }\n\n  public mul(other: Price): Price {\n    if (this.quoteToken !== other.baseToken) logger.logWithError(\"mul token not equals\");\n\n    const fraction = super.mul(other);\n    return new Price({\n      baseToken: this.baseToken,\n      quoteToken: other.quoteToken,\n      denominator: fraction.denominator,\n      numerator: fraction.numerator,\n    });\n  }\n\n  public toSignificant(significantDigits = this.quoteToken.decimals, format?: object, rounding?: Rounding): string {\n    return this.adjusted.toSignificant(significantDigits, format, rounding);\n  }\n\n  public toFixed(decimalPlaces = this.quoteToken.decimals, format?: object, rounding?: Rounding): string {\n    return this.adjusted.toFixed(decimalPlaces, format, rounding);\n  }\n}\n","import { PublicKey } from \"@solana/web3.js\";\nimport BN from \"bn.js\";\n\nimport { Fraction, Percent, Price, Token, TokenAmount } from \"../module\";\nimport { ReplaceType } from \"@/sega/type\";\n\nimport { tryParsePublicKey } from \"./pubKey\";\n\nexport async function sleep(ms: number): Promise<void> {\n  new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport function getTimestamp(): number {\n  return new Date().getTime();\n}\n\nexport function notInnerObject(v: unknown): v is Record<string, any> {\n  return (\n    typeof v === \"object\" &&\n    v !== null &&\n    ![Token, TokenAmount, PublicKey, Fraction, BN, Price, Percent].some((o) => typeof o === \"object\" && v instanceof o)\n  );\n}\nexport function jsonInfo2PoolKeys<T>(jsonInfo: T): ReplaceType<T, string, PublicKey> {\n  return typeof jsonInfo === \"string\"\n    ? tryParsePublicKey(jsonInfo) as ReplaceType<T, string, PublicKey>\n    : Array.isArray(jsonInfo)\n      ? jsonInfo.map((k) => jsonInfo2PoolKeys(k)) as ReplaceType<T, string, PublicKey>\n      : notInnerObject(jsonInfo)\n        ? Object.fromEntries(Object.entries(jsonInfo).map(([k, v]) => [k, jsonInfo2PoolKeys(v)])) as ReplaceType<T, string, PublicKey>\n        : jsonInfo as ReplaceType<T, string, PublicKey>;\n}\n","/**\n * https://youmightnotneed.com/lodash/\n */\n\nexport function chunkArray<T>(arr: T[], chunkSize = 1, cache: T[][] = []): T[][] {\n  const tmp = [...arr];\n  if (chunkSize <= 0) return cache;\n  while (tmp.length) cache.push(tmp.splice(0, chunkSize));\n  return cache;\n}\n\nexport function intersection<T>(arr: T[], ...args: T[][]): T[] {\n  return arr.filter((item) => args.every((arr) => arr.includes(item)));\n}\n\nexport function xor<T>(arr: T[], ...args: T[][]): T[] {\n  return arr.filter((item) => args.every((arr) => !arr.includes(item)));\n}\n\nexport function uniq<T>(arr: T[]): T[] {\n  return [...new Set(arr)];\n}\n","import { PublicKey } from \"@solana/web3.js\";\n\nimport { TOKEN_PROGRAM_ID } from \"@solana/spl-token\";\nimport { findProgramAddress } from \"./txTool/txUtils\";\nimport { METADATA_PROGRAM_ID } from \"@/common/pubKey\";\n\nexport function getATAAddress(\n  owner: PublicKey,\n  mint: PublicKey,\n  programId?: PublicKey,\n): {\n  publicKey: PublicKey;\n  nonce: number;\n} {\n  return findProgramAddress(\n    [owner.toBuffer(), (programId ?? TOKEN_PROGRAM_ID).toBuffer(), mint.toBuffer()],\n    new PublicKey(\"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL\"),\n  );\n}\n\nexport function getPdaMetadataKey(mint: PublicKey): {\n  publicKey: PublicKey;\n  nonce: number;\n} {\n  return findProgramAddress(\n    [Buffer.from(\"metadata\", \"utf8\"), METADATA_PROGRAM_ID.toBuffer(), mint.toBuffer()],\n    METADATA_PROGRAM_ID,\n  );\n}\n","import {\n  Commitment,\n  ComputeBudgetProgram,\n  Connection,\n  EpochInfo,\n  Keypair,\n  PublicKey,\n  SimulatedTransactionResponse,\n  Transaction,\n  TransactionInstruction,\n  TransactionMessage,\n  VersionedTransaction,\n} from \"@solana/web3.js\";\n\nimport { createLogger } from \"../logger\";\nimport { CacheLTA } from \"./lookupTable\";\nimport { InstructionType } from \"./txType\";\n\nimport { ComputeBudgetConfig } from \"@/sega/type\";\nimport { TOKEN_PROGRAM_ID } from \"@solana/spl-token\";\n\nconst logger = createLogger(\"Sega_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, propsCommitment?: Commitment): Promise<string> {\n  const commitment = propsCommitment ?? \"confirmed\";\n  return (await connection.getLatestBlockhash?.({ commitment }))?.blockhash;\n}\n\nexport async function confirmTransaction(connection: Connection, txId: string): Promise<string> {\n  connection.getSignatureStatuses([txId]);\n  return new Promise((resolve, reject) => {\n    const id = setTimeout(reject, 60 * 1000);\n    connection.onSignature(\n      txId,\n      (signatureResult) => {\n        clearTimeout(id);\n        if (!signatureResult.err) {\n          resolve(\"\");\n          return;\n        }\n        reject(Object.assign(signatureResult.err, { txId }));\n      },\n      \"confirmed\",\n    );\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(\"SegaSimuLateTransaction11111111111111111\");\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 const txToBase64 = (transaction: Transaction | VersionedTransaction): string => {\n  let serialized = transaction.serialize({ requireAllSignatures: false, verifySignatures: false });\n  if (transaction instanceof VersionedTransaction) serialized = toBuffer(serialized);\n  try {\n    return serialized instanceof Buffer ? serialized.toString(\"base64\") : Buffer.from(serialized).toString(\"base64\");\n  } catch {\n    return serialized.toString(\"base64\");\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    allBase64.push(txToBase64(transaction));\n  });\n  console.log(\"simulate tx string:\", allBase64);\n\n  return allBase64;\n}\n\nexport function transformTxToBase64(tx: Transaction | VersionedTransaction): string {\n  let serialized = tx.serialize({ requireAllSignatures: false, verifySignatures: false });\n  if (tx instanceof VersionedTransaction) serialized = toBuffer(serialized);\n  return serialized.toString(\"base64\");\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  ClmmLockPosition: \"ClmmLockPosition\",\n  ClmmHarvestLockPosition: \"ClmmHarvestLockPosition\",\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  FarmV4Withdraw: \"FarmV4Withdraw\",\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  CpmmCreatePool: \"CpmmCreatePool\",\n  CpmmAddLiquidity: \"CpmmAddLiquidity\",\n  CpmmWithdrawLiquidity: \"CpmmWithdrawLiquidity\",\n  CpmmSwapBaseIn: \"CpmmSwapBaseIn\",\n  CpmmSwapBaseOut: \"CpmmSwapBaseOut\",\n\n  CpmmLockLp: \"CpmmLockLp\",\n  CpmmCollectLockFee: \"CpmmCollectLockFee\",\n  TransferTip: \"TransferTip\",\n};\n","import { PublicKey } from \"@solana/web3.js\";\n\nexport const CREATE_CPMM_POOL_PROGRAM = new PublicKey(\"SegazTQwbYWknDZkJ6j2Kgvm5gw3MrHGKtWstZdoNKZ\");\nexport const CREATE_CPMM_POOL_AUTH = new PublicKey(\"Ajk8d9bERSaFdeoT1d8JUVfaDayrYLnAdgeB47TFMUaG\");\nexport const CREATE_CPMM_POOL_FEE_ACC = new PublicKey(\"2HbjxVVKJ7Ct72Rcd8WK4VTqmwTXL5aAggkH1CHGFGmh\");\n\nexport const DEV_CREATE_CPMM_POOL_PROGRAM = new PublicKey(\"auetiVUVJkRxvNPLYEvVnz8UJSqQ1VgoA83PcicHVD1\");\nexport const DEV_CREATE_CPMM_POOL_AUTH = new PublicKey(\"GzqQwxPSmUZnTyCfX9YWqi32MJg43ujP786ZoacL559Y\");\nexport const DEV_CREATE_CPMM_POOL_FEE_ACC = new PublicKey(\"GzqQwxPSmUZnTyCfX9YWqi32MJg43ujP786ZoacL559Y\");\n\nexport const ALL_PROGRAM_ID = {\n  CREATE_CPMM_POOL_PROGRAM,\n  CREATE_CPMM_POOL_AUTH,\n  CREATE_CPMM_POOL_FEE_ACC,\n};\n\nexport type ProgramIdConfig = Partial<typeof ALL_PROGRAM_ID>;\n\nexport const DEVNET_PROGRAM_ID = {\n  SERUM_MARKET: PublicKey.default,\n  UTIL1216: PublicKey.default,\n  CREATE_CPMM_POOL_PROGRAM: DEV_CREATE_CPMM_POOL_PROGRAM,\n  CREATE_CPMM_POOL_AUTH: DEV_CREATE_CPMM_POOL_AUTH,\n  CREATE_CPMM_POOL_FEE_ACC: DEV_CREATE_CPMM_POOL_FEE_ACC,\n};\n","import { EpochInfo } from \"@solana/web3.js\";\nimport BN from \"bn.js\";\nimport { TransferFee, TransferFeeConfig } from \"@solana/spl-token\";\n\nimport { TransferFeeDataBaseType } from \"../api/type\";\nimport { GetTransferAmountFee } from \"@/sega/type\";\n\nconst POINT = 10_000;\nexport function getTransferAmountFee(\n  amount: BN,\n  feeConfig: TransferFeeConfig | undefined,\n  epochInfo: EpochInfo,\n  addFee: boolean,\n): GetTransferAmountFee {\n  if (feeConfig === undefined) {\n    return {\n      amount,\n      fee: undefined,\n      expirationTime: undefined,\n    };\n  }\n\n  const nowFeeConfig: TransferFee =\n    epochInfo.epoch < feeConfig.newerTransferFee.epoch ? feeConfig.olderTransferFee : feeConfig.newerTransferFee;\n  const maxFee = new BN(nowFeeConfig.maximumFee.toString());\n  const expirationTime: number | undefined =\n    epochInfo.epoch < feeConfig.newerTransferFee.epoch\n      ? ((Number(feeConfig.newerTransferFee.epoch) * epochInfo.slotsInEpoch - epochInfo.absoluteSlot) * 400) / 1000\n      : undefined;\n\n  if (addFee) {\n    if (nowFeeConfig.transferFeeBasisPoints === POINT) {\n      const nowMaxFee = new BN(nowFeeConfig.maximumFee.toString());\n      return {\n        amount: amount.add(nowMaxFee),\n        fee: nowMaxFee,\n        expirationTime,\n      };\n    } else {\n      const _TAmount = BNDivCeil(amount.mul(new BN(POINT)), new BN(POINT - nowFeeConfig.transferFeeBasisPoints));\n\n      const nowMaxFee = new BN(nowFeeConfig.maximumFee.toString());\n      const TAmount = _TAmount.sub(amount).gt(nowMaxFee) ? amount.add(nowMaxFee) : _TAmount;\n\n      const _fee = BNDivCeil(TAmount.mul(new BN(nowFeeConfig.transferFeeBasisPoints)), new BN(POINT));\n      const fee = _fee.gt(maxFee) ? maxFee : _fee;\n      return {\n        amount: TAmount,\n        fee,\n        expirationTime,\n      };\n    }\n  } else {\n    const _fee = BNDivCeil(amount.mul(new BN(nowFeeConfig.transferFeeBasisPoints)), new BN(POINT));\n    const fee = _fee.gt(maxFee) ? maxFee : _fee;\n\n    return {\n      amount,\n      fee,\n      expirationTime,\n    };\n  }\n}\n\nexport function getTransferAmountFeeV2(\n  amount: BN,\n  _feeConfig: TransferFeeDataBaseType | undefined,\n  epochInfo: EpochInfo,\n  addFee: boolean,\n): GetTransferAmountFee {\n  if (_feeConfig === undefined) {\n    return {\n      amount,\n      fee: undefined,\n      expirationTime: undefined,\n    };\n  }\n  const feeConfig = {\n    ..._feeConfig,\n    olderTransferFee: {\n      epoch: BigInt(_feeConfig.olderTransferFee.epoch),\n      maximumFee: BigInt(_feeConfig.olderTransferFee.maximumFee),\n      transferFeeBasisPoints: _feeConfig.olderTransferFee.transferFeeBasisPoints,\n    },\n    newerTransferFee: {\n      epoch: BigInt(_feeConfig.newerTransferFee.epoch),\n      maximumFee: BigInt(_feeConfig.newerTransferFee.maximumFee),\n      transferFeeBasisPoints: _feeConfig.newerTransferFee.transferFeeBasisPoints,\n    },\n  };\n\n  const nowFeeConfig: TransferFee =\n    epochInfo.epoch < feeConfig.newerTransferFee.epoch ? feeConfig.olderTransferFee : feeConfig.newerTransferFee;\n  const maxFee = new BN(nowFeeConfig.maximumFee.toString());\n  const expirationTime: number | undefined =\n    epochInfo.epoch < feeConfig.newerTransferFee.epoch\n      ? ((Number(feeConfig.newerTransferFee.epoch) * epochInfo.slotsInEpoch - epochInfo.absoluteSlot) * 400) / 1000\n      : undefined;\n\n  if (addFee) {\n    if (nowFeeConfig.transferFeeBasisPoints === POINT) {\n      const nowMaxFee = new BN(nowFeeConfig.maximumFee.toString());\n      return {\n        amount: amount.add(nowMaxFee),\n        fee: nowMaxFee,\n        expirationTime,\n      };\n    } else {\n      const _TAmount = BNDivCeil(amount.mul(new BN(POINT)), new BN(POINT - nowFeeConfig.transferFeeBasisPoints));\n\n      const nowMaxFee = new BN(nowFeeConfig.maximumFee.toString());\n      const TAmount = _TAmount.sub(amount).gt(nowMaxFee) ? amount.add(nowMaxFee) : _TAmount;\n\n      const _fee = BNDivCeil(TAmount.mul(new BN(nowFeeConfig.transferFeeBasisPoints)), new BN(POINT));\n      const fee = _fee.gt(maxFee) ? maxFee : _fee;\n      return {\n        amount: TAmount,\n        fee,\n        expirationTime,\n      };\n    }\n  } else {\n    const _fee = BNDivCeil(amount.mul(new BN(nowFeeConfig.transferFeeBasisPoints)), new BN(POINT));\n    const fee = _fee.gt(maxFee) ? maxFee : _fee;\n\n    return {\n      amount,\n      fee,\n      expirationTime,\n    };\n  }\n}\n\nexport function minExpirationTime(\n  expirationTime1: number | undefined,\n  expirationTime2: number | undefined,\n): number | undefined {\n  if (expirationTime1 === undefined) return expirationTime2;\n  if (expirationTime2 === undefined) return expirationTime1;\n\n  return Math.min(expirationTime1, expirationTime2);\n}\n\nexport function BNDivCeil(bn1: BN, bn2: BN): BN {\n  const { div, mod } = bn1.divmod(bn2);\n\n  if (mod.gt(new BN(0))) {\n    return div.add(new BN(1));\n  } else {\n    return div;\n  }\n}\n","import { Connection } from '@solana/web3.js'\n\nexport enum Network {\n  SonicMainnet = 'SonicMainnet',\n  SonicTestnetV1 = 'SonicTestnetV1',\n}\n\nexport function getConnection(networkName: string, isArchive = true): Connection {\n  const isMainnet = networkName === Network.SonicMainnet\n  const network = isMainnet ? Network.SonicMainnet : Network.SonicTestnetV1\n  return new Connection(isArchive ? archiveRpcs[network] : rpcs[network])\n}\n\nconst rpcs: Record<Network, string> = {\n  [Network.SonicMainnet]: 'https://api.mainnet-alpha.sonic.game',\n  [Network.SonicTestnetV1]: 'https://api.testnet.v1.sonic.game',\n}\n\nconst archiveRpcs: Record<Network, string> = {\n  [Network.SonicMainnet]: 'https://archival-mainnet.sonic.game',\n  [Network.SonicTestnetV1]: 'https://archival-testnet.sonic.game',\n}\n","import { PublicKey } from \"@solana/web3.js\";\n\nimport { createLogger, Logger } from \"../common/logger\";\nimport { TxBuilder } from \"../common/txTool/txTool\";\n\nimport { Sega } from \"./\";\n\nexport interface ModuleBaseProps {\n  scope: Sega;\n  moduleName: string;\n}\n\nconst joinMsg = (...args: (string | number | Record<string, any>)[]): string =>\n  args\n    .map((arg) => {\n      try {\n        return typeof arg === \"object\" ? JSON.stringify(arg) : arg;\n      } catch {\n        return arg;\n      }\n    })\n    .join(\", \");\nexport default class ModuleBase {\n  public scope: Sega;\n  private disabled = false;\n  protected logger: Logger;\n\n  constructor({ scope, moduleName }: ModuleBaseProps) {\n    this.scope = scope;\n    this.logger = createLogger(moduleName);\n  }\n\n  protected createTxBuilder(feePayer?: PublicKey): TxBuilder {\n    this.scope.checkOwner();\n    return new TxBuilder({\n      connection: this.scope.connection,\n      feePayer: feePayer || this.scope.ownerPubKey,\n      cluster: this.scope.cluster,\n      owner: this.scope.owner,\n      blockhashCommitment: this.scope.blockhashCommitment,\n      loopMultiTxStatus: this.scope.loopMultiTxStatus,\n      api: this.scope.api,\n      signAllTransactions: this.scope.signAllTransactions,\n    });\n  }\n\n  public logDebug(...args: (string | number | Record<string, any>)[]): void {\n    this.logger.debug(joinMsg(args));\n  }\n\n  public logInfo(...args: (string | number | Record<string, any>)[]): void {\n    this.logger.info(joinMsg(args));\n  }\n\n  public logAndCreateError(...args: (string | number | Record<string, any>)[]): void {\n    const message = joinMsg(args);\n    throw new Error(message);\n  }\n\n  public checkDisabled(): void {\n    if (this.disabled || !this.scope) this.logAndCreateError(\"module not working\");\n  }\n}\n"],"mappings":"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","names":["get","set","Logger","params","logLevel","level","props","msg","arg","moduleLoggers","moduleLevels","createLogger","moduleName","logger","get","set","PublicKey","sendAndConfirmTransaction","SystemProgram","Transaction","TransactionMessage","VersionedTransaction","axios","PublicKey","AddressLookupTableAccount","PublicKey","BN","Decimal","_Big","BN","_toFarmat","toFormat","formatter_default","_Big","BN","_Decimal","BN","MAX_SAFE","parseBigNumberish","value","logger","createLogger","BN","logger","createLogger","Big","formatter_default","_Big","Decimal","_Decimal","toSignificantRounding","toFixedRounding","Fraction","_Fraction","numerator","denominator","BN","parseBigNumberish","other","otherParsed","significantDigits","format","rounding","quotient","decimalPlaces","logger","createLogger","Big","formatter_default","_Big","PublicKey","TOKEN_PROGRAM_ID","SOL_INFO","TOKEN_WSOL","PublicKey","PublicKey","SystemProgram","SYSVAR_RENT_PUBKEY","TOKEN_PROGRAM_ID","accountMeta","pubkey","isSigner","isWritable","commonSystemAccountMeta","validateAndParsePublicKey","orgPubKey","transformSol","publicKey","tryParsePublicKey","SOLMint","WSOLMint","e","v","MEMO_PROGRAM_ID","MEMO_PROGRAM_ID2","RENT_PROGRAM_ID","CLOCK_PROGRAM_ID","METADATA_PROGRAM_ID","INSTRUCTION_PROGRAM_ID","SYSTEM_PROGRAM_ID","RAYMint","PAIMint","SRMMint","USDCMint","USDTMint","mSOLMint","stSOLMint","USDHMint","NRVMint","ANAMint","ETHMint","_Token","mint","decimals","symbol","name","skipMint","isToken2022","SOLMint","PublicKey","TOKEN_WSOL","validateAndParsePublicKey","other","__spreadProps","__spreadValues","Token","_Currency","decimals","symbol","name","other","SOL_INFO","Currency","BN","_100_PERCENT","Fraction","BN","logger","createLogger","PublicKey","BN","BN_ZERO","BN","BN_ONE","BN_TWO","BN_THREE","BN_FIVE","BN_TEN","BN_100","BN_1000","BN_10000","chunkArray","arr","chunkSize","cache","tmp","PublicKey","TOKEN_PROGRAM_ID","ComputeBudgetProgram","Keypair","PublicKey","Transaction","TransactionMessage","VersionedTransaction","InstructionType","TOKEN_PROGRAM_ID","logger","createLogger","MAX_BASE64_SIZE","addComputeBudget","config","ins","insTypes","ComputeBudgetProgram","InstructionType","getRecentBlockHash","connection","propsCommitment","__async","_a","_b","commitment","confirmTransaction","txId","resolve","reject","id","signatureResult","forecastTransactionSize","instructions","signers","transaction","Transaction","error","checkLegacyTxSize","instructions","payer","signers","forecastTransactionSize","checkV0TxSize","lookupTableAddressAccount","recentBlockhash","Keypair","messageV0","TransactionMessage","VersionedTransaction","MAX_BASE64_SIZE","error","toBuffer","arr","txToBase64","transaction","serialized","VersionedTransaction","e","printSimulate","transactions","allBase64","Transaction","TOKEN_PROGRAM_ID","Keypair","PublicKey","CREATE_CPMM_POOL_PROGRAM","CREATE_CPMM_POOL_AUTH","CREATE_CPMM_POOL_FEE_ACC","DEV_CREATE_CPMM_POOL_PROGRAM","DEV_CREATE_CPMM_POOL_AUTH","DEV_CREATE_CPMM_POOL_FEE_ACC","DEVNET_PROGRAM_ID","PublicKey","DEV_CREATE_CPMM_POOL_PROGRAM","DEV_CREATE_CPMM_POOL_AUTH","DEV_CREATE_CPMM_POOL_FEE_ACC","BN","Connection","MINT_SIZE","TOKEN_PROGRAM_ID","getTransferFeeConfig","unpackMint","logger","createLogger","getMultipleAccountsInfo","connection","publicKeys","config","__async","batchRequest","commitment","chunkCount","__spreadValues","chunkedKeys","chunkArray","results","batch","keys","key","_batch","i","unsafeRes","accountInfo","data","executable","lamports","owner","rentEpoch","PublicKey","error","getMultipleLookupTableInfo","_0","__async","connection","address","dataInfos","getMultipleAccountsInfo","i","PublicKey","outDict","info","key","lookupAccount","AddressLookupTableAccount","LOOKUP_TABLE_CACHE","LOOP_INTERVAL","TxBuilder","params","__async","_a","json","axios","avg","config","instructions","instructionTypes","addComputeBudget","tipConfig","SystemProgram","PublicKey","InstructionType","_0","propConfig","defaultIns","e","endInstructions","signers","endInstructionTypes","lookupTableAddress","address","txVersion","extInfo","__spreadValues","transaction","Transaction","s","propBlockHash","skipPreflight","sendAndConfirm","recentBlockHash","getRecentBlockHash","printSimulate","sendAndConfirmTransaction","txs","item","extraPreBuildData","filterExtraBuildData","data","allTransactions","allSigners","allInstructionTypes","executeParams","sequentially","onTxUpdate","skipTxCount","txIds","i","tx","txId","partialSignedTxs","idx","signedTxs","processedTxs","checkSendTx","confirmed","intervalId","subSignatureId","cbk","signatureResult","targetTxIdx","r","result","d","props","_b","lookupTableCache","forerunCreate","propRecentBlockhash","__objRest","lookupTableAddressAccount","LOOKUP_TABLE_CACHE","allLTA","needCacheLTA","newCacheLTA","getMultipleLookupTableInfo","key","value","recentBlockhash","messageV0","TransactionMessage","VersionedTransaction","confirmTransaction","buildProps","splitIns","computeBudgetConfig","computeBudgetData","signerKey","acc","cur","__spreadProps","instructionQueue","splitInsIdx","_itemIns","_itemInsWithCompute","_signer","ii","checkLegacyTxSize","_signers","needSignedTx","blockHash","checkV0TxSize","joinMsg","args","arg","e","ModuleBase","scope","moduleName","createLogger","feePayer","TxBuilder","message"]}