{"version":3,"sources":["../../../src/raydium/farm/util.ts","../../../src/common/accountInfo.ts","../../../src/common/logger.ts","../../../src/common/bignumber.ts","../../../src/module/amount.ts","../../../src/module/formatter.ts","../../../src/module/fraction.ts","../../../src/common/constant.ts","../../../src/raydium/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/date.ts","../../../src/common/lodash.ts","../../../src/common/pda.ts","../../../src/common/txTool/txUtils.ts","../../../src/common/programId.ts","../../../src/common/transfer.ts","../../../src/common/txTool/lookupTable.ts","../../../src/common/txTool/txTool.ts","../../../src/common/fee.ts","../../../src/marshmallow/index.ts","../../../src/marshmallow/buffer-layout.ts","../../../src/raydium/account/layout.ts","../../../src/raydium/farm/config.ts","../../../src/raydium/farm/layout.ts"],"sourcesContent":["import { Connection, PublicKey } from \"@solana/web3.js\";\nimport BN from \"bn.js\";\n\nimport { RewardInfoV6 } from \"../../api/type\";\nimport { parseBigNumberish } from \"../../common\";\nimport { GetMultipleAccountsInfoConfig, getMultipleAccountsInfoWithCustomFlags } from \"../../common/accountInfo\";\nimport { DateParam, isDateAfter, isDateBefore } from \"../../common/date\";\nimport { createLogger } from \"../../common/logger\";\nimport { findProgramAddress, ProgramAddress } from \"../../common/txTool/txUtils\";\nimport { jsonInfo2PoolKeys } from \"../../common/utility\";\n\nimport { splAccountLayout } from \"../account/layout\";\nimport { SplAccount } from \"../account/types\";\nimport { FARM_VERSION_TO_LEDGER_LAYOUT, FARM_VERSION_TO_STATE_LAYOUT, poolTypeV6 } from \"./config\";\nimport { FarmLedger, FarmLedgerLayout, FarmState, FarmStateLayout } from \"./layout\";\nimport { FarmRewardInfo, FarmRewardInfoConfig } from \"./type\";\n\nimport { Voter, VoterRegistrar } from \"./layout\";\n\nconst logger = createLogger(\"Raydium.farm.util\");\ninterface AssociatedLedgerPoolAccount {\n  programId: PublicKey;\n  poolId: PublicKey;\n  mint: PublicKey;\n  type: \"lpVault\" | \"rewardVault\";\n}\n\nexport function getAssociatedLedgerPoolAccount({\n  programId,\n  poolId,\n  mint,\n  type,\n}: AssociatedLedgerPoolAccount): PublicKey {\n  const { publicKey } = findProgramAddress(\n    [\n      poolId.toBuffer(),\n      mint.toBuffer(),\n      Buffer.from(\n        type === \"lpVault\" ? \"lp_vault_associated_seed\" : type === \"rewardVault\" ? \"reward_vault_associated_seed\" : \"\",\n        \"utf-8\",\n      ),\n    ],\n    programId,\n  );\n  return publicKey;\n}\n\nexport function getAssociatedLedgerAccount({\n  programId,\n  poolId,\n  owner,\n  version,\n}: {\n  programId: PublicKey;\n  poolId: PublicKey;\n  owner: PublicKey;\n  version: 6 | 5 | 3;\n}): PublicKey {\n  const { publicKey } = findProgramAddress(\n    [\n      poolId.toBuffer(),\n      owner.toBuffer(),\n      Buffer.from(version === 6 ? \"farmer_info_associated_seed\" : \"staker_info_v2_associated_seed\", \"utf-8\"),\n    ],\n    programId,\n  );\n  return publicKey;\n}\n\nexport const getAssociatedAuthority = ({\n  programId,\n  poolId,\n}: {\n  programId: PublicKey;\n  poolId: PublicKey;\n}): ProgramAddress => findProgramAddress([poolId.toBuffer()], programId);\n\nexport function farmRewardInfoToConfig(data: FarmRewardInfo): FarmRewardInfoConfig {\n  return {\n    isSet: new BN(1),\n    rewardPerSecond: parseBigNumberish(data.perSecond),\n    rewardOpenTime: parseBigNumberish(data.openTime),\n    rewardEndTime: parseBigNumberish(data.endTime),\n    rewardType: parseBigNumberish(poolTypeV6[data.rewardType]),\n  };\n}\n\nexport function calFarmRewardAmount(data: Pick<RewardInfoV6, \"openTime\" | \"endTime\"> & { perSecond: string }): BN {\n  return parseBigNumberish(data.endTime).sub(parseBigNumberish(data.openTime)).mul(parseBigNumberish(data.perSecond));\n}\n\nexport function getFarmLedgerLayout(version: number): FarmLedgerLayout | undefined {\n  const ledgerLayout = FARM_VERSION_TO_LEDGER_LAYOUT[version];\n  if (!ledgerLayout) logger.logWithError(\"invalid version\", version);\n  return ledgerLayout;\n}\n\nexport function getFarmStateLayout(version: number): FarmStateLayout | undefined {\n  const stateLayout = FARM_VERSION_TO_STATE_LAYOUT[version];\n  if (!stateLayout) logger.logWithError(\"invalid version\", version);\n  return stateLayout;\n}\n\nexport function updateFarmPoolInfo(\n  poolInfo: FarmState,\n  lpVault: SplAccount,\n  slot: number,\n  chainTime: number,\n): FarmState {\n  if (poolInfo.version === 3 || poolInfo.version === 5) {\n    if (poolInfo.lastSlot.gte(new BN(slot))) return poolInfo;\n\n    const spread = new BN(slot).sub(poolInfo.lastSlot);\n    poolInfo.lastSlot = new BN(slot);\n\n    for (const itemRewardInfo of poolInfo.rewardInfos) {\n      if (lpVault.amount.eq(new BN(0))) continue;\n\n      const reward = itemRewardInfo.perSlotReward.mul(spread);\n      itemRewardInfo.perShareReward = itemRewardInfo.perShareReward.add(\n        reward.mul(new BN(10).pow(new BN(poolInfo.version === 3 ? 9 : 15))).div(lpVault.amount),\n      );\n      itemRewardInfo.totalReward = itemRewardInfo.totalReward.add(reward);\n    }\n  } else if (poolInfo.version === 6) {\n    for (const itemRewardInfo of poolInfo.rewardInfos) {\n      if (itemRewardInfo.rewardState.eq(new BN(0))) continue;\n      const updateTime = BN.min(new BN(chainTime), itemRewardInfo.rewardEndTime);\n      if (itemRewardInfo.rewardOpenTime.gte(updateTime)) continue;\n      const spread = updateTime.sub(itemRewardInfo.rewardLastUpdateTime);\n      let reward = spread.mul(itemRewardInfo.rewardPerSecond);\n      const leftReward = itemRewardInfo.totalReward.sub(itemRewardInfo.totalRewardEmissioned);\n      if (leftReward.lt(reward)) {\n        reward = leftReward;\n        itemRewardInfo.rewardLastUpdateTime = itemRewardInfo.rewardLastUpdateTime.add(\n          leftReward.div(itemRewardInfo.rewardPerSecond),\n        );\n      } else {\n        itemRewardInfo.rewardLastUpdateTime = updateTime;\n      }\n      if (lpVault.amount.eq(new BN(0))) continue;\n      itemRewardInfo.accRewardPerShare = itemRewardInfo.accRewardPerShare.add(\n        reward.mul(poolInfo.rewardMultiplier).div(lpVault.amount),\n      );\n      itemRewardInfo.totalRewardEmissioned = itemRewardInfo.totalRewardEmissioned.add(reward);\n    }\n  }\n  return poolInfo;\n}\n\ninterface FarmPoolsInfo {\n  [id: string]: {\n    state: FarmState;\n    lpVault: SplAccount;\n    ledger?: FarmLedger;\n    wrapped?: { pendingRewards: BN[] };\n  };\n}\n\nexport interface FarmFetchMultipleInfoParams {\n  connection: Connection;\n  farmPools: any[];\n  owner?: PublicKey;\n  config?: GetMultipleAccountsInfoConfig;\n  chainTime: number;\n}\n\nexport async function fetchMultipleFarmInfoAndUpdate({\n  connection,\n  farmPools,\n  owner,\n  config,\n  chainTime,\n}: FarmFetchMultipleInfoParams): Promise<FarmPoolsInfo> {\n  let hasNotV6Pool = false;\n  let hasV6Pool = false;\n  const tenBN = new BN(10);\n\n  const publicKeys: {\n    pubkey: PublicKey;\n    version: number;\n    key: \"state\" | \"lpVault\" | \"ledger\";\n    poolId: PublicKey;\n  }[] = [];\n\n  for (const poolInfo of farmPools) {\n    const pool = jsonInfo2PoolKeys(poolInfo);\n    if (pool.version === 6) hasV6Pool = true;\n    else hasNotV6Pool = true;\n\n    publicKeys.push(\n      {\n        pubkey: pool.id,\n        version: pool.version,\n        key: \"state\",\n        poolId: pool.id,\n      },\n      {\n        pubkey: pool.lpVault,\n        version: pool.version,\n        key: \"lpVault\",\n        poolId: pool.id,\n      },\n    );\n\n    if (owner) {\n      publicKeys.push({\n        pubkey: getAssociatedLedgerAccount({\n          programId: pool.programId,\n          poolId: pool.id,\n          owner,\n          version: poolInfo.version as 6 | 5 | 3,\n        }),\n        version: pool.version,\n        key: \"ledger\",\n        poolId: pool.id,\n      });\n    }\n  }\n\n  const poolsInfo: FarmPoolsInfo = {};\n  const accountsInfo = await getMultipleAccountsInfoWithCustomFlags(connection, publicKeys, config);\n  for (const { pubkey, version, key, poolId, accountInfo } of accountsInfo) {\n    const _poolId = poolId.toBase58();\n    poolsInfo[_poolId] = { ...poolsInfo[_poolId] };\n    if (key === \"state\") {\n      const stateLayout = getFarmStateLayout(version);\n      if (!accountInfo || !accountInfo.data || accountInfo.data.length !== stateLayout!.span)\n        logger.logWithError(`invalid farm state account info, pools.id, ${pubkey}`);\n      poolsInfo[_poolId].state = stateLayout!.decode(accountInfo!.data);\n    } else if (key === \"lpVault\") {\n      if (!accountInfo || !accountInfo.data || accountInfo.data.length !== splAccountLayout.span)\n        logger.logWithError(`invalid farm lp vault account info, pools.lpVault, ${pubkey}`);\n      poolsInfo[_poolId].lpVault = splAccountLayout.decode(accountInfo!.data);\n    } else if (key === \"ledger\") {\n      const legerLayout = getFarmLedgerLayout(version)!;\n      if (accountInfo && accountInfo.data) {\n        if (accountInfo.data.length !== legerLayout.span)\n          logger.logWithError(`invalid farm ledger account info, ledger, ${pubkey}`);\n        poolsInfo[_poolId].ledger = legerLayout.decode(accountInfo.data);\n      }\n    }\n  }\n\n  const slot = hasV6Pool || hasNotV6Pool ? await connection.getSlot() : 0;\n\n  for (const poolId of Object.keys(poolsInfo)) {\n    if (poolsInfo[poolId] === undefined) continue;\n    poolsInfo[poolId].state = updateFarmPoolInfo(poolsInfo[poolId].state, poolsInfo[poolId].lpVault, slot, chainTime);\n  }\n\n  for (const [poolId, { state, ledger }] of Object.entries(poolsInfo)) {\n    if (ledger) {\n      const multiplier =\n        state.version === 6\n          ? state.rewardMultiplier\n          : state.rewardInfos.length === 1\n            ? tenBN.pow(new BN(9))\n            : tenBN.pow(new BN(15));\n\n      const pendingRewards = state.rewardInfos.map((rewardInfo, index) => {\n        const rewardDebt = ledger.rewardDebts[index];\n        const pendingReward = ledger.deposited\n          .mul(state.version === 6 ? rewardInfo.accRewardPerShare : rewardInfo.perShareReward)\n          .div(multiplier)\n          .sub(rewardDebt);\n\n        return pendingReward;\n      });\n\n      poolsInfo[poolId].wrapped = {\n        ...poolsInfo[poolId].wrapped,\n        pendingRewards,\n      };\n    }\n  }\n\n  return poolsInfo;\n}\n/** deprecated */\nexport function judgeFarmType(\n  info: any,\n  currentTime: DateParam = Date.now(),\n): \"closed pool\" | \"normal fusion pool\" | \"dual fusion pool\" | undefined | \"upcoming pool\" {\n  if (info.version === 6) {\n    const rewardInfos = info.state.rewardInfos;\n    if (rewardInfos.every(({ rewardOpenTime }) => isDateBefore(currentTime, rewardOpenTime.toNumber(), { unit: \"s\" })))\n      return \"upcoming pool\";\n    if (rewardInfos.every(({ rewardEndTime }) => isDateAfter(currentTime, rewardEndTime.toNumber(), { unit: \"s\" })))\n      return \"closed pool\";\n  } else {\n    const perSlotRewards = info.state.rewardInfos.map(({ perSlotReward }) => perSlotReward);\n    if (perSlotRewards.length === 2) {\n      // v5\n      if (String(perSlotRewards[0]) === \"0\" && String(perSlotRewards[1]) !== \"0\") {\n        return \"normal fusion pool\"; // reward xxx token\n      }\n      if (String(perSlotRewards[0]) !== \"0\" && String(perSlotRewards[1]) !== \"0\") {\n        return \"dual fusion pool\"; // reward ray and xxx token\n      }\n      if (String(perSlotRewards[0]) === \"0\" && String(perSlotRewards[1]) === \"0\") {\n        return \"closed pool\";\n      }\n    } else if (perSlotRewards.length === 1) {\n      // v3\n      if (String(perSlotRewards[0]) === \"0\") {\n        return \"closed pool\";\n      }\n    }\n  }\n}\n\nexport async function getDepositEntryIndex(\n  connection: Connection,\n  registrar: PublicKey,\n  voter: PublicKey,\n  voterMint: PublicKey,\n): Promise<{ index: number; isInit: boolean }> {\n  const registrarAccountData = await connection.getAccountInfo(registrar);\n  if (registrarAccountData === null) throw Error(\"registrar info check error\");\n  const registrarData = VoterRegistrar.decode(registrarAccountData.data);\n\n  const votingMintConfigIndex = registrarData.votingMints.findIndex((i) => i.mint.equals(voterMint));\n\n  if (votingMintConfigIndex === -1) throw Error(\"find voter mint error\");\n\n  const voterAccountData = await connection.getAccountInfo(voter);\n  if (voterAccountData === null) return { index: votingMintConfigIndex, isInit: false }; // throw Error('voter info check error')\n\n  const voterData = Voter.decode(voterAccountData.data);\n\n  const depositEntryIndex = voterData.deposits.findIndex(\n    (i) => i.isUsed && i.votingMintConfigIdx === votingMintConfigIndex,\n  );\n  if (depositEntryIndex === -1) return { index: votingMintConfigIndex, isInit: false };\n  else return { index: depositEntryIndex, isInit: true };\n}\n","import { AccountInfo, Commitment, Connection, PublicKey } from \"@solana/web3.js\";\nimport { ReturnTypeFetchMultipleMintInfos } from \"../raydium/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(\"Raydium_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 { 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 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 \"../raydium/token/type\";\nimport { ReplaceType } from \"../raydium/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\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\nexport function ceilDiv(tokenAmount: BN, feeNumerator: BN, feeDenominator: BN): BN {\n  return tokenAmount.mul(feeNumerator).add(feeDenominator).sub(new BN(1)).div(feeDenominator);\n}\n\nexport function floorDiv(tokenAmount: BN, feeNumerator: BN, feeDenominator: BN): BN {\n  return tokenAmount.mul(feeNumerator).div(feeDenominator);\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}\n\nexport function recursivelyDecimalToFraction<T>(info: T): ReplaceType<T, Decimal, Fraction> {\n  // @ts-expect-error no need type for inner code\n  return isDecimal(info)\n    ? decimalToFraction(info as any)\n    : Array.isArray(info)\n    ? info.map((k) => recursivelyDecimalToFraction(k))\n    : notInnerObject(info)\n    ? Object.fromEntries(Object.entries(info as any).map(([k, v]) => [k, recursivelyDecimalToFraction(v)]))\n    : info;\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(\"Raydium_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(\"Raydium_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}","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: \"raydium\",\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: \"raydium\",\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 \"../raydium/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 \"../raydium/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(\"Raydium_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 \"../raydium/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}\n\nexport function jsonInfo2PoolKeys<T>(jsonInfo: T): ReplaceType<T, string, PublicKey> {\n  // @ts-expect-error no need type for inner code\n  return typeof jsonInfo === \"string\"\n    ? tryParsePublicKey(jsonInfo)\n    : Array.isArray(jsonInfo)\n    ? jsonInfo.map((k) => jsonInfo2PoolKeys(k))\n    : notInnerObject(jsonInfo)\n    ? Object.fromEntries(Object.entries(jsonInfo).map(([k, v]) => [k, jsonInfo2PoolKeys(v)]))\n    : jsonInfo;\n}\n","export type TimeStamp = string | number | Date;\n\nexport const isNumber = (val): boolean => typeof val === \"number\";\nexport type DateParam = string | number | Date | undefined;\n\nexport const getDate = (value?: DateParam): Date => (value ? new Date(value) : new Date());\nexport const getTime = (value?: DateParam): number => getDate(value).getTime();\n\n/** A must be milliseconds */\nexport function isDateBefore(timestampA: TimeStamp, timestampB: TimeStamp, options?: { unit?: \"ms\" | \"s\" }): boolean {\n  const realTimestampB = isNumber(timestampB)\n    ? (timestampB as number) * (options?.unit === \"s\" ? 1000 : 1)\n    : timestampB;\n  return new Date(timestampA).getTime() <= realTimestampB;\n}\n\n/** A must be milliseconds */\nexport function isDateAfter(timestampA: TimeStamp, timestampB: TimeStamp, options?: { unit?: \"ms\" | \"s\" }): boolean {\n  const realTimestampB = isNumber(timestampB)\n    ? (timestampB as number) * (options?.unit === \"s\" ? 1000 : 1)\n    : timestampB;\n  return new Date(timestampA).getTime() > realTimestampB;\n}\n\nexport function offsetDateTime(\n  baseDate: DateParam,\n  offset: {\n    days?: number;\n    hours?: number;\n    minutes?: number;\n    seconds?: number;\n    milliseconds?: number;\n  },\n): Date {\n  const timestamp = getTime(baseDate);\n  const offsetedTimestamp =\n    timestamp +\n    (offset.days ? offset.days * 24 * 60 * 60 * 1000 : 0) +\n    (offset.hours ? offset.hours * 60 * 60 * 1000 : 0) +\n    (offset.minutes ? offset.minutes * 60 * 1000 : 0) +\n    (offset.seconds ? offset.seconds * 1000 : 0) +\n    (offset.milliseconds ? offset.milliseconds : 0);\n  return getDate(offsetedTimestamp);\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\";\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","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 \"../../raydium/type\";\nimport { TOKEN_PROGRAM_ID } from \"@solana/spl-token\";\n\nconst logger = createLogger(\"Raydium_txUtil\");\n\nexport const MAX_BASE64_SIZE = 1644;\n\nexport function addComputeBudget(config: ComputeBudgetConfig): {\n  instructions: TransactionInstruction[];\n  instructionTypes: string[];\n} {\n  const ins: TransactionInstruction[] = [];\n  const insTypes: string[] = [];\n  if (config.microLamports) {\n    ins.push(ComputeBudgetProgram.setComputeUnitPrice({ microLamports: config.microLamports }));\n    insTypes.push(InstructionType.SetComputeUnitPrice);\n  }\n  if (config.units) {\n    ins.push(ComputeBudgetProgram.setComputeUnitLimit({ units: config.units }));\n    insTypes.push(InstructionType.SetComputeUnitLimit);\n  }\n\n  return {\n    instructions: ins,\n    instructionTypes: insTypes,\n  };\n}\n\nexport async function getRecentBlockHash(connection: Connection, 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(\"RaydiumSimuLateTransaction11111111111111111\");\n\n  const transactions: Transaction[] = [];\n\n  let transaction = new Transaction();\n  transaction.feePayer = feePayer;\n\n  for (const instruction of instructions) {\n    if (!forecastTransactionSize([...transaction.instructions, instruction], [feePayer])) {\n      transactions.push(transaction);\n      transaction = new Transaction();\n      transaction.feePayer = feePayer;\n    }\n    transaction.add(instruction);\n  }\n  if (transaction.instructions.length > 0) {\n    transactions.push(transaction);\n  }\n\n  let results: SimulatedTransactionResponse[] = [];\n\n  try {\n    results = await simulateTransaction(connection, transactions, batchRequest);\n    if (results.find((i) => i.err !== null)) throw Error(\"rpc simulateTransaction error\");\n  } catch (error) {\n    if (error instanceof Error) {\n      logger.logWithError(\"failed to simulate for instructions\", \"RPC_ERROR\", {\n        message: error.message,\n      });\n    }\n  }\n\n  const logs: string[] = [];\n  for (const result of results) {\n    logger.debug(\"simulate result:\", result);\n\n    if (result.logs) {\n      const filteredLog = result.logs.filter((log) => log && log.includes(keyword));\n      logger.debug(\"filteredLog:\", logs);\n      if (!filteredLog.length) logger.logWithError(\"simulate log not match keyword\", \"keyword\", keyword);\n      logs.push(...filteredLog);\n    }\n  }\n\n  return logs;\n}\n\nexport function parseSimulateLogToJson(log: string, keyword: string): any {\n  const results = log.match(/{[\"\\w:,]+}/g);\n  if (!results || results.length !== 1) {\n    return logger.logWithError(`simulate log fail to match json, keyword: ${keyword}`);\n  }\n\n  return results[0];\n}\n\nexport function parseSimulateValue(log: string, key: string): any {\n  const reg = new RegExp(`\"${key}\":(\\\\d+)`, \"g\");\n\n  const results = reg.exec(log);\n  if (!results || results.length !== 2) {\n    return logger.logWithError(`simulate log fail to match key\", key: ${key}`);\n  }\n\n  return results[1];\n}\n\nexport interface ProgramAddress {\n  publicKey: PublicKey;\n  nonce: number;\n}\nexport function findProgramAddress(\n  seeds: Array<Buffer | Uint8Array>,\n  programId: PublicKey,\n): {\n  publicKey: PublicKey;\n  nonce: number;\n} {\n  const [publicKey, nonce] = PublicKey.findProgramAddressSync(seeds, programId);\n  return { publicKey, nonce };\n}\n\nexport async function simulateTransaction(\n  connection: Connection,\n  transactions: Transaction[],\n  batchRequest?: boolean,\n): Promise<any[]> {\n  let results: any[] = [];\n  if (batchRequest) {\n    const getLatestBlockhash = await connection.getLatestBlockhash();\n\n    const encodedTransactions: string[] = [];\n    for (const transaction of transactions) {\n      transaction.recentBlockhash = getLatestBlockhash.blockhash;\n      transaction.lastValidBlockHeight = getLatestBlockhash.lastValidBlockHeight;\n\n      // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n      // @ts-ignore\n      const message = transaction._compile();\n      const signData = message.serialize();\n\n      // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n      // @ts-ignore\n      const wireTransaction = transaction._serialize(signData);\n      const encodedTransaction = wireTransaction.toString(\"base64\");\n\n      encodedTransactions.push(encodedTransaction);\n    }\n\n    const batch = encodedTransactions.map((keys) => {\n      const args = connection._buildArgs([keys], undefined, \"base64\");\n      return {\n        methodName: \"simulateTransaction\",\n        args,\n      };\n    });\n\n    const reqData: { methodName: string; args: any[] }[][] = [];\n    const itemReqIndex = 20;\n    for (let i = 0; i < Math.ceil(batch.length / itemReqIndex); i++) {\n      reqData.push(batch.slice(i * itemReqIndex, (i + 1) * itemReqIndex));\n    }\n    // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n    // @ts-ignore\n    results = await (\n      await Promise.all(\n        reqData.map(async (i) => (await (connection as any)._rpcBatchRequest(i)).map((ii) => ii.result.value)),\n      )\n    ).flat();\n  } else {\n    try {\n      results = await Promise.all(\n        transactions.map(async (transaction) => await (await connection.simulateTransaction(transaction)).value),\n      );\n    } catch (error) {\n      if (error instanceof Error) {\n        logger.logWithError(\"failed to get info for multiple accounts\", \"RPC_ERROR\", {\n          message: error.message,\n        });\n      }\n    }\n  }\n\n  return results;\n}\n\nexport function checkLegacyTxSize({\n  instructions,\n  payer,\n  signers,\n}: {\n  instructions: TransactionInstruction[];\n  payer: PublicKey;\n  signers: PublicKey[];\n}): boolean {\n  return forecastTransactionSize(instructions, [payer, ...signers]);\n}\n\nexport function checkV0TxSize({\n  instructions,\n  payer,\n  lookupTableAddressAccount,\n  recentBlockhash = Keypair.generate().publicKey.toString(),\n}: {\n  instructions: TransactionInstruction[];\n  payer: PublicKey;\n  lookupTableAddressAccount?: CacheLTA;\n  recentBlockhash?: string;\n}): boolean {\n  const transactionMessage = new TransactionMessage({\n    payerKey: payer,\n    recentBlockhash,\n    instructions,\n  });\n\n  const messageV0 = transactionMessage.compileToV0Message(Object.values(lookupTableAddressAccount ?? {}));\n  try {\n    const buildLength = Buffer.from(new VersionedTransaction(messageV0).serialize()).toString(\"base64\").length;\n    return buildLength < MAX_BASE64_SIZE;\n  } catch (error) {\n    return false;\n  }\n}\n\nlet epochInfoCache: { time: number; data?: EpochInfo } = {\n  time: 0,\n  data: undefined,\n};\n\nexport async function getEpochInfo(connection: Connection): Promise<EpochInfo> {\n  if (!epochInfoCache.data || (Date.now() - epochInfoCache.time) / 1000 > 30) {\n    const data = await connection.getEpochInfo();\n    epochInfoCache = {\n      time: Date.now(),\n      data,\n    };\n    return data;\n  } else {\n    return epochInfoCache.data;\n  }\n}\n\nexport const toBuffer = (arr: Buffer | Uint8Array | Array<number>): Buffer => {\n  if (Buffer.isBuffer(arr)) {\n    return arr;\n  } else if (arr instanceof Uint8Array) {\n    return Buffer.from(arr.buffer, arr.byteOffset, arr.byteLength);\n  } else {\n    return Buffer.from(arr);\n  }\n};\n\nexport 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","import { PublicKey } from \"@solana/web3.js\";\n\n// raydium\nexport const FARM_PROGRAM_ID_V3 = new PublicKey(\"EhhTKczWMGQt46ynNeRX1WfeagwwJd7ufHvCDjRxjo5Q\");\n// temp fusion\nexport const FARM_PROGRAM_ID_V4 = new PublicKey(\"CBuCnLe26faBpcBP2fktp4rp8abpcAnTWft6ZrP5Q4T\");\n// \"fusion\"\nexport const FARM_PROGRAM_ID_V5 = new PublicKey(\"9KEPoZmtHUrBbhWN1v1KWLMkkvwY6WLtAVUCPRtRjP4z\");\n// echosystem\nexport const FARM_PROGRAM_ID_V6 = new PublicKey(\"FarmqiPv5eAj3j1GMdMCMUGXqPUvmquZtMy86QH6rzhG\");\n\nexport const UTIL1216 = new PublicKey(\"CLaimxFqjHzgTJtAGHU47NPhg6qrc5sCnpC4tBLyABQS\");\n\nexport const OPEN_BOOK_PROGRAM = new PublicKey(\"srmqPvymJeFKQ4zGQed1GFppgkRHL9kaELCbyksJtPX\");\nexport const SERUM_PROGRAM_ID_V3 = new PublicKey(\"9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin\");\n\nexport const AMM_V4 = new PublicKey(\"675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8\");\nexport const AMM_STABLE = new PublicKey(\"5quBtoiQqxF9Jv6KYKctB59NT3gtJD2Y65kdnB1Uev3h\");\nexport const LIQUIDITY_POOL_PROGRAM_ID_V5_MODEL = new PublicKey(\"CDSr3ssLcRB6XYPJwAfFt18MZvEZp4LjHcvzBVZ45duo\");\nexport const CLMM_PROGRAM_ID = new PublicKey(\"CAMMCzo5YL8w4VFF8KVHrK22GGUsp5VTaW7grrKgrWqK\");\nexport const CLMM_LOCK_PROGRAM_ID = new PublicKey(\"LockrWmn6K5twhz3y9w1dQERbmgSaRkfnTeTKbpofwE\");\nexport const CLMM_LOCK_AUTH_ID = new PublicKey(\"kN1kEznaF5Xbd8LYuqtEFcxzWSBk5Fv6ygX6SqEGJVy\");\n\nexport const Router = new PublicKey(\"routeUGWgWzqBWFcrCfv8tritsqukccJPu3q5GPP3xS\");\nexport const FEE_DESTINATION_ID = new PublicKey(\"7YttLkHDoNj9wyDur5pM1ejNaAvT9X4eqaYcHQqtj2G5\");\n\nexport const IDO_PROGRAM_ID_V1 = new PublicKey(\"6FJon3QE27qgPVggARueB22hLvoh22VzJpXv4rBEoSLF\");\nexport const IDO_PROGRAM_ID_V2 = new PublicKey(\"CC12se5To1CdEuw7fDS27B7Geo5jJyL7t5UK2B44NgiH\");\nexport const IDO_PROGRAM_ID_V3 = new PublicKey(\"9HzJyW1qZsEiSfMUf6L2jo3CcTKAyBmSyKdwQeYisHrC\");\nexport const IDO_PROGRAM_ID_V4 = new PublicKey(\"DropEU8AvevN3UrXWXTMuz3rqnMczQVNjq3kcSdW2SQi\");\n\nexport const CREATE_CPMM_POOL_PROGRAM = new PublicKey(\"8dJuKxXufKDynREfeu5zkbSsVA69p7BpvHu62kUgwE3H\");\nexport const CREATE_CPMM_POOL_AUTH = new PublicKey(\"DDGbigvGH49guY7PaaSdaNd3FiF5fyMzywzkF35bjZz7\");\nexport const CREATE_CPMM_POOL_FEE_ACC = new PublicKey(\"DDGbigvGH49guY7PaaSdaNd3FiF5fyMzywzkF35bjZz7\");\n\nexport const DEV_CREATE_CPMM_POOL_PROGRAM = new PublicKey(\"CPMDWBwJDtYax9qW7AyRuVC19Cc4L4Vcy4n2BHAbHkCW\");\nexport const DEV_CREATE_CPMM_POOL_AUTH = new PublicKey(\"7rQ1QFNosMkUCuh7Z7fPbTHvh73b68sQYdirycEzJVuw\");\nexport const DEV_CREATE_CPMM_POOL_FEE_ACC = new PublicKey(\"G11FKBRaAkHAKuLCgLM6K6NUc9rTjPAznRCjZifrTQe2\");\n\nexport const LOCK_CPMM_PROGRAM = new PublicKey(\"LockrWmn6K5twhz3y9w1dQERbmgSaRkfnTeTKbpofwE\");\nexport const DEV_LOCK_CPMM_PROGRAM = new PublicKey(\"DLockwT7X7sxtLmGH9g5kmfcjaBtncdbUmi738m5bvQC\");\n\nexport const LOCK_CPMM_AUTH = new PublicKey(\"3f7GcQFG397GAaEnv51zR6tsTVihYRydnydDD1cXekxH\");\nexport const DEV_LOCK_CPMM_AUTH = new PublicKey(\"7AFUeLVRjBfzqK3tTGw8hN48KLQWSk6DTE8xprWdPqix\");\n\nexport const LAUNCHPAD_PROGRAM = new PublicKey(\"LanMV9sAd7wArD4vJFi2qDdfnVhFxYSUg6eADduJ3uj\");\nexport const LAUNCHPAD_AUTH = new PublicKey(\"WLHv2UAZm6z4KyaaELi5pjdbJh6RESMva1Rnn8pJVVh\");\n\nexport const DEV_LAUNCHPAD_PROGRAM = new PublicKey(\"LanD8FpTBBvzZFXjTxsAoipkFsxPUCDB4qAqKxYDiNP\");\nexport const DEV_LAUNCHPAD_AUTH = new PublicKey(\"HYNHiyKJ3gGVFvyxJAurK7qr7P2o5J9THmvCGMdULtpW\");\n\nexport const IDO_ALL_PROGRAM = {\n  IDO_PROGRAM_ID_V1,\n  IDO_PROGRAM_ID_V2,\n  IDO_PROGRAM_ID_V3,\n  IDO_PROGRAM_ID_V4,\n};\n\nexport const ALL_PROGRAM_ID = {\n  AMM_V4,\n  AMM_STABLE,\n  CLMM_PROGRAM_ID,\n  CLMM_LOCK_PROGRAM_ID,\n  CLMM_LOCK_AUTH_ID,\n\n  FARM_PROGRAM_ID_V3,\n  FARM_PROGRAM_ID_V5,\n  FARM_PROGRAM_ID_V6,\n\n  OPEN_BOOK_PROGRAM,\n  SERUM_PROGRAM_ID_V3,\n\n  UTIL1216,\n\n  Router,\n\n  CREATE_CPMM_POOL_PROGRAM,\n  CREATE_CPMM_POOL_AUTH,\n  CREATE_CPMM_POOL_FEE_ACC,\n\n  LOCK_CPMM_PROGRAM,\n  LOCK_CPMM_AUTH,\n\n  LAUNCHPAD_PROGRAM,\n  LAUNCHPAD_AUTH,\n};\n\nexport type ProgramIdConfig = Partial<typeof ALL_PROGRAM_ID>;\n\nexport const DEVNET_PROGRAM_ID = {\n  SERUM_MARKET: PublicKey.default,\n  OPENBOOK_MARKET: new PublicKey(\"EoTcMgcDRTJVZDMZWBoU6rhYHZfkNTVEAfz3uUJRcYGj\"),\n\n  UTIL1216: PublicKey.default,\n\n  FarmV3: new PublicKey(\"85BFyr98MbCUU9MVTEgzx1nbhWACbJqLzho6zd6DZcWL\"),\n  FarmV5: new PublicKey(\"EcLzTrNg9V7qhcdyXDe2qjtPkiGzDM2UbdRaeaadU5r2\"),\n  FarmV6: new PublicKey(\"Farm2hJLcqPtPg8M4rR6DMrsRNc5TPm5Cs4bVQrMe2T7\"),\n\n  AmmV4: new PublicKey(\"HWy1jotHpo6UqeQxx49dpYYdQB8wj9Qk9MdxwjLvDHB8\"),\n  AmmStable: new PublicKey(\"DDg4VmQaJV9ogWce7LpcjBA9bv22wRp5uaTPa5pGjijF\"),\n\n  CLMM: new PublicKey(\"devi51mZmdwUJGU9hjN27vEz64Gps7uUefqxg27EAtH\"),\n  CLMM_LOCK_PROGRAM_ID: new PublicKey(\"DLockwT7X7sxtLmGH9g5kmfcjaBtncdbUmi738m5bvQC\"),\n  CLMM_LOCK_AUTH_ID: new PublicKey(\"8qmHNvu2Kr2C7U8mJL4Vz1vTDxMhVuXKREwU7TNoaVEo\"),\n\n  Router: new PublicKey(\"BVChZ3XFEwTMUk1o9i3HAf91H6mFxSwa5X2wFAWhYPhU\"),\n\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  FEE_DESTINATION_ID: new PublicKey(\"3XMrhbv989VxAMi3DErLV9eJht1pHppW5LbKxe9fkEFR\"),\n\n  LOCK_CPMM_PROGRAM: DEV_LOCK_CPMM_PROGRAM,\n  LCOK_CPMM_AUTH: DEV_LOCK_CPMM_AUTH,\n\n  LAUNCHPAD_PROGRAM: DEV_LAUNCHPAD_PROGRAM,\n  LAUNCHPAD_AUTH: DEV_LAUNCHPAD_AUTH,\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 \"../raydium/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\nexport function ceilDivBN(amountA: BN, amountB: BN): BN {\n  if (amountA.isZero()) return new BN(0);\n\n  const quotient = amountA.div(amountB);\n\n  if (quotient.isZero()) return new BN(1);\n\n  const remainder = amountA.mod(amountB);\n  if (remainder.gt(new BN(0))) {\n    return quotient.add(new BN(1));\n  }\n  return quotient;\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  \"AcL1Vo8oy1ULiavEcjSUcwfBSForXMudcZvDZy5nzJkU\": new AddressLookupTableAccount({\n    key: new PublicKey(\"AcL1Vo8oy1ULiavEcjSUcwfBSForXMudcZvDZy5nzJkU\"),\n    state: AddressLookupTableAccount.deserialize(\n      Buffer.from(\n        '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',\n        \"base64\",\n      ),\n    ),\n  }),\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 \"../../raydium/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  notSendToRpc?: 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, notSendToRpc } = 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: notSendToRpc ? \"\" : 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: 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 {\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    const messageV0 = new TransactionMessage({\n      payerKey: this.feePayer,\n      recentBlockhash,\n      instructions: [...this.allInstructions],\n    }).compileToV0Message(Object.values(lookupTableAddressAccount));\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\n    transaction.sign(this.signers);\n\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, notSendToRpc } = 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: notSendToRpc ? \"\" : 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\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    allTransactions.forEach((tx, idx) => {\n      tx.sign(allSigners[idx]);\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 BN from \"bn.js\";\nexport const FEE_RATE_DENOMINATOR_VALUE = new BN(1_000_000);\n","import { PublicKey } from \"@solana/web3.js\";\nimport BN, { isBN } from \"bn.js\";\n\nimport {\n  bits,\n  blob,\n  Blob,\n  Layout,\n  offset as _offset,\n  seq as _seq,\n  Structure as _Structure,\n  u32 as _u32,\n  u8 as _u8,\n  UInt,\n  union as _union,\n  Union as _Union,\n} from \"./buffer-layout\";\n\nexport * from \"./buffer-layout\";\nexport { blob };\n\nexport class BNLayout<P extends string = \"\"> extends Layout<BN, P> {\n  blob: Layout<Buffer>;\n  signed: boolean;\n\n  constructor(span: number, signed: boolean, property?: P) {\n    //@ts-expect-error type wrong for super()'s type different from extends, but it desn't matter\n    super(span, property);\n    this.blob = blob(span);\n    this.signed = signed;\n  }\n\n  /** @override */\n  decode(b: Buffer, offset = 0): BN {\n    const num = new BN(this.blob.decode(b, offset), 10, \"le\");\n    if (this.signed) {\n      return num.fromTwos(this.span * 8).clone();\n    }\n    return num;\n  }\n\n  /** @override */\n  encode(src: BN, b: Buffer, offset = 0): number {\n    if (typeof src === \"number\") src = new BN(src); // src will pass a number accidently in union\n    if (this.signed) {\n      src = src.toTwos(this.span * 8);\n    }\n    return this.blob.encode(src.toArrayLike(Buffer, \"le\", this.span), b, offset);\n  }\n}\n\nexport class WideBits<P extends string = \"\"> extends Layout<Record<string, boolean>, P> {\n  _lower: any;\n  _upper: any;\n  // TODO: unknown\n  constructor(property?: P) {\n    //@ts-expect-error type wrong for super()'s type different from extends , but it desn't matter\n    super(8, property);\n    this._lower = bits(_u32(), false);\n    this._upper = bits(_u32(), false);\n  }\n\n  addBoolean(property: string): void {\n    if (this._lower.fields.length < 32) {\n      this._lower.addBoolean(property);\n    } else {\n      this._upper.addBoolean(property);\n    }\n  }\n\n  decode(b: Buffer, offset = 0): Record<string, boolean> {\n    const lowerDecoded = this._lower.decode(b, offset);\n    const upperDecoded = this._upper.decode(b, offset + this._lower.span);\n    return { ...lowerDecoded, ...upperDecoded };\n  }\n\n  encode(src: any /* TEMP */, b: Buffer, offset = 0): any {\n    return this._lower.encode(src, b, offset) + this._upper.encode(src, b, offset + this._lower.span);\n  }\n}\n\nexport function u8<P extends string = \"\">(property?: P): UInt<number, P> {\n  return new UInt(1, property);\n}\n\nexport function u32<P extends string = \"\">(property?: P): UInt<number, P> {\n  return new UInt(4, property);\n}\n\nexport function u64<P extends string = \"\">(property?: P): BNLayout<P> {\n  return new BNLayout(8, false, property);\n}\n\nexport function u128<P extends string = \"\">(property?: P): BNLayout<P> {\n  return new BNLayout(16, false, property);\n}\n\nexport function i8<P extends string = \"\">(property?: P): BNLayout<P> {\n  return new BNLayout(1, true, property);\n}\n\nexport function i64<P extends string = \"\">(property?: P): BNLayout<P> {\n  return new BNLayout(8, true, property);\n}\n\nexport function i128<P extends string = \"\">(property?: P): BNLayout<P> {\n  return new BNLayout(16, true, property);\n}\n\nexport class WrappedLayout<T, U, P extends string = \"\"> extends Layout<U, P> {\n  layout: Layout<T>;\n  decoder: (data: T) => U;\n  encoder: (src: U) => T;\n\n  constructor(layout: Layout<T>, decoder: (data: T) => U, encoder: (src: U) => T, property?: P) {\n    //@ts-expect-error type wrong for super()'s type different from extends , but it desn't matter\n    super(layout.span, property);\n    this.layout = layout;\n    this.decoder = decoder;\n    this.encoder = encoder;\n  }\n\n  decode(b: Buffer, offset?: number): U {\n    return this.decoder(this.layout.decode(b, offset));\n  }\n\n  encode(src: U, b: Buffer, offset?: number): number {\n    return this.layout.encode(this.encoder(src), b, offset);\n  }\n\n  getSpan(b: Buffer, offset?: number): number {\n    return this.layout.getSpan(b, offset);\n  }\n}\n\nexport function publicKey<P extends string = \"\">(property?: P): Layout<PublicKey, P> {\n  return new WrappedLayout(\n    blob(32),\n    (b: Buffer) => new PublicKey(b),\n    (key: PublicKey) => key.toBuffer(),\n    property,\n  );\n}\n\nexport class OptionLayout<T, P> extends Layout<T | null, P> {\n  layout: Layout<T>;\n  discriminator: Layout<number>;\n\n  constructor(layout: Layout<T>, property?: P) {\n    //@ts-expect-error type wrong for super()'s type different from extends , but it desn't matter\n    super(-1, property);\n    this.layout = layout;\n    this.discriminator = _u8();\n  }\n\n  encode(src: T | null, b: Buffer, offset = 0): number {\n    if (src === null || src === undefined) {\n      return this.discriminator.encode(0, b, offset);\n    }\n    this.discriminator.encode(1, b, offset);\n    return this.layout.encode(src, b, offset + 1) + 1;\n  }\n\n  decode(b: Buffer, offset = 0): T | null {\n    const discriminator = this.discriminator.decode(b, offset);\n    if (discriminator === 0) {\n      return null;\n    } else if (discriminator === 1) {\n      return this.layout.decode(b, offset + 1);\n    }\n    throw new Error(\"Invalid option \" + this.property);\n  }\n\n  getSpan(b: Buffer, offset = 0): number {\n    const discriminator = this.discriminator.decode(b, offset);\n    if (discriminator === 0) {\n      return 1;\n    } else if (discriminator === 1) {\n      return this.layout.getSpan(b, offset + 1) + 1;\n    }\n    throw new Error(\"Invalid option \" + this.property);\n  }\n}\n\nexport function option<T, P extends string = \"\">(layout: Layout<T>, property?: P): Layout<T | null, P> {\n  return new OptionLayout<T, P>(layout, property);\n}\n\nexport function bool<P extends string = \"\">(property?: P): Layout<boolean, P> {\n  return new WrappedLayout(_u8(), decodeBool, encodeBool, property);\n}\n\nexport function decodeBool(value: number): boolean {\n  if (value === 0) {\n    return false;\n  } else if (value === 1) {\n    return true;\n  }\n  throw new Error(\"Invalid bool: \" + value);\n}\n\nexport function encodeBool(value: boolean): number {\n  return value ? 1 : 0;\n}\n\nexport function vec<T, P extends string = \"\">(elementLayout: Layout<T>, property?: P): Layout<T[], P> {\n  const length = _u32(\"length\");\n  const layout: Layout<{ values: T[] }> = struct([\n    length,\n    seq(elementLayout, _offset(length, -length.span), \"values\"),\n  ]) as any; // Something I don't know\n  return new WrappedLayout(\n    layout,\n    ({ values }) => values,\n    (values) => ({ values }),\n    property,\n  );\n}\n\nexport function tagged<T, P extends string = \"\">(tag: BN, layout: Layout<T>, property?: P): Layout<T, P> {\n  const wrappedLayout: Layout<{ tag: BN; data: T }> = struct([u64(\"tag\"), layout.replicate(\"data\")]) as any; // Something I don't know\n\n  function decodeTag({ tag: receivedTag, data }: { tag: BN; data: T }): T {\n    if (!receivedTag.eq(tag)) {\n      throw new Error(\"Invalid tag, expected: \" + tag.toString(\"hex\") + \", got: \" + receivedTag.toString(\"hex\"));\n    }\n    return data;\n  }\n\n  return new WrappedLayout(wrappedLayout, decodeTag, (data) => ({ tag, data }), property);\n}\n\nexport function vecU8<P extends string = \"\">(property?: P): Layout<Buffer, P> {\n  const length = _u32(\"length\");\n  const layout: Layout<{ data: Buffer }> = struct([length, blob(_offset(length, -length.span), \"data\")]) as any; // Something I don't know\n  return new WrappedLayout(\n    layout,\n    ({ data }) => data,\n    (data) => ({ data }),\n    property,\n  );\n}\n\nexport function str<P extends string = \"\">(property?: P): Layout<string, P> {\n  return new WrappedLayout(\n    vecU8(),\n    (data) => data.toString(\"utf-8\"),\n    (s) => Buffer.from(s, \"utf-8\"),\n    property,\n  );\n}\n\nexport interface EnumLayout<T, P extends string = \"\"> extends Layout<T, P> {\n  registry: Record<string, Layout<any>>;\n}\n\nexport function rustEnum<T, P extends string = \"\">(variants: Layout<any>[], property?: P): EnumLayout<T, P> {\n  const unionLayout = _union(_u8(), property);\n  variants.forEach((variant, index) => unionLayout.addVariant(index, variant, variant.property));\n  return unionLayout as any; // ?why use UnionLayout? This must be a fault\n}\n\nexport function array<T, P extends string = \"\">(\n  elementLayout: Layout<T>,\n  length: number,\n  property?: P,\n): Layout<T[], P> {\n  const layout = struct([seq(elementLayout, length, \"values\")]) as any as Layout<{ values: T[] }>; // Something I don't know\n  return new WrappedLayout(\n    layout,\n    ({ values }) => values,\n    (values) => ({ values }),\n    property,\n  );\n}\n\nexport class Structure<T, P, D extends { [key: string]: any; }> extends _Structure<T, P, D> {\n  /** @override */\n  decode(b: Buffer, offset?: number): D {\n    return super.decode(b, offset);\n  }\n}\n\nexport function struct<T, P extends string = \"\">(\n  fields: T,\n  property?: P,\n  decodePrefixes?: boolean,\n): T extends Layout<infer Value, infer Property>[]\n  ? Structure<\n    Value,\n    P,\n    {\n      [K in Exclude<Extract<Property, string>, \"\">]: Extract<T[number], Layout<any, K>> extends Layout<infer V, any>\n      ? V\n      : any;\n    }\n  >\n  : any {\n  //@ts-expect-error this type is not quite satisfied the define, but, never no need to worry about.\n  return new Structure(fields, property, decodePrefixes);\n}\n\nexport type GetLayoutSchemaFromStructure<T extends Structure<any, any, any>> = T extends Structure<any, any, infer S>\n  ? S\n  : any;\nexport type GetStructureFromLayoutSchema<S extends { [key: string]: any; }> = Structure<any, any, S>;\n\nexport class Union<Schema extends { [key: string]: any; }> extends _Union<Schema> {\n  encodeInstruction(instruction: any): Buffer {\n    const instructionMaxSpan = Math.max(...Object.values(this.registry).map((r) => r.span));\n    const b = Buffer.alloc(instructionMaxSpan);\n    return b.slice(0, this.encode(instruction, b));\n  }\n\n  decodeInstruction(instruction: any): Partial<Schema> {\n    return this.decode(instruction);\n  }\n}\nexport function union<UnionSchema extends { [key: string]: any } = any>(\n  discr: any,\n  defaultLayout?: any,\n  property?: string,\n): Union<UnionSchema> {\n  return new Union(discr, defaultLayout, property);\n}\n\nclass Zeros extends Blob {\n  decode(b: Buffer, offset: number): Buffer {\n    const slice = super.decode(b, offset);\n    if (!slice.every((v) => v === 0)) {\n      throw new Error(\"nonzero padding bytes\");\n    }\n    return slice;\n  }\n}\n\nexport function zeros(length: number): Zeros {\n  return new Zeros(length);\n}\n\nexport function seq<T, P extends string = \"\", AnotherP extends string = \"\">(\n  elementLayout: Layout<T, P>,\n  count: number | BN | Layout<BN | number, P>,\n  property?: AnotherP,\n): Layout<T[], AnotherP> {\n  let parsedCount: number;\n  const superCount =\n    typeof count === \"number\"\n      ? count\n      : isBN(count)\n        ? count.toNumber()\n        : new Proxy(count as unknown as Layout<number> /* pretend to be Layout<number> */, {\n          get(target, property): any {\n            if (!parsedCount) {\n              // get count in targetLayout. note that count may be BN\n              const countProperty = Reflect.get(target, \"count\");\n\n              // let targetLayout's  property:count be a number\n              parsedCount = isBN(countProperty) ? countProperty.toNumber() : countProperty;\n\n              // record the count\n              Reflect.set(target, \"count\", parsedCount);\n            }\n            return Reflect.get(target, property);\n          },\n          set(target, property, value): any {\n            if (property === \"count\") {\n              parsedCount = value;\n            }\n            return Reflect.set(target, property, value);\n          },\n        });\n\n  // @ts-expect-error force type\n  return _seq(elementLayout, superCount, property);\n}\n","import {\n  bits as _bits,\n  BitStructure as _BitStructure,\n  blob as _blob,\n  Blob as _Blob,\n  cstr as _cstr,\n  f32 as _f32,\n  f32be as _f32be,\n  f64 as _f64,\n  f64be as _f64be,\n  greedy as _greedy,\n  Layout as _Layout,\n  ns64 as _ns64,\n  ns64be as _ns64be,\n  nu64 as _nu64,\n  nu64be as _nu64be,\n  offset as _offset,\n  s16 as _s16,\n  s16be as _s16be,\n  s24 as _s24,\n  s24be as _s24be,\n  s32 as _s32,\n  s32be as _s32be,\n  s40 as _s40,\n  s40be as _s40be,\n  s48 as _s48,\n  s48be as _s48be,\n  s8 as _s8,\n  seq as _seq,\n  struct as _struct,\n  Structure as _Structure,\n  u16 as _u16,\n  u16be as _u16be,\n  u24 as _u24,\n  u24be as _u24be,\n  u32 as _u32,\n  u32be as _u32be,\n  u40 as _u40,\n  u40be as _u40be,\n  u48 as _u48,\n  u48be as _u48be,\n  u8 as _u8,\n  UInt as _UInt,\n  union as _union,\n  Union as _Union,\n  unionLayoutDiscriminator as _unionLayoutDiscriminator,\n  utf8 as _utf8,\n} from \"@solana/buffer-layout\";\n\n//#region ------------------- Layout -------------------\nexport interface Layout<T = any, P = \"\"> {\n  span: number;\n  property?: P;\n  decode(b: Buffer, offset?: number): T;\n  encode(src: T, b: Buffer, offset?: number): number;\n  getSpan(b: Buffer, offset?: number): number;\n  replicate<AP extends string>(name: AP): Layout<T, AP>;\n}\nexport interface LayoutConstructor {\n  new <T, P>(): Layout<T, P>; // for class extends syntex\n  new <T, P>(span?: T, property?: P): Layout<T, P>;\n  readonly prototype: Layout;\n}\nexport const Layout = _Layout as unknown as LayoutConstructor;\n//#endregion\n\n//#region ------------------- Structure -------------------\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport interface Structure<T = any, P = \"\", DecodeSchema extends { [key: string]: any } = any>\n  extends Layout<DecodeSchema, P> {\n  span: number;\n  decode(b: Buffer, offset?: number): DecodeSchema;\n  layoutFor<AP extends string>(property: AP): Layout<DecodeSchema[AP]>;\n  offsetOf<AP extends string>(property: AP): number;\n}\ninterface StructureConstructor {\n  new <T = any, P = \"\", DecodeSchema extends { [key: string]: any } = any>(): Structure<T, P, DecodeSchema>;\n  new <T = any, P = \"\", DecodeSchema extends { [key: string]: any } = any>(\n    fields: T,\n    property?: P,\n    decodePrefixes?: boolean,\n  ): Structure<T, P, DecodeSchema>;\n}\nexport const Structure = _Structure as unknown as StructureConstructor;\n//#endregion\n\n//#region ------------------- Union -------------------\nexport interface Union<UnionSchema extends { [key: string]: any } = any> extends Layout {\n  registry: object;\n  decode(b: Buffer, offset?: number): Partial<UnionSchema>;\n  addVariant(\n    variant: number,\n    layout: Structure<any, any, Partial<UnionSchema>> | Layout<any, keyof UnionSchema>,\n    property?: string,\n  ): any /* TEMP: code in Layout.js 1809 */;\n}\ninterface UnionConstructor {\n  new <UnionSchema extends { [key: string]: any } = any>(): Union<UnionSchema>;\n  new <UnionSchema extends { [key: string]: any } = any>(\n    discr: Layout<any, any>,\n    defaultLayout: Layout<any, any>,\n    property?: string,\n  ): Union<UnionSchema>;\n}\nexport const Union = _Union as unknown as UnionConstructor;\n//#endregion\n\n//#region ------------------- BitStructure -------------------\nexport type BitStructure<T = unknown /* TEMP */, P = \"\"> = Layout<T, P>;\ninterface BitStructureConstructor {\n  new (...params: any[]): BitStructure;\n}\nexport const BitStructure = _BitStructure as BitStructureConstructor;\n//#endregion\n\n//#region ------------------- UInt -------------------\nexport type UInt<T = any, P = \"\"> = Layout<T, P>;\ninterface UIntConstructor {\n  new <T, P>(span?: T, property?: P): UInt<T, P>;\n}\nexport const UInt = _UInt as UIntConstructor;\n//#endregion\n\n//#region ------------------- Blob -------------------\nexport type Blob<P extends string = \"\"> = Layout<Buffer, P>;\ninterface BlobConstructor {\n  new (...params: ConstructorParameters<LayoutConstructor>): Blob;\n}\nexport const Blob = _Blob as unknown as BlobConstructor;\n//#endregion\n\nexport const greedy = _greedy as <P extends string = \"\">(elementSpan?: number, property?: P) => Layout<number, P>;\nexport const u8 = _u8 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const u16 = _u16 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const u24 = _u24 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const u32 = _u32 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const u40 = _u40 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const u48 = _u48 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const nu64 = _nu64 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const u16be = _u16be as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const u24be = _u24be as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const u32be = _u32be as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const u40be = _u40be as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const u48be = _u48be as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const nu64be = _nu64be as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const s8 = _s8 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const s16 = _s16 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const s24 = _s24 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const s32 = _s32 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const s40 = _s40 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const s48 = _s48 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const ns64 = _ns64 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const s16be = _s16be as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const s24be = _s24be as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const s32be = _s32be as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const s40be = _s40be as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const s48be = _s48be as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const ns64be = _ns64be as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const f32 = _f32 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const f32be = _f32be as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const f64 = _f64 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const f64be = _f64be as <P extends string = \"\">(property?: P) => Layout<number, P>;\n\nexport const struct = _struct as <T, P extends string = \"\">(\n  fields: T,\n  property?: P,\n  decodePrefixes?: boolean,\n) => T extends Layout<infer Value, infer Property>[]\n  ? Structure<\n      Value,\n      P,\n      {\n        [K in Exclude<Extract<Property, string>, \"\">]: Extract<T[number], Layout<any, K>> extends Layout<infer V, any>\n          ? V\n          : any;\n      }\n    >\n  : any;\n\nexport const seq = _seq as unknown as <T, P>(\n  elementLayout: Layout<T, string>,\n  count: number | Layout<number, string>,\n  property?: P,\n) => Layout<T[]>;\nexport const union = _union as <UnionSchema extends { [key: string]: any } = any>(\n  discr: Layout<any, any>,\n  defaultLayout?: any,\n  property?: string,\n) => Union<UnionSchema>;\nexport const unionLayoutDiscriminator = _unionLayoutDiscriminator as <P extends string = \"\">(\n  layout: Layout<any, P>,\n  property?: P,\n) => any;\nexport const blob = _blob as unknown as <P extends string = \"\">(\n  length: number | Layout<number, P>,\n  property?: P,\n) => Blob<P>;\nexport const cstr = _cstr as <P extends string = \"\">(property?: P) => Layout<string, P>;\nexport const utf8 = _utf8 as <P extends string = \"\">(maxSpan: number, property?: P) => Layout<string, P>;\nexport const bits = _bits as unknown as <T, P extends string = \"\">(\n  word: Layout<T>,\n  msb?: boolean,\n  property?: P,\n) => BitStructure<T, P>; // TODO: not quite sure\nexport const offset = _offset as unknown as <T, P extends string = \"\">(\n  layout: Layout<T, P>,\n  offset?: number,\n  property?: P,\n) => Layout<T, P>;\n\nexport type GetStructureSchema<T extends Structure> = T extends Structure<any, any, infer S> ? S : unknown;\n","import { publicKey, struct, u32, u64, u8 } from \"../../marshmallow\";\n\nexport const splAccountLayout = struct([\n  publicKey(\"mint\"),\n  publicKey(\"owner\"),\n  u64(\"amount\"),\n  u32(\"delegateOption\"),\n  publicKey(\"delegate\"),\n  u8(\"state\"),\n  u32(\"isNativeOption\"),\n  u64(\"isNative\"),\n  u64(\"delegatedAmount\"),\n  u32(\"closeAuthorityOption\"),\n  publicKey(\"closeAuthority\"),\n]);\n","import { PublicKey } from \"@solana/web3.js\";\n\nimport { ApiV3Token } from \"../../api/type\";\nimport { createLogger } from \"../../common/logger\";\nimport { FARM_PROGRAM_ID_V3, FARM_PROGRAM_ID_V4, FARM_PROGRAM_ID_V5, FARM_PROGRAM_ID_V6 } from \"../../common/programId\";\n\nimport {\n  FarmLedgerLayout,\n  farmLedgerLayoutV3_2,\n  farmLedgerLayoutV5_2,\n  farmLedgerLayoutV6_1,\n  FarmStateLayout,\n  farmStateV3Layout,\n  farmStateV5Layout,\n  farmStateV6Layout,\n} from \"./layout\";\n\nconst logger = createLogger(\"Raydium_farm_config\");\n\nexport type FarmVersion = 3 | 4 | 5 | 6;\nexport const FARM_LOCK_MINT = new PublicKey(\"4k3Dyjzvzp8eMZWUXbBCjEvwSkkk59S5iCNLY3QrkX6R\");\nexport const FARM_LOCK_VAULT = new PublicKey(\"FrspKwj8i3pNmKwXreTveC4fu7KL5ZbGeXdZBe2XViu1\");\n\n/* ================= index ================= */\n// version => farm state layout\nexport const FARM_VERSION_TO_STATE_LAYOUT: {\n  [version in FarmVersion]?: FarmStateLayout;\n} = {\n  3: farmStateV3Layout,\n  5: farmStateV5Layout,\n  6: farmStateV6Layout,\n};\n\n// version => farm ledger layout\nexport const FARM_VERSION_TO_LEDGER_LAYOUT: {\n  [version in FarmVersion]?: FarmLedgerLayout;\n} = {\n  3: farmLedgerLayoutV3_2,\n  5: farmLedgerLayoutV5_2,\n  6: farmLedgerLayoutV6_1,\n};\n\nexport const isValidFarmVersion = (version: number): boolean => [3, 4, 5, 6].indexOf(version) !== -1;\n\nexport const validateFarmRewards = (params: {\n  version: number;\n  rewardInfos: { mint: ApiV3Token }[];\n  rewardTokenAccountsPublicKeys: PublicKey[];\n}): (() => string | undefined) => {\n  const { version, rewardInfos, rewardTokenAccountsPublicKeys } = params;\n\n  const infoMsg = `rewardInfo:${JSON.stringify(rewardInfos)}, rewardAccount:${JSON.stringify(\n    rewardTokenAccountsPublicKeys,\n  )}`;\n\n  const validator = {\n    3: (): string | undefined => {\n      if (rewardInfos.length !== 1 || rewardTokenAccountsPublicKeys.length !== 1) {\n        return `rewardInfos or rewardTokenAccounts lengths not equal 1: ${infoMsg}`;\n      }\n    },\n    5: (): string | undefined => {\n      if (rewardInfos.length !== rewardTokenAccountsPublicKeys.length) {\n        return `rewardInfos and rewardTokenAccounts lengths not equal: ${infoMsg}`;\n      }\n    },\n    6: (): string | undefined => {\n      if (!rewardTokenAccountsPublicKeys.length || rewardInfos.length !== rewardTokenAccountsPublicKeys.length) {\n        return `no rewardTokenAccounts or rewardInfos and rewardTokenAccounts lengths not equal: ${infoMsg}`;\n      }\n    },\n  };\n\n  return validator[version]?.();\n};\n\nexport const poolTypeV6 = { \"Standard SPL\": 0, \"Option tokens\": 1 };\n\nexport const FARM_PROGRAM_TO_VERSION: Record<string, 3 | 4 | 5 | 6> = {\n  [FARM_PROGRAM_ID_V3.toString()]: 3,\n  [FARM_PROGRAM_ID_V4.toString()]: 4,\n  [FARM_PROGRAM_ID_V5.toString()]: 5,\n  [FARM_PROGRAM_ID_V6.toString()]: 6,\n};\n","import { PublicKey } from \"@solana/web3.js\";\nimport BN from \"bn.js\";\n\nimport {\n  blob,\n  bool,\n  GetLayoutSchemaFromStructure,\n  GetStructureFromLayoutSchema,\n  GetStructureSchema,\n  i64,\n  i8,\n  publicKey,\n  seq,\n  struct,\n  u128,\n  u64,\n  u8,\n} from \"../../marshmallow\";\n\nimport { poolTypeV6 } from \"./config\";\nimport { RewardType } from \"./type\";\n\nexport const associatedLedgerAccountLayout = struct([u8(\"instruction\")]);\nexport const withdrawRewardLayout = struct([u8(\"instruction\")]);\n\nconst farmStateRewardInfoV6Layout = struct([\n  u64(\"rewardState\"),\n  u64(\"rewardOpenTime\"),\n  u64(\"rewardEndTime\"),\n  u64(\"rewardLastUpdateTime\"),\n  u64(\"totalReward\"),\n  u64(\"totalRewardEmissioned\"),\n  u64(\"rewardClaimed\"),\n  u64(\"rewardPerSecond\"),\n  u128(\"accRewardPerShare\"),\n  publicKey(\"rewardVault\"),\n  publicKey(\"rewardMint\"),\n  publicKey(\"rewardSender\"),\n  u64(\"rewardType\"),\n  seq(u64(), 15, \"padding\"),\n]);\n\nexport const realFarmStateV3Layout = struct([\n  u64(\"state\"),\n  u64(\"nonce\"),\n  publicKey(\"lpVault\"),\n  publicKey(\"rewardVault\"),\n  publicKey(),\n  publicKey(),\n  u64(),\n  u64(),\n  u64(\"totalReward\"),\n  u128(\"perShareReward\"),\n  u64(\"lastSlot\"),\n  u64(\"perSlotReward\"),\n]);\n\nexport const realFarmStateV5Layout = struct([\n  u64(\"state\"),\n  u64(\"nonce\"),\n  publicKey(\"lpVault\"),\n  publicKey(\"rewardVaultA\"),\n  u64(\"totalRewardA\"),\n  u128(\"perShareRewardA\"),\n  u64(\"perSlotRewardA\"),\n  u8(\"option\"),\n  publicKey(\"rewardVaultB\"),\n  blob(7),\n  u64(\"totalRewardB\"),\n  u128(\"perShareRewardB\"),\n  u64(\"perSlotRewardB\"),\n  u64(\"lastSlot\"),\n  publicKey(),\n]);\n\nexport const realFarmV6Layout = struct([\n  u64(),\n  u64(\"state\"),\n  u64(\"nonce\"),\n  u64(\"validRewardTokenNum\"),\n  u128(\"rewardMultiplier\"),\n  u64(\"rewardPeriodMax\"),\n  u64(\"rewardPeriodMin\"),\n  u64(\"rewardPeriodExtend\"),\n  publicKey(\"lpMint\"),\n  publicKey(\"lpVault\"),\n  seq(farmStateRewardInfoV6Layout, 5, \"rewardInfos\"),\n  publicKey(\"creator\"),\n  publicKey(),\n  seq(u64(), 32, \"padding\"),\n]);\n\nexport const farmStateV3Layout = new Proxy(\n  realFarmStateV3Layout as GetStructureFromLayoutSchema<\n    {\n      version: 3;\n      rewardInfos: {\n        rewardVault: PublicKey;\n        totalReward: BN;\n        perSlotReward: BN;\n        perShareReward: BN;\n      }[];\n    } & GetLayoutSchemaFromStructure<typeof realFarmStateV3Layout>\n  >,\n  {\n    get(target, p, receiver): any {\n      if (p === \"decode\")\n        return (...decodeParams: Parameters<typeof target[\"decode\"]>) => {\n          const originalResult = target.decode(...decodeParams);\n          return {\n            ...originalResult,\n            version: 3,\n            rewardInfos: [\n              {\n                rewardVault: originalResult.rewardVault,\n                totalReward: originalResult.totalReward,\n                perSlotReward: originalResult.perSlotReward,\n                perShareReward: originalResult.perShareReward,\n              },\n            ],\n          };\n        };\n      else return Reflect.get(target, p, receiver);\n    },\n  },\n);\n\nexport const farmStateV5Layout = new Proxy(\n  realFarmStateV5Layout as GetStructureFromLayoutSchema<\n    {\n      version: 5;\n      rewardInfos: {\n        rewardVault: PublicKey;\n        totalReward: BN;\n        perSlotReward: BN;\n        perShareReward: BN;\n      }[];\n    } & GetLayoutSchemaFromStructure<typeof realFarmStateV5Layout>\n  >,\n  {\n    get(target, p, receiver): any {\n      if (p === \"decode\")\n        return (...decodeParams: Parameters<typeof target[\"decode\"]>) => {\n          const originalResult = target.decode(...decodeParams);\n          return {\n            ...originalResult,\n            version: 5,\n            rewardInfos: [\n              {\n                rewardVault: originalResult.rewardVaultA,\n                totalReward: originalResult.totalRewardA,\n                perSlotReward: originalResult.perSlotRewardA,\n                perShareReward: originalResult.perShareRewardA,\n              },\n              {\n                rewardVault: originalResult.rewardVaultB,\n                totalReward: originalResult.totalRewardB,\n                perSlotReward: originalResult.perSlotRewardB,\n                perShareReward: originalResult.perShareRewardB,\n              },\n            ],\n          };\n        };\n      else return Reflect.get(target, p, receiver);\n    },\n  },\n);\n\nexport const farmStateV6Layout = new Proxy(\n  realFarmV6Layout as GetStructureFromLayoutSchema<\n    {\n      version: 6;\n      rewardInfos: {\n        rewardState: BN;\n        rewardOpenTime: BN;\n        rewardEndTime: BN;\n        rewardLastUpdateTime: BN;\n        totalReward: BN;\n        totalRewardEmissioned: BN;\n        rewardClaimed: BN;\n        rewardPerSecond: BN;\n        accRewardPerShare: BN;\n        rewardVault: PublicKey;\n        rewardMint: PublicKey;\n        rewardSender: PublicKey;\n        rewardType: RewardType;\n      }[];\n    } & GetLayoutSchemaFromStructure<typeof realFarmV6Layout>\n  >,\n  {\n    get(target, p, receiver): any {\n      if (p === \"decode\")\n        return (...decodeParams: Parameters<typeof target[\"decode\"]>) => {\n          const originalResult = target.decode(...decodeParams);\n          return {\n            ...originalResult,\n            version: 6,\n            rewardInfos: originalResult.rewardInfos.map((item) => ({\n              ...item,\n              rewardType: (Object.entries(poolTypeV6).find((i) => String(i[1]) === item.rewardType.toString()) ?? [\n                \"Standard SPL\",\n              ])[0],\n            })),\n          };\n        };\n      else return Reflect.get(target, p, receiver);\n    },\n  },\n);\n\nexport const farmRewardTimeInfoLayout = struct([\n  u64(\"isSet\"),\n  u64(\"rewardPerSecond\"),\n  u64(\"rewardOpenTime\"),\n  u64(\"rewardEndTime\"),\n  u64(\"rewardType\"),\n]);\n\nexport const farmRewardLayout = struct([\n  u8(\"instruction\"),\n  u64(\"nonce\"),\n  seq(farmRewardTimeInfoLayout, 5, \"rewardTimeInfo\"),\n]);\n\nexport const farmRewardRestartLayout = struct([\n  u8(\"instruction\"),\n  u64(\"rewardReopenTime\"),\n  u64(\"rewardEndTime\"),\n  u64(\"rewardPerSecond\"),\n]);\n\nexport const farmAddRewardLayout = struct([\n  u8(\"instruction\"),\n  u64(\"isSet\"),\n  u64(\"rewardPerSecond\"),\n  u64(\"rewardOpenTime\"),\n  u64(\"rewardEndTime\"),\n  u64(\"rewardType\"),\n]);\n\nexport type FarmStateLayoutV3 = typeof farmStateV3Layout;\nexport type FarmStateLayoutV5 = typeof farmStateV5Layout;\nexport type FarmStateLayoutV6 = typeof farmStateV6Layout;\n\nexport type FarmStateV3 = GetStructureSchema<FarmStateLayoutV3>;\nexport type FarmStateV5 = GetStructureSchema<FarmStateLayoutV5>;\nexport type FarmStateV6 = GetStructureSchema<FarmStateLayoutV6>;\n\nexport type FarmState = FarmStateV3 | FarmStateV5 | FarmStateV6;\n// farmStateLayoutV3\nexport type FarmStateLayout = FarmStateLayoutV3 | FarmStateLayoutV5 | FarmStateLayoutV6;\n\n/* ================= ledger layouts ================= */\nexport const farmLedgerLayoutV3_1 = struct([\n  u64(\"state\"),\n  publicKey(\"id\"),\n  publicKey(\"owner\"),\n  u64(\"deposited\"),\n  seq(u64(), 1, \"rewardDebts\"),\n]);\n\nexport const farmLedgerLayoutV3_2 = struct([\n  u64(\"state\"),\n  publicKey(\"id\"),\n  publicKey(\"owner\"),\n  u64(\"deposited\"),\n  seq(u128(), 1, \"rewardDebts\"),\n  u64(\"\"),\n  u64(\"voteLockedBalance\"),\n  seq(u64(), 15),\n]);\n\nexport const farmLedgerLayoutV5_1 = struct([\n  u64(\"state\"),\n  publicKey(\"id\"),\n  publicKey(\"owner\"),\n  u64(\"deposited\"),\n  seq(u64(), 2, \"rewardDebts\"),\n]);\n\nexport const farmLedgerLayoutV5_2 = struct([\n  u64(\"state\"),\n  publicKey(\"id\"),\n  publicKey(\"owner\"),\n  u64(\"deposited\"),\n  seq(u128(), 2, \"rewardDebts\"),\n  seq(u64(), 17),\n]);\n\nexport const farmLedgerLayoutV6_1 = struct([\n  u64(),\n  u64(\"state\"),\n  publicKey(\"id\"),\n  publicKey(\"owner\"),\n  u64(\"deposited\"),\n  seq(u128(), 5, \"rewardDebts\"),\n  seq(u64(), 16),\n]);\n\nexport type FarmLedgerLayoutV3_1 = typeof farmLedgerLayoutV3_1;\nexport type FarmLedgerLayoutV3_2 = typeof farmLedgerLayoutV3_2;\nexport type FarmLedgerLayoutV5_1 = typeof farmLedgerLayoutV5_1;\nexport type FarmLedgerLayoutV5_2 = typeof farmLedgerLayoutV5_2;\nexport type FarmLedgerLayoutV6_1 = typeof farmLedgerLayoutV6_1;\nexport type FarmLedgerLayout =\n  | FarmLedgerLayoutV3_1\n  | FarmLedgerLayoutV3_2\n  | FarmLedgerLayoutV5_1\n  | FarmLedgerLayoutV5_2\n  | FarmLedgerLayoutV6_1;\n\nexport type FarmLedgerV3_1 = GetStructureSchema<FarmLedgerLayoutV3_1>;\nexport type FarmLedgerV3_2 = GetStructureSchema<FarmLedgerLayoutV3_2>;\nexport type FarmLedgerV5_1 = GetStructureSchema<FarmLedgerLayoutV5_1>;\nexport type FarmLedgerV5_2 = GetStructureSchema<FarmLedgerLayoutV5_2>;\nexport type FarmLedgerV6_1 = GetStructureSchema<FarmLedgerLayoutV6_1>;\nexport type FarmLedger = FarmLedgerV3_1 | FarmLedgerV3_2 | FarmLedgerV5_1 | FarmLedgerV5_2 | FarmLedgerV6_1;\n\nexport const dwLayout = struct([u8(\"instruction\"), u64(\"amount\")]);\n\nexport const VoterVotingMintConfig = struct([\n  publicKey(\"mint\"),\n  publicKey(\"grantAuthority\"),\n  u64(\"baselineVoteWeightScaledFactor\"),\n  u64(\"maxExtraLockupVoteWeightScaledFactor\"),\n  u64(\"lockupSaturationSecs\"),\n\n  i8(\"digitShift\"), // TODO\n  seq(u8(), 7, \"reserved1\"),\n  seq(u64(), 7, \"reserved2\"),\n]);\n\nexport const VoterRegistrar = struct([\n  blob(8),\n  publicKey(\"governanceProgramId\"),\n  publicKey(\"realm\"),\n  publicKey(\"realmGoverningTokenMint\"),\n  publicKey(\"realmAuthority\"),\n\n  seq(u8(), 32, \"reserved1\"),\n  seq(VoterVotingMintConfig, 4, \"votingMints\"),\n\n  i64(\"timeOffset\"),\n  u8(\"bump\"),\n  seq(u8(), 7, \"reserved2\"),\n  seq(u64(), 11, \"reserved3\"),\n]);\n\nexport const VoterLockup = struct([i64(\"startTime\"), i64(\"endTime\"), u8(\"kind\"), seq(u8(), 15, \"reserved\")]);\n\nexport const VoterDepositEntry = struct([\n  seq(VoterLockup, 1, \"lockup\"),\n  u64(\"amountDeposited_native\"),\n  u64(\"amountInitiallyLockedNative\"),\n  bool(\"isUsed\"),\n  bool(\"allowClawback\"),\n  u8(\"votingMintConfigIdx\"),\n  seq(u8(), 29, \"reserved\"),\n]);\n\nexport const Voter = struct([\n  blob(8),\n  publicKey(\"voterAuthority\"),\n  publicKey(\"registrar\"),\n\n  seq(VoterDepositEntry, 32, \"deposits\"),\n\n  u8(\"voterBump\"),\n  u8(\"voterWweightRecordBump\"),\n  seq(u8(), 94, \"reserved\"),\n]);\n"],"mappings":"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","names":["BN","PublicKey","get","set","Logger","params","logLevel","level","props","msg","arg","moduleLoggers","moduleLevels","createLogger","moduleName","logger","get","set","MINT_SIZE","TOKEN_PROGRAM_ID","getTransferFeeConfig","unpackMint","logger","createLogger","getMultipleAccountsInfo","connection","publicKeys","config","batchRequest","commitment","chunkCount","chunkedKeys","chunkArray","results","batch","keys","args","key","_batch","i","unsafeRes","accountInfo","data","executable","lamports","owner","rentEpoch","PublicKey","error","getMultipleAccountsInfoWithCustomFlags","publicKeysWithCustomFlag","multipleAccountsInfo","idx","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","numerator","denominator","BN","parseBigNumberish","other","otherParsed","significantDigits","format","rounding","quotient","decimalPlaces","logger","createLogger","Big","formatter_default","_Big","splitNumber","num","decimals","integral","fractional","splited","TokenAmount","Fraction","token","amount","isRaw","name","parsedAmount","BN","multiplier","BN_TEN","parseBigNumberish","integralAmount","fractionalAmount","other","significantDigits","format","rounding","decimalPlaces","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","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","Token","_Currency","decimals","symbol","name","other","Currency","SOL_INFO","BN","_100_PERCENT","Fraction","BN","Percent","significantDigits","format","rounding","decimalPlaces","logger","createLogger","Price","Fraction","params","baseToken","quoteToken","numerator","denominator","tenExponential","other","fraction","significantDigits","format","rounding","decimalPlaces","PublicKey","BN","notInnerObject","v","Token","TokenAmount","PublicKey","Fraction","BN","Price","Percent","o","jsonInfo2PoolKeys","jsonInfo","tryParsePublicKey","k","BN_ZERO","BN","BN_ONE","BN_TWO","BN_THREE","BN_FIVE","BN_TEN","BN_100","BN_1000","BN_10000","tenExponential","shift","parseBigNumberish","isNumber","val","isDateBefore","timestampA","timestampB","options","realTimestampB","isNumber","isDateAfter","chunkArray","arr","chunkSize","cache","tmp","PublicKey","TOKEN_PROGRAM_ID","ComputeBudgetProgram","Keypair","PublicKey","Transaction","TransactionMessage","VersionedTransaction","TOKEN_PROGRAM_ID","logger","createLogger","findProgramAddress","seeds","programId","publicKey","nonce","PublicKey","PublicKey","FARM_PROGRAM_ID_V3","FARM_PROGRAM_ID_V4","FARM_PROGRAM_ID_V5","FARM_PROGRAM_ID_V6","UTIL1216","OPEN_BOOK_PROGRAM","SERUM_PROGRAM_ID_V3","AMM_V4","AMM_STABLE","LIQUIDITY_POOL_PROGRAM_ID_V5_MODEL","CLMM_PROGRAM_ID","CLMM_LOCK_PROGRAM_ID","CLMM_LOCK_AUTH_ID","Router","FEE_DESTINATION_ID","IDO_PROGRAM_ID_V1","IDO_PROGRAM_ID_V2","IDO_PROGRAM_ID_V3","IDO_PROGRAM_ID_V4","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","LOCK_CPMM_PROGRAM","DEV_LOCK_CPMM_PROGRAM","LOCK_CPMM_AUTH","DEV_LOCK_CPMM_AUTH","LAUNCHPAD_PROGRAM","LAUNCHPAD_AUTH","DEV_LAUNCHPAD_PROGRAM","DEV_LAUNCHPAD_AUTH","DEVNET_PROGRAM_ID","PublicKey","DEV_CREATE_CPMM_POOL_PROGRAM","DEV_CREATE_CPMM_POOL_AUTH","DEV_CREATE_CPMM_POOL_FEE_ACC","DEV_LOCK_CPMM_PROGRAM","DEV_LOCK_CPMM_AUTH","DEV_LAUNCHPAD_PROGRAM","DEV_LAUNCHPAD_AUTH","BN","PublicKey","AddressLookupTableAccount","LOOKUP_TABLE_CACHE","AddressLookupTableAccount","PublicKey","PublicKey","sendAndConfirmTransaction","SystemProgram","Transaction","TransactionMessage","VersionedTransaction","axios","BN","FEE_RATE_DENOMINATOR_VALUE","PublicKey","BN","isBN","_bits","_BitStructure","_blob","_Blob","_cstr","_f32","_f32be","_f64","_f64be","_greedy","_Layout","_ns64","_ns64be","_nu64","_nu64be","_offset","_s16","_s16be","_s24","_s24be","_s32","_s32be","_s40","_s40be","_s48","_s48be","_s8","_seq","_struct","_Structure","_u16","_u16be","_u24","_u24be","_u32","_u32be","_u40","_u40be","_u48","_u48be","_u8","_UInt","_union","_Union","_unionLayoutDiscriminator","_utf8","Layout","Structure","UInt","_UInt","u8","_u8","seq","_seq","blob","_blob","BNLayout","Layout","span","signed","property","blob","b","offset","num","BN","src","u8","property","UInt","u32","u64","BNLayout","u128","i8","i64","WrappedLayout","Layout","layout","decoder","encoder","property","b","offset","src","publicKey","blob","PublicKey","key","bool","property","WrappedLayout","u8","decodeBool","encodeBool","value","Structure","b","offset","struct","fields","property","decodePrefixes","seq","elementLayout","count","property","parsedCount","superCount","isBN","target","countProperty","value","splAccountLayout","struct","publicKey","u64","u32","u8","PublicKey","associatedLedgerAccountLayout","struct","u8","withdrawRewardLayout","farmStateRewardInfoV6Layout","u64","u128","publicKey","seq","realFarmStateV3Layout","realFarmStateV5Layout","blob","realFarmV6Layout","farmStateV3Layout","target","p","receiver","decodeParams","originalResult","farmStateV5Layout","farmStateV6Layout","item","_a","poolTypeV6","i","farmRewardTimeInfoLayout","farmRewardLayout","farmRewardRestartLayout","farmAddRewardLayout","farmLedgerLayoutV3_1","farmLedgerLayoutV3_2","farmLedgerLayoutV5_1","farmLedgerLayoutV5_2","farmLedgerLayoutV6_1","dwLayout","VoterVotingMintConfig","i8","VoterRegistrar","i64","VoterLockup","VoterDepositEntry","bool","Voter","logger","createLogger","FARM_LOCK_MINT","PublicKey","FARM_LOCK_VAULT","FARM_VERSION_TO_STATE_LAYOUT","farmStateV3Layout","farmStateV5Layout","farmStateV6Layout","FARM_VERSION_TO_LEDGER_LAYOUT","farmLedgerLayoutV3_2","farmLedgerLayoutV5_2","farmLedgerLayoutV6_1","poolTypeV6","FARM_PROGRAM_TO_VERSION","FARM_PROGRAM_ID_V3","FARM_PROGRAM_ID_V4","FARM_PROGRAM_ID_V5","FARM_PROGRAM_ID_V6","logger","createLogger","getAssociatedLedgerPoolAccount","programId","poolId","mint","type","publicKey","findProgramAddress","getAssociatedLedgerAccount","owner","version","getAssociatedAuthority","farmRewardInfoToConfig","data","BN","parseBigNumberish","poolTypeV6","calFarmRewardAmount","getFarmLedgerLayout","ledgerLayout","FARM_VERSION_TO_LEDGER_LAYOUT","getFarmStateLayout","stateLayout","FARM_VERSION_TO_STATE_LAYOUT","updateFarmPoolInfo","poolInfo","lpVault","slot","chainTime","spread","itemRewardInfo","reward","updateTime","leftReward","fetchMultipleFarmInfoAndUpdate","connection","farmPools","config","hasNotV6Pool","hasV6Pool","tenBN","publicKeys","pool","jsonInfo2PoolKeys","poolsInfo","accountsInfo","getMultipleAccountsInfoWithCustomFlags","pubkey","key","accountInfo","_poolId","splAccountLayout","legerLayout","state","ledger","multiplier","pendingRewards","rewardInfo","index","rewardDebt","judgeFarmType","info","currentTime","rewardInfos","rewardOpenTime","isDateBefore","rewardEndTime","isDateAfter","perSlotRewards","perSlotReward","getDepositEntryIndex","registrar","voter","voterMint","registrarAccountData","votingMintConfigIndex","VoterRegistrar","i","voterAccountData","depositEntryIndex","Voter"]}