{"version":3,"sources":["../../src/raydium/raydium.ts","../../src/api/api.ts","../../src/common/logger.ts","../../src/common/utility.ts","../../src/module/amount.ts","../../src/common/bignumber.ts","../../node_modules/decimal.js/decimal.mjs","../../src/module/token.ts","../../src/common/pubKey.ts","../../src/raydium/token/constant.ts","../../src/module/fraction.ts","../../src/module/formatter.ts","../../src/module/price.ts","../../src/module/currency.ts","../../src/module/percent.ts","../../src/common/txTool/txTool.ts","../../src/common/txTool/txType.ts","../../src/common/txTool/txUtils.ts","../../src/common/txTool/lookupTable.ts","../../src/common/accountInfo.ts","../../src/common/owner.ts","../../src/common/lodash.ts","../../src/common/date.ts","../../src/common/programId.ts","../../src/common/pda.ts","../../src/common/transfer.ts","../../src/api/url.ts","../../src/api/utils.ts","../../src/common/error.ts","../../src/raydium/account/account.ts","../../src/raydium/moduleBase.ts","../../src/raydium/account/instruction.ts","../../src/raydium/account/util.ts","../../src/marshmallow/index.ts","../../src/marshmallow/buffer-layout.ts","../../src/raydium/account/layout.ts","../../node_modules/@noble/hashes/src/_assert.ts","../../node_modules/@noble/hashes/src/utils.ts","../../node_modules/@noble/hashes/src/_md.ts","../../node_modules/@noble/hashes/src/sha256.ts","../../src/raydium/farm/farm.ts","../../src/raydium/farm/config.ts","../../src/raydium/farm/layout.ts","../../src/raydium/farm/instruction.ts","../../src/raydium/farm/pda.ts","../../src/raydium/farm/util.ts","../../src/raydium/liquidity/liquidity.ts","../../src/raydium/token/layout.ts","../../src/raydium/token/utils.ts","../../src/raydium/liquidity/instruction.ts","../../src/raydium/liquidity/layout.ts","../../src/raydium/liquidity/stable.ts","../../src/raydium/clmm/instrument.ts","../../src/raydium/clmm/utils/tick.ts","../../src/raydium/clmm/utils/util.ts","../../src/raydium/clmm/utils/pda.ts","../../src/raydium/clmm/utils/constants.ts","../../src/raydium/clmm/utils/tickQuery.ts","../../src/raydium/clmm/utils/math.ts","../../src/raydium/clmm/utils/pool.ts","../../src/raydium/clmm/utils/tickarrayBitmap.ts","../../src/raydium/clmm/utils/position.ts","../../src/raydium/clmm/layout.ts","../../src/raydium/liquidity/utils.ts","../../src/raydium/liquidity/serum.ts","../../src/raydium/liquidity/constant.ts","../../src/raydium/clmm/clmm.ts","../../src/raydium/cpmm/cpmm.ts","../../src/raydium/cpmm/curve/fee.ts","../../src/raydium/cpmm/curve/constantProduct.ts","../../src/raydium/cpmm/curve/calculator.ts","../../src/raydium/cpmm/pda.ts","../../src/raydium/cpmm/instruction.ts","../../src/raydium/cpmm/layout.ts","../../src/raydium/tradeV2/trade.ts","../../src/raydium/tradeV2/instrument.ts","../../src/raydium/serum/id.ts","../../src/raydium/serum/layout.ts","../../src/raydium/serum/serum.ts","../../src/raydium/utils1216/utils1216.ts","../../src/raydium/marketV2/createMarket.ts","../../src/raydium/marketV2/instrument.ts","../../src/raydium/marketV2/layout.ts","../../src/raydium/ido/ido.ts","../../src/raydium/ido/instruction.ts","../../src/raydium/ido/layout.ts","../../src/raydium/token/token.ts","../../src/raydium/type.ts"],"sourcesContent":["import { Connection, Keypair, PublicKey, EpochInfo, Commitment } from \"@solana/web3.js\";\nimport { merge } from \"lodash\";\n\nimport { Api, API_URL_CONFIG, ApiV3TokenRes, ApiV3Token, JupTokenType, AvailabilityCheckAPI3 } from \"../api\";\nimport { EMPTY_CONNECTION, EMPTY_OWNER } from \"../common/error\";\nimport { createLogger, Logger } from \"../common/logger\";\nimport { Owner } from \"../common/owner\";\nimport { Cluster } from \"../solana\";\n\nimport Account, { TokenAccountDataProp } from \"./account/account\";\nimport Farm from \"./farm/farm\";\nimport Liquidity from \"./liquidity/liquidity\";\nimport { Clmm } from \"./clmm\";\nimport Cpmm from \"./cpmm/cpmm\";\nimport TradeV2 from \"./tradeV2/trade\";\nimport Utils1216 from \"./utils1216\";\nimport MarketV2 from \"./marketV2\";\nimport Ido from \"./ido\";\n\nimport TokenModule from \"./token/token\";\nimport { SignAllTransactions } from \"./type\";\n\nexport interface RaydiumLoadParams extends TokenAccountDataProp, Omit<RaydiumApiBatchRequestParams, \"api\"> {\n  /* ================= solana ================= */\n  // solana web3 connection\n  connection: Connection;\n  // solana cluster/network/env\n  cluster?: Cluster;\n  // user public key\n  owner?: PublicKey | Keypair;\n  /* ================= api ================= */\n  // api request interval in ms, -1 means never request again, 0 means always use fresh data, default is 5 mins (5 * 60 * 1000)\n  apiRequestInterval?: number;\n  // api request timeout in ms, default is 10 secs (10 * 1000)\n  apiRequestTimeout?: number;\n  apiCacheTime?: number;\n  signAllTransactions?: SignAllTransactions;\n  urlConfigs?: API_URL_CONFIG;\n  logRequests?: boolean;\n  logCount?: number;\n  jupTokenType?: JupTokenType;\n  disableFeatureCheck?: boolean;\n  disableLoadToken?: boolean;\n  blockhashCommitment?: Commitment;\n}\n\nexport interface RaydiumApiBatchRequestParams {\n  api: Api;\n  defaultChainTimeOffset?: number;\n  defaultChainTime?: number;\n}\n\nexport type RaydiumConstructorParams = Required<RaydiumLoadParams> & RaydiumApiBatchRequestParams;\n\ninterface DataBase<T> {\n  fetched: number;\n  data: T;\n  extInfo?: Record<string, any>;\n}\ninterface ApiData {\n  tokens?: DataBase<ApiV3Token[]>;\n\n  // v3 data\n  tokenList?: DataBase<ApiV3TokenRes>;\n  jupTokenList?: {\n    [JupTokenType.ALL]?: DataBase<ApiV3Token[]>;\n    [JupTokenType.Strict]?: DataBase<ApiV3Token[]>;\n  };\n}\n\nexport class Raydium {\n  public cluster: Cluster;\n  public farm: Farm;\n  public account: Account;\n  public liquidity: Liquidity;\n  public clmm: Clmm;\n  public cpmm: Cpmm;\n  public tradeV2: TradeV2;\n  public utils1216: Utils1216;\n  public marketV2: MarketV2;\n  public ido: Ido;\n  public token: TokenModule;\n  public rawBalances: Map<string, string> = new Map();\n  public apiData: ApiData;\n  public availability: Partial<AvailabilityCheckAPI3>;\n  public blockhashCommitment: Commitment;\n\n  private _connection: Connection;\n  private _owner: Owner | undefined;\n  public api: Api;\n  private _apiCacheTime: number;\n  private _signAllTransactions?: SignAllTransactions;\n  private logger: Logger;\n  private _chainTime?: {\n    fetched: number;\n    value: {\n      chainTime: number;\n      offset: number;\n    };\n  };\n  private _epochInfo?: {\n    fetched: number;\n    value: EpochInfo;\n  };\n\n  constructor(config: RaydiumConstructorParams) {\n    const {\n      connection,\n      cluster,\n      owner,\n      api,\n      defaultChainTime,\n      defaultChainTimeOffset,\n      apiCacheTime,\n      blockhashCommitment = \"confirmed\",\n    } = config;\n\n    this._connection = connection;\n    this.cluster = cluster || \"mainnet\";\n    this._owner = owner ? new Owner(owner) : undefined;\n    this._signAllTransactions = config.signAllTransactions;\n    this.blockhashCommitment = blockhashCommitment;\n\n    this.api = api;\n    this._apiCacheTime = apiCacheTime || 5 * 60 * 1000;\n    this.logger = createLogger(\"Raydium\");\n    this.farm = new Farm({ scope: this, moduleName: \"Raydium_Farm\" });\n    this.account = new Account({\n      scope: this,\n      moduleName: \"Raydium_Account\",\n      tokenAccounts: config.tokenAccounts,\n      tokenAccountRawInfos: config.tokenAccountRawInfos,\n    });\n    this.liquidity = new Liquidity({ scope: this, moduleName: \"Raydium_LiquidityV2\" });\n    this.token = new TokenModule({ scope: this, moduleName: \"Raydium_tokenV2\" });\n    this.tradeV2 = new TradeV2({ scope: this, moduleName: \"Raydium_tradeV2\" });\n    this.clmm = new Clmm({ scope: this, moduleName: \"Raydium_clmm\" });\n    this.cpmm = new Cpmm({ scope: this, moduleName: \"Raydium_cpmm\" });\n    this.utils1216 = new Utils1216({ scope: this, moduleName: \"Raydium_utils1216\" });\n    this.marketV2 = new MarketV2({ scope: this, moduleName: \"Raydium_marketV2\" });\n    this.ido = new Ido({ scope: this, moduleName: \"Raydium_ido\" });\n\n    this.availability = {};\n    const now = new Date().getTime();\n    this.apiData = {};\n\n    if (defaultChainTimeOffset)\n      this._chainTime = {\n        fetched: now,\n        value: {\n          chainTime: defaultChainTime || Date.now() - defaultChainTimeOffset,\n          offset: defaultChainTimeOffset,\n        },\n      };\n  }\n\n  static async load(config: RaydiumLoadParams): Promise<Raydium> {\n    const custom: Required<RaydiumLoadParams> = merge(\n      // default\n      {\n        cluster: \"mainnet\",\n        owner: null,\n        apiRequestInterval: 5 * 60 * 1000,\n        apiRequestTimeout: 10 * 1000,\n      },\n      config,\n    );\n    const { cluster, apiRequestTimeout, logCount, logRequests, urlConfigs } = custom;\n\n    const api = new Api({ cluster, timeout: apiRequestTimeout, urlConfigs, logCount, logRequests });\n    const raydium = new Raydium({\n      ...custom,\n      api,\n    });\n\n    await raydium.fetchAvailabilityStatus(config.disableFeatureCheck ?? true);\n    if (!config.disableLoadToken)\n      await raydium.token.load({\n        type: config.jupTokenType,\n      });\n\n    return raydium;\n  }\n\n  get owner(): Owner | undefined {\n    return this._owner;\n  }\n  get ownerPubKey(): PublicKey {\n    if (!this._owner) throw new Error(EMPTY_OWNER);\n    return this._owner.publicKey;\n  }\n  public setOwner(owner?: PublicKey | Keypair): Raydium {\n    this._owner = owner ? new Owner(owner) : undefined;\n    return this;\n  }\n  get connection(): Connection {\n    if (!this._connection) throw new Error(EMPTY_CONNECTION);\n    return this._connection;\n  }\n  public setConnection(connection: Connection): Raydium {\n    this._connection = connection;\n    return this;\n  }\n  get signAllTransactions(): SignAllTransactions | undefined {\n    return this._signAllTransactions;\n  }\n  public setSignAllTransactions(signAllTransactions?: SignAllTransactions): Raydium {\n    this._signAllTransactions = signAllTransactions;\n    return this;\n  }\n\n  public checkOwner(): void {\n    if (!this.owner) {\n      this.logger.error(EMPTY_OWNER);\n      throw new Error(EMPTY_OWNER);\n    }\n  }\n\n  private isCacheInvalidate(time: number): boolean {\n    return new Date().getTime() - time > this._apiCacheTime;\n  }\n\n  public async fetchChainTime(): Promise<void> {\n    try {\n      const data = await this.api.getChainTimeOffset();\n      this._chainTime = {\n        fetched: Date.now(),\n        value: {\n          chainTime: Date.now() + data.offset * 1000,\n          offset: data.offset * 1000,\n        },\n      };\n    } catch {\n      this._chainTime = undefined;\n    }\n  }\n\n  public async fetchV3TokenList(forceUpdate?: boolean): Promise<ApiV3TokenRes> {\n    if (this.apiData.tokenList && !this.isCacheInvalidate(this.apiData.tokenList.fetched) && !forceUpdate)\n      return this.apiData.tokenList.data;\n    const raydiumList = await this.api.getTokenList();\n    const dataObject = {\n      fetched: Date.now(),\n      data: raydiumList,\n    };\n    this.apiData.tokenList = dataObject;\n\n    return dataObject.data;\n  }\n\n  public async fetchJupTokenList(type: JupTokenType, forceUpdate?: boolean): Promise<ApiV3Token[]> {\n    const prevFetched = this.apiData.jupTokenList?.[type];\n    if (prevFetched && !this.isCacheInvalidate(prevFetched.fetched) && !forceUpdate) return prevFetched.data;\n    const jupList = await this.api.getJupTokenList(type);\n    this.apiData.jupTokenList = {\n      ...this.apiData.jupTokenList,\n      [type]: {\n        fetched: Date.now(),\n        data: jupList,\n      },\n    };\n\n    return this.apiData.jupTokenList[type]!.data;\n  }\n\n  get chainTimeData(): { offset: number; chainTime: number } | undefined {\n    return this._chainTime?.value;\n  }\n\n  public async chainTimeOffset(): Promise<number> {\n    if (this._chainTime && Date.now() - this._chainTime.fetched <= 1000 * 60 * 5) return this._chainTime.value.offset;\n    await this.fetchChainTime();\n    return this._chainTime?.value.offset || 0;\n  }\n\n  public async currentBlockChainTime(): Promise<number> {\n    if (this._chainTime && Date.now() - this._chainTime.fetched <= 1000 * 60 * 5)\n      return this._chainTime.value.chainTime;\n    await this.fetchChainTime();\n    return this._chainTime?.value.chainTime || Date.now();\n  }\n\n  public async fetchEpochInfo(): Promise<EpochInfo> {\n    if (this._epochInfo && Date.now() - this._epochInfo.fetched <= 1000 * 30) return this._epochInfo.value;\n    this._epochInfo = {\n      fetched: Date.now(),\n      value: await this.connection.getEpochInfo(),\n    };\n    return this._epochInfo.value;\n  }\n\n  public async fetchAvailabilityStatus(skipCheck?: boolean): Promise<Partial<AvailabilityCheckAPI3>> {\n    if (skipCheck) return {};\n    try {\n      const data = await this.api.fetchAvailabilityStatus();\n      const isAllDisabled = data.all === false;\n      this.availability = {\n        all: data.all,\n        swap: isAllDisabled ? false : data.swap,\n        createConcentratedPosition: isAllDisabled ? false : data.createConcentratedPosition,\n        addConcentratedPosition: isAllDisabled ? false : data.addConcentratedPosition,\n        addStandardPosition: isAllDisabled ? false : data.addStandardPosition,\n        removeConcentratedPosition: isAllDisabled ? false : data.removeConcentratedPosition,\n        removeStandardPosition: isAllDisabled ? false : data.removeStandardPosition,\n        addFarm: isAllDisabled ? false : data.addFarm,\n        removeFarm: isAllDisabled ? false : data.removeFarm,\n      };\n      return data;\n    } catch {\n      return {};\n    }\n  }\n}\n","import axios, { AxiosInstance } from \"axios\";\n\nimport { createLogger, sleep } from \"../common\";\nimport { Cluster } from \"../solana\";\n\nimport {\n  ApiClmmConfigInfo,\n  ApiV3Token,\n  FetchPoolParams,\n  PoolsApiReturn,\n  ApiV3PoolInfoItem,\n  JupTokenType,\n  PoolKeys,\n  FormatFarmInfoOut,\n  FormatFarmKeyOut,\n  AvailabilityCheckAPI3,\n  PoolFetchType,\n} from \"./type\";\nimport { API_URLS, API_URL_CONFIG } from \"./url\";\nimport { updateReqHistory } from \"./utils\";\nimport { PublicKey } from \"@solana/web3.js\";\nimport { solToWSol } from \"../common\";\n\nconst logger = createLogger(\"Raydium_Api\");\nconst poolKeysCache: Map<string, PoolKeys> = new Map();\n\nexport async function endlessRetry<T>(name: string, call: () => Promise<T>, interval = 1000): Promise<T> {\n  let result: T | undefined;\n\n  while (result == undefined) {\n    try {\n      logger.debug(`Request ${name} through endlessRetry`);\n      result = await call();\n    } catch (err) {\n      logger.error(`Request ${name} failed, retry after ${interval} ms`, err);\n      await sleep(interval);\n    }\n  }\n\n  return result;\n}\n\nexport interface ApiProps {\n  cluster: Cluster;\n  timeout: number;\n  logRequests?: boolean;\n  logCount?: number;\n  urlConfigs?: API_URL_CONFIG;\n}\n\nexport class Api {\n  public cluster: Cluster;\n\n  public api: AxiosInstance;\n  public logCount: number;\n\n  public urlConfigs: API_URL_CONFIG;\n\n  constructor({ cluster, timeout, logRequests, logCount, urlConfigs }: ApiProps) {\n    this.cluster = cluster;\n    this.urlConfigs = urlConfigs || {};\n    this.logCount = logCount || 1000;\n\n    this.api = axios.create({ baseURL: this.urlConfigs.BASE_HOST || API_URLS.BASE_HOST, timeout });\n\n    this.api.interceptors.request.use(\n      (config) => {\n        // before request\n        const { method, baseURL, url } = config;\n\n        logger.debug(`${method?.toUpperCase()} ${baseURL}${url}`);\n\n        return config;\n      },\n      (error) => {\n        // request error\n        logger.error(`Request failed`);\n\n        return Promise.reject(error);\n      },\n    );\n    this.api.interceptors.response.use(\n      (response) => {\n        // 2xx\n        const { config, data, status } = response;\n        const { method, baseURL, url } = config;\n\n        if (logRequests) {\n          updateReqHistory({\n            status,\n            url: `${baseURL}${url}`,\n            params: config.params,\n            data,\n            logCount: this.logCount,\n          });\n        }\n\n        logger.debug(`${method?.toUpperCase()} ${baseURL}${url}  ${status}`);\n\n        return data;\n      },\n      (error) => {\n        // https://axios-http.com/docs/handling_errors\n        // not 2xx\n        const { config, response = {} } = error;\n        const { status } = response;\n        const { method, baseURL, url } = config;\n\n        if (logRequests) {\n          updateReqHistory({\n            status,\n            url: `${baseURL}${url}`,\n            params: config.params,\n            data: error.message,\n            logCount: this.logCount,\n          });\n        }\n\n        logger.error(`${method.toUpperCase()} ${baseURL}${url} ${status || error.message}`);\n\n        return Promise.reject(error);\n      },\n    );\n  }\n\n  async getClmmConfigs(): Promise<ApiClmmConfigInfo[]> {\n    const res = await this.api.get(this.urlConfigs.CLMM_CONFIG || API_URLS.CLMM_CONFIG);\n    return res.data;\n  }\n\n  async getClmmPoolLines(poolId: string): Promise<{ price: string; liquidity: string }[]> {\n    const res = await this.api.get(\n      `${this.urlConfigs.POOL_LIQUIDITY_LINE || API_URLS.POOL_LIQUIDITY_LINE}?pool_id=${poolId}`,\n    );\n    return res.data;\n  }\n\n  async getBlockSlotCountForSecond(endpointUrl?: string): Promise<number> {\n    if (!endpointUrl) return 2;\n    const res: {\n      id: string;\n      jsonrpc: string;\n      result: { numSlots: number; numTransactions: number; samplePeriodSecs: number; slot: number }[];\n    } = await axios.post(endpointUrl, {\n      id: \"getRecentPerformanceSamples\",\n      jsonrpc: \"2.0\",\n      method: \"getRecentPerformanceSamples\",\n      params: [4],\n    });\n    const slotList = res.result.map((data) => data.numSlots);\n    return slotList.reduce((a, b) => a + b, 0) / slotList.length / 60;\n  }\n\n  async getChainTimeOffset(): Promise<{ offset: number }> {\n    const res = await this.api.get(this.urlConfigs.CHAIN_TIME || API_URLS.CHAIN_TIME);\n    return res.data;\n  }\n\n  async getRpcs(): Promise<{\n    rpcs: { batch: boolean; name: string; url: string; weight: number }[];\n    strategy: string;\n  }> {\n    return this.api.get(this.urlConfigs.RPCS || API_URLS.RPCS);\n  }\n\n  async getTokenList(): Promise<{ mintList: ApiV3Token[]; blacklist: ApiV3Token[]; whiteList: string[] }> {\n    const res = await this.api.get(this.urlConfigs.TOKEN_LIST || API_URLS.TOKEN_LIST);\n    return res.data;\n  }\n\n  async getJupTokenList(type?: JupTokenType): Promise<ApiV3Token[]> {\n    return this.api.get(\"/\", {\n      baseURL: (this.urlConfigs.JUP_TOKEN_LIST || API_URLS.JUP_TOKEN_LIST).replace(\"{type}\", type || JupTokenType.ALL),\n    });\n  }\n\n  async getTokenInfo(mint: (string | PublicKey)[]): Promise<ApiV3Token[]> {\n    const res = await this.api.get(\n      (this.urlConfigs.MINT_INFO_ID || API_URLS.MINT_INFO_ID) + `?mints=${mint.map((m) => m.toString()).join(\",\")}`,\n    );\n    return res.data;\n  }\n\n  async getPoolList(props: FetchPoolParams = {}): Promise<PoolsApiReturn> {\n    const { type = \"all\", sort = \"liquidity\", order = \"desc\", page = 0, pageSize = 100 } = props;\n    const res = await this.api.get<PoolsApiReturn>(\n      (this.urlConfigs.POOL_LIST || API_URLS.POOL_LIST) +\n        `?poolType=${type}&poolSortField=${sort}&sortType=${order}&page=${page}&pageSize=${pageSize}`,\n    );\n    return res.data;\n  }\n\n  async fetchPoolById(props: { ids: string }): Promise<ApiV3PoolInfoItem[]> {\n    const { ids } = props;\n    const res = await this.api.get((this.urlConfigs.POOL_SEARCH_BY_ID || API_URLS.POOL_SEARCH_BY_ID) + `?ids=${ids}`);\n    return res.data;\n  }\n\n  async fetchPoolKeysById(props: { idList: string[] }): Promise<PoolKeys[]> {\n    const { idList } = props;\n\n    const cacheList: PoolKeys[] = [];\n\n    const readyList = idList.filter((poolId) => {\n      if (poolKeysCache.has(poolId)) {\n        cacheList.push(poolKeysCache.get(poolId)!);\n        return false;\n      }\n      return true;\n    });\n\n    let data: PoolKeys[] = [];\n    if (readyList.length) {\n      const res = await this.api.get<PoolKeys[]>(\n        (this.urlConfigs.POOL_KEY_BY_ID || API_URLS.POOL_KEY_BY_ID) + `?ids=${readyList.join(\",\")}`,\n      );\n      data = res.data.filter(Boolean);\n      data.forEach((poolKey) => {\n        poolKeysCache.set(poolKey.id, poolKey);\n      });\n    }\n\n    return cacheList.concat(data);\n  }\n\n  async fetchPoolByMints(\n    props: {\n      mint1: string | PublicKey;\n      mint2?: string | PublicKey;\n    } & Omit<FetchPoolParams, \"pageSize\">,\n  ): Promise<ApiV3PoolInfoItem[]> {\n    const {\n      mint1: propMint1,\n      mint2: propMint2,\n      type = PoolFetchType.All,\n      sort = \"default\",\n      order = \"desc\",\n      page = 1,\n    } = props;\n\n    const [mint1, mint2] = [\n      propMint1 ? solToWSol(propMint1).toBase58() : propMint1,\n      propMint2 && propMint2 !== \"undefined\" ? solToWSol(propMint2).toBase58() : \"\",\n    ];\n    const [baseMint, quoteMint] = mint2 && mint1 > mint2 ? [mint2, mint1] : [mint1, mint2];\n\n    const res = await this.api.get(\n      (this.urlConfigs.POOL_SEARCH_MINT || API_URLS.POOL_SEARCH_MINT) +\n        `?mint1=${baseMint}&mint2=${quoteMint}&poolType=${type}&poolSortField=${sort}&sortType=${order}&pageSize=100&page=${page}`,\n    );\n    return res.data;\n  }\n\n  async fetchFarmInfoById(props: { ids: string }): Promise<FormatFarmInfoOut[]> {\n    const { ids } = props;\n\n    const res = await this.api.get<FormatFarmInfoOut[]>(\n      (this.urlConfigs.FARM_INFO || API_URLS.FARM_INFO) + `?ids=${ids}`,\n    );\n    return res.data;\n  }\n\n  async fetchFarmKeysById(props: { ids: string }): Promise<FormatFarmKeyOut[]> {\n    const { ids } = props;\n\n    const res = await this.api.get<FormatFarmKeyOut[]>(\n      (this.urlConfigs.FARM_KEYS || API_URLS.FARM_KEYS) + `?ids=${ids}`,\n    );\n    return res.data;\n  }\n\n  async fetchAvailabilityStatus(): Promise<AvailabilityCheckAPI3> {\n    const res = await this.api.get<AvailabilityCheckAPI3>(\n      this.urlConfigs.CHECK_AVAILABILITY || API_URLS.CHECK_AVAILABILITY,\n    );\n    return res.data;\n  }\n\n  async sendTxToJito(\n    txBase58: string[],\n    bundleMode?: boolean,\n  ): Promise<{\n    jsonrpc: string;\n    result: string;\n    id: number;\n  }> {\n    const url = bundleMode\n      ? this.urlConfigs.JITO_BUNDLE || API_URLS.JITO_BUNDLE\n      : this.urlConfigs.JITO_TRANSACTION || API_URLS.JITO_TRANSACTION;\n    const res = await this.api.post<{\n      jsonrpc: string;\n      result: string;\n      id: number;\n    }>(\n      url,\n      {\n        jsonrpc: \"2.0\",\n        id: 1,\n        method: bundleMode ? \"sendBundle\" : \"sendTransaction\",\n        params: txBase58,\n      },\n      {\n        baseURL: this.urlConfigs.JITO || API_URLS.JITO,\n      },\n    );\n\n    return res.data;\n  }\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 { 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","import _Big from \"big.js\";\nimport BN from \"bn.js\";\n\nimport { BigNumberish, BN_TEN, parseBigNumberish, Rounding } from \"../common/bignumber\";\nimport { createLogger, Logger } from \"../common/logger\";\n\nimport toFormat, { WrappedBig } from \"./formatter\";\nimport { Fraction } from \"./fraction\";\nimport { Token } from \"./token\";\nimport { Currency } from \"./currency\";\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 BN from \"bn.js\";\nimport Decimal from \"decimal.js\";\nimport { Token } from \"../module/token\";\nimport { Price } from \"../module/price\";\nimport { Currency } from \"../module/currency\";\nimport { TokenAmount, CurrencyAmount } from \"../module/amount\";\nimport { Fraction } from \"../module/fraction\";\nimport { Percent } from \"../module/percent\";\nimport { SplToken, TokenJson } from \"../raydium/token/type\";\nimport { ReplaceType } from \"../raydium/type\";\nimport { createLogger } from \"./logger\";\nimport { mul } from \"./fractionUtil\";\nimport { notInnerObject } from \"./utility\";\n\nexport enum Rounding {\n  ROUND_DOWN,\n  ROUND_HALF_UP,\n  ROUND_UP,\n}\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\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}\n\nexport function tenExponential(shift: BigNumberish): BN {\n  return BN_TEN.pow(parseBigNumberish(shift));\n}\n\n/**\n *\n * @example\n * getIntInfo(0.34) => { numerator: '34', denominator: '100'}\n * getIntInfo('0.34') //=> { numerator: '34', denominator: '100'}\n */\nexport function parseNumberInfo(n: Numberish | undefined): {\n  denominator: string;\n  numerator: string;\n  sign?: string;\n  int?: string;\n  dec?: string;\n} {\n  if (n === undefined) return { denominator: \"1\", numerator: \"0\" };\n  if (n instanceof BN) {\n    return { numerator: n.toString(), denominator: \"1\" };\n  }\n\n  if (n instanceof Fraction) {\n    return { denominator: n.denominator.toString(), numerator: n.numerator.toString() };\n  }\n\n  const s = String(n);\n  const [, sign = \"\", int = \"\", dec = \"\"] = s.replace(\",\", \"\").match(/(-?)(\\d*)\\.?(\\d*)/) ?? [];\n  const denominator = \"1\" + \"0\".repeat(dec.length);\n  const numerator = sign + (int === \"0\" ? \"\" : int) + dec || \"0\";\n  return { denominator, numerator, sign, int, dec };\n}\n\n// round up\nexport function divCeil(a: BN, b: BN): BN {\n  // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n  // @ts-ignore\n  const dm = a.divmod(b);\n\n  // Fast case - exact division\n  if (dm.mod.isZero()) return dm.div;\n\n  // Round up\n  return dm.div.isNeg() ? dm.div.isubn(1) : dm.div.iaddn(1);\n}\n\nexport function shakeFractionDecimal(n: Fraction): string {\n  const [, sign = \"\", int = \"\"] = n.toFixed(2).match(/(-?)(\\d*)\\.?(\\d*)/) ?? [];\n  return `${sign}${int}`;\n}\n\nexport function toBN(n: Numberish, decimal: BigNumberish = 0): BN {\n  if (n instanceof BN) return n;\n  return new BN(shakeFractionDecimal(toFraction(n).mul(BN_TEN.pow(new BN(String(decimal))))));\n}\n\nexport function toFraction(value: Numberish): Fraction {\n  //  to complete math format(may have decimal), not int\n  if (value instanceof Percent) return new Fraction(value.numerator, value.denominator);\n\n  if (value instanceof Price) return value.adjusted;\n\n  // to complete math format(may have decimal), not BN\n  if (value instanceof TokenAmount)\n    try {\n      return toFraction(value.toExact());\n    } catch {\n      return new Fraction(BN_ZERO);\n    }\n\n  // do not ideal with other fraction value\n  if (value instanceof Fraction) return value;\n\n  // wrap to Fraction\n  const n = String(value);\n  const details = parseNumberInfo(n);\n  return new Fraction(details.numerator, details.denominator);\n}\n\n/**\n * @example\n * toPercent(3.14) // => Percent { 314.00% }\n * toPercent(3.14, { alreadyDecimaled: true }) // => Percent {3.14%}\n */\nexport function toPercent(\n  n: Numberish,\n  options?: { /* usually used for backend data */ alreadyDecimaled?: boolean },\n): Percent {\n  const { numerator, denominator } = parseNumberInfo(n);\n  return new Percent(new BN(numerator), new BN(denominator).mul(options?.alreadyDecimaled ? new BN(100) : new BN(1)));\n}\n\nexport function toTokenPrice(params: {\n  token: TokenJson | Token | SplToken;\n  numberPrice: Numberish;\n  decimalDone?: boolean;\n}): Price {\n  const { token, numberPrice, decimalDone } = params;\n  const usdCurrency = new Token({ mint: \"\", decimals: 6, symbol: \"usd\", name: \"usd\", skipMint: true });\n  const { numerator, denominator } = parseNumberInfo(numberPrice);\n  const parsedNumerator = decimalDone ? new BN(numerator).mul(BN_TEN.pow(new BN(token.decimals))) : numerator;\n  const parsedDenominator = new BN(denominator).mul(BN_TEN.pow(new BN(usdCurrency.decimals)));\n\n  return new Price({\n    baseToken: usdCurrency,\n    denominator: parsedDenominator.toString(),\n    quoteToken: new Token({ ...token, skipMint: true, mint: \"\" }),\n    numerator: parsedNumerator.toString(),\n  });\n}\n\nexport function toUsdCurrency(amount: Numberish): CurrencyAmount {\n  const usdCurrency = new Currency({ decimals: 6, symbol: \"usd\", name: \"usd\" });\n  const amountBigNumber = toBN(mul(amount, 10 ** usdCurrency.decimals)!);\n  return new CurrencyAmount(usdCurrency, amountBigNumber);\n}\n\nexport function toTotalPrice(amount: Numberish | undefined, price: Price | undefined): CurrencyAmount {\n  if (!price || !amount) return toUsdCurrency(0);\n  return toUsdCurrency(mul(amount, price)!);\n}\n\nexport function decimalToFraction(n: Decimal | undefined): Fraction | undefined {\n  if (n == null) return undefined;\n  const { numerator, denominator } = parseNumberInfo(n.toString());\n  return new Fraction(numerator, denominator);\n}\n\nexport function isDecimal(val: unknown): boolean {\n  return val instanceof Decimal;\n}\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","/*\r\n *  decimal.js v10.3.1\r\n *  An arbitrary-precision Decimal type for JavaScript.\r\n *  https://github.com/MikeMcl/decimal.js\r\n *  Copyright (c) 2021 Michael Mclaughlin <M8ch88l@gmail.com>\r\n *  MIT Licence\r\n */\r\n\r\n\r\n// -----------------------------------  EDITABLE DEFAULTS  ------------------------------------ //\r\n\r\n\r\n  // The maximum exponent magnitude.\r\n  // The limit on the value of `toExpNeg`, `toExpPos`, `minE` and `maxE`.\r\nvar EXP_LIMIT = 9e15,                      // 0 to 9e15\r\n\r\n  // The limit on the value of `precision`, and on the value of the first argument to\r\n  // `toDecimalPlaces`, `toExponential`, `toFixed`, `toPrecision` and `toSignificantDigits`.\r\n  MAX_DIGITS = 1e9,                        // 0 to 1e9\r\n\r\n  // Base conversion alphabet.\r\n  NUMERALS = '0123456789abcdef',\r\n\r\n  // The natural logarithm of 10 (1025 digits).\r\n  LN10 = '2.3025850929940456840179914546843642076011014886287729760333279009675726096773524802359972050895982983419677840422862486334095254650828067566662873690987816894829072083255546808437998948262331985283935053089653777326288461633662222876982198867465436674744042432743651550489343149393914796194044002221051017141748003688084012647080685567743216228355220114804663715659121373450747856947683463616792101806445070648000277502684916746550586856935673420670581136429224554405758925724208241314695689016758940256776311356919292033376587141660230105703089634572075440370847469940168269282808481184289314848524948644871927809676271275775397027668605952496716674183485704422507197965004714951050492214776567636938662976979522110718264549734772662425709429322582798502585509785265383207606726317164309505995087807523710333101197857547331541421808427543863591778117054309827482385045648019095610299291824318237525357709750539565187697510374970888692180205189339507238539205144634197265287286965110862571492198849978748873771345686209167058',\r\n\r\n  // Pi (1025 digits).\r\n  PI = '3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113305305488204665213841469519415116094330572703657595919530921861173819326117931051185480744623799627495673518857527248912279381830119491298336733624406566430860213949463952247371907021798609437027705392171762931767523846748184676694051320005681271452635608277857713427577896091736371787214684409012249534301465495853710507922796892589235420199561121290219608640344181598136297747713099605187072113499999983729780499510597317328160963185950244594553469083026425223082533446850352619311881710100031378387528865875332083814206171776691473035982534904287554687311595628638823537875937519577818577805321712268066130019278766111959092164201989380952572010654858632789',\r\n\r\n\r\n  // The initial configuration properties of the Decimal constructor.\r\n  DEFAULTS = {\r\n\r\n    // These values must be integers within the stated ranges (inclusive).\r\n    // Most of these values can be changed at run-time using the `Decimal.config` method.\r\n\r\n    // The maximum number of significant digits of the result of a calculation or base conversion.\r\n    // E.g. `Decimal.config({ precision: 20 });`\r\n    precision: 20,                         // 1 to MAX_DIGITS\r\n\r\n    // The rounding mode used when rounding to `precision`.\r\n    //\r\n    // ROUND_UP         0 Away from zero.\r\n    // ROUND_DOWN       1 Towards zero.\r\n    // ROUND_CEIL       2 Towards +Infinity.\r\n    // ROUND_FLOOR      3 Towards -Infinity.\r\n    // ROUND_HALF_UP    4 Towards nearest neighbour. If equidistant, up.\r\n    // ROUND_HALF_DOWN  5 Towards nearest neighbour. If equidistant, down.\r\n    // ROUND_HALF_EVEN  6 Towards nearest neighbour. If equidistant, towards even neighbour.\r\n    // ROUND_HALF_CEIL  7 Towards nearest neighbour. If equidistant, towards +Infinity.\r\n    // ROUND_HALF_FLOOR 8 Towards nearest neighbour. If equidistant, towards -Infinity.\r\n    //\r\n    // E.g.\r\n    // `Decimal.rounding = 4;`\r\n    // `Decimal.rounding = Decimal.ROUND_HALF_UP;`\r\n    rounding: 4,                           // 0 to 8\r\n\r\n    // The modulo mode used when calculating the modulus: a mod n.\r\n    // The quotient (q = a / n) is calculated according to the corresponding rounding mode.\r\n    // The remainder (r) is calculated as: r = a - n * q.\r\n    //\r\n    // UP         0 The remainder is positive if the dividend is negative, else is negative.\r\n    // DOWN       1 The remainder has the same sign as the dividend (JavaScript %).\r\n    // FLOOR      3 The remainder has the same sign as the divisor (Python %).\r\n    // HALF_EVEN  6 The IEEE 754 remainder function.\r\n    // EUCLID     9 Euclidian division. q = sign(n) * floor(a / abs(n)). Always positive.\r\n    //\r\n    // Truncated division (1), floored division (3), the IEEE 754 remainder (6), and Euclidian\r\n    // division (9) are commonly used for the modulus operation. The other rounding modes can also\r\n    // be used, but they may not give useful results.\r\n    modulo: 1,                             // 0 to 9\r\n\r\n    // The exponent value at and beneath which `toString` returns exponential notation.\r\n    // JavaScript numbers: -7\r\n    toExpNeg: -7,                          // 0 to -EXP_LIMIT\r\n\r\n    // The exponent value at and above which `toString` returns exponential notation.\r\n    // JavaScript numbers: 21\r\n    toExpPos:  21,                         // 0 to EXP_LIMIT\r\n\r\n    // The minimum exponent value, beneath which underflow to zero occurs.\r\n    // JavaScript numbers: -324  (5e-324)\r\n    minE: -EXP_LIMIT,                      // -1 to -EXP_LIMIT\r\n\r\n    // The maximum exponent value, above which overflow to Infinity occurs.\r\n    // JavaScript numbers: 308  (1.7976931348623157e+308)\r\n    maxE: EXP_LIMIT,                       // 1 to EXP_LIMIT\r\n\r\n    // Whether to use cryptographically-secure random number generation, if available.\r\n    crypto: false                          // true/false\r\n  },\r\n\r\n\r\n// ----------------------------------- END OF EDITABLE DEFAULTS ------------------------------- //\r\n\r\n\r\n  inexact, quadrant,\r\n  external = true,\r\n\r\n  decimalError = '[DecimalError] ',\r\n  invalidArgument = decimalError + 'Invalid argument: ',\r\n  precisionLimitExceeded = decimalError + 'Precision limit exceeded',\r\n  cryptoUnavailable = decimalError + 'crypto unavailable',\r\n  tag = '[object Decimal]',\r\n\r\n  mathfloor = Math.floor,\r\n  mathpow = Math.pow,\r\n\r\n  isBinary = /^0b([01]+(\\.[01]*)?|\\.[01]+)(p[+-]?\\d+)?$/i,\r\n  isHex = /^0x([0-9a-f]+(\\.[0-9a-f]*)?|\\.[0-9a-f]+)(p[+-]?\\d+)?$/i,\r\n  isOctal = /^0o([0-7]+(\\.[0-7]*)?|\\.[0-7]+)(p[+-]?\\d+)?$/i,\r\n  isDecimal = /^(\\d+(\\.\\d*)?|\\.\\d+)(e[+-]?\\d+)?$/i,\r\n\r\n  BASE = 1e7,\r\n  LOG_BASE = 7,\r\n  MAX_SAFE_INTEGER = 9007199254740991,\r\n\r\n  LN10_PRECISION = LN10.length - 1,\r\n  PI_PRECISION = PI.length - 1,\r\n\r\n  // Decimal.prototype object\r\n  P = { toStringTag: tag };\r\n\r\n\r\n// Decimal prototype methods\r\n\r\n\r\n/*\r\n *  absoluteValue             abs\r\n *  ceil\r\n *  clampedTo                 clamp\r\n *  comparedTo                cmp\r\n *  cosine                    cos\r\n *  cubeRoot                  cbrt\r\n *  decimalPlaces             dp\r\n *  dividedBy                 div\r\n *  dividedToIntegerBy        divToInt\r\n *  equals                    eq\r\n *  floor\r\n *  greaterThan               gt\r\n *  greaterThanOrEqualTo      gte\r\n *  hyperbolicCosine          cosh\r\n *  hyperbolicSine            sinh\r\n *  hyperbolicTangent         tanh\r\n *  inverseCosine             acos\r\n *  inverseHyperbolicCosine   acosh\r\n *  inverseHyperbolicSine     asinh\r\n *  inverseHyperbolicTangent  atanh\r\n *  inverseSine               asin\r\n *  inverseTangent            atan\r\n *  isFinite\r\n *  isInteger                 isInt\r\n *  isNaN\r\n *  isNegative                isNeg\r\n *  isPositive                isPos\r\n *  isZero\r\n *  lessThan                  lt\r\n *  lessThanOrEqualTo         lte\r\n *  logarithm                 log\r\n *  [maximum]                 [max]\r\n *  [minimum]                 [min]\r\n *  minus                     sub\r\n *  modulo                    mod\r\n *  naturalExponential        exp\r\n *  naturalLogarithm          ln\r\n *  negated                   neg\r\n *  plus                      add\r\n *  precision                 sd\r\n *  round\r\n *  sine                      sin\r\n *  squareRoot                sqrt\r\n *  tangent                   tan\r\n *  times                     mul\r\n *  toBinary\r\n *  toDecimalPlaces           toDP\r\n *  toExponential\r\n *  toFixed\r\n *  toFraction\r\n *  toHexadecimal             toHex\r\n *  toNearest\r\n *  toNumber\r\n *  toOctal\r\n *  toPower                   pow\r\n *  toPrecision\r\n *  toSignificantDigits       toSD\r\n *  toString\r\n *  truncated                 trunc\r\n *  valueOf                   toJSON\r\n */\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the absolute value of this Decimal.\r\n *\r\n */\r\nP.absoluteValue = P.abs = function () {\r\n  var x = new this.constructor(this);\r\n  if (x.s < 0) x.s = 1;\r\n  return finalise(x);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the value of this Decimal rounded to a whole number in the\r\n * direction of positive Infinity.\r\n *\r\n */\r\nP.ceil = function () {\r\n  return finalise(new this.constructor(this), this.e + 1, 2);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the value of this Decimal clamped to the range\r\n * delineated by `min` and `max`.\r\n *\r\n * min {number|string|Decimal}\r\n * max {number|string|Decimal}\r\n *\r\n */\r\nP.clampedTo = P.clamp = function (min, max) {\r\n  var k,\r\n    x = this,\r\n    Ctor = x.constructor;\r\n  min = new Ctor(min);\r\n  max = new Ctor(max);\r\n  if (!min.s || !max.s) return new Ctor(NaN);\r\n  if (min.gt(max)) throw Error(invalidArgument + max);\r\n  k = x.cmp(min);\r\n  return k < 0 ? min : x.cmp(max) > 0 ? max : new Ctor(x);\r\n};\r\n\r\n\r\n/*\r\n * Return\r\n *   1    if the value of this Decimal is greater than the value of `y`,\r\n *  -1    if the value of this Decimal is less than the value of `y`,\r\n *   0    if they have the same value,\r\n *   NaN  if the value of either Decimal is NaN.\r\n *\r\n */\r\nP.comparedTo = P.cmp = function (y) {\r\n  var i, j, xdL, ydL,\r\n    x = this,\r\n    xd = x.d,\r\n    yd = (y = new x.constructor(y)).d,\r\n    xs = x.s,\r\n    ys = y.s;\r\n\r\n  // Either NaN or ±Infinity?\r\n  if (!xd || !yd) {\r\n    return !xs || !ys ? NaN : xs !== ys ? xs : xd === yd ? 0 : !xd ^ xs < 0 ? 1 : -1;\r\n  }\r\n\r\n  // Either zero?\r\n  if (!xd[0] || !yd[0]) return xd[0] ? xs : yd[0] ? -ys : 0;\r\n\r\n  // Signs differ?\r\n  if (xs !== ys) return xs;\r\n\r\n  // Compare exponents.\r\n  if (x.e !== y.e) return x.e > y.e ^ xs < 0 ? 1 : -1;\r\n\r\n  xdL = xd.length;\r\n  ydL = yd.length;\r\n\r\n  // Compare digit by digit.\r\n  for (i = 0, j = xdL < ydL ? xdL : ydL; i < j; ++i) {\r\n    if (xd[i] !== yd[i]) return xd[i] > yd[i] ^ xs < 0 ? 1 : -1;\r\n  }\r\n\r\n  // Compare lengths.\r\n  return xdL === ydL ? 0 : xdL > ydL ^ xs < 0 ? 1 : -1;\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the cosine of the value in radians of this Decimal.\r\n *\r\n * Domain: [-Infinity, Infinity]\r\n * Range: [-1, 1]\r\n *\r\n * cos(0)         = 1\r\n * cos(-0)        = 1\r\n * cos(Infinity)  = NaN\r\n * cos(-Infinity) = NaN\r\n * cos(NaN)       = NaN\r\n *\r\n */\r\nP.cosine = P.cos = function () {\r\n  var pr, rm,\r\n    x = this,\r\n    Ctor = x.constructor;\r\n\r\n  if (!x.d) return new Ctor(NaN);\r\n\r\n  // cos(0) = cos(-0) = 1\r\n  if (!x.d[0]) return new Ctor(1);\r\n\r\n  pr = Ctor.precision;\r\n  rm = Ctor.rounding;\r\n  Ctor.precision = pr + Math.max(x.e, x.sd()) + LOG_BASE;\r\n  Ctor.rounding = 1;\r\n\r\n  x = cosine(Ctor, toLessThanHalfPi(Ctor, x));\r\n\r\n  Ctor.precision = pr;\r\n  Ctor.rounding = rm;\r\n\r\n  return finalise(quadrant == 2 || quadrant == 3 ? x.neg() : x, pr, rm, true);\r\n};\r\n\r\n\r\n/*\r\n *\r\n * Return a new Decimal whose value is the cube root of the value of this Decimal, rounded to\r\n * `precision` significant digits using rounding mode `rounding`.\r\n *\r\n *  cbrt(0)  =  0\r\n *  cbrt(-0) = -0\r\n *  cbrt(1)  =  1\r\n *  cbrt(-1) = -1\r\n *  cbrt(N)  =  N\r\n *  cbrt(-I) = -I\r\n *  cbrt(I)  =  I\r\n *\r\n * Math.cbrt(x) = (x < 0 ? -Math.pow(-x, 1/3) : Math.pow(x, 1/3))\r\n *\r\n */\r\nP.cubeRoot = P.cbrt = function () {\r\n  var e, m, n, r, rep, s, sd, t, t3, t3plusx,\r\n    x = this,\r\n    Ctor = x.constructor;\r\n\r\n  if (!x.isFinite() || x.isZero()) return new Ctor(x);\r\n  external = false;\r\n\r\n  // Initial estimate.\r\n  s = x.s * mathpow(x.s * x, 1 / 3);\r\n\r\n   // Math.cbrt underflow/overflow?\r\n   // Pass x to Math.pow as integer, then adjust the exponent of the result.\r\n  if (!s || Math.abs(s) == 1 / 0) {\r\n    n = digitsToString(x.d);\r\n    e = x.e;\r\n\r\n    // Adjust n exponent so it is a multiple of 3 away from x exponent.\r\n    if (s = (e - n.length + 1) % 3) n += (s == 1 || s == -2 ? '0' : '00');\r\n    s = mathpow(n, 1 / 3);\r\n\r\n    // Rarely, e may be one less than the result exponent value.\r\n    e = mathfloor((e + 1) / 3) - (e % 3 == (e < 0 ? -1 : 2));\r\n\r\n    if (s == 1 / 0) {\r\n      n = '5e' + e;\r\n    } else {\r\n      n = s.toExponential();\r\n      n = n.slice(0, n.indexOf('e') + 1) + e;\r\n    }\r\n\r\n    r = new Ctor(n);\r\n    r.s = x.s;\r\n  } else {\r\n    r = new Ctor(s.toString());\r\n  }\r\n\r\n  sd = (e = Ctor.precision) + 3;\r\n\r\n  // Halley's method.\r\n  // TODO? Compare Newton's method.\r\n  for (;;) {\r\n    t = r;\r\n    t3 = t.times(t).times(t);\r\n    t3plusx = t3.plus(x);\r\n    r = divide(t3plusx.plus(x).times(t), t3plusx.plus(t3), sd + 2, 1);\r\n\r\n    // TODO? Replace with for-loop and checkRoundingDigits.\r\n    if (digitsToString(t.d).slice(0, sd) === (n = digitsToString(r.d)).slice(0, sd)) {\r\n      n = n.slice(sd - 3, sd + 1);\r\n\r\n      // The 4th rounding digit may be in error by -1 so if the 4 rounding digits are 9999 or 4999\r\n      // , i.e. approaching a rounding boundary, continue the iteration.\r\n      if (n == '9999' || !rep && n == '4999') {\r\n\r\n        // On the first iteration only, check to see if rounding up gives the exact result as the\r\n        // nines may infinitely repeat.\r\n        if (!rep) {\r\n          finalise(t, e + 1, 0);\r\n\r\n          if (t.times(t).times(t).eq(x)) {\r\n            r = t;\r\n            break;\r\n          }\r\n        }\r\n\r\n        sd += 4;\r\n        rep = 1;\r\n      } else {\r\n\r\n        // If the rounding digits are null, 0{0,4} or 50{0,3}, check for an exact result.\r\n        // If not, then there are further digits and m will be truthy.\r\n        if (!+n || !+n.slice(1) && n.charAt(0) == '5') {\r\n\r\n          // Truncate to the first rounding digit.\r\n          finalise(r, e + 1, 1);\r\n          m = !r.times(r).times(r).eq(x);\r\n        }\r\n\r\n        break;\r\n      }\r\n    }\r\n  }\r\n\r\n  external = true;\r\n\r\n  return finalise(r, e, Ctor.rounding, m);\r\n};\r\n\r\n\r\n/*\r\n * Return the number of decimal places of the value of this Decimal.\r\n *\r\n */\r\nP.decimalPlaces = P.dp = function () {\r\n  var w,\r\n    d = this.d,\r\n    n = NaN;\r\n\r\n  if (d) {\r\n    w = d.length - 1;\r\n    n = (w - mathfloor(this.e / LOG_BASE)) * LOG_BASE;\r\n\r\n    // Subtract the number of trailing zeros of the last word.\r\n    w = d[w];\r\n    if (w) for (; w % 10 == 0; w /= 10) n--;\r\n    if (n < 0) n = 0;\r\n  }\r\n\r\n  return n;\r\n};\r\n\r\n\r\n/*\r\n *  n / 0 = I\r\n *  n / N = N\r\n *  n / I = 0\r\n *  0 / n = 0\r\n *  0 / 0 = N\r\n *  0 / N = N\r\n *  0 / I = 0\r\n *  N / n = N\r\n *  N / 0 = N\r\n *  N / N = N\r\n *  N / I = N\r\n *  I / n = I\r\n *  I / 0 = I\r\n *  I / N = N\r\n *  I / I = N\r\n *\r\n * Return a new Decimal whose value is the value of this Decimal divided by `y`, rounded to\r\n * `precision` significant digits using rounding mode `rounding`.\r\n *\r\n */\r\nP.dividedBy = P.div = function (y) {\r\n  return divide(this, new this.constructor(y));\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the integer part of dividing the value of this Decimal\r\n * by the value of `y`, rounded to `precision` significant digits using rounding mode `rounding`.\r\n *\r\n */\r\nP.dividedToIntegerBy = P.divToInt = function (y) {\r\n  var x = this,\r\n    Ctor = x.constructor;\r\n  return finalise(divide(x, new Ctor(y), 0, 1, 1), Ctor.precision, Ctor.rounding);\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is equal to the value of `y`, otherwise return false.\r\n *\r\n */\r\nP.equals = P.eq = function (y) {\r\n  return this.cmp(y) === 0;\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the value of this Decimal rounded to a whole number in the\r\n * direction of negative Infinity.\r\n *\r\n */\r\nP.floor = function () {\r\n  return finalise(new this.constructor(this), this.e + 1, 3);\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is greater than the value of `y`, otherwise return\r\n * false.\r\n *\r\n */\r\nP.greaterThan = P.gt = function (y) {\r\n  return this.cmp(y) > 0;\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is greater than or equal to the value of `y`,\r\n * otherwise return false.\r\n *\r\n */\r\nP.greaterThanOrEqualTo = P.gte = function (y) {\r\n  var k = this.cmp(y);\r\n  return k == 1 || k === 0;\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the hyperbolic cosine of the value in radians of this\r\n * Decimal.\r\n *\r\n * Domain: [-Infinity, Infinity]\r\n * Range: [1, Infinity]\r\n *\r\n * cosh(x) = 1 + x^2/2! + x^4/4! + x^6/6! + ...\r\n *\r\n * cosh(0)         = 1\r\n * cosh(-0)        = 1\r\n * cosh(Infinity)  = Infinity\r\n * cosh(-Infinity) = Infinity\r\n * cosh(NaN)       = NaN\r\n *\r\n *  x        time taken (ms)   result\r\n * 1000      9                 9.8503555700852349694e+433\r\n * 10000     25                4.4034091128314607936e+4342\r\n * 100000    171               1.4033316802130615897e+43429\r\n * 1000000   3817              1.5166076984010437725e+434294\r\n * 10000000  abandoned after 2 minute wait\r\n *\r\n * TODO? Compare performance of cosh(x) = 0.5 * (exp(x) + exp(-x))\r\n *\r\n */\r\nP.hyperbolicCosine = P.cosh = function () {\r\n  var k, n, pr, rm, len,\r\n    x = this,\r\n    Ctor = x.constructor,\r\n    one = new Ctor(1);\r\n\r\n  if (!x.isFinite()) return new Ctor(x.s ? 1 / 0 : NaN);\r\n  if (x.isZero()) return one;\r\n\r\n  pr = Ctor.precision;\r\n  rm = Ctor.rounding;\r\n  Ctor.precision = pr + Math.max(x.e, x.sd()) + 4;\r\n  Ctor.rounding = 1;\r\n  len = x.d.length;\r\n\r\n  // Argument reduction: cos(4x) = 1 - 8cos^2(x) + 8cos^4(x) + 1\r\n  // i.e. cos(x) = 1 - cos^2(x/4)(8 - 8cos^2(x/4))\r\n\r\n  // Estimate the optimum number of times to use the argument reduction.\r\n  // TODO? Estimation reused from cosine() and may not be optimal here.\r\n  if (len < 32) {\r\n    k = Math.ceil(len / 3);\r\n    n = (1 / tinyPow(4, k)).toString();\r\n  } else {\r\n    k = 16;\r\n    n = '2.3283064365386962890625e-10';\r\n  }\r\n\r\n  x = taylorSeries(Ctor, 1, x.times(n), new Ctor(1), true);\r\n\r\n  // Reverse argument reduction\r\n  var cosh2_x,\r\n    i = k,\r\n    d8 = new Ctor(8);\r\n  for (; i--;) {\r\n    cosh2_x = x.times(x);\r\n    x = one.minus(cosh2_x.times(d8.minus(cosh2_x.times(d8))));\r\n  }\r\n\r\n  return finalise(x, Ctor.precision = pr, Ctor.rounding = rm, true);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the hyperbolic sine of the value in radians of this\r\n * Decimal.\r\n *\r\n * Domain: [-Infinity, Infinity]\r\n * Range: [-Infinity, Infinity]\r\n *\r\n * sinh(x) = x + x^3/3! + x^5/5! + x^7/7! + ...\r\n *\r\n * sinh(0)         = 0\r\n * sinh(-0)        = -0\r\n * sinh(Infinity)  = Infinity\r\n * sinh(-Infinity) = -Infinity\r\n * sinh(NaN)       = NaN\r\n *\r\n * x        time taken (ms)\r\n * 10       2 ms\r\n * 100      5 ms\r\n * 1000     14 ms\r\n * 10000    82 ms\r\n * 100000   886 ms            1.4033316802130615897e+43429\r\n * 200000   2613 ms\r\n * 300000   5407 ms\r\n * 400000   8824 ms\r\n * 500000   13026 ms          8.7080643612718084129e+217146\r\n * 1000000  48543 ms\r\n *\r\n * TODO? Compare performance of sinh(x) = 0.5 * (exp(x) - exp(-x))\r\n *\r\n */\r\nP.hyperbolicSine = P.sinh = function () {\r\n  var k, pr, rm, len,\r\n    x = this,\r\n    Ctor = x.constructor;\r\n\r\n  if (!x.isFinite() || x.isZero()) return new Ctor(x);\r\n\r\n  pr = Ctor.precision;\r\n  rm = Ctor.rounding;\r\n  Ctor.precision = pr + Math.max(x.e, x.sd()) + 4;\r\n  Ctor.rounding = 1;\r\n  len = x.d.length;\r\n\r\n  if (len < 3) {\r\n    x = taylorSeries(Ctor, 2, x, x, true);\r\n  } else {\r\n\r\n    // Alternative argument reduction: sinh(3x) = sinh(x)(3 + 4sinh^2(x))\r\n    // i.e. sinh(x) = sinh(x/3)(3 + 4sinh^2(x/3))\r\n    // 3 multiplications and 1 addition\r\n\r\n    // Argument reduction: sinh(5x) = sinh(x)(5 + sinh^2(x)(20 + 16sinh^2(x)))\r\n    // i.e. sinh(x) = sinh(x/5)(5 + sinh^2(x/5)(20 + 16sinh^2(x/5)))\r\n    // 4 multiplications and 2 additions\r\n\r\n    // Estimate the optimum number of times to use the argument reduction.\r\n    k = 1.4 * Math.sqrt(len);\r\n    k = k > 16 ? 16 : k | 0;\r\n\r\n    x = x.times(1 / tinyPow(5, k));\r\n    x = taylorSeries(Ctor, 2, x, x, true);\r\n\r\n    // Reverse argument reduction\r\n    var sinh2_x,\r\n      d5 = new Ctor(5),\r\n      d16 = new Ctor(16),\r\n      d20 = new Ctor(20);\r\n    for (; k--;) {\r\n      sinh2_x = x.times(x);\r\n      x = x.times(d5.plus(sinh2_x.times(d16.times(sinh2_x).plus(d20))));\r\n    }\r\n  }\r\n\r\n  Ctor.precision = pr;\r\n  Ctor.rounding = rm;\r\n\r\n  return finalise(x, pr, rm, true);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the hyperbolic tangent of the value in radians of this\r\n * Decimal.\r\n *\r\n * Domain: [-Infinity, Infinity]\r\n * Range: [-1, 1]\r\n *\r\n * tanh(x) = sinh(x) / cosh(x)\r\n *\r\n * tanh(0)         = 0\r\n * tanh(-0)        = -0\r\n * tanh(Infinity)  = 1\r\n * tanh(-Infinity) = -1\r\n * tanh(NaN)       = NaN\r\n *\r\n */\r\nP.hyperbolicTangent = P.tanh = function () {\r\n  var pr, rm,\r\n    x = this,\r\n    Ctor = x.constructor;\r\n\r\n  if (!x.isFinite()) return new Ctor(x.s);\r\n  if (x.isZero()) return new Ctor(x);\r\n\r\n  pr = Ctor.precision;\r\n  rm = Ctor.rounding;\r\n  Ctor.precision = pr + 7;\r\n  Ctor.rounding = 1;\r\n\r\n  return divide(x.sinh(), x.cosh(), Ctor.precision = pr, Ctor.rounding = rm);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the arccosine (inverse cosine) in radians of the value of\r\n * this Decimal.\r\n *\r\n * Domain: [-1, 1]\r\n * Range: [0, pi]\r\n *\r\n * acos(x) = pi/2 - asin(x)\r\n *\r\n * acos(0)       = pi/2\r\n * acos(-0)      = pi/2\r\n * acos(1)       = 0\r\n * acos(-1)      = pi\r\n * acos(1/2)     = pi/3\r\n * acos(-1/2)    = 2*pi/3\r\n * acos(|x| > 1) = NaN\r\n * acos(NaN)     = NaN\r\n *\r\n */\r\nP.inverseCosine = P.acos = function () {\r\n  var halfPi,\r\n    x = this,\r\n    Ctor = x.constructor,\r\n    k = x.abs().cmp(1),\r\n    pr = Ctor.precision,\r\n    rm = Ctor.rounding;\r\n\r\n  if (k !== -1) {\r\n    return k === 0\r\n      // |x| is 1\r\n      ? x.isNeg() ? getPi(Ctor, pr, rm) : new Ctor(0)\r\n      // |x| > 1 or x is NaN\r\n      : new Ctor(NaN);\r\n  }\r\n\r\n  if (x.isZero()) return getPi(Ctor, pr + 4, rm).times(0.5);\r\n\r\n  // TODO? Special case acos(0.5) = pi/3 and acos(-0.5) = 2*pi/3\r\n\r\n  Ctor.precision = pr + 6;\r\n  Ctor.rounding = 1;\r\n\r\n  x = x.asin();\r\n  halfPi = getPi(Ctor, pr + 4, rm).times(0.5);\r\n\r\n  Ctor.precision = pr;\r\n  Ctor.rounding = rm;\r\n\r\n  return halfPi.minus(x);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the inverse of the hyperbolic cosine in radians of the\r\n * value of this Decimal.\r\n *\r\n * Domain: [1, Infinity]\r\n * Range: [0, Infinity]\r\n *\r\n * acosh(x) = ln(x + sqrt(x^2 - 1))\r\n *\r\n * acosh(x < 1)     = NaN\r\n * acosh(NaN)       = NaN\r\n * acosh(Infinity)  = Infinity\r\n * acosh(-Infinity) = NaN\r\n * acosh(0)         = NaN\r\n * acosh(-0)        = NaN\r\n * acosh(1)         = 0\r\n * acosh(-1)        = NaN\r\n *\r\n */\r\nP.inverseHyperbolicCosine = P.acosh = function () {\r\n  var pr, rm,\r\n    x = this,\r\n    Ctor = x.constructor;\r\n\r\n  if (x.lte(1)) return new Ctor(x.eq(1) ? 0 : NaN);\r\n  if (!x.isFinite()) return new Ctor(x);\r\n\r\n  pr = Ctor.precision;\r\n  rm = Ctor.rounding;\r\n  Ctor.precision = pr + Math.max(Math.abs(x.e), x.sd()) + 4;\r\n  Ctor.rounding = 1;\r\n  external = false;\r\n\r\n  x = x.times(x).minus(1).sqrt().plus(x);\r\n\r\n  external = true;\r\n  Ctor.precision = pr;\r\n  Ctor.rounding = rm;\r\n\r\n  return x.ln();\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the inverse of the hyperbolic sine in radians of the value\r\n * of this Decimal.\r\n *\r\n * Domain: [-Infinity, Infinity]\r\n * Range: [-Infinity, Infinity]\r\n *\r\n * asinh(x) = ln(x + sqrt(x^2 + 1))\r\n *\r\n * asinh(NaN)       = NaN\r\n * asinh(Infinity)  = Infinity\r\n * asinh(-Infinity) = -Infinity\r\n * asinh(0)         = 0\r\n * asinh(-0)        = -0\r\n *\r\n */\r\nP.inverseHyperbolicSine = P.asinh = function () {\r\n  var pr, rm,\r\n    x = this,\r\n    Ctor = x.constructor;\r\n\r\n  if (!x.isFinite() || x.isZero()) return new Ctor(x);\r\n\r\n  pr = Ctor.precision;\r\n  rm = Ctor.rounding;\r\n  Ctor.precision = pr + 2 * Math.max(Math.abs(x.e), x.sd()) + 6;\r\n  Ctor.rounding = 1;\r\n  external = false;\r\n\r\n  x = x.times(x).plus(1).sqrt().plus(x);\r\n\r\n  external = true;\r\n  Ctor.precision = pr;\r\n  Ctor.rounding = rm;\r\n\r\n  return x.ln();\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the inverse of the hyperbolic tangent in radians of the\r\n * value of this Decimal.\r\n *\r\n * Domain: [-1, 1]\r\n * Range: [-Infinity, Infinity]\r\n *\r\n * atanh(x) = 0.5 * ln((1 + x) / (1 - x))\r\n *\r\n * atanh(|x| > 1)   = NaN\r\n * atanh(NaN)       = NaN\r\n * atanh(Infinity)  = NaN\r\n * atanh(-Infinity) = NaN\r\n * atanh(0)         = 0\r\n * atanh(-0)        = -0\r\n * atanh(1)         = Infinity\r\n * atanh(-1)        = -Infinity\r\n *\r\n */\r\nP.inverseHyperbolicTangent = P.atanh = function () {\r\n  var pr, rm, wpr, xsd,\r\n    x = this,\r\n    Ctor = x.constructor;\r\n\r\n  if (!x.isFinite()) return new Ctor(NaN);\r\n  if (x.e >= 0) return new Ctor(x.abs().eq(1) ? x.s / 0 : x.isZero() ? x : NaN);\r\n\r\n  pr = Ctor.precision;\r\n  rm = Ctor.rounding;\r\n  xsd = x.sd();\r\n\r\n  if (Math.max(xsd, pr) < 2 * -x.e - 1) return finalise(new Ctor(x), pr, rm, true);\r\n\r\n  Ctor.precision = wpr = xsd - x.e;\r\n\r\n  x = divide(x.plus(1), new Ctor(1).minus(x), wpr + pr, 1);\r\n\r\n  Ctor.precision = pr + 4;\r\n  Ctor.rounding = 1;\r\n\r\n  x = x.ln();\r\n\r\n  Ctor.precision = pr;\r\n  Ctor.rounding = rm;\r\n\r\n  return x.times(0.5);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the arcsine (inverse sine) in radians of the value of this\r\n * Decimal.\r\n *\r\n * Domain: [-Infinity, Infinity]\r\n * Range: [-pi/2, pi/2]\r\n *\r\n * asin(x) = 2*atan(x/(1 + sqrt(1 - x^2)))\r\n *\r\n * asin(0)       = 0\r\n * asin(-0)      = -0\r\n * asin(1/2)     = pi/6\r\n * asin(-1/2)    = -pi/6\r\n * asin(1)       = pi/2\r\n * asin(-1)      = -pi/2\r\n * asin(|x| > 1) = NaN\r\n * asin(NaN)     = NaN\r\n *\r\n * TODO? Compare performance of Taylor series.\r\n *\r\n */\r\nP.inverseSine = P.asin = function () {\r\n  var halfPi, k,\r\n    pr, rm,\r\n    x = this,\r\n    Ctor = x.constructor;\r\n\r\n  if (x.isZero()) return new Ctor(x);\r\n\r\n  k = x.abs().cmp(1);\r\n  pr = Ctor.precision;\r\n  rm = Ctor.rounding;\r\n\r\n  if (k !== -1) {\r\n\r\n    // |x| is 1\r\n    if (k === 0) {\r\n      halfPi = getPi(Ctor, pr + 4, rm).times(0.5);\r\n      halfPi.s = x.s;\r\n      return halfPi;\r\n    }\r\n\r\n    // |x| > 1 or x is NaN\r\n    return new Ctor(NaN);\r\n  }\r\n\r\n  // TODO? Special case asin(1/2) = pi/6 and asin(-1/2) = -pi/6\r\n\r\n  Ctor.precision = pr + 6;\r\n  Ctor.rounding = 1;\r\n\r\n  x = x.div(new Ctor(1).minus(x.times(x)).sqrt().plus(1)).atan();\r\n\r\n  Ctor.precision = pr;\r\n  Ctor.rounding = rm;\r\n\r\n  return x.times(2);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the arctangent (inverse tangent) in radians of the value\r\n * of this Decimal.\r\n *\r\n * Domain: [-Infinity, Infinity]\r\n * Range: [-pi/2, pi/2]\r\n *\r\n * atan(x) = x - x^3/3 + x^5/5 - x^7/7 + ...\r\n *\r\n * atan(0)         = 0\r\n * atan(-0)        = -0\r\n * atan(1)         = pi/4\r\n * atan(-1)        = -pi/4\r\n * atan(Infinity)  = pi/2\r\n * atan(-Infinity) = -pi/2\r\n * atan(NaN)       = NaN\r\n *\r\n */\r\nP.inverseTangent = P.atan = function () {\r\n  var i, j, k, n, px, t, r, wpr, x2,\r\n    x = this,\r\n    Ctor = x.constructor,\r\n    pr = Ctor.precision,\r\n    rm = Ctor.rounding;\r\n\r\n  if (!x.isFinite()) {\r\n    if (!x.s) return new Ctor(NaN);\r\n    if (pr + 4 <= PI_PRECISION) {\r\n      r = getPi(Ctor, pr + 4, rm).times(0.5);\r\n      r.s = x.s;\r\n      return r;\r\n    }\r\n  } else if (x.isZero()) {\r\n    return new Ctor(x);\r\n  } else if (x.abs().eq(1) && pr + 4 <= PI_PRECISION) {\r\n    r = getPi(Ctor, pr + 4, rm).times(0.25);\r\n    r.s = x.s;\r\n    return r;\r\n  }\r\n\r\n  Ctor.precision = wpr = pr + 10;\r\n  Ctor.rounding = 1;\r\n\r\n  // TODO? if (x >= 1 && pr <= PI_PRECISION) atan(x) = halfPi * x.s - atan(1 / x);\r\n\r\n  // Argument reduction\r\n  // Ensure |x| < 0.42\r\n  // atan(x) = 2 * atan(x / (1 + sqrt(1 + x^2)))\r\n\r\n  k = Math.min(28, wpr / LOG_BASE + 2 | 0);\r\n\r\n  for (i = k; i; --i) x = x.div(x.times(x).plus(1).sqrt().plus(1));\r\n\r\n  external = false;\r\n\r\n  j = Math.ceil(wpr / LOG_BASE);\r\n  n = 1;\r\n  x2 = x.times(x);\r\n  r = new Ctor(x);\r\n  px = x;\r\n\r\n  // atan(x) = x - x^3/3 + x^5/5 - x^7/7 + ...\r\n  for (; i !== -1;) {\r\n    px = px.times(x2);\r\n    t = r.minus(px.div(n += 2));\r\n\r\n    px = px.times(x2);\r\n    r = t.plus(px.div(n += 2));\r\n\r\n    if (r.d[j] !== void 0) for (i = j; r.d[i] === t.d[i] && i--;);\r\n  }\r\n\r\n  if (k) r = r.times(2 << (k - 1));\r\n\r\n  external = true;\r\n\r\n  return finalise(r, Ctor.precision = pr, Ctor.rounding = rm, true);\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is a finite number, otherwise return false.\r\n *\r\n */\r\nP.isFinite = function () {\r\n  return !!this.d;\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is an integer, otherwise return false.\r\n *\r\n */\r\nP.isInteger = P.isInt = function () {\r\n  return !!this.d && mathfloor(this.e / LOG_BASE) > this.d.length - 2;\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is NaN, otherwise return false.\r\n *\r\n */\r\nP.isNaN = function () {\r\n  return !this.s;\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is negative, otherwise return false.\r\n *\r\n */\r\nP.isNegative = P.isNeg = function () {\r\n  return this.s < 0;\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is positive, otherwise return false.\r\n *\r\n */\r\nP.isPositive = P.isPos = function () {\r\n  return this.s > 0;\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is 0 or -0, otherwise return false.\r\n *\r\n */\r\nP.isZero = function () {\r\n  return !!this.d && this.d[0] === 0;\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is less than `y`, otherwise return false.\r\n *\r\n */\r\nP.lessThan = P.lt = function (y) {\r\n  return this.cmp(y) < 0;\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is less than or equal to `y`, otherwise return false.\r\n *\r\n */\r\nP.lessThanOrEqualTo = P.lte = function (y) {\r\n  return this.cmp(y) < 1;\r\n};\r\n\r\n\r\n/*\r\n * Return the logarithm of the value of this Decimal to the specified base, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * If no base is specified, return log[10](arg).\r\n *\r\n * log[base](arg) = ln(arg) / ln(base)\r\n *\r\n * The result will always be correctly rounded if the base of the log is 10, and 'almost always'\r\n * otherwise:\r\n *\r\n * Depending on the rounding mode, the result may be incorrectly rounded if the first fifteen\r\n * rounding digits are [49]99999999999999 or [50]00000000000000. In that case, the maximum error\r\n * between the result and the correctly rounded result will be one ulp (unit in the last place).\r\n *\r\n * log[-b](a)       = NaN\r\n * log[0](a)        = NaN\r\n * log[1](a)        = NaN\r\n * log[NaN](a)      = NaN\r\n * log[Infinity](a) = NaN\r\n * log[b](0)        = -Infinity\r\n * log[b](-0)       = -Infinity\r\n * log[b](-a)       = NaN\r\n * log[b](1)        = 0\r\n * log[b](Infinity) = Infinity\r\n * log[b](NaN)      = NaN\r\n *\r\n * [base] {number|string|Decimal} The base of the logarithm.\r\n *\r\n */\r\nP.logarithm = P.log = function (base) {\r\n  var isBase10, d, denominator, k, inf, num, sd, r,\r\n    arg = this,\r\n    Ctor = arg.constructor,\r\n    pr = Ctor.precision,\r\n    rm = Ctor.rounding,\r\n    guard = 5;\r\n\r\n  // Default base is 10.\r\n  if (base == null) {\r\n    base = new Ctor(10);\r\n    isBase10 = true;\r\n  } else {\r\n    base = new Ctor(base);\r\n    d = base.d;\r\n\r\n    // Return NaN if base is negative, or non-finite, or is 0 or 1.\r\n    if (base.s < 0 || !d || !d[0] || base.eq(1)) return new Ctor(NaN);\r\n\r\n    isBase10 = base.eq(10);\r\n  }\r\n\r\n  d = arg.d;\r\n\r\n  // Is arg negative, non-finite, 0 or 1?\r\n  if (arg.s < 0 || !d || !d[0] || arg.eq(1)) {\r\n    return new Ctor(d && !d[0] ? -1 / 0 : arg.s != 1 ? NaN : d ? 0 : 1 / 0);\r\n  }\r\n\r\n  // The result will have a non-terminating decimal expansion if base is 10 and arg is not an\r\n  // integer power of 10.\r\n  if (isBase10) {\r\n    if (d.length > 1) {\r\n      inf = true;\r\n    } else {\r\n      for (k = d[0]; k % 10 === 0;) k /= 10;\r\n      inf = k !== 1;\r\n    }\r\n  }\r\n\r\n  external = false;\r\n  sd = pr + guard;\r\n  num = naturalLogarithm(arg, sd);\r\n  denominator = isBase10 ? getLn10(Ctor, sd + 10) : naturalLogarithm(base, sd);\r\n\r\n  // The result will have 5 rounding digits.\r\n  r = divide(num, denominator, sd, 1);\r\n\r\n  // If at a rounding boundary, i.e. the result's rounding digits are [49]9999 or [50]0000,\r\n  // calculate 10 further digits.\r\n  //\r\n  // If the result is known to have an infinite decimal expansion, repeat this until it is clear\r\n  // that the result is above or below the boundary. Otherwise, if after calculating the 10\r\n  // further digits, the last 14 are nines, round up and assume the result is exact.\r\n  // Also assume the result is exact if the last 14 are zero.\r\n  //\r\n  // Example of a result that will be incorrectly rounded:\r\n  // log[1048576](4503599627370502) = 2.60000000000000009610279511444746...\r\n  // The above result correctly rounded using ROUND_CEIL to 1 decimal place should be 2.7, but it\r\n  // will be given as 2.6 as there are 15 zeros immediately after the requested decimal place, so\r\n  // the exact result would be assumed to be 2.6, which rounded using ROUND_CEIL to 1 decimal\r\n  // place is still 2.6.\r\n  if (checkRoundingDigits(r.d, k = pr, rm)) {\r\n\r\n    do {\r\n      sd += 10;\r\n      num = naturalLogarithm(arg, sd);\r\n      denominator = isBase10 ? getLn10(Ctor, sd + 10) : naturalLogarithm(base, sd);\r\n      r = divide(num, denominator, sd, 1);\r\n\r\n      if (!inf) {\r\n\r\n        // Check for 14 nines from the 2nd rounding digit, as the first may be 4.\r\n        if (+digitsToString(r.d).slice(k + 1, k + 15) + 1 == 1e14) {\r\n          r = finalise(r, pr + 1, 0);\r\n        }\r\n\r\n        break;\r\n      }\r\n    } while (checkRoundingDigits(r.d, k += 10, rm));\r\n  }\r\n\r\n  external = true;\r\n\r\n  return finalise(r, pr, rm);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the maximum of the arguments and the value of this Decimal.\r\n *\r\n * arguments {number|string|Decimal}\r\n *\r\nP.max = function () {\r\n  Array.prototype.push.call(arguments, this);\r\n  return maxOrMin(this.constructor, arguments, 'lt');\r\n};\r\n */\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the minimum of the arguments and the value of this Decimal.\r\n *\r\n * arguments {number|string|Decimal}\r\n *\r\nP.min = function () {\r\n  Array.prototype.push.call(arguments, this);\r\n  return maxOrMin(this.constructor, arguments, 'gt');\r\n};\r\n */\r\n\r\n\r\n/*\r\n *  n - 0 = n\r\n *  n - N = N\r\n *  n - I = -I\r\n *  0 - n = -n\r\n *  0 - 0 = 0\r\n *  0 - N = N\r\n *  0 - I = -I\r\n *  N - n = N\r\n *  N - 0 = N\r\n *  N - N = N\r\n *  N - I = N\r\n *  I - n = I\r\n *  I - 0 = I\r\n *  I - N = N\r\n *  I - I = N\r\n *\r\n * Return a new Decimal whose value is the value of this Decimal minus `y`, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n */\r\nP.minus = P.sub = function (y) {\r\n  var d, e, i, j, k, len, pr, rm, xd, xe, xLTy, yd,\r\n    x = this,\r\n    Ctor = x.constructor;\r\n\r\n  y = new Ctor(y);\r\n\r\n  // If either is not finite...\r\n  if (!x.d || !y.d) {\r\n\r\n    // Return NaN if either is NaN.\r\n    if (!x.s || !y.s) y = new Ctor(NaN);\r\n\r\n    // Return y negated if x is finite and y is ±Infinity.\r\n    else if (x.d) y.s = -y.s;\r\n\r\n    // Return x if y is finite and x is ±Infinity.\r\n    // Return x if both are ±Infinity with different signs.\r\n    // Return NaN if both are ±Infinity with the same sign.\r\n    else y = new Ctor(y.d || x.s !== y.s ? x : NaN);\r\n\r\n    return y;\r\n  }\r\n\r\n  // If signs differ...\r\n  if (x.s != y.s) {\r\n    y.s = -y.s;\r\n    return x.plus(y);\r\n  }\r\n\r\n  xd = x.d;\r\n  yd = y.d;\r\n  pr = Ctor.precision;\r\n  rm = Ctor.rounding;\r\n\r\n  // If either is zero...\r\n  if (!xd[0] || !yd[0]) {\r\n\r\n    // Return y negated if x is zero and y is non-zero.\r\n    if (yd[0]) y.s = -y.s;\r\n\r\n    // Return x if y is zero and x is non-zero.\r\n    else if (xd[0]) y = new Ctor(x);\r\n\r\n    // Return zero if both are zero.\r\n    // From IEEE 754 (2008) 6.3: 0 - 0 = -0 - -0 = -0 when rounding to -Infinity.\r\n    else return new Ctor(rm === 3 ? -0 : 0);\r\n\r\n    return external ? finalise(y, pr, rm) : y;\r\n  }\r\n\r\n  // x and y are finite, non-zero numbers with the same sign.\r\n\r\n  // Calculate base 1e7 exponents.\r\n  e = mathfloor(y.e / LOG_BASE);\r\n  xe = mathfloor(x.e / LOG_BASE);\r\n\r\n  xd = xd.slice();\r\n  k = xe - e;\r\n\r\n  // If base 1e7 exponents differ...\r\n  if (k) {\r\n    xLTy = k < 0;\r\n\r\n    if (xLTy) {\r\n      d = xd;\r\n      k = -k;\r\n      len = yd.length;\r\n    } else {\r\n      d = yd;\r\n      e = xe;\r\n      len = xd.length;\r\n    }\r\n\r\n    // Numbers with massively different exponents would result in a very high number of\r\n    // zeros needing to be prepended, but this can be avoided while still ensuring correct\r\n    // rounding by limiting the number of zeros to `Math.ceil(pr / LOG_BASE) + 2`.\r\n    i = Math.max(Math.ceil(pr / LOG_BASE), len) + 2;\r\n\r\n    if (k > i) {\r\n      k = i;\r\n      d.length = 1;\r\n    }\r\n\r\n    // Prepend zeros to equalise exponents.\r\n    d.reverse();\r\n    for (i = k; i--;) d.push(0);\r\n    d.reverse();\r\n\r\n  // Base 1e7 exponents equal.\r\n  } else {\r\n\r\n    // Check digits to determine which is the bigger number.\r\n\r\n    i = xd.length;\r\n    len = yd.length;\r\n    xLTy = i < len;\r\n    if (xLTy) len = i;\r\n\r\n    for (i = 0; i < len; i++) {\r\n      if (xd[i] != yd[i]) {\r\n        xLTy = xd[i] < yd[i];\r\n        break;\r\n      }\r\n    }\r\n\r\n    k = 0;\r\n  }\r\n\r\n  if (xLTy) {\r\n    d = xd;\r\n    xd = yd;\r\n    yd = d;\r\n    y.s = -y.s;\r\n  }\r\n\r\n  len = xd.length;\r\n\r\n  // Append zeros to `xd` if shorter.\r\n  // Don't add zeros to `yd` if shorter as subtraction only needs to start at `yd` length.\r\n  for (i = yd.length - len; i > 0; --i) xd[len++] = 0;\r\n\r\n  // Subtract yd from xd.\r\n  for (i = yd.length; i > k;) {\r\n\r\n    if (xd[--i] < yd[i]) {\r\n      for (j = i; j && xd[--j] === 0;) xd[j] = BASE - 1;\r\n      --xd[j];\r\n      xd[i] += BASE;\r\n    }\r\n\r\n    xd[i] -= yd[i];\r\n  }\r\n\r\n  // Remove trailing zeros.\r\n  for (; xd[--len] === 0;) xd.pop();\r\n\r\n  // Remove leading zeros and adjust exponent accordingly.\r\n  for (; xd[0] === 0; xd.shift()) --e;\r\n\r\n  // Zero?\r\n  if (!xd[0]) return new Ctor(rm === 3 ? -0 : 0);\r\n\r\n  y.d = xd;\r\n  y.e = getBase10Exponent(xd, e);\r\n\r\n  return external ? finalise(y, pr, rm) : y;\r\n};\r\n\r\n\r\n/*\r\n *   n % 0 =  N\r\n *   n % N =  N\r\n *   n % I =  n\r\n *   0 % n =  0\r\n *  -0 % n = -0\r\n *   0 % 0 =  N\r\n *   0 % N =  N\r\n *   0 % I =  0\r\n *   N % n =  N\r\n *   N % 0 =  N\r\n *   N % N =  N\r\n *   N % I =  N\r\n *   I % n =  N\r\n *   I % 0 =  N\r\n *   I % N =  N\r\n *   I % I =  N\r\n *\r\n * Return a new Decimal whose value is the value of this Decimal modulo `y`, rounded to\r\n * `precision` significant digits using rounding mode `rounding`.\r\n *\r\n * The result depends on the modulo mode.\r\n *\r\n */\r\nP.modulo = P.mod = function (y) {\r\n  var q,\r\n    x = this,\r\n    Ctor = x.constructor;\r\n\r\n  y = new Ctor(y);\r\n\r\n  // Return NaN if x is ±Infinity or NaN, or y is NaN or ±0.\r\n  if (!x.d || !y.s || y.d && !y.d[0]) return new Ctor(NaN);\r\n\r\n  // Return x if y is ±Infinity or x is ±0.\r\n  if (!y.d || x.d && !x.d[0]) {\r\n    return finalise(new Ctor(x), Ctor.precision, Ctor.rounding);\r\n  }\r\n\r\n  // Prevent rounding of intermediate calculations.\r\n  external = false;\r\n\r\n  if (Ctor.modulo == 9) {\r\n\r\n    // Euclidian division: q = sign(y) * floor(x / abs(y))\r\n    // result = x - q * y    where  0 <= result < abs(y)\r\n    q = divide(x, y.abs(), 0, 3, 1);\r\n    q.s *= y.s;\r\n  } else {\r\n    q = divide(x, y, 0, Ctor.modulo, 1);\r\n  }\r\n\r\n  q = q.times(y);\r\n\r\n  external = true;\r\n\r\n  return x.minus(q);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the natural exponential of the value of this Decimal,\r\n * i.e. the base e raised to the power the value of this Decimal, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n */\r\nP.naturalExponential = P.exp = function () {\r\n  return naturalExponential(this);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the natural logarithm of the value of this Decimal,\r\n * rounded to `precision` significant digits using rounding mode `rounding`.\r\n *\r\n */\r\nP.naturalLogarithm = P.ln = function () {\r\n  return naturalLogarithm(this);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the value of this Decimal negated, i.e. as if multiplied by\r\n * -1.\r\n *\r\n */\r\nP.negated = P.neg = function () {\r\n  var x = new this.constructor(this);\r\n  x.s = -x.s;\r\n  return finalise(x);\r\n};\r\n\r\n\r\n/*\r\n *  n + 0 = n\r\n *  n + N = N\r\n *  n + I = I\r\n *  0 + n = n\r\n *  0 + 0 = 0\r\n *  0 + N = N\r\n *  0 + I = I\r\n *  N + n = N\r\n *  N + 0 = N\r\n *  N + N = N\r\n *  N + I = N\r\n *  I + n = I\r\n *  I + 0 = I\r\n *  I + N = N\r\n *  I + I = I\r\n *\r\n * Return a new Decimal whose value is the value of this Decimal plus `y`, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n */\r\nP.plus = P.add = function (y) {\r\n  var carry, d, e, i, k, len, pr, rm, xd, yd,\r\n    x = this,\r\n    Ctor = x.constructor;\r\n\r\n  y = new Ctor(y);\r\n\r\n  // If either is not finite...\r\n  if (!x.d || !y.d) {\r\n\r\n    // Return NaN if either is NaN.\r\n    if (!x.s || !y.s) y = new Ctor(NaN);\r\n\r\n    // Return x if y is finite and x is ±Infinity.\r\n    // Return x if both are ±Infinity with the same sign.\r\n    // Return NaN if both are ±Infinity with different signs.\r\n    // Return y if x is finite and y is ±Infinity.\r\n    else if (!x.d) y = new Ctor(y.d || x.s === y.s ? x : NaN);\r\n\r\n    return y;\r\n  }\r\n\r\n   // If signs differ...\r\n  if (x.s != y.s) {\r\n    y.s = -y.s;\r\n    return x.minus(y);\r\n  }\r\n\r\n  xd = x.d;\r\n  yd = y.d;\r\n  pr = Ctor.precision;\r\n  rm = Ctor.rounding;\r\n\r\n  // If either is zero...\r\n  if (!xd[0] || !yd[0]) {\r\n\r\n    // Return x if y is zero.\r\n    // Return y if y is non-zero.\r\n    if (!yd[0]) y = new Ctor(x);\r\n\r\n    return external ? finalise(y, pr, rm) : y;\r\n  }\r\n\r\n  // x and y are finite, non-zero numbers with the same sign.\r\n\r\n  // Calculate base 1e7 exponents.\r\n  k = mathfloor(x.e / LOG_BASE);\r\n  e = mathfloor(y.e / LOG_BASE);\r\n\r\n  xd = xd.slice();\r\n  i = k - e;\r\n\r\n  // If base 1e7 exponents differ...\r\n  if (i) {\r\n\r\n    if (i < 0) {\r\n      d = xd;\r\n      i = -i;\r\n      len = yd.length;\r\n    } else {\r\n      d = yd;\r\n      e = k;\r\n      len = xd.length;\r\n    }\r\n\r\n    // Limit number of zeros prepended to max(ceil(pr / LOG_BASE), len) + 1.\r\n    k = Math.ceil(pr / LOG_BASE);\r\n    len = k > len ? k + 1 : len + 1;\r\n\r\n    if (i > len) {\r\n      i = len;\r\n      d.length = 1;\r\n    }\r\n\r\n    // Prepend zeros to equalise exponents. Note: Faster to use reverse then do unshifts.\r\n    d.reverse();\r\n    for (; i--;) d.push(0);\r\n    d.reverse();\r\n  }\r\n\r\n  len = xd.length;\r\n  i = yd.length;\r\n\r\n  // If yd is longer than xd, swap xd and yd so xd points to the longer array.\r\n  if (len - i < 0) {\r\n    i = len;\r\n    d = yd;\r\n    yd = xd;\r\n    xd = d;\r\n  }\r\n\r\n  // Only start adding at yd.length - 1 as the further digits of xd can be left as they are.\r\n  for (carry = 0; i;) {\r\n    carry = (xd[--i] = xd[i] + yd[i] + carry) / BASE | 0;\r\n    xd[i] %= BASE;\r\n  }\r\n\r\n  if (carry) {\r\n    xd.unshift(carry);\r\n    ++e;\r\n  }\r\n\r\n  // Remove trailing zeros.\r\n  // No need to check for zero, as +x + +y != 0 && -x + -y != 0\r\n  for (len = xd.length; xd[--len] == 0;) xd.pop();\r\n\r\n  y.d = xd;\r\n  y.e = getBase10Exponent(xd, e);\r\n\r\n  return external ? finalise(y, pr, rm) : y;\r\n};\r\n\r\n\r\n/*\r\n * Return the number of significant digits of the value of this Decimal.\r\n *\r\n * [z] {boolean|number} Whether to count integer-part trailing zeros: true, false, 1 or 0.\r\n *\r\n */\r\nP.precision = P.sd = function (z) {\r\n  var k,\r\n    x = this;\r\n\r\n  if (z !== void 0 && z !== !!z && z !== 1 && z !== 0) throw Error(invalidArgument + z);\r\n\r\n  if (x.d) {\r\n    k = getPrecision(x.d);\r\n    if (z && x.e + 1 > k) k = x.e + 1;\r\n  } else {\r\n    k = NaN;\r\n  }\r\n\r\n  return k;\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the value of this Decimal rounded to a whole number using\r\n * rounding mode `rounding`.\r\n *\r\n */\r\nP.round = function () {\r\n  var x = this,\r\n    Ctor = x.constructor;\r\n\r\n  return finalise(new Ctor(x), x.e + 1, Ctor.rounding);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the sine of the value in radians of this Decimal.\r\n *\r\n * Domain: [-Infinity, Infinity]\r\n * Range: [-1, 1]\r\n *\r\n * sin(x) = x - x^3/3! + x^5/5! - ...\r\n *\r\n * sin(0)         = 0\r\n * sin(-0)        = -0\r\n * sin(Infinity)  = NaN\r\n * sin(-Infinity) = NaN\r\n * sin(NaN)       = NaN\r\n *\r\n */\r\nP.sine = P.sin = function () {\r\n  var pr, rm,\r\n    x = this,\r\n    Ctor = x.constructor;\r\n\r\n  if (!x.isFinite()) return new Ctor(NaN);\r\n  if (x.isZero()) return new Ctor(x);\r\n\r\n  pr = Ctor.precision;\r\n  rm = Ctor.rounding;\r\n  Ctor.precision = pr + Math.max(x.e, x.sd()) + LOG_BASE;\r\n  Ctor.rounding = 1;\r\n\r\n  x = sine(Ctor, toLessThanHalfPi(Ctor, x));\r\n\r\n  Ctor.precision = pr;\r\n  Ctor.rounding = rm;\r\n\r\n  return finalise(quadrant > 2 ? x.neg() : x, pr, rm, true);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the square root of this Decimal, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n *  sqrt(-n) =  N\r\n *  sqrt(N)  =  N\r\n *  sqrt(-I) =  N\r\n *  sqrt(I)  =  I\r\n *  sqrt(0)  =  0\r\n *  sqrt(-0) = -0\r\n *\r\n */\r\nP.squareRoot = P.sqrt = function () {\r\n  var m, n, sd, r, rep, t,\r\n    x = this,\r\n    d = x.d,\r\n    e = x.e,\r\n    s = x.s,\r\n    Ctor = x.constructor;\r\n\r\n  // Negative/NaN/Infinity/zero?\r\n  if (s !== 1 || !d || !d[0]) {\r\n    return new Ctor(!s || s < 0 && (!d || d[0]) ? NaN : d ? x : 1 / 0);\r\n  }\r\n\r\n  external = false;\r\n\r\n  // Initial estimate.\r\n  s = Math.sqrt(+x);\r\n\r\n  // Math.sqrt underflow/overflow?\r\n  // Pass x to Math.sqrt as integer, then adjust the exponent of the result.\r\n  if (s == 0 || s == 1 / 0) {\r\n    n = digitsToString(d);\r\n\r\n    if ((n.length + e) % 2 == 0) n += '0';\r\n    s = Math.sqrt(n);\r\n    e = mathfloor((e + 1) / 2) - (e < 0 || e % 2);\r\n\r\n    if (s == 1 / 0) {\r\n      n = '5e' + e;\r\n    } else {\r\n      n = s.toExponential();\r\n      n = n.slice(0, n.indexOf('e') + 1) + e;\r\n    }\r\n\r\n    r = new Ctor(n);\r\n  } else {\r\n    r = new Ctor(s.toString());\r\n  }\r\n\r\n  sd = (e = Ctor.precision) + 3;\r\n\r\n  // Newton-Raphson iteration.\r\n  for (;;) {\r\n    t = r;\r\n    r = t.plus(divide(x, t, sd + 2, 1)).times(0.5);\r\n\r\n    // TODO? Replace with for-loop and checkRoundingDigits.\r\n    if (digitsToString(t.d).slice(0, sd) === (n = digitsToString(r.d)).slice(0, sd)) {\r\n      n = n.slice(sd - 3, sd + 1);\r\n\r\n      // The 4th rounding digit may be in error by -1 so if the 4 rounding digits are 9999 or\r\n      // 4999, i.e. approaching a rounding boundary, continue the iteration.\r\n      if (n == '9999' || !rep && n == '4999') {\r\n\r\n        // On the first iteration only, check to see if rounding up gives the exact result as the\r\n        // nines may infinitely repeat.\r\n        if (!rep) {\r\n          finalise(t, e + 1, 0);\r\n\r\n          if (t.times(t).eq(x)) {\r\n            r = t;\r\n            break;\r\n          }\r\n        }\r\n\r\n        sd += 4;\r\n        rep = 1;\r\n      } else {\r\n\r\n        // If the rounding digits are null, 0{0,4} or 50{0,3}, check for an exact result.\r\n        // If not, then there are further digits and m will be truthy.\r\n        if (!+n || !+n.slice(1) && n.charAt(0) == '5') {\r\n\r\n          // Truncate to the first rounding digit.\r\n          finalise(r, e + 1, 1);\r\n          m = !r.times(r).eq(x);\r\n        }\r\n\r\n        break;\r\n      }\r\n    }\r\n  }\r\n\r\n  external = true;\r\n\r\n  return finalise(r, e, Ctor.rounding, m);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the tangent of the value in radians of this Decimal.\r\n *\r\n * Domain: [-Infinity, Infinity]\r\n * Range: [-Infinity, Infinity]\r\n *\r\n * tan(0)         = 0\r\n * tan(-0)        = -0\r\n * tan(Infinity)  = NaN\r\n * tan(-Infinity) = NaN\r\n * tan(NaN)       = NaN\r\n *\r\n */\r\nP.tangent = P.tan = function () {\r\n  var pr, rm,\r\n    x = this,\r\n    Ctor = x.constructor;\r\n\r\n  if (!x.isFinite()) return new Ctor(NaN);\r\n  if (x.isZero()) return new Ctor(x);\r\n\r\n  pr = Ctor.precision;\r\n  rm = Ctor.rounding;\r\n  Ctor.precision = pr + 10;\r\n  Ctor.rounding = 1;\r\n\r\n  x = x.sin();\r\n  x.s = 1;\r\n  x = divide(x, new Ctor(1).minus(x.times(x)).sqrt(), pr + 10, 0);\r\n\r\n  Ctor.precision = pr;\r\n  Ctor.rounding = rm;\r\n\r\n  return finalise(quadrant == 2 || quadrant == 4 ? x.neg() : x, pr, rm, true);\r\n};\r\n\r\n\r\n/*\r\n *  n * 0 = 0\r\n *  n * N = N\r\n *  n * I = I\r\n *  0 * n = 0\r\n *  0 * 0 = 0\r\n *  0 * N = N\r\n *  0 * I = N\r\n *  N * n = N\r\n *  N * 0 = N\r\n *  N * N = N\r\n *  N * I = N\r\n *  I * n = I\r\n *  I * 0 = N\r\n *  I * N = N\r\n *  I * I = I\r\n *\r\n * Return a new Decimal whose value is this Decimal times `y`, rounded to `precision` significant\r\n * digits using rounding mode `rounding`.\r\n *\r\n */\r\nP.times = P.mul = function (y) {\r\n  var carry, e, i, k, r, rL, t, xdL, ydL,\r\n    x = this,\r\n    Ctor = x.constructor,\r\n    xd = x.d,\r\n    yd = (y = new Ctor(y)).d;\r\n\r\n  y.s *= x.s;\r\n\r\n   // If either is NaN, ±Infinity or ±0...\r\n  if (!xd || !xd[0] || !yd || !yd[0]) {\r\n\r\n    return new Ctor(!y.s || xd && !xd[0] && !yd || yd && !yd[0] && !xd\r\n\r\n      // Return NaN if either is NaN.\r\n      // Return NaN if x is ±0 and y is ±Infinity, or y is ±0 and x is ±Infinity.\r\n      ? NaN\r\n\r\n      // Return ±Infinity if either is ±Infinity.\r\n      // Return ±0 if either is ±0.\r\n      : !xd || !yd ? y.s / 0 : y.s * 0);\r\n  }\r\n\r\n  e = mathfloor(x.e / LOG_BASE) + mathfloor(y.e / LOG_BASE);\r\n  xdL = xd.length;\r\n  ydL = yd.length;\r\n\r\n  // Ensure xd points to the longer array.\r\n  if (xdL < ydL) {\r\n    r = xd;\r\n    xd = yd;\r\n    yd = r;\r\n    rL = xdL;\r\n    xdL = ydL;\r\n    ydL = rL;\r\n  }\r\n\r\n  // Initialise the result array with zeros.\r\n  r = [];\r\n  rL = xdL + ydL;\r\n  for (i = rL; i--;) r.push(0);\r\n\r\n  // Multiply!\r\n  for (i = ydL; --i >= 0;) {\r\n    carry = 0;\r\n    for (k = xdL + i; k > i;) {\r\n      t = r[k] + yd[i] * xd[k - i - 1] + carry;\r\n      r[k--] = t % BASE | 0;\r\n      carry = t / BASE | 0;\r\n    }\r\n\r\n    r[k] = (r[k] + carry) % BASE | 0;\r\n  }\r\n\r\n  // Remove trailing zeros.\r\n  for (; !r[--rL];) r.pop();\r\n\r\n  if (carry) ++e;\r\n  else r.shift();\r\n\r\n  y.d = r;\r\n  y.e = getBase10Exponent(r, e);\r\n\r\n  return external ? finalise(y, Ctor.precision, Ctor.rounding) : y;\r\n};\r\n\r\n\r\n/*\r\n * Return a string representing the value of this Decimal in base 2, round to `sd` significant\r\n * digits using rounding mode `rm`.\r\n *\r\n * If the optional `sd` argument is present then return binary exponential notation.\r\n *\r\n * [sd] {number} Significant digits. Integer, 1 to MAX_DIGITS inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n */\r\nP.toBinary = function (sd, rm) {\r\n  return toStringBinary(this, 2, sd, rm);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the value of this Decimal rounded to a maximum of `dp`\r\n * decimal places using rounding mode `rm` or `rounding` if `rm` is omitted.\r\n *\r\n * If `dp` is omitted, return a new Decimal whose value is the value of this Decimal.\r\n *\r\n * [dp] {number} Decimal places. Integer, 0 to MAX_DIGITS inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n */\r\nP.toDecimalPlaces = P.toDP = function (dp, rm) {\r\n  var x = this,\r\n    Ctor = x.constructor;\r\n\r\n  x = new Ctor(x);\r\n  if (dp === void 0) return x;\r\n\r\n  checkInt32(dp, 0, MAX_DIGITS);\r\n\r\n  if (rm === void 0) rm = Ctor.rounding;\r\n  else checkInt32(rm, 0, 8);\r\n\r\n  return finalise(x, dp + x.e + 1, rm);\r\n};\r\n\r\n\r\n/*\r\n * Return a string representing the value of this Decimal in exponential notation rounded to\r\n * `dp` fixed decimal places using rounding mode `rounding`.\r\n *\r\n * [dp] {number} Decimal places. Integer, 0 to MAX_DIGITS inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n */\r\nP.toExponential = function (dp, rm) {\r\n  var str,\r\n    x = this,\r\n    Ctor = x.constructor;\r\n\r\n  if (dp === void 0) {\r\n    str = finiteToString(x, true);\r\n  } else {\r\n    checkInt32(dp, 0, MAX_DIGITS);\r\n\r\n    if (rm === void 0) rm = Ctor.rounding;\r\n    else checkInt32(rm, 0, 8);\r\n\r\n    x = finalise(new Ctor(x), dp + 1, rm);\r\n    str = finiteToString(x, true, dp + 1);\r\n  }\r\n\r\n  return x.isNeg() && !x.isZero() ? '-' + str : str;\r\n};\r\n\r\n\r\n/*\r\n * Return a string representing the value of this Decimal in normal (fixed-point) notation to\r\n * `dp` fixed decimal places and rounded using rounding mode `rm` or `rounding` if `rm` is\r\n * omitted.\r\n *\r\n * As with JavaScript numbers, (-0).toFixed(0) is '0', but e.g. (-0.00001).toFixed(0) is '-0'.\r\n *\r\n * [dp] {number} Decimal places. Integer, 0 to MAX_DIGITS inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n * (-0).toFixed(0) is '0', but (-0.1).toFixed(0) is '-0'.\r\n * (-0).toFixed(1) is '0.0', but (-0.01).toFixed(1) is '-0.0'.\r\n * (-0).toFixed(3) is '0.000'.\r\n * (-0.5).toFixed(0) is '-0'.\r\n *\r\n */\r\nP.toFixed = function (dp, rm) {\r\n  var str, y,\r\n    x = this,\r\n    Ctor = x.constructor;\r\n\r\n  if (dp === void 0) {\r\n    str = finiteToString(x);\r\n  } else {\r\n    checkInt32(dp, 0, MAX_DIGITS);\r\n\r\n    if (rm === void 0) rm = Ctor.rounding;\r\n    else checkInt32(rm, 0, 8);\r\n\r\n    y = finalise(new Ctor(x), dp + x.e + 1, rm);\r\n    str = finiteToString(y, false, dp + y.e + 1);\r\n  }\r\n\r\n  // To determine whether to add the minus sign look at the value before it was rounded,\r\n  // i.e. look at `x` rather than `y`.\r\n  return x.isNeg() && !x.isZero() ? '-' + str : str;\r\n};\r\n\r\n\r\n/*\r\n * Return an array representing the value of this Decimal as a simple fraction with an integer\r\n * numerator and an integer denominator.\r\n *\r\n * The denominator will be a positive non-zero value less than or equal to the specified maximum\r\n * denominator. If a maximum denominator is not specified, the denominator will be the lowest\r\n * value necessary to represent the number exactly.\r\n *\r\n * [maxD] {number|string|Decimal} Maximum denominator. Integer >= 1 and < Infinity.\r\n *\r\n */\r\nP.toFraction = function (maxD) {\r\n  var d, d0, d1, d2, e, k, n, n0, n1, pr, q, r,\r\n    x = this,\r\n    xd = x.d,\r\n    Ctor = x.constructor;\r\n\r\n  if (!xd) return new Ctor(x);\r\n\r\n  n1 = d0 = new Ctor(1);\r\n  d1 = n0 = new Ctor(0);\r\n\r\n  d = new Ctor(d1);\r\n  e = d.e = getPrecision(xd) - x.e - 1;\r\n  k = e % LOG_BASE;\r\n  d.d[0] = mathpow(10, k < 0 ? LOG_BASE + k : k);\r\n\r\n  if (maxD == null) {\r\n\r\n    // d is 10**e, the minimum max-denominator needed.\r\n    maxD = e > 0 ? d : n1;\r\n  } else {\r\n    n = new Ctor(maxD);\r\n    if (!n.isInt() || n.lt(n1)) throw Error(invalidArgument + n);\r\n    maxD = n.gt(d) ? (e > 0 ? d : n1) : n;\r\n  }\r\n\r\n  external = false;\r\n  n = new Ctor(digitsToString(xd));\r\n  pr = Ctor.precision;\r\n  Ctor.precision = e = xd.length * LOG_BASE * 2;\r\n\r\n  for (;;)  {\r\n    q = divide(n, d, 0, 1, 1);\r\n    d2 = d0.plus(q.times(d1));\r\n    if (d2.cmp(maxD) == 1) break;\r\n    d0 = d1;\r\n    d1 = d2;\r\n    d2 = n1;\r\n    n1 = n0.plus(q.times(d2));\r\n    n0 = d2;\r\n    d2 = d;\r\n    d = n.minus(q.times(d2));\r\n    n = d2;\r\n  }\r\n\r\n  d2 = divide(maxD.minus(d0), d1, 0, 1, 1);\r\n  n0 = n0.plus(d2.times(n1));\r\n  d0 = d0.plus(d2.times(d1));\r\n  n0.s = n1.s = x.s;\r\n\r\n  // Determine which fraction is closer to x, n0/d0 or n1/d1?\r\n  r = divide(n1, d1, e, 1).minus(x).abs().cmp(divide(n0, d0, e, 1).minus(x).abs()) < 1\r\n      ? [n1, d1] : [n0, d0];\r\n\r\n  Ctor.precision = pr;\r\n  external = true;\r\n\r\n  return r;\r\n};\r\n\r\n\r\n/*\r\n * Return a string representing the value of this Decimal in base 16, round to `sd` significant\r\n * digits using rounding mode `rm`.\r\n *\r\n * If the optional `sd` argument is present then return binary exponential notation.\r\n *\r\n * [sd] {number} Significant digits. Integer, 1 to MAX_DIGITS inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n */\r\nP.toHexadecimal = P.toHex = function (sd, rm) {\r\n  return toStringBinary(this, 16, sd, rm);\r\n};\r\n\r\n\r\n/*\r\n * Returns a new Decimal whose value is the nearest multiple of `y` in the direction of rounding\r\n * mode `rm`, or `Decimal.rounding` if `rm` is omitted, to the value of this Decimal.\r\n *\r\n * The return value will always have the same sign as this Decimal, unless either this Decimal\r\n * or `y` is NaN, in which case the return value will be also be NaN.\r\n *\r\n * The return value is not affected by the value of `precision`.\r\n *\r\n * y {number|string|Decimal} The magnitude to round to a multiple of.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n * 'toNearest() rounding mode not an integer: {rm}'\r\n * 'toNearest() rounding mode out of range: {rm}'\r\n *\r\n */\r\nP.toNearest = function (y, rm) {\r\n  var x = this,\r\n    Ctor = x.constructor;\r\n\r\n  x = new Ctor(x);\r\n\r\n  if (y == null) {\r\n\r\n    // If x is not finite, return x.\r\n    if (!x.d) return x;\r\n\r\n    y = new Ctor(1);\r\n    rm = Ctor.rounding;\r\n  } else {\r\n    y = new Ctor(y);\r\n    if (rm === void 0) {\r\n      rm = Ctor.rounding;\r\n    } else {\r\n      checkInt32(rm, 0, 8);\r\n    }\r\n\r\n    // If x is not finite, return x if y is not NaN, else NaN.\r\n    if (!x.d) return y.s ? x : y;\r\n\r\n    // If y is not finite, return Infinity with the sign of x if y is Infinity, else NaN.\r\n    if (!y.d) {\r\n      if (y.s) y.s = x.s;\r\n      return y;\r\n    }\r\n  }\r\n\r\n  // If y is not zero, calculate the nearest multiple of y to x.\r\n  if (y.d[0]) {\r\n    external = false;\r\n    x = divide(x, y, 0, rm, 1).times(y);\r\n    external = true;\r\n    finalise(x);\r\n\r\n  // If y is zero, return zero with the sign of x.\r\n  } else {\r\n    y.s = x.s;\r\n    x = y;\r\n  }\r\n\r\n  return x;\r\n};\r\n\r\n\r\n/*\r\n * Return the value of this Decimal converted to a number primitive.\r\n * Zero keeps its sign.\r\n *\r\n */\r\nP.toNumber = function () {\r\n  return +this;\r\n};\r\n\r\n\r\n/*\r\n * Return a string representing the value of this Decimal in base 8, round to `sd` significant\r\n * digits using rounding mode `rm`.\r\n *\r\n * If the optional `sd` argument is present then return binary exponential notation.\r\n *\r\n * [sd] {number} Significant digits. Integer, 1 to MAX_DIGITS inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n */\r\nP.toOctal = function (sd, rm) {\r\n  return toStringBinary(this, 8, sd, rm);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the value of this Decimal raised to the power `y`, rounded\r\n * to `precision` significant digits using rounding mode `rounding`.\r\n *\r\n * ECMAScript compliant.\r\n *\r\n *   pow(x, NaN)                           = NaN\r\n *   pow(x, ±0)                            = 1\r\n\r\n *   pow(NaN, non-zero)                    = NaN\r\n *   pow(abs(x) > 1, +Infinity)            = +Infinity\r\n *   pow(abs(x) > 1, -Infinity)            = +0\r\n *   pow(abs(x) == 1, ±Infinity)           = NaN\r\n *   pow(abs(x) < 1, +Infinity)            = +0\r\n *   pow(abs(x) < 1, -Infinity)            = +Infinity\r\n *   pow(+Infinity, y > 0)                 = +Infinity\r\n *   pow(+Infinity, y < 0)                 = +0\r\n *   pow(-Infinity, odd integer > 0)       = -Infinity\r\n *   pow(-Infinity, even integer > 0)      = +Infinity\r\n *   pow(-Infinity, odd integer < 0)       = -0\r\n *   pow(-Infinity, even integer < 0)      = +0\r\n *   pow(+0, y > 0)                        = +0\r\n *   pow(+0, y < 0)                        = +Infinity\r\n *   pow(-0, odd integer > 0)              = -0\r\n *   pow(-0, even integer > 0)             = +0\r\n *   pow(-0, odd integer < 0)              = -Infinity\r\n *   pow(-0, even integer < 0)             = +Infinity\r\n *   pow(finite x < 0, finite non-integer) = NaN\r\n *\r\n * For non-integer or very large exponents pow(x, y) is calculated using\r\n *\r\n *   x^y = exp(y*ln(x))\r\n *\r\n * Assuming the first 15 rounding digits are each equally likely to be any digit 0-9, the\r\n * probability of an incorrectly rounded result\r\n * P([49]9{14} | [50]0{14}) = 2 * 0.2 * 10^-14 = 4e-15 = 1/2.5e+14\r\n * i.e. 1 in 250,000,000,000,000\r\n *\r\n * If a result is incorrectly rounded the maximum error will be 1 ulp (unit in last place).\r\n *\r\n * y {number|string|Decimal} The power to which to raise this Decimal.\r\n *\r\n */\r\nP.toPower = P.pow = function (y) {\r\n  var e, k, pr, r, rm, s,\r\n    x = this,\r\n    Ctor = x.constructor,\r\n    yn = +(y = new Ctor(y));\r\n\r\n  // Either ±Infinity, NaN or ±0?\r\n  if (!x.d || !y.d || !x.d[0] || !y.d[0]) return new Ctor(mathpow(+x, yn));\r\n\r\n  x = new Ctor(x);\r\n\r\n  if (x.eq(1)) return x;\r\n\r\n  pr = Ctor.precision;\r\n  rm = Ctor.rounding;\r\n\r\n  if (y.eq(1)) return finalise(x, pr, rm);\r\n\r\n  // y exponent\r\n  e = mathfloor(y.e / LOG_BASE);\r\n\r\n  // If y is a small integer use the 'exponentiation by squaring' algorithm.\r\n  if (e >= y.d.length - 1 && (k = yn < 0 ? -yn : yn) <= MAX_SAFE_INTEGER) {\r\n    r = intPow(Ctor, x, k, pr);\r\n    return y.s < 0 ? new Ctor(1).div(r) : finalise(r, pr, rm);\r\n  }\r\n\r\n  s = x.s;\r\n\r\n  // if x is negative\r\n  if (s < 0) {\r\n\r\n    // if y is not an integer\r\n    if (e < y.d.length - 1) return new Ctor(NaN);\r\n\r\n    // Result is positive if x is negative and the last digit of integer y is even.\r\n    if ((y.d[e] & 1) == 0) s = 1;\r\n\r\n    // if x.eq(-1)\r\n    if (x.e == 0 && x.d[0] == 1 && x.d.length == 1) {\r\n      x.s = s;\r\n      return x;\r\n    }\r\n  }\r\n\r\n  // Estimate result exponent.\r\n  // x^y = 10^e,  where e = y * log10(x)\r\n  // log10(x) = log10(x_significand) + x_exponent\r\n  // log10(x_significand) = ln(x_significand) / ln(10)\r\n  k = mathpow(+x, yn);\r\n  e = k == 0 || !isFinite(k)\r\n    ? mathfloor(yn * (Math.log('0.' + digitsToString(x.d)) / Math.LN10 + x.e + 1))\r\n    : new Ctor(k + '').e;\r\n\r\n  // Exponent estimate may be incorrect e.g. x: 0.999999999999999999, y: 2.29, e: 0, r.e: -1.\r\n\r\n  // Overflow/underflow?\r\n  if (e > Ctor.maxE + 1 || e < Ctor.minE - 1) return new Ctor(e > 0 ? s / 0 : 0);\r\n\r\n  external = false;\r\n  Ctor.rounding = x.s = 1;\r\n\r\n  // Estimate the extra guard digits needed to ensure five correct rounding digits from\r\n  // naturalLogarithm(x). Example of failure without these extra digits (precision: 10):\r\n  // new Decimal(2.32456).pow('2087987436534566.46411')\r\n  // should be 1.162377823e+764914905173815, but is 1.162355823e+764914905173815\r\n  k = Math.min(12, (e + '').length);\r\n\r\n  // r = x^y = exp(y*ln(x))\r\n  r = naturalExponential(y.times(naturalLogarithm(x, pr + k)), pr);\r\n\r\n  // r may be Infinity, e.g. (0.9999999999999999).pow(-1e+40)\r\n  if (r.d) {\r\n\r\n    // Truncate to the required precision plus five rounding digits.\r\n    r = finalise(r, pr + 5, 1);\r\n\r\n    // If the rounding digits are [49]9999 or [50]0000 increase the precision by 10 and recalculate\r\n    // the result.\r\n    if (checkRoundingDigits(r.d, pr, rm)) {\r\n      e = pr + 10;\r\n\r\n      // Truncate to the increased precision plus five rounding digits.\r\n      r = finalise(naturalExponential(y.times(naturalLogarithm(x, e + k)), e), e + 5, 1);\r\n\r\n      // Check for 14 nines from the 2nd rounding digit (the first rounding digit may be 4 or 9).\r\n      if (+digitsToString(r.d).slice(pr + 1, pr + 15) + 1 == 1e14) {\r\n        r = finalise(r, pr + 1, 0);\r\n      }\r\n    }\r\n  }\r\n\r\n  r.s = s;\r\n  external = true;\r\n  Ctor.rounding = rm;\r\n\r\n  return finalise(r, pr, rm);\r\n};\r\n\r\n\r\n/*\r\n * Return a string representing the value of this Decimal rounded to `sd` significant digits\r\n * using rounding mode `rounding`.\r\n *\r\n * Return exponential notation if `sd` is less than the number of digits necessary to represent\r\n * the integer part of the value in normal notation.\r\n *\r\n * [sd] {number} Significant digits. Integer, 1 to MAX_DIGITS inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n */\r\nP.toPrecision = function (sd, rm) {\r\n  var str,\r\n    x = this,\r\n    Ctor = x.constructor;\r\n\r\n  if (sd === void 0) {\r\n    str = finiteToString(x, x.e <= Ctor.toExpNeg || x.e >= Ctor.toExpPos);\r\n  } else {\r\n    checkInt32(sd, 1, MAX_DIGITS);\r\n\r\n    if (rm === void 0) rm = Ctor.rounding;\r\n    else checkInt32(rm, 0, 8);\r\n\r\n    x = finalise(new Ctor(x), sd, rm);\r\n    str = finiteToString(x, sd <= x.e || x.e <= Ctor.toExpNeg, sd);\r\n  }\r\n\r\n  return x.isNeg() && !x.isZero() ? '-' + str : str;\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the value of this Decimal rounded to a maximum of `sd`\r\n * significant digits using rounding mode `rm`, or to `precision` and `rounding` respectively if\r\n * omitted.\r\n *\r\n * [sd] {number} Significant digits. Integer, 1 to MAX_DIGITS inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n * 'toSD() digits out of range: {sd}'\r\n * 'toSD() digits not an integer: {sd}'\r\n * 'toSD() rounding mode not an integer: {rm}'\r\n * 'toSD() rounding mode out of range: {rm}'\r\n *\r\n */\r\nP.toSignificantDigits = P.toSD = function (sd, rm) {\r\n  var x = this,\r\n    Ctor = x.constructor;\r\n\r\n  if (sd === void 0) {\r\n    sd = Ctor.precision;\r\n    rm = Ctor.rounding;\r\n  } else {\r\n    checkInt32(sd, 1, MAX_DIGITS);\r\n\r\n    if (rm === void 0) rm = Ctor.rounding;\r\n    else checkInt32(rm, 0, 8);\r\n  }\r\n\r\n  return finalise(new Ctor(x), sd, rm);\r\n};\r\n\r\n\r\n/*\r\n * Return a string representing the value of this Decimal.\r\n *\r\n * Return exponential notation if this Decimal has a positive exponent equal to or greater than\r\n * `toExpPos`, or a negative exponent equal to or less than `toExpNeg`.\r\n *\r\n */\r\nP.toString = function () {\r\n  var x = this,\r\n    Ctor = x.constructor,\r\n    str = finiteToString(x, x.e <= Ctor.toExpNeg || x.e >= Ctor.toExpPos);\r\n\r\n  return x.isNeg() && !x.isZero() ? '-' + str : str;\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the value of this Decimal truncated to a whole number.\r\n *\r\n */\r\nP.truncated = P.trunc = function () {\r\n  return finalise(new this.constructor(this), this.e + 1, 1);\r\n};\r\n\r\n\r\n/*\r\n * Return a string representing the value of this Decimal.\r\n * Unlike `toString`, negative zero will include the minus sign.\r\n *\r\n */\r\nP.valueOf = P.toJSON = function () {\r\n  var x = this,\r\n    Ctor = x.constructor,\r\n    str = finiteToString(x, x.e <= Ctor.toExpNeg || x.e >= Ctor.toExpPos);\r\n\r\n  return x.isNeg() ? '-' + str : str;\r\n};\r\n\r\n\r\n// Helper functions for Decimal.prototype (P) and/or Decimal methods, and their callers.\r\n\r\n\r\n/*\r\n *  digitsToString           P.cubeRoot, P.logarithm, P.squareRoot, P.toFraction, P.toPower,\r\n *                           finiteToString, naturalExponential, naturalLogarithm\r\n *  checkInt32               P.toDecimalPlaces, P.toExponential, P.toFixed, P.toNearest,\r\n *                           P.toPrecision, P.toSignificantDigits, toStringBinary, random\r\n *  checkRoundingDigits      P.logarithm, P.toPower, naturalExponential, naturalLogarithm\r\n *  convertBase              toStringBinary, parseOther\r\n *  cos                      P.cos\r\n *  divide                   P.atanh, P.cubeRoot, P.dividedBy, P.dividedToIntegerBy,\r\n *                           P.logarithm, P.modulo, P.squareRoot, P.tan, P.tanh, P.toFraction,\r\n *                           P.toNearest, toStringBinary, naturalExponential, naturalLogarithm,\r\n *                           taylorSeries, atan2, parseOther\r\n *  finalise                 P.absoluteValue, P.atan, P.atanh, P.ceil, P.cos, P.cosh,\r\n *                           P.cubeRoot, P.dividedToIntegerBy, P.floor, P.logarithm, P.minus,\r\n *                           P.modulo, P.negated, P.plus, P.round, P.sin, P.sinh, P.squareRoot,\r\n *                           P.tan, P.times, P.toDecimalPlaces, P.toExponential, P.toFixed,\r\n *                           P.toNearest, P.toPower, P.toPrecision, P.toSignificantDigits,\r\n *                           P.truncated, divide, getLn10, getPi, naturalExponential,\r\n *                           naturalLogarithm, ceil, floor, round, trunc\r\n *  finiteToString           P.toExponential, P.toFixed, P.toPrecision, P.toString, P.valueOf,\r\n *                           toStringBinary\r\n *  getBase10Exponent        P.minus, P.plus, P.times, parseOther\r\n *  getLn10                  P.logarithm, naturalLogarithm\r\n *  getPi                    P.acos, P.asin, P.atan, toLessThanHalfPi, atan2\r\n *  getPrecision             P.precision, P.toFraction\r\n *  getZeroString            digitsToString, finiteToString\r\n *  intPow                   P.toPower, parseOther\r\n *  isOdd                    toLessThanHalfPi\r\n *  maxOrMin                 max, min\r\n *  naturalExponential       P.naturalExponential, P.toPower\r\n *  naturalLogarithm         P.acosh, P.asinh, P.atanh, P.logarithm, P.naturalLogarithm,\r\n *                           P.toPower, naturalExponential\r\n *  nonFiniteToString        finiteToString, toStringBinary\r\n *  parseDecimal             Decimal\r\n *  parseOther               Decimal\r\n *  sin                      P.sin\r\n *  taylorSeries             P.cosh, P.sinh, cos, sin\r\n *  toLessThanHalfPi         P.cos, P.sin\r\n *  toStringBinary           P.toBinary, P.toHexadecimal, P.toOctal\r\n *  truncate                 intPow\r\n *\r\n *  Throws:                  P.logarithm, P.precision, P.toFraction, checkInt32, getLn10, getPi,\r\n *                           naturalLogarithm, config, parseOther, random, Decimal\r\n */\r\n\r\n\r\nfunction digitsToString(d) {\r\n  var i, k, ws,\r\n    indexOfLastWord = d.length - 1,\r\n    str = '',\r\n    w = d[0];\r\n\r\n  if (indexOfLastWord > 0) {\r\n    str += w;\r\n    for (i = 1; i < indexOfLastWord; i++) {\r\n      ws = d[i] + '';\r\n      k = LOG_BASE - ws.length;\r\n      if (k) str += getZeroString(k);\r\n      str += ws;\r\n    }\r\n\r\n    w = d[i];\r\n    ws = w + '';\r\n    k = LOG_BASE - ws.length;\r\n    if (k) str += getZeroString(k);\r\n  } else if (w === 0) {\r\n    return '0';\r\n  }\r\n\r\n  // Remove trailing zeros of last w.\r\n  for (; w % 10 === 0;) w /= 10;\r\n\r\n  return str + w;\r\n}\r\n\r\n\r\nfunction checkInt32(i, min, max) {\r\n  if (i !== ~~i || i < min || i > max) {\r\n    throw Error(invalidArgument + i);\r\n  }\r\n}\r\n\r\n\r\n/*\r\n * Check 5 rounding digits if `repeating` is null, 4 otherwise.\r\n * `repeating == null` if caller is `log` or `pow`,\r\n * `repeating != null` if caller is `naturalLogarithm` or `naturalExponential`.\r\n */\r\nfunction checkRoundingDigits(d, i, rm, repeating) {\r\n  var di, k, r, rd;\r\n\r\n  // Get the length of the first word of the array d.\r\n  for (k = d[0]; k >= 10; k /= 10) --i;\r\n\r\n  // Is the rounding digit in the first word of d?\r\n  if (--i < 0) {\r\n    i += LOG_BASE;\r\n    di = 0;\r\n  } else {\r\n    di = Math.ceil((i + 1) / LOG_BASE);\r\n    i %= LOG_BASE;\r\n  }\r\n\r\n  // i is the index (0 - 6) of the rounding digit.\r\n  // E.g. if within the word 3487563 the first rounding digit is 5,\r\n  // then i = 4, k = 1000, rd = 3487563 % 1000 = 563\r\n  k = mathpow(10, LOG_BASE - i);\r\n  rd = d[di] % k | 0;\r\n\r\n  if (repeating == null) {\r\n    if (i < 3) {\r\n      if (i == 0) rd = rd / 100 | 0;\r\n      else if (i == 1) rd = rd / 10 | 0;\r\n      r = rm < 4 && rd == 99999 || rm > 3 && rd == 49999 || rd == 50000 || rd == 0;\r\n    } else {\r\n      r = (rm < 4 && rd + 1 == k || rm > 3 && rd + 1 == k / 2) &&\r\n        (d[di + 1] / k / 100 | 0) == mathpow(10, i - 2) - 1 ||\r\n          (rd == k / 2 || rd == 0) && (d[di + 1] / k / 100 | 0) == 0;\r\n    }\r\n  } else {\r\n    if (i < 4) {\r\n      if (i == 0) rd = rd / 1000 | 0;\r\n      else if (i == 1) rd = rd / 100 | 0;\r\n      else if (i == 2) rd = rd / 10 | 0;\r\n      r = (repeating || rm < 4) && rd == 9999 || !repeating && rm > 3 && rd == 4999;\r\n    } else {\r\n      r = ((repeating || rm < 4) && rd + 1 == k ||\r\n      (!repeating && rm > 3) && rd + 1 == k / 2) &&\r\n        (d[di + 1] / k / 1000 | 0) == mathpow(10, i - 3) - 1;\r\n    }\r\n  }\r\n\r\n  return r;\r\n}\r\n\r\n\r\n// Convert string of `baseIn` to an array of numbers of `baseOut`.\r\n// Eg. convertBase('255', 10, 16) returns [15, 15].\r\n// Eg. convertBase('ff', 16, 10) returns [2, 5, 5].\r\nfunction convertBase(str, baseIn, baseOut) {\r\n  var j,\r\n    arr = [0],\r\n    arrL,\r\n    i = 0,\r\n    strL = str.length;\r\n\r\n  for (; i < strL;) {\r\n    for (arrL = arr.length; arrL--;) arr[arrL] *= baseIn;\r\n    arr[0] += NUMERALS.indexOf(str.charAt(i++));\r\n    for (j = 0; j < arr.length; j++) {\r\n      if (arr[j] > baseOut - 1) {\r\n        if (arr[j + 1] === void 0) arr[j + 1] = 0;\r\n        arr[j + 1] += arr[j] / baseOut | 0;\r\n        arr[j] %= baseOut;\r\n      }\r\n    }\r\n  }\r\n\r\n  return arr.reverse();\r\n}\r\n\r\n\r\n/*\r\n * cos(x) = 1 - x^2/2! + x^4/4! - ...\r\n * |x| < pi/2\r\n *\r\n */\r\nfunction cosine(Ctor, x) {\r\n  var k, len, y;\r\n\r\n  if (x.isZero()) return x;\r\n\r\n  // Argument reduction: cos(4x) = 8*(cos^4(x) - cos^2(x)) + 1\r\n  // i.e. cos(x) = 8*(cos^4(x/4) - cos^2(x/4)) + 1\r\n\r\n  // Estimate the optimum number of times to use the argument reduction.\r\n  len = x.d.length;\r\n  if (len < 32) {\r\n    k = Math.ceil(len / 3);\r\n    y = (1 / tinyPow(4, k)).toString();\r\n  } else {\r\n    k = 16;\r\n    y = '2.3283064365386962890625e-10';\r\n  }\r\n\r\n  Ctor.precision += k;\r\n\r\n  x = taylorSeries(Ctor, 1, x.times(y), new Ctor(1));\r\n\r\n  // Reverse argument reduction\r\n  for (var i = k; i--;) {\r\n    var cos2x = x.times(x);\r\n    x = cos2x.times(cos2x).minus(cos2x).times(8).plus(1);\r\n  }\r\n\r\n  Ctor.precision -= k;\r\n\r\n  return x;\r\n}\r\n\r\n\r\n/*\r\n * Perform division in the specified base.\r\n */\r\nvar divide = (function () {\r\n\r\n  // Assumes non-zero x and k, and hence non-zero result.\r\n  function multiplyInteger(x, k, base) {\r\n    var temp,\r\n      carry = 0,\r\n      i = x.length;\r\n\r\n    for (x = x.slice(); i--;) {\r\n      temp = x[i] * k + carry;\r\n      x[i] = temp % base | 0;\r\n      carry = temp / base | 0;\r\n    }\r\n\r\n    if (carry) x.unshift(carry);\r\n\r\n    return x;\r\n  }\r\n\r\n  function compare(a, b, aL, bL) {\r\n    var i, r;\r\n\r\n    if (aL != bL) {\r\n      r = aL > bL ? 1 : -1;\r\n    } else {\r\n      for (i = r = 0; i < aL; i++) {\r\n        if (a[i] != b[i]) {\r\n          r = a[i] > b[i] ? 1 : -1;\r\n          break;\r\n        }\r\n      }\r\n    }\r\n\r\n    return r;\r\n  }\r\n\r\n  function subtract(a, b, aL, base) {\r\n    var i = 0;\r\n\r\n    // Subtract b from a.\r\n    for (; aL--;) {\r\n      a[aL] -= i;\r\n      i = a[aL] < b[aL] ? 1 : 0;\r\n      a[aL] = i * base + a[aL] - b[aL];\r\n    }\r\n\r\n    // Remove leading zeros.\r\n    for (; !a[0] && a.length > 1;) a.shift();\r\n  }\r\n\r\n  return function (x, y, pr, rm, dp, base) {\r\n    var cmp, e, i, k, logBase, more, prod, prodL, q, qd, rem, remL, rem0, sd, t, xi, xL, yd0,\r\n      yL, yz,\r\n      Ctor = x.constructor,\r\n      sign = x.s == y.s ? 1 : -1,\r\n      xd = x.d,\r\n      yd = y.d;\r\n\r\n    // Either NaN, Infinity or 0?\r\n    if (!xd || !xd[0] || !yd || !yd[0]) {\r\n\r\n      return new Ctor(// Return NaN if either NaN, or both Infinity or 0.\r\n        !x.s || !y.s || (xd ? yd && xd[0] == yd[0] : !yd) ? NaN :\r\n\r\n        // Return ±0 if x is 0 or y is ±Infinity, or return ±Infinity as y is 0.\r\n        xd && xd[0] == 0 || !yd ? sign * 0 : sign / 0);\r\n    }\r\n\r\n    if (base) {\r\n      logBase = 1;\r\n      e = x.e - y.e;\r\n    } else {\r\n      base = BASE;\r\n      logBase = LOG_BASE;\r\n      e = mathfloor(x.e / logBase) - mathfloor(y.e / logBase);\r\n    }\r\n\r\n    yL = yd.length;\r\n    xL = xd.length;\r\n    q = new Ctor(sign);\r\n    qd = q.d = [];\r\n\r\n    // Result exponent may be one less than e.\r\n    // The digit array of a Decimal from toStringBinary may have trailing zeros.\r\n    for (i = 0; yd[i] == (xd[i] || 0); i++);\r\n\r\n    if (yd[i] > (xd[i] || 0)) e--;\r\n\r\n    if (pr == null) {\r\n      sd = pr = Ctor.precision;\r\n      rm = Ctor.rounding;\r\n    } else if (dp) {\r\n      sd = pr + (x.e - y.e) + 1;\r\n    } else {\r\n      sd = pr;\r\n    }\r\n\r\n    if (sd < 0) {\r\n      qd.push(1);\r\n      more = true;\r\n    } else {\r\n\r\n      // Convert precision in number of base 10 digits to base 1e7 digits.\r\n      sd = sd / logBase + 2 | 0;\r\n      i = 0;\r\n\r\n      // divisor < 1e7\r\n      if (yL == 1) {\r\n        k = 0;\r\n        yd = yd[0];\r\n        sd++;\r\n\r\n        // k is the carry.\r\n        for (; (i < xL || k) && sd--; i++) {\r\n          t = k * base + (xd[i] || 0);\r\n          qd[i] = t / yd | 0;\r\n          k = t % yd | 0;\r\n        }\r\n\r\n        more = k || i < xL;\r\n\r\n      // divisor >= 1e7\r\n      } else {\r\n\r\n        // Normalise xd and yd so highest order digit of yd is >= base/2\r\n        k = base / (yd[0] + 1) | 0;\r\n\r\n        if (k > 1) {\r\n          yd = multiplyInteger(yd, k, base);\r\n          xd = multiplyInteger(xd, k, base);\r\n          yL = yd.length;\r\n          xL = xd.length;\r\n        }\r\n\r\n        xi = yL;\r\n        rem = xd.slice(0, yL);\r\n        remL = rem.length;\r\n\r\n        // Add zeros to make remainder as long as divisor.\r\n        for (; remL < yL;) rem[remL++] = 0;\r\n\r\n        yz = yd.slice();\r\n        yz.unshift(0);\r\n        yd0 = yd[0];\r\n\r\n        if (yd[1] >= base / 2) ++yd0;\r\n\r\n        do {\r\n          k = 0;\r\n\r\n          // Compare divisor and remainder.\r\n          cmp = compare(yd, rem, yL, remL);\r\n\r\n          // If divisor < remainder.\r\n          if (cmp < 0) {\r\n\r\n            // Calculate trial digit, k.\r\n            rem0 = rem[0];\r\n            if (yL != remL) rem0 = rem0 * base + (rem[1] || 0);\r\n\r\n            // k will be how many times the divisor goes into the current remainder.\r\n            k = rem0 / yd0 | 0;\r\n\r\n            //  Algorithm:\r\n            //  1. product = divisor * trial digit (k)\r\n            //  2. if product > remainder: product -= divisor, k--\r\n            //  3. remainder -= product\r\n            //  4. if product was < remainder at 2:\r\n            //    5. compare new remainder and divisor\r\n            //    6. If remainder > divisor: remainder -= divisor, k++\r\n\r\n            if (k > 1) {\r\n              if (k >= base) k = base - 1;\r\n\r\n              // product = divisor * trial digit.\r\n              prod = multiplyInteger(yd, k, base);\r\n              prodL = prod.length;\r\n              remL = rem.length;\r\n\r\n              // Compare product and remainder.\r\n              cmp = compare(prod, rem, prodL, remL);\r\n\r\n              // product > remainder.\r\n              if (cmp == 1) {\r\n                k--;\r\n\r\n                // Subtract divisor from product.\r\n                subtract(prod, yL < prodL ? yz : yd, prodL, base);\r\n              }\r\n            } else {\r\n\r\n              // cmp is -1.\r\n              // If k is 0, there is no need to compare yd and rem again below, so change cmp to 1\r\n              // to avoid it. If k is 1 there is a need to compare yd and rem again below.\r\n              if (k == 0) cmp = k = 1;\r\n              prod = yd.slice();\r\n            }\r\n\r\n            prodL = prod.length;\r\n            if (prodL < remL) prod.unshift(0);\r\n\r\n            // Subtract product from remainder.\r\n            subtract(rem, prod, remL, base);\r\n\r\n            // If product was < previous remainder.\r\n            if (cmp == -1) {\r\n              remL = rem.length;\r\n\r\n              // Compare divisor and new remainder.\r\n              cmp = compare(yd, rem, yL, remL);\r\n\r\n              // If divisor < new remainder, subtract divisor from remainder.\r\n              if (cmp < 1) {\r\n                k++;\r\n\r\n                // Subtract divisor from remainder.\r\n                subtract(rem, yL < remL ? yz : yd, remL, base);\r\n              }\r\n            }\r\n\r\n            remL = rem.length;\r\n          } else if (cmp === 0) {\r\n            k++;\r\n            rem = [0];\r\n          }    // if cmp === 1, k will be 0\r\n\r\n          // Add the next digit, k, to the result array.\r\n          qd[i++] = k;\r\n\r\n          // Update the remainder.\r\n          if (cmp && rem[0]) {\r\n            rem[remL++] = xd[xi] || 0;\r\n          } else {\r\n            rem = [xd[xi]];\r\n            remL = 1;\r\n          }\r\n\r\n        } while ((xi++ < xL || rem[0] !== void 0) && sd--);\r\n\r\n        more = rem[0] !== void 0;\r\n      }\r\n\r\n      // Leading zero?\r\n      if (!qd[0]) qd.shift();\r\n    }\r\n\r\n    // logBase is 1 when divide is being used for base conversion.\r\n    if (logBase == 1) {\r\n      q.e = e;\r\n      inexact = more;\r\n    } else {\r\n\r\n      // To calculate q.e, first get the number of digits of qd[0].\r\n      for (i = 1, k = qd[0]; k >= 10; k /= 10) i++;\r\n      q.e = i + e * logBase - 1;\r\n\r\n      finalise(q, dp ? pr + q.e + 1 : pr, rm, more);\r\n    }\r\n\r\n    return q;\r\n  };\r\n})();\r\n\r\n\r\n/*\r\n * Round `x` to `sd` significant digits using rounding mode `rm`.\r\n * Check for over/under-flow.\r\n */\r\n function finalise(x, sd, rm, isTruncated) {\r\n  var digits, i, j, k, rd, roundUp, w, xd, xdi,\r\n    Ctor = x.constructor;\r\n\r\n  // Don't round if sd is null or undefined.\r\n  out: if (sd != null) {\r\n    xd = x.d;\r\n\r\n    // Infinity/NaN.\r\n    if (!xd) return x;\r\n\r\n    // rd: the rounding digit, i.e. the digit after the digit that may be rounded up.\r\n    // w: the word of xd containing rd, a base 1e7 number.\r\n    // xdi: the index of w within xd.\r\n    // digits: the number of digits of w.\r\n    // i: what would be the index of rd within w if all the numbers were 7 digits long (i.e. if\r\n    // they had leading zeros)\r\n    // j: if > 0, the actual index of rd within w (if < 0, rd is a leading zero).\r\n\r\n    // Get the length of the first word of the digits array xd.\r\n    for (digits = 1, k = xd[0]; k >= 10; k /= 10) digits++;\r\n    i = sd - digits;\r\n\r\n    // Is the rounding digit in the first word of xd?\r\n    if (i < 0) {\r\n      i += LOG_BASE;\r\n      j = sd;\r\n      w = xd[xdi = 0];\r\n\r\n      // Get the rounding digit at index j of w.\r\n      rd = w / mathpow(10, digits - j - 1) % 10 | 0;\r\n    } else {\r\n      xdi = Math.ceil((i + 1) / LOG_BASE);\r\n      k = xd.length;\r\n      if (xdi >= k) {\r\n        if (isTruncated) {\r\n\r\n          // Needed by `naturalExponential`, `naturalLogarithm` and `squareRoot`.\r\n          for (; k++ <= xdi;) xd.push(0);\r\n          w = rd = 0;\r\n          digits = 1;\r\n          i %= LOG_BASE;\r\n          j = i - LOG_BASE + 1;\r\n        } else {\r\n          break out;\r\n        }\r\n      } else {\r\n        w = k = xd[xdi];\r\n\r\n        // Get the number of digits of w.\r\n        for (digits = 1; k >= 10; k /= 10) digits++;\r\n\r\n        // Get the index of rd within w.\r\n        i %= LOG_BASE;\r\n\r\n        // Get the index of rd within w, adjusted for leading zeros.\r\n        // The number of leading zeros of w is given by LOG_BASE - digits.\r\n        j = i - LOG_BASE + digits;\r\n\r\n        // Get the rounding digit at index j of w.\r\n        rd = j < 0 ? 0 : w / mathpow(10, digits - j - 1) % 10 | 0;\r\n      }\r\n    }\r\n\r\n    // Are there any non-zero digits after the rounding digit?\r\n    isTruncated = isTruncated || sd < 0 ||\r\n      xd[xdi + 1] !== void 0 || (j < 0 ? w : w % mathpow(10, digits - j - 1));\r\n\r\n    // The expression `w % mathpow(10, digits - j - 1)` returns all the digits of w to the right\r\n    // of the digit at (left-to-right) index j, e.g. if w is 908714 and j is 2, the expression\r\n    // will give 714.\r\n\r\n    roundUp = rm < 4\r\n      ? (rd || isTruncated) && (rm == 0 || rm == (x.s < 0 ? 3 : 2))\r\n      : rd > 5 || rd == 5 && (rm == 4 || isTruncated || rm == 6 &&\r\n\r\n        // Check whether the digit to the left of the rounding digit is odd.\r\n        ((i > 0 ? j > 0 ? w / mathpow(10, digits - j) : 0 : xd[xdi - 1]) % 10) & 1 ||\r\n          rm == (x.s < 0 ? 8 : 7));\r\n\r\n    if (sd < 1 || !xd[0]) {\r\n      xd.length = 0;\r\n      if (roundUp) {\r\n\r\n        // Convert sd to decimal places.\r\n        sd -= x.e + 1;\r\n\r\n        // 1, 0.1, 0.01, 0.001, 0.0001 etc.\r\n        xd[0] = mathpow(10, (LOG_BASE - sd % LOG_BASE) % LOG_BASE);\r\n        x.e = -sd || 0;\r\n      } else {\r\n\r\n        // Zero.\r\n        xd[0] = x.e = 0;\r\n      }\r\n\r\n      return x;\r\n    }\r\n\r\n    // Remove excess digits.\r\n    if (i == 0) {\r\n      xd.length = xdi;\r\n      k = 1;\r\n      xdi--;\r\n    } else {\r\n      xd.length = xdi + 1;\r\n      k = mathpow(10, LOG_BASE - i);\r\n\r\n      // E.g. 56700 becomes 56000 if 7 is the rounding digit.\r\n      // j > 0 means i > number of leading zeros of w.\r\n      xd[xdi] = j > 0 ? (w / mathpow(10, digits - j) % mathpow(10, j) | 0) * k : 0;\r\n    }\r\n\r\n    if (roundUp) {\r\n      for (;;) {\r\n\r\n        // Is the digit to be rounded up in the first word of xd?\r\n        if (xdi == 0) {\r\n\r\n          // i will be the length of xd[0] before k is added.\r\n          for (i = 1, j = xd[0]; j >= 10; j /= 10) i++;\r\n          j = xd[0] += k;\r\n          for (k = 1; j >= 10; j /= 10) k++;\r\n\r\n          // if i != k the length has increased.\r\n          if (i != k) {\r\n            x.e++;\r\n            if (xd[0] == BASE) xd[0] = 1;\r\n          }\r\n\r\n          break;\r\n        } else {\r\n          xd[xdi] += k;\r\n          if (xd[xdi] != BASE) break;\r\n          xd[xdi--] = 0;\r\n          k = 1;\r\n        }\r\n      }\r\n    }\r\n\r\n    // Remove trailing zeros.\r\n    for (i = xd.length; xd[--i] === 0;) xd.pop();\r\n  }\r\n\r\n  if (external) {\r\n\r\n    // Overflow?\r\n    if (x.e > Ctor.maxE) {\r\n\r\n      // Infinity.\r\n      x.d = null;\r\n      x.e = NaN;\r\n\r\n    // Underflow?\r\n    } else if (x.e < Ctor.minE) {\r\n\r\n      // Zero.\r\n      x.e = 0;\r\n      x.d = [0];\r\n      // Ctor.underflow = true;\r\n    } // else Ctor.underflow = false;\r\n  }\r\n\r\n  return x;\r\n}\r\n\r\n\r\nfunction finiteToString(x, isExp, sd) {\r\n  if (!x.isFinite()) return nonFiniteToString(x);\r\n  var k,\r\n    e = x.e,\r\n    str = digitsToString(x.d),\r\n    len = str.length;\r\n\r\n  if (isExp) {\r\n    if (sd && (k = sd - len) > 0) {\r\n      str = str.charAt(0) + '.' + str.slice(1) + getZeroString(k);\r\n    } else if (len > 1) {\r\n      str = str.charAt(0) + '.' + str.slice(1);\r\n    }\r\n\r\n    str = str + (x.e < 0 ? 'e' : 'e+') + x.e;\r\n  } else if (e < 0) {\r\n    str = '0.' + getZeroString(-e - 1) + str;\r\n    if (sd && (k = sd - len) > 0) str += getZeroString(k);\r\n  } else if (e >= len) {\r\n    str += getZeroString(e + 1 - len);\r\n    if (sd && (k = sd - e - 1) > 0) str = str + '.' + getZeroString(k);\r\n  } else {\r\n    if ((k = e + 1) < len) str = str.slice(0, k) + '.' + str.slice(k);\r\n    if (sd && (k = sd - len) > 0) {\r\n      if (e + 1 === len) str += '.';\r\n      str += getZeroString(k);\r\n    }\r\n  }\r\n\r\n  return str;\r\n}\r\n\r\n\r\n// Calculate the base 10 exponent from the base 1e7 exponent.\r\nfunction getBase10Exponent(digits, e) {\r\n  var w = digits[0];\r\n\r\n  // Add the number of digits of the first word of the digits array.\r\n  for ( e *= LOG_BASE; w >= 10; w /= 10) e++;\r\n  return e;\r\n}\r\n\r\n\r\nfunction getLn10(Ctor, sd, pr) {\r\n  if (sd > LN10_PRECISION) {\r\n\r\n    // Reset global state in case the exception is caught.\r\n    external = true;\r\n    if (pr) Ctor.precision = pr;\r\n    throw Error(precisionLimitExceeded);\r\n  }\r\n  return finalise(new Ctor(LN10), sd, 1, true);\r\n}\r\n\r\n\r\nfunction getPi(Ctor, sd, rm) {\r\n  if (sd > PI_PRECISION) throw Error(precisionLimitExceeded);\r\n  return finalise(new Ctor(PI), sd, rm, true);\r\n}\r\n\r\n\r\nfunction getPrecision(digits) {\r\n  var w = digits.length - 1,\r\n    len = w * LOG_BASE + 1;\r\n\r\n  w = digits[w];\r\n\r\n  // If non-zero...\r\n  if (w) {\r\n\r\n    // Subtract the number of trailing zeros of the last word.\r\n    for (; w % 10 == 0; w /= 10) len--;\r\n\r\n    // Add the number of digits of the first word.\r\n    for (w = digits[0]; w >= 10; w /= 10) len++;\r\n  }\r\n\r\n  return len;\r\n}\r\n\r\n\r\nfunction getZeroString(k) {\r\n  var zs = '';\r\n  for (; k--;) zs += '0';\r\n  return zs;\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the value of Decimal `x` to the power `n`, where `n` is an\r\n * integer of type number.\r\n *\r\n * Implements 'exponentiation by squaring'. Called by `pow` and `parseOther`.\r\n *\r\n */\r\nfunction intPow(Ctor, x, n, pr) {\r\n  var isTruncated,\r\n    r = new Ctor(1),\r\n\r\n    // Max n of 9007199254740991 takes 53 loop iterations.\r\n    // Maximum digits array length; leaves [28, 34] guard digits.\r\n    k = Math.ceil(pr / LOG_BASE + 4);\r\n\r\n  external = false;\r\n\r\n  for (;;) {\r\n    if (n % 2) {\r\n      r = r.times(x);\r\n      if (truncate(r.d, k)) isTruncated = true;\r\n    }\r\n\r\n    n = mathfloor(n / 2);\r\n    if (n === 0) {\r\n\r\n      // To ensure correct rounding when r.d is truncated, increment the last word if it is zero.\r\n      n = r.d.length - 1;\r\n      if (isTruncated && r.d[n] === 0) ++r.d[n];\r\n      break;\r\n    }\r\n\r\n    x = x.times(x);\r\n    truncate(x.d, k);\r\n  }\r\n\r\n  external = true;\r\n\r\n  return r;\r\n}\r\n\r\n\r\nfunction isOdd(n) {\r\n  return n.d[n.d.length - 1] & 1;\r\n}\r\n\r\n\r\n/*\r\n * Handle `max` and `min`. `ltgt` is 'lt' or 'gt'.\r\n */\r\nfunction maxOrMin(Ctor, args, ltgt) {\r\n  var y,\r\n    x = new Ctor(args[0]),\r\n    i = 0;\r\n\r\n  for (; ++i < args.length;) {\r\n    y = new Ctor(args[i]);\r\n    if (!y.s) {\r\n      x = y;\r\n      break;\r\n    } else if (x[ltgt](y)) {\r\n      x = y;\r\n    }\r\n  }\r\n\r\n  return x;\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the natural exponential of `x` rounded to `sd` significant\r\n * digits.\r\n *\r\n * Taylor/Maclaurin series.\r\n *\r\n * exp(x) = x^0/0! + x^1/1! + x^2/2! + x^3/3! + ...\r\n *\r\n * Argument reduction:\r\n *   Repeat x = x / 32, k += 5, until |x| < 0.1\r\n *   exp(x) = exp(x / 2^k)^(2^k)\r\n *\r\n * Previously, the argument was initially reduced by\r\n * exp(x) = exp(r) * 10^k  where r = x - k * ln10, k = floor(x / ln10)\r\n * to first put r in the range [0, ln10], before dividing by 32 until |x| < 0.1, but this was\r\n * found to be slower than just dividing repeatedly by 32 as above.\r\n *\r\n * Max integer argument: exp('20723265836946413') = 6.3e+9000000000000000\r\n * Min integer argument: exp('-20723265836946411') = 1.2e-9000000000000000\r\n * (Math object integer min/max: Math.exp(709) = 8.2e+307, Math.exp(-745) = 5e-324)\r\n *\r\n *  exp(Infinity)  = Infinity\r\n *  exp(-Infinity) = 0\r\n *  exp(NaN)       = NaN\r\n *  exp(±0)        = 1\r\n *\r\n *  exp(x) is non-terminating for any finite, non-zero x.\r\n *\r\n *  The result will always be correctly rounded.\r\n *\r\n */\r\nfunction naturalExponential(x, sd) {\r\n  var denominator, guard, j, pow, sum, t, wpr,\r\n    rep = 0,\r\n    i = 0,\r\n    k = 0,\r\n    Ctor = x.constructor,\r\n    rm = Ctor.rounding,\r\n    pr = Ctor.precision;\r\n\r\n  // 0/NaN/Infinity?\r\n  if (!x.d || !x.d[0] || x.e > 17) {\r\n\r\n    return new Ctor(x.d\r\n      ? !x.d[0] ? 1 : x.s < 0 ? 0 : 1 / 0\r\n      : x.s ? x.s < 0 ? 0 : x : 0 / 0);\r\n  }\r\n\r\n  if (sd == null) {\r\n    external = false;\r\n    wpr = pr;\r\n  } else {\r\n    wpr = sd;\r\n  }\r\n\r\n  t = new Ctor(0.03125);\r\n\r\n  // while abs(x) >= 0.1\r\n  while (x.e > -2) {\r\n\r\n    // x = x / 2^5\r\n    x = x.times(t);\r\n    k += 5;\r\n  }\r\n\r\n  // Use 2 * log10(2^k) + 5 (empirically derived) to estimate the increase in precision\r\n  // necessary to ensure the first 4 rounding digits are correct.\r\n  guard = Math.log(mathpow(2, k)) / Math.LN10 * 2 + 5 | 0;\r\n  wpr += guard;\r\n  denominator = pow = sum = new Ctor(1);\r\n  Ctor.precision = wpr;\r\n\r\n  for (;;) {\r\n    pow = finalise(pow.times(x), wpr, 1);\r\n    denominator = denominator.times(++i);\r\n    t = sum.plus(divide(pow, denominator, wpr, 1));\r\n\r\n    if (digitsToString(t.d).slice(0, wpr) === digitsToString(sum.d).slice(0, wpr)) {\r\n      j = k;\r\n      while (j--) sum = finalise(sum.times(sum), wpr, 1);\r\n\r\n      // Check to see if the first 4 rounding digits are [49]999.\r\n      // If so, repeat the summation with a higher precision, otherwise\r\n      // e.g. with precision: 18, rounding: 1\r\n      // exp(18.404272462595034083567793919843761) = 98372560.1229999999 (should be 98372560.123)\r\n      // `wpr - guard` is the index of first rounding digit.\r\n      if (sd == null) {\r\n\r\n        if (rep < 3 && checkRoundingDigits(sum.d, wpr - guard, rm, rep)) {\r\n          Ctor.precision = wpr += 10;\r\n          denominator = pow = t = new Ctor(1);\r\n          i = 0;\r\n          rep++;\r\n        } else {\r\n          return finalise(sum, Ctor.precision = pr, rm, external = true);\r\n        }\r\n      } else {\r\n        Ctor.precision = pr;\r\n        return sum;\r\n      }\r\n    }\r\n\r\n    sum = t;\r\n  }\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the natural logarithm of `x` rounded to `sd` significant\r\n * digits.\r\n *\r\n *  ln(-n)        = NaN\r\n *  ln(0)         = -Infinity\r\n *  ln(-0)        = -Infinity\r\n *  ln(1)         = 0\r\n *  ln(Infinity)  = Infinity\r\n *  ln(-Infinity) = NaN\r\n *  ln(NaN)       = NaN\r\n *\r\n *  ln(n) (n != 1) is non-terminating.\r\n *\r\n */\r\nfunction naturalLogarithm(y, sd) {\r\n  var c, c0, denominator, e, numerator, rep, sum, t, wpr, x1, x2,\r\n    n = 1,\r\n    guard = 10,\r\n    x = y,\r\n    xd = x.d,\r\n    Ctor = x.constructor,\r\n    rm = Ctor.rounding,\r\n    pr = Ctor.precision;\r\n\r\n  // Is x negative or Infinity, NaN, 0 or 1?\r\n  if (x.s < 0 || !xd || !xd[0] || !x.e && xd[0] == 1 && xd.length == 1) {\r\n    return new Ctor(xd && !xd[0] ? -1 / 0 : x.s != 1 ? NaN : xd ? 0 : x);\r\n  }\r\n\r\n  if (sd == null) {\r\n    external = false;\r\n    wpr = pr;\r\n  } else {\r\n    wpr = sd;\r\n  }\r\n\r\n  Ctor.precision = wpr += guard;\r\n  c = digitsToString(xd);\r\n  c0 = c.charAt(0);\r\n\r\n  if (Math.abs(e = x.e) < 1.5e15) {\r\n\r\n    // Argument reduction.\r\n    // The series converges faster the closer the argument is to 1, so using\r\n    // ln(a^b) = b * ln(a),   ln(a) = ln(a^b) / b\r\n    // multiply the argument by itself until the leading digits of the significand are 7, 8, 9,\r\n    // 10, 11, 12 or 13, recording the number of multiplications so the sum of the series can\r\n    // later be divided by this number, then separate out the power of 10 using\r\n    // ln(a*10^b) = ln(a) + b*ln(10).\r\n\r\n    // max n is 21 (gives 0.9, 1.0 or 1.1) (9e15 / 21 = 4.2e14).\r\n    //while (c0 < 9 && c0 != 1 || c0 == 1 && c.charAt(1) > 1) {\r\n    // max n is 6 (gives 0.7 - 1.3)\r\n    while (c0 < 7 && c0 != 1 || c0 == 1 && c.charAt(1) > 3) {\r\n      x = x.times(y);\r\n      c = digitsToString(x.d);\r\n      c0 = c.charAt(0);\r\n      n++;\r\n    }\r\n\r\n    e = x.e;\r\n\r\n    if (c0 > 1) {\r\n      x = new Ctor('0.' + c);\r\n      e++;\r\n    } else {\r\n      x = new Ctor(c0 + '.' + c.slice(1));\r\n    }\r\n  } else {\r\n\r\n    // The argument reduction method above may result in overflow if the argument y is a massive\r\n    // number with exponent >= 1500000000000000 (9e15 / 6 = 1.5e15), so instead recall this\r\n    // function using ln(x*10^e) = ln(x) + e*ln(10).\r\n    t = getLn10(Ctor, wpr + 2, pr).times(e + '');\r\n    x = naturalLogarithm(new Ctor(c0 + '.' + c.slice(1)), wpr - guard).plus(t);\r\n    Ctor.precision = pr;\r\n\r\n    return sd == null ? finalise(x, pr, rm, external = true) : x;\r\n  }\r\n\r\n  // x1 is x reduced to a value near 1.\r\n  x1 = x;\r\n\r\n  // Taylor series.\r\n  // ln(y) = ln((1 + x)/(1 - x)) = 2(x + x^3/3 + x^5/5 + x^7/7 + ...)\r\n  // where x = (y - 1)/(y + 1)    (|x| < 1)\r\n  sum = numerator = x = divide(x.minus(1), x.plus(1), wpr, 1);\r\n  x2 = finalise(x.times(x), wpr, 1);\r\n  denominator = 3;\r\n\r\n  for (;;) {\r\n    numerator = finalise(numerator.times(x2), wpr, 1);\r\n    t = sum.plus(divide(numerator, new Ctor(denominator), wpr, 1));\r\n\r\n    if (digitsToString(t.d).slice(0, wpr) === digitsToString(sum.d).slice(0, wpr)) {\r\n      sum = sum.times(2);\r\n\r\n      // Reverse the argument reduction. Check that e is not 0 because, besides preventing an\r\n      // unnecessary calculation, -0 + 0 = +0 and to ensure correct rounding -0 needs to stay -0.\r\n      if (e !== 0) sum = sum.plus(getLn10(Ctor, wpr + 2, pr).times(e + ''));\r\n      sum = divide(sum, new Ctor(n), wpr, 1);\r\n\r\n      // Is rm > 3 and the first 4 rounding digits 4999, or rm < 4 (or the summation has\r\n      // been repeated previously) and the first 4 rounding digits 9999?\r\n      // If so, restart the summation with a higher precision, otherwise\r\n      // e.g. with precision: 12, rounding: 1\r\n      // ln(135520028.6126091714265381533) = 18.7246299999 when it should be 18.72463.\r\n      // `wpr - guard` is the index of first rounding digit.\r\n      if (sd == null) {\r\n        if (checkRoundingDigits(sum.d, wpr - guard, rm, rep)) {\r\n          Ctor.precision = wpr += guard;\r\n          t = numerator = x = divide(x1.minus(1), x1.plus(1), wpr, 1);\r\n          x2 = finalise(x.times(x), wpr, 1);\r\n          denominator = rep = 1;\r\n        } else {\r\n          return finalise(sum, Ctor.precision = pr, rm, external = true);\r\n        }\r\n      } else {\r\n        Ctor.precision = pr;\r\n        return sum;\r\n      }\r\n    }\r\n\r\n    sum = t;\r\n    denominator += 2;\r\n  }\r\n}\r\n\r\n\r\n// ±Infinity, NaN.\r\nfunction nonFiniteToString(x) {\r\n  // Unsigned.\r\n  return String(x.s * x.s / 0);\r\n}\r\n\r\n\r\n/*\r\n * Parse the value of a new Decimal `x` from string `str`.\r\n */\r\nfunction parseDecimal(x, str) {\r\n  var e, i, len;\r\n\r\n  // Decimal point?\r\n  if ((e = str.indexOf('.')) > -1) str = str.replace('.', '');\r\n\r\n  // Exponential form?\r\n  if ((i = str.search(/e/i)) > 0) {\r\n\r\n    // Determine exponent.\r\n    if (e < 0) e = i;\r\n    e += +str.slice(i + 1);\r\n    str = str.substring(0, i);\r\n  } else if (e < 0) {\r\n\r\n    // Integer.\r\n    e = str.length;\r\n  }\r\n\r\n  // Determine leading zeros.\r\n  for (i = 0; str.charCodeAt(i) === 48; i++);\r\n\r\n  // Determine trailing zeros.\r\n  for (len = str.length; str.charCodeAt(len - 1) === 48; --len);\r\n  str = str.slice(i, len);\r\n\r\n  if (str) {\r\n    len -= i;\r\n    x.e = e = e - i - 1;\r\n    x.d = [];\r\n\r\n    // Transform base\r\n\r\n    // e is the base 10 exponent.\r\n    // i is where to slice str to get the first word of the digits array.\r\n    i = (e + 1) % LOG_BASE;\r\n    if (e < 0) i += LOG_BASE;\r\n\r\n    if (i < len) {\r\n      if (i) x.d.push(+str.slice(0, i));\r\n      for (len -= LOG_BASE; i < len;) x.d.push(+str.slice(i, i += LOG_BASE));\r\n      str = str.slice(i);\r\n      i = LOG_BASE - str.length;\r\n    } else {\r\n      i -= len;\r\n    }\r\n\r\n    for (; i--;) str += '0';\r\n    x.d.push(+str);\r\n\r\n    if (external) {\r\n\r\n      // Overflow?\r\n      if (x.e > x.constructor.maxE) {\r\n\r\n        // Infinity.\r\n        x.d = null;\r\n        x.e = NaN;\r\n\r\n      // Underflow?\r\n      } else if (x.e < x.constructor.minE) {\r\n\r\n        // Zero.\r\n        x.e = 0;\r\n        x.d = [0];\r\n        // x.constructor.underflow = true;\r\n      } // else x.constructor.underflow = false;\r\n    }\r\n  } else {\r\n\r\n    // Zero.\r\n    x.e = 0;\r\n    x.d = [0];\r\n  }\r\n\r\n  return x;\r\n}\r\n\r\n\r\n/*\r\n * Parse the value of a new Decimal `x` from a string `str`, which is not a decimal value.\r\n */\r\nfunction parseOther(x, str) {\r\n  var base, Ctor, divisor, i, isFloat, len, p, xd, xe;\r\n\r\n  if (str.indexOf('_') > -1) {\r\n    str = str.replace(/(\\d)_(?=\\d)/g, '$1');\r\n    if (isDecimal.test(str)) return parseDecimal(x, str);\r\n  } else if (str === 'Infinity' || str === 'NaN') {\r\n    if (!+str) x.s = NaN;\r\n    x.e = NaN;\r\n    x.d = null;\r\n    return x;\r\n  }\r\n\r\n  if (isHex.test(str))  {\r\n    base = 16;\r\n    str = str.toLowerCase();\r\n  } else if (isBinary.test(str))  {\r\n    base = 2;\r\n  } else if (isOctal.test(str))  {\r\n    base = 8;\r\n  } else {\r\n    throw Error(invalidArgument + str);\r\n  }\r\n\r\n  // Is there a binary exponent part?\r\n  i = str.search(/p/i);\r\n\r\n  if (i > 0) {\r\n    p = +str.slice(i + 1);\r\n    str = str.substring(2, i);\r\n  } else {\r\n    str = str.slice(2);\r\n  }\r\n\r\n  // Convert `str` as an integer then divide the result by `base` raised to a power such that the\r\n  // fraction part will be restored.\r\n  i = str.indexOf('.');\r\n  isFloat = i >= 0;\r\n  Ctor = x.constructor;\r\n\r\n  if (isFloat) {\r\n    str = str.replace('.', '');\r\n    len = str.length;\r\n    i = len - i;\r\n\r\n    // log[10](16) = 1.2041... , log[10](88) = 1.9444....\r\n    divisor = intPow(Ctor, new Ctor(base), i, i * 2);\r\n  }\r\n\r\n  xd = convertBase(str, base, BASE);\r\n  xe = xd.length - 1;\r\n\r\n  // Remove trailing zeros.\r\n  for (i = xe; xd[i] === 0; --i) xd.pop();\r\n  if (i < 0) return new Ctor(x.s * 0);\r\n  x.e = getBase10Exponent(xd, xe);\r\n  x.d = xd;\r\n  external = false;\r\n\r\n  // At what precision to perform the division to ensure exact conversion?\r\n  // maxDecimalIntegerPartDigitCount = ceil(log[10](b) * otherBaseIntegerPartDigitCount)\r\n  // log[10](2) = 0.30103, log[10](8) = 0.90309, log[10](16) = 1.20412\r\n  // E.g. ceil(1.2 * 3) = 4, so up to 4 decimal digits are needed to represent 3 hex int digits.\r\n  // maxDecimalFractionPartDigitCount = {Hex:4|Oct:3|Bin:1} * otherBaseFractionPartDigitCount\r\n  // Therefore using 4 * the number of digits of str will always be enough.\r\n  if (isFloat) x = divide(x, divisor, len * 4);\r\n\r\n  // Multiply by the binary exponent part if present.\r\n  if (p) x = x.times(Math.abs(p) < 54 ? mathpow(2, p) : Decimal.pow(2, p));\r\n  external = true;\r\n\r\n  return x;\r\n}\r\n\r\n\r\n/*\r\n * sin(x) = x - x^3/3! + x^5/5! - ...\r\n * |x| < pi/2\r\n *\r\n */\r\nfunction sine(Ctor, x) {\r\n  var k,\r\n    len = x.d.length;\r\n\r\n  if (len < 3) {\r\n    return x.isZero() ? x : taylorSeries(Ctor, 2, x, x);\r\n  }\r\n\r\n  // Argument reduction: sin(5x) = 16*sin^5(x) - 20*sin^3(x) + 5*sin(x)\r\n  // i.e. sin(x) = 16*sin^5(x/5) - 20*sin^3(x/5) + 5*sin(x/5)\r\n  // and  sin(x) = sin(x/5)(5 + sin^2(x/5)(16sin^2(x/5) - 20))\r\n\r\n  // Estimate the optimum number of times to use the argument reduction.\r\n  k = 1.4 * Math.sqrt(len);\r\n  k = k > 16 ? 16 : k | 0;\r\n\r\n  x = x.times(1 / tinyPow(5, k));\r\n  x = taylorSeries(Ctor, 2, x, x);\r\n\r\n  // Reverse argument reduction\r\n  var sin2_x,\r\n    d5 = new Ctor(5),\r\n    d16 = new Ctor(16),\r\n    d20 = new Ctor(20);\r\n  for (; k--;) {\r\n    sin2_x = x.times(x);\r\n    x = x.times(d5.plus(sin2_x.times(d16.times(sin2_x).minus(d20))));\r\n  }\r\n\r\n  return x;\r\n}\r\n\r\n\r\n// Calculate Taylor series for `cos`, `cosh`, `sin` and `sinh`.\r\nfunction taylorSeries(Ctor, n, x, y, isHyperbolic) {\r\n  var j, t, u, x2,\r\n    i = 1,\r\n    pr = Ctor.precision,\r\n    k = Math.ceil(pr / LOG_BASE);\r\n\r\n  external = false;\r\n  x2 = x.times(x);\r\n  u = new Ctor(y);\r\n\r\n  for (;;) {\r\n    t = divide(u.times(x2), new Ctor(n++ * n++), pr, 1);\r\n    u = isHyperbolic ? y.plus(t) : y.minus(t);\r\n    y = divide(t.times(x2), new Ctor(n++ * n++), pr, 1);\r\n    t = u.plus(y);\r\n\r\n    if (t.d[k] !== void 0) {\r\n      for (j = k; t.d[j] === u.d[j] && j--;);\r\n      if (j == -1) break;\r\n    }\r\n\r\n    j = u;\r\n    u = y;\r\n    y = t;\r\n    t = j;\r\n    i++;\r\n  }\r\n\r\n  external = true;\r\n  t.d.length = k + 1;\r\n\r\n  return t;\r\n}\r\n\r\n\r\n// Exponent e must be positive and non-zero.\r\nfunction tinyPow(b, e) {\r\n  var n = b;\r\n  while (--e) n *= b;\r\n  return n;\r\n}\r\n\r\n\r\n// Return the absolute value of `x` reduced to less than or equal to half pi.\r\nfunction toLessThanHalfPi(Ctor, x) {\r\n  var t,\r\n    isNeg = x.s < 0,\r\n    pi = getPi(Ctor, Ctor.precision, 1),\r\n    halfPi = pi.times(0.5);\r\n\r\n  x = x.abs();\r\n\r\n  if (x.lte(halfPi)) {\r\n    quadrant = isNeg ? 4 : 1;\r\n    return x;\r\n  }\r\n\r\n  t = x.divToInt(pi);\r\n\r\n  if (t.isZero()) {\r\n    quadrant = isNeg ? 3 : 2;\r\n  } else {\r\n    x = x.minus(t.times(pi));\r\n\r\n    // 0 <= x < pi\r\n    if (x.lte(halfPi)) {\r\n      quadrant = isOdd(t) ? (isNeg ? 2 : 3) : (isNeg ? 4 : 1);\r\n      return x;\r\n    }\r\n\r\n    quadrant = isOdd(t) ? (isNeg ? 1 : 4) : (isNeg ? 3 : 2);\r\n  }\r\n\r\n  return x.minus(pi).abs();\r\n}\r\n\r\n\r\n/*\r\n * Return the value of Decimal `x` as a string in base `baseOut`.\r\n *\r\n * If the optional `sd` argument is present include a binary exponent suffix.\r\n */\r\nfunction toStringBinary(x, baseOut, sd, rm) {\r\n  var base, e, i, k, len, roundUp, str, xd, y,\r\n    Ctor = x.constructor,\r\n    isExp = sd !== void 0;\r\n\r\n  if (isExp) {\r\n    checkInt32(sd, 1, MAX_DIGITS);\r\n    if (rm === void 0) rm = Ctor.rounding;\r\n    else checkInt32(rm, 0, 8);\r\n  } else {\r\n    sd = Ctor.precision;\r\n    rm = Ctor.rounding;\r\n  }\r\n\r\n  if (!x.isFinite()) {\r\n    str = nonFiniteToString(x);\r\n  } else {\r\n    str = finiteToString(x);\r\n    i = str.indexOf('.');\r\n\r\n    // Use exponential notation according to `toExpPos` and `toExpNeg`? No, but if required:\r\n    // maxBinaryExponent = floor((decimalExponent + 1) * log[2](10))\r\n    // minBinaryExponent = floor(decimalExponent * log[2](10))\r\n    // log[2](10) = 3.321928094887362347870319429489390175864\r\n\r\n    if (isExp) {\r\n      base = 2;\r\n      if (baseOut == 16) {\r\n        sd = sd * 4 - 3;\r\n      } else if (baseOut == 8) {\r\n        sd = sd * 3 - 2;\r\n      }\r\n    } else {\r\n      base = baseOut;\r\n    }\r\n\r\n    // Convert the number as an integer then divide the result by its base raised to a power such\r\n    // that the fraction part will be restored.\r\n\r\n    // Non-integer.\r\n    if (i >= 0) {\r\n      str = str.replace('.', '');\r\n      y = new Ctor(1);\r\n      y.e = str.length - i;\r\n      y.d = convertBase(finiteToString(y), 10, base);\r\n      y.e = y.d.length;\r\n    }\r\n\r\n    xd = convertBase(str, 10, base);\r\n    e = len = xd.length;\r\n\r\n    // Remove trailing zeros.\r\n    for (; xd[--len] == 0;) xd.pop();\r\n\r\n    if (!xd[0]) {\r\n      str = isExp ? '0p+0' : '0';\r\n    } else {\r\n      if (i < 0) {\r\n        e--;\r\n      } else {\r\n        x = new Ctor(x);\r\n        x.d = xd;\r\n        x.e = e;\r\n        x = divide(x, y, sd, rm, 0, base);\r\n        xd = x.d;\r\n        e = x.e;\r\n        roundUp = inexact;\r\n      }\r\n\r\n      // The rounding digit, i.e. the digit after the digit that may be rounded up.\r\n      i = xd[sd];\r\n      k = base / 2;\r\n      roundUp = roundUp || xd[sd + 1] !== void 0;\r\n\r\n      roundUp = rm < 4\r\n        ? (i !== void 0 || roundUp) && (rm === 0 || rm === (x.s < 0 ? 3 : 2))\r\n        : i > k || i === k && (rm === 4 || roundUp || rm === 6 && xd[sd - 1] & 1 ||\r\n          rm === (x.s < 0 ? 8 : 7));\r\n\r\n      xd.length = sd;\r\n\r\n      if (roundUp) {\r\n\r\n        // Rounding up may mean the previous digit has to be rounded up and so on.\r\n        for (; ++xd[--sd] > base - 1;) {\r\n          xd[sd] = 0;\r\n          if (!sd) {\r\n            ++e;\r\n            xd.unshift(1);\r\n          }\r\n        }\r\n      }\r\n\r\n      // Determine trailing zeros.\r\n      for (len = xd.length; !xd[len - 1]; --len);\r\n\r\n      // E.g. [4, 11, 15] becomes 4bf.\r\n      for (i = 0, str = ''; i < len; i++) str += NUMERALS.charAt(xd[i]);\r\n\r\n      // Add binary exponent suffix?\r\n      if (isExp) {\r\n        if (len > 1) {\r\n          if (baseOut == 16 || baseOut == 8) {\r\n            i = baseOut == 16 ? 4 : 3;\r\n            for (--len; len % i; len++) str += '0';\r\n            xd = convertBase(str, base, baseOut);\r\n            for (len = xd.length; !xd[len - 1]; --len);\r\n\r\n            // xd[0] will always be be 1\r\n            for (i = 1, str = '1.'; i < len; i++) str += NUMERALS.charAt(xd[i]);\r\n          } else {\r\n            str = str.charAt(0) + '.' + str.slice(1);\r\n          }\r\n        }\r\n\r\n        str =  str + (e < 0 ? 'p' : 'p+') + e;\r\n      } else if (e < 0) {\r\n        for (; ++e;) str = '0' + str;\r\n        str = '0.' + str;\r\n      } else {\r\n        if (++e > len) for (e -= len; e-- ;) str += '0';\r\n        else if (e < len) str = str.slice(0, e) + '.' + str.slice(e);\r\n      }\r\n    }\r\n\r\n    str = (baseOut == 16 ? '0x' : baseOut == 2 ? '0b' : baseOut == 8 ? '0o' : '') + str;\r\n  }\r\n\r\n  return x.s < 0 ? '-' + str : str;\r\n}\r\n\r\n\r\n// Does not strip trailing zeros.\r\nfunction truncate(arr, len) {\r\n  if (arr.length > len) {\r\n    arr.length = len;\r\n    return true;\r\n  }\r\n}\r\n\r\n\r\n// Decimal methods\r\n\r\n\r\n/*\r\n *  abs\r\n *  acos\r\n *  acosh\r\n *  add\r\n *  asin\r\n *  asinh\r\n *  atan\r\n *  atanh\r\n *  atan2\r\n *  cbrt\r\n *  ceil\r\n *  clamp\r\n *  clone\r\n *  config\r\n *  cos\r\n *  cosh\r\n *  div\r\n *  exp\r\n *  floor\r\n *  hypot\r\n *  ln\r\n *  log\r\n *  log2\r\n *  log10\r\n *  max\r\n *  min\r\n *  mod\r\n *  mul\r\n *  pow\r\n *  random\r\n *  round\r\n *  set\r\n *  sign\r\n *  sin\r\n *  sinh\r\n *  sqrt\r\n *  sub\r\n *  sum\r\n *  tan\r\n *  tanh\r\n *  trunc\r\n */\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the absolute value of `x`.\r\n *\r\n * x {number|string|Decimal}\r\n *\r\n */\r\nfunction abs(x) {\r\n  return new this(x).abs();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the arccosine in radians of `x`.\r\n *\r\n * x {number|string|Decimal}\r\n *\r\n */\r\nfunction acos(x) {\r\n  return new this(x).acos();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the inverse of the hyperbolic cosine of `x`, rounded to\r\n * `precision` significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|Decimal} A value in radians.\r\n *\r\n */\r\nfunction acosh(x) {\r\n  return new this(x).acosh();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the sum of `x` and `y`, rounded to `precision` significant\r\n * digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|Decimal}\r\n * y {number|string|Decimal}\r\n *\r\n */\r\nfunction add(x, y) {\r\n  return new this(x).plus(y);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the arcsine in radians of `x`, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|Decimal}\r\n *\r\n */\r\nfunction asin(x) {\r\n  return new this(x).asin();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the inverse of the hyperbolic sine of `x`, rounded to\r\n * `precision` significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|Decimal} A value in radians.\r\n *\r\n */\r\nfunction asinh(x) {\r\n  return new this(x).asinh();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the arctangent in radians of `x`, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|Decimal}\r\n *\r\n */\r\nfunction atan(x) {\r\n  return new this(x).atan();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the inverse of the hyperbolic tangent of `x`, rounded to\r\n * `precision` significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|Decimal} A value in radians.\r\n *\r\n */\r\nfunction atanh(x) {\r\n  return new this(x).atanh();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the arctangent in radians of `y/x` in the range -pi to pi\r\n * (inclusive), rounded to `precision` significant digits using rounding mode `rounding`.\r\n *\r\n * Domain: [-Infinity, Infinity]\r\n * Range: [-pi, pi]\r\n *\r\n * y {number|string|Decimal} The y-coordinate.\r\n * x {number|string|Decimal} The x-coordinate.\r\n *\r\n * atan2(±0, -0)               = ±pi\r\n * atan2(±0, +0)               = ±0\r\n * atan2(±0, -x)               = ±pi for x > 0\r\n * atan2(±0, x)                = ±0 for x > 0\r\n * atan2(-y, ±0)               = -pi/2 for y > 0\r\n * atan2(y, ±0)                = pi/2 for y > 0\r\n * atan2(±y, -Infinity)        = ±pi for finite y > 0\r\n * atan2(±y, +Infinity)        = ±0 for finite y > 0\r\n * atan2(±Infinity, x)         = ±pi/2 for finite x\r\n * atan2(±Infinity, -Infinity) = ±3*pi/4\r\n * atan2(±Infinity, +Infinity) = ±pi/4\r\n * atan2(NaN, x) = NaN\r\n * atan2(y, NaN) = NaN\r\n *\r\n */\r\nfunction atan2(y, x) {\r\n  y = new this(y);\r\n  x = new this(x);\r\n  var r,\r\n    pr = this.precision,\r\n    rm = this.rounding,\r\n    wpr = pr + 4;\r\n\r\n  // Either NaN\r\n  if (!y.s || !x.s) {\r\n    r = new this(NaN);\r\n\r\n  // Both ±Infinity\r\n  } else if (!y.d && !x.d) {\r\n    r = getPi(this, wpr, 1).times(x.s > 0 ? 0.25 : 0.75);\r\n    r.s = y.s;\r\n\r\n  // x is ±Infinity or y is ±0\r\n  } else if (!x.d || y.isZero()) {\r\n    r = x.s < 0 ? getPi(this, pr, rm) : new this(0);\r\n    r.s = y.s;\r\n\r\n  // y is ±Infinity or x is ±0\r\n  } else if (!y.d || x.isZero()) {\r\n    r = getPi(this, wpr, 1).times(0.5);\r\n    r.s = y.s;\r\n\r\n  // Both non-zero and finite\r\n  } else if (x.s < 0) {\r\n    this.precision = wpr;\r\n    this.rounding = 1;\r\n    r = this.atan(divide(y, x, wpr, 1));\r\n    x = getPi(this, wpr, 1);\r\n    this.precision = pr;\r\n    this.rounding = rm;\r\n    r = y.s < 0 ? r.minus(x) : r.plus(x);\r\n  } else {\r\n    r = this.atan(divide(y, x, wpr, 1));\r\n  }\r\n\r\n  return r;\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the cube root of `x`, rounded to `precision` significant\r\n * digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|Decimal}\r\n *\r\n */\r\nfunction cbrt(x) {\r\n  return new this(x).cbrt();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is `x` rounded to an integer using `ROUND_CEIL`.\r\n *\r\n * x {number|string|Decimal}\r\n *\r\n */\r\nfunction ceil(x) {\r\n  return finalise(x = new this(x), x.e + 1, 2);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is `x` clamped to the range delineated by `min` and `max`.\r\n *\r\n * x {number|string|Decimal}\r\n * min {number|string|Decimal}\r\n * max {number|string|Decimal}\r\n *\r\n */\r\nfunction clamp(x, min, max) {\r\n  return new this(x).clamp(min, max);\r\n}\r\n\r\n\r\n/*\r\n * Configure global settings for a Decimal constructor.\r\n *\r\n * `obj` is an object with one or more of the following properties,\r\n *\r\n *   precision  {number}\r\n *   rounding   {number}\r\n *   toExpNeg   {number}\r\n *   toExpPos   {number}\r\n *   maxE       {number}\r\n *   minE       {number}\r\n *   modulo     {number}\r\n *   crypto     {boolean|number}\r\n *   defaults   {true}\r\n *\r\n * E.g. Decimal.config({ precision: 20, rounding: 4 })\r\n *\r\n */\r\nfunction config(obj) {\r\n  if (!obj || typeof obj !== 'object') throw Error(decimalError + 'Object expected');\r\n  var i, p, v,\r\n    useDefaults = obj.defaults === true,\r\n    ps = [\r\n      'precision', 1, MAX_DIGITS,\r\n      'rounding', 0, 8,\r\n      'toExpNeg', -EXP_LIMIT, 0,\r\n      'toExpPos', 0, EXP_LIMIT,\r\n      'maxE', 0, EXP_LIMIT,\r\n      'minE', -EXP_LIMIT, 0,\r\n      'modulo', 0, 9\r\n    ];\r\n\r\n  for (i = 0; i < ps.length; i += 3) {\r\n    if (p = ps[i], useDefaults) this[p] = DEFAULTS[p];\r\n    if ((v = obj[p]) !== void 0) {\r\n      if (mathfloor(v) === v && v >= ps[i + 1] && v <= ps[i + 2]) this[p] = v;\r\n      else throw Error(invalidArgument + p + ': ' + v);\r\n    }\r\n  }\r\n\r\n  if (p = 'crypto', useDefaults) this[p] = DEFAULTS[p];\r\n  if ((v = obj[p]) !== void 0) {\r\n    if (v === true || v === false || v === 0 || v === 1) {\r\n      if (v) {\r\n        if (typeof crypto != 'undefined' && crypto &&\r\n          (crypto.getRandomValues || crypto.randomBytes)) {\r\n          this[p] = true;\r\n        } else {\r\n          throw Error(cryptoUnavailable);\r\n        }\r\n      } else {\r\n        this[p] = false;\r\n      }\r\n    } else {\r\n      throw Error(invalidArgument + p + ': ' + v);\r\n    }\r\n  }\r\n\r\n  return this;\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the cosine of `x`, rounded to `precision` significant\r\n * digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|Decimal} A value in radians.\r\n *\r\n */\r\nfunction cos(x) {\r\n  return new this(x).cos();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the hyperbolic cosine of `x`, rounded to precision\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|Decimal} A value in radians.\r\n *\r\n */\r\nfunction cosh(x) {\r\n  return new this(x).cosh();\r\n}\r\n\r\n\r\n/*\r\n * Create and return a Decimal constructor with the same configuration properties as this Decimal\r\n * constructor.\r\n *\r\n */\r\nfunction clone(obj) {\r\n  var i, p, ps;\r\n\r\n  /*\r\n   * The Decimal constructor and exported function.\r\n   * Return a new Decimal instance.\r\n   *\r\n   * v {number|string|Decimal} A numeric value.\r\n   *\r\n   */\r\n  function Decimal(v) {\r\n    var e, i, t,\r\n      x = this;\r\n\r\n    // Decimal called without new.\r\n    if (!(x instanceof Decimal)) return new Decimal(v);\r\n\r\n    // Retain a reference to this Decimal constructor, and shadow Decimal.prototype.constructor\r\n    // which points to Object.\r\n    x.constructor = Decimal;\r\n\r\n    // Duplicate.\r\n    if (isDecimalInstance(v)) {\r\n      x.s = v.s;\r\n\r\n      if (external) {\r\n        if (!v.d || v.e > Decimal.maxE) {\r\n\r\n          // Infinity.\r\n          x.e = NaN;\r\n          x.d = null;\r\n        } else if (v.e < Decimal.minE) {\r\n\r\n          // Zero.\r\n          x.e = 0;\r\n          x.d = [0];\r\n        } else {\r\n          x.e = v.e;\r\n          x.d = v.d.slice();\r\n        }\r\n      } else {\r\n        x.e = v.e;\r\n        x.d = v.d ? v.d.slice() : v.d;\r\n      }\r\n\r\n      return;\r\n    }\r\n\r\n    t = typeof v;\r\n\r\n    if (t === 'number') {\r\n      if (v === 0) {\r\n        x.s = 1 / v < 0 ? -1 : 1;\r\n        x.e = 0;\r\n        x.d = [0];\r\n        return;\r\n      }\r\n\r\n      if (v < 0) {\r\n        v = -v;\r\n        x.s = -1;\r\n      } else {\r\n        x.s = 1;\r\n      }\r\n\r\n      // Fast path for small integers.\r\n      if (v === ~~v && v < 1e7) {\r\n        for (e = 0, i = v; i >= 10; i /= 10) e++;\r\n\r\n        if (external) {\r\n          if (e > Decimal.maxE) {\r\n            x.e = NaN;\r\n            x.d = null;\r\n          } else if (e < Decimal.minE) {\r\n            x.e = 0;\r\n            x.d = [0];\r\n          } else {\r\n            x.e = e;\r\n            x.d = [v];\r\n          }\r\n        } else {\r\n          x.e = e;\r\n          x.d = [v];\r\n        }\r\n\r\n        return;\r\n\r\n      // Infinity, NaN.\r\n      } else if (v * 0 !== 0) {\r\n        if (!v) x.s = NaN;\r\n        x.e = NaN;\r\n        x.d = null;\r\n        return;\r\n      }\r\n\r\n      return parseDecimal(x, v.toString());\r\n\r\n    } else if (t !== 'string') {\r\n      throw Error(invalidArgument + v);\r\n    }\r\n\r\n    // Minus sign?\r\n    if ((i = v.charCodeAt(0)) === 45) {\r\n      v = v.slice(1);\r\n      x.s = -1;\r\n    } else {\r\n      // Plus sign?\r\n      if (i === 43) v = v.slice(1);\r\n      x.s = 1;\r\n    }\r\n\r\n    return isDecimal.test(v) ? parseDecimal(x, v) : parseOther(x, v);\r\n  }\r\n\r\n  Decimal.prototype = P;\r\n\r\n  Decimal.ROUND_UP = 0;\r\n  Decimal.ROUND_DOWN = 1;\r\n  Decimal.ROUND_CEIL = 2;\r\n  Decimal.ROUND_FLOOR = 3;\r\n  Decimal.ROUND_HALF_UP = 4;\r\n  Decimal.ROUND_HALF_DOWN = 5;\r\n  Decimal.ROUND_HALF_EVEN = 6;\r\n  Decimal.ROUND_HALF_CEIL = 7;\r\n  Decimal.ROUND_HALF_FLOOR = 8;\r\n  Decimal.EUCLID = 9;\r\n\r\n  Decimal.config = Decimal.set = config;\r\n  Decimal.clone = clone;\r\n  Decimal.isDecimal = isDecimalInstance;\r\n\r\n  Decimal.abs = abs;\r\n  Decimal.acos = acos;\r\n  Decimal.acosh = acosh;        // ES6\r\n  Decimal.add = add;\r\n  Decimal.asin = asin;\r\n  Decimal.asinh = asinh;        // ES6\r\n  Decimal.atan = atan;\r\n  Decimal.atanh = atanh;        // ES6\r\n  Decimal.atan2 = atan2;\r\n  Decimal.cbrt = cbrt;          // ES6\r\n  Decimal.ceil = ceil;\r\n  Decimal.clamp = clamp;\r\n  Decimal.cos = cos;\r\n  Decimal.cosh = cosh;          // ES6\r\n  Decimal.div = div;\r\n  Decimal.exp = exp;\r\n  Decimal.floor = floor;\r\n  Decimal.hypot = hypot;        // ES6\r\n  Decimal.ln = ln;\r\n  Decimal.log = log;\r\n  Decimal.log10 = log10;        // ES6\r\n  Decimal.log2 = log2;          // ES6\r\n  Decimal.max = max;\r\n  Decimal.min = min;\r\n  Decimal.mod = mod;\r\n  Decimal.mul = mul;\r\n  Decimal.pow = pow;\r\n  Decimal.random = random;\r\n  Decimal.round = round;\r\n  Decimal.sign = sign;          // ES6\r\n  Decimal.sin = sin;\r\n  Decimal.sinh = sinh;          // ES6\r\n  Decimal.sqrt = sqrt;\r\n  Decimal.sub = sub;\r\n  Decimal.sum = sum;\r\n  Decimal.tan = tan;\r\n  Decimal.tanh = tanh;          // ES6\r\n  Decimal.trunc = trunc;        // ES6\r\n\r\n  if (obj === void 0) obj = {};\r\n  if (obj) {\r\n    if (obj.defaults !== true) {\r\n      ps = ['precision', 'rounding', 'toExpNeg', 'toExpPos', 'maxE', 'minE', 'modulo', 'crypto'];\r\n      for (i = 0; i < ps.length;) if (!obj.hasOwnProperty(p = ps[i++])) obj[p] = this[p];\r\n    }\r\n  }\r\n\r\n  Decimal.config(obj);\r\n\r\n  return Decimal;\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is `x` divided by `y`, rounded to `precision` significant\r\n * digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|Decimal}\r\n * y {number|string|Decimal}\r\n *\r\n */\r\nfunction div(x, y) {\r\n  return new this(x).div(y);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the natural exponential of `x`, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|Decimal} The power to which to raise the base of the natural log.\r\n *\r\n */\r\nfunction exp(x) {\r\n  return new this(x).exp();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is `x` round to an integer using `ROUND_FLOOR`.\r\n *\r\n * x {number|string|Decimal}\r\n *\r\n */\r\nfunction floor(x) {\r\n  return finalise(x = new this(x), x.e + 1, 3);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the square root of the sum of the squares of the arguments,\r\n * rounded to `precision` significant digits using rounding mode `rounding`.\r\n *\r\n * hypot(a, b, ...) = sqrt(a^2 + b^2 + ...)\r\n *\r\n * arguments {number|string|Decimal}\r\n *\r\n */\r\nfunction hypot() {\r\n  var i, n,\r\n    t = new this(0);\r\n\r\n  external = false;\r\n\r\n  for (i = 0; i < arguments.length;) {\r\n    n = new this(arguments[i++]);\r\n    if (!n.d) {\r\n      if (n.s) {\r\n        external = true;\r\n        return new this(1 / 0);\r\n      }\r\n      t = n;\r\n    } else if (t.d) {\r\n      t = t.plus(n.times(n));\r\n    }\r\n  }\r\n\r\n  external = true;\r\n\r\n  return t.sqrt();\r\n}\r\n\r\n\r\n/*\r\n * Return true if object is a Decimal instance (where Decimal is any Decimal constructor),\r\n * otherwise return false.\r\n *\r\n */\r\nfunction isDecimalInstance(obj) {\r\n  return obj instanceof Decimal || obj && obj.toStringTag === tag || false;\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the natural logarithm of `x`, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|Decimal}\r\n *\r\n */\r\nfunction ln(x) {\r\n  return new this(x).ln();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the log of `x` to the base `y`, or to base 10 if no base\r\n * is specified, rounded to `precision` significant digits using rounding mode `rounding`.\r\n *\r\n * log[y](x)\r\n *\r\n * x {number|string|Decimal} The argument of the logarithm.\r\n * y {number|string|Decimal} The base of the logarithm.\r\n *\r\n */\r\nfunction log(x, y) {\r\n  return new this(x).log(y);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the base 2 logarithm of `x`, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|Decimal}\r\n *\r\n */\r\nfunction log2(x) {\r\n  return new this(x).log(2);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the base 10 logarithm of `x`, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|Decimal}\r\n *\r\n */\r\nfunction log10(x) {\r\n  return new this(x).log(10);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the maximum of the arguments.\r\n *\r\n * arguments {number|string|Decimal}\r\n *\r\n */\r\nfunction max() {\r\n  return maxOrMin(this, arguments, 'lt');\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the minimum of the arguments.\r\n *\r\n * arguments {number|string|Decimal}\r\n *\r\n */\r\nfunction min() {\r\n  return maxOrMin(this, arguments, 'gt');\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is `x` modulo `y`, rounded to `precision` significant digits\r\n * using rounding mode `rounding`.\r\n *\r\n * x {number|string|Decimal}\r\n * y {number|string|Decimal}\r\n *\r\n */\r\nfunction mod(x, y) {\r\n  return new this(x).mod(y);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is `x` multiplied by `y`, rounded to `precision` significant\r\n * digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|Decimal}\r\n * y {number|string|Decimal}\r\n *\r\n */\r\nfunction mul(x, y) {\r\n  return new this(x).mul(y);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is `x` raised to the power `y`, rounded to precision\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|Decimal} The base.\r\n * y {number|string|Decimal} The exponent.\r\n *\r\n */\r\nfunction pow(x, y) {\r\n  return new this(x).pow(y);\r\n}\r\n\r\n\r\n/*\r\n * Returns a new Decimal with a random value equal to or greater than 0 and less than 1, and with\r\n * `sd`, or `Decimal.precision` if `sd` is omitted, significant digits (or less if trailing zeros\r\n * are produced).\r\n *\r\n * [sd] {number} Significant digits. Integer, 0 to MAX_DIGITS inclusive.\r\n *\r\n */\r\nfunction random(sd) {\r\n  var d, e, k, n,\r\n    i = 0,\r\n    r = new this(1),\r\n    rd = [];\r\n\r\n  if (sd === void 0) sd = this.precision;\r\n  else checkInt32(sd, 1, MAX_DIGITS);\r\n\r\n  k = Math.ceil(sd / LOG_BASE);\r\n\r\n  if (!this.crypto) {\r\n    for (; i < k;) rd[i++] = Math.random() * 1e7 | 0;\r\n\r\n  // Browsers supporting crypto.getRandomValues.\r\n  } else if (crypto.getRandomValues) {\r\n    d = crypto.getRandomValues(new Uint32Array(k));\r\n\r\n    for (; i < k;) {\r\n      n = d[i];\r\n\r\n      // 0 <= n < 4294967296\r\n      // Probability n >= 4.29e9, is 4967296 / 4294967296 = 0.00116 (1 in 865).\r\n      if (n >= 4.29e9) {\r\n        d[i] = crypto.getRandomValues(new Uint32Array(1))[0];\r\n      } else {\r\n\r\n        // 0 <= n <= 4289999999\r\n        // 0 <= (n % 1e7) <= 9999999\r\n        rd[i++] = n % 1e7;\r\n      }\r\n    }\r\n\r\n  // Node.js supporting crypto.randomBytes.\r\n  } else if (crypto.randomBytes) {\r\n\r\n    // buffer\r\n    d = crypto.randomBytes(k *= 4);\r\n\r\n    for (; i < k;) {\r\n\r\n      // 0 <= n < 2147483648\r\n      n = d[i] + (d[i + 1] << 8) + (d[i + 2] << 16) + ((d[i + 3] & 0x7f) << 24);\r\n\r\n      // Probability n >= 2.14e9, is 7483648 / 2147483648 = 0.0035 (1 in 286).\r\n      if (n >= 2.14e9) {\r\n        crypto.randomBytes(4).copy(d, i);\r\n      } else {\r\n\r\n        // 0 <= n <= 2139999999\r\n        // 0 <= (n % 1e7) <= 9999999\r\n        rd.push(n % 1e7);\r\n        i += 4;\r\n      }\r\n    }\r\n\r\n    i = k / 4;\r\n  } else {\r\n    throw Error(cryptoUnavailable);\r\n  }\r\n\r\n  k = rd[--i];\r\n  sd %= LOG_BASE;\r\n\r\n  // Convert trailing digits to zeros according to sd.\r\n  if (k && sd) {\r\n    n = mathpow(10, LOG_BASE - sd);\r\n    rd[i] = (k / n | 0) * n;\r\n  }\r\n\r\n  // Remove trailing words which are zero.\r\n  for (; rd[i] === 0; i--) rd.pop();\r\n\r\n  // Zero?\r\n  if (i < 0) {\r\n    e = 0;\r\n    rd = [0];\r\n  } else {\r\n    e = -1;\r\n\r\n    // Remove leading words which are zero and adjust exponent accordingly.\r\n    for (; rd[0] === 0; e -= LOG_BASE) rd.shift();\r\n\r\n    // Count the digits of the first word of rd to determine leading zeros.\r\n    for (k = 1, n = rd[0]; n >= 10; n /= 10) k++;\r\n\r\n    // Adjust the exponent for leading zeros of the first word of rd.\r\n    if (k < LOG_BASE) e -= LOG_BASE - k;\r\n  }\r\n\r\n  r.e = e;\r\n  r.d = rd;\r\n\r\n  return r;\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is `x` rounded to an integer using rounding mode `rounding`.\r\n *\r\n * To emulate `Math.round`, set rounding to 7 (ROUND_HALF_CEIL).\r\n *\r\n * x {number|string|Decimal}\r\n *\r\n */\r\nfunction round(x) {\r\n  return finalise(x = new this(x), x.e + 1, this.rounding);\r\n}\r\n\r\n\r\n/*\r\n * Return\r\n *   1    if x > 0,\r\n *  -1    if x < 0,\r\n *   0    if x is 0,\r\n *  -0    if x is -0,\r\n *   NaN  otherwise\r\n *\r\n * x {number|string|Decimal}\r\n *\r\n */\r\nfunction sign(x) {\r\n  x = new this(x);\r\n  return x.d ? (x.d[0] ? x.s : 0 * x.s) : x.s || NaN;\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the sine of `x`, rounded to `precision` significant digits\r\n * using rounding mode `rounding`.\r\n *\r\n * x {number|string|Decimal} A value in radians.\r\n *\r\n */\r\nfunction sin(x) {\r\n  return new this(x).sin();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the hyperbolic sine of `x`, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|Decimal} A value in radians.\r\n *\r\n */\r\nfunction sinh(x) {\r\n  return new this(x).sinh();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the square root of `x`, rounded to `precision` significant\r\n * digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|Decimal}\r\n *\r\n */\r\nfunction sqrt(x) {\r\n  return new this(x).sqrt();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is `x` minus `y`, rounded to `precision` significant digits\r\n * using rounding mode `rounding`.\r\n *\r\n * x {number|string|Decimal}\r\n * y {number|string|Decimal}\r\n *\r\n */\r\nfunction sub(x, y) {\r\n  return new this(x).sub(y);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the sum of the arguments, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * Only the result is rounded, not the intermediate calculations.\r\n *\r\n * arguments {number|string|Decimal}\r\n *\r\n */\r\nfunction sum() {\r\n  var i = 0,\r\n    args = arguments,\r\n    x = new this(args[i]);\r\n\r\n  external = false;\r\n  for (; x.s && ++i < args.length;) x = x.plus(args[i]);\r\n  external = true;\r\n\r\n  return finalise(x, this.precision, this.rounding);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the tangent of `x`, rounded to `precision` significant\r\n * digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|Decimal} A value in radians.\r\n *\r\n */\r\nfunction tan(x) {\r\n  return new this(x).tan();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the hyperbolic tangent of `x`, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|Decimal} A value in radians.\r\n *\r\n */\r\nfunction tanh(x) {\r\n  return new this(x).tanh();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is `x` truncated to an integer.\r\n *\r\n * x {number|string|Decimal}\r\n *\r\n */\r\nfunction trunc(x) {\r\n  return finalise(x = new this(x), x.e + 1, 1);\r\n}\r\n\r\n\r\nP[Symbol.for('nodejs.util.inspect.custom')] = P.toString;\r\nP[Symbol.toStringTag] = 'Decimal';\r\n\r\n// Create and configure initial Decimal constructor.\r\nexport var Decimal = P.constructor = clone(DEFAULTS);\r\n\r\n// Create the internal constants from their string values.\r\nLN10 = new Decimal(LN10);\r\nPI = new Decimal(PI);\r\n\r\nexport default Decimal;\r\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 { TOKEN_PROGRAM_ID } from \"@solana/spl-token\";\nimport { AccountMeta, PublicKey, SystemProgram, SYSVAR_RENT_PUBKEY } from \"@solana/web3.js\";\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 { 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.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.raydium.io/icon/So11111111111111111111111111111111111111112.png`,\n  tags: [],\n  priority: 2,\n  type: \"raydium\",\n  extensions: {\n    coingeckoId: \"solana\",\n  },\n};\n","import _Big from \"big.js\";\nimport BN from \"bn.js\";\nimport _Decimal from \"decimal.js-light\";\n\nimport { BigNumberish, parseBigNumberish, Rounding } from \"../common/bignumber\";\nimport { createLogger } from \"../common/logger\";\n\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 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 { BigNumberish, Rounding, 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 { 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 { Rounding } from \"../common/bignumber\";\nimport BN from \"bn.js\";\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 {\n  Connection,\n  PublicKey,\n  sendAndConfirmTransaction,\n  Signer,\n  Transaction,\n  TransactionInstruction,\n  TransactionMessage,\n  VersionedTransaction,\n  Commitment,\n} from \"@solana/web3.js\";\nimport axios from \"axios\";\n\nimport { SignAllTransactions, ComputeBudgetConfig } from \"@/raydium/type\";\nimport { Api } from \"@/api\";\nimport { Cluster } from \"@/solana\";\nimport { TxVersion } from \"./txType\";\nimport { Owner } from \"../owner\";\nimport { getRecentBlockHash, addComputeBudget, checkLegacyTxSize, checkV0TxSize, printSimulate } from \"./txUtils\";\nimport { CacheLTA, getMultipleLookupTableInfo, LOOKUP_TABLE_CACHE } from \"./lookupTable\";\n\ninterface SolanaFeeInfo {\n  min: number;\n  max: number;\n  avg: number;\n  priorityTx: number;\n  nonVotes: number;\n  priorityRatio: number;\n  avgCuPerBlock: number;\n  blockspaceUsageRatio: number;\n}\ntype SolanaFeeInfoJson = {\n  \"1\": SolanaFeeInfo;\n  \"5\": SolanaFeeInfo;\n  \"15\": SolanaFeeInfo;\n};\n\ninterface ExecuteParams {\n  skipPreflight?: boolean;\n  recentBlockHash?: string;\n  sendAndConfirm?: boolean;\n}\n\ninterface TxBuilderInit {\n  connection: Connection;\n  feePayer: PublicKey;\n  cluster: Cluster;\n  owner?: Owner;\n  blockhashCommitment?: Commitment;\n  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  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\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 api?: Api;\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.api = params.api;\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 async calComputeBudget({\n    config: propConfig,\n    defaultIns,\n  }: {\n    config?: ComputeBudgetConfig;\n    defaultIns?: TransactionInstruction[];\n  }): Promise<void> {\n    try {\n      const config = propConfig || (await this.getComputeBudgetConfig());\n      if (this.addCustomComputeBudget(config)) return;\n      defaultIns && this.instructions.unshift(...defaultIns);\n    } catch {\n      defaultIns && this.instructions.unshift(...defaultIns);\n    }\n  }\n\n  public addInstruction({\n    instructions = [],\n    endInstructions = [],\n    signers = [],\n    instructionTypes = [],\n    endInstructionTypes = [],\n    lookupTableAddress = [],\n  }: AddInstructionParam): TxBuilder {\n    this.instructions.push(...instructions);\n    this.endInstructions.push(...endInstructions);\n    this.signers.push(...signers);\n    this.instructionTypes.push(...instructionTypes);\n    this.endInstructionTypes.push(...endInstructionTypes);\n    this.lookupTableAddress.push(...lookupTableAddress.filter((address) => address !== PublicKey.default.toString()));\n    return this;\n  }\n\n  public async versionBuild<O = Record<string, any>>({\n    txVersion,\n    extInfo,\n  }: {\n    txVersion?: TxVersion;\n    extInfo?: O;\n  }): Promise<MakeTxData<TxVersion.LEGACY, O> | MakeTxData<TxVersion.V0, O>> {\n    if (txVersion === TxVersion.V0) return (await this.buildV0({ ...(extInfo || {}) })) as MakeTxData<TxVersion.V0, O>;\n    return this.build<O>(extInfo) as MakeTxData<TxVersion.LEGACY, O>;\n  }\n\n  public build<O = Record<string, any>>(extInfo?: O): MakeTxData<TxVersion.LEGACY, O> {\n    const transaction = new Transaction();\n    if (this.allInstructions.length) transaction.add(...this.allInstructions);\n    transaction.feePayer = this.feePayer;\n    if (this.owner?.signer && !this.signers.some((s) => s.publicKey.equals(this.owner!.publicKey)))\n      this.signers.push(this.owner.signer);\n\n    return {\n      builder: this,\n      transaction,\n      signers: this.signers,\n      instructionTypes: [...this.instructionTypes, ...this.endInstructionTypes],\n      execute: async (params) => {\n        const { recentBlockHash: propBlockHash, skipPreflight = true, sendAndConfirm } = params || {};\n        const recentBlockHash = propBlockHash ?? (await getRecentBlockHash(this.connection, this.blockhashCommitment));\n        transaction.recentBlockhash = recentBlockHash;\n        if (this.signers.length) transaction.sign(...this.signers);\n\n        printSimulate([transaction]);\n        if (this.owner?.isKeyPair) {\n          const txId = sendAndConfirm\n            ? await sendAndConfirmTransaction(\n                this.connection,\n                transaction,\n                this.signers.find((s) => s.publicKey.equals(this.owner!.publicKey))\n                  ? this.signers\n                  : [...this.signers, this.owner.signer!],\n                { skipPreflight },\n              )\n            : await this.connection.sendRawTransaction(transaction.serialize(), { skipPreflight });\n\n          return {\n            txId,\n            signedTx: transaction,\n          };\n        }\n        if (this.signAllTransactions) {\n          const txs = await this.signAllTransactions([transaction]);\n          return {\n            txId: await this.connection.sendRawTransaction(txs[0].serialize(), { skipPreflight }),\n            signedTx: txs[0],\n          };\n        }\n        throw new Error(\"please provide owner in keypair format or signAllTransactions function\");\n      },\n      extInfo: extInfo || ({} as O),\n    };\n  }\n\n  public buildMultiTx<T = Record<string, any>>(params: {\n    extraPreBuildData?: MakeTxData<TxVersion.LEGACY>[];\n    extInfo?: T;\n  }): MultiTxBuildData {\n    const { extraPreBuildData = [], extInfo } = params;\n    const { transaction } = this.build(extInfo);\n\n    const filterExtraBuildData = extraPreBuildData.filter((data) => data.transaction.instructions.length > 0);\n\n    const allTransactions: Transaction[] = [transaction, ...filterExtraBuildData.map((data) => data.transaction)];\n    const allSigners: Signer[][] = [this.signers, ...filterExtraBuildData.map((data) => data.signers)];\n    const allInstructionTypes: string[] = [\n      ...this.instructionTypes,\n      ...filterExtraBuildData.map((data) => data.instructionTypes).flat(),\n    ];\n\n    if (this.owner?.signer) {\n      allSigners.forEach((signers) => {\n        if (!signers.some((s) => s.publicKey.equals(this.owner!.publicKey))) this.signers.push(this.owner!.signer!);\n      });\n    }\n\n    return {\n      builder: this,\n      transactions: allTransactions,\n      signers: allSigners,\n      instructionTypes: allInstructionTypes,\n      execute: async (executeParams?: MultiTxExecuteParam) => {\n        const { sequentially, onTxUpdate, recentBlockHash: propBlockHash, skipPreflight = true } = executeParams || {};\n        const recentBlockHash = propBlockHash ?? (await getRecentBlockHash(this.connection, this.blockhashCommitment));\n        if (this.owner?.isKeyPair) {\n          if (sequentially) {\n            const txIds: string[] = [];\n            for (const tx of allTransactions) {\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              this.connection.onSignature(\n                txId,\n                (signatureResult) => {\n                  const targetTxIdx = processedTxs.findIndex((tx) => tx.txId === txId);\n                  if (targetTxIdx > -1) processedTxs[targetTxIdx].status = signatureResult.err ? \"error\" : \"success\";\n                  onTxUpdate?.([...processedTxs]);\n                  if (!signatureResult.err) checkSendTx();\n                },\n                \"processed\",\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    },\n  ): Promise<MakeTxData<TxVersion.V0, O>> {\n    const { lookupTableCache = {}, lookupTableAddress = [], forerunCreate, ...extInfo } = 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 messageV0 = new TransactionMessage({\n      payerKey: this.feePayer,\n      recentBlockhash: forerunCreate\n        ? PublicKey.default.toBase58()\n        : await getRecentBlockHash(this.connection, this.blockhashCommitment),\n      instructions: [...this.allInstructions],\n    }).compileToV0Message(Object.values(lookupTableAddressAccount));\n\n    if (this.owner?.signer && !this.signers.some((s) => s.publicKey.equals(this.owner!.publicKey)))\n      this.signers.push(this.owner.signer);\n    const transaction = new VersionedTransaction(messageV0);\n    transaction.sign(this.signers);\n\n    return {\n      builder: this,\n      transaction,\n      signers: this.signers,\n      instructionTypes: [...this.instructionTypes, ...this.endInstructionTypes],\n      execute: async (params) => {\n        const { recentBlockHash: propBlockHash, skipPreflight = true, sendAndConfirm } = params || {};\n        if (propBlockHash) transaction.message.recentBlockhash = propBlockHash;\n        printSimulate([transaction]);\n        if (this.owner?.isKeyPair) {\n          const txId = await this.connection.sendTransaction(transaction, { skipPreflight });\n          if (sendAndConfirm) {\n            const { lastValidBlockHeight, blockhash } = await this.connection.getLatestBlockhash({\n              commitment: this.blockhashCommitment,\n            });\n            await this.connection.confirmTransaction(\n              {\n                blockhash,\n                lastValidBlockHeight,\n                signature: txId,\n              },\n              \"confirmed\",\n            );\n          }\n\n          return {\n            txId,\n            signedTx: transaction,\n          };\n        }\n        if (this.signAllTransactions) {\n          const txs = await this.signAllTransactions<VersionedTransaction>([transaction]);\n          return {\n            txId: await this.connection.sendTransaction(txs[0], { skipPreflight }),\n            signedTx: txs[0],\n          };\n        }\n        throw new Error(\"please provide owner in keypair format or signAllTransactions function\");\n      },\n      extInfo: (extInfo || {}) as O,\n    };\n  }\n\n  public async buildV0MultiTx<T = Record<string, any>>(params: {\n    extraPreBuildData?: MakeTxData<TxVersion.V0>[];\n    buildProps?: T & {\n      lookupTableCache?: CacheLTA;\n      lookupTableAddress?: string[];\n    };\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              const { lastValidBlockHeight, blockhash } = await this.connection.getLatestBlockhash({\n                commitment: this.blockhashCommitment,\n              });\n              await this.connection.confirmTransaction(\n                {\n                  blockhash,\n                  lastValidBlockHeight,\n                  signature: txId,\n                },\n                \"confirmed\",\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\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              this.connection.onSignature(\n                txId,\n                (signatureResult) => {\n                  const targetTxIdx = processedTxs.findIndex((tx) => tx.txId === txId);\n                  if (targetTxIdx > -1) processedTxs[targetTxIdx].status = signatureResult.err ? \"error\" : \"success\";\n                  onTxUpdate?.([...processedTxs]);\n                  if (!signatureResult.err) checkSendTx();\n                },\n                \"processed\",\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 },\n  ): Promise<MultiTxBuildData> {\n    const { 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    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        (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\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))) this.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 { sequentially, onTxUpdate, recentBlockHash: propBlockHash, skipPreflight = true } = 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            const txIds: string[] = [];\n            for (const tx of allTransactions) {\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 signedTxs = await this.signAllTransactions(allTransactions);\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              this.connection.onSignature(\n                txId,\n                (signatureResult) => {\n                  const targetTxIdx = processedTxs.findIndex((tx) => tx.txId === txId);\n                  if (targetTxIdx > -1) processedTxs[targetTxIdx].status = signatureResult.err ? \"error\" : \"success\";\n                  onTxUpdate?.([...processedTxs]);\n                  if (!signatureResult.err) checkSendTx();\n                },\n                \"processed\",\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    },\n  ): Promise<MultiTxV0BuildData> {\n    const { computeBudgetConfig, lookupTableCache = {}, lookupTableAddress = [], ...extInfo } = 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    this.allInstructions.forEach((item) => {\n      const _itemIns = [...instructionQueue, item];\n      const _itemInsWithCompute = computeBudgetConfig ? [...computeBudgetData.instructions, ..._itemIns] : _itemIns;\n      if (\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\n        const lookupTableAddress: undefined | CacheLTA = {};\n        for (const item of [...new Set<string>(allLTA)]) {\n          if (lookupTableAddressAccount[item] !== undefined) lookupTableAddress[item] = lookupTableAddressAccount[item];\n        }\n        // if add computeBudget still not exceed tx size limit\n        if (\n          computeBudgetConfig &&\n          checkV0TxSize({\n            instructions: [...computeBudgetData.instructions, ...instructionQueue],\n            payer: this.feePayer,\n            lookupTableAddressAccount,\n            recentBlockhash: blockHash,\n          })\n        ) {\n          const messageV0 = new TransactionMessage({\n            payerKey: this.feePayer,\n            recentBlockhash: blockHash,\n\n            instructions: [...computeBudgetData.instructions, ...instructionQueue],\n          }).compileToV0Message(Object.values(lookupTableAddressAccount));\n          allTransactions.push(new VersionedTransaction(messageV0));\n        } else {\n          const messageV0 = new TransactionMessage({\n            payerKey: this.feePayer,\n            recentBlockhash: blockHash,\n            instructions: [...instructionQueue],\n          }).compileToV0Message(Object.values(lookupTableAddressAccount));\n          allTransactions.push(new VersionedTransaction(messageV0));\n        }\n        allSigners.push(\n          Array.from(\n            new Set<string>(\n              instructionQueue.map((i) => i.keys.filter((ii) => ii.isSigner).map((ii) => ii.pubkey.toString())).flat(),\n            ),\n          )\n            .map((i) => signerKey[i])\n            .filter((i) => i !== undefined),\n        );\n        instructionQueue = [item];\n      }\n    });\n\n    if (instructionQueue.length > 0) {\n      const _signerStrs = new Set<string>(\n        instructionQueue.map((i) => i.keys.filter((ii) => ii.isSigner).map((ii) => ii.pubkey.toString())).flat(),\n      );\n      const _signers = [..._signerStrs.values()].map((i) => signerKey[i]).filter((i) => i !== undefined);\n\n      if (\n        computeBudgetConfig &&\n        checkV0TxSize({\n          instructions: [...computeBudgetData.instructions, ...instructionQueue],\n          payer: this.feePayer,\n          lookupTableAddressAccount,\n          recentBlockhash: blockHash,\n        })\n      ) {\n        const messageV0 = new TransactionMessage({\n          payerKey: this.feePayer,\n          recentBlockhash: blockHash,\n          instructions: [...computeBudgetData.instructions, ...instructionQueue],\n        }).compileToV0Message(Object.values(lookupTableAddressAccount));\n        allTransactions.push(new VersionedTransaction(messageV0));\n      } else {\n        const messageV0 = new TransactionMessage({\n          payerKey: this.feePayer,\n          recentBlockhash: blockHash,\n          instructions: [...instructionQueue],\n        }).compileToV0Message(Object.values(lookupTableAddressAccount));\n        allTransactions.push(new VersionedTransaction(messageV0));\n      }\n      allSigners.push(_signers);\n    }\n\n    if (this.owner?.signer) {\n      allSigners.forEach((signers) => {\n        if (!signers.some((s) => s.publicKey.equals(this.owner!.publicKey))) this.signers.push(this.owner!.signer!);\n      });\n    }\n\n    return {\n      builder: this,\n      transactions: allTransactions,\n      buildProps: props,\n      signers: allSigners,\n      instructionTypes: this.instructionTypes,\n      execute: async (executeParams?: MultiTxExecuteParam) => {\n        const { sequentially, onTxUpdate, recentBlockHash: propBlockHash, skipPreflight = true } = 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            const txIds: string[] = [];\n            for (const tx of allTransactions) {\n              const txId = await this.connection.sendTransaction(tx, { skipPreflight });\n              const { lastValidBlockHeight, blockhash } = await this.connection.getLatestBlockhash({\n                commitment: this.blockhashCommitment,\n              });\n              await this.connection.confirmTransaction(\n                {\n                  blockhash,\n                  lastValidBlockHeight,\n                  signature: txId,\n                },\n                \"confirmed\",\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 signedTxs = await this.signAllTransactions(allTransactions);\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              this.connection.onSignature(\n                txId,\n                (signatureResult) => {\n                  const targetTxIdx = processedTxs.findIndex((tx) => tx.txId === txId);\n                  if (targetTxIdx > -1) processedTxs[targetTxIdx].status = signatureResult.err ? \"error\" : \"success\";\n                  onTxUpdate?.([...processedTxs]);\n                  if (!signatureResult.err) checkSendTx();\n                },\n                \"processed\",\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","export enum TxVersion {\n  \"V0\",\n  \"LEGACY\",\n}\n\nexport const InstructionType = {\n  CreateAccount: \"CreateAccount\",\n  InitAccount: \"InitAccount\",\n  CreateATA: \"CreateATA\",\n  CloseAccount: \"CloseAccount\",\n  TransferAmount: \"TransferAmount\",\n  InitMint: \"InitMint\",\n  MintTo: \"MintTo\",\n\n  InitMarket: \"InitMarket\", // create market main ins\n  Util1216OwnerClaim: \"Util1216OwnerClaim\", // owner claim token ins\n\n  SetComputeUnitPrice: \"SetComputeUnitPrice\",\n  SetComputeUnitLimit: \"SetComputeUnitLimit\",\n\n  // CLMM\n  ClmmCreatePool: \"ClmmCreatePool\",\n  ClmmOpenPosition: \"ClmmOpenPosition\",\n  ClmmIncreasePosition: \"ClmmIncreasePosition\",\n  ClmmDecreasePosition: \"ClmmDecreasePosition\",\n  ClmmClosePosition: \"ClmmClosePosition\",\n  ClmmSwapBaseIn: \"ClmmSwapBaseIn\",\n  ClmmSwapBaseOut: \"ClmmSwapBaseOut\",\n  ClmmInitReward: \"ClmmInitReward\",\n  ClmmSetReward: \"ClmmSetReward\",\n  ClmmCollectReward: \"ClmmCollectReward\",\n\n  AmmV4Swap: \"AmmV4Swap\",\n  AmmV4AddLiquidity: \"AmmV4AddLiquidity\",\n  AmmV4RemoveLiquidity: \"AmmV4RemoveLiquidity\",\n  AmmV4SimulatePoolInfo: \"AmmV4SimulatePoolInfo\",\n  AmmV4SwapBaseIn: \"AmmV4SwapBaseIn\",\n  AmmV4SwapBaseOut: \"AmmV4SwapBaseOut\",\n  AmmV4CreatePool: \"AmmV4CreatePool\",\n  AmmV4InitPool: \"AmmV4InitPool\",\n\n  AmmV5AddLiquidity: \"AmmV5AddLiquidity\",\n  AmmV5RemoveLiquidity: \"AmmV5RemoveLiquidity\",\n  AmmV5SimulatePoolInfo: \"AmmV5SimulatePoolInfo\",\n  AmmV5SwapBaseIn: \"AmmV5SwapBaseIn\",\n  AmmV5SwapBaseOut: \"AmmV5SwapBaseOut\",\n\n  RouteSwap: \"RouteSwap\",\n  RouteSwap1: \"RouteSwap1\",\n  RouteSwap2: \"RouteSwap2\",\n\n  FarmV3Deposit: \"FarmV3Deposit\",\n  FarmV3Withdraw: \"FarmV3Withdraw\",\n  FarmV3CreateLedger: \"FarmV3CreateLedger\",\n\n  FarmV5Deposit: \"FarmV5Deposit\",\n  FarmV5Withdraw: \"FarmV5Withdraw\",\n  FarmV5CreateLedger: \"FarmV5CreateLedger\",\n\n  FarmV6Deposit: \"FarmV6Deposit\",\n  FarmV6Withdraw: \"FarmV6Withdraw\",\n  FarmV6Create: \"FarmV6Create\",\n  FarmV6Restart: \"FarmV6Restart\",\n  FarmV6CreatorAddReward: \"FarmV6CreatorAddReward\",\n  FarmV6CreatorWithdraw: \"FarmV6CreatorWithdraw\",\n\n  CpmmCreatePool: \"CpmmCreatePool\",\n  CpmmAddLiquidity: \"CpmmAddLiquidity\",\n  CpmmWithdrawLiquidity: \"CpmmWithdrawLiquidity\",\n  CpmmSwapBaseIn: \"CpmmSwapBaseIn\",\n  CpmmSwapBaseOut: \"CpmmSwapBaseOut\",\n};\n","import {\n  Connection,\n  PublicKey,\n  ComputeBudgetProgram,\n  SimulatedTransactionResponse,\n  Transaction,\n  TransactionInstruction,\n  TransactionMessage,\n  Keypair,\n  EpochInfo,\n  VersionedTransaction,\n  Commitment,\n} from \"@solana/web3.js\";\nimport { TOKEN_PROGRAM_ID } from \"@solana/spl-token\";\n\nimport { createLogger } from \"../logger\";\nimport { InstructionType } from \"./txType\";\nimport { CacheLTA } from \"./lookupTable\";\n\nimport { ComputeBudgetConfig } from \"@/raydium/type\";\n\nconst logger = createLogger(\"Raydium_txUtil\");\n\nexport const MAX_BASE64_SIZE = 1644;\n\nexport function addComputeBudget(config: ComputeBudgetConfig): {\n  instructions: TransactionInstruction[];\n  instructionTypes: string[];\n} {\n  const ins: TransactionInstruction[] = [];\n  const insTypes: string[] = [];\n  if (config.microLamports) {\n    ins.push(ComputeBudgetProgram.setComputeUnitPrice({ microLamports: config.microLamports }));\n    insTypes.push(InstructionType.SetComputeUnitPrice);\n  }\n  if (config.units) {\n    ins.push(ComputeBudgetProgram.setComputeUnitLimit({ units: config.units }));\n    insTypes.push(InstructionType.SetComputeUnitLimit);\n  }\n\n  return {\n    instructions: ins,\n    instructionTypes: insTypes,\n  };\n}\n\nexport async function getRecentBlockHash(connection: Connection, propsCommitment?: Commitment): Promise<string> {\n  const commitment = propsCommitment ?? \"confirmed\";\n  try {\n    return (\n      (await connection.getLatestBlockhash?.({ commitment }))?.blockhash ||\n      (await connection.getRecentBlockhash(commitment)).blockhash\n    );\n  } catch {\n    return (await connection.getRecentBlockhash(commitment)).blockhash;\n  }\n}\n\n/**\n * Forecast transaction size\n */\nexport function forecastTransactionSize(instructions: TransactionInstruction[], signers: PublicKey[]): boolean {\n  if (instructions.length < 1) logger.logWithError(`no instructions provided: ${instructions.toString()}`);\n  if (signers.length < 1) logger.logWithError(`no signers provided:, ${signers.toString()}`);\n\n  const transaction = new Transaction();\n  transaction.recentBlockhash = \"11111111111111111111111111111111\";\n  transaction.feePayer = signers[0];\n  transaction.add(...instructions);\n\n  try {\n    return Buffer.from(transaction.serialize({ verifySignatures: false })).toString(\"base64\").length < MAX_BASE64_SIZE;\n  } catch (error) {\n    return false;\n  }\n}\n\n/**\n * Simulates multiple instruction\n */\n/**\n * Simulates multiple instruction\n */\nexport async function simulateMultipleInstruction(\n  connection: Connection,\n  instructions: TransactionInstruction[],\n  keyword: string,\n  batchRequest = true,\n): Promise<string[]> {\n  const feePayer = new PublicKey(\"RaydiumSimuLateTransaction11111111111111111\");\n\n  const transactions: Transaction[] = [];\n\n  let transaction = new Transaction();\n  transaction.feePayer = feePayer;\n\n  for (const instruction of instructions) {\n    if (!forecastTransactionSize([...transaction.instructions, instruction], [feePayer])) {\n      transactions.push(transaction);\n      transaction = new Transaction();\n      transaction.feePayer = feePayer;\n    }\n    transaction.add(instruction);\n  }\n  if (transaction.instructions.length > 0) {\n    transactions.push(transaction);\n  }\n\n  let results: SimulatedTransactionResponse[] = [];\n\n  try {\n    results = await simulateTransaction(connection, transactions, batchRequest);\n    if (results.find((i) => i.err !== null)) throw Error(\"rpc simulateTransaction error\");\n  } catch (error) {\n    if (error instanceof Error) {\n      logger.logWithError(\"failed to simulate for instructions\", \"RPC_ERROR\", {\n        message: error.message,\n      });\n    }\n  }\n\n  const logs: string[] = [];\n  for (const result of results) {\n    logger.debug(\"simulate result:\", result);\n\n    if (result.logs) {\n      const filteredLog = result.logs.filter((log) => log && log.includes(keyword));\n      logger.debug(\"filteredLog:\", logs);\n      if (!filteredLog.length) logger.logWithError(\"simulate log not match keyword\", \"keyword\", keyword);\n      logs.push(...filteredLog);\n    }\n  }\n\n  return logs;\n}\n\nexport function parseSimulateLogToJson(log: string, keyword: string): any {\n  const results = log.match(/{[\"\\w:,]+}/g);\n  if (!results || results.length !== 1) {\n    return logger.logWithError(`simulate log fail to match json, keyword: ${keyword}`);\n  }\n\n  return results[0];\n}\n\nexport function parseSimulateValue(log: string, key: string): any {\n  const reg = new RegExp(`\"${key}\":(\\\\d+)`, \"g\");\n\n  const results = reg.exec(log);\n  if (!results || results.length !== 2) {\n    return logger.logWithError(`simulate log fail to match key\", key: ${key}`);\n  }\n\n  return results[1];\n}\n\nexport interface ProgramAddress {\n  publicKey: PublicKey;\n  nonce: number;\n}\nexport function findProgramAddress(\n  seeds: Array<Buffer | Uint8Array>,\n  programId: PublicKey,\n): {\n  publicKey: PublicKey;\n  nonce: number;\n} {\n  const [publicKey, nonce] = PublicKey.findProgramAddressSync(seeds, programId);\n  return { publicKey, nonce };\n}\n\nexport async function simulateTransaction(\n  connection: Connection,\n  transactions: Transaction[],\n  batchRequest?: boolean,\n): Promise<any[]> {\n  let results: any[] = [];\n  if (batchRequest) {\n    const getLatestBlockhash = await connection.getLatestBlockhash();\n\n    const encodedTransactions: string[] = [];\n    for (const transaction of transactions) {\n      transaction.recentBlockhash = getLatestBlockhash.blockhash;\n      transaction.lastValidBlockHeight = getLatestBlockhash.lastValidBlockHeight;\n\n      // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n      // @ts-ignore\n      const message = transaction._compile();\n      const signData = message.serialize();\n\n      // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n      // @ts-ignore\n      const wireTransaction = transaction._serialize(signData);\n      const encodedTransaction = wireTransaction.toString(\"base64\");\n\n      encodedTransactions.push(encodedTransaction);\n    }\n\n    const batch = encodedTransactions.map((keys) => {\n      const args = connection._buildArgs([keys], undefined, \"base64\");\n      return {\n        methodName: \"simulateTransaction\",\n        args,\n      };\n    });\n\n    const reqData: { methodName: string; args: any[] }[][] = [];\n    const itemReqIndex = 20;\n    for (let i = 0; i < Math.ceil(batch.length / itemReqIndex); i++) {\n      reqData.push(batch.slice(i * itemReqIndex, (i + 1) * itemReqIndex));\n    }\n    // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n    // @ts-ignore\n    results = await (\n      await Promise.all(\n        reqData.map(async (i) => (await (connection as any)._rpcBatchRequest(i)).map((ii) => ii.result.value)),\n      )\n    ).flat();\n  } else {\n    try {\n      results = await Promise.all(\n        transactions.map(async (transaction) => await (await connection.simulateTransaction(transaction)).value),\n      );\n    } catch (error) {\n      if (error instanceof Error) {\n        logger.logWithError(\"failed to get info for multiple accounts\", \"RPC_ERROR\", {\n          message: error.message,\n        });\n      }\n    }\n  }\n\n  return results;\n}\n\nexport function checkLegacyTxSize({\n  instructions,\n  payer,\n  signers,\n}: {\n  instructions: TransactionInstruction[];\n  payer: PublicKey;\n  signers: PublicKey[];\n}): boolean {\n  return forecastTransactionSize(instructions, [payer, ...signers]);\n}\n\nexport function checkV0TxSize({\n  instructions,\n  payer,\n  lookupTableAddressAccount,\n  recentBlockhash = Keypair.generate().publicKey.toString(),\n}: {\n  instructions: TransactionInstruction[];\n  payer: PublicKey;\n  lookupTableAddressAccount?: CacheLTA;\n  recentBlockhash?: string;\n}): boolean {\n  const transactionMessage = new TransactionMessage({\n    payerKey: payer,\n    recentBlockhash,\n    instructions,\n  });\n\n  const messageV0 = transactionMessage.compileToV0Message(Object.values(lookupTableAddressAccount ?? {}));\n  try {\n    const buildLength = Buffer.from(new VersionedTransaction(messageV0).serialize()).toString(\"base64\").length;\n    return buildLength < MAX_BASE64_SIZE;\n  } catch (error) {\n    return false;\n  }\n}\n\nlet epochInfoCache: { time: number; data?: EpochInfo } = {\n  time: 0,\n  data: undefined,\n};\n\nexport async function getEpochInfo(connection: Connection): Promise<EpochInfo> {\n  if (!epochInfoCache.data || (Date.now() - epochInfoCache.time) / 1000 > 30) {\n    const data = await connection.getEpochInfo();\n    epochInfoCache = {\n      time: Date.now(),\n      data,\n    };\n    return data;\n  } else {\n    return epochInfoCache.data;\n  }\n}\n\nexport const toBuffer = (arr: Buffer | Uint8Array | Array<number>): Buffer => {\n  if (Buffer.isBuffer(arr)) {\n    return arr;\n  } else if (arr instanceof Uint8Array) {\n    return Buffer.from(arr.buffer, arr.byteOffset, arr.byteLength);\n  } else {\n    return Buffer.from(arr);\n  }\n};\n\nexport function printSimulate(transactions: Transaction[] | VersionedTransaction[]): string[] {\n  const allBase64: string[] = [];\n  transactions.forEach((transaction) => {\n    if (transaction instanceof Transaction) {\n      if (!transaction.recentBlockhash) transaction.recentBlockhash = TOKEN_PROGRAM_ID.toBase58();\n      if (!transaction.feePayer) transaction.feePayer = Keypair.generate().publicKey;\n    }\n    let serialized = transaction.serialize({ requireAllSignatures: false, verifySignatures: false });\n    if (transaction instanceof VersionedTransaction) serialized = toBuffer(serialized);\n    const base64 = serialized.toString(\"base64\");\n    allBase64.push(base64);\n  });\n  console.log(\"simulate tx string:\", allBase64);\n\n  return allBase64;\n}\n\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 { 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  \"2immgwYNHBbyVQKVGCEkgWpi53bLwWNRMB5G2nbgYV17\": new AddressLookupTableAccount({\n    key: new PublicKey(\"2immgwYNHBbyVQKVGCEkgWpi53bLwWNRMB5G2nbgYV17\"),\n    state: AddressLookupTableAccount.deserialize(\n      Buffer.from(\n        \"AQAAAP//////////d49+DAAAAAAAAQZMWvw7GUNJdaccNBVnb57OKakxL2BHLYvhRwVILRsgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMGRm/lIRcy/+ytunLDm+e8jOW7xfcSayxDmzpAAAAABt324ddloZPZy+FGzut5rBy0he1fWzeROoz1hX7/AKkG3fbh7nWP3hhCXbzkbM3athr8TYO5DSf+vfko2KGL/AVKU1D4XciC1hSlVnJ4iilt3x6rq9CmBniISTL07vagBqfVFxksXFEhjMlMPUrxf1ja7gibof1E49vZigAAAAAGp9UXGMd0yShWY5hpHV62i164o5tLbVxzVVshAAAAAIyXJY9OJInxuz0QKRSODYMLWhOZ2v8QhASOe9jb6fhZC3BlsePRfEU4nVJ/awTDzVi4bHMaoP21SbbRvAP4KUbIScv+6Yw2LHF/6K0ZjUPibbSWXCirYPGuuVl7zT789IUPLW4CpHr4JNCatp3ELXDLKMv6JJ+37le50lbBJ2LvDQdRqCgtphMF/imcN7mY5YRx2xE1A3MQ+L4QRaYK9u4GRfZP3LsAd00a+IkCpA22UNQMKdq5BFbJuwuOLqc8zxCTDlqxBG8J0HcxtfogQHDK06ukzfaXiNDKAob1MqBHS9lJxDYCwz8gd5DtFqNSTKG5l1zxIaKpDP/sffi2is1H9aKveyXSu5StXElYRl9SD5As0DHE4N0GLnf84/siiKXVyp4Ez121kLcUui/jLLFZEz/BwZK3Ilf9B9OcsEAeDMKAy2vjGSxQODgBz0QwGA+eP4ZjIjrIAQaXENv31QfLlOdXSRCkaybRniDHF4C8YcwhcvsqrOVuTP4B2Na+9wLdtrB31uz2rtlFI5kahdsnp/d1SrASDInYCtTYtdoke4kX+hoKWcEWM4Tle8pTUkUVv4BxS6fje/EzKBE4Qu9N9LMnrw/JNO0hqMVB4rk/2ou4AB1loQ7FZoPwut2o4KZB+0p9xnbrQKw038qjpHar+PyDwvxBRcu5hpHw3dguezeWv+IwvgW5icu8EGkhGa9AkFPPJT7VMSFb8xowveU=\",\n        \"base64\",\n      ),\n    ),\n  }),\n};\n","import { AccountInfo, Commitment, Connection, PublicKey } from \"@solana/web3.js\";\nimport { MINT_SIZE, TOKEN_PROGRAM_ID, getTransferFeeConfig, unpackMint } from \"@solana/spl-token\";\nimport { WSOLMint, chunkArray, solToWSol } from \"./\";\nimport { createLogger } from \"./logger\";\nimport { ReturnTypeFetchMultipleMintInfos } from \"../raydium/type\";\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 { Keypair, PublicKey, Signer } from \"@solana/web3.js\";\n\ntype _Owner = Keypair | PublicKey;\n\nexport class Owner {\n  private readonly _owner: _Owner;\n\n  constructor(owner: _Owner) {\n    this._owner = owner;\n  }\n\n  get publicKey(): PublicKey {\n    if (Owner.isKeyPair(this._owner)) {\n      return this._owner.publicKey;\n    }\n\n    return this._owner;\n  }\n\n  get signer(): Signer | undefined {\n    return Owner.isKeyPair(this._owner) ? this._owner : undefined;\n  }\n\n  get isKeyPair(): boolean {\n    return Owner.isKeyPair(this._owner);\n  }\n\n  get isPublicKey(): boolean {\n    return Owner.isPublicKey(this._owner);\n  }\n\n  static isKeyPair(owner: _Owner): owner is Keypair {\n    return (owner as Keypair).secretKey !== undefined;\n  }\n\n  static isPublicKey(owner: _Owner): owner is PublicKey {\n    return !Owner.isKeyPair(owner);\n  }\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","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","import { PublicKey } from \"@solana/web3.js\";\n\n// raydium\nexport const FARM_PROGRAM_ID_V3 = new PublicKey(\"EhhTKczWMGQt46ynNeRX1WfeagwwJd7ufHvCDjRxjo5Q\");\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 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(\"CPMMoo8L3F4NbTegBCKVNunggL7H1ZpdTHKxQB5qKP1C\");\nexport const CREATE_CPMM_POOL_AUTH = new PublicKey(\"GpMZbSM2GgvTKHJirzeGfMFoaZ8UR2X7F4v8vHTvxFbL\");\nexport const CREATE_CPMM_POOL_FEE_ACC = new PublicKey(\"DNXgeM9EiiaAbaWvwjHj9fQQLAX5ZsfHyvmYUNRAdNC8\");\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 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\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\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\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","import { PublicKey } from \"@solana/web3.js\";\n\nimport { findProgramAddress } from \"./txTool/txUtils\";\nimport { TOKEN_PROGRAM_ID } from \"@solana/spl-token\";\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 { EpochInfo } from \"@solana/web3.js\";\nimport { TransferFeeConfig, TransferFee } from \"@solana/spl-token\";\nimport BN from \"bn.js\";\n\nimport { GetTransferAmountFee } from \"../raydium/type\";\nimport { TransferFeeDataBaseType } from \"../api/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","export const API_URLS = {\n  BASE_HOST: \"https://api-v3.raydium.io\",\n  OWNER_BASE_HOST: \"https://owner-v1.raydium.io\",\n  SERVICE_BASE_HOST: \"https://service.raydium.io\",\n\n  SEND_TRANSACTION: \"/send-transaction\",\n  FARM_ARP: \"/main/farm/info\",\n  FARM_ARP_LINE: \"/main/farm-apr-tv\",\n\n  CLMM_CONFIG: \"/main/clmm-config\",\n\n  VERSION: \"/main/version\",\n\n  // api v3\n  CHECK_AVAILABILITY: \"/v3/main/AvailabilityCheckAPI\",\n  RPCS: \"/main/rpcs\",\n  INFO: \"/main/info\",\n  STAKE_POOLS: \"/main/stake-pools\",\n  CHAIN_TIME: \"/main/chain-time\",\n\n  TOKEN_LIST: \"/mint/list\",\n  MINT_INFO_ID: \"/mint/ids\",\n\n  JUP_TOKEN_LIST: \"https://token.jup.ag/{type}\",\n  /**\n   * poolType: {all, concentrated, standard, allFarm, concentratedFarm, standardFarm}\n   * poolSortField: {liquidity | volume_24h / 7d / 30d | fee_24h / 7d / 30d | apr_24h / 7d / 30d}\n   * sortType: {desc/asc}\n   * page: number\n   * pageSize: number\n   */\n  POOL_LIST: \"/pools/info/list\",\n  /**\n   * ?ids=idList.join(',')\n   */\n  POOL_SEARCH_BY_ID: \"/pools/info/ids\",\n  /**\n   * mint1/mint2: search pool by mint\n   * poolSortField: {liquidity | volume_24h / 7d / 30d | fee_24h / 7d / 30d | apr_24h / 7d / 30d}\n   * poolType: {all, concentrated, standard, allFarm, concentratedFarm, standardFarm}\n   * sortType: {desc/asc}\n   * page: number\n   * pageSize: number\n   */\n  POOL_SEARCH_MINT: \"/pools/info/mint\",\n  /** ?lps=lpList.join(',') */\n  POOL_SEARCH_LP: \"/pools/info/lps\",\n  /** ?ids=idList.join(',') */\n  POOL_KEY_BY_ID: \"/pools/key/ids\",\n  /** ?id=string */\n  POOL_LIQUIDITY_LINE: \"/pools/line/liquidity\",\n  POOL_POSITION_LINE: \"/pools/line/position\",\n\n  FARM_INFO: \"/farms/info/ids\",\n  /** ?lp=string&pageSize=100&page=number */\n  FARM_LP_INFO: \"/farms/info/lp\",\n  FARM_KEYS: \"/farms/key/ids\",\n\n  OWNER_CREATED_FARM: \"/create-pool/{owner}\",\n  OWNER_IDO: \"/main/ido/{owner}\",\n  OWNER_STAKE_FARMS: \"/position/stake/{owner}\",\n  IDO_KEYS: \"/ido/key/ids\",\n  SWAP_HOST: \"https://transaction-v1.raydium.io\",\n  SWAP_COMPUTE: \"/compute/\",\n  SWAP_TX: \"/transaction/\",\n  MINT_PRICE: \"/mint/price\",\n  MIGRATE_CONFIG: \"/main/migrate-lp\",\n  PRIORITY_FEE: \"/main/auto-fee\",\n  JITO: \"https://mainnet.block-engine.jito.wtf\",\n  JITO_TRANSACTION: \"/api/v1/transactions\",\n  JITO_BUNDLE: \"/api/v1/bundles\",\n};\n\nexport const DEV_API_URLS = {\n  ...API_URLS,\n};\n\nexport type API_URL_CONFIG = Partial<typeof API_URLS>;\n","export const SESSION_KEY = \"ray_tab_hash\";\nexport const STORAGE_KEY = \"ray_req_hash\";\n\nexport const getSessionKey = (): string => {\n  if (typeof window === undefined) return \"\";\n  let key = sessionStorage.getItem(SESSION_KEY);\n\n  // new a session key\n  if (!key) {\n    key = `ray-${Date.now()}`;\n    sessionStorage.setItem(SESSION_KEY, key);\n  }\n  return key;\n};\n\nexport interface ResHistory {\n  status: number;\n  url: string;\n  params?: any;\n  data: any;\n  logCount?: number;\n  time: number;\n  session: string;\n  removeLastLog?: boolean;\n}\n\nexport const updateReqHistory = async ({\n  logCount = 1000,\n  removeLastLog,\n  ...resData\n}: Omit<ResHistory, \"time\" | \"session\">): Promise<void> => {\n  if (typeof window === undefined) return new Promise((resolve) => resolve());\n  const data: ResHistory[] = JSON.parse(localStorage.getItem(STORAGE_KEY) || \"[]\").slice(0, logCount - 1);\n\n  // means retry last save error\n  if (removeLastLog) data.pop();\n\n  // if data > 1kb\n  if (new Blob([JSON.stringify(resData.data)]).size > 1024)\n    resData.data = JSON.stringify(resData.data).substring(0, 200) + \"...\";\n  data.unshift({ ...resData, time: Date.now(), session: getSessionKey() });\n\n  try {\n    localStorage.setItem(STORAGE_KEY, JSON.stringify(data));\n  } catch {\n    // if retry failed, empty request data\n    if (removeLastLog) {\n      let success = false;\n      const resStr = JSON.stringify(resData.data).substring(0, 100);\n      data[0].data = resStr + (resStr.length > 100 ? \"...\" : \"\");\n      while (!success) {\n        data.pop();\n        const resStr = JSON.stringify(resData.data).substring(0, 100);\n        data[0].data = resStr + (resStr.length > 100 ? \"...\" : \"\");\n        try {\n          localStorage.setItem(STORAGE_KEY, JSON.stringify(data));\n          success = true;\n        } catch {\n          success = false;\n        }\n      }\n      return new Promise((resolve) => resolve());\n    }\n    return updateReqHistory({\n      ...resData,\n      logCount,\n      removeLastLog: true,\n    });\n  }\n};\n","export const EMPTY_OWNER =\n  \"please provide owner in load() initialization or you can set by calling raydium.setOwner(owner)\";\n\nexport const EMPTY_CONNECTION =\n  \"please provide connection in load() initialization or set it by raydium.setConnection(connection)\";\n","import {\n  createAssociatedTokenAccountInstruction,\n  TOKEN_PROGRAM_ID,\n  AccountLayout,\n  TOKEN_2022_PROGRAM_ID,\n} from \"@solana/spl-token\";\nimport { Commitment, PublicKey, SystemProgram, TransactionInstruction } from \"@solana/web3.js\";\nimport { getATAAddress, BigNumberish, InstructionType, WSOLMint } from \"@/common\";\nimport { AddInstructionParam } from \"@/common/txTool/txTool\";\n\nimport ModuleBase, { ModuleBaseProps } from \"../moduleBase\";\nimport {\n  closeAccountInstruction,\n  createWSolAccountInstructions,\n  makeTransferInstruction,\n  initTokenAccountInstruction,\n} from \"./instruction\";\nimport { HandleTokenAccountParams, TokenAccount, TokenAccountRaw, GetOrCreateTokenAccountParams } from \"./types\";\nimport { parseTokenAccountResp, generatePubKey } from \"./util\";\n\nexport interface TokenAccountDataProp {\n  tokenAccounts?: TokenAccount[];\n  tokenAccountRawInfos?: TokenAccountRaw[];\n}\nexport default class Account extends ModuleBase {\n  private _tokenAccounts: TokenAccount[] = [];\n  private _tokenAccountRawInfos: TokenAccountRaw[] = [];\n  private _accountChangeListenerId?: number;\n  private _accountListener: ((data: TokenAccountDataProp) => void)[] = [];\n  private _clientOwnedToken = false;\n\n  constructor(params: TokenAccountDataProp & ModuleBaseProps) {\n    super(params);\n    const { tokenAccounts, tokenAccountRawInfos } = params;\n    this._tokenAccounts = tokenAccounts || [];\n    this._tokenAccountRawInfos = tokenAccountRawInfos || [];\n    this._clientOwnedToken = !!(tokenAccounts || tokenAccountRawInfos);\n  }\n\n  get tokenAccounts(): TokenAccount[] {\n    return this._tokenAccounts;\n  }\n  get tokenAccountRawInfos(): TokenAccountRaw[] {\n    return this._tokenAccountRawInfos;\n  }\n\n  public updateTokenAccount({ tokenAccounts, tokenAccountRawInfos }: TokenAccountDataProp): Account {\n    if (tokenAccounts) this._tokenAccounts = tokenAccounts;\n    if (tokenAccountRawInfos) this._tokenAccountRawInfos = tokenAccountRawInfos;\n    this._accountChangeListenerId && this.scope.connection.removeAccountChangeListener(this._accountChangeListenerId);\n    this._accountChangeListenerId = undefined;\n    this._clientOwnedToken = true;\n    return this;\n  }\n\n  public addAccountChangeListener(cbk: (data: TokenAccountDataProp) => void): Account {\n    this._accountListener.push(cbk);\n    return this;\n  }\n\n  public removeAccountChangeListener(cbk: (data: TokenAccountDataProp) => void): Account {\n    this._accountListener = this._accountListener.filter((listener) => listener !== cbk);\n    return this;\n  }\n\n  public getAssociatedTokenAccount(mint: PublicKey, programId?: PublicKey): PublicKey {\n    return getATAAddress(this.scope.ownerPubKey, mint, programId).publicKey;\n  }\n\n  public async fetchWalletTokenAccounts(config?: { forceUpdate?: boolean; commitment?: Commitment }): Promise<{\n    tokenAccounts: TokenAccount[];\n    tokenAccountRawInfos: TokenAccountRaw[];\n  }> {\n    if (this._clientOwnedToken || (!config?.forceUpdate && this._tokenAccounts.length)) {\n      return {\n        tokenAccounts: this._tokenAccounts,\n        tokenAccountRawInfos: this._tokenAccountRawInfos,\n      };\n    }\n    this.scope.checkOwner();\n\n    const defaultConfig = {};\n    const customConfig = { ...defaultConfig, ...config };\n\n    const [solAccountResp, ownerTokenAccountResp, ownerToken2022AccountResp] = await Promise.all([\n      this.scope.connection.getAccountInfo(this.scope.ownerPubKey, customConfig.commitment),\n      this.scope.connection.getTokenAccountsByOwner(\n        this.scope.ownerPubKey,\n        { programId: TOKEN_PROGRAM_ID },\n        customConfig.commitment,\n      ),\n      this.scope.connection.getTokenAccountsByOwner(\n        this.scope.ownerPubKey,\n        { programId: TOKEN_2022_PROGRAM_ID },\n        customConfig.commitment,\n      ),\n    ]);\n\n    const { tokenAccounts, tokenAccountRawInfos } = parseTokenAccountResp({\n      owner: this.scope.ownerPubKey,\n      solAccountResp,\n      tokenAccountResp: {\n        context: ownerTokenAccountResp.context,\n        value: [...ownerTokenAccountResp.value, ...ownerToken2022AccountResp.value],\n      },\n    });\n\n    this._tokenAccounts = tokenAccounts;\n    this._tokenAccountRawInfos = tokenAccountRawInfos;\n\n    this._accountChangeListenerId && this.scope.connection.removeAccountChangeListener(this._accountChangeListenerId);\n    this._accountChangeListenerId = this.scope.connection.onAccountChange(\n      this.scope.ownerPubKey,\n      () => this.fetchWalletTokenAccounts({ forceUpdate: true }),\n      config?.commitment,\n    );\n\n    return { tokenAccounts, tokenAccountRawInfos };\n  }\n\n  // user token account needed, old _selectTokenAccount\n  public async getCreatedTokenAccount({\n    mint,\n    programId = TOKEN_PROGRAM_ID,\n    associatedOnly = true,\n  }: {\n    mint: PublicKey;\n    programId?: PublicKey;\n    associatedOnly?: boolean;\n  }): Promise<PublicKey | undefined> {\n    await this.fetchWalletTokenAccounts();\n    const tokenAccounts = this._tokenAccounts\n      .filter(({ mint: accountMint }) => accountMint?.equals(mint))\n      // sort by balance\n      .sort((a, b) => (a.amount.lt(b.amount) ? 1 : -1));\n\n    const ata = this.getAssociatedTokenAccount(mint, programId);\n    for (const tokenAccount of tokenAccounts) {\n      const { publicKey } = tokenAccount;\n      if (publicKey) {\n        if (!associatedOnly || (associatedOnly && ata.equals(publicKey))) return publicKey;\n      }\n    }\n  }\n\n  // old _selectOrCreateTokenAccount\n  public async getOrCreateTokenAccount(params: GetOrCreateTokenAccountParams): Promise<{\n    account?: PublicKey;\n    instructionParams?: AddInstructionParam;\n  }> {\n    await this.fetchWalletTokenAccounts();\n    const {\n      mint,\n      createInfo,\n      associatedOnly,\n      owner,\n      notUseTokenAccount = false,\n      skipCloseAccount = false,\n      checkCreateATAOwner = false,\n    } = params;\n    const tokenProgram = new PublicKey(params.tokenProgram || TOKEN_PROGRAM_ID);\n    const ata = this.getAssociatedTokenAccount(mint, new PublicKey(tokenProgram));\n    const accounts = (notUseTokenAccount ? [] : this.tokenAccountRawInfos)\n      .filter((i) => i.accountInfo.mint.equals(mint) && (!associatedOnly || i.pubkey.equals(ata)))\n      .sort((a, b) => (a.accountInfo.amount.lt(b.accountInfo.amount) ? 1 : -1));\n    // find token or don't need create\n    if (createInfo === undefined || accounts.length > 0) {\n      return accounts.length > 0 ? { account: accounts[0].pubkey } : {};\n    }\n\n    const newTxInstructions: AddInstructionParam = {\n      instructions: [],\n      endInstructions: [],\n      signers: [],\n      instructionTypes: [],\n      endInstructionTypes: [],\n    };\n\n    if (associatedOnly) {\n      const _createATAIns = createAssociatedTokenAccountInstruction(owner, ata, owner, mint, tokenProgram);\n      if (checkCreateATAOwner) {\n        const ataInfo = await this.scope.connection.getAccountInfo(ata);\n        if (ataInfo === null) {\n          newTxInstructions.instructions?.push(_createATAIns);\n          newTxInstructions.instructionTypes!.push(InstructionType.CreateATA);\n        } else if (\n          ataInfo.owner.equals(tokenProgram) &&\n          AccountLayout.decode(ataInfo.data).mint.equals(mint) &&\n          AccountLayout.decode(ataInfo.data).owner.equals(owner)\n        ) {\n          /* empty */\n        } else {\n          throw Error(`create ata check error -> mint: ${mint.toString()}, ata: ${ata.toString()}`);\n        }\n      } else {\n        newTxInstructions.instructions!.push(_createATAIns);\n        newTxInstructions.instructionTypes!.push(InstructionType.CreateATA);\n      }\n      if (mint.equals(WSOLMint) && createInfo.amount) {\n        const txInstruction = await createWSolAccountInstructions({\n          connection: this.scope.connection,\n          owner: this.scope.ownerPubKey,\n          payer: createInfo.payer || this.scope.ownerPubKey,\n          amount: createInfo.amount ?? 0,\n          skipCloseAccount,\n        });\n        newTxInstructions.instructions!.push(...(txInstruction.instructions || []));\n        newTxInstructions.endInstructions!.push(...(txInstruction.endInstructions || []));\n        newTxInstructions.instructionTypes!.push(...(txInstruction.instructionTypes || []));\n        newTxInstructions.endInstructionTypes!.push(...(txInstruction.endInstructionTypes || []));\n\n        if (createInfo.amount) {\n          newTxInstructions.instructions!.push(\n            makeTransferInstruction({\n              source: txInstruction.addresses.newAccount,\n              destination: ata,\n              owner: this.scope.ownerPubKey,\n              amount: createInfo.amount,\n              tokenProgram: TOKEN_PROGRAM_ID,\n            }),\n          );\n          newTxInstructions.instructionTypes!.push(InstructionType.TransferAmount);\n        }\n      }\n\n      if (!skipCloseAccount) {\n        newTxInstructions.endInstructions!.push(\n          closeAccountInstruction({\n            owner,\n            payer: createInfo.payer || owner,\n            tokenAccount: ata,\n            programId: tokenProgram,\n          }),\n        );\n        newTxInstructions.endInstructionTypes!.push(InstructionType.CloseAccount);\n      }\n\n      return { account: ata, instructionParams: newTxInstructions };\n    } else {\n      // if (mint.equals(WSOLMint)) {\n      //   const txInstruction = await createWSolAccountInstructions({\n      //     connection: this.scope.connection,\n      //     owner: this.scope.ownerPubKey,\n      //     payer: createInfo.payer || this.scope.ownerPubKey,\n      //     amount: createInfo.amount ?? 0,\n      //     skipCloseAccount,\n      //   });\n      //   newTxInstructions.instructions!.push(...(txInstruction.instructions || []));\n      //   newTxInstructions.endInstructions!.push(...(txInstruction.endInstructions || []));\n      //   newTxInstructions.signers!.push(...(txInstruction.signers || []));\n      //   newTxInstructions.instructionTypes!.push(...(txInstruction.instructionTypes || []));\n      //   newTxInstructions.endInstructionTypes!.push(...(txInstruction.endInstructionTypes || []));\n\n      //   return { account: txInstruction.addresses.newAccount, instructionParams: newTxInstructions };\n      // } else {\n      const newTokenAccount = generatePubKey({ fromPublicKey: owner, programId: tokenProgram });\n      const balanceNeeded = await this.scope.connection.getMinimumBalanceForRentExemption(AccountLayout.span);\n\n      const createAccountIns = SystemProgram.createAccountWithSeed({\n        fromPubkey: owner,\n        basePubkey: owner,\n        seed: newTokenAccount.seed,\n        newAccountPubkey: newTokenAccount.publicKey,\n        lamports: balanceNeeded + Number(createInfo.amount?.toString() ?? 0),\n        space: AccountLayout.span,\n        programId: tokenProgram,\n      });\n\n      newTxInstructions.instructions!.push(\n        createAccountIns,\n        initTokenAccountInstruction({\n          mint,\n          tokenAccount: newTokenAccount.publicKey,\n          owner: this.scope.ownerPubKey,\n          programId: tokenProgram,\n        }),\n      );\n      newTxInstructions.instructionTypes!.push(InstructionType.CreateAccount);\n      newTxInstructions.instructionTypes!.push(InstructionType.InitAccount);\n      if (!skipCloseAccount) {\n        newTxInstructions.endInstructions!.push(\n          closeAccountInstruction({\n            owner,\n            payer: createInfo.payer || owner,\n            tokenAccount: newTokenAccount.publicKey,\n            programId: tokenProgram,\n          }),\n        );\n        newTxInstructions.endInstructionTypes!.push(InstructionType.CloseAccount);\n      }\n      return { account: newTokenAccount.publicKey, instructionParams: newTxInstructions };\n    }\n    // }\n  }\n\n  public async checkOrCreateAta({\n    mint,\n    programId = TOKEN_PROGRAM_ID,\n    autoUnwrapWSOLToSOL,\n  }: {\n    mint: PublicKey;\n    programId?: PublicKey;\n    autoUnwrapWSOLToSOL?: boolean;\n  }): Promise<{ pubKey: PublicKey; newInstructions: AddInstructionParam }> {\n    await this.fetchWalletTokenAccounts();\n    let tokenAccountAddress = this.scope.account.tokenAccounts.find(\n      ({ mint: accountTokenMint }) => accountTokenMint?.toBase58() === mint.toBase58(),\n    )?.publicKey;\n\n    const owner = this.scope.ownerPubKey;\n    const newTxInstructions: AddInstructionParam = {};\n\n    if (!tokenAccountAddress) {\n      const ataAddress = this.getAssociatedTokenAccount(mint, programId);\n      const instruction = await createAssociatedTokenAccountInstruction(owner, ataAddress, owner, mint, programId);\n      newTxInstructions.instructions = [instruction];\n      newTxInstructions.instructionTypes = [InstructionType.CreateATA];\n      tokenAccountAddress = ataAddress;\n    }\n    if (autoUnwrapWSOLToSOL && WSOLMint.toBase58() === mint.toBase58()) {\n      newTxInstructions.endInstructions = [\n        closeAccountInstruction({ owner, payer: owner, tokenAccount: tokenAccountAddress, programId }),\n      ];\n      newTxInstructions.endInstructionTypes = [InstructionType.CloseAccount];\n    }\n\n    return {\n      pubKey: tokenAccountAddress,\n      newInstructions: newTxInstructions,\n    };\n  }\n\n  // old _handleTokenAccount\n  public async handleTokenAccount(\n    params: HandleTokenAccountParams,\n  ): Promise<AddInstructionParam & { tokenAccount: PublicKey }> {\n    const {\n      side,\n      amount,\n      mint,\n      programId = TOKEN_PROGRAM_ID,\n      tokenAccount,\n      payer = this.scope.ownerPubKey,\n      bypassAssociatedCheck,\n      skipCloseAccount,\n      checkCreateATAOwner,\n    } = params;\n\n    const ata = this.getAssociatedTokenAccount(mint, programId);\n\n    if (new PublicKey(WSOLMint).equals(mint)) {\n      const txInstruction = await createWSolAccountInstructions({\n        connection: this.scope.connection,\n        owner: this.scope.ownerPubKey,\n        payer,\n        amount,\n        skipCloseAccount,\n      });\n      return { tokenAccount: txInstruction.addresses.newAccount, ...txInstruction };\n    } else if (!tokenAccount || (side === \"out\" && !ata.equals(tokenAccount) && !bypassAssociatedCheck)) {\n      const instructions: TransactionInstruction[] = [];\n      const _createATAIns = createAssociatedTokenAccountInstruction(\n        this.scope.ownerPubKey,\n        ata,\n        this.scope.ownerPubKey,\n        mint,\n        programId,\n      );\n\n      if (checkCreateATAOwner) {\n        const ataInfo = await this.scope.connection.getAccountInfo(ata);\n        if (ataInfo === null) {\n          instructions.push(_createATAIns);\n        } else if (\n          ataInfo.owner.equals(TOKEN_PROGRAM_ID) &&\n          AccountLayout.decode(ataInfo.data).mint.equals(mint) &&\n          AccountLayout.decode(ataInfo.data).owner.equals(this.scope.ownerPubKey)\n        ) {\n          /* empty */\n        } else {\n          throw Error(`create ata check error -> mint: ${mint.toString()}, ata: ${ata.toString()}`);\n        }\n      } else {\n        instructions.push(_createATAIns);\n      }\n\n      return {\n        tokenAccount: ata,\n        instructions,\n        instructionTypes: [InstructionType.CreateATA],\n      };\n    }\n\n    return { tokenAccount };\n  }\n\n  public async processTokenAccount(props: {\n    mint: PublicKey;\n    programId?: PublicKey;\n    amount?: BigNumberish;\n    useSOLBalance?: boolean;\n    handleTokenAccount?: boolean;\n  }): Promise<Promise<AddInstructionParam & { tokenAccount?: PublicKey }>> {\n    const { mint, programId = TOKEN_PROGRAM_ID, amount, useSOLBalance, handleTokenAccount } = props;\n    let tokenAccount: PublicKey | undefined;\n    const txBuilder = this.createTxBuilder();\n\n    if (mint.equals(new PublicKey(WSOLMint)) && useSOLBalance) {\n      // mintA\n      const { tokenAccount: _tokenAccount, ...instructions } = await this.handleTokenAccount({\n        side: \"in\",\n        amount: amount || 0,\n        mint,\n        bypassAssociatedCheck: true,\n        programId,\n      });\n      tokenAccount = _tokenAccount;\n      txBuilder.addInstruction(instructions);\n    } else {\n      tokenAccount = await this.getCreatedTokenAccount({\n        mint,\n        associatedOnly: false,\n        programId,\n      });\n      if (!tokenAccount && handleTokenAccount) {\n        const { tokenAccount: _tokenAccount, ...instructions } = await this.scope.account.handleTokenAccount({\n          side: \"in\",\n          amount: 0,\n          mint,\n          bypassAssociatedCheck: true,\n          programId,\n        });\n        tokenAccount = _tokenAccount;\n        txBuilder.addInstruction(instructions);\n      }\n    }\n\n    return { tokenAccount, ...txBuilder.AllTxData };\n  }\n}\n","import { PublicKey } from \"@solana/web3.js\";\n\nimport { createLogger, Logger } from \"../common/logger\";\nimport { TxBuilder } from \"../common/txTool/txTool\";\n\nimport { Raydium } from \"./\";\n\nexport interface ModuleBaseProps {\n  scope: Raydium;\n  moduleName: string;\n}\n\nconst joinMsg = (...args: (string | number | Record<string, any>)[]): string =>\n  args\n    .map((arg) => {\n      try {\n        return typeof arg === \"object\" ? JSON.stringify(arg) : arg;\n      } catch {\n        return arg;\n      }\n    })\n    .join(\", \");\nexport default class ModuleBase {\n  public scope: Raydium;\n  private disabled = false;\n  protected logger: Logger;\n\n  constructor({ scope, moduleName }: ModuleBaseProps) {\n    this.scope = scope;\n    this.logger = createLogger(moduleName);\n  }\n\n  protected createTxBuilder(feePayer?: PublicKey): TxBuilder {\n    this.scope.checkOwner();\n    return new TxBuilder({\n      connection: this.scope.connection,\n      feePayer: feePayer || this.scope.ownerPubKey,\n      cluster: this.scope.cluster,\n      owner: this.scope.owner,\n      blockhashCommitment: this.scope.blockhashCommitment,\n      api: this.scope.api,\n      signAllTransactions: this.scope.signAllTransactions,\n    });\n  }\n\n  public logDebug(...args: (string | number | Record<string, any>)[]): void {\n    this.logger.debug(joinMsg(args));\n  }\n\n  public logInfo(...args: (string | number | Record<string, any>)[]): void {\n    this.logger.info(joinMsg(args));\n  }\n\n  public logAndCreateError(...args: (string | number | Record<string, any>)[]): void {\n    const message = joinMsg(args);\n    // this.logger.error(message);\n    throw new Error(message);\n  }\n\n  public checkDisabled(): void {\n    if (this.disabled || !this.scope) this.logAndCreateError(\"module not working\");\n  }\n}\n","import {\n  createInitializeAccountInstruction,\n  createCloseAccountInstruction,\n  createTransferInstruction,\n  TOKEN_PROGRAM_ID,\n} from \"@solana/spl-token\";\nimport { Commitment, Connection, PublicKey, Signer, SystemProgram, TransactionInstruction } from \"@solana/web3.js\";\nimport BN from \"bn.js\";\nimport { generatePubKey } from \"./util\";\nimport { BigNumberish, parseBigNumberish } from \"@/common\";\nimport { AddInstructionParam } from \"@/common/txTool/txTool\";\nimport { InstructionType } from \"@/common/txTool/txType\";\nimport { TOKEN_WSOL } from \"../token/constant\";\n\nimport { splAccountLayout } from \"./layout\";\n\nexport function initTokenAccountInstruction(params: {\n  mint: PublicKey;\n  tokenAccount: PublicKey;\n  owner: PublicKey;\n  programId?: PublicKey;\n}): TransactionInstruction {\n  const { mint, tokenAccount, owner, programId = TOKEN_PROGRAM_ID } = params;\n  return createInitializeAccountInstruction(tokenAccount, mint, owner, programId);\n}\n\nexport function closeAccountInstruction(params: {\n  tokenAccount: PublicKey;\n  payer: PublicKey;\n  multiSigners?: Signer[];\n  owner: PublicKey;\n  programId?: PublicKey;\n}): TransactionInstruction {\n  const { tokenAccount, payer, multiSigners = [], owner, programId = TOKEN_PROGRAM_ID } = params;\n  return createCloseAccountInstruction(tokenAccount, payer, owner, multiSigners, programId);\n}\n\ninterface CreateWSolTokenAccount {\n  connection: Connection;\n  payer: PublicKey;\n  owner: PublicKey;\n  amount: BigNumberish;\n  commitment?: Commitment;\n  skipCloseAccount?: boolean;\n}\n/**\n * WrappedNative account = wsol account\n */\nexport async function createWSolAccountInstructions(params: CreateWSolTokenAccount): Promise<\n  AddInstructionParam & {\n    addresses: { newAccount: PublicKey };\n  }\n> {\n  const { connection, amount, commitment, payer, owner, skipCloseAccount } = params;\n\n  const balanceNeeded = await connection.getMinimumBalanceForRentExemption(splAccountLayout.span, commitment);\n  const lamports = parseBigNumberish(amount).add(new BN(balanceNeeded));\n  const newAccount = generatePubKey({ fromPublicKey: payer, programId: TOKEN_PROGRAM_ID });\n\n  return {\n    addresses: { newAccount: newAccount.publicKey },\n    signers: [],\n    instructions: [\n      SystemProgram.createAccountWithSeed({\n        fromPubkey: payer,\n        basePubkey: payer,\n        seed: newAccount.seed,\n        newAccountPubkey: newAccount.publicKey,\n        lamports: lamports.toNumber(),\n        space: splAccountLayout.span,\n        programId: TOKEN_PROGRAM_ID,\n      }),\n      initTokenAccountInstruction({\n        mint: new PublicKey(TOKEN_WSOL.address),\n        tokenAccount: newAccount.publicKey,\n        owner,\n        programId: TOKEN_PROGRAM_ID,\n      }),\n    ],\n    instructionTypes: [InstructionType.CreateAccount, InstructionType.InitAccount],\n    endInstructionTypes: skipCloseAccount ? [] : [InstructionType.CloseAccount],\n    endInstructions: skipCloseAccount\n      ? []\n      : [\n          closeAccountInstruction({\n            tokenAccount: newAccount.publicKey,\n            payer,\n            owner,\n          }),\n        ],\n  };\n}\n\nexport function makeTransferInstruction({\n  source,\n  destination,\n  owner,\n  amount,\n  multiSigners = [],\n  tokenProgram = TOKEN_PROGRAM_ID,\n}: {\n  source: PublicKey;\n  destination: PublicKey;\n  owner: PublicKey;\n  amount: BigNumberish;\n  multiSigners?: Signer[];\n  tokenProgram?: PublicKey;\n}): TransactionInstruction {\n  return createTransferInstruction(source, destination, owner, BigInt(String(amount)), multiSigners, tokenProgram);\n}\n","import { AccountInfo, PublicKey, RpcResponseAndContext, Keypair, GetProgramAccountsResponse } from \"@solana/web3.js\";\nimport { TOKEN_PROGRAM_ID } from \"@solana/spl-token\";\nimport BN from \"bn.js\";\nimport { createLogger, getATAAddress } from \"@/common\";\n\nimport { splAccountLayout } from \"./layout\";\nimport { TokenAccount, TokenAccountRaw } from \"./types\";\nimport { sha256 } from \"@noble/hashes/sha256\";\n\nconst logger = createLogger(\"Raydium_Util\");\n\nexport interface ParseTokenAccount {\n  owner: PublicKey;\n  solAccountResp?: AccountInfo<Buffer> | null;\n  tokenAccountResp: RpcResponseAndContext<GetProgramAccountsResponse>;\n}\n\nexport function parseTokenAccountResp({ owner, solAccountResp, tokenAccountResp }: ParseTokenAccount): {\n  tokenAccounts: TokenAccount[];\n  tokenAccountRawInfos: TokenAccountRaw[];\n} {\n  const tokenAccounts: TokenAccount[] = [];\n  const tokenAccountRawInfos: TokenAccountRaw[] = [];\n\n  for (const { pubkey, account } of tokenAccountResp.value) {\n    const accountInfo = splAccountLayout.decode(account.data);\n    const { mint, amount } = accountInfo;\n    tokenAccounts.push({\n      publicKey: pubkey,\n      mint,\n      amount,\n      isAssociated: getATAAddress(owner, mint, account.owner).publicKey.equals(pubkey),\n      isNative: false,\n      programId: account.owner,\n    });\n    // todo programId should get from api\n    tokenAccountRawInfos.push({ pubkey, accountInfo, programId: account.owner });\n  }\n\n  if (solAccountResp) {\n    tokenAccounts.push({\n      mint: PublicKey.default,\n      amount: new BN(solAccountResp.lamports),\n      isNative: true,\n      programId: solAccountResp.owner,\n    });\n  }\n\n  return {\n    tokenAccounts,\n    tokenAccountRawInfos,\n  };\n}\n\nexport function generatePubKey({\n  fromPublicKey,\n  programId = TOKEN_PROGRAM_ID,\n}: {\n  fromPublicKey: PublicKey;\n  programId: PublicKey;\n}): { publicKey: PublicKey; seed: string } {\n  const seed = Keypair.generate().publicKey.toBase58().slice(0, 32);\n  const publicKey = createWithSeed(fromPublicKey, seed, programId);\n  return { publicKey, seed };\n}\n\nfunction createWithSeed(fromPublicKey: PublicKey, seed: string, programId: PublicKey): PublicKey {\n  const buffer = Buffer.concat([fromPublicKey.toBuffer(), Buffer.from(seed), programId.toBuffer()]);\n  const publicKeyBytes = sha256(buffer);\n  return new PublicKey(publicKeyBytes);\n}\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 _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> = Structure<any, any, S>;\n\nexport class Union<Schema> 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",null,null,null,null,"import { createAssociatedTokenAccountInstruction } from \"@solana/spl-token\";\nimport { PublicKey, SystemProgram } from \"@solana/web3.js\";\n\nimport { FormatFarmKeyOut } from \"@/api/type\";\nimport { AddInstructionParam, jsonInfo2PoolKeys } from \"@/common\";\nimport { parseBigNumberish, BN_ZERO } from \"@/common/bignumber\";\nimport { SOLMint, WSOLMint } from \"@/common/pubKey\";\nimport { MakeTxData, MakeMultiTxData } from \"@/common/txTool/txTool\";\nimport { InstructionType, TxVersion } from \"@/common/txTool/txType\";\nimport { getATAAddress } from \"@/common/pda\";\nimport { FARM_PROGRAM_ID_V6 } from \"@/common/programId\";\nimport { generatePubKey } from \"../account/util\";\n\nimport { createWSolAccountInstructions } from \"../account/instruction\";\nimport ModuleBase from \"../moduleBase\";\nimport { TOKEN_WSOL } from \"../token/constant\";\nimport { ComputeBudgetConfig } from \"@/raydium/type\";\nimport {\n  FARM_LOCK_MINT,\n  FARM_LOCK_VAULT,\n  isValidFarmVersion,\n  poolTypeV6,\n  validateFarmRewards,\n  FARM_PROGRAM_TO_VERSION,\n} from \"./config\";\nimport {\n  createAssociatedLedgerAccountInstruction,\n  makeCreateFarmInstruction,\n  makeCreatorWithdrawFarmRewardInstruction,\n  makeRestartRewardInstruction,\n  makeAddNewRewardInstruction,\n  makeWithdrawInstructionV3,\n  makeWithdrawInstructionV5,\n  makeWithdrawInstructionV6,\n  makeDepositInstructionV3,\n  makeDepositInstructionV5,\n  makeDepositInstructionV6,\n} from \"./instruction\";\nimport { farmStateV6Layout, FarmLedger } from \"./layout\";\nimport {\n  CreateFarm,\n  FarmDWParam,\n  FarmRewardInfo,\n  FarmRewardInfoConfig,\n  RewardInfoKey,\n  UpdateFarmReward,\n  UpdateFarmRewards,\n  CreateFarmExtInfo,\n} from \"./type\";\nimport {\n  calFarmRewardAmount,\n  farmRewardInfoToConfig,\n  getAssociatedAuthority,\n  getAssociatedLedgerAccount,\n  getAssociatedLedgerPoolAccount,\n  getFarmLedgerLayout,\n} from \"./util\";\nimport { FormatFarmInfoOut, FormatFarmKeyOutV6 } from \"@/api/type\";\nimport Decimal from \"decimal.js\";\n\nexport default class Farm extends ModuleBase {\n  // token account needed\n  private async _getUserRewardInfo({ payer, rewardInfo }: { payer: PublicKey; rewardInfo: FarmRewardInfo }): Promise<{\n    rewardPubKey?: PublicKey;\n    newInstruction?: AddInstructionParam;\n  }> {\n    if (rewardInfo.mint.equals(SOLMint)) {\n      const txInstructions = await createWSolAccountInstructions({\n        connection: this.scope.connection,\n        owner: this.scope.ownerPubKey,\n        payer,\n        amount: calFarmRewardAmount({\n          ...rewardInfo,\n          openTime: rewardInfo.openTime.toString(),\n          endTime: rewardInfo.endTime.toString(),\n        }),\n      });\n      return {\n        rewardPubKey: txInstructions.addresses.newAccount,\n        newInstruction: txInstructions,\n      };\n    }\n\n    return {\n      rewardPubKey: await this.scope.account.getCreatedTokenAccount({\n        mint: rewardInfo.mint,\n        associatedOnly: false,\n      })!,\n    };\n  }\n\n  // token account needed\n  public async create<T extends TxVersion>({\n    poolInfo: propPoolInfo,\n    rewardInfos,\n    payer,\n    programId = FARM_PROGRAM_ID_V6,\n    txVersion,\n  }: CreateFarm<T>): Promise<MakeTxData<T, CreateFarmExtInfo>> {\n    this.checkDisabled();\n    this.scope.checkOwner();\n\n    const lpMint = new PublicKey(propPoolInfo.lpMint.address);\n    const poolInfo = {\n      lpMint,\n      lockInfo: { lockMint: FARM_LOCK_MINT, lockVault: FARM_LOCK_VAULT },\n      version: 6,\n      rewardInfos,\n      programId,\n    };\n\n    const txBuilder = this.createTxBuilder();\n    const payerPubKey = payer ?? this.scope.ownerPubKey;\n    const farmKeyPair = generatePubKey({ fromPublicKey: payerPubKey, programId: poolInfo.programId });\n    const lamports = await this.scope.connection.getMinimumBalanceForRentExemption(farmStateV6Layout.span);\n\n    txBuilder.addInstruction({\n      instructions: [\n        SystemProgram.createAccountWithSeed({\n          fromPubkey: payerPubKey,\n          basePubkey: payerPubKey,\n          seed: farmKeyPair.seed,\n          newAccountPubkey: farmKeyPair.publicKey,\n          lamports,\n          space: farmStateV6Layout.span,\n          programId: poolInfo.programId,\n        }),\n      ],\n    });\n\n    const { publicKey: authority, nonce } = getAssociatedAuthority({\n      programId: new PublicKey(poolInfo.programId),\n      poolId: farmKeyPair.publicKey,\n    });\n\n    const lpVault = getAssociatedLedgerPoolAccount({\n      programId: poolInfo.programId,\n      poolId: farmKeyPair.publicKey,\n      mint: poolInfo.lpMint,\n      type: \"lpVault\",\n    });\n\n    const rewardInfoConfig: FarmRewardInfoConfig[] = [];\n    const rewardInfoKey: RewardInfoKey[] = [];\n\n    for (const rewardInfo of poolInfo.rewardInfos) {\n      if (rewardInfo.openTime >= rewardInfo.endTime)\n        this.logAndCreateError(\"start time error\", \"rewardInfo.rewardOpenTime\", rewardInfo.openTime.toString());\n      if (isNaN(poolTypeV6[rewardInfo.rewardType])) this.logAndCreateError(\"rewardType error\", rewardInfo.rewardType);\n      if (Number(rewardInfo.perSecond) <= 0) this.logAndCreateError(\"rewardPerSecond error\", rewardInfo.perSecond);\n\n      rewardInfoConfig.push(farmRewardInfoToConfig(rewardInfo));\n\n      const { rewardPubKey, newInstruction } = await this._getUserRewardInfo({\n        rewardInfo,\n        payer: payerPubKey,\n      });\n      if (newInstruction) txBuilder.addInstruction(newInstruction);\n\n      if (!rewardPubKey) this.logAndCreateError(\"cannot found target token accounts\", this.scope.account.tokenAccounts);\n\n      const rewardMint = rewardInfo.mint.equals(SOLMint) ? new PublicKey(TOKEN_WSOL.address) : rewardInfo.mint;\n      rewardInfoKey.push({\n        rewardMint,\n        rewardVault: getAssociatedLedgerPoolAccount({\n          programId: poolInfo.programId,\n          poolId: farmKeyPair.publicKey,\n          mint: rewardMint,\n          type: \"rewardVault\",\n        }),\n        userRewardToken: rewardPubKey!,\n      });\n    }\n\n    const { account: lockUserAccount, instructionParams } = await this.scope.account.getOrCreateTokenAccount({\n      mint: new PublicKey(poolInfo.lockInfo.lockMint),\n      owner: this.scope.ownerPubKey,\n      skipCloseAccount: false,\n      createInfo: {\n        payer: this.scope.ownerPubKey,\n        amount: 0,\n      },\n      associatedOnly: false,\n    });\n    instructionParams && txBuilder.addInstruction(instructionParams);\n    if (!lockUserAccount)\n      this.logAndCreateError(\"cannot found lock vault\", \"tokenAccounts\", this.scope.account.tokenAccounts);\n\n    const { instruction, instructionType } = makeCreateFarmInstruction({\n      farmId: farmKeyPair.publicKey,\n      owner: this.scope.ownerPubKey,\n      farmAuthority: authority,\n      lpVault,\n      lpMint: poolInfo.lpMint,\n      lockVault: poolInfo.lockInfo.lockVault,\n      lockMint: poolInfo.lockInfo.lockMint,\n      lockUserAccount,\n      programId: poolInfo.programId,\n      rewardInfo: rewardInfoKey,\n      rewardInfoConfig,\n      nonce,\n    });\n\n    return txBuilder\n      .addInstruction({\n        instructions: [instruction],\n        instructionTypes: [instructionType],\n      })\n      .versionBuild<CreateFarmExtInfo>({\n        txVersion,\n        extInfo: {\n          farmId: farmKeyPair.publicKey,\n          farmAuthority: authority,\n          lpVault,\n          lockUserAccount: lockUserAccount!,\n          nonce,\n        },\n      }) as Promise<MakeTxData<T, CreateFarmExtInfo>>;\n  }\n\n  public async restartReward<T extends TxVersion>({\n    farmInfo,\n    payer,\n    newRewardInfo,\n    txVersion,\n  }: UpdateFarmReward): Promise<MakeTxData<T>> {\n    const version = FARM_PROGRAM_TO_VERSION[farmInfo.programId];\n    if (version !== 6) this.logAndCreateError(\"invalid farm version \", version);\n\n    const farmInfoKeys = jsonInfo2PoolKeys((await this.scope.api.fetchFarmKeysById({ ids: farmInfo.id }))[0]);\n\n    const farmKeys = {\n      id: farmInfoKeys.id,\n      rewardInfos: farmInfo.rewardInfos,\n      lpVault: farmInfoKeys.lpVault,\n      programId: farmInfoKeys.programId,\n    };\n\n    if (newRewardInfo.openTime >= newRewardInfo.endTime)\n      this.logAndCreateError(\"start time error\", \"newRewardInfo\", newRewardInfo);\n\n    const payerPubKey = payer || this.scope.ownerPubKey;\n\n    const rewardMint = newRewardInfo.mint.equals(SOLMint) ? new PublicKey(TOKEN_WSOL.address) : newRewardInfo.mint;\n    const rewardInfoIndex = farmKeys.rewardInfos.findIndex((item) =>\n      new PublicKey(item.mint.address).equals(rewardMint),\n    );\n    const rewardInfo = farmInfoKeys.rewardInfos[rewardInfoIndex];\n\n    if (!rewardInfo) this.logAndCreateError(\"configuration does not exist\", \"rewardMint\", rewardMint);\n\n    const rewardVault = rewardInfo!.vault ?? SOLMint;\n    const txBuilder = this.createTxBuilder();\n\n    const { rewardPubKey: userRewardTokenPub, newInstruction } = await this._getUserRewardInfo({\n      rewardInfo: newRewardInfo,\n      payer: payerPubKey,\n    });\n    if (newInstruction) txBuilder.addInstruction(newInstruction);\n\n    if (!userRewardTokenPub)\n      this.logAndCreateError(\"cannot found target token accounts\", this.scope.account.tokenAccounts);\n\n    return txBuilder\n      .addInstruction({\n        instructions: [\n          makeRestartRewardInstruction({\n            payer: this.scope.ownerPubKey,\n            rewardVault,\n            userRewardTokenPub: userRewardTokenPub!,\n            farmKeys,\n            rewardInfo: newRewardInfo,\n          }),\n        ],\n        instructionTypes: [InstructionType.FarmV6Restart],\n      })\n      .versionBuild({ txVersion }) as Promise<MakeTxData<T>>;\n  }\n\n  public async restartRewards<T extends TxVersion>({\n    farmInfo,\n    payer,\n    newRewardInfos,\n    txVersion,\n  }: UpdateFarmRewards<T>): Promise<MakeTxData<T>> {\n    const version = FARM_PROGRAM_TO_VERSION[farmInfo.programId];\n    if (version !== 6) this.logAndCreateError(\"invalid farm version \", version);\n\n    const farmInfoKeys = jsonInfo2PoolKeys((await this.scope.api.fetchFarmKeysById({ ids: farmInfo.id }))[0]);\n\n    const farmKeys = {\n      id: farmInfoKeys.id,\n      rewardInfos: farmInfo.rewardInfos,\n      lpVault: farmInfoKeys.lpVault,\n      programId: farmInfoKeys.programId,\n    };\n\n    newRewardInfos.forEach((reward) => {\n      if (reward.openTime >= reward.endTime) this.logAndCreateError(\"start time error\", \"newRewardInfo\", reward);\n    });\n\n    const payerPubKey = payer || this.scope.ownerPubKey;\n    const txBuilder = this.createTxBuilder();\n\n    for (const itemReward of newRewardInfos) {\n      const rewardMint = itemReward.mint.equals(SOLMint) ? new PublicKey(TOKEN_WSOL.address) : itemReward.mint;\n      const rewardInfoIndex = farmKeys.rewardInfos.findIndex((item) =>\n        new PublicKey(item.mint.address).equals(rewardMint),\n      );\n      const rewardInfo = farmInfoKeys.rewardInfos[rewardInfoIndex];\n      if (!rewardInfo) this.logAndCreateError(\"configuration does not exist\", \"rewardMint\", rewardMint);\n      const rewardVault = rewardInfo!.vault ?? SOLMint;\n      const { rewardPubKey: userRewardTokenPub, newInstruction } = await this._getUserRewardInfo({\n        rewardInfo: itemReward,\n        payer: payerPubKey,\n      });\n      if (newInstruction) txBuilder.addInstruction(newInstruction);\n      if (!userRewardTokenPub)\n        this.logAndCreateError(\"cannot found target token accounts\", this.scope.account.tokenAccounts);\n      const ins = makeRestartRewardInstruction({\n        payer: this.scope.ownerPubKey,\n        rewardVault,\n        userRewardTokenPub: userRewardTokenPub!,\n        farmKeys,\n        rewardInfo: itemReward,\n      });\n      txBuilder.addInstruction({\n        instructions: [ins],\n        instructionTypes: [InstructionType.FarmV6Restart],\n      });\n    }\n\n    return txBuilder.versionBuild({ txVersion }) as Promise<MakeTxData<T>>;\n  }\n\n  public async addNewRewardToken<T extends TxVersion>(params: UpdateFarmReward): Promise<MakeTxData<T>> {\n    const { txVersion, farmInfo, newRewardInfo, payer } = params;\n    const version = FARM_PROGRAM_TO_VERSION[farmInfo.programId];\n    if (version !== 6) this.logAndCreateError(\"invalid farm version \", version);\n\n    const farmKeys = jsonInfo2PoolKeys((await this.scope.api.fetchFarmKeysById({ ids: farmInfo.id }))[0]);\n    const payerPubKey = payer ?? this.scope.ownerPubKey;\n    const txBuilder = this.createTxBuilder();\n\n    const rewardMint = newRewardInfo.mint.equals(SOLMint) ? new PublicKey(TOKEN_WSOL.address) : newRewardInfo.mint;\n\n    const rewardVault = getAssociatedLedgerPoolAccount({\n      programId: new PublicKey(farmInfo.programId),\n      poolId: new PublicKey(farmInfo.id),\n      mint: rewardMint,\n      type: \"rewardVault\",\n    });\n\n    const { rewardPubKey: userRewardTokenPub, newInstruction } = await this._getUserRewardInfo({\n      rewardInfo: newRewardInfo,\n      payer: payerPubKey,\n    });\n    if (newInstruction) txBuilder.addInstruction(newInstruction);\n\n    if (!userRewardTokenPub)\n      this.logAndCreateError(\"annot found target token accounts\", this.scope.account.tokenAccounts);\n\n    newRewardInfo.mint = rewardMint;\n\n    return txBuilder\n      .addInstruction({\n        instructions: [\n          makeAddNewRewardInstruction({\n            payer: this.scope.ownerPubKey,\n            userRewardTokenPub: userRewardTokenPub!,\n            farmKeys,\n            rewardVault,\n            rewardInfo: newRewardInfo,\n          }),\n        ],\n        instructionTypes: [InstructionType.FarmV6CreatorAddReward],\n      })\n      .versionBuild({ txVersion }) as Promise<MakeTxData<T>>;\n  }\n\n  public async addNewRewardsToken<T extends TxVersion>(params: UpdateFarmRewards<T>): Promise<MakeTxData<T>> {\n    const { txVersion, farmInfo, newRewardInfos, payer } = params;\n    const version = FARM_PROGRAM_TO_VERSION[farmInfo.programId];\n    if (version !== 6) this.logAndCreateError(\"invalid farm version \", version);\n\n    const farmKeys = jsonInfo2PoolKeys((await this.scope.api.fetchFarmKeysById({ ids: farmInfo.id }))[0]);\n    const payerPubKey = payer ?? this.scope.ownerPubKey;\n    const txBuilder = this.createTxBuilder();\n\n    for (const itemReward of newRewardInfos) {\n      const rewardMint = itemReward.mint.equals(SOLMint) ? new PublicKey(TOKEN_WSOL.address) : itemReward.mint;\n      const rewardVault = getAssociatedLedgerPoolAccount({\n        programId: new PublicKey(farmInfo.programId),\n        poolId: new PublicKey(farmInfo.id),\n        mint: rewardMint,\n        type: \"rewardVault\",\n      });\n      const { rewardPubKey: userRewardTokenPub, newInstruction } = await this._getUserRewardInfo({\n        rewardInfo: itemReward,\n        payer: payerPubKey,\n      });\n      if (newInstruction) txBuilder.addInstruction(newInstruction);\n      if (!userRewardTokenPub)\n        this.logAndCreateError(\"cannot found target token accounts\", this.scope.account.tokenAccounts);\n      const ins = makeAddNewRewardInstruction({\n        payer: this.scope.ownerPubKey,\n        userRewardTokenPub: userRewardTokenPub!,\n        farmKeys,\n        rewardVault,\n        rewardInfo: { ...itemReward, mint: rewardMint },\n      });\n      txBuilder.addInstruction({\n        instructions: [ins],\n        instructionTypes: [InstructionType.FarmV6CreatorAddReward],\n      });\n    }\n\n    return txBuilder.versionBuild({ txVersion }) as Promise<MakeTxData<T>>;\n  }\n\n  public async deposit<T extends TxVersion>(params: FarmDWParam<T>): Promise<MakeTxData<T>> {\n    const {\n      txVersion,\n      farmInfo,\n      amount,\n      feePayer,\n      useSOLBalance,\n      associatedOnly = true,\n      checkCreateATAOwner = false,\n      userAuxiliaryLedgers,\n      computeBudgetConfig,\n    } = params;\n\n    if (this.scope.availability.addFarm === false)\n      this.logAndCreateError(\"farm deposit feature disabled in your region\");\n\n    const { rewardInfos, programId } = farmInfo;\n    const version = FARM_PROGRAM_TO_VERSION[programId];\n    if (!isValidFarmVersion(version)) this.logAndCreateError(\"invalid farm program:\", farmInfo.programId);\n    const [farmProgramId, farmId] = [new PublicKey(farmInfo.programId), new PublicKey(farmInfo.id)];\n    const farmKeys = (await this.scope.api.fetchFarmKeysById({ ids: farmInfo.id }))[0];\n\n    const ledger = getAssociatedLedgerAccount({\n      programId: farmProgramId,\n      poolId: farmId,\n      owner: this.scope.ownerPubKey,\n      version,\n    });\n\n    const txBuilder = this.createTxBuilder();\n    txBuilder.addCustomComputeBudget(computeBudgetConfig);\n    const ownerMintToAccount: { [mint: string]: PublicKey } = {};\n    for (const item of this.scope.account.tokenAccounts) {\n      if (associatedOnly) {\n        const ata = getATAAddress(this.scope.ownerPubKey, item.mint, item.programId).publicKey;\n        if (item.publicKey && ata.equals(item.publicKey)) ownerMintToAccount[item.mint.toString()] = item.publicKey;\n      } else {\n        ownerMintToAccount[item.mint.toString()] = item.publicKey!;\n      }\n    }\n\n    const lpMint = farmKeys.lpMint;\n    const ownerLpTokenAccount = ownerMintToAccount[lpMint.address];\n    if (!ownerLpTokenAccount) this.logAndCreateError(\"you don't have any lp\", \"lp zero\", ownerMintToAccount);\n\n    const rewardAccounts: PublicKey[] = [];\n    for (const itemReward of rewardInfos) {\n      const rewardUseSOLBalance = useSOLBalance && itemReward.mint.address === WSOLMint.toString();\n\n      let ownerRewardAccount = ownerMintToAccount[itemReward.mint.address];\n\n      if (!ownerRewardAccount) {\n        const { account: _ownerRewardAccount, instructionParams } = await this.scope.account.getOrCreateTokenAccount({\n          tokenProgram: itemReward.mint.programId,\n          mint: new PublicKey(itemReward.mint.address),\n          notUseTokenAccount: rewardUseSOLBalance,\n          createInfo: {\n            payer: feePayer || this.scope.ownerPubKey,\n            amount: 0,\n          },\n          owner: this.scope.ownerPubKey,\n          skipCloseAccount: !rewardUseSOLBalance,\n          associatedOnly: rewardUseSOLBalance ? false : associatedOnly,\n          checkCreateATAOwner,\n        });\n        ownerRewardAccount = _ownerRewardAccount!;\n        instructionParams && txBuilder.addInstruction(instructionParams);\n      }\n\n      ownerMintToAccount[itemReward.mint.address] = ownerRewardAccount;\n      rewardAccounts.push(ownerRewardAccount);\n    }\n\n    let ledgerInfo: FarmLedger | undefined = undefined;\n    const ledgerData = await this.scope.connection.getAccountInfo(ledger);\n    if (ledgerData) {\n      const ledgerLayout = getFarmLedgerLayout(version)!;\n      ledgerInfo = ledgerLayout.decode(ledgerData.data);\n    }\n\n    if (farmInfo.programId !== FARM_PROGRAM_ID_V6.toString() && !ledgerInfo) {\n      const { instruction, instructionType } = createAssociatedLedgerAccountInstruction({\n        id: farmId,\n        programId: farmProgramId,\n        version,\n        ledger,\n        owner: this.scope.ownerPubKey,\n      });\n      txBuilder.addInstruction({ instructions: [instruction], instructionTypes: [instructionType] });\n    }\n\n    const errorMsg = validateFarmRewards({\n      version,\n      rewardInfos,\n      rewardTokenAccountsPublicKeys: rewardAccounts,\n    });\n    if (errorMsg) this.logAndCreateError(errorMsg);\n\n    const insParams = {\n      amount: parseBigNumberish(amount),\n      owner: this.scope.ownerPubKey,\n      farmInfo,\n      farmKeys,\n      lpAccount: ownerLpTokenAccount,\n      rewardAccounts,\n      userAuxiliaryLedgers: userAuxiliaryLedgers?.map((key) => new PublicKey(key)),\n    };\n\n    const newInstruction =\n      version === 6\n        ? makeDepositInstructionV6(insParams)\n        : version === 5\n        ? makeDepositInstructionV5(insParams)\n        : makeDepositInstructionV3(insParams);\n\n    const insType = {\n      3: InstructionType.FarmV3Deposit,\n      5: InstructionType.FarmV5Deposit,\n      6: InstructionType.FarmV6Deposit,\n    };\n\n    return txBuilder\n      .addInstruction({\n        instructions: [newInstruction],\n        instructionTypes: [insType[version]],\n      })\n      .versionBuild({ txVersion }) as Promise<MakeTxData<T>>;\n  }\n\n  public async withdraw<T extends TxVersion>(params: FarmDWParam<T>): Promise<MakeTxData<T>> {\n    const {\n      txVersion,\n      farmInfo,\n      amount,\n      deposited,\n      useSOLBalance,\n      feePayer,\n      associatedOnly = true,\n      checkCreateATAOwner = false,\n      userAuxiliaryLedgers,\n      computeBudgetConfig,\n    } = params;\n    const { rewardInfos } = farmInfo;\n\n    if (this.scope.availability.removeFarm === false)\n      this.logAndCreateError(\"farm withdraw feature disabled in your region\");\n\n    const version = FARM_PROGRAM_TO_VERSION[farmInfo.programId];\n\n    if (!isValidFarmVersion(version)) this.logAndCreateError(\"invalid farm program:\", farmInfo.programId);\n\n    const farmKeys = (await this.scope.api.fetchFarmKeysById({ ids: farmInfo.id }))[0];\n    const txBuilder = this.createTxBuilder();\n    txBuilder.addCustomComputeBudget(computeBudgetConfig);\n    const ownerMintToAccount: { [mint: string]: PublicKey } = {};\n    for (const item of this.scope.account.tokenAccounts) {\n      if (associatedOnly) {\n        const ata = getATAAddress(this.scope.ownerPubKey, item.mint).publicKey;\n        if (item.publicKey && ata.equals(item.publicKey)) ownerMintToAccount[item.mint.toString()] = item.publicKey;\n      } else {\n        ownerMintToAccount[item.mint.toString()] = item.publicKey!;\n      }\n    }\n\n    if (!deposited) {\n      const ledger = getAssociatedLedgerAccount({\n        programId: new PublicKey(farmInfo.programId),\n        poolId: new PublicKey(farmInfo.id),\n        owner: this.scope.ownerPubKey,\n        version,\n      });\n      const ledgerData = await this.scope.connection.getAccountInfo(ledger);\n      if (!ledgerData) {\n        // user has old not ata farm vault and don't have ata vault\n        if (version !== 6 && (userAuxiliaryLedgers || []).length > 0) {\n          const { instruction, instructionType } = createAssociatedLedgerAccountInstruction({\n            id: new PublicKey(farmKeys.id),\n            programId: new PublicKey(farmKeys.programId),\n            version,\n            ledger,\n            owner: this.scope.ownerPubKey,\n          });\n          txBuilder.addInstruction({ instructions: [instruction], instructionTypes: [instructionType] });\n        } else {\n          this.logAndCreateError(\"no lp data\", { farmId: farmInfo.id, version, ledgerData });\n        }\n      } else {\n        const ledgerLayout = getFarmLedgerLayout(version)!;\n        const ledgerInfo = ledgerLayout.decode(ledgerData!.data);\n        if (ledgerInfo.deposited.isZero()) this.logAndCreateError(\"no deposited lp\", { farmId: farmInfo.id });\n      }\n    } else {\n      if (deposited.isZero()) this.logAndCreateError(\"no deposited lp\", { farmId: farmInfo.id });\n    }\n\n    const lpMint = farmKeys.lpMint.address;\n    const lpMintUseSOLBalance = useSOLBalance && lpMint === WSOLMint.toString();\n\n    let ownerLpTokenAccount = ownerMintToAccount[lpMint.toString()];\n    if (!ownerLpTokenAccount) {\n      const { account: _ownerRewardAccount, instructionParams } = await this.scope.account.getOrCreateTokenAccount({\n        tokenProgram: farmKeys.lpMint.programId,\n        mint: new PublicKey(lpMint),\n        notUseTokenAccount: lpMintUseSOLBalance,\n        createInfo: {\n          payer: feePayer || this.scope.ownerPubKey,\n          amount: 0,\n        },\n        owner: this.scope.ownerPubKey,\n        skipCloseAccount: true,\n        associatedOnly: lpMintUseSOLBalance ? false : associatedOnly,\n        checkCreateATAOwner,\n      });\n      ownerLpTokenAccount = _ownerRewardAccount!;\n      instructionParams && txBuilder.addInstruction(instructionParams);\n    }\n    ownerMintToAccount[lpMint.toString()] = ownerLpTokenAccount;\n\n    const rewardAccounts: PublicKey[] = [];\n    for (const itemReward of rewardInfos) {\n      const rewardUseSOLBalance = useSOLBalance && itemReward.mint.address === WSOLMint.toString();\n\n      let ownerRewardAccount = ownerMintToAccount[itemReward.mint.address];\n      if (!ownerRewardAccount) {\n        const { account: _ownerRewardAccount, instructionParams } = await this.scope.account.getOrCreateTokenAccount({\n          tokenProgram: itemReward.mint.programId,\n          mint: new PublicKey(itemReward.mint.address),\n          notUseTokenAccount: rewardUseSOLBalance,\n          createInfo: {\n            payer: feePayer || this.scope.ownerPubKey,\n            amount: 0,\n          },\n          owner: this.scope.ownerPubKey,\n          skipCloseAccount: !rewardUseSOLBalance,\n          associatedOnly: rewardUseSOLBalance ? false : associatedOnly,\n          checkCreateATAOwner,\n        });\n        ownerRewardAccount = _ownerRewardAccount!;\n        instructionParams && txBuilder.addInstruction(instructionParams);\n      }\n\n      ownerMintToAccount[itemReward.mint.address] = ownerRewardAccount;\n      rewardAccounts.push(ownerRewardAccount);\n    }\n\n    const errorMsg = validateFarmRewards({\n      version,\n      rewardInfos,\n      rewardTokenAccountsPublicKeys: rewardAccounts,\n    });\n    if (errorMsg) this.logAndCreateError(errorMsg);\n\n    const insParams = {\n      amount: parseBigNumberish(amount),\n      owner: this.scope.ownerPubKey,\n      farmInfo,\n      farmKeys,\n      lpAccount: ownerLpTokenAccount,\n      rewardAccounts,\n      userAuxiliaryLedgers: userAuxiliaryLedgers?.map((key) => new PublicKey(key)),\n    };\n\n    const newInstruction =\n      version === 6\n        ? makeWithdrawInstructionV6(insParams)\n        : version === 5\n        ? makeWithdrawInstructionV5(insParams)\n        : makeWithdrawInstructionV3(insParams);\n\n    const insType = {\n      3: InstructionType.FarmV3Withdraw,\n      5: InstructionType.FarmV5Withdraw,\n      6: InstructionType.FarmV6Withdraw,\n    };\n\n    return txBuilder\n      .addInstruction({\n        instructions: [newInstruction],\n        instructionTypes: [insType[version]],\n      })\n      .versionBuild({ txVersion }) as Promise<MakeTxData<T>>;\n  }\n\n  // token account needed\n  public async withdrawFarmReward<T extends TxVersion>({\n    farmInfo,\n    withdrawMint,\n    txVersion,\n  }: {\n    farmInfo: FormatFarmInfoOut;\n    withdrawMint: PublicKey;\n    payer?: PublicKey;\n    txVersion?: T;\n  }): Promise<MakeTxData<T>> {\n    this.scope.checkOwner();\n    const farmKeys = jsonInfo2PoolKeys(\n      (await this.scope.api.fetchFarmKeysById({ ids: farmInfo.id }))[0] as FormatFarmKeyOutV6,\n    );\n    const version = FARM_PROGRAM_TO_VERSION[farmInfo.programId];\n    if (version !== 6) this.logAndCreateError(\"invalid farm version\", version);\n\n    const rewardInfoIdx = farmInfo.rewardInfos.findIndex((item) =>\n      item.mint.address === SOLMint.toString() ? new PublicKey(TOKEN_WSOL.address) : withdrawMint,\n    );\n    const rewardInfo = farmKeys.rewardInfos[rewardInfoIdx];\n    if (!rewardInfo) this.logAndCreateError(\"withdraw mint error\", \"rewardInfos\", farmInfo);\n\n    const rewardVault = rewardInfo?.vault ?? SOLMint;\n    const txBuilder = this.createTxBuilder();\n\n    let userRewardToken: PublicKey;\n\n    if (withdrawMint.equals(SOLMint)) {\n      const txInstruction = await createWSolAccountInstructions({\n        connection: this.scope.connection,\n        owner: this.scope.ownerPubKey,\n        payer: this.scope.ownerPubKey,\n        amount: calFarmRewardAmount({\n          ...rewardInfo,\n          openTime: rewardInfo.openTime as unknown as string,\n          endTime: rewardInfo.endTime as unknown as string,\n          perSecond: new Decimal(rewardInfo.perSecond).mul(10 ** rewardInfo.mint.decimals).toString(),\n        }),\n      });\n      userRewardToken = txInstruction.addresses.newAccount;\n      txBuilder.addInstruction(txInstruction);\n    } else {\n      const selectUserRewardToken = await this.scope.account.getCreatedTokenAccount({\n        mint: withdrawMint,\n      });\n\n      if (selectUserRewardToken === null) {\n        userRewardToken = await this.scope.account.getAssociatedTokenAccount(withdrawMint);\n        txBuilder.addInstruction({\n          instructions: [\n            createAssociatedTokenAccountInstruction(\n              this.scope.ownerPubKey,\n              userRewardToken,\n              this.scope.ownerPubKey,\n              withdrawMint,\n            ),\n          ],\n          instructionTypes: [InstructionType.CreateATA],\n        });\n      } else {\n        userRewardToken = selectUserRewardToken!;\n      }\n    }\n\n    const { instruction, instructionType } = makeCreatorWithdrawFarmRewardInstruction({\n      programId: farmKeys.programId,\n      id: farmKeys.id,\n      authority: farmKeys.authority,\n      lpVault: farmKeys.lpVault,\n      rewardVault,\n      userRewardToken,\n      owner: this.scope.ownerPubKey,\n    });\n\n    return txBuilder\n      .addInstruction({\n        instructions: [instruction],\n        instructionTypes: [instructionType],\n      })\n      .versionBuild({ txVersion }) as Promise<MakeTxData<T>>;\n  }\n\n  public async harvestAllRewards<T extends TxVersion = TxVersion.LEGACY>(params: {\n    farmInfoList: Record<string, FormatFarmInfoOut>;\n    feePayer?: PublicKey;\n    useSOLBalance?: boolean;\n    associatedOnly?: boolean;\n    checkCreateATAOwner?: boolean;\n    userAuxiliaryLedgers?: string[];\n    txVersion?: T;\n    computeBudgetConfig?: ComputeBudgetConfig;\n  }): Promise<MakeMultiTxData<T>> {\n    const {\n      farmInfoList,\n      useSOLBalance,\n      feePayer,\n      associatedOnly = true,\n      checkCreateATAOwner = false,\n      userAuxiliaryLedgers,\n      txVersion,\n      computeBudgetConfig,\n    } = params;\n\n    const txBuilder = this.createTxBuilder();\n    const ownerMintToAccount: { [mint: string]: PublicKey } = {};\n    for (const item of this.scope.account.tokenAccounts) {\n      if (associatedOnly) {\n        const ata = getATAAddress(this.scope.ownerPubKey, item.mint).publicKey;\n        if (item.publicKey && ata.equals(item.publicKey)) ownerMintToAccount[item.mint.toString()] = item.publicKey;\n      } else {\n        ownerMintToAccount[item.mint.toString()] = item.publicKey!;\n      }\n    }\n\n    const allFarmKeys = await this.scope.api.fetchFarmKeysById({\n      ids: Object.values(farmInfoList)\n        .map((f) => f.id)\n        .join(\",\"),\n    });\n    const farmKeyMap: { [key: string]: FormatFarmKeyOut } = allFarmKeys.reduce(\n      (acc, cur) => ({ ...acc, [cur.id]: cur }),\n      {},\n    );\n    for (const farmInfo of Object.values(farmInfoList)) {\n      const { programId, lpMint: farmLpMint, rewardInfos, id } = farmInfo;\n      const version = FARM_PROGRAM_TO_VERSION[programId];\n\n      const lpMint = farmLpMint.address;\n      const lpMintUseSOLBalance = useSOLBalance && lpMint === WSOLMint.toString();\n      let ownerLpTokenAccount = ownerMintToAccount[lpMint];\n\n      if (!ownerLpTokenAccount) {\n        const { account: _ownerLpAccount, instructionParams } = await this.scope.account.getOrCreateTokenAccount({\n          tokenProgram: farmLpMint.programId,\n          mint: new PublicKey(lpMint),\n          notUseTokenAccount: lpMintUseSOLBalance,\n          createInfo: {\n            payer: feePayer || this.scope.ownerPubKey,\n            amount: 0,\n          },\n          owner: this.scope.ownerPubKey,\n          skipCloseAccount: true,\n          associatedOnly: lpMintUseSOLBalance ? false : associatedOnly,\n          checkCreateATAOwner,\n        });\n        ownerLpTokenAccount = _ownerLpAccount!;\n        instructionParams && txBuilder.addInstruction(instructionParams);\n      }\n      ownerMintToAccount[lpMint.toString()] = ownerLpTokenAccount;\n\n      const rewardAccounts: PublicKey[] = [];\n      for (const itemReward of rewardInfos) {\n        const rewardUseSOLBalance = useSOLBalance && itemReward.mint.address === WSOLMint.toString();\n\n        let ownerRewardAccount = ownerMintToAccount[itemReward.mint.address];\n        if (!ownerRewardAccount) {\n          const { account: _ownerRewardAccount, instructionParams } = await this.scope.account.getOrCreateTokenAccount({\n            tokenProgram: itemReward.mint.programId,\n            mint: new PublicKey(itemReward.mint.address),\n            notUseTokenAccount: rewardUseSOLBalance,\n            createInfo: {\n              payer: feePayer || this.scope.ownerPubKey,\n              amount: 0,\n            },\n            owner: this.scope.ownerPubKey,\n            skipCloseAccount: !rewardUseSOLBalance,\n            associatedOnly: rewardUseSOLBalance ? false : associatedOnly,\n            checkCreateATAOwner,\n          });\n          ownerRewardAccount = _ownerRewardAccount!;\n          instructionParams && txBuilder.addInstruction(instructionParams);\n        }\n\n        ownerMintToAccount[itemReward.mint.address] = ownerRewardAccount;\n        rewardAccounts.push(ownerRewardAccount);\n      }\n\n      const farmKeys = farmKeyMap[id];\n      const insParams = {\n        amount: BN_ZERO,\n        owner: this.scope.ownerPubKey,\n        farmInfo,\n        farmKeys,\n        lpAccount: ownerLpTokenAccount,\n        rewardAccounts,\n        userAuxiliaryLedgers: userAuxiliaryLedgers?.map((key) => new PublicKey(key)),\n      };\n\n      const withdrawInstruction =\n        version === 6\n          ? makeWithdrawInstructionV6(insParams)\n          : version === 5\n          ? makeWithdrawInstructionV5(insParams)\n          : makeWithdrawInstructionV3(insParams);\n\n      const insType = {\n        3: InstructionType.FarmV3Withdraw,\n        5: InstructionType.FarmV5Withdraw,\n        6: InstructionType.FarmV6Withdraw,\n      };\n\n      txBuilder.addInstruction({\n        instructions: [withdrawInstruction],\n        instructionTypes: [insType[version]],\n      });\n    }\n\n    if (txVersion === TxVersion.LEGACY)\n      return txBuilder.sizeCheckBuild({ computeBudgetConfig }) as Promise<MakeMultiTxData<T>>;\n    return txBuilder.sizeCheckBuildV0({ computeBudgetConfig }) as Promise<MakeMultiTxData<T>>;\n  }\n}\n","import { PublicKey } from \"@solana/web3.js\";\n\nimport { createLogger } from \"@/common/logger\";\nimport { FARM_PROGRAM_ID_V3, FARM_PROGRAM_ID_V5, FARM_PROGRAM_ID_V6 } from \"@/common/programId\";\nimport { ApiV3Token, RewardInfoV345, RewardInfoV6 } from \"@/api/type\";\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, 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 | 5 | 6> = {\n  [FARM_PROGRAM_ID_V3.toString()]: 3,\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  GetLayoutSchemaFromStructure,\n  GetStructureFromLayoutSchema,\n  GetStructureSchema,\n  publicKey,\n  seq,\n  struct,\n  u128,\n  u64,\n  u8,\n  i8,\n  i64,\n  bool,\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","import {\n  PublicKey,\n  SystemProgram,\n  SYSVAR_RENT_PUBKEY,\n  SYSVAR_CLOCK_PUBKEY,\n  TransactionInstruction,\n  Connection,\n} from \"@solana/web3.js\";\nimport {\n  createAssociatedTokenAccountInstruction,\n  TOKEN_PROGRAM_ID,\n  ASSOCIATED_TOKEN_PROGRAM_ID,\n} from \"@solana/spl-token\";\nimport BN from \"bn.js\";\n\nimport { struct, u8, u64, u32, bool } from \"@/marshmallow\";\nimport { FormatFarmKeyOut } from \"@/api/type\";\nimport { getATAAddress } from \"@/common/pda\";\nimport { createLogger } from \"@/common/logger\";\nimport { parseBigNumberish } from \"@/common/bignumber\";\nimport {\n  accountMeta,\n  commonSystemAccountMeta,\n  SOLMint,\n  RENT_PROGRAM_ID,\n  INSTRUCTION_PROGRAM_ID,\n} from \"@/common/pubKey\";\nimport { InstructionType } from \"@/common/txTool/txType\";\nimport { InstructionReturn } from \"../type\";\nimport {\n  associatedLedgerAccountLayout,\n  farmRewardLayout,\n  withdrawRewardLayout,\n  farmLedgerLayoutV3_2,\n  farmAddRewardLayout,\n} from \"./layout\";\nimport { FarmRewardInfoConfig, RewardInfoKey, RewardType } from \"./type\";\nimport {\n  getRegistrarAddress,\n  getVotingTokenMint,\n  getVotingMintAuthority,\n  getVoterAddress,\n  getVoterWeightRecordAddress,\n  getTokenOwnerRecordAddress,\n} from \"./pda\";\nimport { dwLayout, farmRewardRestartLayout } from \"./layout\";\nimport { getAssociatedLedgerAccount, getDepositEntryIndex } from \"./util\";\nimport { poolTypeV6 } from \"./config\";\n\nconst logger = createLogger(\"Raydium_farm_instruction\");\n\nconst anchorDataBuf = {\n  voterStakeRegistryCreateVoter: Buffer.from([6, 24, 245, 52, 243, 255, 148, 25]), // CreateVoter\n  voterStakeRegistryCreateDepositEntry: Buffer.from([185, 131, 167, 186, 159, 125, 19, 67]), // CreateDepositEntry\n  voterStakeRegistryDeposit: Buffer.from([242, 35, 198, 137, 82, 225, 242, 182]), // Deposit\n  voterStakeRegistryWithdraw: Buffer.from([183, 18, 70, 156, 148, 109, 161, 34]), // Withdraw\n  voterStakeRegistryUpdateVoterWeightRecord: Buffer.from([45, 185, 3, 36, 109, 190, 115, 169]), // UpdateVoterWeightRecord\n};\n\nexport function createAssociatedLedgerAccountInstruction(params: {\n  version: number;\n  id: PublicKey;\n  programId: PublicKey;\n  ledger: PublicKey;\n  owner: PublicKey;\n}): InstructionReturn {\n  const { version, id, ledger, programId, owner } = params;\n  const instruction = { 3: 9, 5: 10 }[version];\n  if (!instruction) logger.logWithError(`invalid farm pool version: ${version}`);\n\n  const data = Buffer.alloc(associatedLedgerAccountLayout.span);\n  associatedLedgerAccountLayout.encode(\n    {\n      instruction: instruction!,\n    },\n    data,\n  );\n\n  const keys = [\n    accountMeta({ pubkey: id }),\n    accountMeta({ pubkey: ledger }),\n    accountMeta({ pubkey: owner, isWritable: false }),\n    accountMeta({ pubkey: SystemProgram.programId, isWritable: false }),\n    accountMeta({ pubkey: SYSVAR_RENT_PUBKEY, isWritable: false }),\n  ];\n\n  return {\n    instruction: new TransactionInstruction({\n      programId,\n      keys,\n      data,\n    }),\n    instructionType: InstructionType.FarmV3CreateLedger,\n  };\n}\n\ninterface CreateFarmInstruction {\n  farmId: PublicKey;\n  farmAuthority: PublicKey;\n  lpVault: PublicKey;\n  lpMint: PublicKey;\n  lockVault: PublicKey;\n  lockMint: PublicKey;\n  lockUserAccount?: PublicKey;\n  programId: PublicKey;\n  owner: PublicKey;\n  rewardInfo: RewardInfoKey[];\n  rewardInfoConfig: FarmRewardInfoConfig[];\n  nonce: number;\n}\nexport function makeCreateFarmInstruction(params: CreateFarmInstruction): InstructionReturn {\n  const data = Buffer.alloc(farmRewardLayout.span);\n  farmRewardLayout.encode(\n    {\n      instruction: 0,\n      nonce: new BN(params.nonce),\n      rewardTimeInfo: params.rewardInfoConfig,\n    },\n    data,\n  );\n\n  const keys = [\n    ...commonSystemAccountMeta,\n    accountMeta({ pubkey: params.farmId }),\n    accountMeta({ pubkey: params.farmAuthority, isWritable: false }),\n    accountMeta({ pubkey: params.lpVault }),\n    accountMeta({ pubkey: params.lpMint, isWritable: false }),\n    accountMeta({ pubkey: params.lockVault }),\n    accountMeta({ pubkey: params.lockMint, isWritable: false }),\n    accountMeta({ pubkey: params.lockUserAccount ?? SOLMint }),\n    accountMeta({ pubkey: params.owner, isWritable: false, isSigner: true }),\n  ];\n\n  for (const item of params.rewardInfo) {\n    keys.push(\n      ...[\n        accountMeta({ pubkey: item.rewardMint, isWritable: false }),\n        accountMeta({ pubkey: item.rewardVault }),\n        accountMeta({ pubkey: item.userRewardToken }),\n      ],\n    );\n  }\n\n  return {\n    instruction: new TransactionInstruction({ programId: params.programId, keys, data }),\n    instructionType: InstructionType.FarmV6Create,\n  };\n}\n\ninterface CreatorWithdrawFarmRewardInstruction {\n  id: PublicKey;\n  programId: PublicKey;\n  authority: PublicKey;\n  lpVault: PublicKey;\n  rewardVault: PublicKey;\n  userRewardToken: PublicKey;\n  owner: PublicKey;\n}\n\nexport function makeCreatorWithdrawFarmRewardInstruction(\n  params: CreatorWithdrawFarmRewardInstruction,\n): InstructionReturn {\n  const data = Buffer.alloc(withdrawRewardLayout.span);\n  withdrawRewardLayout.encode({ instruction: 5 }, data);\n\n  const keys = [\n    accountMeta({ pubkey: TOKEN_PROGRAM_ID, isWritable: false }),\n    accountMeta({ pubkey: params.id }),\n    accountMeta({ pubkey: params.authority, isWritable: false }),\n    accountMeta({ pubkey: params.lpVault, isWritable: false }),\n    accountMeta({ pubkey: params.rewardVault }),\n    accountMeta({ pubkey: params.userRewardToken }),\n    accountMeta({ pubkey: params.owner, isWritable: false, isSigner: true }),\n  ];\n\n  return {\n    instruction: new TransactionInstruction({ programId: params.programId, keys, data }),\n    instructionType: InstructionType.FarmV6CreatorWithdraw,\n  };\n}\n\nexport function voterStakeRegistryDeposit(\n  programId: PublicKey,\n  registrar: PublicKey,\n  voter: PublicKey,\n  voterVault: PublicKey,\n  depositToken: PublicKey,\n  depositAuthority: PublicKey,\n\n  userStakerInfoV2: PublicKey,\n  pool: PublicKey,\n  votingMint: PublicKey,\n  votingMintAuthority: PublicKey,\n  stakeProgramId: PublicKey,\n\n  depositEntryIndex: number,\n  amount: BN,\n): TransactionInstruction {\n  const dataLayout = struct([u8(\"depositEntryIndex\"), u64(\"amount\")]);\n\n  const keys = [\n    { pubkey: registrar, isSigner: false, isWritable: false },\n    { pubkey: voter, isSigner: false, isWritable: true },\n    { pubkey: voterVault, isSigner: false, isWritable: true },\n    { pubkey: depositToken, isSigner: false, isWritable: true },\n    { pubkey: depositAuthority, isSigner: false, isWritable: false },\n    { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },\n\n    { pubkey: userStakerInfoV2, isSigner: false, isWritable: true },\n    { pubkey: pool, isSigner: false, isWritable: false },\n    { pubkey: votingMint, isSigner: false, isWritable: true },\n\n    { pubkey: votingMintAuthority, isSigner: false, isWritable: false },\n    { pubkey: stakeProgramId, isSigner: false, isWritable: false },\n    { pubkey: INSTRUCTION_PROGRAM_ID, isSigner: false, isWritable: false },\n  ];\n\n  const data = Buffer.alloc(dataLayout.span);\n  dataLayout.encode(\n    {\n      depositEntryIndex,\n      amount,\n    },\n    data,\n  );\n  const aData = Buffer.from([...anchorDataBuf.voterStakeRegistryDeposit, ...data]);\n\n  return new TransactionInstruction({\n    keys,\n    programId,\n    data: aData,\n  });\n}\n\nexport function voterStakeRegistryUpdateVoterWeightRecord(\n  programId: PublicKey,\n  registrar: PublicKey,\n  voter: PublicKey,\n  voterWeightRecord: PublicKey,\n): TransactionInstruction {\n  const dataLayout = struct([]);\n\n  const keys = [\n    { pubkey: registrar, isSigner: false, isWritable: false },\n    { pubkey: voter, isSigner: false, isWritable: false },\n    { pubkey: voterWeightRecord, isSigner: false, isWritable: true },\n    { pubkey: SystemProgram.programId, isSigner: false, isWritable: false },\n  ];\n\n  const data = Buffer.alloc(dataLayout.span);\n  dataLayout.encode({}, data);\n  const aData = Buffer.from([...anchorDataBuf.voterStakeRegistryUpdateVoterWeightRecord, ...data]);\n\n  return new TransactionInstruction({\n    keys,\n    programId,\n    data: aData,\n  });\n}\n\nexport function voterStakeRegistryWithdraw(\n  programId: PublicKey,\n  registrar: PublicKey,\n  voter: PublicKey,\n  voterAuthority: PublicKey,\n  tokenOwnerRecord: PublicKey,\n  voterWeightRecord: PublicKey,\n  vault: PublicKey,\n  destination: PublicKey,\n\n  userStakerInfoV2: PublicKey,\n  pool: PublicKey,\n  votingMint: PublicKey,\n  votingMintAuthority: PublicKey,\n  stakeProgramId: PublicKey,\n\n  depositEntryIndex: number,\n  amount: BN,\n): TransactionInstruction {\n  const dataLayout = struct([u8(\"depositEntryIndex\"), u64(\"amount\")]);\n\n  const keys = [\n    { pubkey: registrar, isSigner: false, isWritable: false },\n    { pubkey: voter, isSigner: false, isWritable: true },\n    { pubkey: voterAuthority, isSigner: true, isWritable: false },\n    { pubkey: tokenOwnerRecord, isSigner: false, isWritable: false },\n\n    { pubkey: voterWeightRecord, isSigner: false, isWritable: true },\n    { pubkey: vault, isSigner: false, isWritable: true },\n    { pubkey: destination, isSigner: false, isWritable: true },\n    { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },\n\n    { pubkey: userStakerInfoV2, isSigner: false, isWritable: true },\n    { pubkey: pool, isSigner: false, isWritable: false },\n    { pubkey: votingMint, isSigner: false, isWritable: true },\n\n    { pubkey: votingMintAuthority, isSigner: false, isWritable: false },\n    { pubkey: stakeProgramId, isSigner: false, isWritable: false },\n    { pubkey: INSTRUCTION_PROGRAM_ID, isSigner: false, isWritable: false },\n  ];\n\n  const data = Buffer.alloc(dataLayout.span);\n  dataLayout.encode(\n    {\n      depositEntryIndex,\n      amount,\n    },\n    data,\n  );\n  const aData = Buffer.from([...anchorDataBuf.voterStakeRegistryWithdraw, ...data]);\n\n  return new TransactionInstruction({\n    keys,\n    programId,\n    data: aData,\n  });\n}\n\nexport function governanceCreateTokenOwnerRecord(\n  programId: PublicKey,\n  realm: PublicKey,\n  governingTokenOwner: PublicKey,\n  governingTokenMint: PublicKey,\n  payer: PublicKey,\n  tokenOwnerRecordAddress: PublicKey,\n): TransactionInstruction {\n  const dataLayout = struct([u8(\"ins\")]);\n\n  const keys = [\n    { pubkey: realm, isSigner: false, isWritable: false },\n    { pubkey: governingTokenOwner, isSigner: false, isWritable: false },\n\n    { pubkey: tokenOwnerRecordAddress, isSigner: false, isWritable: true },\n\n    { pubkey: governingTokenMint, isSigner: false, isWritable: false },\n\n    { pubkey: payer, isSigner: true, isWritable: true },\n\n    { pubkey: SystemProgram.programId, isSigner: false, isWritable: false },\n  ];\n\n  const data = Buffer.alloc(dataLayout.span);\n  dataLayout.encode({ ins: 23 }, data);\n\n  return new TransactionInstruction({\n    keys,\n    programId,\n    data,\n  });\n}\n\nexport function voterStakeRegistryCreateVoter(\n  programId: PublicKey,\n  registrar: PublicKey,\n  voter: PublicKey,\n  voterWeightRecord: PublicKey,\n  voterAuthority: PublicKey,\n  payer: PublicKey,\n\n  voterBump: number,\n  voterWeightRecordBump: number,\n): TransactionInstruction {\n  const dataLayout = struct([u8(\"voterBump\"), u8(\"voterWeightRecordBump\")]);\n\n  const keys = [\n    { pubkey: registrar, isSigner: false, isWritable: false },\n    { pubkey: voter, isSigner: false, isWritable: true },\n    { pubkey: voterAuthority, isSigner: true, isWritable: false },\n    { pubkey: voterWeightRecord, isSigner: false, isWritable: true },\n    { pubkey: payer, isSigner: true, isWritable: true },\n    { pubkey: SystemProgram.programId, isSigner: false, isWritable: false },\n    { pubkey: RENT_PROGRAM_ID, isSigner: false, isWritable: false },\n    { pubkey: INSTRUCTION_PROGRAM_ID, isSigner: false, isWritable: false },\n  ];\n\n  const data = Buffer.alloc(dataLayout.span);\n  dataLayout.encode({ voterBump, voterWeightRecordBump }, data);\n  const aData = Buffer.from([...anchorDataBuf.voterStakeRegistryCreateVoter, ...data]);\n\n  return new TransactionInstruction({\n    keys,\n    programId,\n    data: aData,\n  });\n}\n\nexport function voterStakeRegistryCreateDepositEntry(\n  programId: PublicKey,\n  registrar: PublicKey,\n  voter: PublicKey,\n  voterVault: PublicKey,\n  voterAuthority: PublicKey,\n  payer: PublicKey,\n  depositMint: PublicKey,\n\n  depositEntryIndex: number,\n  kind: number,\n  startTs: BN | undefined,\n  periods: number,\n  allowClawback: boolean,\n): TransactionInstruction {\n  const dataLayout = struct([\n    u8(\"depositEntryIndex\"),\n    u8(\"kind\"),\n    u8(\"option\"),\n    u64(\"startTs\"),\n    u32(\"periods\"),\n    bool(\"allowClawback\"),\n  ]);\n\n  const keys = [\n    { pubkey: registrar, isSigner: false, isWritable: false },\n    { pubkey: voter, isSigner: false, isWritable: true },\n    { pubkey: voterVault, isSigner: false, isWritable: true },\n    { pubkey: voterAuthority, isSigner: true, isWritable: false },\n    { pubkey: payer, isSigner: true, isWritable: true },\n    { pubkey: depositMint, isSigner: false, isWritable: false },\n    { pubkey: SystemProgram.programId, isSigner: false, isWritable: false },\n    { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },\n    { pubkey: ASSOCIATED_TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },\n    { pubkey: RENT_PROGRAM_ID, isSigner: false, isWritable: false },\n  ];\n\n  const data = Buffer.alloc(dataLayout.span);\n  dataLayout.encode(\n    {\n      depositEntryIndex,\n      kind,\n      option: startTs === undefined ? 0 : 1,\n      startTs: startTs!,\n      periods,\n      allowClawback,\n    },\n    data,\n  );\n  const aData = Buffer.from([...anchorDataBuf.voterStakeRegistryCreateDepositEntry, ...data]);\n\n  return new TransactionInstruction({\n    keys,\n    programId,\n    data: aData,\n  });\n}\n\nexport async function makeDepositTokenInstruction({\n  connection,\n  programId,\n  governanceProgramId,\n  voteWeightAddinProgramId,\n  realm,\n  communityTokenMint,\n  owner,\n  poolId,\n  tokenProgram,\n}: {\n  connection: Connection;\n  programId: PublicKey;\n  governanceProgramId: PublicKey;\n  voteWeightAddinProgramId: PublicKey;\n  realm: PublicKey;\n  communityTokenMint: PublicKey;\n  owner: PublicKey;\n  poolId: PublicKey;\n  tokenProgram?: PublicKey;\n}): Promise<TransactionInstruction[]> {\n  const registrar = getRegistrarAddress(voteWeightAddinProgramId, realm, communityTokenMint).publicKey;\n  const ownerPda = getAssociatedLedgerAccount({ programId, poolId, owner, version: 3 });\n  const ownerAccountInfo = await connection.getAccountInfo(ownerPda);\n  if (ownerAccountInfo === null) {\n    throw Error(\"user is not staker\");\n  }\n  const ownerInfo = farmLedgerLayoutV3_2.decode(ownerAccountInfo.data);\n  const mintAmount = ownerInfo.deposited.sub(ownerInfo.voteLockedBalance);\n  console.log(\"amount\", mintAmount.toString());\n  if (mintAmount.eq(new BN(0))) {\n    throw Error(\"user do not has new stake amount\");\n  }\n\n  const votingMint = getVotingTokenMint(programId, poolId).publicKey;\n  const votingMintAuthority = getVotingMintAuthority(programId, poolId).publicKey;\n  const { publicKey: voter, nonce: voterBump } = getVoterAddress(voteWeightAddinProgramId, registrar, owner);\n  const voterVault = getATAAddress(voter, votingMint, tokenProgram).publicKey;\n\n  const { publicKey: voterWeightRecord, nonce: voterWeightRecordBump } = getVoterWeightRecordAddress(\n    voteWeightAddinProgramId,\n    registrar,\n    owner,\n  );\n\n  const tokenOwnerRecordAddress = getTokenOwnerRecordAddress(\n    governanceProgramId,\n    realm,\n    communityTokenMint,\n    owner,\n  ).publicKey;\n\n  const instructions: TransactionInstruction[] = [];\n\n  const depositToken = getATAAddress(owner, votingMint, tokenProgram).publicKey;\n  const depositTokenAccountInfo = await connection.getAccountInfo(depositToken);\n  if (depositTokenAccountInfo === null) {\n    instructions.push(createAssociatedTokenAccountInstruction(owner, depositToken, owner, votingMint));\n  }\n  const voterAccountInfo = await connection.getAccountInfo(voter);\n  if (voterAccountInfo === null) {\n    const createTokenOwnerRecodeIns = governanceCreateTokenOwnerRecord(\n      governanceProgramId,\n      realm,\n      owner,\n      communityTokenMint,\n      owner,\n      tokenOwnerRecordAddress,\n    );\n\n    instructions.push(\n      createTokenOwnerRecodeIns,\n      voterStakeRegistryCreateVoter(\n        voteWeightAddinProgramId,\n        registrar,\n        voter,\n        voterWeightRecord,\n        owner,\n        owner,\n        voterBump,\n        voterWeightRecordBump,\n      ),\n    );\n  }\n\n  const { index: depositEntryIndex, isInit: depositEntryInit } = await getDepositEntryIndex(\n    connection,\n    registrar,\n    voter,\n    votingMint,\n  );\n  if (!depositEntryInit) {\n    instructions.push(\n      voterStakeRegistryCreateDepositEntry(\n        voteWeightAddinProgramId,\n        registrar,\n        voter,\n        voterVault,\n        owner,\n        owner,\n        votingMint,\n\n        depositEntryIndex,\n        0,\n        undefined,\n        0,\n        false,\n      ),\n    );\n  }\n\n  instructions.push(\n    voterStakeRegistryDeposit(\n      voteWeightAddinProgramId,\n      registrar,\n      voter,\n      voterVault,\n      depositToken,\n      owner,\n\n      ownerPda,\n      poolId,\n      votingMint,\n      votingMintAuthority,\n      programId,\n\n      depositEntryIndex,\n      mintAmount,\n    ),\n    voterStakeRegistryUpdateVoterWeightRecord(voteWeightAddinProgramId, registrar, voter, voterWeightRecord),\n  );\n\n  return instructions;\n}\n\nexport async function makeWithdrawTokenInstruction({\n  connection,\n  programId,\n  governanceProgramId,\n  voteWeightAddinProgramId,\n  realm,\n  communityTokenMint,\n  owner,\n  poolId,\n  tokenProgram,\n}: {\n  connection: Connection;\n  programId: PublicKey;\n\n  governanceProgramId: PublicKey;\n  voteWeightAddinProgramId: PublicKey;\n  realm: PublicKey;\n  communityTokenMint: PublicKey;\n  owner: PublicKey;\n  poolId: PublicKey;\n  tokenProgram?: PublicKey;\n}): Promise<TransactionInstruction[]> {\n  const registrar = getRegistrarAddress(voteWeightAddinProgramId, realm, communityTokenMint).publicKey;\n  const ownerPda = getAssociatedLedgerAccount({ programId, poolId, owner, version: 3 });\n  const ownerAccountInfo = await connection.getAccountInfo(ownerPda);\n  if (ownerAccountInfo === null) {\n    throw Error(\"user is not staker\");\n  }\n  const ownerInfo = farmLedgerLayoutV3_2.decode(ownerAccountInfo.data);\n  if (ownerInfo.voteLockedBalance.eq(new BN(0))) {\n    throw Error(\"user has vote locked balance = 0\");\n  }\n\n  const votingMint = getVotingTokenMint(programId, poolId).publicKey;\n  const votingMintAuthority = getVotingMintAuthority(programId, poolId).publicKey;\n  const { publicKey: voter } = getVoterAddress(voteWeightAddinProgramId, registrar, owner);\n  const voterVault = getATAAddress(voter, votingMint, tokenProgram).publicKey;\n  const { publicKey: voterWeightRecord } = getVoterWeightRecordAddress(voteWeightAddinProgramId, registrar, owner);\n\n  const tokenOwnerRecordAddress = getTokenOwnerRecordAddress(\n    governanceProgramId,\n    realm,\n    communityTokenMint,\n    owner,\n  ).publicKey;\n\n  const instructions: TransactionInstruction[] = [];\n\n  const { index: depositEntryIndex, isInit: depositEntryInit } = await getDepositEntryIndex(\n    connection,\n    registrar,\n    voter,\n    votingMint,\n  );\n  if (!depositEntryInit) throw Error(\"deposit entry index check error\");\n\n  instructions.push(\n    voterStakeRegistryWithdraw(\n      voteWeightAddinProgramId,\n      registrar,\n      voter,\n      owner,\n      tokenOwnerRecordAddress,\n      voterWeightRecord,\n      voterVault,\n      getATAAddress(owner, votingMint, tokenProgram).publicKey,\n      ownerPda,\n      poolId,\n      votingMint,\n      votingMintAuthority,\n      programId,\n\n      depositEntryIndex,\n      ownerInfo.voteLockedBalance,\n    ),\n  );\n\n  return instructions;\n}\n\nexport function makeRestartRewardInstruction({\n  payer,\n  rewardVault,\n  userRewardTokenPub,\n  farmKeys,\n  rewardInfo,\n}: {\n  payer: PublicKey;\n  rewardVault: PublicKey;\n  userRewardTokenPub: PublicKey;\n  farmKeys: {\n    id: PublicKey;\n    programId: PublicKey;\n    lpVault: PublicKey;\n  };\n  rewardInfo: {\n    openTime: number;\n    endTime: number;\n    perSecond: string;\n  };\n}): TransactionInstruction {\n  const data = Buffer.alloc(farmRewardRestartLayout.span);\n  farmRewardRestartLayout.encode(\n    {\n      instruction: 3,\n      rewardReopenTime: parseBigNumberish(rewardInfo.openTime),\n      rewardEndTime: parseBigNumberish(rewardInfo.endTime),\n      rewardPerSecond: parseBigNumberish(rewardInfo.perSecond),\n    },\n    data,\n  );\n\n  const keys = [\n    accountMeta({ pubkey: TOKEN_PROGRAM_ID, isWritable: false }),\n    accountMeta({ pubkey: farmKeys.id }),\n    accountMeta({ pubkey: farmKeys.lpVault, isWritable: false }),\n    accountMeta({ pubkey: rewardVault }),\n    accountMeta({ pubkey: userRewardTokenPub! }),\n    accountMeta({ pubkey: payer, isWritable: false, isSigner: true }),\n  ];\n\n  return new TransactionInstruction({ programId: farmKeys.programId, keys, data });\n}\n\nexport function makeAddNewRewardInstruction({\n  payer,\n  userRewardTokenPub,\n  farmKeys,\n  rewardVault,\n  rewardInfo,\n}: {\n  payer: PublicKey;\n  userRewardTokenPub: PublicKey;\n  rewardVault: PublicKey;\n  farmKeys: {\n    id: PublicKey;\n    programId: PublicKey;\n    authority: PublicKey;\n  };\n  rewardInfo: {\n    mint: PublicKey;\n    openTime: number;\n    endTime: number;\n    perSecond: string;\n    rewardType: RewardType;\n  };\n}): TransactionInstruction {\n  const data = Buffer.alloc(farmAddRewardLayout.span);\n  farmAddRewardLayout.encode(\n    {\n      instruction: 4,\n      isSet: new BN(1),\n      rewardPerSecond: parseBigNumberish(rewardInfo.perSecond),\n      rewardOpenTime: parseBigNumberish(rewardInfo.openTime),\n      rewardEndTime: parseBigNumberish(rewardInfo.endTime),\n      rewardType: parseBigNumberish(poolTypeV6[rewardInfo.rewardType]),\n    },\n    data,\n  );\n\n  const keys = [\n    ...commonSystemAccountMeta,\n    accountMeta({ pubkey: farmKeys.id }),\n    accountMeta({ pubkey: farmKeys.authority, isWritable: false }),\n    accountMeta({ pubkey: rewardInfo.mint, isWritable: false }),\n    accountMeta({ pubkey: rewardVault }),\n    accountMeta({ pubkey: userRewardTokenPub! }),\n    accountMeta({ pubkey: payer, isWritable: false, isSigner: true }),\n  ];\n\n  return new TransactionInstruction({ programId: farmKeys.programId, keys, data });\n}\n\nexport function makeDepositWithdrawInstruction(params: {\n  instruction: number;\n  amount: BN;\n  farmInfo: { id: string; programId: string };\n  farmKeys: FormatFarmKeyOut;\n  lpAccount: PublicKey;\n  owner: PublicKey;\n  rewardAccounts: PublicKey[];\n  deposit?: boolean;\n  version: 3 | 5 | 6;\n}): TransactionInstruction {\n  const { farmInfo, farmKeys, version, lpAccount, rewardAccounts, owner, instruction, amount, deposit } = params;\n\n  const [programId, id] = [new PublicKey(farmInfo.programId), new PublicKey(farmInfo.id)];\n\n  const ledgerAddress = getAssociatedLedgerAccount({\n    programId,\n    poolId: id,\n    owner,\n    version,\n  });\n\n  const data = Buffer.alloc(dwLayout.span);\n  dwLayout.encode(\n    {\n      instruction,\n      amount,\n    },\n    data,\n  );\n\n  const keys =\n    version === 6\n      ? [\n          accountMeta({ pubkey: TOKEN_PROGRAM_ID, isWritable: false }),\n          ...(deposit ? [accountMeta({ pubkey: SystemProgram.programId, isWritable: false })] : []),\n          accountMeta({ pubkey: id }),\n          accountMeta({ pubkey: new PublicKey(farmKeys.authority), isWritable: false }),\n          accountMeta({ pubkey: new PublicKey(farmKeys.lpVault) }),\n          accountMeta({ pubkey: ledgerAddress }),\n          accountMeta({ pubkey: owner, isWritable: false, isSigner: true }),\n          accountMeta({ pubkey: lpAccount }),\n        ]\n      : [\n          accountMeta({ pubkey: id }),\n          accountMeta({ pubkey: new PublicKey(farmKeys.authority), isWritable: false }),\n          accountMeta({ pubkey: ledgerAddress }),\n          accountMeta({ pubkey: owner, isWritable: false, isSigner: true }),\n          accountMeta({ pubkey: lpAccount }),\n          accountMeta({ pubkey: new PublicKey(farmKeys.lpVault) }),\n          accountMeta({ pubkey: rewardAccounts[0] }),\n          accountMeta({ pubkey: new PublicKey(farmKeys.rewardInfos[0].vault) }),\n          // system\n          accountMeta({ pubkey: SYSVAR_CLOCK_PUBKEY, isWritable: false }),\n          accountMeta({ pubkey: TOKEN_PROGRAM_ID, isWritable: false }),\n        ];\n\n  if (version === 5) {\n    for (let index = 1; index < farmKeys.rewardInfos.length; index++) {\n      keys.push(accountMeta({ pubkey: rewardAccounts[index] }));\n      keys.push(accountMeta({ pubkey: new PublicKey(farmKeys.rewardInfos[index].vault) }));\n    }\n  }\n\n  if (version === 6) {\n    for (let index = 0; index < farmKeys.rewardInfos.length; index++) {\n      keys.push(accountMeta({ pubkey: new PublicKey(farmKeys.rewardInfos[index].vault) }));\n      keys.push(accountMeta({ pubkey: rewardAccounts[index] }));\n    }\n  }\n\n  return new TransactionInstruction({ programId, keys, data });\n}\n\ninterface DepositWithdrawParams {\n  amount: BN;\n  farmInfo: { id: string; programId: string };\n  farmKeys: FormatFarmKeyOut;\n  lpAccount: PublicKey;\n  owner: PublicKey;\n  rewardAccounts: PublicKey[];\n  userAuxiliaryLedgers?: PublicKey[];\n}\n\nexport function makeWithdrawInstructionV6(params: DepositWithdrawParams): TransactionInstruction {\n  const { farmInfo, farmKeys, lpAccount, rewardAccounts, owner, amount } = params;\n  const [programId, id] = [new PublicKey(farmInfo.programId), new PublicKey(farmInfo.id)];\n\n  const ledgerAddress = getAssociatedLedgerAccount({\n    programId,\n    poolId: id,\n    owner,\n    version: 6,\n  });\n\n  const data = Buffer.alloc(dwLayout.span);\n  dwLayout.encode(\n    {\n      instruction: 2,\n      amount: parseBigNumberish(amount),\n    },\n    data,\n  );\n\n  const keys = [\n    accountMeta({ pubkey: TOKEN_PROGRAM_ID, isWritable: false }),\n\n    accountMeta({ pubkey: id }),\n\n    accountMeta({ pubkey: new PublicKey(farmKeys.authority), isWritable: false }),\n    accountMeta({ pubkey: new PublicKey(farmKeys.lpVault) }),\n    accountMeta({ pubkey: ledgerAddress }),\n    accountMeta({ pubkey: owner, isWritable: false, isSigner: true }),\n    accountMeta({ pubkey: lpAccount }),\n  ];\n\n  for (let index = 0; index < farmKeys.rewardInfos.length; index++) {\n    keys.push(accountMeta({ pubkey: new PublicKey(farmKeys.rewardInfos[index].vault) }));\n    keys.push(accountMeta({ pubkey: rewardAccounts[index] }));\n  }\n\n  return new TransactionInstruction({ programId, keys, data });\n}\n\nexport function makeWithdrawInstructionV5(params: DepositWithdrawParams): TransactionInstruction {\n  const { farmInfo, farmKeys, lpAccount, rewardAccounts, owner, amount, userAuxiliaryLedgers } = params;\n  const [programId, id] = [new PublicKey(farmInfo.programId), new PublicKey(farmInfo.id)];\n\n  const ledgerAddress = getAssociatedLedgerAccount({\n    programId,\n    poolId: id,\n    owner,\n    version: 5,\n  });\n\n  const data = Buffer.alloc(dwLayout.span);\n  dwLayout.encode(\n    {\n      instruction: 12,\n      amount: parseBigNumberish(amount),\n    },\n    data,\n  );\n\n  const keys = [\n    accountMeta({ pubkey: id }),\n    accountMeta({ pubkey: new PublicKey(farmKeys.authority), isWritable: false }),\n    accountMeta({ pubkey: ledgerAddress }),\n    accountMeta({ pubkey: owner, isWritable: false, isSigner: true }),\n    accountMeta({ pubkey: lpAccount }),\n    accountMeta({ pubkey: new PublicKey(farmKeys.lpVault) }),\n    accountMeta({ pubkey: rewardAccounts[0] }),\n    accountMeta({ pubkey: new PublicKey(farmKeys.rewardInfos[0].vault) }),\n    // system\n    accountMeta({ pubkey: SYSVAR_CLOCK_PUBKEY, isWritable: false }),\n    accountMeta({ pubkey: TOKEN_PROGRAM_ID, isWritable: false }),\n  ];\n\n  for (let index = 1; index < farmKeys.rewardInfos.length; index++) {\n    keys.push(accountMeta({ pubkey: rewardAccounts[index] }));\n    keys.push(accountMeta({ pubkey: new PublicKey(farmKeys.rewardInfos[index].vault) }));\n  }\n\n  if (userAuxiliaryLedgers) {\n    for (const auxiliaryLedger of userAuxiliaryLedgers) {\n      keys.push(accountMeta({ pubkey: auxiliaryLedger }));\n    }\n  }\n\n  return new TransactionInstruction({ programId, keys, data });\n}\n\nexport function makeWithdrawInstructionV3(params: DepositWithdrawParams): TransactionInstruction {\n  const { farmInfo, farmKeys, lpAccount, rewardAccounts, owner, amount, userAuxiliaryLedgers } = params;\n  const [programId, id] = [new PublicKey(farmInfo.programId), new PublicKey(farmInfo.id)];\n\n  const ledgerAddress = getAssociatedLedgerAccount({\n    programId,\n    poolId: id,\n    owner,\n    version: 3,\n  });\n\n  const data = Buffer.alloc(dwLayout.span);\n  dwLayout.encode(\n    {\n      instruction: 11,\n      amount: parseBigNumberish(amount),\n    },\n    data,\n  );\n\n  const keys = [\n    accountMeta({ pubkey: id }),\n    accountMeta({ pubkey: new PublicKey(farmKeys.authority), isWritable: false }),\n    accountMeta({ pubkey: ledgerAddress }),\n    accountMeta({ pubkey: owner, isWritable: false, isSigner: true }),\n    accountMeta({ pubkey: lpAccount }),\n    accountMeta({ pubkey: new PublicKey(farmKeys.lpVault) }),\n    accountMeta({ pubkey: rewardAccounts[0] }),\n    accountMeta({ pubkey: new PublicKey(farmKeys.rewardInfos[0].vault) }),\n    // system\n    accountMeta({ pubkey: SYSVAR_CLOCK_PUBKEY, isWritable: false }),\n    accountMeta({ pubkey: TOKEN_PROGRAM_ID, isWritable: false }),\n  ];\n\n  if (userAuxiliaryLedgers) {\n    for (const auxiliaryLedger of userAuxiliaryLedgers) {\n      keys.push(accountMeta({ pubkey: auxiliaryLedger }));\n    }\n  }\n\n  return new TransactionInstruction({ programId, keys, data });\n}\n\nexport function makeDepositInstructionV3(params: DepositWithdrawParams): TransactionInstruction {\n  const { farmInfo, farmKeys, lpAccount, rewardAccounts, owner, amount, userAuxiliaryLedgers } = params;\n  const [programId, id] = [new PublicKey(farmInfo.programId), new PublicKey(farmInfo.id)];\n\n  const ledgerAddress = getAssociatedLedgerAccount({\n    programId,\n    poolId: id,\n    owner,\n    version: 3,\n  });\n\n  const data = Buffer.alloc(dwLayout.span);\n  dwLayout.encode(\n    {\n      instruction: 10,\n      amount: parseBigNumberish(amount),\n    },\n    data,\n  );\n\n  const keys = [\n    accountMeta({ pubkey: id }),\n    accountMeta({ pubkey: new PublicKey(farmKeys.authority), isWritable: false }),\n    accountMeta({ pubkey: ledgerAddress }),\n    accountMeta({ pubkey: owner, isWritable: false, isSigner: true }),\n    accountMeta({ pubkey: lpAccount }),\n    accountMeta({ pubkey: new PublicKey(farmKeys.lpVault) }),\n    accountMeta({ pubkey: rewardAccounts[0] }),\n    accountMeta({ pubkey: new PublicKey(farmKeys.rewardInfos[0].vault) }),\n    // system\n    accountMeta({ pubkey: SYSVAR_CLOCK_PUBKEY, isWritable: false }),\n    accountMeta({ pubkey: TOKEN_PROGRAM_ID, isWritable: false }),\n  ];\n\n  if (userAuxiliaryLedgers) {\n    for (const auxiliaryLedger of userAuxiliaryLedgers) {\n      keys.push(accountMeta({ pubkey: auxiliaryLedger }));\n    }\n  }\n\n  return new TransactionInstruction({ programId, keys, data });\n}\n\nexport function makeDepositInstructionV5(params: DepositWithdrawParams): TransactionInstruction {\n  const { farmInfo, farmKeys, lpAccount, rewardAccounts, owner, amount, userAuxiliaryLedgers } = params;\n  const [programId, id] = [new PublicKey(farmInfo.programId), new PublicKey(farmInfo.id)];\n\n  const ledgerAddress = getAssociatedLedgerAccount({\n    programId,\n    poolId: id,\n    owner,\n    version: 5,\n  });\n\n  const data = Buffer.alloc(dwLayout.span);\n  dwLayout.encode(\n    {\n      instruction: 11,\n      amount: parseBigNumberish(amount),\n    },\n    data,\n  );\n\n  const keys = [\n    accountMeta({ pubkey: id }),\n    accountMeta({ pubkey: new PublicKey(farmKeys.authority), isWritable: false }),\n    accountMeta({ pubkey: ledgerAddress }),\n    accountMeta({ pubkey: owner, isWritable: false, isSigner: true }),\n    accountMeta({ pubkey: lpAccount }),\n    accountMeta({ pubkey: new PublicKey(farmKeys.lpVault) }),\n    accountMeta({ pubkey: rewardAccounts[0] }),\n    accountMeta({ pubkey: new PublicKey(farmKeys.rewardInfos[0].vault) }),\n    // system\n    accountMeta({ pubkey: SYSVAR_CLOCK_PUBKEY, isWritable: false }),\n    accountMeta({ pubkey: TOKEN_PROGRAM_ID, isWritable: false }),\n  ];\n\n  for (let index = 1; index < farmKeys.rewardInfos.length; index++) {\n    keys.push(accountMeta({ pubkey: rewardAccounts[index] }));\n    keys.push(accountMeta({ pubkey: new PublicKey(farmKeys.rewardInfos[index].vault) }));\n  }\n\n  if (userAuxiliaryLedgers) {\n    for (const auxiliaryLedger of userAuxiliaryLedgers) {\n      keys.push(accountMeta({ pubkey: auxiliaryLedger }));\n    }\n  }\n\n  return new TransactionInstruction({ programId, keys, data });\n}\n\nexport function makeDepositInstructionV6(params: DepositWithdrawParams): TransactionInstruction {\n  const { farmInfo, farmKeys, lpAccount, rewardAccounts, owner, amount } = params;\n  const [programId, id] = [new PublicKey(farmInfo.programId), new PublicKey(farmInfo.id)];\n\n  const ledgerAddress = getAssociatedLedgerAccount({\n    programId,\n    poolId: id,\n    owner,\n    version: 6,\n  });\n\n  const data = Buffer.alloc(dwLayout.span);\n  dwLayout.encode(\n    {\n      instruction: 1,\n      amount: parseBigNumberish(amount),\n    },\n    data,\n  );\n\n  const keys = [\n    accountMeta({ pubkey: TOKEN_PROGRAM_ID, isWritable: false }),\n    accountMeta({ pubkey: SystemProgram.programId, isWritable: false }),\n    accountMeta({ pubkey: id }),\n    accountMeta({ pubkey: new PublicKey(farmKeys.authority), isWritable: false }),\n    accountMeta({ pubkey: new PublicKey(farmKeys.lpVault) }),\n    accountMeta({ pubkey: ledgerAddress }),\n    accountMeta({ pubkey: owner, isWritable: false, isSigner: true }),\n    accountMeta({ pubkey: lpAccount }),\n  ];\n\n  for (let index = 0; index < farmKeys.rewardInfos.length; index++) {\n    keys.push(accountMeta({ pubkey: new PublicKey(farmKeys.rewardInfos[index].vault) }));\n    keys.push(accountMeta({ pubkey: rewardAccounts[index] }));\n  }\n\n  return new TransactionInstruction({ programId, keys, data });\n}\n","import { PublicKey } from \"@solana/web3.js\";\n\nimport { findProgramAddress } from \"@/common/txTool/txUtils\";\n\nexport function getRegistrarAddress(\n  programId: PublicKey,\n  realm: PublicKey,\n  communityTokenMint: PublicKey,\n): {\n  publicKey: PublicKey;\n  nonce: number;\n} {\n  return findProgramAddress(\n    [realm.toBuffer(), Buffer.from(\"registrar\", \"utf8\"), communityTokenMint.toBuffer()],\n    programId,\n  );\n}\n\nexport function getVotingTokenMint(\n  programId: PublicKey,\n  poolId: PublicKey,\n): {\n  publicKey: PublicKey;\n  nonce: number;\n} {\n  return findProgramAddress([poolId.toBuffer(), Buffer.from(\"voting_mint_seed\", \"utf8\")], programId);\n}\n\nexport function getVotingMintAuthority(\n  programId: PublicKey,\n  poolId: PublicKey,\n): {\n  publicKey: PublicKey;\n  nonce: number;\n} {\n  return findProgramAddress([poolId.toBuffer()], programId);\n}\n\nexport function getVoterAddress(\n  programId: PublicKey,\n  registrar: PublicKey,\n  authority: PublicKey,\n): {\n  publicKey: PublicKey;\n  nonce: number;\n} {\n  return findProgramAddress([registrar.toBuffer(), Buffer.from(\"voter\", \"utf8\"), authority.toBuffer()], programId);\n}\n\nexport function getVoterWeightRecordAddress(\n  programId: PublicKey,\n  registrar: PublicKey,\n  authority: PublicKey,\n): {\n  publicKey: PublicKey;\n  nonce: number;\n} {\n  return findProgramAddress(\n    [registrar.toBuffer(), Buffer.from(\"voter-weight-record\", \"utf8\"), authority.toBuffer()],\n    programId,\n  );\n}\n\nexport function getTokenOwnerRecordAddress(\n  programId: PublicKey,\n  realm: PublicKey,\n  governingTokenMint: PublicKey,\n  governingTokenOwner: PublicKey,\n): {\n  publicKey: PublicKey;\n  nonce: number;\n} {\n  return findProgramAddress(\n    [\n      Buffer.from(\"governance\", \"utf8\"),\n      realm.toBuffer(),\n      governingTokenMint.toBuffer(),\n      governingTokenOwner.toBuffer(),\n    ],\n    programId,\n  );\n}\n","import { Connection, PublicKey } from \"@solana/web3.js\";\nimport BN from \"bn.js\";\n\nimport { GetMultipleAccountsInfoConfig, getMultipleAccountsInfoWithCustomFlags } from \"@/common/accountInfo\";\nimport { parseBigNumberish } from \"@/common/bignumber\";\nimport { createLogger } from \"@/common/logger\";\nimport { findProgramAddress, ProgramAddress } from \"@/common/txTool/txUtils\";\nimport { DateParam, isDateAfter, isDateBefore } from \"@/common/date\";\nimport { jsonInfo2PoolKeys } from \"@/common/utility\";\nimport { RewardInfoV6 } from \"@/api/type\";\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 { VoterRegistrar, Voter } 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 { PublicKey } from \"@solana/web3.js\";\nimport { AccountLayout, NATIVE_MINT, TOKEN_PROGRAM_ID } from \"@solana/spl-token\";\nimport {\n  ApiV3PoolInfoConcentratedItem,\n  ApiV3PoolInfoStandardItem,\n  AmmV4Keys,\n  AmmV5Keys,\n  FormatFarmInfoOutV6,\n} from \"@/api/type\";\nimport { Token, TokenAmount, Percent } from \"@/module\";\nimport { toToken } from \"../token\";\nimport { BN_ZERO, divCeil } from \"@/common/bignumber\";\nimport { getATAAddress } from \"@/common/pda\";\nimport { InstructionType, TxVersion } from \"@/common/txTool/txType\";\nimport { MakeMultiTxData, MakeTxData } from \"@/common/txTool/txTool\";\nimport { BNDivCeil } from \"@/common/transfer\";\nimport { getMultipleAccountsInfoWithCustomFlags } from \"@/common/accountInfo\";\nimport ModuleBase, { ModuleBaseProps } from \"../moduleBase\";\nimport {\n  AmountSide,\n  AddLiquidityParams,\n  RemoveParams,\n  CreatePoolParam,\n  CreatePoolAddress,\n  ComputeAmountOutParam,\n  SwapParam,\n  AmmRpcData,\n} from \"./type\";\nimport {\n  makeAddLiquidityInstruction,\n  removeLiquidityInstruction,\n  createPoolV4InstructionV2,\n  makeAMMSwapInstruction,\n} from \"./instruction\";\nimport { ComputeBudgetConfig } from \"../type\";\nimport { ClmmInstrument } from \"../clmm/instrument\";\nimport { getAssociatedPoolKeys, getAssociatedConfigId, toAmmComputePoolInfo } from \"./utils\";\nimport { createPoolFeeLayout, liquidityStateV4Layout } from \"./layout\";\nimport {\n  FARM_PROGRAM_TO_VERSION,\n  FarmLedger,\n  makeWithdrawInstructionV3,\n  makeWithdrawInstructionV5,\n  makeWithdrawInstructionV6,\n  createAssociatedLedgerAccountInstruction,\n  getAssociatedLedgerAccount,\n  getFarmLedgerLayout,\n} from \"@/raydium/farm\";\nimport { StableLayout, getStablePrice, getDyByDxBaseIn, getDxByDyBaseIn } from \"./stable\";\nimport { LIQUIDITY_FEES_NUMERATOR, LIQUIDITY_FEES_DENOMINATOR } from \"./constant\";\n\nimport BN from \"bn.js\";\nimport Decimal from \"decimal.js\";\nimport { WSOLMint } from \"@/common\";\n\nexport default class LiquidityModule extends ModuleBase {\n  public stableLayout: StableLayout;\n\n  constructor(params: ModuleBaseProps) {\n    super(params);\n    this.stableLayout = new StableLayout({ connection: this.scope.connection });\n  }\n\n  public async initLayout(): Promise<void> {\n    await this.stableLayout.initStableModelLayout();\n  }\n\n  public async load(): Promise<void> {\n    this.checkDisabled();\n  }\n\n  public computePairAmount({\n    poolInfo,\n    amount,\n    // anotherToken,\n    slippage,\n    baseIn,\n  }: {\n    poolInfo: ApiV3PoolInfoStandardItem;\n    amount: string | Decimal;\n    slippage: Percent;\n    baseIn?: boolean;\n  }): { anotherAmount: TokenAmount; maxAnotherAmount: TokenAmount; liquidity: BN } {\n    const inputAmount = new BN(new Decimal(amount).mul(10 ** poolInfo[baseIn ? \"mintA\" : \"mintB\"].decimals).toFixed(0));\n    const _anotherToken = toToken(poolInfo[baseIn ? \"mintB\" : \"mintA\"]);\n\n    const [baseReserve, quoteReserve] = [\n      new BN(new Decimal(poolInfo.mintAmountA).mul(10 ** poolInfo.mintA.decimals).toString()),\n      new BN(new Decimal(poolInfo.mintAmountB).mul(10 ** poolInfo.mintB.decimals).toString()),\n    ];\n    const lpAmount = new BN(\n      new Decimal(poolInfo.lpAmount).mul(10 ** poolInfo.lpMint.decimals).toFixed(0, Decimal.ROUND_DOWN),\n    );\n    this.logDebug(\"baseReserve:\", baseReserve.toString(), \"quoteReserve:\", quoteReserve.toString());\n\n    this.logDebug(\n      \"tokenIn:\",\n      baseIn ? poolInfo.mintA.symbol : poolInfo.mintB.symbol,\n      \"amountIn:\",\n      inputAmount.toString(),\n      \"anotherToken:\",\n      baseIn ? poolInfo.mintB.symbol : poolInfo.mintA.symbol,\n      \"slippage:\",\n      `${slippage.toSignificant()}%`,\n      \"baseReserve\",\n      baseReserve.toString(),\n      \"quoteReserve\",\n      quoteReserve.toString(),\n    );\n\n    // input is fixed\n    const input = baseIn ? \"base\" : \"quote\";\n    this.logDebug(\"input side:\", input);\n\n    // round up\n    let amountRaw = BN_ZERO;\n    if (!inputAmount.isZero()) {\n      amountRaw =\n        input === \"base\"\n          ? divCeil(inputAmount.mul(quoteReserve), baseReserve)\n          : divCeil(inputAmount.mul(baseReserve), quoteReserve);\n    }\n\n    this.logDebug(\"amountRaw:\", amountRaw.toString(), \"lpAmount:\", lpAmount.toString());\n\n    const liquidity = divCeil(inputAmount.mul(lpAmount), input === \"base\" ? baseReserve : quoteReserve);\n\n    this.logDebug(\"liquidity:\", liquidity.toString());\n\n    const _slippage = new Percent(new BN(1)).add(slippage);\n    const slippageAdjustedAmount = _slippage.mul(amountRaw).quotient;\n\n    const _anotherAmount = new TokenAmount(_anotherToken, amountRaw);\n    const _maxAnotherAmount = new TokenAmount(_anotherToken, slippageAdjustedAmount);\n    this.logDebug(\"anotherAmount:\", _anotherAmount.toFixed(), \"maxAnotherAmount:\", _maxAnotherAmount.toFixed());\n\n    return {\n      anotherAmount: _anotherAmount,\n      maxAnotherAmount: _maxAnotherAmount,\n      liquidity,\n    };\n  }\n\n  public async getAmmPoolKeys(poolId: string): Promise<AmmV4Keys | AmmV5Keys> {\n    return ((await this.scope.api.fetchPoolKeysById({ idList: [poolId] })) as (AmmV4Keys | AmmV5Keys)[])[0];\n  }\n\n  public async addLiquidity<T extends TxVersion>(params: AddLiquidityParams<T>): Promise<MakeTxData<T>> {\n    const {\n      poolInfo,\n      poolKeys: propPoolKeys,\n      amountInA,\n      amountInB,\n      fixedSide,\n      config,\n      txVersion,\n      computeBudgetConfig,\n    } = params;\n\n    if (this.scope.availability.addStandardPosition === false)\n      this.logAndCreateError(\"add liquidity feature disabled in your region\");\n\n    this.logDebug(\"amountInA:\", amountInA, \"amountInB:\", amountInB);\n    if (amountInA.isZero() || amountInB.isZero())\n      this.logAndCreateError(\"amounts must greater than zero\", \"amountInA & amountInB\", {\n        amountInA: amountInA.toFixed(),\n        amountInB: amountInB.toFixed(),\n      });\n    const { account } = this.scope;\n    const { bypassAssociatedCheck, checkCreateATAOwner } = {\n      // default\n      ...{ bypassAssociatedCheck: false, checkCreateATAOwner: false },\n      // custom\n      ...config,\n    };\n    const [tokenA, tokenB] = [amountInA.token, amountInB.token];\n    const tokenAccountA = await account.getCreatedTokenAccount({\n      mint: tokenA.mint,\n      associatedOnly: false,\n    });\n    const tokenAccountB = await account.getCreatedTokenAccount({\n      mint: tokenB.mint,\n      associatedOnly: false,\n    });\n    if (!tokenAccountA && !tokenAccountB)\n      this.logAndCreateError(\"cannot found target token accounts\", \"tokenAccounts\", account.tokenAccounts);\n\n    const lpTokenAccount = await account.getCreatedTokenAccount({\n      mint: new PublicKey(poolInfo.lpMint.address),\n    });\n\n    const tokens = [tokenA, tokenB];\n    const _tokenAccounts = [tokenAccountA, tokenAccountB];\n    const rawAmounts = [amountInA.raw, amountInB.raw];\n\n    // handle amount a & b and direction\n    const sideA = amountInA.token.mint.toBase58() === poolInfo.mintA.address ? \"base\" : \"quote\";\n    let _fixedSide: AmountSide = \"base\";\n    if (![\"quote\", \"base\"].includes(sideA)) this.logAndCreateError(\"invalid fixedSide\", \"fixedSide\", fixedSide);\n    if (sideA === \"quote\") {\n      tokens.reverse();\n      _tokenAccounts.reverse();\n      rawAmounts.reverse();\n      _fixedSide = fixedSide === \"a\" ? \"quote\" : \"base\";\n    } else if (sideA === \"base\") {\n      _fixedSide = fixedSide === \"a\" ? \"base\" : \"quote\";\n    }\n\n    const [baseToken, quoteToken] = tokens;\n    const [baseTokenAccount, quoteTokenAccount] = _tokenAccounts;\n    const [baseAmountRaw, quoteAmountRaw] = rawAmounts;\n\n    const poolKeys = propPoolKeys ?? (await this.getAmmPoolKeys(poolInfo.id));\n\n    const txBuilder = this.createTxBuilder();\n\n    const { tokenAccount: _baseTokenAccount, ...baseInstruction } = await account.handleTokenAccount({\n      side: \"in\",\n      amount: baseAmountRaw,\n      mint: baseToken.mint,\n      tokenAccount: baseTokenAccount,\n      bypassAssociatedCheck,\n      checkCreateATAOwner,\n    });\n    txBuilder.addInstruction(baseInstruction);\n    const { tokenAccount: _quoteTokenAccount, ...quoteInstruction } = await account.handleTokenAccount({\n      side: \"in\",\n      amount: quoteAmountRaw,\n      mint: quoteToken.mint,\n      tokenAccount: quoteTokenAccount,\n      bypassAssociatedCheck,\n      checkCreateATAOwner,\n    });\n    txBuilder.addInstruction(quoteInstruction);\n    const { tokenAccount: _lpTokenAccount, ...lpInstruction } = await account.handleTokenAccount({\n      side: \"out\",\n      amount: 0,\n      mint: new PublicKey(poolInfo.lpMint.address),\n      tokenAccount: lpTokenAccount,\n      bypassAssociatedCheck,\n      checkCreateATAOwner,\n    });\n    txBuilder.addInstruction(lpInstruction);\n    txBuilder.addInstruction({\n      instructions: [\n        makeAddLiquidityInstruction({\n          poolInfo,\n          poolKeys: poolKeys as AmmV4Keys | AmmV5Keys,\n          userKeys: {\n            baseTokenAccount: _baseTokenAccount!,\n            quoteTokenAccount: _quoteTokenAccount!,\n            lpTokenAccount: _lpTokenAccount!,\n            owner: this.scope.ownerPubKey,\n          },\n          baseAmountIn: baseAmountRaw,\n          quoteAmountIn: quoteAmountRaw,\n          fixedSide: _fixedSide,\n        }),\n      ],\n      instructionTypes: [\n        poolInfo.pooltype.includes(\"StablePool\")\n          ? InstructionType.AmmV5AddLiquidity\n          : InstructionType.AmmV4AddLiquidity,\n      ],\n      lookupTableAddress: poolKeys.lookupTableAccount ? [poolKeys.lookupTableAccount] : [],\n    });\n    txBuilder.addCustomComputeBudget(computeBudgetConfig);\n    if (txVersion === TxVersion.V0) (await txBuilder.buildV0()) as MakeTxData<T>;\n    return txBuilder.build() as MakeTxData<T>;\n  }\n\n  public async removeLiquidity<T extends TxVersion>(params: RemoveParams<T>): Promise<Promise<MakeTxData<T>>> {\n    if (this.scope.availability.removeStandardPosition === false)\n      this.logAndCreateError(\"remove liquidity feature disabled in your region\");\n    const { poolInfo, poolKeys: propPoolKeys, amountIn, config, txVersion, computeBudgetConfig } = params;\n    const poolKeys = propPoolKeys ?? (await this.getAmmPoolKeys(poolInfo.id));\n    const [baseMint, quoteMint, lpMint] = [\n      new PublicKey(poolInfo.mintA.address),\n      new PublicKey(poolInfo.mintB.address),\n      new PublicKey(poolInfo.lpMint.address),\n    ];\n    this.logDebug(\"amountIn:\", amountIn);\n    if (amountIn.isZero()) this.logAndCreateError(\"amount must greater than zero\", \"amountIn\", amountIn.toString());\n\n    const { account } = this.scope;\n    const lpTokenAccount = await account.getCreatedTokenAccount({\n      mint: lpMint,\n      associatedOnly: false,\n    });\n    if (!lpTokenAccount) this.logAndCreateError(\"cannot found lpTokenAccount\", \"tokenAccounts\", account.tokenAccounts);\n\n    const baseTokenAccount = await account.getCreatedTokenAccount({\n      mint: baseMint,\n    });\n    const quoteTokenAccount = await account.getCreatedTokenAccount({\n      mint: quoteMint,\n    });\n\n    const txBuilder = this.createTxBuilder();\n    const { bypassAssociatedCheck, checkCreateATAOwner } = {\n      // default\n      ...{ bypassAssociatedCheck: false, checkCreateATAOwner: false },\n      // custom\n      ...config,\n    };\n\n    const { tokenAccount: _baseTokenAccount, ...baseInstruction } = await account.handleTokenAccount({\n      side: \"out\",\n      amount: 0,\n      mint: baseMint,\n      tokenAccount: baseTokenAccount,\n      bypassAssociatedCheck,\n      checkCreateATAOwner,\n    });\n    txBuilder.addInstruction(baseInstruction);\n    const { tokenAccount: _quoteTokenAccount, ...quoteInstruction } = await account.handleTokenAccount({\n      side: \"out\",\n      amount: 0,\n      mint: quoteMint,\n      tokenAccount: quoteTokenAccount,\n      bypassAssociatedCheck,\n      checkCreateATAOwner,\n    });\n    txBuilder.addInstruction(quoteInstruction);\n\n    txBuilder.addInstruction({\n      instructions: [\n        removeLiquidityInstruction({\n          poolInfo,\n          poolKeys,\n          userKeys: {\n            lpTokenAccount: lpTokenAccount!,\n            baseTokenAccount: _baseTokenAccount!,\n            quoteTokenAccount: _quoteTokenAccount!,\n            owner: this.scope.ownerPubKey,\n          },\n          amountIn,\n        }),\n      ],\n      lookupTableAddress: poolKeys.lookupTableAccount ? [poolKeys.lookupTableAccount] : [],\n      instructionTypes: [\n        poolInfo.pooltype.includes(\"StablePool\")\n          ? InstructionType.AmmV5RemoveLiquidity\n          : InstructionType.AmmV4RemoveLiquidity,\n      ],\n    });\n    txBuilder.addCustomComputeBudget(computeBudgetConfig);\n    if (txVersion === TxVersion.V0) return (await txBuilder.buildV0()) as MakeTxData<T>;\n    return txBuilder.build() as MakeTxData<T>;\n  }\n\n  public async removeAllLpAndCreateClmmPosition<T extends TxVersion>({\n    poolInfo,\n    clmmPoolInfo,\n    removeLpAmount,\n    createPositionInfo,\n    farmInfo,\n    userFarmLpAmount,\n    base,\n    computeBudgetConfig,\n    payer,\n    userAuxiliaryLedgers,\n    tokenProgram = TOKEN_PROGRAM_ID,\n    checkCreateATAOwner = true,\n    getEphemeralSigners,\n    txVersion,\n  }: {\n    poolInfo: ApiV3PoolInfoStandardItem;\n    clmmPoolInfo: ApiV3PoolInfoConcentratedItem;\n    removeLpAmount: BN;\n    createPositionInfo: {\n      tickLower: number;\n      tickUpper: number;\n      baseAmount: BN;\n      otherAmountMax: BN;\n    };\n    farmInfo?: FormatFarmInfoOutV6;\n    userFarmLpAmount?: BN;\n    userAuxiliaryLedgers?: PublicKey[];\n    base: \"MintA\" | \"MintB\";\n    payer?: PublicKey;\n    computeBudgetConfig?: ComputeBudgetConfig;\n    tokenProgram?: PublicKey;\n    checkCreateATAOwner?: boolean;\n    txVersion?: T;\n    getEphemeralSigners?: (k: number) => any;\n  }): Promise<MakeMultiTxData<T>> {\n    if (\n      this.scope.availability.removeStandardPosition === false ||\n      this.scope.availability.createConcentratedPosition === false\n    )\n      this.logAndCreateError(\"remove liquidity or create position feature disabled in your region\");\n\n    if (\n      !(poolInfo.mintA.address === clmmPoolInfo.mintA.address || poolInfo.mintA.address === clmmPoolInfo.mintB.address)\n    )\n      throw Error(\"mint check error\");\n    if (\n      !(poolInfo.mintB.address === clmmPoolInfo.mintA.address || poolInfo.mintB.address === clmmPoolInfo.mintB.address)\n    )\n      throw Error(\"mint check error\");\n\n    const txBuilder = this.createTxBuilder();\n    txBuilder.addCustomComputeBudget(computeBudgetConfig);\n    const mintToAccount: { [mint: string]: PublicKey } = {};\n    for (const item of this.scope.account.tokenAccountRawInfos) {\n      if (\n        mintToAccount[item.accountInfo.mint.toString()] === undefined ||\n        getATAAddress(this.scope.ownerPubKey, item.accountInfo.mint, TOKEN_PROGRAM_ID).publicKey.equals(item.pubkey)\n      ) {\n        mintToAccount[item.accountInfo.mint.toString()] = item.pubkey;\n      }\n    }\n\n    const lpTokenAccount = mintToAccount[poolInfo.lpMint.address];\n    if (lpTokenAccount === undefined) throw Error(\"find lp account error in trade accounts\");\n\n    const amountIn = removeLpAmount.add(userFarmLpAmount ?? new BN(0));\n    const mintBaseUseSOLBalance = poolInfo.mintA.address === Token.WSOL.mint.toString();\n    const mintQuoteUseSOLBalance = poolInfo.mintB.address === Token.WSOL.mint.toString();\n\n    const { account: baseTokenAccount, instructionParams: ownerTokenAccountBaseInstruction } =\n      await this.scope.account.getOrCreateTokenAccount({\n        tokenProgram: TOKEN_PROGRAM_ID,\n        mint: new PublicKey(poolInfo.mintA.address),\n        owner: this.scope.ownerPubKey,\n\n        createInfo: mintBaseUseSOLBalance\n          ? {\n              payer: this.scope.ownerPubKey,\n            }\n          : undefined,\n        skipCloseAccount: !mintBaseUseSOLBalance,\n        notUseTokenAccount: mintBaseUseSOLBalance,\n        associatedOnly: true,\n        checkCreateATAOwner,\n      });\n    txBuilder.addInstruction(ownerTokenAccountBaseInstruction || {});\n    if (baseTokenAccount === undefined) throw new Error(\"base token account not found\");\n\n    const { account: quoteTokenAccount, instructionParams: ownerTokenAccountQuoteInstruction } =\n      await this.scope.account.getOrCreateTokenAccount({\n        tokenProgram: TOKEN_PROGRAM_ID,\n        mint: new PublicKey(poolInfo.mintB.address),\n        owner: this.scope.ownerPubKey,\n        createInfo: mintQuoteUseSOLBalance\n          ? {\n              payer: this.scope.ownerPubKey!,\n              amount: 0,\n            }\n          : undefined,\n        skipCloseAccount: !mintQuoteUseSOLBalance,\n        notUseTokenAccount: mintQuoteUseSOLBalance,\n        associatedOnly: true,\n        checkCreateATAOwner,\n      });\n    txBuilder.addInstruction(ownerTokenAccountQuoteInstruction || {});\n    if (quoteTokenAccount === undefined) throw new Error(\"quote token account not found\");\n\n    mintToAccount[poolInfo.mintA.address] = baseTokenAccount;\n    mintToAccount[poolInfo.mintB.address] = quoteTokenAccount;\n\n    if (farmInfo !== undefined && !userFarmLpAmount?.isZero()) {\n      const farmVersion = FARM_PROGRAM_TO_VERSION[farmInfo.programId];\n      const ledger = getAssociatedLedgerAccount({\n        programId: new PublicKey(farmInfo.programId),\n        poolId: new PublicKey(farmInfo.id),\n        owner: this.scope.ownerPubKey,\n        version: farmVersion,\n      });\n      let ledgerInfo: FarmLedger | undefined = undefined;\n      const ledgerData = await this.scope.connection.getAccountInfo(ledger);\n      if (ledgerData) {\n        const ledgerLayout = getFarmLedgerLayout(farmVersion)!;\n        ledgerInfo = ledgerLayout.decode(ledgerData.data);\n      }\n      if (farmVersion !== 6 && !ledgerInfo) {\n        const { instruction, instructionType } = createAssociatedLedgerAccountInstruction({\n          id: new PublicKey(farmInfo.id),\n          programId: new PublicKey(farmInfo.programId),\n          version: farmVersion,\n          ledger,\n          owner: this.scope.ownerPubKey,\n        });\n        txBuilder.addInstruction({ instructions: [instruction], instructionTypes: [instructionType] });\n      }\n\n      const rewardTokenAccounts: PublicKey[] = [];\n      for (const item of farmInfo.rewardInfos) {\n        const rewardIsWsol = item.mint.address === Token.WSOL.mint.toString();\n        if (mintToAccount[item.mint.address]) rewardTokenAccounts.push(mintToAccount[item.mint.address]);\n        else {\n          const { account: farmRewardAccount, instructionParams: ownerTokenAccountFarmInstruction } =\n            await this.scope.account.getOrCreateTokenAccount({\n              mint: new PublicKey(item.mint.address),\n              tokenProgram,\n              owner: this.scope.ownerPubKey,\n              skipCloseAccount: !rewardIsWsol,\n              createInfo: {\n                payer: payer || this.scope.ownerPubKey,\n              },\n              associatedOnly: true,\n              checkCreateATAOwner,\n            });\n          if (!farmRewardAccount) this.logAndCreateError(\"farm reward account not found:\", item.mint.address);\n          ownerTokenAccountFarmInstruction && txBuilder.addInstruction(ownerTokenAccountFarmInstruction);\n          rewardTokenAccounts.push(farmRewardAccount!);\n        }\n      }\n      const farmKeys = (await this.scope.api.fetchFarmKeysById({ ids: farmInfo.id }))[0];\n      const insParams = {\n        userAuxiliaryLedgers,\n        amount: userFarmLpAmount!,\n        owner: this.scope.ownerPubKey,\n        farmInfo,\n        farmKeys,\n        lpAccount: lpTokenAccount,\n        rewardAccounts: rewardTokenAccounts,\n      };\n      const version = FARM_PROGRAM_TO_VERSION[farmInfo.programId];\n      const newInstruction =\n        version === 6\n          ? makeWithdrawInstructionV6(insParams)\n          : version === 5\n          ? makeWithdrawInstructionV5(insParams)\n          : makeWithdrawInstructionV3(insParams);\n      const insType = {\n        3: InstructionType.FarmV3Withdraw,\n        5: InstructionType.FarmV5Withdraw,\n        6: InstructionType.FarmV6Withdraw,\n      };\n      txBuilder.addInstruction({\n        instructions: [newInstruction],\n        instructionTypes: [insType[version]],\n      });\n    }\n\n    const poolKeys = await this.getAmmPoolKeys(poolInfo.id);\n\n    const removeIns = removeLiquidityInstruction({\n      poolInfo,\n      poolKeys,\n      userKeys: {\n        lpTokenAccount,\n        baseTokenAccount,\n        quoteTokenAccount,\n        owner: this.scope.ownerPubKey,\n      },\n      amountIn,\n    });\n\n    txBuilder.addInstruction({\n      instructions: [removeIns],\n      instructionTypes: [\n        !poolInfo.pooltype.includes(\"StablePool\")\n          ? InstructionType.AmmV4RemoveLiquidity\n          : InstructionType.AmmV5RemoveLiquidity,\n      ],\n      lookupTableAddress: poolKeys.lookupTableAccount ? [poolKeys.lookupTableAccount] : [],\n    });\n\n    const [tokenAccountA, tokenAccountB] =\n      poolInfo.mintA.address === clmmPoolInfo.mintA.address\n        ? [baseTokenAccount, quoteTokenAccount]\n        : [quoteTokenAccount, baseTokenAccount];\n\n    const clmmPoolKeys = await this.scope.clmm.getClmmPoolKeys(poolInfo.id);\n\n    const createPositionIns = await ClmmInstrument.openPositionFromBaseInstructions({\n      poolInfo: clmmPoolInfo,\n      poolKeys: clmmPoolKeys,\n      ownerInfo: {\n        feePayer: this.scope.ownerPubKey,\n        wallet: this.scope.ownerPubKey,\n        tokenAccountA,\n        tokenAccountB,\n      },\n      withMetadata: \"create\",\n      ...createPositionInfo,\n      base,\n      getEphemeralSigners,\n    });\n\n    txBuilder.addInstruction({\n      instructions: [...createPositionIns.instructions],\n      signers: createPositionIns.signers,\n      instructionTypes: [...createPositionIns.instructionTypes],\n      lookupTableAddress: clmmPoolKeys.lookupTableAccount ? [clmmPoolKeys.lookupTableAccount] : [],\n    });\n\n    if (txVersion === TxVersion.V0) return txBuilder.sizeCheckBuildV0() as Promise<MakeMultiTxData<T>>;\n    return txBuilder.sizeCheckBuild() as Promise<MakeMultiTxData<T>>;\n  }\n\n  public async createPoolV4<T extends TxVersion>({\n    programId,\n    marketInfo,\n    baseMintInfo,\n    quoteMintInfo,\n    baseAmount,\n    quoteAmount,\n    startTime,\n    ownerInfo,\n    associatedOnly = false,\n    checkCreateATAOwner = false,\n    tokenProgram,\n    txVersion,\n    feeDestinationId,\n    computeBudgetConfig,\n  }: CreatePoolParam<T>): Promise<MakeTxData<T, { address: CreatePoolAddress }>> {\n    const payer = ownerInfo.feePayer || this.scope.owner?.publicKey;\n    const mintAUseSOLBalance = ownerInfo.useSOLBalance && baseMintInfo.mint.equals(NATIVE_MINT);\n    const mintBUseSOLBalance = ownerInfo.useSOLBalance && quoteMintInfo.mint.equals(NATIVE_MINT);\n\n    const txBuilder = this.createTxBuilder();\n\n    const { account: ownerTokenAccountBase, instructionParams: ownerTokenAccountBaseInstruction } =\n      await this.scope.account.getOrCreateTokenAccount({\n        mint: baseMintInfo.mint,\n        owner: this.scope.ownerPubKey,\n        createInfo: mintAUseSOLBalance\n          ? {\n              payer: payer!,\n              amount: baseAmount,\n            }\n          : undefined,\n        notUseTokenAccount: mintAUseSOLBalance,\n        skipCloseAccount: !mintAUseSOLBalance,\n        associatedOnly: mintAUseSOLBalance ? false : associatedOnly,\n        checkCreateATAOwner,\n      });\n    txBuilder.addInstruction(ownerTokenAccountBaseInstruction || {});\n\n    const { account: ownerTokenAccountQuote, instructionParams: ownerTokenAccountQuoteInstruction } =\n      await this.scope.account.getOrCreateTokenAccount({\n        mint: quoteMintInfo.mint,\n        owner: this.scope.ownerPubKey,\n        createInfo: mintBUseSOLBalance\n          ? {\n              payer: payer!,\n              amount: quoteAmount,\n            }\n          : undefined,\n\n        notUseTokenAccount: mintBUseSOLBalance,\n        skipCloseAccount: !mintBUseSOLBalance,\n        associatedOnly: mintBUseSOLBalance ? false : associatedOnly,\n        checkCreateATAOwner,\n      });\n    txBuilder.addInstruction(ownerTokenAccountQuoteInstruction || {});\n\n    if (ownerTokenAccountBase === undefined || ownerTokenAccountQuote === undefined)\n      throw Error(\"you don't has some token account\");\n\n    const poolInfo = getAssociatedPoolKeys({\n      version: 4,\n      marketVersion: 3,\n      marketId: marketInfo.marketId,\n      baseMint: baseMintInfo.mint,\n      quoteMint: quoteMintInfo.mint,\n      baseDecimals: baseMintInfo.decimals,\n      quoteDecimals: quoteMintInfo.decimals,\n      programId,\n      marketProgramId: marketInfo.programId,\n    });\n\n    const createPoolKeys = {\n      programId,\n      ammId: poolInfo.id,\n      ammAuthority: poolInfo.authority,\n      ammOpenOrders: poolInfo.openOrders,\n      lpMint: poolInfo.lpMint,\n      coinMint: poolInfo.baseMint,\n      pcMint: poolInfo.quoteMint,\n      coinVault: poolInfo.baseVault,\n      pcVault: poolInfo.quoteVault,\n      withdrawQueue: poolInfo.withdrawQueue,\n      ammTargetOrders: poolInfo.targetOrders,\n      poolTempLp: poolInfo.lpVault,\n      marketProgramId: poolInfo.marketProgramId,\n      marketId: poolInfo.marketId,\n      ammConfigId: poolInfo.configId,\n      feeDestinationId,\n    };\n\n    const { instruction, instructionType } = createPoolV4InstructionV2({\n      ...createPoolKeys,\n      userWallet: this.scope.ownerPubKey,\n      userCoinVault: ownerTokenAccountBase,\n      userPcVault: ownerTokenAccountQuote,\n      userLpVault: getATAAddress(this.scope.ownerPubKey, poolInfo.lpMint, tokenProgram).publicKey,\n\n      nonce: poolInfo.nonce,\n      openTime: startTime,\n      coinAmount: baseAmount,\n      pcAmount: quoteAmount,\n    });\n\n    txBuilder.addInstruction({\n      instructions: [instruction],\n      instructionTypes: [instructionType],\n    });\n\n    txBuilder.addCustomComputeBudget(computeBudgetConfig);\n\n    return txBuilder.versionBuild({\n      txVersion,\n      extInfo: {\n        address: createPoolKeys,\n      },\n    }) as Promise<MakeTxData<T, { address: CreatePoolAddress }>>;\n  }\n\n  public async getCreatePoolFee({ programId }: { programId: PublicKey }): Promise<BN> {\n    const configId = getAssociatedConfigId({ programId });\n\n    const account = await this.scope.connection.getAccountInfo(configId, { dataSlice: { offset: 536, length: 8 } });\n    if (account === null) throw Error(\"get config account error\");\n\n    return createPoolFeeLayout.decode(account.data).fee;\n  }\n\n  public computeAmountOut({\n    poolInfo,\n    amountIn,\n    mintIn: propMintIn,\n    mintOut: propMintOut,\n    slippage,\n  }: ComputeAmountOutParam): {\n    amountOut: BN;\n    minAmountOut: BN;\n    currentPrice: Decimal;\n    executionPrice: Decimal;\n    priceImpact: Decimal;\n    fee: BN;\n  } {\n    const [mintIn, mintOut] = [propMintIn.toString(), propMintOut.toString()];\n    if (mintIn !== poolInfo.mintA.address && mintIn !== poolInfo.mintB.address) throw new Error(\"toke not match\");\n    if (mintOut !== poolInfo.mintA.address && mintOut !== poolInfo.mintB.address) throw new Error(\"toke not match\");\n\n    const { baseReserve, quoteReserve } = poolInfo;\n\n    const reserves = [baseReserve, quoteReserve];\n\n    // input is fixed\n    const input = mintIn == poolInfo.mintA.address ? \"base\" : \"quote\";\n    if (input === \"quote\") {\n      reserves.reverse();\n    }\n\n    const [reserveIn, reserveOut] = reserves;\n    const isVersion4 = poolInfo.version === 4;\n    let currentPrice: Decimal;\n    if (isVersion4) {\n      currentPrice = new Decimal(reserveOut.toString()).div(reserveIn.toString());\n    } else {\n      const p = getStablePrice(\n        this.stableLayout.stableModelData,\n        baseReserve.toNumber(),\n        quoteReserve.toNumber(),\n        false,\n      );\n      if (input === \"quote\") currentPrice = new Decimal(1e6).div(p * 1e6);\n      else currentPrice = new Decimal(p * 1e6).div(1e6);\n    }\n\n    const amountInRaw = amountIn;\n    let amountOutRaw = new BN(0);\n    let feeRaw = new BN(0);\n\n    if (!amountInRaw.isZero()) {\n      if (isVersion4) {\n        feeRaw = BNDivCeil(amountInRaw.mul(LIQUIDITY_FEES_NUMERATOR), LIQUIDITY_FEES_DENOMINATOR);\n        const amountInWithFee = amountInRaw.sub(feeRaw);\n\n        const denominator = reserveIn.add(amountInWithFee);\n        amountOutRaw = reserveOut.mul(amountInWithFee).div(denominator);\n      } else {\n        feeRaw = amountInRaw.mul(new BN(2)).div(new BN(10000));\n        const amountInWithFee = amountInRaw.sub(feeRaw);\n        if (input === \"quote\")\n          amountOutRaw = new BN(\n            getDyByDxBaseIn(\n              this.stableLayout.stableModelData,\n              quoteReserve.toNumber(),\n              baseReserve.toNumber(),\n              amountInWithFee.toNumber(),\n            ),\n          );\n        else {\n          amountOutRaw = new BN(\n            getDxByDyBaseIn(\n              this.stableLayout.stableModelData,\n              quoteReserve.toNumber(),\n              baseReserve.toNumber(),\n              amountInWithFee.toNumber(),\n            ),\n          );\n        }\n      }\n    }\n\n    const minAmountOutRaw = new BN(new Decimal(amountOutRaw.toString()).mul(1 - slippage).toFixed(0));\n\n    const amountOut = amountOutRaw;\n    const minAmountOut = minAmountOutRaw;\n\n    let executionPrice = new Decimal(amountOutRaw.toString()).div(\n      new Decimal(amountInRaw.sub(feeRaw).toString()).toFixed(0),\n    );\n    if (!amountInRaw.isZero() && !amountOutRaw.isZero()) {\n      // executionPrice = new Price(currencyIn, amountInRaw.sub(feeRaw), currencyOut, amountOutRaw);\n      executionPrice = new Decimal(amountOutRaw.toString()).div(amountInRaw.sub(feeRaw).toString());\n    }\n\n    const priceImpact = currentPrice.sub(executionPrice).div(currentPrice).mul(100);\n\n    // logger.debug(\"priceImpact:\", `${priceImpact.toSignificant()}%`);\n\n    const fee = feeRaw;\n\n    return {\n      amountOut,\n      minAmountOut,\n      currentPrice,\n      executionPrice,\n      priceImpact,\n      fee,\n    };\n  }\n\n  public async swap<T extends TxVersion>({\n    poolInfo,\n    poolKeys: propPoolKeys,\n    amountIn,\n    amountOut,\n    inputMint,\n    fixedSide,\n    txVersion,\n    config,\n    computeBudgetConfig,\n  }: SwapParam<T>): Promise<MakeTxData<T>> {\n    const txBuilder = this.createTxBuilder();\n    const { associatedOnly = true, inputUseSolBalance = true, outputUseSolBalance = true } = config || {};\n\n    const [tokenIn, tokenOut] =\n      inputMint === poolInfo.mintA.address ? [poolInfo.mintA, poolInfo.mintB] : [poolInfo.mintB, poolInfo.mintA];\n\n    const inputTokenUseSolBalance = inputUseSolBalance && tokenIn.address === WSOLMint.toBase58();\n    const outputTokenUseSolBalance = outputUseSolBalance && tokenOut.address === WSOLMint.toBase58();\n\n    const { account: _tokenAccountIn, instructionParams: ownerTokenAccountBaseInstruction } =\n      await this.scope.account.getOrCreateTokenAccount({\n        tokenProgram: TOKEN_PROGRAM_ID,\n        mint: new PublicKey(tokenIn.address),\n        owner: this.scope.ownerPubKey,\n\n        createInfo: inputTokenUseSolBalance\n          ? {\n              payer: this.scope.ownerPubKey,\n              amount: amountIn,\n            }\n          : undefined,\n        skipCloseAccount: !inputTokenUseSolBalance,\n        notUseTokenAccount: inputTokenUseSolBalance,\n        associatedOnly,\n      });\n    txBuilder.addInstruction(ownerTokenAccountBaseInstruction || {});\n\n    if (!_tokenAccountIn)\n      this.logAndCreateError(\"input token account not found\", {\n        token: tokenIn.symbol || tokenIn.address,\n        tokenAccountIn: _tokenAccountIn,\n        inputTokenUseSolBalance,\n        associatedOnly,\n      });\n\n    const { account: _tokenAccountOut, instructionParams: ownerTokenAccountQuoteInstruction } =\n      await this.scope.account.getOrCreateTokenAccount({\n        tokenProgram: TOKEN_PROGRAM_ID,\n        mint: new PublicKey(tokenOut.address),\n        owner: this.scope.ownerPubKey,\n        createInfo: {\n          payer: this.scope.ownerPubKey!,\n          amount: 0,\n        },\n        skipCloseAccount: !outputTokenUseSolBalance,\n        notUseTokenAccount: outputTokenUseSolBalance,\n        associatedOnly: outputTokenUseSolBalance ? false : associatedOnly,\n      });\n    txBuilder.addInstruction(ownerTokenAccountQuoteInstruction || {});\n    if (_tokenAccountOut === undefined)\n      this.logAndCreateError(\"output token account not found\", {\n        token: tokenOut.symbol || tokenOut.address,\n        tokenAccountOut: _tokenAccountOut,\n        outputTokenUseSolBalance,\n        associatedOnly,\n      });\n\n    const poolKeys = propPoolKeys || (await this.getAmmPoolKeys(poolInfo.id));\n    let version = 4;\n    if (poolInfo.pooltype.includes(\"StablePool\")) version = 5;\n\n    txBuilder.addInstruction({\n      instructions: [\n        makeAMMSwapInstruction({\n          version,\n          poolKeys,\n          userKeys: {\n            tokenAccountIn: _tokenAccountIn!,\n            tokenAccountOut: _tokenAccountOut!,\n            owner: this.scope.ownerPubKey,\n          },\n          amountIn,\n          amountOut,\n          fixedSide,\n        }),\n      ],\n      instructionTypes: [version === 4 ? InstructionType.AmmV4SwapBaseIn : InstructionType.AmmV5SwapBaseIn],\n    });\n\n    txBuilder.addCustomComputeBudget(computeBudgetConfig);\n\n    return txBuilder.versionBuild({\n      txVersion,\n    }) as Promise<MakeTxData<T>>;\n  }\n\n  public async getRpcPoolInfo(poolId: string): Promise<AmmRpcData> {\n    return (await this.getRpcPoolInfos([poolId]))[poolId];\n  }\n\n  public async getRpcPoolInfos(\n    poolIds: (string | PublicKey)[],\n    config?: { batchRequest?: boolean; chunkCount?: number },\n  ): Promise<{\n    [poolId: string]: AmmRpcData;\n  }> {\n    const accounts = await getMultipleAccountsInfoWithCustomFlags(\n      this.scope.connection,\n      poolIds.map((i) => ({ pubkey: new PublicKey(i) })),\n      config,\n    );\n    const poolInfos: { [poolId: string]: ReturnType<typeof liquidityStateV4Layout.decode> & { programId: PublicKey } } =\n      {};\n\n    const needFetchVaults: PublicKey[] = [];\n\n    for (let i = 0; i < poolIds.length; i++) {\n      const item = accounts[i];\n      if (item === null || !item.accountInfo) throw Error(\"fetch pool info error: \" + String(poolIds[i]));\n      const rpc = liquidityStateV4Layout.decode(item.accountInfo.data);\n      poolInfos[String(poolIds[i])] = {\n        ...rpc,\n        programId: item.accountInfo.owner,\n      };\n\n      needFetchVaults.push(rpc.baseVault, rpc.quoteVault);\n    }\n\n    const vaultInfo: { [vaultId: string]: BN } = {};\n    const vaultAccountInfo = await getMultipleAccountsInfoWithCustomFlags(\n      this.scope.connection,\n      needFetchVaults.map((i) => ({ pubkey: new PublicKey(i) })),\n      config,\n    );\n\n    for (let i = 0; i < needFetchVaults.length; i++) {\n      const vaultItemInfo = vaultAccountInfo[i].accountInfo;\n      if (vaultItemInfo === null) throw Error(\"fetch vault info error: \" + needFetchVaults[i]);\n\n      vaultInfo[String(needFetchVaults[i])] = new BN(AccountLayout.decode(vaultItemInfo.data).amount.toString());\n    }\n\n    const returnData: { [poolId: string]: AmmRpcData } = {};\n\n    for (const [id, info] of Object.entries(poolInfos)) {\n      const baseReserve = vaultInfo[info.baseVault.toString()].sub(info.baseNeedTakePnl);\n      const quoteReserve = vaultInfo[info.quoteVault.toString()].sub(info.quoteNeedTakePnl);\n      returnData[id] = {\n        ...info,\n        baseReserve,\n        mintAAmount: vaultInfo[info.baseVault.toString()],\n        mintBAmount: vaultInfo[info.quoteVault.toString()],\n        quoteReserve,\n        poolPrice: new Decimal(quoteReserve.toString())\n          .div(new Decimal(10).pow(info.quoteDecimal.toString()))\n          .div(new Decimal(baseReserve.toString()).div(new Decimal(10).pow(info.baseDecimal.toString()))),\n      };\n    }\n\n    return returnData;\n  }\n\n  public async getPoolInfoFromRpc({ poolId }: { poolId: string }): Promise<{\n    poolRpcData: AmmRpcData;\n    poolInfo: ComputeAmountOutParam[\"poolInfo\"];\n    poolKeys: AmmV4Keys | AmmV5Keys;\n  }> {\n    const rpcData = await this.getRpcPoolInfo(poolId);\n    const computeData = toAmmComputePoolInfo({ [poolId]: rpcData });\n    const poolInfo = computeData[poolId];\n    const allKeys = await this.scope.tradeV2.computePoolToPoolKeys({\n      pools: [computeData[poolId]],\n      ammRpcData: { [poolId]: rpcData },\n    });\n    return {\n      poolRpcData: rpcData,\n      poolInfo,\n      poolKeys: allKeys[0] as AmmV4Keys | AmmV5Keys,\n    };\n  }\n}\n","import { publicKey, struct, u32, u64, u8 } from \"@/marshmallow\";\n\nexport const SPL_MINT_LAYOUT = struct([\n  u32(\"mintAuthorityOption\"),\n  publicKey(\"mintAuthority\"),\n  u64(\"supply\"),\n  u8(\"decimals\"),\n  u8(\"isInitialized\"),\n  u32(\"freezeAuthorityOption\"),\n  publicKey(\"freezeAuthority\"),\n]);\n\nexport type SplMintLayout = typeof SPL_MINT_LAYOUT;\n","import { Connection, PublicKey } from \"@solana/web3.js\";\nimport { MintLayout, RawMint, TOKEN_PROGRAM_ID, TransferFeeConfig } from \"@solana/spl-token\";\nimport { Token, TokenAmount } from \"@/module\";\nimport { BigNumberish } from \"@/common/bignumber\";\nimport { TokenInfo } from \"./type\";\nimport { SOL_INFO, TOKEN_WSOL } from \"./constant\";\n\nimport { ApiV3Token } from \"@/api\";\nimport { solToWSol } from \"@/common\";\n\nexport const parseTokenInfo = async ({\n  connection,\n  mint,\n}: {\n  connection: Connection;\n  mint: PublicKey | string;\n}): Promise<RawMint | undefined> => {\n  const accountData = await connection.getAccountInfo(new PublicKey(mint));\n  if (!accountData || accountData.data.length !== MintLayout.span) return;\n  const tokenInfo = MintLayout.decode(accountData.data);\n  return tokenInfo;\n};\n\nexport const toTokenInfo = ({\n  mint,\n  decimals,\n  programId = TOKEN_PROGRAM_ID,\n  logoURI = \"\",\n  priority = 3,\n}: {\n  mint: PublicKey;\n  decimals: number;\n  programId?: PublicKey | string;\n  priority?: number;\n  logoURI?: string;\n}): TokenInfo => {\n  const pubStr = mint.toBase58().substring(0, 6);\n  return {\n    address: mint.toBase58(),\n    decimals,\n    symbol: pubStr,\n    logoURI,\n    extensions: {},\n    chainId: 101,\n    programId: programId.toString(),\n    name: pubStr,\n    tags: [],\n    priority,\n  };\n};\n\nexport const toToken = (props: Omit<TokenInfo, \"priority\">): Token =>\n  new Token({\n    mint: props.address,\n    decimals: props.decimals,\n    symbol: props.symbol,\n    name: props.name,\n  });\n\nexport const toTokenAmount = ({\n  amount,\n  isRaw,\n  name,\n  ...props\n}: Omit<TokenInfo, \"priority\"> & {\n  amount: BigNumberish;\n  isRaw?: boolean;\n  name?: string;\n}): TokenAmount =>\n  new TokenAmount(\n    new Token({\n      mint: solToWSol(props.address).toBase58(),\n      decimals: props.decimals,\n      symbol: props.symbol,\n      name,\n    }),\n    amount,\n    isRaw,\n    name,\n  );\n\nexport function solToWSolToken<T extends ApiV3Token | TokenInfo>(token: T): T {\n  if (token.address === SOL_INFO.address) return TOKEN_WSOL as T;\n  return token;\n}\n\nexport function wSolToSolToken<T extends ApiV3Token | TokenInfo>(token: T): T {\n  if (token.address === TOKEN_WSOL.address) return SOL_INFO as T;\n  return token;\n}\n\nexport const toApiV3Token = ({\n  address,\n  programId,\n  decimals,\n  ...props\n}: {\n  address: string;\n  programId: string;\n  decimals: number;\n} & Partial<ApiV3Token>): ApiV3Token => ({\n  chainId: 101,\n  address: solToWSol(address).toBase58(),\n  programId,\n  logoURI: \"\",\n  symbol: \"\",\n  name: \"\",\n  decimals,\n  tags: [],\n  extensions: props.extensions || {},\n  ...props,\n});\n\nexport const toFeeConfig = (config?: TransferFeeConfig): ApiV3Token[\"extensions\"][\"feeConfig\"] | undefined =>\n  config\n    ? {\n        ...config,\n        transferFeeConfigAuthority: config.transferFeeConfigAuthority.toBase58(),\n        withdrawWithheldAuthority: config.withdrawWithheldAuthority.toBase58(),\n        withheldAmount: config.withheldAmount.toString(),\n        olderTransferFee: {\n          ...config.olderTransferFee,\n          epoch: config.olderTransferFee.epoch.toString(),\n          maximumFee: config.olderTransferFee.maximumFee.toString(),\n        },\n        newerTransferFee: {\n          ...config.newerTransferFee,\n          epoch: config.newerTransferFee.epoch.toString(),\n          maximumFee: config.newerTransferFee.maximumFee.toString(),\n        },\n      }\n    : undefined;\n","import { TOKEN_PROGRAM_ID, ASSOCIATED_TOKEN_PROGRAM_ID } from \"@solana/spl-token\";\nimport { PublicKey, TransactionInstruction, SystemProgram, SYSVAR_RENT_PUBKEY } from \"@solana/web3.js\";\n\nimport { parseBigNumberish, BN_ZERO, BN_ONE } from \"@/common/bignumber\";\nimport { InstructionType } from \"@/common/txTool/txType\";\nimport { createLogger } from \"@/common/logger\";\nimport { accountMeta, RENT_PROGRAM_ID } from \"@/common/pubKey\";\nimport { AmmV4Keys, AmmV5Keys } from \"@/api/type\";\nimport { struct, u8, u64 } from \"@/marshmallow\";\n\nimport {\n  addLiquidityLayout,\n  removeLiquidityLayout,\n  fixedSwapInLayout,\n  fixedSwapOutLayout,\n  initPoolLayout,\n} from \"./layout\";\nimport { MODEL_DATA_PUBKEY } from \"./stable\";\nimport {\n  LiquidityAddInstructionParams,\n  RemoveLiquidityInstruction,\n  SwapFixedInInstructionParamsV4,\n  SwapFixedOutInstructionParamsV4,\n  SwapInstructionParams,\n  InitPoolInstructionParamsV4,\n} from \"./type\";\nimport { jsonInfo2PoolKeys } from \"@/common/utility\";\nimport { InstructionReturn } from \"../type\";\nimport BN from \"bn.js\";\n\nconst logger = createLogger(\"Raydium_liquidity_instruction\");\nexport function makeAddLiquidityInstruction(params: LiquidityAddInstructionParams): TransactionInstruction {\n  const { poolInfo, poolKeys, userKeys, baseAmountIn, quoteAmountIn, fixedSide } = params;\n\n  const data = Buffer.alloc(addLiquidityLayout.span);\n  addLiquidityLayout.encode(\n    {\n      instruction: 3,\n      baseAmountIn: parseBigNumberish(baseAmountIn),\n      quoteAmountIn: parseBigNumberish(quoteAmountIn),\n      fixedSide: fixedSide === \"base\" ? BN_ZERO : BN_ONE,\n    },\n    data,\n  );\n\n  const keys = [\n    accountMeta({ pubkey: TOKEN_PROGRAM_ID, isWritable: false }),\n    // amm\n    accountMeta({ pubkey: new PublicKey(poolInfo.id) }),\n    accountMeta({ pubkey: new PublicKey(poolKeys.authority), isWritable: false }),\n    accountMeta({ pubkey: new PublicKey(poolKeys.openOrders), isWritable: false }),\n    accountMeta({ pubkey: new PublicKey(poolKeys.targetOrders) }),\n    accountMeta({ pubkey: new PublicKey(poolInfo.lpMint.address) }),\n    accountMeta({ pubkey: new PublicKey(poolKeys.vault.A) }),\n    accountMeta({ pubkey: new PublicKey(poolKeys.vault.B) }),\n  ];\n\n  if (poolInfo.pooltype.includes(\"StablePool\")) {\n    keys.push(accountMeta({ pubkey: MODEL_DATA_PUBKEY }));\n  }\n\n  keys.push(\n    // serum\n    accountMeta({ pubkey: new PublicKey(poolInfo.marketId), isWritable: false }),\n    // user\n    accountMeta({ pubkey: userKeys.baseTokenAccount }),\n    accountMeta({ pubkey: userKeys.quoteTokenAccount }),\n    accountMeta({ pubkey: userKeys.lpTokenAccount }),\n    accountMeta({ pubkey: userKeys.owner, isWritable: false, isSigner: true }),\n    accountMeta({ pubkey: new PublicKey(poolKeys.marketEventQueue), isWritable: false }),\n  );\n\n  return new TransactionInstruction({\n    programId: new PublicKey(poolInfo.programId),\n    keys,\n    data,\n  });\n}\n\nexport function removeLiquidityInstruction(params: RemoveLiquidityInstruction): TransactionInstruction {\n  const { poolInfo, poolKeys: poolKeyProps, userKeys, amountIn } = params;\n  const poolKeys = jsonInfo2PoolKeys(poolKeyProps);\n\n  let version = 4;\n  if (poolInfo.pooltype.includes(\"StablePool\")) version = 5;\n\n  if (version === 4 || version === 5) {\n    const data = Buffer.alloc(removeLiquidityLayout.span);\n    removeLiquidityLayout.encode(\n      {\n        instruction: 4,\n        amountIn: parseBigNumberish(amountIn),\n      },\n      data,\n    );\n\n    const keys = [\n      // system\n      accountMeta({ pubkey: TOKEN_PROGRAM_ID, isWritable: false }),\n      // amm\n      accountMeta({ pubkey: poolKeys.id }),\n      accountMeta({ pubkey: poolKeys.authority, isWritable: false }),\n      accountMeta({ pubkey: poolKeys.openOrders }),\n      accountMeta({ pubkey: poolKeys.targetOrders }),\n      accountMeta({ pubkey: poolKeys.mintLp.address }),\n      accountMeta({ pubkey: poolKeys.vault.A }),\n      accountMeta({ pubkey: poolKeys.vault.B }),\n    ];\n\n    if (version === 5) {\n      keys.push(accountMeta({ pubkey: MODEL_DATA_PUBKEY }));\n    } else {\n      keys.push(accountMeta({ pubkey: poolKeys.id }));\n      keys.push(accountMeta({ pubkey: poolKeys.id }));\n    }\n\n    keys.push(\n      // serum\n      accountMeta({ pubkey: poolKeys.marketProgramId, isWritable: false }),\n      accountMeta({ pubkey: poolKeys.marketId }),\n      accountMeta({ pubkey: poolKeys.marketBaseVault }),\n      accountMeta({ pubkey: poolKeys.marketQuoteVault }),\n      accountMeta({ pubkey: poolKeys.marketAuthority, isWritable: false }),\n      // user\n      accountMeta({ pubkey: userKeys.lpTokenAccount }),\n      accountMeta({ pubkey: userKeys.baseTokenAccount }),\n      accountMeta({ pubkey: userKeys.quoteTokenAccount }),\n      accountMeta({ pubkey: userKeys.owner, isWritable: false, isSigner: true }),\n      // serum orderbook\n      accountMeta({ pubkey: poolKeys.marketEventQueue }),\n      accountMeta({ pubkey: poolKeys.marketBids }),\n      accountMeta({ pubkey: poolKeys.marketAsks }),\n    );\n\n    return new TransactionInstruction({\n      programId: poolKeys.programId,\n      keys,\n      data,\n    });\n  }\n\n  // logger.logWithError(\"invalid version\", \"poolKeys.version\", version);\n  return new TransactionInstruction({ programId: poolKeys.programId, keys: [] }); // won't reach\n}\n\nexport function createPoolV4InstructionV2({\n  programId,\n  ammId,\n  ammAuthority,\n  ammOpenOrders,\n  lpMint,\n  coinMint,\n  pcMint,\n  coinVault,\n  pcVault,\n  withdrawQueue,\n  ammTargetOrders,\n  poolTempLp,\n  marketProgramId,\n  marketId,\n  userWallet,\n  userCoinVault,\n  userPcVault,\n  userLpVault,\n  nonce,\n  openTime,\n  coinAmount,\n  pcAmount,\n  ammConfigId,\n  feeDestinationId,\n}: {\n  programId: PublicKey;\n  ammId: PublicKey;\n  ammAuthority: PublicKey;\n  ammOpenOrders: PublicKey;\n  lpMint: PublicKey;\n  coinMint: PublicKey;\n  pcMint: PublicKey;\n  coinVault: PublicKey;\n  pcVault: PublicKey;\n  withdrawQueue: PublicKey;\n  ammTargetOrders: PublicKey;\n  poolTempLp: PublicKey;\n  marketProgramId: PublicKey;\n  marketId: PublicKey;\n  userWallet: PublicKey;\n  userCoinVault: PublicKey;\n  userPcVault: PublicKey;\n  userLpVault: PublicKey;\n  ammConfigId: PublicKey;\n  feeDestinationId: PublicKey;\n\n  nonce: number;\n  openTime: BN;\n  coinAmount: BN;\n  pcAmount: BN;\n}): InstructionReturn {\n  const dataLayout = struct([u8(\"instruction\"), u8(\"nonce\"), u64(\"openTime\"), u64(\"pcAmount\"), u64(\"coinAmount\")]);\n\n  const keys = [\n    { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },\n    { pubkey: ASSOCIATED_TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },\n    { pubkey: SystemProgram.programId, isSigner: false, isWritable: false },\n    { pubkey: RENT_PROGRAM_ID, isSigner: false, isWritable: false },\n    { pubkey: ammId, isSigner: false, isWritable: true },\n    { pubkey: ammAuthority, isSigner: false, isWritable: false },\n    { pubkey: ammOpenOrders, isSigner: false, isWritable: true },\n    { pubkey: lpMint, isSigner: false, isWritable: true },\n    { pubkey: coinMint, isSigner: false, isWritable: false },\n    { pubkey: pcMint, isSigner: false, isWritable: false },\n    { pubkey: coinVault, isSigner: false, isWritable: true },\n    { pubkey: pcVault, isSigner: false, isWritable: true }, //12\n    { pubkey: ammTargetOrders, isSigner: false, isWritable: true }, //13\n    { pubkey: ammConfigId, isSigner: false, isWritable: false },\n    { pubkey: feeDestinationId, isSigner: false, isWritable: true },\n    { pubkey: marketProgramId, isSigner: false, isWritable: false },\n    { pubkey: marketId, isSigner: false, isWritable: false },\n    { pubkey: userWallet, isSigner: true, isWritable: true },\n    { pubkey: userCoinVault, isSigner: false, isWritable: true },\n    { pubkey: userPcVault, isSigner: false, isWritable: true },\n    { pubkey: userLpVault, isSigner: false, isWritable: true },\n  ];\n\n  const data = Buffer.alloc(dataLayout.span);\n  dataLayout.encode({ instruction: 1, nonce, openTime, coinAmount, pcAmount }, data);\n\n  return {\n    instruction: new TransactionInstruction({\n      keys,\n      programId,\n      data,\n    }),\n    instructionType: InstructionType.AmmV4CreatePool,\n  };\n}\n\nexport function simulatePoolInfoInstruction(poolKeys: AmmV4Keys | AmmV5Keys): TransactionInstruction {\n  const simulatePoolLayout = struct([u8(\"instruction\"), u8(\"simulateType\")]);\n  const data = Buffer.alloc(simulatePoolLayout.span);\n  simulatePoolLayout.encode(\n    {\n      instruction: 12,\n      simulateType: 0,\n    },\n    data,\n  );\n\n  const keys = [\n    // amm\n    accountMeta({ pubkey: new PublicKey(poolKeys.id), isWritable: false }),\n    accountMeta({ pubkey: new PublicKey(poolKeys.authority), isWritable: false }),\n    accountMeta({ pubkey: new PublicKey(poolKeys.openOrders), isWritable: false }),\n    accountMeta({ pubkey: new PublicKey(poolKeys.vault.A), isWritable: false }),\n    accountMeta({ pubkey: new PublicKey(poolKeys.vault.B), isWritable: false }),\n    accountMeta({ pubkey: new PublicKey(poolKeys.mintLp.address), isWritable: false }),\n    // serum\n    accountMeta({ pubkey: new PublicKey(poolKeys.marketId), isWritable: false }),\n    accountMeta({ pubkey: new PublicKey(poolKeys.marketEventQueue), isWritable: false }),\n  ];\n\n  return new TransactionInstruction({\n    programId: new PublicKey(poolKeys.programId),\n    keys,\n    data,\n  });\n}\n\nexport function makeSwapFixedInInstruction(\n  { poolKeys: propPoolKeys, userKeys, amountIn, minAmountOut }: SwapFixedInInstructionParamsV4,\n  version: number,\n): TransactionInstruction {\n  const poolKeys = jsonInfo2PoolKeys(propPoolKeys);\n  const data = Buffer.alloc(fixedSwapInLayout.span);\n  fixedSwapInLayout.encode(\n    {\n      instruction: 9,\n      amountIn: parseBigNumberish(amountIn),\n      minAmountOut: parseBigNumberish(minAmountOut),\n    },\n    data,\n  );\n  const keys = [\n    // amm\n    accountMeta({ pubkey: TOKEN_PROGRAM_ID, isWritable: false }),\n    accountMeta({ pubkey: poolKeys.id }),\n    accountMeta({ pubkey: poolKeys.authority, isWritable: false }),\n    accountMeta({ pubkey: poolKeys.openOrders }),\n  ];\n\n  if (version === 4) keys.push(accountMeta({ pubkey: poolKeys.targetOrders }));\n  keys.push(accountMeta({ pubkey: poolKeys.vault.A }), accountMeta({ pubkey: poolKeys.vault.B }));\n  if (version === 5) keys.push(accountMeta({ pubkey: MODEL_DATA_PUBKEY }));\n  keys.push(\n    // serum\n    accountMeta({ pubkey: poolKeys.marketProgramId, isWritable: false }),\n    accountMeta({ pubkey: poolKeys.marketId }),\n    accountMeta({ pubkey: poolKeys.marketBids }),\n    accountMeta({ pubkey: poolKeys.marketAsks }),\n    accountMeta({ pubkey: poolKeys.marketEventQueue }),\n    accountMeta({ pubkey: poolKeys.marketBaseVault }),\n    accountMeta({ pubkey: poolKeys.marketQuoteVault }),\n    accountMeta({ pubkey: poolKeys.marketAuthority, isWritable: false }),\n    // user\n    accountMeta({ pubkey: userKeys.tokenAccountIn }),\n    accountMeta({ pubkey: userKeys.tokenAccountOut }),\n    accountMeta({ pubkey: userKeys.owner, isWritable: false }),\n  );\n\n  return new TransactionInstruction({\n    programId: poolKeys.programId,\n    keys,\n    data,\n  });\n}\n\nexport function makeSwapFixedOutInstruction(\n  { poolKeys: propPoolKeys, userKeys, maxAmountIn, amountOut }: SwapFixedOutInstructionParamsV4,\n  version: number,\n): TransactionInstruction {\n  const poolKeys = jsonInfo2PoolKeys(propPoolKeys);\n  const data = Buffer.alloc(fixedSwapOutLayout.span);\n  fixedSwapOutLayout.encode(\n    {\n      instruction: 11,\n      maxAmountIn: parseBigNumberish(maxAmountIn),\n      amountOut: parseBigNumberish(amountOut),\n    },\n    data,\n  );\n\n  const keys = [\n    accountMeta({ pubkey: TOKEN_PROGRAM_ID, isWritable: false }),\n    // amm\n    accountMeta({ pubkey: poolKeys.id }),\n    accountMeta({ pubkey: poolKeys.authority, isWritable: false }),\n    accountMeta({ pubkey: poolKeys.openOrders }),\n    accountMeta({ pubkey: poolKeys.targetOrders }),\n    accountMeta({ pubkey: poolKeys.vault.A }),\n    accountMeta({ pubkey: poolKeys.vault.B }),\n  ];\n\n  if (version === 5) keys.push(accountMeta({ pubkey: MODEL_DATA_PUBKEY }));\n\n  keys.push(\n    // serum\n    accountMeta({ pubkey: poolKeys.marketProgramId, isWritable: false }),\n    accountMeta({ pubkey: poolKeys.marketId }),\n    accountMeta({ pubkey: poolKeys.marketBids }),\n    accountMeta({ pubkey: poolKeys.marketAsks }),\n    accountMeta({ pubkey: poolKeys.marketEventQueue }),\n    accountMeta({ pubkey: poolKeys.marketBaseVault }),\n    accountMeta({ pubkey: poolKeys.marketQuoteVault }),\n    accountMeta({ pubkey: poolKeys.marketAuthority, isWritable: false }),\n    accountMeta({ pubkey: userKeys.tokenAccountIn }),\n    accountMeta({ pubkey: userKeys.tokenAccountOut }),\n    accountMeta({ pubkey: userKeys.owner, isWritable: false, isSigner: true }),\n  );\n\n  return new TransactionInstruction({\n    programId: poolKeys.programId,\n    keys,\n    data,\n  });\n}\n\nexport function makeAMMSwapInstruction(params: SwapInstructionParams): TransactionInstruction {\n  const { poolKeys, version, userKeys, amountIn, amountOut, fixedSide } = params;\n  if (version === 4 || version === 5) {\n    const props = { poolKeys, userKeys };\n    if (fixedSide === \"in\") {\n      return makeSwapFixedInInstruction(\n        {\n          ...props,\n          amountIn,\n          minAmountOut: amountOut,\n        },\n        version,\n      );\n    } else if (fixedSide === \"out\") {\n      return makeSwapFixedOutInstruction(\n        {\n          ...props,\n          maxAmountIn: amountIn,\n          amountOut,\n        },\n        version,\n      );\n    }\n    logger.logWithError(\"invalid params\", \"params\", params);\n  }\n\n  logger.logWithError(\"invalid version\", \"poolKeys.version\", version);\n  throw new Error(\"invalid version\");\n}\n\nexport function makeInitPoolInstructionV4({\n  poolKeys: propPoolKeys,\n  userKeys,\n  startTime,\n}: InitPoolInstructionParamsV4): TransactionInstruction {\n  const data = Buffer.alloc(initPoolLayout.span);\n  initPoolLayout.encode(\n    {\n      instruction: 0,\n      // nonce: poolKeys.nonce, // to do fix\n      nonce: 5,\n      startTime: parseBigNumberish(startTime),\n    },\n    data,\n  );\n  const poolKeys = jsonInfo2PoolKeys(propPoolKeys);\n\n  const keys = [\n    // system\n    accountMeta({ pubkey: TOKEN_PROGRAM_ID, isWritable: false }),\n    accountMeta({ pubkey: SystemProgram.programId, isWritable: false }),\n    accountMeta({ pubkey: SYSVAR_RENT_PUBKEY, isWritable: false }),\n    // amm\n    accountMeta({ pubkey: poolKeys.id }),\n    accountMeta({ pubkey: poolKeys.authority, isWritable: false }),\n    accountMeta({ pubkey: poolKeys.openOrders }),\n    accountMeta({ pubkey: poolKeys.mintLp.address }),\n    accountMeta({ pubkey: poolKeys.mintA.address, isWritable: false }),\n    accountMeta({ pubkey: poolKeys.mintB.address, isWritable: false }),\n    accountMeta({ pubkey: poolKeys.vault.A, isWritable: false }),\n    accountMeta({ pubkey: poolKeys.vault.B, isWritable: false }),\n    accountMeta({ pubkey: poolKeys.id }),\n    accountMeta({ pubkey: poolKeys.targetOrders }),\n    accountMeta({ pubkey: userKeys.lpTokenAccount }),\n    accountMeta({ pubkey: poolKeys.id, isWritable: false }),\n    // serum\n    accountMeta({ pubkey: poolKeys.marketProgramId, isWritable: false }),\n    accountMeta({ pubkey: poolKeys.marketId, isWritable: false }),\n    // user\n    accountMeta({ pubkey: userKeys.payer, isSigner: true }),\n  ];\n\n  return new TransactionInstruction({\n    programId: poolKeys.programId,\n    keys,\n    data,\n  });\n}\n\nexport function makeSimulatePoolInfoInstruction({ poolKeys }: { poolKeys: AmmV4Keys | AmmV5Keys }): {\n  instruction: TransactionInstruction;\n} {\n  const LAYOUT = struct([u8(\"instruction\"), u8(\"simulateType\")]);\n  const data = Buffer.alloc(LAYOUT.span);\n  LAYOUT.encode(\n    {\n      instruction: 12,\n      simulateType: 0,\n    },\n    data,\n  );\n\n  const keys = [\n    // amm\n    accountMeta({ pubkey: new PublicKey(poolKeys.id), isWritable: false }),\n    accountMeta({ pubkey: new PublicKey(poolKeys.authority), isWritable: false }),\n    accountMeta({ pubkey: new PublicKey(poolKeys.openOrders), isWritable: false }),\n    accountMeta({ pubkey: new PublicKey(poolKeys.vault.A), isWritable: false }),\n    accountMeta({ pubkey: new PublicKey(poolKeys.vault.B), isWritable: false }),\n    accountMeta({ pubkey: new PublicKey(poolKeys.mintLp.address), isWritable: false }),\n    // serum\n    accountMeta({ pubkey: new PublicKey(poolKeys.marketId), isWritable: false }),\n    accountMeta({ pubkey: new PublicKey(poolKeys.marketEventQueue), isWritable: false }),\n  ];\n\n  return {\n    instruction: new TransactionInstruction({\n      programId: new PublicKey(poolKeys.programId),\n      keys,\n      data,\n    }),\n  };\n}\n","import { GetStructureSchema, publicKey, seq, struct, u128, u64, u8, u16, blob, bool } from \"@/marshmallow\";\n\nexport const fixedSwapInLayout = struct([u8(\"instruction\"), u64(\"amountIn\"), u64(\"minAmountOut\")]);\nexport const fixedSwapOutLayout = struct([u8(\"instruction\"), u64(\"maxAmountIn\"), u64(\"amountOut\")]);\n\nexport const createPoolV4Layout = struct([u8(\"instruction\"), u8(\"nonce\")]);\nexport const initPoolLayout = struct([u8(\"instruction\"), u8(\"nonce\"), u64(\"startTime\")]);\n/* ================= state layouts ================= */\nexport const liquidityStateV4Layout = struct([\n  u64(\"status\"),\n  u64(\"nonce\"),\n  u64(\"maxOrder\"),\n  u64(\"depth\"),\n  u64(\"baseDecimal\"),\n  u64(\"quoteDecimal\"),\n  u64(\"state\"),\n  u64(\"resetFlag\"),\n  u64(\"minSize\"),\n  u64(\"volMaxCutRatio\"),\n  u64(\"amountWaveRatio\"),\n  u64(\"baseLotSize\"),\n  u64(\"quoteLotSize\"),\n  u64(\"minPriceMultiplier\"),\n  u64(\"maxPriceMultiplier\"),\n  u64(\"systemDecimalValue\"),\n  u64(\"minSeparateNumerator\"),\n  u64(\"minSeparateDenominator\"),\n  u64(\"tradeFeeNumerator\"),\n  u64(\"tradeFeeDenominator\"),\n  u64(\"pnlNumerator\"),\n  u64(\"pnlDenominator\"),\n  u64(\"swapFeeNumerator\"),\n  u64(\"swapFeeDenominator\"),\n  u64(\"baseNeedTakePnl\"),\n  u64(\"quoteNeedTakePnl\"),\n  u64(\"quoteTotalPnl\"),\n  u64(\"baseTotalPnl\"),\n  u64(\"poolOpenTime\"),\n  u64(\"punishPcAmount\"),\n  u64(\"punishCoinAmount\"),\n  u64(\"orderbookToInitTime\"),\n  // u128('poolTotalDepositPc'),\n  // u128('poolTotalDepositCoin'),\n  u128(\"swapBaseInAmount\"),\n  u128(\"swapQuoteOutAmount\"),\n  u64(\"swapBase2QuoteFee\"),\n  u128(\"swapQuoteInAmount\"),\n  u128(\"swapBaseOutAmount\"),\n  u64(\"swapQuote2BaseFee\"),\n  // amm vault\n  publicKey(\"baseVault\"),\n  publicKey(\"quoteVault\"),\n  // mint\n  publicKey(\"baseMint\"),\n  publicKey(\"quoteMint\"),\n  publicKey(\"lpMint\"),\n  // market\n  publicKey(\"openOrders\"),\n  publicKey(\"marketId\"),\n  publicKey(\"marketProgramId\"),\n  publicKey(\"targetOrders\"),\n  publicKey(\"withdrawQueue\"),\n  publicKey(\"lpVault\"),\n  publicKey(\"owner\"),\n  // true circulating supply without lock up\n  u64(\"lpReserve\"),\n  seq(u64(), 3, \"padding\"),\n]);\n\nexport type LiquidityStateLayoutV4 = typeof liquidityStateV4Layout;\nexport type LiquidityStateV4 = GetStructureSchema<LiquidityStateLayoutV4>;\n\nexport const liquidityStateV5Layout = struct([\n  u64(\"accountType\"),\n  u64(\"status\"),\n  u64(\"nonce\"),\n  u64(\"maxOrder\"),\n  u64(\"depth\"),\n  u64(\"baseDecimal\"),\n  u64(\"quoteDecimal\"),\n  u64(\"state\"),\n  u64(\"resetFlag\"),\n  u64(\"minSize\"),\n  u64(\"volMaxCutRatio\"),\n  u64(\"amountWaveRatio\"),\n  u64(\"baseLotSize\"),\n  u64(\"quoteLotSize\"),\n  u64(\"minPriceMultiplier\"),\n  u64(\"maxPriceMultiplier\"),\n  u64(\"systemDecimalsValue\"),\n  u64(\"abortTradeFactor\"),\n  u64(\"priceTickMultiplier\"),\n  u64(\"priceTick\"),\n  // Fees\n  u64(\"minSeparateNumerator\"),\n  u64(\"minSeparateDenominator\"),\n  u64(\"tradeFeeNumerator\"),\n  u64(\"tradeFeeDenominator\"),\n  u64(\"pnlNumerator\"),\n  u64(\"pnlDenominator\"),\n  u64(\"swapFeeNumerator\"),\n  u64(\"swapFeeDenominator\"),\n  // OutPutData\n  u64(\"baseNeedTakePnl\"),\n  u64(\"quoteNeedTakePnl\"),\n  u64(\"quoteTotalPnl\"),\n  u64(\"baseTotalPnl\"),\n  u64(\"poolOpenTime\"),\n  u64(\"punishPcAmount\"),\n  u64(\"punishCoinAmount\"),\n  u64(\"orderbookToInitTime\"),\n  u128(\"swapBaseInAmount\"),\n  u128(\"swapQuoteOutAmount\"),\n  u128(\"swapQuoteInAmount\"),\n  u128(\"swapBaseOutAmount\"),\n  u64(\"swapQuote2BaseFee\"),\n  u64(\"swapBase2QuoteFee\"),\n\n  publicKey(\"baseVault\"),\n  publicKey(\"quoteVault\"),\n  publicKey(\"baseMint\"),\n  publicKey(\"quoteMint\"),\n  publicKey(\"lpMint\"),\n\n  publicKey(\"modelDataAccount\"),\n  publicKey(\"openOrders\"),\n  publicKey(\"marketId\"),\n  publicKey(\"marketProgramId\"),\n  publicKey(\"targetOrders\"),\n  publicKey(\"owner\"),\n  seq(u64(), 64, \"padding\"),\n]);\n\nexport const addLiquidityLayout = struct([\n  u8(\"instruction\"),\n  u64(\"baseAmountIn\"),\n  u64(\"quoteAmountIn\"),\n  u64(\"fixedSide\"),\n]);\n\nexport const removeLiquidityLayout = struct([u8(\"instruction\"), u64(\"amountIn\")]);\n\nexport type LiquidityStateLayoutV5 = typeof liquidityStateV5Layout;\nexport type LiquidityStateV5 = GetStructureSchema<LiquidityStateLayoutV5>;\n\nexport type LiquidityState = LiquidityStateV4 | LiquidityStateV5;\nexport type LiquidityStateLayout = LiquidityStateLayoutV4 | LiquidityStateLayoutV5;\n\n/* ================= index ================= */\n// version => liquidity state layout\nexport const LIQUIDITY_VERSION_TO_STATE_LAYOUT: {\n  [version: number]: LiquidityStateLayout;\n} = {\n  4: liquidityStateV4Layout,\n  5: liquidityStateV5Layout,\n};\nexport const createPoolFeeLayout = struct([u64(\"fee\")]);\n","import { Connection, PublicKey } from \"@solana/web3.js\";\n\nimport { seq, struct, u64 } from \"@/marshmallow\";\n\nexport const MODEL_DATA_PUBKEY = new PublicKey(\"CDSr3ssLcRB6XYPJwAfFt18MZvEZp4LjHcvzBVZ45duo\");\nconst ELEMENT_SIZE = 50000;\n\nexport const DataElement = struct([u64(\"x\"), u64(\"y\"), u64(\"price\")]);\n\nexport const modelDataInfoLayout = struct([\n  u64(\"accountType\"),\n  u64(\"status\"),\n  u64(\"multiplier\"),\n  u64(\"validDataCount\"),\n  seq(DataElement, ELEMENT_SIZE, \"DataElement\"),\n]);\n\nexport interface StableModelLayout {\n  accountType: number;\n  status: number;\n  multiplier: number;\n  validDataCount: number;\n  DataElement: { x: number; y: number; price: number }[];\n}\n\nfunction estimateRangeByXyReal(_xReal: number, _yReal: number): number[] {\n  return [0, ELEMENT_SIZE - 2];\n}\n\nfunction estimateRangeByX(_x: number): number[] {\n  return [0, ELEMENT_SIZE - 2];\n}\n\nfunction estimateRangeByY(_y: number): number[] {\n  return [0, ELEMENT_SIZE - 2];\n}\n\nfunction getMininumRangeByXyReal(\n  layoutData: StableModelLayout,\n  xReal: number,\n  yReal: number,\n): [number, number, boolean] {\n  const [min, max] = estimateRangeByXyReal(xReal, yReal);\n  let minRangeIdx = min;\n  let maxRangeIdx = max;\n  let mid = 0;\n  const target = (xReal * layoutData.multiplier) / yReal;\n  while (minRangeIdx <= maxRangeIdx) {\n    mid = Math.floor((maxRangeIdx + minRangeIdx) / 2);\n    if (mid === 0 || mid >= ELEMENT_SIZE - 2) {\n      return [mid, mid, false];\n    }\n    const cur = (layoutData.DataElement[mid].x * layoutData.multiplier) / layoutData.DataElement[mid].y;\n    const left = (layoutData.DataElement[mid - 1].x * layoutData.multiplier) / layoutData.DataElement[mid - 1].y;\n    const right = (layoutData.DataElement[mid + 1].x * layoutData.multiplier) / layoutData.DataElement[mid + 1].y;\n\n    if (target === cur) {\n      return [mid, mid, true];\n    } else if (target === left) {\n      return [mid - 1, mid - 1, true];\n    } else if (target === right) {\n      return [mid + 1, mid + 1, true];\n    } else if (target < left) {\n      maxRangeIdx = mid - 1;\n    } else if (target > left && target < cur) {\n      return [mid - 1, mid, true];\n    } else if (target > cur && target < right) {\n      return [mid, mid + 1, true];\n    } else {\n      minRangeIdx = mid + 1;\n    }\n  }\n  return [mid, mid, false];\n}\nfunction getRatio(layoutData: StableModelLayout, xReal: number, yReal: number): number {\n  const [minRangeIdx, maxRangeIdx, find] = getMininumRangeByXyReal(layoutData, xReal, yReal);\n\n  if (!find) {\n    return 0;\n  }\n\n  if (minRangeIdx === maxRangeIdx) {\n    const x = layoutData.DataElement[minRangeIdx].x;\n    const ratio = (xReal * layoutData.multiplier) / x;\n    return ratio;\n  } else {\n    const x1 = layoutData.DataElement[minRangeIdx].x;\n    const y1 = layoutData.DataElement[minRangeIdx].y;\n    const x2 = layoutData.DataElement[maxRangeIdx].x;\n    const y2 = layoutData.DataElement[maxRangeIdx].y;\n\n    const xDenominator = yReal * (x2 * y1 - x1 * y2);\n    const xNumerator1 = x1 * xDenominator;\n    const xNumerator2 = (x2 - x1) * (xReal * y1 - x1 * yReal) * y2;\n\n    const xNumerator = xNumerator1 + xNumerator2;\n    const ratio = (xReal * layoutData.multiplier * xDenominator) / xNumerator;\n    return ratio;\n  }\n}\n\nfunction realToTable(layoutData: StableModelLayout, realValue: number, ratio: number): number {\n  return (realValue * layoutData.multiplier) / ratio;\n}\n\nfunction tableToReal(layoutData: StableModelLayout, tableValue: number, ratio: number): number {\n  return (tableValue * ratio) / layoutData.multiplier;\n}\n\nfunction getMinimumRangeByX(layoutData: StableModelLayout, x: number): [number, number, boolean] {\n  const [min, max] = estimateRangeByX(x);\n  let minRangeIdx = min;\n  let maxRangeIdx = max;\n  let mid = 0;\n  const target = x;\n  while (minRangeIdx < maxRangeIdx) {\n    mid = Math.floor((maxRangeIdx + minRangeIdx) / 2);\n\n    if (mid <= 0 || mid > ELEMENT_SIZE - 2) {\n      return [mid, mid, false];\n    }\n    const cur = layoutData.DataElement[mid].x;\n    const left = layoutData.DataElement[mid - 1].x;\n    const right = layoutData.DataElement[mid + 1].x;\n\n    if (target === cur) return [mid, mid, true];\n    else if (target === left) return [mid - 1, mid - 1, true];\n    else if (target === right) return [mid + 1, mid + 1, true];\n    else if (target < left) maxRangeIdx = mid - 1;\n    else if (target > left && target < cur) return [mid - 1, mid, true];\n    else if (target > cur && target < right) return [mid, mid + 1, true];\n    else minRangeIdx = mid + 1;\n  }\n  return [mid, mid, false];\n}\n\nfunction getMinimumRangeByY(layoutData: StableModelLayout, y: number): [number, number, boolean] {\n  const [min, max] = estimateRangeByY(y);\n  let minRangeIdx = min;\n  let maxRangeIdx = max;\n  let mid = 0;\n  const target = y;\n  while (minRangeIdx <= maxRangeIdx) {\n    mid = Math.floor((maxRangeIdx + minRangeIdx) / 2);\n    if (mid <= 0 || mid >= ELEMENT_SIZE - 2) {\n      return [mid, mid, false];\n    }\n\n    const cur = layoutData.DataElement[mid].y;\n    const left = layoutData.DataElement[mid - 1].y;\n    const right = layoutData.DataElement[mid + 1].y;\n    if (target === cur) return [mid, mid, true];\n    else if (target === left) return [mid - 1, mid - 1, true];\n    else if (target === right) return [mid + 1, mid + 1, true];\n    else if (target < right) {\n      minRangeIdx = mid + 1;\n    } else if (target < left && target > cur) return [mid - 1, mid, true];\n    else if (target < cur && target > right) return [mid, mid + 1, true];\n    else maxRangeIdx = mid - 1;\n  }\n  return [mid, mid, false];\n}\n\nfunction getDataByX(\n  layoutData: StableModelLayout,\n  x: number,\n  dx: number,\n  priceUp: boolean,\n): [number, number, boolean, boolean] {\n  const xWithDx = priceUp ? x + dx : x - dx;\n  const [minIdx, maxIdx, find] = getMinimumRangeByX(layoutData, xWithDx);\n  if (!find) return [0, 0, false, find];\n\n  if (minIdx === maxIdx) return [layoutData.DataElement[maxIdx].price, layoutData.DataElement[maxIdx].y, false, find];\n  else {\n    const x1 = layoutData.DataElement[minIdx].x;\n    const x2 = layoutData.DataElement[maxIdx].x;\n    const p1 = layoutData.DataElement[minIdx].price;\n    const p2 = layoutData.DataElement[maxIdx].price;\n    const y1 = layoutData.DataElement[minIdx].y;\n    const y2 = layoutData.DataElement[maxIdx].y;\n\n    if (x >= x1 && x <= x2) {\n      if (priceUp) return [p2, y2, true, find];\n      else return [p1, y1, true, find];\n    } else {\n      let p, y;\n      if (priceUp) {\n        p = p1 + ((p2 - p1) * (x - x1)) / (x2 - x1);\n        y = y1 - ((xWithDx - x1) * layoutData.multiplier) / p2;\n      } else {\n        p = p1 + ((p2 - p1) * (x - x1)) / (x2 - x1);\n        y = y2 + ((x2 - xWithDx) * layoutData.multiplier) / p1;\n      }\n      return [p, y, false, find];\n    }\n  }\n}\n\nfunction getDataByY(\n  layoutData: StableModelLayout,\n  y: number,\n  dy: number,\n  priceUp: boolean,\n): [number, number, boolean, boolean] {\n  const yWithDy = priceUp ? y - dy : y + dy;\n  const [minIdx, maxIdx, find] = getMinimumRangeByY(layoutData, yWithDy);\n  if (!find) return [0, 0, false, find];\n  if (minIdx === maxIdx) return [layoutData.DataElement[maxIdx].price, layoutData.DataElement[maxIdx].x, false, find];\n  else {\n    const x1 = layoutData.DataElement[minIdx].x;\n    const x2 = layoutData.DataElement[maxIdx].x;\n    const p1 = layoutData.DataElement[minIdx].price;\n    const p2 = layoutData.DataElement[maxIdx].price;\n    const y1 = layoutData.DataElement[minIdx].y;\n    const y2 = layoutData.DataElement[maxIdx].y;\n\n    if (y >= y2 && y <= y1) {\n      return priceUp ? [p2, x2, true, find] : [p1, x1, true, find];\n    } else {\n      let p, x;\n      if (priceUp) {\n        p = p1 + ((p2 - p1) * (y1 - y)) / (y1 - y2);\n        x = x1 + (p2 * (y1 - yWithDy)) / layoutData.multiplier;\n      } else {\n        p = p1 + ((p2 - p1) * (y1 - y)) / (y1 - y2);\n        x = x2 - (p1 * (yWithDy - y2)) / layoutData.multiplier;\n      }\n      return [p, x, false, find];\n    }\n  }\n}\n\nfunction getMidPrice(layoutData: StableModelLayout, x: number): number {\n  const ret = getDataByX(layoutData, x, 0, false);\n  if (ret[3]) return ret[0];\n  else return 0;\n}\n\nexport function getDyByDxBaseIn(layoutData: StableModelLayout, xReal: number, yReal: number, dxReal: number): number {\n  const ratio = getRatio(layoutData, xReal, yReal);\n  const x = realToTable(layoutData, xReal, ratio);\n  const y = realToTable(layoutData, yReal, ratio);\n  const dx = realToTable(layoutData, dxReal, ratio);\n  const priceUp = true;\n  const [p, y2, lessTrade, find] = getDataByX(layoutData, x, dx, priceUp);\n  if (!find) return 0;\n  if (lessTrade) {\n    const dyReal = (dxReal * layoutData.multiplier) / p;\n    return dyReal;\n  } else {\n    const dy = y - y2;\n    const dyReal = tableToReal(layoutData, dy, ratio);\n    return dyReal;\n  }\n}\n\nexport function getDxByDyBaseIn(layoutData: StableModelLayout, xReal: number, yReal: number, dyReal: number): number {\n  const ratio = getRatio(layoutData, xReal, yReal);\n  const x = realToTable(layoutData, xReal, ratio);\n  const y = realToTable(layoutData, yReal, ratio);\n  const dy = realToTable(layoutData, dyReal, ratio);\n  const priceUp = false;\n  const [p, x2, lessTrade, find] = getDataByY(layoutData, y, dy, priceUp);\n  if (!find) return 0;\n  if (lessTrade) {\n    const dxReal = (dyReal * p) / layoutData.multiplier;\n    return dxReal;\n  } else {\n    const dx = x - x2;\n    const dxReal = tableToReal(layoutData, dx, ratio);\n    return dxReal;\n  }\n}\n\nexport function formatLayout(buffer: Buffer): StableModelLayout {\n  const layoutInfo = modelDataInfoLayout.decode(buffer);\n  return {\n    accountType: layoutInfo.accountType.toNumber(),\n    status: layoutInfo.status.toNumber(),\n    multiplier: layoutInfo.multiplier.toNumber(),\n    validDataCount: layoutInfo.validDataCount.toNumber(),\n    DataElement: layoutInfo.DataElement.map((item: any) => ({\n      x: item.x.toNumber(),\n      y: item.y.toNumber(),\n      price: item.price.toNumber(),\n    })),\n  };\n}\n\nexport function getStablePrice(\n  layoutData: StableModelLayout,\n  coinReal: number,\n  pcReal: number,\n  baseCoin: boolean,\n): number {\n  const price =\n    getMidPrice(layoutData, realToTable(layoutData, coinReal, getRatio(layoutData, coinReal, pcReal))) /\n    layoutData.multiplier;\n  return baseCoin ? price : 1 / price;\n}\n\nexport class StableLayout {\n  private readonly connection: Connection;\n  private _layoutData: StableModelLayout = {\n    accountType: 0,\n    status: 0,\n    multiplier: 0,\n    validDataCount: 0,\n    DataElement: [],\n  };\n\n  constructor({ connection }: { connection: Connection }) {\n    this.connection = connection;\n  }\n\n  get stableModelData(): StableModelLayout {\n    return this._layoutData;\n  }\n\n  public async initStableModelLayout(): Promise<void> {\n    if (this._layoutData.validDataCount === 0) {\n      if (this.connection) {\n        const acc = await this.connection.getAccountInfo(MODEL_DATA_PUBKEY);\n        if (acc) this._layoutData = formatLayout(acc?.data);\n      }\n    }\n  }\n}\n","import { TOKEN_PROGRAM_ID, TOKEN_2022_PROGRAM_ID, ASSOCIATED_TOKEN_PROGRAM_ID } from \"@solana/spl-token\";\nimport { PublicKey, TransactionInstruction, SystemProgram, Connection, Keypair, Signer } from \"@solana/web3.js\";\nimport BN from \"bn.js\";\nimport {\n  createLogger,\n  parseBigNumberish,\n  RENT_PROGRAM_ID,\n  METADATA_PROGRAM_ID,\n  InstructionType,\n  getATAAddress,\n  MEMO_PROGRAM_ID,\n} from \"@/common\";\nimport { bool, s32, struct, u128, u64, u8 } from \"@/marshmallow\";\nimport {\n  ReturnTypeMakeInstructions,\n  ClmmPoolPersonalPosition,\n  OpenPositionFromLiquidityExtInfo,\n  ManipulateLiquidityExtInfo,\n  ClosePositionExtInfo,\n  InitRewardExtInfo,\n  OpenPositionFromBaseExtInfo,\n} from \"./type\";\nimport { ClmmPositionLayout, ObservationInfoLayout } from \"./layout\";\nimport {\n  getPdaPoolId,\n  getPdaPoolVaultId,\n  getPdaTickArrayAddress,\n  getPdaMetadataKey,\n  getPdaProtocolPositionAddress,\n  getPdaPersonalPositionAddress,\n  getPdaOperationAccount,\n  getPdaExBitmapAccount,\n  getPdaPoolRewardVaulId,\n} from \"./utils/pda\";\nimport { TickUtils } from \"./utils/tick\";\nimport { PoolUtils } from \"./utils/pool\";\nimport { generatePubKey } from \"../account/util\";\nimport { ApiV3Token, ApiV3PoolInfoConcentratedItem, ClmmKeys } from \"@/api/type\";\n\nconst logger = createLogger(\"Raydium_Clmm\");\n\nconst anchorDataBuf = {\n  createPool: [233, 146, 209, 142, 207, 104, 64, 188],\n  initReward: [95, 135, 192, 196, 242, 129, 230, 68],\n  setRewardEmissions: [112, 52, 167, 75, 32, 201, 211, 137],\n  openPosition: [77, 184, 74, 214, 112, 86, 241, 199],\n  closePosition: [123, 134, 81, 0, 49, 68, 98, 98],\n  increaseLiquidity: [133, 29, 89, 223, 69, 238, 176, 10],\n  decreaseLiquidity: [58, 127, 188, 62, 79, 82, 196, 96],\n  swap: [43, 4, 237, 11, 26, 201, 30, 98], // [248, 198, 158, 145, 225, 117, 135, 200],\n  collectReward: [18, 237, 166, 197, 34, 16, 213, 144],\n};\n\ninterface CreatePoolInstruction {\n  connection: Connection;\n  programId: PublicKey;\n  owner: PublicKey;\n  mintA: ApiV3Token;\n  mintB: ApiV3Token;\n  ammConfigId: PublicKey;\n  initialPriceX64: BN;\n  startTime: BN;\n  forerunCreate?: boolean;\n}\n\nexport class ClmmInstrument {\n  static createPoolInstruction(\n    programId: PublicKey,\n    poolId: PublicKey,\n    poolCreator: PublicKey,\n    ammConfigId: PublicKey,\n    observationId: PublicKey,\n    mintA: PublicKey,\n    mintVaultA: PublicKey,\n    mintProgramIdA: PublicKey,\n    mintB: PublicKey,\n    mintVaultB: PublicKey,\n    mintProgramIdB: PublicKey,\n    exTickArrayBitmap: PublicKey,\n    sqrtPriceX64: BN,\n    startTime: BN,\n  ): TransactionInstruction {\n    const dataLayout = struct([u128(\"sqrtPriceX64\"), u64(\"startTime\")]);\n\n    const keys = [\n      { pubkey: poolCreator, isSigner: true, isWritable: true },\n      { pubkey: ammConfigId, isSigner: false, isWritable: false },\n      { pubkey: poolId, isSigner: false, isWritable: true },\n      { pubkey: mintA, isSigner: false, isWritable: false },\n      { pubkey: mintB, isSigner: false, isWritable: false },\n      { pubkey: mintVaultA, isSigner: false, isWritable: true },\n      { pubkey: mintVaultB, isSigner: false, isWritable: true },\n      { pubkey: observationId, isSigner: false, isWritable: false },\n      { pubkey: exTickArrayBitmap, isSigner: false, isWritable: true },\n      { pubkey: mintProgramIdA, isSigner: false, isWritable: false },\n      { pubkey: mintProgramIdB, isSigner: false, isWritable: false },\n      { pubkey: SystemProgram.programId, isSigner: false, isWritable: false },\n      { pubkey: RENT_PROGRAM_ID, isSigner: false, isWritable: false },\n    ];\n\n    const data = Buffer.alloc(dataLayout.span);\n    dataLayout.encode(\n      {\n        sqrtPriceX64,\n        startTime,\n      },\n      data,\n    );\n    const aData = Buffer.from([...anchorDataBuf.createPool, ...data]);\n\n    return new TransactionInstruction({\n      keys,\n      programId,\n      data: aData,\n    });\n  }\n\n  static async createPoolInstructions(props: CreatePoolInstruction): Promise<\n    ReturnTypeMakeInstructions<{\n      poolId: PublicKey;\n      observationId: PublicKey;\n      mintAVault: PublicKey;\n      mintBVault: PublicKey;\n    }>\n  > {\n    const { connection, programId, owner, mintA, mintB, ammConfigId, initialPriceX64, startTime, forerunCreate } =\n      props;\n    const observationId = generatePubKey({ fromPublicKey: owner, programId });\n    const [mintAAddress, mintBAddress] = [new PublicKey(mintA.address), new PublicKey(mintB.address)];\n    const ins = [\n      SystemProgram.createAccountWithSeed({\n        fromPubkey: owner,\n        basePubkey: owner,\n        seed: observationId.seed,\n        newAccountPubkey: observationId.publicKey,\n        lamports: forerunCreate ? 0 : await connection.getMinimumBalanceForRentExemption(ObservationInfoLayout.span),\n        space: ObservationInfoLayout.span,\n        programId,\n      }),\n    ];\n\n    const { publicKey: poolId } = getPdaPoolId(programId, ammConfigId, mintAAddress, mintBAddress);\n    const { publicKey: mintAVault } = getPdaPoolVaultId(programId, poolId, mintAAddress);\n    const { publicKey: mintBVault } = getPdaPoolVaultId(programId, poolId, mintBAddress);\n\n    ins.push(\n      this.createPoolInstruction(\n        programId,\n        poolId,\n        owner,\n        ammConfigId,\n        observationId.publicKey,\n        mintAAddress,\n        mintAVault,\n        new PublicKey(mintA.programId || TOKEN_PROGRAM_ID),\n        mintBAddress,\n        mintBVault,\n        new PublicKey(mintB.programId || TOKEN_PROGRAM_ID),\n        getPdaExBitmapAccount(programId, poolId).publicKey,\n        initialPriceX64,\n        startTime,\n      ),\n    );\n\n    return {\n      signers: [],\n      instructions: ins,\n      instructionTypes: [InstructionType.CreateAccount, InstructionType.ClmmCreatePool],\n      address: { poolId, observationId: observationId.publicKey, mintAVault, mintBVault },\n      lookupTableAddress: [],\n    };\n  }\n\n  static openPositionFromLiquidityInstruction(\n    programId: PublicKey,\n    payer: PublicKey,\n    poolId: PublicKey,\n    positionNftOwner: PublicKey,\n    positionNftMint: PublicKey,\n    positionNftAccount: PublicKey,\n    metadataAccount: PublicKey,\n    protocolPosition: PublicKey,\n    tickArrayLower: PublicKey,\n    tickArrayUpper: PublicKey,\n    personalPosition: PublicKey,\n    ownerTokenAccountA: PublicKey,\n    ownerTokenAccountB: PublicKey,\n    tokenVaultA: PublicKey,\n    tokenVaultB: PublicKey,\n    tokenMintA: PublicKey,\n    tokenMintB: PublicKey,\n\n    tickLowerIndex: number,\n    tickUpperIndex: number,\n    tickArrayLowerStartIndex: number,\n    tickArrayUpperStartIndex: number,\n    liquidity: BN,\n    amountMaxA: BN,\n    amountMaxB: BN,\n    withMetadata: \"create\" | \"no-create\",\n\n    exTickArrayBitmap?: PublicKey,\n  ): TransactionInstruction {\n    const dataLayout = struct([\n      s32(\"tickLowerIndex\"),\n      s32(\"tickUpperIndex\"),\n      s32(\"tickArrayLowerStartIndex\"),\n      s32(\"tickArrayUpperStartIndex\"),\n      u128(\"liquidity\"),\n      u64(\"amountMaxA\"),\n      u64(\"amountMaxB\"),\n      bool(\"withMetadata\"),\n      u8(\"optionBaseFlag\"),\n      bool(\"baseFlag\"),\n    ]);\n\n    const remainingAccounts = [\n      ...(exTickArrayBitmap ? [{ pubkey: exTickArrayBitmap, isSigner: false, isWritable: true }] : []),\n    ];\n\n    const keys = [\n      { pubkey: payer, isSigner: true, isWritable: true },\n      { pubkey: positionNftOwner, isSigner: false, isWritable: false },\n      { pubkey: positionNftMint, isSigner: true, isWritable: true },\n      { pubkey: positionNftAccount, isSigner: false, isWritable: true },\n      { pubkey: metadataAccount, isSigner: false, isWritable: true },\n      { pubkey: poolId, isSigner: false, isWritable: true },\n      { pubkey: protocolPosition, isSigner: false, isWritable: true },\n      { pubkey: tickArrayLower, isSigner: false, isWritable: true },\n      { pubkey: tickArrayUpper, isSigner: false, isWritable: true },\n      { pubkey: personalPosition, isSigner: false, isWritable: true },\n      { pubkey: ownerTokenAccountA, isSigner: false, isWritable: true },\n      { pubkey: ownerTokenAccountB, isSigner: false, isWritable: true },\n      { pubkey: tokenVaultA, isSigner: false, isWritable: true },\n      { pubkey: tokenVaultB, isSigner: false, isWritable: true },\n\n      { pubkey: RENT_PROGRAM_ID, isSigner: false, isWritable: false },\n      { pubkey: SystemProgram.programId, isSigner: false, isWritable: false },\n      { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },\n      { pubkey: ASSOCIATED_TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },\n      { pubkey: METADATA_PROGRAM_ID, isSigner: false, isWritable: false },\n      { pubkey: TOKEN_2022_PROGRAM_ID, isSigner: false, isWritable: false },\n\n      { pubkey: tokenMintA, isSigner: false, isWritable: false },\n      { pubkey: tokenMintB, isSigner: false, isWritable: false },\n\n      ...remainingAccounts,\n    ];\n\n    const data = Buffer.alloc(dataLayout.span);\n    dataLayout.encode(\n      {\n        tickLowerIndex,\n        tickUpperIndex,\n        tickArrayLowerStartIndex,\n        tickArrayUpperStartIndex,\n        liquidity,\n        amountMaxA,\n        amountMaxB,\n        withMetadata: withMetadata === \"create\",\n        baseFlag: false,\n        optionBaseFlag: 0,\n      },\n      data,\n    );\n\n    const aData = Buffer.from([...anchorDataBuf.openPosition, ...data]);\n\n    return new TransactionInstruction({\n      keys,\n      programId,\n      data: aData,\n    });\n  }\n\n  static async openPositionInstructions({\n    poolInfo,\n    poolKeys,\n    ownerInfo,\n    tickLower,\n    tickUpper,\n    liquidity,\n    amountMaxA,\n    amountMaxB,\n    withMetadata,\n    getEphemeralSigners,\n  }: {\n    poolInfo: ApiV3PoolInfoConcentratedItem;\n    poolKeys: ClmmKeys;\n    ownerInfo: {\n      feePayer: PublicKey;\n      wallet: PublicKey;\n      tokenAccountA: PublicKey;\n      tokenAccountB: PublicKey;\n    };\n\n    tickLower: number;\n    tickUpper: number;\n    liquidity: BN;\n    amountMaxA: BN;\n    amountMaxB: BN;\n    withMetadata: \"create\" | \"no-create\";\n    getEphemeralSigners?: (k: number) => any;\n  }): Promise<ReturnTypeMakeInstructions> {\n    const signers: Signer[] = [];\n    const [programId, id] = [new PublicKey(poolInfo.programId), new PublicKey(poolInfo.id)];\n\n    let nftMintAccount;\n    if (getEphemeralSigners) {\n      nftMintAccount = new PublicKey((await getEphemeralSigners(1))[0]);\n    } else {\n      const _k = Keypair.generate();\n      signers.push(_k);\n      nftMintAccount = _k.publicKey;\n    }\n\n    const tickArrayLowerStartIndex = TickUtils.getTickArrayStartIndexByTick(tickLower, poolInfo.config.tickSpacing);\n    const tickArrayUpperStartIndex = TickUtils.getTickArrayStartIndexByTick(tickUpper, poolInfo.config.tickSpacing);\n\n    const { publicKey: tickArrayLower } = getPdaTickArrayAddress(programId, id, tickArrayLowerStartIndex);\n    const { publicKey: tickArrayUpper } = getPdaTickArrayAddress(programId, id, tickArrayUpperStartIndex);\n\n    const { publicKey: positionNftAccount } = getATAAddress(ownerInfo.wallet, nftMintAccount, TOKEN_PROGRAM_ID);\n    const { publicKey: metadataAccount } = getPdaMetadataKey(nftMintAccount);\n    const { publicKey: personalPosition } = getPdaPersonalPositionAddress(programId, nftMintAccount);\n    const { publicKey: protocolPosition } = getPdaProtocolPositionAddress(programId, id, tickLower, tickUpper);\n\n    const ins = this.openPositionFromLiquidityInstruction(\n      programId,\n      ownerInfo.feePayer,\n      id,\n      ownerInfo.wallet,\n      nftMintAccount,\n      positionNftAccount,\n      metadataAccount,\n      protocolPosition,\n      tickArrayLower,\n      tickArrayUpper,\n      personalPosition,\n      ownerInfo.tokenAccountA,\n      ownerInfo.tokenAccountB,\n      new PublicKey(poolKeys.vault.A),\n      new PublicKey(poolKeys.vault.B),\n      new PublicKey(poolInfo.mintA.address),\n      new PublicKey(poolInfo.mintB.address),\n\n      tickLower,\n      tickUpper,\n      tickArrayLowerStartIndex,\n      tickArrayUpperStartIndex,\n      liquidity,\n      amountMaxA,\n      amountMaxB,\n      withMetadata,\n    );\n\n    return {\n      signers,\n      instructions: [ins],\n      instructionTypes: [InstructionType.ClmmOpenPosition],\n      lookupTableAddress: poolKeys.lookupTableAccount ? [poolKeys.lookupTableAccount] : [],\n      address: {\n        nftMint: nftMintAccount,\n        tickArrayLower,\n        tickArrayUpper,\n        positionNftAccount,\n        metadataAccount,\n        personalPosition,\n        protocolPosition,\n      },\n    };\n  }\n\n  static async openPositionFromBaseInstructions({\n    poolInfo,\n    poolKeys,\n    ownerInfo,\n    tickLower,\n    tickUpper,\n    base,\n    baseAmount,\n    otherAmountMax,\n    withMetadata,\n    getEphemeralSigners,\n  }: {\n    poolInfo: ApiV3PoolInfoConcentratedItem;\n    poolKeys: ClmmKeys;\n    ownerInfo: {\n      feePayer: PublicKey;\n      wallet: PublicKey;\n      tokenAccountA: PublicKey;\n      tokenAccountB: PublicKey;\n    };\n\n    tickLower: number;\n    tickUpper: number;\n\n    base: \"MintA\" | \"MintB\";\n    baseAmount: BN;\n\n    otherAmountMax: BN;\n    withMetadata: \"create\" | \"no-create\";\n    getEphemeralSigners?: (k: number) => any;\n  }): Promise<ReturnTypeMakeInstructions<OpenPositionFromBaseExtInfo>> {\n    const signers: Signer[] = [];\n    const [programId, id] = [new PublicKey(poolInfo.programId), new PublicKey(poolInfo.id)];\n\n    let nftMintAccount: PublicKey;\n    if (getEphemeralSigners) {\n      nftMintAccount = new PublicKey((await getEphemeralSigners(1))[0]);\n    } else {\n      const _k = Keypair.generate();\n      signers.push(_k);\n      nftMintAccount = _k.publicKey;\n    }\n\n    const tickArrayLowerStartIndex = TickUtils.getTickArrayStartIndexByTick(tickLower, poolInfo.config.tickSpacing);\n    const tickArrayUpperStartIndex = TickUtils.getTickArrayStartIndexByTick(tickUpper, poolInfo.config.tickSpacing);\n\n    const { publicKey: tickArrayLower } = getPdaTickArrayAddress(programId, id, tickArrayLowerStartIndex);\n    const { publicKey: tickArrayUpper } = getPdaTickArrayAddress(programId, id, tickArrayUpperStartIndex);\n\n    const { publicKey: positionNftAccount } = getATAAddress(ownerInfo.wallet, nftMintAccount, TOKEN_PROGRAM_ID);\n    const { publicKey: metadataAccount } = getPdaMetadataKey(nftMintAccount);\n    const { publicKey: personalPosition } = getPdaPersonalPositionAddress(programId, nftMintAccount);\n    const { publicKey: protocolPosition } = getPdaProtocolPositionAddress(programId, id, tickLower, tickUpper);\n\n    const ins = this.openPositionFromBaseInstruction(\n      programId,\n      ownerInfo.feePayer,\n      id,\n      ownerInfo.wallet,\n      nftMintAccount,\n      positionNftAccount,\n      metadataAccount,\n      protocolPosition,\n      tickArrayLower,\n      tickArrayUpper,\n      personalPosition,\n      ownerInfo.tokenAccountA,\n      ownerInfo.tokenAccountB,\n      new PublicKey(poolKeys.vault.A),\n      new PublicKey(poolKeys.vault.B),\n      new PublicKey(poolInfo.mintA.address),\n      new PublicKey(poolInfo.mintB.address),\n\n      tickLower,\n      tickUpper,\n      tickArrayLowerStartIndex,\n      tickArrayUpperStartIndex,\n\n      withMetadata,\n\n      base,\n      baseAmount,\n\n      otherAmountMax,\n      PoolUtils.isOverflowDefaultTickarrayBitmap(poolInfo.config.tickSpacing, [\n        tickArrayLowerStartIndex,\n        tickArrayUpperStartIndex,\n      ])\n        ? getPdaExBitmapAccount(programId, id).publicKey\n        : undefined,\n    );\n\n    return {\n      address: {\n        nftMint: nftMintAccount,\n        tickArrayLower,\n        tickArrayUpper,\n        positionNftAccount,\n        metadataAccount,\n        personalPosition,\n        protocolPosition,\n      },\n      instructions: [ins],\n      signers,\n      instructionTypes: [InstructionType.ClmmOpenPosition],\n      lookupTableAddress: poolKeys.lookupTableAccount ? [poolKeys.lookupTableAccount] : [],\n    };\n  }\n\n  static openPositionFromBaseInstruction(\n    programId: PublicKey,\n    payer: PublicKey,\n    poolId: PublicKey,\n    positionNftOwner: PublicKey,\n    positionNftMint: PublicKey,\n    positionNftAccount: PublicKey,\n    metadataAccount: PublicKey,\n    protocolPosition: PublicKey,\n    tickArrayLower: PublicKey,\n    tickArrayUpper: PublicKey,\n    personalPosition: PublicKey,\n    ownerTokenAccountA: PublicKey,\n    ownerTokenAccountB: PublicKey,\n    tokenVaultA: PublicKey,\n    tokenVaultB: PublicKey,\n    tokenMintA: PublicKey,\n    tokenMintB: PublicKey,\n\n    tickLowerIndex: number,\n    tickUpperIndex: number,\n    tickArrayLowerStartIndex: number,\n    tickArrayUpperStartIndex: number,\n\n    withMetadata: \"create\" | \"no-create\",\n    base: \"MintA\" | \"MintB\",\n    baseAmount: BN,\n\n    otherAmountMax: BN,\n\n    exTickArrayBitmap?: PublicKey,\n  ): TransactionInstruction {\n    const dataLayout = struct([\n      s32(\"tickLowerIndex\"),\n      s32(\"tickUpperIndex\"),\n      s32(\"tickArrayLowerStartIndex\"),\n      s32(\"tickArrayUpperStartIndex\"),\n      u128(\"liquidity\"),\n      u64(\"amountMaxA\"),\n      u64(\"amountMaxB\"),\n      bool(\"withMetadata\"),\n      u8(\"optionBaseFlag\"),\n      bool(\"baseFlag\"),\n    ]);\n\n    const remainingAccounts = [\n      ...(exTickArrayBitmap ? [{ pubkey: exTickArrayBitmap, isSigner: false, isWritable: true }] : []),\n    ];\n\n    const keys = [\n      { pubkey: payer, isSigner: true, isWritable: true },\n      { pubkey: positionNftOwner, isSigner: false, isWritable: false },\n      { pubkey: positionNftMint, isSigner: true, isWritable: true },\n      { pubkey: positionNftAccount, isSigner: false, isWritable: true },\n      { pubkey: metadataAccount, isSigner: false, isWritable: true },\n      { pubkey: poolId, isSigner: false, isWritable: true },\n      { pubkey: protocolPosition, isSigner: false, isWritable: true },\n      { pubkey: tickArrayLower, isSigner: false, isWritable: true },\n      { pubkey: tickArrayUpper, isSigner: false, isWritable: true },\n      { pubkey: personalPosition, isSigner: false, isWritable: true },\n      { pubkey: ownerTokenAccountA, isSigner: false, isWritable: true },\n      { pubkey: ownerTokenAccountB, isSigner: false, isWritable: true },\n      { pubkey: tokenVaultA, isSigner: false, isWritable: true },\n      { pubkey: tokenVaultB, isSigner: false, isWritable: true },\n\n      { pubkey: RENT_PROGRAM_ID, isSigner: false, isWritable: false },\n      { pubkey: SystemProgram.programId, isSigner: false, isWritable: false },\n      { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },\n      { pubkey: ASSOCIATED_TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },\n      { pubkey: METADATA_PROGRAM_ID, isSigner: false, isWritable: false },\n      { pubkey: TOKEN_2022_PROGRAM_ID, isSigner: false, isWritable: false },\n\n      { pubkey: tokenMintA, isSigner: false, isWritable: false },\n      { pubkey: tokenMintB, isSigner: false, isWritable: false },\n\n      ...remainingAccounts,\n    ];\n\n    const data = Buffer.alloc(dataLayout.span);\n    dataLayout.encode(\n      {\n        tickLowerIndex,\n        tickUpperIndex,\n        tickArrayLowerStartIndex,\n        tickArrayUpperStartIndex,\n        liquidity: new BN(0),\n        amountMaxA: base === \"MintA\" ? baseAmount : otherAmountMax,\n        amountMaxB: base === \"MintA\" ? otherAmountMax : baseAmount,\n        withMetadata: withMetadata === \"create\",\n        baseFlag: base === \"MintA\",\n        optionBaseFlag: 1,\n      },\n      data,\n    );\n\n    const aData = Buffer.from([...anchorDataBuf.openPosition, ...data]);\n\n    return new TransactionInstruction({\n      keys,\n      programId,\n      data: aData,\n    });\n  }\n\n  static async openPositionFromLiquidityInstructions({\n    poolInfo,\n    poolKeys,\n    ownerInfo,\n    tickLower,\n    tickUpper,\n    liquidity,\n    amountMaxA,\n    amountMaxB,\n    withMetadata,\n    getEphemeralSigners,\n  }: {\n    poolInfo: ApiV3PoolInfoConcentratedItem;\n    poolKeys: ClmmKeys;\n    ownerInfo: {\n      wallet: PublicKey;\n      tokenAccountA: PublicKey;\n      tokenAccountB: PublicKey;\n    };\n\n    tickLower: number;\n    tickUpper: number;\n    liquidity: BN;\n    amountMaxA: BN;\n    amountMaxB: BN;\n    withMetadata: \"create\" | \"no-create\";\n    getEphemeralSigners?: (k: number) => any;\n  }): Promise<ReturnTypeMakeInstructions<OpenPositionFromLiquidityExtInfo[\"address\"]>> {\n    let nftMintAccount: PublicKey;\n    const signers: Keypair[] = [];\n    if (getEphemeralSigners) {\n      nftMintAccount = new PublicKey((await getEphemeralSigners(1))[0]);\n    } else {\n      const _k = Keypair.generate();\n      signers.push(_k);\n      nftMintAccount = _k.publicKey;\n    }\n\n    const [programId, id] = [new PublicKey(poolInfo.programId), new PublicKey(poolInfo.id)];\n\n    const tickArrayLowerStartIndex = TickUtils.getTickArrayStartIndexByTick(tickLower, poolInfo.config.tickSpacing);\n    const tickArrayUpperStartIndex = TickUtils.getTickArrayStartIndexByTick(tickUpper, poolInfo.config.tickSpacing);\n\n    const { publicKey: tickArrayLower } = getPdaTickArrayAddress(programId, id, tickArrayLowerStartIndex);\n    const { publicKey: tickArrayUpper } = getPdaTickArrayAddress(programId, id, tickArrayUpperStartIndex);\n\n    const { publicKey: positionNftAccount } = getATAAddress(ownerInfo.wallet, nftMintAccount, TOKEN_PROGRAM_ID);\n    const { publicKey: metadataAccount } = getPdaMetadataKey(nftMintAccount);\n    const { publicKey: personalPosition } = getPdaPersonalPositionAddress(programId, nftMintAccount);\n    const { publicKey: protocolPosition } = getPdaProtocolPositionAddress(programId, id, tickLower, tickUpper);\n\n    const ins = this.openPositionFromLiquidityInstruction(\n      programId,\n      ownerInfo.wallet,\n      id,\n      ownerInfo.wallet,\n      nftMintAccount,\n      positionNftAccount,\n      metadataAccount,\n      protocolPosition,\n      tickArrayLower,\n      tickArrayUpper,\n      personalPosition,\n      ownerInfo.tokenAccountA,\n      ownerInfo.tokenAccountB,\n      new PublicKey(poolKeys.vault.A),\n      new PublicKey(poolKeys.vault.B),\n      new PublicKey(poolKeys.mintA.address),\n      new PublicKey(poolKeys.mintB.address),\n\n      tickLower,\n      tickUpper,\n      tickArrayLowerStartIndex,\n      tickArrayUpperStartIndex,\n      liquidity,\n      amountMaxA,\n      amountMaxB,\n      withMetadata,\n      PoolUtils.isOverflowDefaultTickarrayBitmap(poolInfo.config.tickSpacing, [\n        tickArrayLowerStartIndex,\n        tickArrayUpperStartIndex,\n      ])\n        ? getPdaExBitmapAccount(programId, id).publicKey\n        : undefined,\n    );\n\n    return {\n      address: {\n        nftMint: nftMintAccount,\n        tickArrayLower,\n        tickArrayUpper,\n        positionNftAccount,\n        metadataAccount,\n        personalPosition,\n        protocolPosition,\n      },\n      instructions: [ins],\n      signers,\n      instructionTypes: [InstructionType.ClmmOpenPosition],\n      lookupTableAddress: poolKeys.lookupTableAccount ? [poolKeys.lookupTableAccount] : [],\n    };\n  }\n\n  static closePositionInstruction(\n    programId: PublicKey,\n    positionNftOwner: PublicKey,\n    positionNftMint: PublicKey,\n    positionNftAccount: PublicKey,\n    personalPosition: PublicKey,\n  ): TransactionInstruction {\n    const dataLayout = struct([]);\n\n    const keys = [\n      { pubkey: positionNftOwner, isSigner: true, isWritable: true },\n      { pubkey: positionNftMint, isSigner: false, isWritable: true },\n      { pubkey: positionNftAccount, isSigner: false, isWritable: true },\n      { pubkey: personalPosition, isSigner: false, isWritable: true },\n\n      { pubkey: SystemProgram.programId, isSigner: false, isWritable: false },\n      { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },\n    ];\n\n    const data = Buffer.alloc(dataLayout.span);\n    dataLayout.encode({}, data);\n\n    const aData = Buffer.from([...anchorDataBuf.closePosition, ...data]);\n\n    return new TransactionInstruction({\n      keys,\n      programId,\n      data: aData,\n    });\n  }\n\n  static closePositionInstructions({\n    poolInfo,\n    poolKeys,\n    ownerInfo,\n    ownerPosition,\n  }: {\n    poolInfo: ApiV3PoolInfoConcentratedItem;\n    poolKeys: ClmmKeys;\n    ownerPosition: ClmmPositionLayout;\n    ownerInfo: {\n      wallet: PublicKey;\n    };\n  }): ReturnTypeMakeInstructions<ClosePositionExtInfo[\"address\"]> {\n    const programId = new PublicKey(poolInfo.programId);\n    const { publicKey: positionNftAccount } = getATAAddress(ownerInfo.wallet, ownerPosition.nftMint, TOKEN_PROGRAM_ID);\n    const { publicKey: personalPosition } = getPdaPersonalPositionAddress(programId, ownerPosition.nftMint);\n\n    const ins: TransactionInstruction[] = [];\n    ins.push(\n      this.closePositionInstruction(\n        programId,\n        ownerInfo.wallet,\n        ownerPosition.nftMint,\n        positionNftAccount,\n        personalPosition,\n      ),\n    );\n\n    return {\n      address: {\n        positionNftAccount,\n        personalPosition,\n      },\n      signers: [],\n      instructions: ins,\n      instructionTypes: [InstructionType.ClmmClosePosition],\n      lookupTableAddress: poolKeys.lookupTableAccount ? [poolKeys.lookupTableAccount] : [],\n    };\n  }\n\n  static increasePositionFromLiquidityInstruction(\n    programId: PublicKey,\n    positionNftOwner: PublicKey,\n    positionNftAccount: PublicKey,\n    personalPosition: PublicKey,\n\n    poolId: PublicKey,\n    protocolPosition: PublicKey,\n    tickArrayLower: PublicKey,\n    tickArrayUpper: PublicKey,\n    ownerTokenAccountA: PublicKey,\n    ownerTokenAccountB: PublicKey,\n    mintVaultA: PublicKey,\n    mintVaultB: PublicKey,\n    mintMintA: PublicKey,\n    mintMintB: PublicKey,\n\n    liquidity: BN,\n    amountMaxA: BN,\n    amountMaxB: BN,\n\n    exTickArrayBitmap?: PublicKey,\n  ): TransactionInstruction {\n    const dataLayout = struct([\n      u128(\"liquidity\"),\n      u64(\"amountMaxA\"),\n      u64(\"amountMaxB\"),\n      u8(\"optionBaseFlag\"),\n      bool(\"baseFlag\"),\n    ]);\n\n    const remainingAccounts = [\n      ...(exTickArrayBitmap ? [{ pubkey: exTickArrayBitmap, isSigner: false, isWritable: true }] : []),\n    ];\n\n    const keys = [\n      { pubkey: positionNftOwner, isSigner: true, isWritable: false },\n      { pubkey: positionNftAccount, isSigner: false, isWritable: false },\n      { pubkey: poolId, isSigner: false, isWritable: true },\n      { pubkey: protocolPosition, isSigner: false, isWritable: true },\n      { pubkey: personalPosition, isSigner: false, isWritable: true },\n      { pubkey: tickArrayLower, isSigner: false, isWritable: true },\n      { pubkey: tickArrayUpper, isSigner: false, isWritable: true },\n      { pubkey: ownerTokenAccountA, isSigner: false, isWritable: true },\n      { pubkey: ownerTokenAccountB, isSigner: false, isWritable: true },\n      { pubkey: mintVaultA, isSigner: false, isWritable: true },\n      { pubkey: mintVaultB, isSigner: false, isWritable: true },\n\n      { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },\n      { pubkey: TOKEN_2022_PROGRAM_ID, isSigner: false, isWritable: false },\n\n      { pubkey: mintMintA, isSigner: false, isWritable: false },\n      { pubkey: mintMintB, isSigner: false, isWritable: false },\n\n      ...remainingAccounts,\n    ];\n\n    const data = Buffer.alloc(dataLayout.span);\n    dataLayout.encode(\n      {\n        liquidity,\n        amountMaxA,\n        amountMaxB,\n        optionBaseFlag: 0,\n        baseFlag: false,\n      },\n      data,\n    );\n\n    const aData = Buffer.from([...anchorDataBuf.increaseLiquidity, ...data]);\n\n    return new TransactionInstruction({\n      keys,\n      programId,\n      data: aData,\n    });\n  }\n\n  static increasePositionFromLiquidityInstructions({\n    poolInfo,\n    poolKeys,\n    ownerPosition,\n    ownerInfo,\n    liquidity,\n    amountMaxA,\n    amountMaxB,\n  }: {\n    poolInfo: ApiV3PoolInfoConcentratedItem;\n    poolKeys: ClmmKeys;\n    ownerPosition: ClmmPositionLayout;\n\n    ownerInfo: {\n      wallet: PublicKey;\n      tokenAccountA: PublicKey;\n      tokenAccountB: PublicKey;\n    };\n\n    liquidity: BN;\n    amountMaxA: BN;\n    amountMaxB: BN;\n  }): ReturnTypeMakeInstructions<ManipulateLiquidityExtInfo[\"address\"]> {\n    const [programId, id] = [new PublicKey(poolInfo.programId), new PublicKey(poolInfo.id)];\n    const tickArrayLowerStartIndex = TickUtils.getTickArrayStartIndexByTick(\n      ownerPosition.tickLower,\n      poolInfo.config.tickSpacing,\n    );\n    const tickArrayUpperStartIndex = TickUtils.getTickArrayStartIndexByTick(\n      ownerPosition.tickUpper,\n      poolInfo.config.tickSpacing,\n    );\n\n    const { publicKey: tickArrayLower } = getPdaTickArrayAddress(programId, id, tickArrayLowerStartIndex);\n    const { publicKey: tickArrayUpper } = getPdaTickArrayAddress(programId, id, tickArrayUpperStartIndex);\n\n    const { publicKey: positionNftAccount } = getATAAddress(ownerInfo.wallet, ownerPosition.nftMint, TOKEN_PROGRAM_ID);\n\n    const { publicKey: personalPosition } = getPdaPersonalPositionAddress(programId, ownerPosition.nftMint);\n    const { publicKey: protocolPosition } = getPdaProtocolPositionAddress(\n      programId,\n      id,\n      ownerPosition.tickLower,\n      ownerPosition.tickUpper,\n    );\n\n    const ins = this.increasePositionFromLiquidityInstruction(\n      programId,\n      ownerInfo.wallet,\n      positionNftAccount,\n      personalPosition,\n      id,\n      protocolPosition,\n      tickArrayLower,\n      tickArrayUpper,\n      ownerInfo.tokenAccountA,\n      ownerInfo.tokenAccountB,\n      new PublicKey(poolKeys.vault.A),\n      new PublicKey(poolKeys.vault.B),\n      new PublicKey(poolInfo.mintA.address),\n      new PublicKey(poolInfo.mintB.address),\n\n      liquidity,\n      amountMaxA,\n      amountMaxB,\n      PoolUtils.isOverflowDefaultTickarrayBitmap(poolInfo.config.tickSpacing, [\n        tickArrayLowerStartIndex,\n        tickArrayUpperStartIndex,\n      ])\n        ? getPdaExBitmapAccount(programId, id).publicKey\n        : undefined,\n    );\n\n    return {\n      address: {\n        tickArrayLower,\n        tickArrayUpper,\n        positionNftAccount,\n        personalPosition,\n        protocolPosition,\n      },\n      signers: [],\n      instructions: [ins],\n      instructionTypes: [InstructionType.ClmmIncreasePosition],\n      lookupTableAddress: poolKeys.lookupTableAccount ? [poolKeys.lookupTableAccount] : [],\n    };\n  }\n\n  static increasePositionFromBaseInstructions({\n    poolInfo,\n    poolKeys,\n    ownerPosition,\n    ownerInfo,\n    base,\n    baseAmount,\n    otherAmountMax,\n  }: {\n    poolInfo: ApiV3PoolInfoConcentratedItem;\n    poolKeys: ClmmKeys;\n    ownerPosition: ClmmPoolPersonalPosition;\n\n    ownerInfo: {\n      wallet: PublicKey;\n      tokenAccountA: PublicKey;\n      tokenAccountB: PublicKey;\n    };\n\n    base: \"MintA\" | \"MintB\";\n    baseAmount: BN;\n\n    otherAmountMax: BN;\n  }): ReturnTypeMakeInstructions<ManipulateLiquidityExtInfo[\"address\"]> {\n    const [programId, id] = [new PublicKey(poolInfo.programId), new PublicKey(poolInfo.id)];\n    const tickArrayLowerStartIndex = TickUtils.getTickArrayStartIndexByTick(\n      ownerPosition.tickLower,\n      poolInfo.config.tickSpacing,\n    );\n    const tickArrayUpperStartIndex = TickUtils.getTickArrayStartIndexByTick(\n      ownerPosition.tickUpper,\n      poolInfo.config.tickSpacing,\n    );\n\n    const { publicKey: tickArrayLower } = getPdaTickArrayAddress(programId, id, tickArrayLowerStartIndex);\n    const { publicKey: tickArrayUpper } = getPdaTickArrayAddress(programId, id, tickArrayUpperStartIndex);\n\n    const { publicKey: positionNftAccount } = getATAAddress(ownerInfo.wallet, ownerPosition.nftMint, TOKEN_PROGRAM_ID);\n\n    const { publicKey: personalPosition } = getPdaPersonalPositionAddress(programId, ownerPosition.nftMint);\n    const { publicKey: protocolPosition } = getPdaProtocolPositionAddress(\n      programId,\n      id,\n      ownerPosition.tickLower,\n      ownerPosition.tickUpper,\n    );\n\n    return {\n      address: {\n        tickArrayLower,\n        tickArrayUpper,\n        positionNftAccount,\n        personalPosition,\n        protocolPosition,\n      },\n      instructions: [\n        this.increasePositionFromBaseInstruction(\n          programId,\n          ownerInfo.wallet,\n          positionNftAccount,\n          personalPosition,\n          id,\n          protocolPosition,\n          tickArrayLower,\n          tickArrayUpper,\n          ownerInfo.tokenAccountA,\n          ownerInfo.tokenAccountB,\n          new PublicKey(poolKeys.vault.A),\n          new PublicKey(poolKeys.vault.B),\n          new PublicKey(poolInfo.mintA.address),\n          new PublicKey(poolInfo.mintB.address),\n\n          base,\n          baseAmount,\n\n          otherAmountMax,\n          PoolUtils.isOverflowDefaultTickarrayBitmap(poolInfo.config.tickSpacing, [\n            tickArrayLowerStartIndex,\n            tickArrayUpperStartIndex,\n          ])\n            ? getPdaExBitmapAccount(programId, id).publicKey\n            : undefined,\n        ),\n      ],\n      signers: [],\n      instructionTypes: [InstructionType.ClmmIncreasePosition],\n      lookupTableAddress: poolKeys.lookupTableAccount ? [poolKeys.lookupTableAccount] : [],\n    };\n  }\n\n  static increasePositionFromBaseInstruction(\n    programId: PublicKey,\n    positionNftOwner: PublicKey,\n    positionNftAccount: PublicKey,\n    personalPosition: PublicKey,\n\n    poolId: PublicKey,\n    protocolPosition: PublicKey,\n    tickArrayLower: PublicKey,\n    tickArrayUpper: PublicKey,\n    ownerTokenAccountA: PublicKey,\n    ownerTokenAccountB: PublicKey,\n    mintVaultA: PublicKey,\n    mintVaultB: PublicKey,\n    mintMintA: PublicKey,\n    mintMintB: PublicKey,\n\n    base: \"MintA\" | \"MintB\",\n    baseAmount: BN,\n\n    otherAmountMax: BN,\n\n    exTickArrayBitmap?: PublicKey,\n  ): TransactionInstruction {\n    const dataLayout = struct([\n      u128(\"liquidity\"),\n      u64(\"amountMaxA\"),\n      u64(\"amountMaxB\"),\n      u8(\"optionBaseFlag\"),\n      bool(\"baseFlag\"),\n    ]);\n\n    const remainingAccounts = [\n      ...(exTickArrayBitmap ? [{ pubkey: exTickArrayBitmap, isSigner: false, isWritable: true }] : []),\n    ];\n\n    const keys = [\n      { pubkey: positionNftOwner, isSigner: true, isWritable: false },\n      { pubkey: positionNftAccount, isSigner: false, isWritable: false },\n      { pubkey: poolId, isSigner: false, isWritable: true },\n      { pubkey: protocolPosition, isSigner: false, isWritable: true },\n      { pubkey: personalPosition, isSigner: false, isWritable: true },\n      { pubkey: tickArrayLower, isSigner: false, isWritable: true },\n      { pubkey: tickArrayUpper, isSigner: false, isWritable: true },\n      { pubkey: ownerTokenAccountA, isSigner: false, isWritable: true },\n      { pubkey: ownerTokenAccountB, isSigner: false, isWritable: true },\n      { pubkey: mintVaultA, isSigner: false, isWritable: true },\n      { pubkey: mintVaultB, isSigner: false, isWritable: true },\n\n      { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },\n      { pubkey: TOKEN_2022_PROGRAM_ID, isSigner: false, isWritable: false },\n\n      { pubkey: mintMintA, isSigner: false, isWritable: false },\n      { pubkey: mintMintB, isSigner: false, isWritable: false },\n\n      ...remainingAccounts,\n    ];\n\n    const data = Buffer.alloc(dataLayout.span);\n    dataLayout.encode(\n      {\n        liquidity: new BN(0),\n        amountMaxA: base === \"MintA\" ? baseAmount : otherAmountMax,\n        amountMaxB: base === \"MintA\" ? otherAmountMax : baseAmount,\n        baseFlag: base === \"MintA\",\n        optionBaseFlag: 1,\n      },\n      data,\n    );\n\n    const aData = Buffer.from([...anchorDataBuf.increaseLiquidity, ...data]);\n\n    return new TransactionInstruction({\n      keys,\n      programId,\n      data: aData,\n    });\n  }\n\n  static decreaseLiquidityInstruction(\n    programId: PublicKey,\n    positionNftOwner: PublicKey,\n    positionNftAccount: PublicKey,\n    personalPosition: PublicKey,\n\n    poolId: PublicKey,\n    protocolPosition: PublicKey,\n    tickArrayLower: PublicKey,\n    tickArrayUpper: PublicKey,\n    ownerTokenAccountA: PublicKey,\n    ownerTokenAccountB: PublicKey,\n    mintVaultA: PublicKey,\n    mintVaultB: PublicKey,\n    mintMintA: PublicKey,\n    mintMintB: PublicKey,\n    rewardAccounts: {\n      poolRewardVault: PublicKey;\n      ownerRewardVault: PublicKey;\n      rewardMint: PublicKey;\n    }[],\n\n    liquidity: BN,\n    amountMinA: BN,\n    amountMinB: BN,\n\n    exTickArrayBitmap?: PublicKey,\n  ): TransactionInstruction {\n    const dataLayout = struct([u128(\"liquidity\"), u64(\"amountMinA\"), u64(\"amountMinB\")]);\n\n    const remainingAccounts = [\n      ...(exTickArrayBitmap ? [{ pubkey: exTickArrayBitmap, isSigner: false, isWritable: true }] : []),\n      ...rewardAccounts\n        .map((i) => [\n          { pubkey: i.poolRewardVault, isSigner: false, isWritable: true },\n          { pubkey: i.ownerRewardVault, isSigner: false, isWritable: true },\n          { pubkey: i.rewardMint, isSigner: false, isWritable: false },\n        ])\n        .flat(),\n    ];\n\n    const keys = [\n      { pubkey: positionNftOwner, isSigner: true, isWritable: false },\n      { pubkey: positionNftAccount, isSigner: false, isWritable: false },\n      { pubkey: personalPosition, isSigner: false, isWritable: true },\n      { pubkey: poolId, isSigner: false, isWritable: true },\n      { pubkey: protocolPosition, isSigner: false, isWritable: true },\n      { pubkey: mintVaultA, isSigner: false, isWritable: true },\n      { pubkey: mintVaultB, isSigner: false, isWritable: true },\n      { pubkey: tickArrayLower, isSigner: false, isWritable: true },\n      { pubkey: tickArrayUpper, isSigner: false, isWritable: true },\n\n      { pubkey: ownerTokenAccountA, isSigner: false, isWritable: true },\n      { pubkey: ownerTokenAccountB, isSigner: false, isWritable: true },\n\n      { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },\n      { pubkey: TOKEN_2022_PROGRAM_ID, isSigner: false, isWritable: false },\n      { pubkey: MEMO_PROGRAM_ID, isSigner: false, isWritable: false },\n\n      { pubkey: mintMintA, isSigner: false, isWritable: false },\n      { pubkey: mintMintB, isSigner: false, isWritable: false },\n\n      ...remainingAccounts,\n    ];\n\n    const data = Buffer.alloc(dataLayout.span);\n    dataLayout.encode(\n      {\n        liquidity,\n        amountMinA,\n        amountMinB,\n      },\n      data,\n    );\n\n    const aData = Buffer.from([...anchorDataBuf.decreaseLiquidity, ...data]);\n\n    return new TransactionInstruction({\n      keys,\n      programId,\n      data: aData,\n    });\n  }\n\n  static decreaseLiquidityInstructions({\n    poolInfo,\n    poolKeys,\n    ownerPosition,\n    ownerInfo,\n    liquidity,\n    amountMinA,\n    amountMinB,\n    programId,\n  }: {\n    poolInfo: ApiV3PoolInfoConcentratedItem;\n    poolKeys: ClmmKeys;\n    ownerPosition: ClmmPositionLayout;\n\n    ownerInfo: {\n      wallet: PublicKey;\n      tokenAccountA: PublicKey;\n      tokenAccountB: PublicKey;\n      rewardAccounts: PublicKey[];\n    };\n\n    liquidity: BN;\n    amountMinA: BN;\n    amountMinB: BN;\n    programId?: PublicKey;\n  }): ReturnTypeMakeInstructions<ManipulateLiquidityExtInfo[\"address\"]> {\n    const [poolProgramId, id] = [new PublicKey(poolInfo.programId), new PublicKey(poolInfo.id)];\n    const tickArrayLowerStartIndex = TickUtils.getTickArrayStartIndexByTick(\n      ownerPosition.tickLower,\n      poolInfo.config.tickSpacing,\n    );\n    const tickArrayUpperStartIndex = TickUtils.getTickArrayStartIndexByTick(\n      ownerPosition.tickUpper,\n      poolInfo.config.tickSpacing,\n    );\n\n    const { publicKey: tickArrayLower } = getPdaTickArrayAddress(poolProgramId, id, tickArrayLowerStartIndex);\n    const { publicKey: tickArrayUpper } = getPdaTickArrayAddress(poolProgramId, id, tickArrayUpperStartIndex);\n    const { publicKey: positionNftAccount } = getATAAddress(ownerInfo.wallet, ownerPosition.nftMint, programId);\n\n    const { publicKey: personalPosition } = getPdaPersonalPositionAddress(poolProgramId, ownerPosition.nftMint);\n    const { publicKey: protocolPosition } = getPdaProtocolPositionAddress(\n      poolProgramId,\n      id,\n      ownerPosition.tickLower,\n      ownerPosition.tickUpper,\n    );\n\n    const rewardAccounts: {\n      poolRewardVault: PublicKey;\n      ownerRewardVault: PublicKey;\n      rewardMint: PublicKey;\n    }[] = [];\n    for (let i = 0; i < poolInfo.rewardDefaultInfos.length; i++) {\n      rewardAccounts.push({\n        poolRewardVault: new PublicKey(poolKeys.rewardInfos[i].vault),\n        ownerRewardVault: ownerInfo.rewardAccounts[i],\n        rewardMint: new PublicKey(poolInfo.rewardDefaultInfos[i].mint.address),\n      });\n    }\n\n    const ins: TransactionInstruction[] = [];\n    ins.push(\n      this.decreaseLiquidityInstruction(\n        poolProgramId,\n        ownerInfo.wallet,\n        positionNftAccount,\n        personalPosition,\n        id,\n        protocolPosition,\n        tickArrayLower,\n        tickArrayUpper,\n        ownerInfo.tokenAccountA,\n        ownerInfo.tokenAccountB,\n        new PublicKey(poolKeys.vault.A),\n        new PublicKey(poolKeys.vault.B),\n        new PublicKey(poolInfo.mintA.address),\n        new PublicKey(poolInfo.mintB.address),\n        rewardAccounts,\n\n        liquidity,\n        amountMinA,\n        amountMinB,\n        PoolUtils.isOverflowDefaultTickarrayBitmap(poolInfo.config.tickSpacing, [\n          tickArrayLowerStartIndex,\n          tickArrayUpperStartIndex,\n        ])\n          ? getPdaExBitmapAccount(poolProgramId, id).publicKey\n          : undefined,\n      ),\n    );\n\n    return {\n      address: {\n        tickArrayLower,\n        tickArrayUpper,\n        positionNftAccount,\n        personalPosition,\n        protocolPosition,\n      },\n      signers: [],\n      instructions: ins,\n      instructionTypes: [InstructionType.ClmmDecreasePosition],\n      lookupTableAddress: poolKeys.lookupTableAccount ? [poolKeys.lookupTableAccount] : [],\n    };\n  }\n\n  static swapInstruction(\n    programId: PublicKey,\n    payer: PublicKey,\n    poolId: PublicKey,\n    ammConfigId: PublicKey,\n    inputTokenAccount: PublicKey,\n    outputTokenAccount: PublicKey,\n    inputVault: PublicKey,\n    outputVault: PublicKey,\n    inputMint: PublicKey,\n    outputMint: PublicKey,\n    tickArray: PublicKey[],\n    observationId: PublicKey,\n\n    amount: BN,\n    otherAmountThreshold: BN,\n    sqrtPriceLimitX64: BN,\n    isBaseInput: boolean,\n\n    exTickArrayBitmap?: PublicKey,\n  ): TransactionInstruction {\n    const dataLayout = struct([\n      u64(\"amount\"),\n      u64(\"otherAmountThreshold\"),\n      u128(\"sqrtPriceLimitX64\"),\n      bool(\"isBaseInput\"),\n    ]);\n\n    const remainingAccounts = [\n      ...(exTickArrayBitmap ? [{ pubkey: exTickArrayBitmap, isSigner: false, isWritable: true }] : []),\n      ...tickArray.map((i) => ({ pubkey: i, isSigner: false, isWritable: true })),\n    ];\n\n    const keys = [\n      { pubkey: payer, isSigner: true, isWritable: false },\n      { pubkey: ammConfigId, isSigner: false, isWritable: false },\n\n      { pubkey: poolId, isSigner: false, isWritable: true },\n      { pubkey: inputTokenAccount, isSigner: false, isWritable: true },\n      { pubkey: outputTokenAccount, isSigner: false, isWritable: true },\n      { pubkey: inputVault, isSigner: false, isWritable: true },\n      { pubkey: outputVault, isSigner: false, isWritable: true },\n\n      { pubkey: observationId, isSigner: false, isWritable: true },\n\n      { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },\n      { pubkey: TOKEN_2022_PROGRAM_ID, isSigner: false, isWritable: false },\n      { pubkey: MEMO_PROGRAM_ID, isSigner: false, isWritable: false },\n\n      { pubkey: inputMint, isSigner: false, isWritable: false },\n      { pubkey: outputMint, isSigner: false, isWritable: false },\n\n      ...remainingAccounts,\n    ];\n\n    const data = Buffer.alloc(dataLayout.span);\n    dataLayout.encode(\n      {\n        amount,\n        otherAmountThreshold,\n        sqrtPriceLimitX64,\n        isBaseInput,\n      },\n      data,\n    );\n\n    const aData = Buffer.from([...anchorDataBuf.swap, ...data]);\n\n    return new TransactionInstruction({\n      keys,\n      programId,\n      data: aData,\n    });\n  }\n\n  static makeSwapBaseInInstructions({\n    poolInfo,\n    poolKeys,\n    observationId,\n    ownerInfo,\n    inputMint,\n    amountIn,\n    amountOutMin,\n    sqrtPriceLimitX64,\n    remainingAccounts,\n  }: {\n    poolInfo: Pick<ApiV3PoolInfoConcentratedItem, \"id\" | \"programId\" | \"mintA\" | \"mintB\" | \"config\">;\n    poolKeys: ClmmKeys;\n    observationId: PublicKey;\n    ownerInfo: {\n      wallet: PublicKey;\n      tokenAccountA: PublicKey;\n      tokenAccountB: PublicKey;\n    };\n\n    inputMint: PublicKey;\n\n    amountIn: BN;\n    amountOutMin: BN;\n    sqrtPriceLimitX64: BN;\n\n    remainingAccounts: PublicKey[];\n  }): ReturnTypeMakeInstructions {\n    const [programId, id] = [new PublicKey(poolInfo.programId), new PublicKey(poolInfo.id)];\n    const [mintAVault, mintBVault] = [new PublicKey(poolKeys.vault.A), new PublicKey(poolKeys.vault.B)];\n    const [mintA, mintB] = [new PublicKey(poolInfo.mintA.address), new PublicKey(poolInfo.mintB.address)];\n\n    const isInputMintA = poolInfo.mintA.address === inputMint.toString();\n\n    const ins = [\n      this.swapInstruction(\n        programId,\n        ownerInfo.wallet,\n\n        id,\n        new PublicKey(poolInfo.config.id),\n\n        isInputMintA ? ownerInfo.tokenAccountA : ownerInfo.tokenAccountB,\n        isInputMintA ? ownerInfo.tokenAccountB : ownerInfo.tokenAccountA,\n\n        isInputMintA ? mintAVault : mintBVault,\n        isInputMintA ? mintBVault : mintAVault,\n\n        isInputMintA ? mintA : mintB,\n        isInputMintA ? mintB : mintA,\n\n        remainingAccounts,\n        observationId, // to do get from api\n        amountIn,\n        amountOutMin,\n        sqrtPriceLimitX64,\n        true,\n        getPdaExBitmapAccount(programId, id).publicKey,\n      ),\n    ];\n    return {\n      signers: [],\n      instructions: ins,\n      instructionTypes: [InstructionType.ClmmSwapBaseIn],\n      lookupTableAddress: poolKeys.lookupTableAccount ? [poolKeys.lookupTableAccount] : [],\n      address: {},\n    };\n  }\n\n  static initRewardInstruction(\n    programId: PublicKey,\n    payer: PublicKey,\n    poolId: PublicKey,\n    operationId: PublicKey,\n    ammConfigId: PublicKey,\n\n    ownerTokenAccount: PublicKey,\n    rewardProgramId: PublicKey,\n    rewardMint: PublicKey,\n    rewardVault: PublicKey,\n\n    openTime: number,\n    endTime: number,\n    emissionsPerSecondX64: BN,\n  ): TransactionInstruction {\n    const dataLayout = struct([u64(\"openTime\"), u64(\"endTime\"), u128(\"emissionsPerSecondX64\")]);\n\n    const keys = [\n      { pubkey: payer, isSigner: true, isWritable: true },\n      { pubkey: ownerTokenAccount, isSigner: false, isWritable: true },\n      { pubkey: ammConfigId, isSigner: false, isWritable: false },\n\n      { pubkey: poolId, isSigner: false, isWritable: true },\n      { pubkey: operationId, isSigner: false, isWritable: true },\n      { pubkey: rewardMint, isSigner: false, isWritable: false },\n      { pubkey: rewardVault, isSigner: false, isWritable: true },\n\n      { pubkey: rewardProgramId, isSigner: false, isWritable: false },\n      { pubkey: SystemProgram.programId, isSigner: false, isWritable: false },\n      { pubkey: RENT_PROGRAM_ID, isSigner: false, isWritable: false },\n    ];\n\n    const data = Buffer.alloc(dataLayout.span);\n    dataLayout.encode(\n      {\n        openTime: parseBigNumberish(openTime),\n        endTime: parseBigNumberish(endTime),\n        emissionsPerSecondX64,\n      },\n      data,\n    );\n\n    const aData = Buffer.from([...anchorDataBuf.initReward, ...data]);\n\n    return new TransactionInstruction({\n      keys,\n      programId,\n      data: aData,\n    });\n  }\n\n  static initRewardInstructions({\n    poolInfo,\n    poolKeys,\n    ownerInfo,\n    rewardInfo,\n  }: {\n    poolInfo: ApiV3PoolInfoConcentratedItem;\n    poolKeys: ClmmKeys;\n    ownerInfo: {\n      wallet: PublicKey;\n      tokenAccount: PublicKey;\n    };\n    rewardInfo: {\n      programId: PublicKey;\n      mint: PublicKey;\n      openTime: number;\n      endTime: number;\n      emissionsPerSecondX64: BN;\n    };\n  }): ReturnTypeMakeInstructions<InitRewardExtInfo[\"address\"]> {\n    const [programId, id] = [new PublicKey(poolInfo.programId), new PublicKey(poolInfo.id)];\n    const poolRewardVault = getPdaPoolRewardVaulId(programId, id, rewardInfo.mint).publicKey;\n    const operationId = getPdaOperationAccount(programId).publicKey;\n    const ins = [\n      this.initRewardInstruction(\n        programId,\n        ownerInfo.wallet,\n        id,\n        operationId,\n        new PublicKey(poolInfo.config.id),\n\n        ownerInfo.tokenAccount,\n        rewardInfo.programId,\n        rewardInfo.mint,\n        poolRewardVault,\n\n        rewardInfo.openTime,\n        rewardInfo.endTime,\n        rewardInfo.emissionsPerSecondX64,\n      ),\n    ];\n    return {\n      address: { poolRewardVault, operationId },\n      signers: [],\n      instructions: ins,\n      instructionTypes: [InstructionType.ClmmInitReward],\n      lookupTableAddress: poolKeys.lookupTableAccount ? [poolKeys.lookupTableAccount] : [],\n    };\n  }\n\n  static setRewardInstruction(\n    programId: PublicKey,\n    payer: PublicKey,\n    poolId: PublicKey,\n    operationId: PublicKey,\n    ammConfigId: PublicKey,\n\n    ownerTokenAccount: PublicKey,\n    rewardVault: PublicKey,\n    rewardMint: PublicKey,\n\n    rewardIndex: number,\n    openTime: number,\n    endTime: number,\n    emissionsPerSecondX64: BN,\n  ): TransactionInstruction {\n    const dataLayout = struct([u8(\"rewardIndex\"), u128(\"emissionsPerSecondX64\"), u64(\"openTime\"), u64(\"endTime\")]);\n\n    const keys = [\n      { pubkey: payer, isSigner: true, isWritable: true },\n      { pubkey: ammConfigId, isSigner: false, isWritable: false },\n      { pubkey: poolId, isSigner: false, isWritable: true },\n      { pubkey: operationId, isSigner: false, isWritable: true },\n\n      { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },\n      { pubkey: TOKEN_2022_PROGRAM_ID, isSigner: false, isWritable: false },\n\n      { pubkey: rewardVault, isSigner: false, isWritable: true },\n      { pubkey: ownerTokenAccount, isSigner: false, isWritable: true },\n      { pubkey: rewardMint, isSigner: false, isWritable: true },\n    ];\n\n    const data = Buffer.alloc(dataLayout.span);\n    dataLayout.encode(\n      {\n        rewardIndex,\n        emissionsPerSecondX64,\n        openTime: parseBigNumberish(openTime),\n        endTime: parseBigNumberish(endTime),\n      },\n      data,\n    );\n\n    const aData = Buffer.from([...anchorDataBuf.setRewardEmissions, ...data]);\n\n    return new TransactionInstruction({\n      keys,\n      programId,\n      data: aData,\n    });\n  }\n\n  static setRewardInstructions({\n    poolInfo,\n    poolKeys,\n    ownerInfo,\n    rewardInfo,\n  }: {\n    poolInfo: ApiV3PoolInfoConcentratedItem;\n    poolKeys: ClmmKeys;\n    ownerInfo: {\n      wallet: PublicKey;\n      tokenAccount: PublicKey;\n    };\n    rewardInfo: {\n      mint: PublicKey;\n      openTime: number;\n      endTime: number;\n      emissionsPerSecondX64: BN;\n    };\n  }): ReturnTypeMakeInstructions {\n    const [programId, id] = [new PublicKey(poolInfo.programId), new PublicKey(poolInfo.id)];\n\n    let rewardIndex: number | undefined;\n    let rewardVault: PublicKey | undefined;\n    let rewardMint: PublicKey | undefined;\n    for (let index = 0; index < poolInfo.rewardDefaultInfos.length; index++)\n      if (poolInfo.rewardDefaultInfos[index].mint.address === rewardInfo.mint.toString()) {\n        rewardIndex = index;\n        rewardVault = new PublicKey(poolKeys.rewardInfos[index].vault);\n        rewardMint = new PublicKey(poolKeys.rewardInfos[index].mint.address);\n      }\n\n    if (rewardIndex === undefined || rewardVault === undefined)\n      logger.logWithError(\"reward mint check error\", \"no reward mint\", poolInfo.rewardDefaultInfos);\n\n    const operationId = getPdaOperationAccount(programId).publicKey;\n\n    const ins = [\n      this.setRewardInstruction(\n        programId,\n        ownerInfo.wallet,\n        id,\n        operationId,\n        new PublicKey(poolInfo.config.id),\n\n        ownerInfo.tokenAccount,\n        rewardVault!,\n        rewardMint!,\n\n        rewardIndex!,\n        rewardInfo.openTime,\n        rewardInfo.endTime,\n        rewardInfo.emissionsPerSecondX64,\n      ),\n    ];\n    return {\n      address: { rewardVault: rewardVault!, operationId },\n      signers: [],\n      instructions: ins,\n      instructionTypes: [InstructionType.ClmmSetReward],\n      lookupTableAddress: poolKeys.lookupTableAccount ? [poolKeys.lookupTableAccount] : [],\n    };\n  }\n\n  static collectRewardInstruction(\n    programId: PublicKey,\n    payer: PublicKey,\n    poolId: PublicKey,\n\n    ownerTokenAccount: PublicKey,\n    rewardVault: PublicKey,\n    rewardMint: PublicKey,\n\n    rewardIndex: number,\n  ): TransactionInstruction {\n    const dataLayout = struct([u8(\"rewardIndex\")]);\n\n    const keys = [\n      { pubkey: payer, isSigner: true, isWritable: true },\n      { pubkey: ownerTokenAccount, isSigner: false, isWritable: true },\n      { pubkey: poolId, isSigner: false, isWritable: true },\n      { pubkey: rewardVault, isSigner: false, isWritable: true },\n      { pubkey: rewardMint, isSigner: false, isWritable: false },\n      { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },\n      { pubkey: TOKEN_2022_PROGRAM_ID, isSigner: false, isWritable: false },\n      { pubkey: MEMO_PROGRAM_ID, isSigner: false, isWritable: false },\n    ];\n\n    const data = Buffer.alloc(dataLayout.span);\n    dataLayout.encode(\n      {\n        rewardIndex,\n      },\n      data,\n    );\n\n    const aData = Buffer.from([...anchorDataBuf.collectReward, ...data]);\n\n    return new TransactionInstruction({\n      keys,\n      programId,\n      data: aData,\n    });\n  }\n\n  static collectRewardInstructions({\n    poolInfo,\n    poolKeys,\n    ownerInfo,\n    rewardMint,\n  }: {\n    poolInfo: ApiV3PoolInfoConcentratedItem;\n    poolKeys: ClmmKeys;\n    ownerInfo: {\n      wallet: PublicKey;\n      tokenAccount: PublicKey;\n    };\n    rewardMint: PublicKey;\n  }): ReturnTypeMakeInstructions {\n    const [programId, id] = [new PublicKey(poolInfo.programId), new PublicKey(poolInfo.id)];\n    let rewardIndex: number | undefined;\n    let rewardVault: PublicKey | undefined;\n    for (let index = 0; index < poolInfo.rewardDefaultInfos.length; index++)\n      if (poolInfo.rewardDefaultInfos[index].mint.address === rewardMint.toString()) {\n        rewardIndex = index;\n        rewardVault = new PublicKey(poolKeys.rewardInfos[index].vault);\n      }\n\n    if (rewardIndex === undefined || rewardVault === undefined)\n      logger.logWithError(\"reward mint check error\", \"no reward mint\", poolInfo.rewardDefaultInfos);\n\n    const ins = [\n      this.collectRewardInstruction(\n        programId,\n        ownerInfo.wallet,\n        id,\n\n        ownerInfo.tokenAccount,\n        rewardVault!,\n        rewardMint,\n\n        rewardIndex!,\n      ),\n    ];\n    return {\n      address: { rewardVault: rewardVault! },\n      signers: [],\n      instructions: ins,\n      instructionTypes: [InstructionType.ClmmCollectReward],\n      lookupTableAddress: poolKeys.lookupTableAccount ? [poolKeys.lookupTableAccount] : [],\n    };\n  }\n\n  static swapBaseOutInstructions({\n    poolInfo,\n    poolKeys,\n    ownerInfo,\n    outputMint,\n    amountOut,\n    amountInMax,\n    sqrtPriceLimitX64,\n    remainingAccounts,\n  }: {\n    poolInfo: ApiV3PoolInfoConcentratedItem;\n    poolKeys: ClmmKeys;\n\n    ownerInfo: {\n      wallet: PublicKey;\n      tokenAccountA: PublicKey;\n      tokenAccountB: PublicKey;\n    };\n\n    outputMint: PublicKey;\n\n    amountOut: BN;\n    amountInMax: BN;\n    sqrtPriceLimitX64: BN;\n\n    remainingAccounts: PublicKey[];\n  }): ReturnTypeMakeInstructions {\n    const [programId, id] = [new PublicKey(poolInfo.programId), new PublicKey(poolInfo.id)];\n    const [mintAVault, mintBVault] = [new PublicKey(poolKeys.vault.A), new PublicKey(poolKeys.vault.B)];\n    const [mintA, mintB] = [new PublicKey(poolInfo.mintA.address), new PublicKey(poolInfo.mintB.address)];\n    const isInputMintA = poolInfo.mintA.address === outputMint.toString();\n    const ins = [\n      this.swapInstruction(\n        programId,\n        ownerInfo.wallet,\n\n        id,\n        new PublicKey(poolInfo.config.id),\n\n        isInputMintA ? ownerInfo.tokenAccountB : ownerInfo.tokenAccountA,\n        isInputMintA ? ownerInfo.tokenAccountA : ownerInfo.tokenAccountB,\n\n        isInputMintA ? mintBVault : mintAVault,\n        isInputMintA ? mintAVault : mintBVault,\n\n        isInputMintA ? mintA : mintB,\n        isInputMintA ? mintB : mintA,\n\n        remainingAccounts,\n        // poolInfo.observationId, // to do\n        mintAVault,\n        amountOut,\n        amountInMax,\n        sqrtPriceLimitX64,\n        false,\n      ),\n    ];\n    return {\n      signers: [],\n      instructions: ins,\n      instructionTypes: [InstructionType.ClmmSwapBaseOut],\n      lookupTableAddress: poolKeys.lookupTableAccount ? [poolKeys.lookupTableAccount] : [],\n      address: {},\n    };\n  }\n}\n","import { PublicKey } from \"@solana/web3.js\";\nimport BN from \"bn.js\";\nimport Decimal from \"decimal.js\";\n\nimport { getPdaTickArrayAddress } from \"./pda\";\nimport { TickArrayBitmapExtensionType } from \"../type\";\nimport { TickQuery } from \"./tickQuery\";\nimport { MIN_TICK, MAX_TICK } from \"./constants\";\nimport { SqrtPriceMath, TickMath } from \"./math\";\nimport { ClmmPoolInfo } from \"../type\";\nimport { ApiV3PoolInfoConcentratedItem } from \"@/api/type\";\n\nexport const TICK_ARRAY_SIZE = 60;\nexport const TICK_ARRAY_BITMAP_SIZE = 512;\n\nexport interface ReturnTypeGetTickPrice {\n  tick: number;\n  price: Decimal;\n  tickSqrtPriceX64: BN;\n}\n\nexport interface ReturnTypeGetPriceAndTick {\n  tick: number;\n  price: Decimal;\n}\n\nexport type Tick = {\n  tick: number;\n  liquidityNet: BN;\n  liquidityGross: BN;\n  feeGrowthOutsideX64A: BN;\n  feeGrowthOutsideX64B: BN;\n  rewardGrowthsOutsideX64: BN[];\n};\n\nexport type TickArray = {\n  address: PublicKey;\n  poolId: PublicKey;\n  startTickIndex: number;\n  ticks: Tick[];\n  initializedTickCount: number;\n};\n\nexport type TickState = {\n  tick: number;\n  liquidityNet: BN;\n  liquidityGross: BN;\n  feeGrowthOutsideX64A: BN;\n  feeGrowthOutsideX64B: BN;\n  tickCumulativeOutside: BN;\n  secondsPerLiquidityOutsideX64: BN;\n  secondsOutside: number;\n  rewardGrowthsOutside: BN[];\n};\n\nexport type TickArrayState = {\n  ammPool: PublicKey;\n  startTickIndex: number;\n  ticks: TickState[];\n  initializedTickCount: number;\n};\n\nexport class TickUtils {\n  public static getTickArrayAddressByTick(\n    programId: PublicKey,\n    poolId: PublicKey,\n    tickIndex: number,\n    tickSpacing: number,\n  ): PublicKey {\n    const startIndex = TickUtils.getTickArrayStartIndexByTick(tickIndex, tickSpacing);\n    const { publicKey: tickArrayAddress } = getPdaTickArrayAddress(programId, poolId, startIndex);\n    return tickArrayAddress;\n  }\n\n  public static getTickOffsetInArray(tickIndex: number, tickSpacing: number): number {\n    if (tickIndex % tickSpacing != 0) {\n      throw new Error(\"tickIndex % tickSpacing not equal 0\");\n    }\n    const startTickIndex = TickUtils.getTickArrayStartIndexByTick(tickIndex, tickSpacing);\n    const offsetInArray = Math.floor((tickIndex - startTickIndex) / tickSpacing);\n    if (offsetInArray < 0 || offsetInArray >= TICK_ARRAY_SIZE) {\n      throw new Error(\"tick offset in array overflow\");\n    }\n    return offsetInArray;\n  }\n\n  public static getTickArrayBitIndex(tickIndex: number, tickSpacing: number): number {\n    const ticksInArray = TickQuery.tickCount(tickSpacing);\n\n    let startIndex: number = tickIndex / ticksInArray;\n    if (tickIndex < 0 && tickIndex % ticksInArray != 0) {\n      startIndex = Math.ceil(startIndex) - 1;\n    } else {\n      startIndex = Math.floor(startIndex);\n    }\n    return startIndex;\n  }\n\n  public static getTickArrayStartIndexByTick(tickIndex: number, tickSpacing: number): number {\n    return this.getTickArrayBitIndex(tickIndex, tickSpacing) * TickQuery.tickCount(tickSpacing);\n  }\n\n  public static getTickArrayOffsetInBitmapByTick(tick: number, tickSpacing: number): number {\n    const multiplier = tickSpacing * TICK_ARRAY_SIZE;\n    const compressed = Math.floor(tick / multiplier) + 512;\n    return Math.abs(compressed);\n  }\n\n  public static checkTickArrayIsInitialized(\n    bitmap: BN,\n    tick: number,\n    tickSpacing: number,\n  ): {\n    isInitialized: boolean;\n    startIndex: number;\n  } {\n    const multiplier = tickSpacing * TICK_ARRAY_SIZE;\n    const compressed = Math.floor(tick / multiplier) + 512;\n    const bitPos = Math.abs(compressed);\n    return {\n      isInitialized: bitmap.testn(bitPos),\n      startIndex: (bitPos - 512) * multiplier,\n    };\n  }\n\n  public static getNextTickArrayStartIndex(\n    lastTickArrayStartIndex: number,\n    tickSpacing: number,\n    zeroForOne: boolean,\n  ): number {\n    return zeroForOne\n      ? lastTickArrayStartIndex - tickSpacing * TICK_ARRAY_SIZE\n      : lastTickArrayStartIndex + tickSpacing * TICK_ARRAY_SIZE;\n  }\n\n  public static mergeTickArrayBitmap(bns: BN[]): BN {\n    let b = new BN(0);\n    for (let i = 0; i < bns.length; i++) {\n      b = b.add(bns[i].shln(64 * i));\n    }\n    return b;\n  }\n\n  public static getInitializedTickArrayInRange(\n    tickArrayBitmap: BN[],\n    exTickArrayBitmap: TickArrayBitmapExtensionType,\n    tickSpacing: number,\n    tickArrayStartIndex: number,\n    expectedCount: number,\n  ): number[] {\n    const tickArrayOffset = Math.floor(tickArrayStartIndex / (tickSpacing * TICK_ARRAY_SIZE));\n    return [\n      // find right of currenct offset\n      ...TickUtils.searchLowBitFromStart(\n        tickArrayBitmap,\n        exTickArrayBitmap,\n        tickArrayOffset - 1,\n        expectedCount,\n        tickSpacing,\n      ),\n\n      // find left of current offset\n      ...TickUtils.searchHightBitFromStart(\n        tickArrayBitmap,\n        exTickArrayBitmap,\n        tickArrayOffset,\n        expectedCount,\n        tickSpacing,\n      ),\n    ];\n  }\n\n  public static getAllInitializedTickArrayStartIndex(\n    tickArrayBitmap: BN[],\n    exTickArrayBitmap: TickArrayBitmapExtensionType,\n    tickSpacing: number,\n  ): number[] {\n    // find from offset 0 to 1024\n    return TickUtils.searchHightBitFromStart(\n      tickArrayBitmap,\n      exTickArrayBitmap,\n      0,\n      TICK_ARRAY_BITMAP_SIZE,\n      tickSpacing,\n    );\n  }\n\n  public static getAllInitializedTickArrayInfo(\n    programId: PublicKey,\n    poolId: PublicKey,\n    tickArrayBitmap: BN[],\n    exTickArrayBitmap: TickArrayBitmapExtensionType,\n    tickSpacing: number,\n  ): {\n    tickArrayStartIndex: number;\n    tickArrayAddress: PublicKey;\n  }[] {\n    const result: {\n      tickArrayStartIndex: number;\n      tickArrayAddress: PublicKey;\n    }[] = [];\n    const allInitializedTickArrayIndex: number[] = TickUtils.getAllInitializedTickArrayStartIndex(\n      tickArrayBitmap,\n      exTickArrayBitmap,\n      tickSpacing,\n    );\n    for (const startIndex of allInitializedTickArrayIndex) {\n      const { publicKey: address } = getPdaTickArrayAddress(programId, poolId, startIndex);\n      result.push({\n        tickArrayStartIndex: startIndex,\n        tickArrayAddress: address,\n      });\n    }\n    return result;\n  }\n\n  public static getAllInitializedTickInTickArray(tickArray: TickArrayState): TickState[] {\n    return tickArray.ticks.filter((i) => i.liquidityGross.gtn(0));\n  }\n\n  public static searchLowBitFromStart(\n    tickArrayBitmap: BN[],\n    exTickArrayBitmap: TickArrayBitmapExtensionType,\n    currentTickArrayBitStartIndex: number,\n    expectedCount: number,\n    tickSpacing: number,\n  ): number[] {\n    const tickArrayBitmaps = [\n      ...[...exTickArrayBitmap.negativeTickArrayBitmap].reverse(),\n      tickArrayBitmap.slice(0, 8),\n      tickArrayBitmap.slice(8, 16),\n      ...exTickArrayBitmap.positiveTickArrayBitmap,\n    ].map((i) => TickUtils.mergeTickArrayBitmap(i));\n    const result: number[] = [];\n    while (currentTickArrayBitStartIndex >= -7680) {\n      const arrayIndex = Math.floor((currentTickArrayBitStartIndex + 7680) / 512);\n      const searchIndex = (currentTickArrayBitStartIndex + 7680) % 512;\n\n      if (tickArrayBitmaps[arrayIndex].testn(searchIndex)) result.push(currentTickArrayBitStartIndex);\n\n      currentTickArrayBitStartIndex--;\n      if (result.length === expectedCount) break;\n    }\n\n    const tickCount = TickQuery.tickCount(tickSpacing);\n    return result.map((i) => i * tickCount);\n  }\n\n  public static searchHightBitFromStart(\n    tickArrayBitmap: BN[],\n    exTickArrayBitmap: TickArrayBitmapExtensionType,\n    currentTickArrayBitStartIndex: number,\n    expectedCount: number,\n    tickSpacing: number,\n  ): number[] {\n    const tickArrayBitmaps = [\n      ...[...exTickArrayBitmap.negativeTickArrayBitmap].reverse(),\n      tickArrayBitmap.slice(0, 8),\n      tickArrayBitmap.slice(8, 16),\n      ...exTickArrayBitmap.positiveTickArrayBitmap,\n    ].map((i) => TickUtils.mergeTickArrayBitmap(i));\n    const result: number[] = [];\n    while (currentTickArrayBitStartIndex < 7680) {\n      const arrayIndex = Math.floor((currentTickArrayBitStartIndex + 7680) / 512);\n      const searchIndex = (currentTickArrayBitStartIndex + 7680) % 512;\n\n      if (tickArrayBitmaps[arrayIndex].testn(searchIndex)) result.push(currentTickArrayBitStartIndex);\n\n      currentTickArrayBitStartIndex++;\n      if (result.length === expectedCount) break;\n    }\n\n    const tickCount = TickQuery.tickCount(tickSpacing);\n    return result.map((i) => i * tickCount);\n  }\n\n  public static checkIsOutOfBoundary(tick: number): boolean {\n    return tick < MIN_TICK || tick > MAX_TICK;\n  }\n\n  public static nextInitTick(\n    tickArrayCurrent: TickArray,\n    currentTickIndex: number,\n    tickSpacing: number,\n    zeroForOne: boolean,\n    t: boolean,\n  ): Tick | null {\n    const currentTickArrayStartIndex = TickQuery.getArrayStartIndex(currentTickIndex, tickSpacing);\n    if (currentTickArrayStartIndex != tickArrayCurrent.startTickIndex) {\n      return null;\n    }\n    let offsetInArray = Math.floor((currentTickIndex - tickArrayCurrent.startTickIndex) / tickSpacing);\n\n    if (zeroForOne) {\n      while (offsetInArray >= 0) {\n        if (tickArrayCurrent.ticks[offsetInArray].liquidityGross.gtn(0)) {\n          return tickArrayCurrent.ticks[offsetInArray];\n        }\n        offsetInArray = offsetInArray - 1;\n      }\n    } else {\n      if (!t) offsetInArray = offsetInArray + 1;\n      while (offsetInArray < TICK_ARRAY_SIZE) {\n        if (tickArrayCurrent.ticks[offsetInArray].liquidityGross.gtn(0)) {\n          return tickArrayCurrent.ticks[offsetInArray];\n        }\n        offsetInArray = offsetInArray + 1;\n      }\n    }\n    return null;\n  }\n\n  public static firstInitializedTick(tickArrayCurrent: TickArray, zeroForOne: boolean): Tick {\n    if (zeroForOne) {\n      let i = TICK_ARRAY_SIZE - 1;\n      while (i >= 0) {\n        if (tickArrayCurrent.ticks[i].liquidityGross.gtn(0)) {\n          return tickArrayCurrent.ticks[i];\n        }\n        i = i - 1;\n      }\n    } else {\n      let i = 0;\n      while (i < TICK_ARRAY_SIZE) {\n        if (tickArrayCurrent.ticks[i].liquidityGross.gtn(0)) {\n          return tickArrayCurrent.ticks[i];\n        }\n        i = i + 1;\n      }\n    }\n\n    throw Error(`firstInitializedTick check error: ${tickArrayCurrent} - ${zeroForOne}`);\n  }\n\n  public static _getTickPriceLegacy({\n    poolInfo,\n    tick,\n    baseIn,\n  }: {\n    poolInfo: ClmmPoolInfo;\n    tick: number;\n    baseIn: boolean;\n  }): ReturnTypeGetTickPrice {\n    const tickSqrtPriceX64 = SqrtPriceMath.getSqrtPriceX64FromTick(tick);\n    const tickPrice = SqrtPriceMath.sqrtPriceX64ToPrice(\n      tickSqrtPriceX64,\n      poolInfo.mintA.decimals,\n      poolInfo.mintB.decimals,\n    );\n\n    return baseIn\n      ? { tick, price: tickPrice, tickSqrtPriceX64 }\n      : { tick, price: new Decimal(1).div(tickPrice), tickSqrtPriceX64 };\n  }\n\n  public static _getPriceAndTickLegacy({\n    poolInfo,\n    price,\n    baseIn,\n  }: {\n    poolInfo: ClmmPoolInfo;\n    price: Decimal;\n    baseIn: boolean;\n  }): ReturnTypeGetPriceAndTick {\n    const _price = baseIn ? price : new Decimal(1).div(price);\n\n    const tick = TickMath.getTickWithPriceAndTickspacing(\n      _price,\n      poolInfo.ammConfig.tickSpacing,\n      poolInfo.mintA.decimals,\n      poolInfo.mintB.decimals,\n    );\n    const tickSqrtPriceX64 = SqrtPriceMath.getSqrtPriceX64FromTick(tick);\n    const tickPrice = SqrtPriceMath.sqrtPriceX64ToPrice(\n      tickSqrtPriceX64,\n      poolInfo.mintA.decimals,\n      poolInfo.mintB.decimals,\n    );\n\n    return baseIn ? { tick, price: tickPrice } : { tick, price: new Decimal(1).div(tickPrice) };\n  }\n\n  public static getTickPrice({\n    poolInfo,\n    tick,\n    baseIn,\n  }: {\n    poolInfo: ApiV3PoolInfoConcentratedItem;\n    tick: number;\n    baseIn: boolean;\n  }): ReturnTypeGetTickPrice {\n    const tickSqrtPriceX64 = SqrtPriceMath.getSqrtPriceX64FromTick(tick);\n    const tickPrice = SqrtPriceMath.sqrtPriceX64ToPrice(\n      tickSqrtPriceX64,\n      poolInfo.mintA.decimals,\n      poolInfo.mintB.decimals,\n    );\n\n    return baseIn\n      ? { tick, price: tickPrice, tickSqrtPriceX64 }\n      : { tick, price: new Decimal(1).div(tickPrice), tickSqrtPriceX64 };\n  }\n\n  public static getPriceAndTick({\n    poolInfo,\n    price,\n    baseIn,\n  }: {\n    poolInfo: ApiV3PoolInfoConcentratedItem;\n    price: Decimal;\n    baseIn: boolean;\n  }): ReturnTypeGetPriceAndTick {\n    const _price = baseIn ? price : new Decimal(1).div(price);\n\n    const tick = TickMath.getTickWithPriceAndTickspacing(\n      _price,\n      poolInfo.config.tickSpacing,\n      poolInfo.mintA.decimals,\n      poolInfo.mintB.decimals,\n    );\n    const tickSqrtPriceX64 = SqrtPriceMath.getSqrtPriceX64FromTick(tick);\n    const tickPrice = SqrtPriceMath.sqrtPriceX64ToPrice(\n      tickSqrtPriceX64,\n      poolInfo.mintA.decimals,\n      poolInfo.mintB.decimals,\n    );\n\n    return baseIn ? { tick, price: tickPrice } : { tick, price: new Decimal(1).div(tickPrice) };\n  }\n}\n","import BN from \"bn.js\";\nexport function u16ToBytes(num: number): Uint8Array {\n  const arr = new ArrayBuffer(2);\n  const view = new DataView(arr);\n  view.setUint16(0, num, false);\n  return new Uint8Array(arr);\n}\n\nexport function i16ToBytes(num: number): Uint8Array {\n  const arr = new ArrayBuffer(2);\n  const view = new DataView(arr);\n  view.setInt16(0, num, false);\n  return new Uint8Array(arr);\n}\n\nexport function u32ToBytes(num: number): Uint8Array {\n  const arr = new ArrayBuffer(4);\n  const view = new DataView(arr);\n  view.setUint32(0, num, false);\n  return new Uint8Array(arr);\n}\n\nexport function i32ToBytes(num: number): Uint8Array {\n  const arr = new ArrayBuffer(4);\n  const view = new DataView(arr);\n  view.setInt32(0, num, false);\n  return new Uint8Array(arr);\n}\n\nexport function leadingZeros(bitNum: number, data: BN): number {\n  let i = 0;\n  for (let j = bitNum - 1; j >= 0; j--) {\n    if (!data.testn(j)) {\n      i++;\n    } else {\n      break;\n    }\n  }\n  return i;\n}\n\nexport function trailingZeros(bitNum: number, data: BN) {\n  let i = 0;\n  for (let j = 0; j < bitNum; j++) {\n    if (!data.testn(j)) {\n      i++;\n    } else {\n      break;\n    }\n  }\n  return i;\n}\n\nexport function isZero(bitNum: number, data: BN): boolean {\n  for (let i = 0; i < bitNum; i++) {\n    if (data.testn(i)) return false;\n  }\n  return true;\n}\n\nexport function mostSignificantBit(bitNum: number, data: BN): number | null {\n  if (isZero(bitNum, data)) return null;\n  else return leadingZeros(bitNum, data);\n}\n\nexport function leastSignificantBit(bitNum: number, data: BN): number | null {\n  if (isZero(bitNum, data)) return null;\n  else return trailingZeros(bitNum, data);\n}\n","import { PublicKey } from \"@solana/web3.js\";\n\nimport { findProgramAddress, METADATA_PROGRAM_ID } from \"@/common\";\n\nimport { i32ToBytes, u16ToBytes } from \"./util\";\n\nexport const AMM_CONFIG_SEED = Buffer.from(\"amm_config\", \"utf8\");\nexport const POOL_SEED = Buffer.from(\"pool\", \"utf8\");\nexport const POOL_VAULT_SEED = Buffer.from(\"pool_vault\", \"utf8\");\nexport const POOL_REWARD_VAULT_SEED = Buffer.from(\"pool_reward_vault\", \"utf8\");\nexport const POSITION_SEED = Buffer.from(\"position\", \"utf8\");\nexport const TICK_ARRAY_SEED = Buffer.from(\"tick_array\", \"utf8\");\nexport const OPERATION_SEED = Buffer.from(\"operation\", \"utf8\");\nexport const POOL_TICK_ARRAY_BITMAP_SEED = Buffer.from(\"pool_tick_array_bitmap_extension\", \"utf8\");\n\nexport function getPdaAmmConfigId(\n  programId: PublicKey,\n  index: number,\n): {\n  publicKey: PublicKey;\n  nonce: number;\n} {\n  return findProgramAddress([AMM_CONFIG_SEED, u16ToBytes(index)], programId);\n}\n\nexport function getPdaPoolId(\n  programId: PublicKey,\n  ammConfigId: PublicKey,\n  mintA: PublicKey,\n  mintB: PublicKey,\n): {\n  publicKey: PublicKey;\n  nonce: number;\n} {\n  return findProgramAddress([POOL_SEED, ammConfigId.toBuffer(), mintA.toBuffer(), mintB.toBuffer()], programId);\n}\n\nexport function getPdaPoolVaultId(\n  programId: PublicKey,\n  poolId: PublicKey,\n  vaultMint: PublicKey,\n): {\n  publicKey: PublicKey;\n  nonce: number;\n} {\n  return findProgramAddress([POOL_VAULT_SEED, poolId.toBuffer(), vaultMint.toBuffer()], programId);\n}\n\nexport function getPdaPoolRewardVaulId(\n  programId: PublicKey,\n  poolId: PublicKey,\n  rewardMint: PublicKey,\n): {\n  publicKey: PublicKey;\n  nonce: number;\n} {\n  return findProgramAddress([POOL_REWARD_VAULT_SEED, poolId.toBuffer(), rewardMint.toBuffer()], programId);\n}\n\nexport function getPdaTickArrayAddress(\n  programId: PublicKey,\n  poolId: PublicKey,\n  startIndex: number,\n): {\n  publicKey: PublicKey;\n  nonce: number;\n} {\n  return findProgramAddress([TICK_ARRAY_SEED, poolId.toBuffer(), i32ToBytes(startIndex)], programId);\n}\n\nexport function getPdaProtocolPositionAddress(\n  programId: PublicKey,\n  poolId: PublicKey,\n  tickLower: number,\n  tickUpper: number,\n): {\n  publicKey: PublicKey;\n  nonce: number;\n} {\n  return findProgramAddress(\n    [POSITION_SEED, poolId.toBuffer(), i32ToBytes(tickLower), i32ToBytes(tickUpper)],\n    programId,\n  );\n}\n\nexport function getPdaPersonalPositionAddress(\n  programId: PublicKey,\n  nftMint: PublicKey,\n): {\n  publicKey: PublicKey;\n  nonce: number;\n} {\n  return findProgramAddress([POSITION_SEED, nftMint.toBuffer()], programId);\n}\n\nexport function getPdaMetadataKey(mint: PublicKey): {\n  publicKey: PublicKey;\n  nonce: number;\n} {\n  return findProgramAddress(\n    [Buffer.from(\"metadata\", \"utf8\"), METADATA_PROGRAM_ID.toBuffer(), mint.toBuffer()],\n    METADATA_PROGRAM_ID,\n  );\n}\n\nexport function getPdaOperationAccount(programId: PublicKey): {\n  publicKey: PublicKey;\n  nonce: number;\n} {\n  return findProgramAddress([OPERATION_SEED], programId);\n}\n\nexport function getPdaExBitmapAccount(\n  programId: PublicKey,\n  poolId: PublicKey,\n): {\n  publicKey: PublicKey;\n  nonce: number;\n} {\n  return findProgramAddress([POOL_TICK_ARRAY_BITMAP_SEED, poolId.toBuffer()], programId);\n}\n","import BN from \"bn.js\";\n\nexport const ZERO = new BN(0);\nexport const ONE = new BN(1);\nexport const NEGATIVE_ONE = new BN(-1);\n\nexport const Q64 = new BN(1).shln(64);\nexport const Q128 = new BN(1).shln(128);\n\nexport const MaxU64 = Q64.sub(ONE);\n\nexport const U64Resolution = 64;\n\nexport const MaxUint128 = Q128.subn(1);\n\nexport const MIN_TICK = -443636;\nexport const MAX_TICK = -MIN_TICK;\n\nexport const MIN_SQRT_PRICE_X64: BN = new BN(\"4295048016\");\nexport const MAX_SQRT_PRICE_X64: BN = new BN(\"79226673521066979257578248091\");\n\nexport const MIN_SQRT_PRICE_X64_ADD_ONE: BN = new BN(\"4295048017\");\nexport const MAX_SQRT_PRICE_X64_SUB_ONE: BN = new BN(\"79226673521066979257578248090\");\n\n// export const MIN_TICK_ARRAY_START_INDEX = -307200;\n// export const MAX_TICK_ARRAY_START_INDEX = 306600;\n\nexport const BIT_PRECISION = 16;\nexport const LOG_B_2_X32 = \"59543866431248\";\nexport const LOG_B_P_ERR_MARGIN_LOWER_X64 = \"184467440737095516\";\nexport const LOG_B_P_ERR_MARGIN_UPPER_X64 = \"15793534762490258745\";\n\nexport const FEE_RATE_DENOMINATOR = new BN(10).pow(new BN(6));\n\nexport enum Fee {\n  rate_500 = 500, //  500 / 10e6 = 0.0005\n  rate_3000 = 3000, // 3000/ 10e6 = 0.003\n  rate_10000 = 10000, // 10000 /10e6 = 0.01\n}\nexport const TICK_SPACINGS: { [amount in Fee]: number } = {\n  [Fee.rate_500]: 10,\n  [Fee.rate_3000]: 60,\n  [Fee.rate_10000]: 200,\n};\n\nexport const mockCreatePoolInfo = {\n  version: 6,\n  liquidity: ZERO,\n  tickCurrent: 0,\n  observationIndex: 0,\n  observationUpdateDuration: 0,\n  feeGrowthGlobalX64A: ZERO,\n  feeGrowthGlobalX64B: ZERO,\n  protocolFeesTokenA: ZERO,\n  protocolFeesTokenB: ZERO,\n  swapInAmountTokenA: ZERO,\n  swapOutAmountTokenB: ZERO,\n  swapInAmountTokenB: ZERO,\n  swapOutAmountTokenA: ZERO,\n  tickArrayBitmap: [],\n\n  rewardInfos: [],\n\n  day: {\n    volume: 0,\n    volumeFee: 0,\n    feeA: 0,\n    feeB: 0,\n    feeApr: 0,\n    rewardApr: { A: 0, B: 0, C: 0 },\n    apr: 0,\n    priceMax: 0,\n    priceMin: 0,\n  },\n  week: {\n    volume: 0,\n    volumeFee: 0,\n    feeA: 0,\n    feeB: 0,\n    feeApr: 0,\n    rewardApr: { A: 0, B: 0, C: 0 },\n    apr: 0,\n    priceMax: 0,\n    priceMin: 0,\n  },\n  month: {\n    volume: 0,\n    volumeFee: 0,\n    feeA: 0,\n    feeB: 0,\n    feeApr: 0,\n    rewardApr: { A: 0, B: 0, C: 0 },\n    apr: 0,\n    priceMax: 0,\n    priceMin: 0,\n  },\n  tvl: 0,\n};\n\nexport const mockV3CreatePoolInfo = {\n  tvl: 0,\n  volumeQuote: 0,\n  mintAmountA: 0,\n  mintAmountB: 0,\n  rewardDefaultInfos: [],\n  farmUpcomingCount: 0,\n  farmOngoingCount: 0,\n  farmFinishedCount: 0,\n\n  day: {\n    volume: 0,\n    volumeQuote: 0,\n    volumeFee: 0,\n    apr: 0,\n    feeApr: 0,\n    priceMin: 0,\n    priceMax: 0,\n    rewardApr: [0],\n  },\n  week: {\n    volume: 0,\n    volumeQuote: 0,\n    volumeFee: 0,\n    apr: 0,\n    feeApr: 0,\n    priceMin: 0,\n    priceMax: 0,\n    rewardApr: [0],\n  },\n  month: {\n    volume: 0,\n    volumeQuote: 0,\n    volumeFee: 0,\n    apr: 0,\n    feeApr: 0,\n    priceMin: 0,\n    priceMax: 0,\n    rewardApr: [0],\n  },\n  pooltype: [],\n};\n\nexport const U64_IGNORE_RANGE = new BN(\"18446744073700000000\");\n","import { Connection, PublicKey } from \"@solana/web3.js\";\nimport BN from \"bn.js\";\n\nimport { getMultipleAccountsInfo } from \"@/common\";\nimport { TickArrayLayout } from \"../layout\";\n\nimport { MAX_TICK, MIN_TICK } from \"./constants\";\nimport { getPdaTickArrayAddress } from \"./pda\";\nimport { Tick, TICK_ARRAY_SIZE, TickArray, TickUtils } from \"./tick\";\nimport { TickArrayBitmapExtensionType } from \"../type\";\n\nexport const FETCH_TICKARRAY_COUNT = 15;\n\nexport declare type PoolVars = {\n  key: PublicKey;\n  tokenA: PublicKey;\n  tokenB: PublicKey;\n  fee: number;\n};\n\nexport class TickQuery {\n  public static async getTickArrays(\n    connection: Connection,\n    programId: PublicKey,\n    poolId: PublicKey,\n    tickCurrent: number,\n    tickSpacing: number,\n    tickArrayBitmapArray: BN[],\n    exTickArrayBitmap: TickArrayBitmapExtensionType,\n  ): Promise<{ [key: string]: TickArray }> {\n    const tickArraysToFetch: PublicKey[] = [];\n    const currentTickArrayStartIndex = TickUtils.getTickArrayStartIndexByTick(tickCurrent, tickSpacing);\n\n    const startIndexArray = TickUtils.getInitializedTickArrayInRange(\n      tickArrayBitmapArray,\n      exTickArrayBitmap,\n      tickSpacing,\n      currentTickArrayStartIndex,\n      Math.floor(FETCH_TICKARRAY_COUNT / 2),\n    );\n    for (let i = 0; i < startIndexArray.length; i++) {\n      const { publicKey: tickArrayAddress } = getPdaTickArrayAddress(programId, poolId, startIndexArray[i]);\n      tickArraysToFetch.push(tickArrayAddress);\n    }\n\n    const fetchedTickArrays = (await getMultipleAccountsInfo(connection, tickArraysToFetch)).map((i) =>\n      i !== null ? TickArrayLayout.decode(i.data) : null,\n    );\n\n    const tickArrayCache: { [key: string]: TickArray } = {};\n    for (let i = 0; i < tickArraysToFetch.length; i++) {\n      const _info = fetchedTickArrays[i];\n      if (_info === null) continue;\n\n      tickArrayCache[_info.startTickIndex] = {\n        ..._info,\n        address: tickArraysToFetch[i],\n      };\n    }\n    return tickArrayCache;\n  }\n\n  public static nextInitializedTick(\n    programId: PublicKey,\n    poolId: PublicKey,\n    tickArrayCache: { [key: string]: TickArray },\n    tickIndex: number,\n    tickSpacing: number,\n    zeroForOne: boolean,\n  ): {\n    nextTick: Tick;\n    tickArrayAddress: PublicKey | undefined;\n    tickArrayStartTickIndex: number;\n  } {\n    let {\n      initializedTick: nextTick,\n      tickArrayAddress,\n      tickArrayStartTickIndex,\n    } = this.nextInitializedTickInOneArray(programId, poolId, tickArrayCache, tickIndex, tickSpacing, zeroForOne);\n    while (nextTick == undefined || nextTick.liquidityGross.lten(0)) {\n      tickArrayStartTickIndex = TickUtils.getNextTickArrayStartIndex(tickArrayStartTickIndex, tickSpacing, zeroForOne);\n      if (this.checkIsValidStartIndex(tickArrayStartTickIndex, tickSpacing)) {\n        throw new Error(\"No enough initialized tickArray\");\n      }\n      const cachedTickArray = tickArrayCache[tickArrayStartTickIndex];\n\n      if (cachedTickArray === undefined) continue;\n\n      const {\n        nextTick: _nextTick,\n        tickArrayAddress: _tickArrayAddress,\n        tickArrayStartTickIndex: _tickArrayStartTickIndex,\n      } = this.firstInitializedTickInOneArray(programId, poolId, cachedTickArray, zeroForOne);\n      [nextTick, tickArrayAddress, tickArrayStartTickIndex] = [_nextTick, _tickArrayAddress, _tickArrayStartTickIndex];\n    }\n    if (nextTick == undefined) {\n      throw new Error(\"No invaild tickArray cache\");\n    }\n    return { nextTick, tickArrayAddress, tickArrayStartTickIndex };\n  }\n\n  public static nextInitializedTickArray(\n    tickIndex: number,\n    tickSpacing: number,\n    zeroForOne: boolean,\n    tickArrayBitmap: BN[],\n    exBitmapInfo: TickArrayBitmapExtensionType,\n  ): {\n    isExist: boolean;\n    nextStartIndex: number;\n  } {\n    const currentOffset = Math.floor(tickIndex / TickQuery.tickCount(tickSpacing));\n    const result: number[] = zeroForOne\n      ? TickUtils.searchLowBitFromStart(tickArrayBitmap, exBitmapInfo, currentOffset - 1, 1, tickSpacing)\n      : TickUtils.searchHightBitFromStart(tickArrayBitmap, exBitmapInfo, currentOffset + 1, 1, tickSpacing);\n\n    return result.length > 0 ? { isExist: true, nextStartIndex: result[0] } : { isExist: false, nextStartIndex: 0 };\n  }\n\n  public static firstInitializedTickInOneArray(\n    programId: PublicKey,\n    poolId: PublicKey,\n    tickArray: TickArray,\n    zeroForOne: boolean,\n  ): {\n    nextTick: Tick | undefined;\n    tickArrayAddress: PublicKey;\n    tickArrayStartTickIndex: number;\n  } {\n    let nextInitializedTick: Tick | undefined = undefined;\n    if (zeroForOne) {\n      let i = TICK_ARRAY_SIZE - 1;\n      while (i >= 0) {\n        const tickInArray = tickArray.ticks[i];\n        if (tickInArray.liquidityGross.gtn(0)) {\n          nextInitializedTick = tickInArray;\n          break;\n        }\n        i = i - 1;\n      }\n    } else {\n      let i = 0;\n      while (i < TICK_ARRAY_SIZE) {\n        const tickInArray = tickArray.ticks[i];\n        if (tickInArray.liquidityGross.gtn(0)) {\n          nextInitializedTick = tickInArray;\n          break;\n        }\n        i = i + 1;\n      }\n    }\n    const { publicKey: tickArrayAddress } = getPdaTickArrayAddress(programId, poolId, tickArray.startTickIndex);\n    return { nextTick: nextInitializedTick, tickArrayAddress, tickArrayStartTickIndex: tickArray.startTickIndex };\n  }\n\n  public static nextInitializedTickInOneArray(\n    programId: PublicKey,\n    poolId: PublicKey,\n    tickArrayCache: { [key: string]: TickArray },\n    tickIndex: number,\n    tickSpacing: number,\n    zeroForOne: boolean,\n  ): {\n    initializedTick: Tick | undefined;\n    tickArrayAddress: PublicKey | undefined;\n    tickArrayStartTickIndex: number;\n  } {\n    const startIndex = TickUtils.getTickArrayStartIndexByTick(tickIndex, tickSpacing);\n    let tickPositionInArray = Math.floor((tickIndex - startIndex) / tickSpacing);\n    const cachedTickArray = tickArrayCache[startIndex];\n    if (cachedTickArray == undefined) {\n      return {\n        initializedTick: undefined,\n        tickArrayAddress: undefined,\n        tickArrayStartTickIndex: startIndex,\n      };\n    }\n    let nextInitializedTick: Tick | undefined = undefined;\n    if (zeroForOne) {\n      while (tickPositionInArray >= 0) {\n        const tickInArray = cachedTickArray.ticks[tickPositionInArray];\n        if (tickInArray.liquidityGross.gtn(0)) {\n          nextInitializedTick = tickInArray;\n          break;\n        }\n        tickPositionInArray = tickPositionInArray - 1;\n      }\n    } else {\n      tickPositionInArray = tickPositionInArray + 1;\n      while (tickPositionInArray < TICK_ARRAY_SIZE) {\n        const tickInArray = cachedTickArray.ticks[tickPositionInArray];\n        if (tickInArray.liquidityGross.gtn(0)) {\n          nextInitializedTick = tickInArray;\n          break;\n        }\n        tickPositionInArray = tickPositionInArray + 1;\n      }\n    }\n    const { publicKey: tickArrayAddress } = getPdaTickArrayAddress(programId, poolId, startIndex);\n    return {\n      initializedTick: nextInitializedTick,\n      tickArrayAddress,\n      tickArrayStartTickIndex: cachedTickArray.startTickIndex,\n    };\n  }\n\n  public static getArrayStartIndex(tickIndex: number, tickSpacing: number): number {\n    const ticksInArray = this.tickCount(tickSpacing);\n    const start = Math.floor(tickIndex / ticksInArray);\n\n    return start * ticksInArray;\n  }\n\n  public static checkIsValidStartIndex(tickIndex: number, tickSpacing: number): boolean {\n    if (TickUtils.checkIsOutOfBoundary(tickIndex)) {\n      if (tickIndex > MAX_TICK) {\n        return false;\n      }\n      const minStartIndex = TickUtils.getTickArrayStartIndexByTick(MIN_TICK, tickSpacing);\n      return tickIndex == minStartIndex;\n    }\n    return tickIndex % this.tickCount(tickSpacing) == 0;\n  }\n\n  public static tickCount(tickSpacing: number): number {\n    return TICK_ARRAY_SIZE * tickSpacing;\n  }\n}\n","import { PublicKey, EpochInfo } from \"@solana/web3.js\";\nimport BN from \"bn.js\";\nimport Decimal from \"decimal.js\";\n\nimport {\n  BIT_PRECISION,\n  Fee,\n  FEE_RATE_DENOMINATOR,\n  LOG_B_2_X32,\n  LOG_B_P_ERR_MARGIN_LOWER_X64,\n  LOG_B_P_ERR_MARGIN_UPPER_X64,\n  MAX_SQRT_PRICE_X64,\n  MAX_TICK,\n  MaxU64,\n  MaxUint128,\n  MIN_SQRT_PRICE_X64,\n  MIN_TICK,\n  NEGATIVE_ONE,\n  ONE,\n  Q64,\n  U64Resolution,\n  ZERO,\n  Q128,\n} from \"./constants\";\nimport { getPdaTickArrayAddress } from \"./pda\";\nimport { PoolUtils } from \"./pool\";\nimport { Tick, TickArray, TickUtils } from \"./tick\";\nimport { ReturnTypeGetLiquidityAmountOut, TickArrayBitmapExtensionType } from \"../type\";\nimport { ApiV3PoolInfoConcentratedItem } from \"@/api/type\";\nimport { getTransferAmountFeeV2, minExpirationTime } from \"@/common/transfer\";\nimport { TickQuery } from \"./tickQuery\";\n\nexport class MathUtil {\n  public static mulDivRoundingUp(a: BN, b: BN, denominator: BN): BN {\n    const numerator = a.mul(b);\n    let result = numerator.div(denominator);\n    if (!numerator.mod(denominator).eq(ZERO)) {\n      result = result.add(ONE);\n    }\n    return result;\n  }\n\n  public static mulDivFloor(a: BN, b: BN, denominator: BN): BN {\n    if (denominator.eq(ZERO)) {\n      throw new Error(\"division by 0\");\n    }\n    return a.mul(b).div(denominator);\n  }\n\n  public static mulDivCeil(a: BN, b: BN, denominator: BN): BN {\n    if (denominator.eq(ZERO)) {\n      throw new Error(\"division by 0\");\n    }\n    const numerator = a.mul(b).add(denominator.sub(ONE));\n    return numerator.div(denominator);\n  }\n\n  public static x64ToDecimal(num: BN, decimalPlaces?: number): Decimal {\n    return new Decimal(num.toString()).div(Decimal.pow(2, 64)).toDecimalPlaces(decimalPlaces);\n  }\n\n  public static decimalToX64(num: Decimal): BN {\n    return new BN(num.mul(Decimal.pow(2, 64)).floor().toFixed());\n  }\n\n  public static wrappingSubU128(n0: BN, n1: BN): BN {\n    return n0.add(Q128).sub(n1).mod(Q128);\n  }\n}\n\n// sqrt price math\nfunction mulRightShift(val: BN, mulBy: BN): BN {\n  return signedRightShift(val.mul(mulBy), 64, 256);\n}\n\nfunction signedLeftShift(n0: BN, shiftBy: number, bitWidth: number): BN {\n  const twosN0 = n0.toTwos(bitWidth).shln(shiftBy);\n  twosN0.imaskn(bitWidth + 1);\n  return twosN0.fromTwos(bitWidth);\n}\n\nfunction signedRightShift(n0: BN, shiftBy: number, bitWidth: number): BN {\n  const twoN0 = n0.toTwos(bitWidth).shrn(shiftBy);\n  twoN0.imaskn(bitWidth - shiftBy + 1);\n  return twoN0.fromTwos(bitWidth - shiftBy);\n}\n\nexport class SqrtPriceMath {\n  public static sqrtPriceX64ToPrice(sqrtPriceX64: BN, decimalsA: number, decimalsB: number): Decimal {\n    return MathUtil.x64ToDecimal(sqrtPriceX64)\n      .pow(2)\n      .mul(Decimal.pow(10, decimalsA - decimalsB));\n  }\n\n  public static priceToSqrtPriceX64(price: Decimal, decimalsA: number, decimalsB: number): BN {\n    return MathUtil.decimalToX64(price.mul(Decimal.pow(10, decimalsB - decimalsA)).sqrt());\n  }\n\n  public static getNextSqrtPriceX64FromInput(sqrtPriceX64: BN, liquidity: BN, amountIn: BN, zeroForOne: boolean): BN {\n    if (!sqrtPriceX64.gt(ZERO)) {\n      throw new Error(\"sqrtPriceX64 must greater than 0\");\n    }\n    if (!liquidity.gt(ZERO)) {\n      throw new Error(\"liquidity must greater than 0\");\n    }\n\n    return zeroForOne\n      ? this.getNextSqrtPriceFromTokenAmountARoundingUp(sqrtPriceX64, liquidity, amountIn, true)\n      : this.getNextSqrtPriceFromTokenAmountBRoundingDown(sqrtPriceX64, liquidity, amountIn, true);\n  }\n\n  public static getNextSqrtPriceX64FromOutput(sqrtPriceX64: BN, liquidity: BN, amountOut: BN, zeroForOne: boolean): BN {\n    if (!sqrtPriceX64.gt(ZERO)) {\n      throw new Error(\"sqrtPriceX64 must greater than 0\");\n    }\n    if (!liquidity.gt(ZERO)) {\n      throw new Error(\"liquidity must greater than 0\");\n    }\n\n    return zeroForOne\n      ? this.getNextSqrtPriceFromTokenAmountBRoundingDown(sqrtPriceX64, liquidity, amountOut, false)\n      : this.getNextSqrtPriceFromTokenAmountARoundingUp(sqrtPriceX64, liquidity, amountOut, false);\n  }\n\n  private static getNextSqrtPriceFromTokenAmountARoundingUp(\n    sqrtPriceX64: BN,\n    liquidity: BN,\n    amount: BN,\n    add: boolean,\n  ): BN {\n    if (amount.eq(ZERO)) return sqrtPriceX64;\n    const liquidityLeftShift = liquidity.shln(U64Resolution);\n\n    if (add) {\n      const numerator1 = liquidityLeftShift;\n      const denominator = liquidityLeftShift.add(amount.mul(sqrtPriceX64));\n      if (denominator.gte(numerator1)) {\n        return MathUtil.mulDivCeil(numerator1, sqrtPriceX64, denominator);\n      }\n      return MathUtil.mulDivRoundingUp(numerator1, ONE, numerator1.div(sqrtPriceX64).add(amount));\n    } else {\n      const amountMulSqrtPrice = amount.mul(sqrtPriceX64);\n      if (!liquidityLeftShift.gt(amountMulSqrtPrice)) {\n        throw new Error(\"getNextSqrtPriceFromTokenAmountARoundingUp,liquidityLeftShift must gt amountMulSqrtPrice\");\n      }\n      const denominator = liquidityLeftShift.sub(amountMulSqrtPrice);\n      return MathUtil.mulDivCeil(liquidityLeftShift, sqrtPriceX64, denominator);\n    }\n  }\n\n  private static getNextSqrtPriceFromTokenAmountBRoundingDown(\n    sqrtPriceX64: BN,\n    liquidity: BN,\n    amount: BN,\n    add: boolean,\n  ): BN {\n    const deltaY = amount.shln(U64Resolution);\n    if (add) {\n      return sqrtPriceX64.add(deltaY.div(liquidity));\n    } else {\n      const amountDivLiquidity = MathUtil.mulDivRoundingUp(deltaY, ONE, liquidity);\n      if (!sqrtPriceX64.gt(amountDivLiquidity)) {\n        throw new Error(\"getNextSqrtPriceFromTokenAmountBRoundingDown sqrtPriceX64 must gt amountDivLiquidity\");\n      }\n      return sqrtPriceX64.sub(amountDivLiquidity);\n    }\n  }\n\n  public static getSqrtPriceX64FromTick(tick: number): BN {\n    if (!Number.isInteger(tick)) {\n      throw new Error(\"tick must be integer\");\n    }\n    if (tick < MIN_TICK || tick > MAX_TICK) {\n      throw new Error(\"tick must be in MIN_TICK and MAX_TICK\");\n    }\n    const tickAbs: number = tick < 0 ? tick * -1 : tick;\n\n    let ratio: BN = (tickAbs & 0x1) != 0 ? new BN(\"18445821805675395072\") : new BN(\"18446744073709551616\");\n    if ((tickAbs & 0x2) != 0) ratio = mulRightShift(ratio, new BN(\"18444899583751176192\"));\n    if ((tickAbs & 0x4) != 0) ratio = mulRightShift(ratio, new BN(\"18443055278223355904\"));\n    if ((tickAbs & 0x8) != 0) ratio = mulRightShift(ratio, new BN(\"18439367220385607680\"));\n    if ((tickAbs & 0x10) != 0) ratio = mulRightShift(ratio, new BN(\"18431993317065453568\"));\n    if ((tickAbs & 0x20) != 0) ratio = mulRightShift(ratio, new BN(\"18417254355718170624\"));\n    if ((tickAbs & 0x40) != 0) ratio = mulRightShift(ratio, new BN(\"18387811781193609216\"));\n    if ((tickAbs & 0x80) != 0) ratio = mulRightShift(ratio, new BN(\"18329067761203558400\"));\n    if ((tickAbs & 0x100) != 0) ratio = mulRightShift(ratio, new BN(\"18212142134806163456\"));\n    if ((tickAbs & 0x200) != 0) ratio = mulRightShift(ratio, new BN(\"17980523815641700352\"));\n    if ((tickAbs & 0x400) != 0) ratio = mulRightShift(ratio, new BN(\"17526086738831433728\"));\n    if ((tickAbs & 0x800) != 0) ratio = mulRightShift(ratio, new BN(\"16651378430235570176\"));\n    if ((tickAbs & 0x1000) != 0) ratio = mulRightShift(ratio, new BN(\"15030750278694412288\"));\n    if ((tickAbs & 0x2000) != 0) ratio = mulRightShift(ratio, new BN(\"12247334978884435968\"));\n    if ((tickAbs & 0x4000) != 0) ratio = mulRightShift(ratio, new BN(\"8131365268886854656\"));\n    if ((tickAbs & 0x8000) != 0) ratio = mulRightShift(ratio, new BN(\"3584323654725218816\"));\n    if ((tickAbs & 0x10000) != 0) ratio = mulRightShift(ratio, new BN(\"696457651848324352\"));\n    if ((tickAbs & 0x20000) != 0) ratio = mulRightShift(ratio, new BN(\"26294789957507116\"));\n    if ((tickAbs & 0x40000) != 0) ratio = mulRightShift(ratio, new BN(\"37481735321082\"));\n\n    if (tick > 0) ratio = MaxUint128.div(ratio);\n    return ratio;\n  }\n\n  public static getTickFromPrice(price: Decimal, decimalsA: number, decimalsB: number): number {\n    return SqrtPriceMath.getTickFromSqrtPriceX64(SqrtPriceMath.priceToSqrtPriceX64(price, decimalsA, decimalsB));\n  }\n\n  public static getTickFromSqrtPriceX64(sqrtPriceX64: BN): number {\n    if (sqrtPriceX64.gt(MAX_SQRT_PRICE_X64) || sqrtPriceX64.lt(MIN_SQRT_PRICE_X64)) {\n      throw new Error(\"Provided sqrtPrice is not within the supported sqrtPrice range.\");\n    }\n\n    const msb = sqrtPriceX64.bitLength() - 1;\n    const adjustedMsb = new BN(msb - 64);\n    const log2pIntegerX32 = signedLeftShift(adjustedMsb, 32, 128);\n\n    let bit = new BN(\"8000000000000000\", \"hex\");\n    let precision = 0;\n    let log2pFractionX64 = new BN(0);\n\n    let r = msb >= 64 ? sqrtPriceX64.shrn(msb - 63) : sqrtPriceX64.shln(63 - msb);\n\n    while (bit.gt(new BN(0)) && precision < BIT_PRECISION) {\n      r = r.mul(r);\n      const rMoreThanTwo = r.shrn(127);\n      r = r.shrn(63 + rMoreThanTwo.toNumber());\n      log2pFractionX64 = log2pFractionX64.add(bit.mul(rMoreThanTwo));\n      bit = bit.shrn(1);\n      precision += 1;\n    }\n\n    const log2pFractionX32 = log2pFractionX64.shrn(32);\n\n    const log2pX32 = log2pIntegerX32.add(log2pFractionX32);\n    const logbpX64 = log2pX32.mul(new BN(LOG_B_2_X32));\n\n    const tickLow = signedRightShift(logbpX64.sub(new BN(LOG_B_P_ERR_MARGIN_LOWER_X64)), 64, 128).toNumber();\n    const tickHigh = signedRightShift(logbpX64.add(new BN(LOG_B_P_ERR_MARGIN_UPPER_X64)), 64, 128).toNumber();\n\n    if (tickLow == tickHigh) {\n      return tickLow;\n    } else {\n      const derivedTickHighSqrtPriceX64 = SqrtPriceMath.getSqrtPriceX64FromTick(tickHigh);\n      return derivedTickHighSqrtPriceX64.lte(sqrtPriceX64) ? tickHigh : tickLow;\n    }\n  }\n}\n\n// tick math\nexport class TickMath {\n  public static getTickWithPriceAndTickspacing(\n    price: Decimal,\n    tickSpacing: number,\n    mintDecimalsA: number,\n    mintDecimalsB: number,\n  ): number {\n    const tick = SqrtPriceMath.getTickFromSqrtPriceX64(\n      SqrtPriceMath.priceToSqrtPriceX64(price, mintDecimalsA, mintDecimalsB),\n    );\n    let result = tick / tickSpacing;\n    if (result < 0) {\n      result = Math.floor(result);\n    } else {\n      result = Math.ceil(result);\n    }\n    return result * tickSpacing;\n  }\n\n  public static roundPriceWithTickspacing(\n    price: Decimal,\n    tickSpacing: number,\n    mintDecimalsA: number,\n    mintDecimalsB: number,\n  ): Decimal {\n    const tick = TickMath.getTickWithPriceAndTickspacing(price, tickSpacing, mintDecimalsA, mintDecimalsB);\n    const sqrtPriceX64 = SqrtPriceMath.getSqrtPriceX64FromTick(tick);\n    return SqrtPriceMath.sqrtPriceX64ToPrice(sqrtPriceX64, mintDecimalsA, mintDecimalsB);\n  }\n}\n\nexport class LiquidityMath {\n  public static addDelta(x: BN, y: BN): BN {\n    return x.add(y);\n  }\n\n  public static getTokenAmountAFromLiquidity(\n    sqrtPriceX64A: BN,\n    sqrtPriceX64B: BN,\n    liquidity: BN,\n    roundUp: boolean,\n  ): BN {\n    if (sqrtPriceX64A.gt(sqrtPriceX64B)) {\n      [sqrtPriceX64A, sqrtPriceX64B] = [sqrtPriceX64B, sqrtPriceX64A];\n    }\n\n    if (!sqrtPriceX64A.gt(ZERO)) {\n      throw new Error(\"sqrtPriceX64A must greater than 0\");\n    }\n\n    const numerator1 = liquidity.ushln(U64Resolution);\n    const numerator2 = sqrtPriceX64B.sub(sqrtPriceX64A);\n\n    return roundUp\n      ? MathUtil.mulDivRoundingUp(MathUtil.mulDivCeil(numerator1, numerator2, sqrtPriceX64B), ONE, sqrtPriceX64A)\n      : MathUtil.mulDivFloor(numerator1, numerator2, sqrtPriceX64B).div(sqrtPriceX64A);\n  }\n\n  public static getTokenAmountBFromLiquidity(\n    sqrtPriceX64A: BN,\n    sqrtPriceX64B: BN,\n    liquidity: BN,\n    roundUp: boolean,\n  ): BN {\n    if (sqrtPriceX64A.gt(sqrtPriceX64B)) {\n      [sqrtPriceX64A, sqrtPriceX64B] = [sqrtPriceX64B, sqrtPriceX64A];\n    }\n    if (!sqrtPriceX64A.gt(ZERO)) {\n      throw new Error(\"sqrtPriceX64A must greater than 0\");\n    }\n\n    return roundUp\n      ? MathUtil.mulDivCeil(liquidity, sqrtPriceX64B.sub(sqrtPriceX64A), Q64)\n      : MathUtil.mulDivFloor(liquidity, sqrtPriceX64B.sub(sqrtPriceX64A), Q64);\n  }\n\n  public static getLiquidityFromTokenAmountA(sqrtPriceX64A: BN, sqrtPriceX64B: BN, amountA: BN, roundUp: boolean): BN {\n    if (sqrtPriceX64A.gt(sqrtPriceX64B)) {\n      [sqrtPriceX64A, sqrtPriceX64B] = [sqrtPriceX64B, sqrtPriceX64A];\n    }\n\n    const numerator = amountA.mul(sqrtPriceX64A).mul(sqrtPriceX64B);\n    const denominator = sqrtPriceX64B.sub(sqrtPriceX64A);\n    const result = numerator.div(denominator);\n\n    if (roundUp) {\n      return MathUtil.mulDivRoundingUp(result, ONE, MaxU64);\n    } else {\n      return result.shrn(U64Resolution);\n    }\n  }\n\n  public static getLiquidityFromTokenAmountB(sqrtPriceX64A: BN, sqrtPriceX64B: BN, amountB: BN): BN {\n    if (sqrtPriceX64A.gt(sqrtPriceX64B)) {\n      [sqrtPriceX64A, sqrtPriceX64B] = [sqrtPriceX64B, sqrtPriceX64A];\n    }\n    return MathUtil.mulDivFloor(amountB, MaxU64, sqrtPriceX64B.sub(sqrtPriceX64A));\n  }\n\n  public static getLiquidityFromTokenAmounts(\n    sqrtPriceCurrentX64: BN,\n    sqrtPriceX64A: BN,\n    sqrtPriceX64B: BN,\n    amountA: BN,\n    amountB: BN,\n  ): BN {\n    if (sqrtPriceX64A.gt(sqrtPriceX64B)) {\n      [sqrtPriceX64A, sqrtPriceX64B] = [sqrtPriceX64B, sqrtPriceX64A];\n    }\n\n    if (sqrtPriceCurrentX64.lte(sqrtPriceX64A)) {\n      return LiquidityMath.getLiquidityFromTokenAmountA(sqrtPriceX64A, sqrtPriceX64B, amountA, false);\n    } else if (sqrtPriceCurrentX64.lt(sqrtPriceX64B)) {\n      const liquidity0 = LiquidityMath.getLiquidityFromTokenAmountA(sqrtPriceCurrentX64, sqrtPriceX64B, amountA, false);\n      const liquidity1 = LiquidityMath.getLiquidityFromTokenAmountB(sqrtPriceX64A, sqrtPriceCurrentX64, amountB);\n      return liquidity0.lt(liquidity1) ? liquidity0 : liquidity1;\n    } else {\n      return LiquidityMath.getLiquidityFromTokenAmountB(sqrtPriceX64A, sqrtPriceX64B, amountB);\n    }\n  }\n\n  public static getAmountsFromLiquidity(\n    sqrtPriceCurrentX64: BN,\n    sqrtPriceX64A: BN,\n    sqrtPriceX64B: BN,\n    liquidity: BN,\n    roundUp: boolean,\n  ): { amountA: BN; amountB: BN } {\n    if (sqrtPriceX64A.gt(sqrtPriceX64B)) {\n      [sqrtPriceX64A, sqrtPriceX64B] = [sqrtPriceX64B, sqrtPriceX64A];\n    }\n\n    if (sqrtPriceCurrentX64.lte(sqrtPriceX64A)) {\n      return {\n        amountA: LiquidityMath.getTokenAmountAFromLiquidity(sqrtPriceX64A, sqrtPriceX64B, liquidity, roundUp),\n        amountB: new BN(0),\n      };\n    } else if (sqrtPriceCurrentX64.lt(sqrtPriceX64B)) {\n      const amountA = LiquidityMath.getTokenAmountAFromLiquidity(\n        sqrtPriceCurrentX64,\n        sqrtPriceX64B,\n        liquidity,\n        roundUp,\n      );\n      const amountB = LiquidityMath.getTokenAmountBFromLiquidity(\n        sqrtPriceX64A,\n        sqrtPriceCurrentX64,\n        liquidity,\n        roundUp,\n      );\n      return { amountA, amountB };\n    } else {\n      return {\n        amountA: new BN(0),\n        amountB: LiquidityMath.getTokenAmountBFromLiquidity(sqrtPriceX64A, sqrtPriceX64B, liquidity, roundUp),\n      };\n    }\n  }\n\n  public static getAmountsFromLiquidityWithSlippage(\n    sqrtPriceCurrentX64: BN,\n    sqrtPriceX64A: BN,\n    sqrtPriceX64B: BN,\n    liquidity: BN,\n    amountMax: boolean,\n    roundUp: boolean,\n    amountSlippage: number,\n  ): { amountSlippageA: BN; amountSlippageB: BN } {\n    const { amountA, amountB } = LiquidityMath.getAmountsFromLiquidity(\n      sqrtPriceCurrentX64,\n      sqrtPriceX64A,\n      sqrtPriceX64B,\n      liquidity,\n      roundUp,\n    );\n    const coefficient = amountMax ? 1 + amountSlippage : 1 - amountSlippage;\n\n    const amount0Slippage = new BN(new Decimal(amountA.toString()).mul(coefficient).toFixed(0));\n    const amount1Slippage = new BN(new Decimal(amountB.toString()).mul(coefficient).toFixed(0));\n    return {\n      amountSlippageA: amount0Slippage,\n      amountSlippageB: amount1Slippage,\n    };\n  }\n\n  public static getAmountsOutFromLiquidity({\n    poolInfo,\n    tickLower,\n    tickUpper,\n    liquidity,\n    slippage,\n    add,\n    epochInfo,\n    amountAddFee,\n  }: {\n    poolInfo: ApiV3PoolInfoConcentratedItem;\n    tickLower: number;\n    tickUpper: number;\n    liquidity: BN;\n    slippage: number;\n    add: boolean;\n\n    epochInfo: EpochInfo;\n    amountAddFee: boolean;\n  }): ReturnTypeGetLiquidityAmountOut {\n    const sqrtPriceX64 = SqrtPriceMath.priceToSqrtPriceX64(\n      new Decimal(poolInfo.price),\n      poolInfo.mintA.decimals,\n      poolInfo.mintB.decimals,\n    );\n    const sqrtPriceX64A = SqrtPriceMath.getSqrtPriceX64FromTick(tickLower);\n    const sqrtPriceX64B = SqrtPriceMath.getSqrtPriceX64FromTick(tickUpper);\n\n    const coefficientRe = add ? 1 + slippage : 1 - slippage;\n\n    const amounts = LiquidityMath.getAmountsFromLiquidity(sqrtPriceX64, sqrtPriceX64A, sqrtPriceX64B, liquidity, add);\n\n    const [amountA, amountB] = [\n      getTransferAmountFeeV2(amounts.amountA, poolInfo.mintA.extensions?.feeConfig, epochInfo, amountAddFee),\n      getTransferAmountFeeV2(amounts.amountB, poolInfo.mintB.extensions?.feeConfig, epochInfo, amountAddFee),\n    ];\n    const [amountSlippageA, amountSlippageB] = [\n      getTransferAmountFeeV2(\n        new BN(new Decimal(amounts.amountA.toString()).mul(coefficientRe).toFixed(0)),\n        poolInfo.mintA.extensions?.feeConfig,\n        epochInfo,\n        amountAddFee,\n      ),\n      getTransferAmountFeeV2(\n        new BN(new Decimal(amounts.amountB.toString()).mul(coefficientRe).toFixed(0)),\n        poolInfo.mintB.extensions?.feeConfig,\n        epochInfo,\n        amountAddFee,\n      ),\n    ];\n\n    return {\n      liquidity,\n      amountA,\n      amountB,\n      amountSlippageA,\n      amountSlippageB,\n      expirationTime: minExpirationTime(amountA.expirationTime, amountB.expirationTime),\n    };\n  }\n}\n\n// swap math\n\ntype SwapStep = {\n  sqrtPriceX64Next: BN;\n  amountIn: BN;\n  amountOut: BN;\n  feeAmount: BN;\n};\n\nexport interface StepComputations {\n  sqrtPriceStartX64: BN;\n  tickNext: number;\n  initialized: boolean;\n  sqrtPriceNextX64: BN;\n  amountIn: BN;\n  amountOut: BN;\n  feeAmount: BN;\n}\n\nexport abstract class SwapMath {\n  public static swapCompute(\n    programId: PublicKey,\n    poolId: PublicKey,\n    tickArrayCache: { [key: string]: TickArray },\n    tickArrayBitmap: BN[],\n    tickarrayBitmapExtension: TickArrayBitmapExtensionType,\n    zeroForOne: boolean,\n    fee: number,\n    liquidity: BN,\n    currentTick: number,\n    tickSpacing: number,\n    currentSqrtPriceX64: BN,\n    amountSpecified: BN,\n    lastSavedTickArrayStartIndex: number,\n    sqrtPriceLimitX64?: BN,\n    catchLiquidityInsufficient = false,\n  ): {\n    allTrade: boolean;\n    amountSpecifiedRemaining: BN;\n    amountCalculated: BN;\n    feeAmount: BN;\n    sqrtPriceX64: BN;\n    liquidity: BN;\n    tickCurrent: number;\n    accounts: PublicKey[];\n  } {\n    if (amountSpecified.eq(ZERO)) {\n      throw new Error(\"amountSpecified must not be 0\");\n    }\n    if (!sqrtPriceLimitX64) sqrtPriceLimitX64 = zeroForOne ? MIN_SQRT_PRICE_X64.add(ONE) : MAX_SQRT_PRICE_X64.sub(ONE);\n\n    if (zeroForOne) {\n      if (sqrtPriceLimitX64.lt(MIN_SQRT_PRICE_X64)) {\n        throw new Error(\"sqrtPriceX64 must greater than MIN_SQRT_PRICE_X64\");\n      }\n\n      if (sqrtPriceLimitX64.gte(currentSqrtPriceX64)) {\n        throw new Error(\"sqrtPriceX64 must smaller than current\");\n      }\n    } else {\n      if (sqrtPriceLimitX64.gt(MAX_SQRT_PRICE_X64)) {\n        throw new Error(\"sqrtPriceX64 must smaller than MAX_SQRT_PRICE_X64\");\n      }\n\n      if (sqrtPriceLimitX64.lte(currentSqrtPriceX64)) {\n        throw new Error(\"sqrtPriceX64 must greater than current\");\n      }\n    }\n    const baseInput = amountSpecified.gt(ZERO);\n\n    const state = {\n      amountSpecifiedRemaining: amountSpecified,\n      amountCalculated: ZERO,\n      sqrtPriceX64: currentSqrtPriceX64,\n      tick:\n        currentTick > lastSavedTickArrayStartIndex\n          ? Math.min(lastSavedTickArrayStartIndex + TickQuery.tickCount(tickSpacing) - 1, currentTick)\n          : lastSavedTickArrayStartIndex,\n      accounts: [] as PublicKey[],\n      liquidity,\n      feeAmount: new BN(0),\n    };\n    let tickAarrayStartIndex = lastSavedTickArrayStartIndex;\n    let tickArrayCurrent = tickArrayCache[lastSavedTickArrayStartIndex];\n    let loopCount = 0;\n    let t = !zeroForOne && tickArrayCurrent.startTickIndex === state.tick;\n    while (\n      !state.amountSpecifiedRemaining.eq(ZERO) &&\n      !state.sqrtPriceX64.eq(sqrtPriceLimitX64)\n      // state.tick < MAX_TICK &&\n      // state.tick > MIN_TICK\n    ) {\n      if (loopCount > 10) {\n        // throw Error('liquidity limit')\n      }\n      const step: Partial<StepComputations> = {};\n      step.sqrtPriceStartX64 = state.sqrtPriceX64;\n\n      const tickState: Tick | null = TickUtils.nextInitTick(tickArrayCurrent, state.tick, tickSpacing, zeroForOne, t);\n\n      let nextInitTick: Tick | null = tickState ? tickState : null; // TickUtils.firstInitializedTick(tickArrayCurrent, zeroForOne)\n      let tickArrayAddress: null | PublicKey = null;\n\n      if (!nextInitTick?.liquidityGross.gtn(0)) {\n        const nextInitTickArrayIndex = PoolUtils.nextInitializedTickArrayStartIndex(\n          {\n            tickCurrent: state.tick,\n            tickSpacing,\n            tickArrayBitmap,\n            exBitmapInfo: tickarrayBitmapExtension,\n          },\n          tickAarrayStartIndex,\n          zeroForOne,\n        );\n        if (!nextInitTickArrayIndex.isExist) {\n          if (catchLiquidityInsufficient) {\n            return {\n              allTrade: false,\n              amountSpecifiedRemaining: state.amountSpecifiedRemaining,\n              amountCalculated: state.amountCalculated,\n              feeAmount: state.feeAmount,\n              sqrtPriceX64: state.sqrtPriceX64,\n              liquidity: state.liquidity,\n              tickCurrent: state.tick,\n              accounts: state.accounts,\n            };\n          }\n          throw Error(\"swapCompute LiquidityInsufficient\");\n        }\n        tickAarrayStartIndex = nextInitTickArrayIndex.nextStartIndex;\n\n        const { publicKey: expectedNextTickArrayAddress } = getPdaTickArrayAddress(\n          programId,\n          poolId,\n          tickAarrayStartIndex,\n        );\n        tickArrayAddress = expectedNextTickArrayAddress;\n        tickArrayCurrent = tickArrayCache[tickAarrayStartIndex];\n\n        try {\n          nextInitTick = TickUtils.firstInitializedTick(tickArrayCurrent, zeroForOne);\n        } catch (e) {\n          throw Error(\"not found next tick info\");\n        }\n      }\n\n      step.tickNext = nextInitTick.tick;\n      step.initialized = nextInitTick.liquidityGross.gtn(0);\n      if (lastSavedTickArrayStartIndex !== tickAarrayStartIndex && tickArrayAddress) {\n        state.accounts.push(tickArrayAddress);\n        lastSavedTickArrayStartIndex = tickAarrayStartIndex;\n      }\n      if (step.tickNext < MIN_TICK) {\n        step.tickNext = MIN_TICK;\n      } else if (step.tickNext > MAX_TICK) {\n        step.tickNext = MAX_TICK;\n      }\n\n      step.sqrtPriceNextX64 = SqrtPriceMath.getSqrtPriceX64FromTick(step.tickNext);\n      let targetPrice: BN;\n      if (\n        (zeroForOne && step.sqrtPriceNextX64.lt(sqrtPriceLimitX64)) ||\n        (!zeroForOne && step.sqrtPriceNextX64.gt(sqrtPriceLimitX64))\n      ) {\n        targetPrice = sqrtPriceLimitX64;\n      } else {\n        targetPrice = step.sqrtPriceNextX64;\n      }\n      [state.sqrtPriceX64, step.amountIn, step.amountOut, step.feeAmount] = SwapMath.swapStepCompute(\n        state.sqrtPriceX64,\n        targetPrice,\n        state.liquidity,\n        state.amountSpecifiedRemaining,\n        fee,\n      );\n\n      state.feeAmount = state.feeAmount.add(step.feeAmount);\n\n      if (baseInput) {\n        state.amountSpecifiedRemaining = state.amountSpecifiedRemaining.sub(step.amountIn.add(step.feeAmount));\n        state.amountCalculated = state.amountCalculated.sub(step.amountOut);\n      } else {\n        state.amountSpecifiedRemaining = state.amountSpecifiedRemaining.add(step.amountOut);\n        state.amountCalculated = state.amountCalculated.add(step.amountIn.add(step.feeAmount));\n      }\n      if (state.sqrtPriceX64.eq(step.sqrtPriceNextX64)) {\n        if (step.initialized) {\n          let liquidityNet = nextInitTick.liquidityNet;\n          if (zeroForOne) liquidityNet = liquidityNet.mul(NEGATIVE_ONE);\n          state.liquidity = LiquidityMath.addDelta(state.liquidity, liquidityNet);\n        }\n\n        t = step.tickNext != state.tick && !zeroForOne && tickArrayCurrent.startTickIndex === step.tickNext;\n        state.tick = zeroForOne ? step.tickNext - 1 : step.tickNext; //\n      } else if (state.sqrtPriceX64 != step.sqrtPriceStartX64) {\n        const _T = SqrtPriceMath.getTickFromSqrtPriceX64(state.sqrtPriceX64);\n        t = _T != state.tick && !zeroForOne && tickArrayCurrent.startTickIndex === _T;\n        state.tick = _T;\n      }\n      ++loopCount;\n    }\n\n    try {\n      const { nextStartIndex: tickAarrayStartIndex, isExist } = TickQuery.nextInitializedTickArray(\n        state.tick,\n        tickSpacing,\n        zeroForOne,\n        tickArrayBitmap,\n        tickarrayBitmapExtension,\n      );\n      if (isExist && lastSavedTickArrayStartIndex !== tickAarrayStartIndex) {\n        state.accounts.push(getPdaTickArrayAddress(programId, poolId, tickAarrayStartIndex).publicKey);\n        lastSavedTickArrayStartIndex = tickAarrayStartIndex;\n      }\n    } catch (e) {\n      /* empty */\n    }\n\n    return {\n      allTrade: true,\n      amountSpecifiedRemaining: ZERO,\n      amountCalculated: state.amountCalculated,\n      feeAmount: state.feeAmount,\n      sqrtPriceX64: state.sqrtPriceX64,\n      liquidity: state.liquidity,\n      tickCurrent: state.tick,\n      accounts: state.accounts,\n    };\n  }\n  // public static swapCompute(\n  //   programId: PublicKey,\n  //   poolId: PublicKey,\n  //   tickArrayCache: { [key: string]: TickArray },\n  //   tickArrayBitmap: BN[],\n  //   tickarrayBitmapExtension: TickArrayBitmapExtensionType,\n  //   zeroForOne: boolean,\n  //   fee: number,\n  //   liquidity: BN,\n  //   currentTick: number,\n  //   tickSpacing: number,\n  //   currentSqrtPriceX64: BN,\n  //   amountSpecified: BN,\n  //   lastSavedTickArrayStartIndex: number,\n  //   sqrtPriceLimitX64?: BN,\n  // ): {\n  //   amountCalculated: BN;\n  //   feeAmount: BN;\n  //   sqrtPriceX64: BN;\n  //   liquidity: BN;\n  //   tickCurrent: number;\n  //   accounts: PublicKey[];\n  // } {\n  //   if (amountSpecified.eq(ZERO)) {\n  //     throw new Error(\"amountSpecified must not be 0\");\n  //   }\n  //   if (!sqrtPriceLimitX64) sqrtPriceLimitX64 = zeroForOne ? MIN_SQRT_PRICE_X64.add(ONE) : MAX_SQRT_PRICE_X64.sub(ONE);\n\n  //   if (zeroForOne) {\n  //     if (sqrtPriceLimitX64.lt(MIN_SQRT_PRICE_X64)) {\n  //       throw new Error(\"sqrtPriceX64 must greater than MIN_SQRT_PRICE_X64\");\n  //     }\n\n  //     if (sqrtPriceLimitX64.gte(currentSqrtPriceX64)) {\n  //       throw new Error(\"sqrtPriceX64 must smaller than current\");\n  //     }\n  //   } else {\n  //     if (sqrtPriceLimitX64.gt(MAX_SQRT_PRICE_X64)) {\n  //       throw new Error(\"sqrtPriceX64 must smaller than MAX_SQRT_PRICE_X64\");\n  //     }\n\n  //     if (sqrtPriceLimitX64.lte(currentSqrtPriceX64)) {\n  //       throw new Error(\"sqrtPriceX64 must greater than current\");\n  //     }\n  //   }\n  //   const baseInput = amountSpecified.gt(ZERO);\n\n  //   const state = {\n  //     amountSpecifiedRemaining: amountSpecified,\n  //     amountCalculated: ZERO,\n  //     sqrtPriceX64: currentSqrtPriceX64,\n  //     tick:\n  //       currentTick > lastSavedTickArrayStartIndex\n  //         ? Math.min(lastSavedTickArrayStartIndex + TickQuery.tickCount(tickSpacing) - 1, currentTick)\n  //         : lastSavedTickArrayStartIndex,\n  //     accounts: [] as PublicKey[],\n  //     liquidity,\n  //     feeAmount: new BN(0),\n  //   };\n  //   let tickAarrayStartIndex = lastSavedTickArrayStartIndex;\n  //   let tickArrayCurrent = tickArrayCache[lastSavedTickArrayStartIndex];\n  //   let loopCount = 0;\n  //   while (\n  //     !state.amountSpecifiedRemaining.eq(ZERO) &&\n  //     !state.sqrtPriceX64.eq(sqrtPriceLimitX64)\n  //     // state.tick < MAX_TICK &&\n  //     // state.tick > MIN_TICK\n  //   ) {\n  //     if (loopCount > 10) {\n  //       throw Error(\"liquidity limit\");\n  //     }\n  //     const step: Partial<StepComputations> = {};\n  //     step.sqrtPriceStartX64 = state.sqrtPriceX64;\n\n  //     const tickState: Tick | null = TickUtils.nextInitTick(tickArrayCurrent, state.tick, tickSpacing, zeroForOne);\n\n  //     let nextInitTick: Tick | null = tickState ? tickState : null; // TickUtils.firstInitializedTick(tickArrayCurrent, zeroForOne)\n  //     let tickArrayAddress: PublicKey | null = null;\n\n  //     if (!nextInitTick?.liquidityGross.gtn(0)) {\n  //       const nextInitTickArrayIndex = PoolUtils.nextInitializedTickArrayStartIndex(\n  //         {\n  //           tickCurrent: state.tick,\n  //           tickSpacing,\n  //           tickArrayBitmap,\n  //           exBitmapInfo: tickarrayBitmapExtension,\n  //         },\n  //         tickAarrayStartIndex,\n  //         zeroForOne,\n  //       );\n  //       if (!nextInitTickArrayIndex.isExist) {\n  //         throw Error(\"swapCompute LiquidityInsufficient\");\n  //       }\n  //       tickAarrayStartIndex = nextInitTickArrayIndex.nextStartIndex;\n\n  //       const { publicKey: expectedNextTickArrayAddress } = getPdaTickArrayAddress(\n  //         programId,\n  //         poolId,\n  //         tickAarrayStartIndex,\n  //       );\n  //       tickArrayAddress = expectedNextTickArrayAddress;\n  //       tickArrayCurrent = tickArrayCache[tickAarrayStartIndex];\n\n  //       nextInitTick = TickUtils.firstInitializedTick(tickArrayCurrent, zeroForOne);\n  //     }\n\n  //     step.tickNext = nextInitTick.tick;\n  //     step.initialized = nextInitTick.liquidityGross.gtn(0);\n  //     if (lastSavedTickArrayStartIndex !== tickAarrayStartIndex && tickArrayAddress) {\n  //       state.accounts.push(tickArrayAddress);\n  //       lastSavedTickArrayStartIndex = tickAarrayStartIndex;\n  //     }\n  //     if (step.tickNext < MIN_TICK) {\n  //       step.tickNext = MIN_TICK;\n  //     } else if (step.tickNext > MAX_TICK) {\n  //       step.tickNext = MAX_TICK;\n  //     }\n\n  //     step.sqrtPriceNextX64 = SqrtPriceMath.getSqrtPriceX64FromTick(step.tickNext);\n  //     let targetPrice: BN;\n  //     if (\n  //       (zeroForOne && step.sqrtPriceNextX64.lt(sqrtPriceLimitX64)) ||\n  //       (!zeroForOne && step.sqrtPriceNextX64.gt(sqrtPriceLimitX64))\n  //     ) {\n  //       targetPrice = sqrtPriceLimitX64;\n  //     } else {\n  //       targetPrice = step.sqrtPriceNextX64;\n  //     }\n  //     [state.sqrtPriceX64, step.amountIn, step.amountOut, step.feeAmount] = SwapMath.swapStepCompute(\n  //       state.sqrtPriceX64,\n  //       targetPrice,\n  //       state.liquidity,\n  //       state.amountSpecifiedRemaining,\n  //       fee,\n  //     );\n\n  //     state.feeAmount = state.feeAmount.add(step.feeAmount);\n\n  //     if (baseInput) {\n  //       state.amountSpecifiedRemaining = state.amountSpecifiedRemaining.sub(step.amountIn.add(step.feeAmount));\n  //       state.amountCalculated = state.amountCalculated.sub(step.amountOut);\n  //     } else {\n  //       state.amountSpecifiedRemaining = state.amountSpecifiedRemaining.add(step.amountOut);\n  //       state.amountCalculated = state.amountCalculated.add(step.amountIn.add(step.feeAmount));\n  //     }\n  //     if (state.sqrtPriceX64.eq(step.sqrtPriceNextX64)) {\n  //       if (step.initialized) {\n  //         let liquidityNet = nextInitTick.liquidityNet;\n  //         if (zeroForOne) liquidityNet = liquidityNet.mul(NEGATIVE_ONE);\n  //         state.liquidity = LiquidityMath.addDelta(state.liquidity, liquidityNet);\n  //       }\n  //       state.tick = zeroForOne ? step.tickNext - 1 : step.tickNext;\n  //     } else if (state.sqrtPriceX64 != step.sqrtPriceStartX64) {\n  //       state.tick = SqrtPriceMath.getTickFromSqrtPriceX64(state.sqrtPriceX64);\n  //     }\n  //     ++loopCount;\n  //   }\n\n  //   // try {\n  //   //   console.log('state.tick', state.tick)\n  //   //   const { nextStartIndex: tickAarrayStartIndex } = TickQuery.nextInitializedTickArray(\n  //   //     state.tick,\n  //   //     tickSpacing,\n  //   //     zeroForOne,\n  //   //     tickArrayBitmap,\n  //   //     tickarrayBitmapExtension,\n  //   //   );\n  //   //   if (\n  //   //     lastSavedTickArrayStartIndex !== tickAarrayStartIndex\n  //   //   ) {\n  //   //     state.accounts.push(getPdaTickArrayAddress(\n  //   //       programId,\n  //   //       poolId,\n  //   //       tickAarrayStartIndex,\n  //   //     ).publicKey)\n  //   //     lastSavedTickArrayStartIndex = tickAarrayStartIndex;\n  //   //   }\n  //   // } catch (e) { /* empty */ }\n\n  //   return {\n  //     amountCalculated: state.amountCalculated,\n  //     feeAmount: state.feeAmount,\n  //     sqrtPriceX64: state.sqrtPriceX64,\n  //     liquidity: state.liquidity,\n  //     tickCurrent: state.tick,\n  //     accounts: state.accounts,\n  //   };\n  // }\n\n  private static swapStepCompute(\n    sqrtPriceX64Current: BN,\n    sqrtPriceX64Target: BN,\n    liquidity: BN,\n    amountRemaining: BN,\n    feeRate: Fee,\n  ): [BN, BN, BN, BN] {\n    const swapStep: SwapStep = {\n      sqrtPriceX64Next: new BN(0),\n      amountIn: new BN(0),\n      amountOut: new BN(0),\n      feeAmount: new BN(0),\n    };\n\n    const zeroForOne = sqrtPriceX64Current.gte(sqrtPriceX64Target);\n    const baseInput = amountRemaining.gte(ZERO);\n\n    if (baseInput) {\n      const amountRemainingSubtractFee = MathUtil.mulDivFloor(\n        amountRemaining,\n        FEE_RATE_DENOMINATOR.sub(new BN(feeRate.toString())),\n        FEE_RATE_DENOMINATOR,\n      );\n      swapStep.amountIn = zeroForOne\n        ? LiquidityMath.getTokenAmountAFromLiquidity(sqrtPriceX64Target, sqrtPriceX64Current, liquidity, true)\n        : LiquidityMath.getTokenAmountBFromLiquidity(sqrtPriceX64Current, sqrtPriceX64Target, liquidity, true);\n      if (amountRemainingSubtractFee.gte(swapStep.amountIn)) {\n        swapStep.sqrtPriceX64Next = sqrtPriceX64Target;\n      } else {\n        swapStep.sqrtPriceX64Next = SqrtPriceMath.getNextSqrtPriceX64FromInput(\n          sqrtPriceX64Current,\n          liquidity,\n          amountRemainingSubtractFee,\n          zeroForOne,\n        );\n      }\n    } else {\n      swapStep.amountOut = zeroForOne\n        ? LiquidityMath.getTokenAmountBFromLiquidity(sqrtPriceX64Target, sqrtPriceX64Current, liquidity, false)\n        : LiquidityMath.getTokenAmountAFromLiquidity(sqrtPriceX64Current, sqrtPriceX64Target, liquidity, false);\n      if (amountRemaining.mul(NEGATIVE_ONE).gte(swapStep.amountOut)) {\n        swapStep.sqrtPriceX64Next = sqrtPriceX64Target;\n      } else {\n        swapStep.sqrtPriceX64Next = SqrtPriceMath.getNextSqrtPriceX64FromOutput(\n          sqrtPriceX64Current,\n          liquidity,\n          amountRemaining.mul(NEGATIVE_ONE),\n          zeroForOne,\n        );\n      }\n    }\n\n    const reachTargetPrice = sqrtPriceX64Target.eq(swapStep.sqrtPriceX64Next);\n\n    if (zeroForOne) {\n      if (!(reachTargetPrice && baseInput)) {\n        swapStep.amountIn = LiquidityMath.getTokenAmountAFromLiquidity(\n          swapStep.sqrtPriceX64Next,\n          sqrtPriceX64Current,\n          liquidity,\n          true,\n        );\n      }\n\n      if (!(reachTargetPrice && !baseInput)) {\n        swapStep.amountOut = LiquidityMath.getTokenAmountBFromLiquidity(\n          swapStep.sqrtPriceX64Next,\n          sqrtPriceX64Current,\n          liquidity,\n          false,\n        );\n      }\n    } else {\n      swapStep.amountIn =\n        reachTargetPrice && baseInput\n          ? swapStep.amountIn\n          : LiquidityMath.getTokenAmountBFromLiquidity(sqrtPriceX64Current, swapStep.sqrtPriceX64Next, liquidity, true);\n      swapStep.amountOut =\n        reachTargetPrice && !baseInput\n          ? swapStep.amountOut\n          : LiquidityMath.getTokenAmountAFromLiquidity(\n              sqrtPriceX64Current,\n              swapStep.sqrtPriceX64Next,\n              liquidity,\n              false,\n            );\n    }\n\n    if (!baseInput && swapStep.amountOut.gt(amountRemaining.mul(NEGATIVE_ONE))) {\n      swapStep.amountOut = amountRemaining.mul(NEGATIVE_ONE);\n    }\n    if (baseInput && !swapStep.sqrtPriceX64Next.eq(sqrtPriceX64Target)) {\n      swapStep.feeAmount = amountRemaining.sub(swapStep.amountIn);\n    } else {\n      swapStep.feeAmount = MathUtil.mulDivCeil(\n        swapStep.amountIn,\n        new BN(feeRate),\n        FEE_RATE_DENOMINATOR.sub(new BN(feeRate)),\n      );\n    }\n    return [swapStep.sqrtPriceX64Next, swapStep.amountIn, swapStep.amountOut, swapStep.feeAmount];\n  }\n}\n","import { PublicKey, Connection, EpochInfo } from \"@solana/web3.js\";\nimport BN from \"bn.js\";\n\nimport {\n  ClmmPoolInfo,\n  ClmmPoolRewardInfo,\n  ClmmPoolRewardLayoutInfo,\n  ReturnTypeGetLiquidityAmountOut,\n  TickArrayBitmapExtensionType,\n  ReturnTypeFetchExBitmaps,\n  ReturnTypeFetchMultiplePoolTickArrays,\n  SDKParsedConcentratedInfo,\n  ReturnTypeComputeAmountOut,\n  ReturnTypeComputeAmountOutFormat,\n  ComputeClmmPoolInfo,\n} from \"../type\";\n\nimport { ApiV3PoolInfoConcentratedItem, ApiV3Token } from \"@/api/type\";\n\nimport { NEGATIVE_ONE, Q64, ZERO, MAX_TICK, MIN_TICK, MIN_SQRT_PRICE_X64, MAX_SQRT_PRICE_X64 } from \"./constants\";\nimport { MathUtil, SwapMath, SqrtPriceMath, LiquidityMath } from \"./math\";\nimport { getPdaTickArrayAddress, getPdaPersonalPositionAddress, getPdaExBitmapAccount } from \"./pda\";\nimport { TickArray, TickUtils, TICK_ARRAY_BITMAP_SIZE, Tick } from \"./tick\";\nimport { TickArrayBitmap, TickArrayBitmapExtensionUtils } from \"./tickarrayBitmap\";\nimport { TickQuery } from \"./tickQuery\";\nimport { TickArrayBitmapExtensionLayout, PositionInfoLayout, TickArrayLayout, PoolInfoLayout } from \"../layout\";\nimport {\n  getMultipleAccountsInfo,\n  getMultipleAccountsInfoWithCustomFlags,\n  getTransferAmountFeeV2,\n  minExpirationTime,\n  solToWSol,\n} from \"@/common\";\nimport { TokenAccountRaw } from \"../../account/types\";\nimport { Price, Percent, TokenAmount, Token } from \"../../../module\";\nimport { PositionUtils } from \"./position\";\nimport Decimal from \"decimal.js\";\nimport { TOKEN_2022_PROGRAM_ID } from \"@solana/spl-token\";\n\nexport class PoolUtils {\n  public static getOutputAmountAndRemainAccounts(\n    poolInfo: ComputeClmmPoolInfo,\n    tickArrayCache: { [key: string]: TickArray },\n    inputTokenMint: PublicKey,\n    inputAmount: BN,\n    sqrtPriceLimitX64?: BN,\n    catchLiquidityInsufficient = false,\n  ): {\n    allTrade: boolean;\n    expectedAmountOut: BN;\n    remainingAccounts: PublicKey[];\n    executionPrice: BN;\n    feeAmount: BN;\n  } {\n    const zeroForOne = inputTokenMint.toBase58() === poolInfo.mintA.address;\n\n    const allNeededAccounts: PublicKey[] = [];\n    const {\n      isExist,\n      startIndex: firstTickArrayStartIndex,\n      nextAccountMeta,\n    } = this.getFirstInitializedTickArray(poolInfo, zeroForOne);\n    if (!isExist || firstTickArrayStartIndex === undefined || !nextAccountMeta) throw new Error(\"Invalid tick array\");\n\n    // try {\n    //   const preTick = this.preInitializedTickArrayStartIndex(poolInfo, !zeroForOne)\n    //   if (preTick.isExist) {\n    //     const { publicKey: address } = getPdaTickArrayAddress(\n    //       poolInfo.programId,\n    //       poolInfo.id,\n    //       preTick.nextStartIndex\n    //     );\n    //     allNeededAccounts.push(address)\n    //   }\n    // } catch (e) { /* empty */ }\n\n    allNeededAccounts.push(nextAccountMeta);\n    const {\n      allTrade,\n      amountCalculated: outputAmount,\n      accounts: reaminAccounts,\n      sqrtPriceX64: executionPrice,\n      feeAmount,\n    } = SwapMath.swapCompute(\n      poolInfo.programId,\n      poolInfo.id,\n      tickArrayCache,\n      poolInfo.tickArrayBitmap,\n      poolInfo.exBitmapInfo,\n      zeroForOne,\n      poolInfo.ammConfig.tradeFeeRate,\n      poolInfo.liquidity,\n      poolInfo.tickCurrent,\n      poolInfo.tickSpacing,\n      poolInfo.sqrtPriceX64,\n      inputAmount,\n      firstTickArrayStartIndex,\n      sqrtPriceLimitX64,\n      catchLiquidityInsufficient,\n    );\n    allNeededAccounts.push(...reaminAccounts);\n    return {\n      allTrade,\n      expectedAmountOut: outputAmount.mul(NEGATIVE_ONE),\n      remainingAccounts: allNeededAccounts,\n      executionPrice,\n      feeAmount,\n    };\n  }\n\n  public static getInputAmountAndRemainAccounts(\n    poolInfo: ComputeClmmPoolInfo,\n    tickArrayCache: { [key: string]: TickArray },\n    outputTokenMint: PublicKey,\n    outputAmount: BN,\n    sqrtPriceLimitX64?: BN,\n  ): { expectedAmountIn: BN; remainingAccounts: PublicKey[]; executionPrice: BN; feeAmount: BN } {\n    const zeroForOne = outputTokenMint.toBase58() === poolInfo.mintB.address;\n\n    const allNeededAccounts: PublicKey[] = [];\n    const {\n      isExist,\n      startIndex: firstTickArrayStartIndex,\n      nextAccountMeta,\n    } = this.getFirstInitializedTickArray(poolInfo, zeroForOne);\n    if (!isExist || firstTickArrayStartIndex === undefined || !nextAccountMeta) throw new Error(\"Invalid tick array\");\n\n    try {\n      const preTick = this.preInitializedTickArrayStartIndex(poolInfo, zeroForOne);\n      if (preTick.isExist) {\n        const { publicKey: address } = getPdaTickArrayAddress(poolInfo.programId, poolInfo.id, preTick.nextStartIndex);\n        allNeededAccounts.push(address);\n      }\n    } catch (e) {\n      /* empty */\n    }\n\n    allNeededAccounts.push(nextAccountMeta);\n    const {\n      amountCalculated: inputAmount,\n      accounts: reaminAccounts,\n      sqrtPriceX64: executionPrice,\n      feeAmount,\n    } = SwapMath.swapCompute(\n      poolInfo.programId,\n      poolInfo.id,\n      tickArrayCache,\n      poolInfo.tickArrayBitmap,\n      poolInfo.exBitmapInfo,\n      zeroForOne,\n      poolInfo.ammConfig.tradeFeeRate,\n      poolInfo.liquidity,\n      poolInfo.tickCurrent,\n      poolInfo.tickSpacing,\n      poolInfo.sqrtPriceX64,\n      outputAmount.mul(NEGATIVE_ONE),\n      firstTickArrayStartIndex,\n      sqrtPriceLimitX64,\n    );\n    allNeededAccounts.push(...reaminAccounts);\n    return { expectedAmountIn: inputAmount, remainingAccounts: allNeededAccounts, executionPrice, feeAmount };\n  }\n\n  public static getFirstInitializedTickArray(\n    poolInfo: ComputeClmmPoolInfo,\n    zeroForOne: boolean,\n  ):\n    | { isExist: true; startIndex: number; nextAccountMeta: PublicKey }\n    | { isExist: false; startIndex: undefined; nextAccountMeta: undefined } {\n    const { isInitialized, startIndex } = PoolUtils.isOverflowDefaultTickarrayBitmap(poolInfo.tickSpacing, [\n      poolInfo.tickCurrent,\n    ])\n      ? TickArrayBitmapExtensionUtils.checkTickArrayIsInit(\n          TickQuery.getArrayStartIndex(poolInfo.tickCurrent, poolInfo.tickSpacing),\n          poolInfo.tickSpacing,\n          poolInfo.exBitmapInfo,\n        )\n      : TickUtils.checkTickArrayIsInitialized(\n          TickUtils.mergeTickArrayBitmap(poolInfo.tickArrayBitmap),\n          poolInfo.tickCurrent,\n          poolInfo.tickSpacing,\n        );\n\n    if (isInitialized) {\n      const { publicKey: address } = getPdaTickArrayAddress(poolInfo.programId, poolInfo.id, startIndex);\n      return {\n        isExist: true,\n        startIndex,\n        nextAccountMeta: address,\n      };\n    }\n    const { isExist, nextStartIndex } = this.nextInitializedTickArrayStartIndex(\n      poolInfo,\n      TickQuery.getArrayStartIndex(poolInfo.tickCurrent, poolInfo.tickSpacing),\n      zeroForOne,\n    );\n    if (isExist) {\n      const { publicKey: address } = getPdaTickArrayAddress(poolInfo.programId, poolInfo.id, nextStartIndex);\n      return {\n        isExist: true,\n        startIndex: nextStartIndex,\n        nextAccountMeta: address,\n      };\n    }\n    return { isExist: false, nextAccountMeta: undefined, startIndex: undefined };\n  }\n\n  public static preInitializedTickArrayStartIndex(\n    poolInfo: ComputeClmmPoolInfo,\n    zeroForOne: boolean,\n  ): { isExist: boolean; nextStartIndex: number } {\n    const currentOffset = Math.floor(poolInfo.tickCurrent / TickQuery.tickCount(poolInfo.tickSpacing));\n\n    const result: number[] = !zeroForOne\n      ? TickUtils.searchLowBitFromStart(\n          poolInfo.tickArrayBitmap,\n          poolInfo.exBitmapInfo,\n          currentOffset - 1,\n          1,\n          poolInfo.tickSpacing,\n        )\n      : TickUtils.searchHightBitFromStart(\n          poolInfo.tickArrayBitmap,\n          poolInfo.exBitmapInfo,\n          currentOffset + 1,\n          1,\n          poolInfo.tickSpacing,\n        );\n\n    return result.length > 0 ? { isExist: true, nextStartIndex: result[0] } : { isExist: false, nextStartIndex: 0 };\n  }\n\n  public static nextInitializedTickArrayStartIndex(\n    poolInfo:\n      | {\n          tickCurrent: number;\n          tickSpacing: number;\n          tickArrayBitmap: BN[];\n          exBitmapInfo: TickArrayBitmapExtensionType;\n        }\n      | ClmmPoolInfo,\n    lastTickArrayStartIndex: number,\n    zeroForOne: boolean,\n  ): { isExist: boolean; nextStartIndex: number } {\n    lastTickArrayStartIndex = TickQuery.getArrayStartIndex(poolInfo.tickCurrent, poolInfo.tickSpacing);\n\n    // eslint-disable-next-line no-constant-condition\n    while (true) {\n      const { isInit: startIsInit, tickIndex: startIndex } = TickArrayBitmap.nextInitializedTickArrayStartIndex(\n        TickUtils.mergeTickArrayBitmap(poolInfo.tickArrayBitmap),\n        lastTickArrayStartIndex,\n        poolInfo.tickSpacing,\n        zeroForOne,\n      );\n      if (startIsInit) {\n        return { isExist: true, nextStartIndex: startIndex };\n      }\n      lastTickArrayStartIndex = startIndex;\n\n      const { isInit, tickIndex } = TickArrayBitmapExtensionUtils.nextInitializedTickArrayFromOneBitmap(\n        lastTickArrayStartIndex,\n        poolInfo.tickSpacing,\n        zeroForOne,\n        poolInfo.exBitmapInfo,\n      );\n      if (isInit) return { isExist: true, nextStartIndex: tickIndex };\n\n      lastTickArrayStartIndex = tickIndex;\n\n      if (lastTickArrayStartIndex < MIN_TICK || lastTickArrayStartIndex > MAX_TICK)\n        return { isExist: false, nextStartIndex: 0 };\n    }\n\n    // const tickArrayBitmap = TickUtils.mergeTickArrayBitmap(\n    //   poolInfo.tickArrayBitmap\n    // );\n    // const currentOffset = TickUtils.getTickArrayOffsetInBitmapByTick(\n    //   poolInfo.tickCurrent,\n    //   poolInfo.tickSpacing\n    // );\n    // const result: number[] = zeroForOne ? TickUtils.searchLowBitFromStart(\n    //   tickArrayBitmap,\n    //   currentOffset - 1,\n    //   0,\n    //   1,\n    //   poolInfo.tickSpacing\n    // ) : TickUtils.searchHightBitFromStart(\n    //   tickArrayBitmap,\n    //   currentOffset,\n    //   1024,\n    //   1,\n    //   poolInfo.tickSpacing\n    // );\n\n    // return result.length > 0 ? { isExist: true, nextStartIndex: result[0] } : { isExist: false, nextStartIndex: 0 }\n  }\n\n  public static async updatePoolRewardInfos({\n    connection,\n    apiPoolInfo,\n    chainTime,\n    poolLiquidity,\n    rewardInfos,\n  }: {\n    connection: Connection;\n    apiPoolInfo: ApiV3PoolInfoConcentratedItem;\n    chainTime: number;\n    poolLiquidity: BN;\n    rewardInfos: ClmmPoolRewardLayoutInfo[];\n  }): Promise<ClmmPoolRewardInfo[]> {\n    const nRewardInfo: ClmmPoolRewardInfo[] = [];\n    for (let i = 0; i < rewardInfos.length; i++) {\n      const _itemReward = rewardInfos[i];\n      const apiRewardProgram =\n        apiPoolInfo.rewardDefaultInfos[i]?.mint.programId ??\n        (await connection.getAccountInfo(_itemReward.tokenMint))?.owner;\n      if (apiRewardProgram === undefined) throw Error(\"get new reward mint info error\");\n\n      const itemReward: ClmmPoolRewardInfo = {\n        ..._itemReward,\n        perSecond: MathUtil.x64ToDecimal(_itemReward.emissionsPerSecondX64),\n        remainingRewards: undefined,\n        tokenProgramId: new PublicKey(apiRewardProgram),\n      };\n\n      if (itemReward.tokenMint.equals(PublicKey.default)) continue;\n      if (chainTime <= itemReward.openTime.toNumber() || poolLiquidity.eq(ZERO)) {\n        nRewardInfo.push(itemReward);\n        continue;\n      }\n\n      const latestUpdateTime = new BN(Math.min(itemReward.endTime.toNumber(), chainTime));\n      const timeDelta = latestUpdateTime.sub(itemReward.lastUpdateTime);\n      const rewardGrowthDeltaX64 = MathUtil.mulDivFloor(timeDelta, itemReward.emissionsPerSecondX64, poolLiquidity);\n      const rewardGrowthGlobalX64 = itemReward.rewardGrowthGlobalX64.add(rewardGrowthDeltaX64);\n      const rewardEmissionedDelta = MathUtil.mulDivFloor(timeDelta, itemReward.emissionsPerSecondX64, Q64);\n      const rewardTotalEmissioned = itemReward.rewardTotalEmissioned.add(rewardEmissionedDelta);\n      nRewardInfo.push({\n        ...itemReward,\n        rewardGrowthGlobalX64,\n        rewardTotalEmissioned,\n        lastUpdateTime: latestUpdateTime,\n      });\n    }\n    return nRewardInfo;\n  }\n\n  public static isOverflowDefaultTickarrayBitmap(tickSpacing: number, tickarrayStartIndexs: number[]): boolean {\n    const { maxTickBoundary, minTickBoundary } = this.tickRange(tickSpacing);\n\n    for (const tickIndex of tickarrayStartIndexs) {\n      const tickarrayStartIndex = TickUtils.getTickArrayStartIndexByTick(tickIndex, tickSpacing);\n\n      if (tickarrayStartIndex >= maxTickBoundary || tickarrayStartIndex < minTickBoundary) {\n        return true;\n      }\n    }\n\n    return false;\n  }\n\n  public static tickRange(tickSpacing: number): {\n    maxTickBoundary: number;\n    minTickBoundary: number;\n  } {\n    let maxTickBoundary = TickArrayBitmap.maxTickInTickarrayBitmap(tickSpacing);\n    let minTickBoundary = -maxTickBoundary;\n\n    if (maxTickBoundary > MAX_TICK) {\n      maxTickBoundary = TickQuery.getArrayStartIndex(MAX_TICK, tickSpacing) + TickQuery.tickCount(tickSpacing);\n    }\n    if (minTickBoundary < MIN_TICK) {\n      minTickBoundary = TickQuery.getArrayStartIndex(MIN_TICK, tickSpacing);\n    }\n    return { maxTickBoundary, minTickBoundary };\n  }\n\n  public static get_tick_array_offset(tickarrayStartIndex: number, tickSpacing: number): number {\n    if (!TickQuery.checkIsValidStartIndex(tickarrayStartIndex, tickSpacing)) {\n      throw new Error(\"No enough initialized tickArray\");\n    }\n\n    return (tickarrayStartIndex / TickQuery.tickCount(tickSpacing)) * TICK_ARRAY_BITMAP_SIZE;\n  }\n\n  static async fetchExBitmaps({\n    connection,\n    exBitmapAddress,\n    batchRequest,\n  }: {\n    connection: Connection;\n    exBitmapAddress: PublicKey[];\n    batchRequest: boolean;\n  }): Promise<ReturnTypeFetchExBitmaps> {\n    const fetchedBitmapAccount = await getMultipleAccountsInfoWithCustomFlags(\n      connection,\n      exBitmapAddress.map((i) => ({ pubkey: i })),\n      { batchRequest },\n    );\n\n    const returnTypeFetchExBitmaps: ReturnTypeFetchExBitmaps = {};\n    for (const item of fetchedBitmapAccount) {\n      if (item.accountInfo === null) continue;\n\n      returnTypeFetchExBitmaps[item.pubkey.toString()] = TickArrayBitmapExtensionLayout.decode(item.accountInfo.data);\n    }\n    return returnTypeFetchExBitmaps;\n  }\n\n  static async fetchMultiplePoolTickArrays({\n    connection,\n    poolKeys,\n    batchRequest,\n  }: {\n    connection: Connection;\n    poolKeys: Omit<ComputeClmmPoolInfo, \"ammConfig\">[];\n    batchRequest?: boolean;\n  }): Promise<ReturnTypeFetchMultiplePoolTickArrays> {\n    const tickArraysToPoolId: { [key: string]: PublicKey } = {};\n    const tickArrays: { pubkey: PublicKey }[] = [];\n    for (const itemPoolInfo of poolKeys) {\n      const currentTickArrayStartIndex = TickUtils.getTickArrayStartIndexByTick(\n        itemPoolInfo.tickCurrent,\n        itemPoolInfo.tickSpacing,\n      );\n      const startIndexArray = TickUtils.getInitializedTickArrayInRange(\n        itemPoolInfo.tickArrayBitmap,\n        itemPoolInfo.exBitmapInfo,\n        itemPoolInfo.tickSpacing,\n        currentTickArrayStartIndex,\n        7,\n      );\n      for (const itemIndex of startIndexArray) {\n        const { publicKey: tickArrayAddress } = getPdaTickArrayAddress(\n          itemPoolInfo.programId,\n          itemPoolInfo.id,\n          itemIndex,\n        );\n        tickArrays.push({ pubkey: tickArrayAddress });\n        tickArraysToPoolId[tickArrayAddress.toString()] = itemPoolInfo.id;\n      }\n    }\n\n    const fetchedTickArrays = await getMultipleAccountsInfoWithCustomFlags(connection, tickArrays, { batchRequest });\n\n    const tickArrayCache: ReturnTypeFetchMultiplePoolTickArrays = {};\n\n    for (const itemAccountInfo of fetchedTickArrays) {\n      if (!itemAccountInfo.accountInfo) continue;\n      const poolId = tickArraysToPoolId[itemAccountInfo.pubkey.toString()];\n      if (!poolId) continue;\n      if (tickArrayCache[poolId.toString()] === undefined) tickArrayCache[poolId.toString()] = {};\n\n      const accountLayoutData = TickArrayLayout.decode(itemAccountInfo.accountInfo.data);\n\n      tickArrayCache[poolId.toString()][accountLayoutData.startTickIndex] = {\n        ...accountLayoutData,\n        address: itemAccountInfo.pubkey,\n      };\n    }\n    return tickArrayCache;\n  }\n\n  // deprecated, new api doesn't need\n  static async fetchPoolsAccountPosition({\n    pools,\n    connection,\n    ownerInfo,\n    batchRequest = false,\n    updateOwnerRewardAndFee = true,\n  }: {\n    pools: SDKParsedConcentratedInfo[];\n    connection: Connection;\n    ownerInfo: { wallet: PublicKey; tokenAccounts: TokenAccountRaw[] };\n    batchRequest?: boolean;\n    updateOwnerRewardAndFee?: boolean;\n  }): Promise<SDKParsedConcentratedInfo[]> {\n    const programIds: PublicKey[] = [];\n\n    for (let index = 0; index < pools.length; index++) {\n      const accountInfo = pools[index];\n\n      if (accountInfo === null) continue;\n\n      if (!programIds.find((i) => i.equals(accountInfo.state.programId))) programIds.push(accountInfo.state.programId);\n    }\n\n    if (ownerInfo) {\n      const allMint = ownerInfo.tokenAccounts.map((i) => i.accountInfo.mint);\n      const allPositionKey: PublicKey[] = [];\n      for (const itemMint of allMint) {\n        for (const itemProgramId of programIds) {\n          allPositionKey.push(getPdaPersonalPositionAddress(itemProgramId, itemMint).publicKey);\n        }\n      }\n      const positionAccountInfos = await getMultipleAccountsInfo(connection, allPositionKey, { batchRequest });\n      const keyToTickArrayAddress: { [key: string]: PublicKey } = {};\n      for (const itemAccountInfo of positionAccountInfos) {\n        if (itemAccountInfo === null) continue;\n        // TODO: add check\n\n        const position = PositionInfoLayout.decode(itemAccountInfo.data);\n        const itemPoolId = position.poolId.toString();\n        const poolInfoA = pools.find((pool) => pool.state.id.toBase58() === itemPoolId);\n        if (poolInfoA === undefined) continue;\n\n        const poolInfo = poolInfoA.state;\n\n        const priceLower = TickUtils._getTickPriceLegacy({\n          poolInfo,\n          tick: position.tickLower,\n          baseIn: true,\n        });\n        const priceUpper = TickUtils._getTickPriceLegacy({\n          poolInfo,\n          tick: position.tickUpper,\n          baseIn: true,\n        });\n        const { amountA, amountB } = LiquidityMath.getAmountsFromLiquidity(\n          poolInfo.sqrtPriceX64,\n          priceLower.tickSqrtPriceX64,\n          priceUpper.tickSqrtPriceX64,\n          position.liquidity,\n          false,\n        );\n\n        const leverage = 1 / (1 - Math.sqrt(Math.sqrt(priceLower.price.div(priceUpper.price).toNumber())));\n\n        poolInfoA.positionAccount = [\n          ...(poolInfoA.positionAccount ?? []),\n          {\n            poolId: position.poolId,\n            nftMint: position.nftMint,\n\n            priceLower: priceLower.price,\n            priceUpper: priceUpper.price,\n            amountA,\n            amountB,\n            tickLower: position.tickLower,\n            tickUpper: position.tickUpper,\n            liquidity: position.liquidity,\n            feeGrowthInsideLastX64A: position.feeGrowthInsideLastX64A,\n            feeGrowthInsideLastX64B: position.feeGrowthInsideLastX64B,\n            tokenFeesOwedA: position.tokenFeesOwedA,\n            tokenFeesOwedB: position.tokenFeesOwedB,\n            rewardInfos: position.rewardInfos.map((i) => ({\n              ...i,\n              pendingReward: new BN(0),\n            })),\n\n            leverage,\n            tokenFeeAmountA: new BN(0),\n            tokenFeeAmountB: new BN(0),\n          },\n        ];\n\n        const tickArrayLowerAddress = await TickUtils.getTickArrayAddressByTick(\n          poolInfoA.state.programId,\n          position.poolId,\n          position.tickLower,\n          poolInfoA.state.tickSpacing,\n        );\n        const tickArrayUpperAddress = await TickUtils.getTickArrayAddressByTick(\n          poolInfoA.state.programId,\n          position.poolId,\n          position.tickUpper,\n          poolInfoA.state.tickSpacing,\n        );\n        keyToTickArrayAddress[\n          `${poolInfoA.state.programId.toString()}-${position.poolId.toString()}-${position.tickLower}`\n        ] = tickArrayLowerAddress;\n        keyToTickArrayAddress[\n          `${poolInfoA.state.programId.toString()}-${position.poolId.toString()}-${position.tickUpper}`\n        ] = tickArrayUpperAddress;\n      }\n\n      if (updateOwnerRewardAndFee) {\n        const tickArrayKeys = Object.values(keyToTickArrayAddress);\n        const tickArrayDatas = await getMultipleAccountsInfo(connection, tickArrayKeys, { batchRequest });\n        const tickArrayLayout = {};\n        for (let index = 0; index < tickArrayKeys.length; index++) {\n          const tickArrayData = tickArrayDatas[index];\n          if (tickArrayData === null) continue;\n          const key = tickArrayKeys[index].toString();\n          tickArrayLayout[key] = TickArrayLayout.decode(tickArrayData.data);\n        }\n\n        for (const { state, positionAccount } of pools) {\n          if (!positionAccount) continue;\n          for (const itemPA of positionAccount) {\n            const keyLower = `${state.programId.toString()}-${state.id.toString()}-${itemPA.tickLower}`;\n            const keyUpper = `${state.programId.toString()}-${state.id.toString()}-${itemPA.tickUpper}`;\n            const tickArrayLower = tickArrayLayout[keyToTickArrayAddress[keyLower].toString()];\n            const tickArrayUpper = tickArrayLayout[keyToTickArrayAddress[keyUpper].toString()];\n            const tickLowerState: Tick =\n              tickArrayLower.ticks[TickUtils.getTickOffsetInArray(itemPA.tickLower, state.tickSpacing)];\n            const tickUpperState: Tick =\n              tickArrayUpper.ticks[TickUtils.getTickOffsetInArray(itemPA.tickUpper, state.tickSpacing)];\n            const { tokenFeeAmountA, tokenFeeAmountB } = await PositionUtils.GetPositionFees(\n              state,\n              itemPA,\n              tickLowerState,\n              tickUpperState,\n            );\n            const rewardInfos = await PositionUtils.GetPositionRewards(state, itemPA, tickLowerState, tickUpperState);\n            itemPA.tokenFeeAmountA = tokenFeeAmountA.gte(new BN(0)) ? tokenFeeAmountA : new BN(0);\n            itemPA.tokenFeeAmountB = tokenFeeAmountB.gte(new BN(0)) ? tokenFeeAmountB : new BN(0);\n            for (let i = 0; i < rewardInfos.length; i++) {\n              itemPA.rewardInfos[i].pendingReward = rewardInfos[i].gte(new BN(0)) ? rewardInfos[i] : new BN(0);\n            }\n          }\n        }\n      }\n    }\n    return pools;\n  }\n\n  static computeAmountOut({\n    poolInfo,\n    tickArrayCache,\n    baseMint,\n    epochInfo,\n    amountIn,\n    slippage,\n    priceLimit = new Decimal(0),\n    catchLiquidityInsufficient = false,\n  }: {\n    poolInfo: ComputeClmmPoolInfo;\n    tickArrayCache: { [key: string]: TickArray };\n    baseMint: PublicKey;\n\n    epochInfo: EpochInfo;\n\n    amountIn: BN;\n    slippage: number;\n    priceLimit?: Decimal;\n    catchLiquidityInsufficient: boolean;\n  }): ReturnTypeComputeAmountOut {\n    let sqrtPriceLimitX64: BN;\n    const isBaseIn = baseMint.toBase58() === poolInfo.mintA.address;\n    const [baseFeeConfig, outFeeConfig] = isBaseIn\n      ? [poolInfo.mintA.extensions.feeConfig, poolInfo.mintB.extensions.feeConfig]\n      : [poolInfo.mintB.extensions.feeConfig, poolInfo.mintA.extensions.feeConfig];\n\n    if (priceLimit.equals(new Decimal(0))) {\n      sqrtPriceLimitX64 = isBaseIn ? MIN_SQRT_PRICE_X64.add(new BN(1)) : MAX_SQRT_PRICE_X64.sub(new BN(1));\n    } else {\n      sqrtPriceLimitX64 = SqrtPriceMath.priceToSqrtPriceX64(\n        priceLimit,\n        poolInfo.mintA.decimals,\n        poolInfo.mintB.decimals,\n      );\n    }\n\n    const realAmountIn = getTransferAmountFeeV2(amountIn, baseFeeConfig, epochInfo, false);\n\n    const {\n      allTrade,\n      expectedAmountOut: _expectedAmountOut,\n      remainingAccounts,\n      executionPrice: _executionPriceX64,\n      feeAmount,\n    } = PoolUtils.getOutputAmountAndRemainAccounts(\n      poolInfo,\n      tickArrayCache,\n      baseMint,\n      realAmountIn.amount.sub(realAmountIn.fee ?? ZERO),\n      sqrtPriceLimitX64,\n      catchLiquidityInsufficient,\n    );\n\n    const amountOut = getTransferAmountFeeV2(_expectedAmountOut, outFeeConfig, epochInfo, false);\n\n    const _executionPrice = SqrtPriceMath.sqrtPriceX64ToPrice(\n      _executionPriceX64,\n      poolInfo.mintA.decimals,\n      poolInfo.mintB.decimals,\n    );\n    const executionPrice = isBaseIn ? _executionPrice : new Decimal(1).div(_executionPrice);\n\n    const _minAmountOut = _expectedAmountOut\n      .mul(new BN(Math.floor((1 - slippage) * 10000000000)))\n      .div(new BN(10000000000));\n    const minAmountOut = getTransferAmountFeeV2(_minAmountOut, outFeeConfig, epochInfo, false);\n\n    const poolPrice = isBaseIn ? poolInfo.currentPrice : new Decimal(1).div(poolInfo.currentPrice);\n\n    const _numerator = new Decimal(executionPrice).sub(poolPrice).abs();\n    const _denominator = poolPrice;\n    const priceImpact = new Percent(\n      new Decimal(_numerator).mul(10 ** 15).toFixed(0),\n      new Decimal(_denominator).mul(10 ** 15).toFixed(0),\n    );\n\n    return {\n      allTrade,\n      realAmountIn,\n      amountOut,\n      minAmountOut,\n      expirationTime: minExpirationTime(realAmountIn.expirationTime, amountOut.expirationTime),\n      currentPrice: poolInfo.currentPrice,\n      executionPrice,\n      priceImpact,\n      fee: feeAmount,\n      remainingAccounts,\n      executionPriceX64: _executionPriceX64,\n    };\n  }\n\n  static computeAmountOutFormat({\n    poolInfo,\n    tickArrayCache,\n    amountIn,\n    tokenOut: _tokenOut,\n    slippage,\n    epochInfo,\n    catchLiquidityInsufficient = false,\n  }: {\n    poolInfo: ComputeClmmPoolInfo;\n    tickArrayCache: { [key: string]: TickArray };\n    amountIn: BN;\n    tokenOut: ApiV3Token;\n    slippage: number;\n    epochInfo: EpochInfo;\n    catchLiquidityInsufficient?: boolean;\n  }): ReturnTypeComputeAmountOutFormat {\n    const baseIn = _tokenOut.address === poolInfo.mintB.address;\n    const [inputMint, outMint] = baseIn ? [poolInfo.mintA, poolInfo.mintB] : [poolInfo.mintB, poolInfo.mintA];\n    const [baseToken, outToken] = [\n      new Token({\n        ...inputMint,\n        mint: inputMint.address,\n        isToken2022: inputMint.programId === TOKEN_2022_PROGRAM_ID.toBase58(),\n      }),\n      new Token({\n        ...outMint,\n        mint: outMint.address,\n        isToken2022: outMint.programId === TOKEN_2022_PROGRAM_ID.toBase58(),\n      }),\n    ];\n\n    const {\n      allTrade,\n      realAmountIn: _realAmountIn,\n      amountOut: _amountOut,\n      minAmountOut: _minAmountOut,\n      expirationTime,\n      currentPrice,\n      executionPrice,\n      priceImpact,\n      fee,\n      remainingAccounts,\n      executionPriceX64,\n    } = PoolUtils.computeAmountOut({\n      poolInfo,\n      tickArrayCache,\n      baseMint: new PublicKey(inputMint.address),\n      amountIn,\n      slippage,\n      epochInfo,\n      catchLiquidityInsufficient,\n    });\n\n    const realAmountIn = {\n      ..._realAmountIn,\n      amount: new TokenAmount(baseToken, _realAmountIn.amount),\n      fee: _realAmountIn.fee === undefined ? undefined : new TokenAmount(baseToken, _realAmountIn.fee),\n    };\n\n    const amountOut = {\n      ..._amountOut,\n      amount: new TokenAmount(outToken, _amountOut.amount),\n      fee: _amountOut.fee === undefined ? undefined : new TokenAmount(outToken, _amountOut.fee),\n    };\n    const minAmountOut = {\n      ..._minAmountOut,\n      amount: new TokenAmount(outToken, _minAmountOut.amount),\n      fee: _minAmountOut.fee === undefined ? undefined : new TokenAmount(outToken, _minAmountOut.fee),\n    };\n\n    const _currentPrice = new Price({\n      baseToken,\n      denominator: new BN(10).pow(new BN(20 + baseToken.decimals)),\n      quoteToken: outToken,\n      numerator: currentPrice.mul(new Decimal(10 ** (20 + outToken.decimals))).toFixed(0),\n    });\n    const _executionPrice = new Price({\n      baseToken,\n      denominator: new BN(10).pow(new BN(20 + baseToken.decimals)),\n      quoteToken: outToken,\n      numerator: executionPrice.mul(new Decimal(10 ** (20 + outToken.decimals))).toFixed(0),\n    });\n    const _fee = new TokenAmount(baseToken, fee);\n\n    return {\n      allTrade,\n      realAmountIn,\n      amountOut,\n      minAmountOut,\n      expirationTime,\n      currentPrice: _currentPrice,\n      executionPrice: _executionPrice,\n      priceImpact,\n      fee: _fee,\n      remainingAccounts,\n      executionPriceX64,\n    };\n  }\n\n  static estimateAprsForPriceRangeMultiplier({\n    poolInfo,\n    aprType,\n    positionTickLowerIndex,\n    positionTickUpperIndex,\n  }: {\n    poolInfo: ApiV3PoolInfoConcentratedItem;\n    aprType: \"day\" | \"week\" | \"month\";\n\n    positionTickLowerIndex: number;\n    positionTickUpperIndex: number;\n  }): {\n    feeApr: number;\n    rewardsApr: number[];\n    apr: number;\n  } {\n    const aprInfo = poolInfo[aprType];\n\n    const priceLower = TickUtils.getTickPrice({\n      poolInfo,\n      tick: positionTickLowerIndex,\n      baseIn: true,\n    }).price.toNumber();\n    const priceUpper = TickUtils.getTickPrice({\n      poolInfo,\n      tick: positionTickUpperIndex,\n      baseIn: true,\n    }).price.toNumber();\n\n    const _minPrice = Math.max(priceLower, aprInfo.priceMin);\n    const _maxPrice = Math.min(priceUpper, aprInfo.priceMax);\n\n    const sub = _maxPrice - _minPrice;\n\n    const userRange = priceUpper - priceLower;\n    const tradeRange = aprInfo.priceMax - aprInfo.priceMin;\n\n    let p: number;\n\n    if (sub <= 0) p = 0;\n    else if (userRange === sub) p = tradeRange / sub;\n    else if (tradeRange === sub) p = sub / userRange;\n    else p = (sub / tradeRange) * (sub / userRange);\n\n    return {\n      feeApr: aprInfo.feeApr * p,\n      rewardsApr: [(aprInfo.rewardApr[0] ?? 0) * p, (aprInfo.rewardApr[1] ?? 0) * p, (aprInfo.rewardApr[2] ?? 0) * p],\n      apr: aprInfo.apr * p,\n    };\n  }\n\n  static estimateAprsForPriceRangeDelta({\n    poolInfo,\n    poolLiquidity,\n    aprType,\n    mintPrice,\n    liquidity,\n    positionTickLowerIndex,\n    positionTickUpperIndex,\n    chainTime,\n  }: {\n    poolInfo: ApiV3PoolInfoConcentratedItem;\n    poolLiquidity: BN;\n    aprType: \"day\" | \"week\" | \"month\";\n\n    mintPrice: { [mint: string]: { value: number } };\n\n    liquidity: BN;\n    positionTickLowerIndex: number;\n    positionTickUpperIndex: number;\n\n    chainTime: number;\n  }): {\n    feeApr: number;\n    rewardsApr: number[];\n    apr: number;\n  } {\n    const aprTypeDay = aprType === \"day\" ? 1 : aprType === \"week\" ? 7 : aprType === \"month\" ? 30 : 0;\n    const aprInfo = poolInfo[aprType];\n    const mintPriceA = mintPrice[solToWSol(poolInfo.mintA.address).toString()];\n    const mintPriceB = mintPrice[solToWSol(poolInfo.mintB.address).toString()];\n    const mintDecimalsA = poolInfo.mintA.decimals;\n    const mintDecimalsB = poolInfo.mintB.decimals;\n\n    if (!aprInfo || !mintPriceA || !mintPriceB) return { feeApr: 0, rewardsApr: [0, 0, 0], apr: 0 };\n\n    const sqrtPriceX64 = SqrtPriceMath.priceToSqrtPriceX64(\n      new Decimal(poolInfo.price),\n      poolInfo.mintA.decimals,\n      poolInfo.mintB.decimals,\n    );\n\n    const sqrtPriceX64A = SqrtPriceMath.getSqrtPriceX64FromTick(positionTickLowerIndex);\n    const sqrtPriceX64B = SqrtPriceMath.getSqrtPriceX64FromTick(positionTickUpperIndex);\n\n    const { amountSlippageA: poolLiquidityA, amountSlippageB: poolLiquidityB } =\n      LiquidityMath.getAmountsFromLiquidityWithSlippage(\n        sqrtPriceX64,\n        sqrtPriceX64A,\n        sqrtPriceX64B,\n        poolLiquidity,\n        false,\n        false,\n        0,\n      );\n\n    const { amountSlippageA: userLiquidityA, amountSlippageB: userLiquidityB } =\n      LiquidityMath.getAmountsFromLiquidityWithSlippage(\n        sqrtPriceX64,\n        sqrtPriceX64A,\n        sqrtPriceX64B,\n        liquidity,\n        false,\n        false,\n        0,\n      );\n\n    const poolTvl = new Decimal(poolLiquidityA.toString())\n      .div(new Decimal(10).pow(mintDecimalsA))\n      .mul(mintPriceA.value)\n      .add(new Decimal(poolLiquidityB.toString()).div(new Decimal(10).pow(mintDecimalsB)).mul(mintPriceB.value));\n    const userTvl = new Decimal(userLiquidityA.toString())\n      .div(new Decimal(10).pow(mintDecimalsA))\n      .mul(mintPriceA.value)\n      .add(new Decimal(userLiquidityB.toString()).div(new Decimal(10).pow(mintDecimalsB)).mul(mintPriceB.value));\n\n    const p = new Decimal(1).div(poolTvl.add(userTvl));\n\n    const feesPerYear = new Decimal(aprInfo.volumeFee).mul(365).div(aprTypeDay);\n    const feeApr = feesPerYear.mul(p).mul(100).toNumber();\n\n    const SECONDS_PER_YEAR = 3600 * 24 * 365;\n\n    const rewardsApr = poolInfo.rewardDefaultInfos.map((i) => {\n      const iDecimal = i.mint.decimals;\n      const iPrice = mintPrice[i.mint.address];\n\n      if (\n        chainTime < ((i as any).startTime ?? 0) ||\n        chainTime > ((i as any).endTime ?? 0) ||\n        !i.perSecond ||\n        !iPrice ||\n        iDecimal === undefined\n      )\n        return 0;\n\n      return new Decimal(iPrice.value)\n        .mul(new Decimal(i.perSecond).mul(SECONDS_PER_YEAR))\n        .div(new Decimal(10).pow(iDecimal))\n        .mul(p)\n        .mul(100)\n        .toNumber();\n    });\n\n    return {\n      feeApr,\n      rewardsApr,\n      apr: feeApr + rewardsApr.reduce((a, b) => a + b, 0),\n    };\n  }\n\n  static getLiquidityAmountOutFromAmountIn({\n    poolInfo,\n    inputA,\n    tickLower,\n    tickUpper,\n    amount,\n    slippage,\n    add,\n    epochInfo,\n    amountHasFee,\n  }: {\n    poolInfo: ApiV3PoolInfoConcentratedItem;\n    inputA: boolean;\n    tickLower: number;\n    tickUpper: number;\n    amount: BN;\n    slippage: number;\n    add: boolean;\n    epochInfo: EpochInfo;\n    amountHasFee: boolean;\n  }): Promise<ReturnTypeGetLiquidityAmountOut> {\n    const sqrtPriceX64 = SqrtPriceMath.priceToSqrtPriceX64(\n      new Decimal(poolInfo.price),\n      poolInfo.mintA.decimals,\n      poolInfo.mintB.decimals,\n    );\n    const sqrtPriceX64A = SqrtPriceMath.getSqrtPriceX64FromTick(tickLower);\n    const sqrtPriceX64B = SqrtPriceMath.getSqrtPriceX64FromTick(tickUpper);\n\n    const coefficient = add ? 1 - slippage : 1 + slippage;\n    const addFeeAmount = getTransferAmountFeeV2(\n      amount,\n      poolInfo[inputA ? \"mintA\" : \"mintB\"].extensions?.feeConfig,\n      epochInfo,\n      !amountHasFee,\n    );\n    const _amount = new BN(\n      new Decimal(addFeeAmount.amount.sub(addFeeAmount.fee ?? ZERO).toString()).mul(coefficient).toFixed(0),\n    );\n\n    let liquidity: BN;\n    if (sqrtPriceX64.lte(sqrtPriceX64A)) {\n      liquidity = inputA\n        ? LiquidityMath.getLiquidityFromTokenAmountA(sqrtPriceX64A, sqrtPriceX64B, _amount, !add)\n        : new BN(0);\n    } else if (sqrtPriceX64.lte(sqrtPriceX64B)) {\n      const liquidity0 = LiquidityMath.getLiquidityFromTokenAmountA(sqrtPriceX64, sqrtPriceX64B, _amount, !add);\n      const liquidity1 = LiquidityMath.getLiquidityFromTokenAmountB(sqrtPriceX64A, sqrtPriceX64, _amount);\n      liquidity = inputA ? liquidity0 : liquidity1;\n    } else {\n      liquidity = inputA\n        ? new BN(0)\n        : LiquidityMath.getLiquidityFromTokenAmountB(sqrtPriceX64A, sqrtPriceX64B, _amount);\n    }\n\n    return PoolUtils.getAmountsFromLiquidity({\n      epochInfo,\n      poolInfo,\n      tickLower,\n      tickUpper,\n      liquidity,\n      slippage,\n      add,\n    });\n  }\n\n  static async getAmountsFromLiquidity({\n    epochInfo,\n    poolInfo,\n    tickLower,\n    tickUpper,\n    liquidity,\n    slippage,\n    add,\n  }: {\n    epochInfo: EpochInfo;\n    poolInfo: ApiV3PoolInfoConcentratedItem;\n    tickLower: number;\n    tickUpper: number;\n    liquidity: BN;\n    slippage: number;\n    add: boolean;\n  }): Promise<ReturnTypeGetLiquidityAmountOut> {\n    const sqrtPriceX64A = SqrtPriceMath.getSqrtPriceX64FromTick(tickLower);\n    const sqrtPriceX64B = SqrtPriceMath.getSqrtPriceX64FromTick(tickUpper);\n\n    const coefficientRe = add ? 1 + slippage : 1 - slippage;\n\n    const amounts = LiquidityMath.getAmountsFromLiquidity(\n      SqrtPriceMath.priceToSqrtPriceX64(new Decimal(poolInfo.price), poolInfo.mintA.decimals, poolInfo.mintB.decimals),\n      sqrtPriceX64A,\n      sqrtPriceX64B,\n      liquidity,\n      add,\n    );\n    const [amountA, amountB] = [\n      getTransferAmountFeeV2(amounts.amountA, poolInfo.mintA.extensions?.feeConfig, epochInfo, true),\n      getTransferAmountFeeV2(amounts.amountB, poolInfo.mintB.extensions?.feeConfig, epochInfo, true),\n    ];\n    const [amountSlippageA, amountSlippageB] = [\n      getTransferAmountFeeV2(\n        amounts.amountA.muln(coefficientRe),\n        poolInfo.mintA.extensions?.feeConfig,\n        epochInfo,\n        true,\n      ),\n      getTransferAmountFeeV2(\n        amounts.amountB.muln(coefficientRe),\n        poolInfo.mintB.extensions?.feeConfig,\n        epochInfo,\n        true,\n      ),\n    ];\n\n    return {\n      liquidity,\n      amountA,\n      amountB,\n      amountSlippageA,\n      amountSlippageB,\n      expirationTime: minExpirationTime(amountA.expirationTime, amountB.expirationTime),\n    };\n  }\n\n  static async fetchComputeMultipleClmmInfo({\n    connection,\n    poolList,\n    rpcDataMap = {},\n  }: {\n    rpcDataMap?: Record<string, ReturnType<typeof PoolInfoLayout.decode>>;\n    connection: Connection;\n    poolList: Pick<ApiV3PoolInfoConcentratedItem, \"id\" | \"programId\" | \"mintA\" | \"mintB\" | \"config\" | \"price\">[];\n  }): Promise<Record<string, ComputeClmmPoolInfo>> {\n    const fetchRpcList = poolList.filter((p) => !rpcDataMap[p.id]).map((p) => new PublicKey(p.id));\n    const rpcRes = await getMultipleAccountsInfo(connection, fetchRpcList);\n    rpcRes.forEach((r, idx) => {\n      if (!r) return;\n      rpcDataMap[fetchRpcList[idx].toBase58()] = PoolInfoLayout.decode(r.data);\n    });\n\n    const pdaList = poolList.map(\n      (poolInfo) => getPdaExBitmapAccount(new PublicKey(poolInfo.programId), new PublicKey(poolInfo.id)).publicKey,\n    );\n\n    const exBitData = await PoolUtils.fetchExBitmaps({\n      connection,\n      exBitmapAddress: pdaList,\n      batchRequest: false,\n    });\n\n    return poolList.reduce(\n      (acc, cur) => ({\n        ...acc,\n        [cur.id]: {\n          ...rpcDataMap[cur.id],\n          id: new PublicKey(cur.id),\n          version: 6,\n          programId: new PublicKey(cur.programId),\n          mintA: cur.mintA,\n          mintB: cur.mintB,\n          ammConfig: {\n            ...cur.config,\n            id: new PublicKey(cur.config.id),\n            fundOwner: \"\",\n          },\n          currentPrice: new Decimal(cur.price),\n          exBitmapInfo:\n            exBitData[getPdaExBitmapAccount(new PublicKey(cur.programId), new PublicKey(cur.id)).publicKey.toBase58()],\n          startTime: rpcDataMap[cur.id].startTime.toNumber(),\n        },\n      }),\n      {} as Record<string, ComputeClmmPoolInfo>,\n    );\n  }\n\n  static async fetchComputeClmmInfo({\n    connection,\n    poolInfo,\n    rpcData,\n  }: {\n    connection: Connection;\n    poolInfo: Pick<ApiV3PoolInfoConcentratedItem, \"id\" | \"programId\" | \"mintA\" | \"mintB\" | \"config\" | \"price\">;\n    rpcData?: ReturnType<typeof PoolInfoLayout.decode>;\n  }): Promise<ComputeClmmPoolInfo> {\n    return (\n      await this.fetchComputeMultipleClmmInfo({\n        connection,\n        rpcDataMap: rpcData ? { [poolInfo.id]: rpcData } : undefined,\n        poolList: [poolInfo],\n      })\n    )[poolInfo.id];\n  }\n}\n\nexport function getLiquidityFromAmounts({\n  poolInfo,\n  tickLower,\n  tickUpper,\n  amountA,\n  amountB,\n  slippage,\n  add,\n  epochInfo,\n  amountHasFee,\n}: {\n  poolInfo: ApiV3PoolInfoConcentratedItem;\n  tickLower: number;\n  tickUpper: number;\n  amountA: BN;\n  amountB: BN;\n  slippage: number;\n  add: boolean;\n  epochInfo: EpochInfo;\n  amountHasFee: boolean;\n}): ReturnTypeGetLiquidityAmountOut {\n  const [_tickLower, _tickUpper, _amountA, _amountB] =\n    tickLower < tickUpper ? [tickLower, tickUpper, amountA, amountB] : [tickUpper, tickLower, amountB, amountA];\n  const sqrtPriceX64 = SqrtPriceMath.priceToSqrtPriceX64(\n    new Decimal(poolInfo.price),\n    poolInfo.mintA.decimals,\n    poolInfo.mintB.decimals,\n  );\n  const sqrtPriceX64A = SqrtPriceMath.getSqrtPriceX64FromTick(_tickLower);\n  const sqrtPriceX64B = SqrtPriceMath.getSqrtPriceX64FromTick(_tickUpper);\n\n  const [amountFeeA, amountFeeB] = [\n    getTransferAmountFeeV2(_amountA, poolInfo.mintA.extensions?.feeConfig, epochInfo, !amountHasFee),\n    getTransferAmountFeeV2(_amountB, poolInfo.mintB.extensions?.feeConfig, epochInfo, !amountHasFee),\n  ];\n\n  const liquidity = LiquidityMath.getLiquidityFromTokenAmounts(\n    sqrtPriceX64,\n    sqrtPriceX64A,\n    sqrtPriceX64B,\n    amountFeeA.amount.sub(amountFeeA.fee ?? ZERO),\n    amountFeeB.amount.sub(amountFeeB.fee ?? ZERO),\n  );\n\n  return LiquidityMath.getAmountsOutFromLiquidity({\n    poolInfo,\n    tickLower,\n    tickUpper,\n    liquidity,\n    slippage,\n    add,\n    epochInfo,\n    amountAddFee: !amountHasFee,\n  });\n}\n\nconst mockRewardData = {\n  volume: 0,\n  volumeQuote: 0,\n  volumeFee: 0,\n  apr: 0,\n  feeApr: 0,\n  priceMin: 0,\n  priceMax: 0,\n  rewardApr: [],\n};\n\nexport function clmmComputeInfoToApiInfo(pool: ComputeClmmPoolInfo): ApiV3PoolInfoConcentratedItem {\n  return {\n    ...pool,\n    type: \"Concentrated\",\n    programId: pool.programId.toString(),\n    id: pool.id.toString(),\n    rewardDefaultInfos: [],\n    rewardDefaultPoolInfos: \"Clmm\",\n    price: pool.currentPrice.toNumber(),\n    mintAmountA: 0,\n    mintAmountB: 0,\n    feeRate: pool.ammConfig.tradeFeeRate,\n    openTime: pool.startTime.toString(),\n    tvl: 0,\n\n    day: mockRewardData,\n    week: mockRewardData,\n    month: mockRewardData,\n    pooltype: [],\n\n    farmUpcomingCount: 0,\n    farmOngoingCount: 0,\n    farmFinishedCount: 0,\n    config: {\n      ...pool.ammConfig,\n      id: pool.ammConfig.id.toString(),\n      defaultRange: 0,\n      defaultRangePoint: [],\n    },\n  };\n}\n","import BN from \"bn.js\";\n\nimport { TickArrayBitmapExtensionType } from \"../type\";\n\nimport { MAX_TICK, MIN_TICK } from \"./constants\";\nimport { TICK_ARRAY_BITMAP_SIZE, TICK_ARRAY_SIZE, TickUtils } from \"./tick\";\nimport { TickQuery } from \"./tickQuery\";\nimport { isZero, leadingZeros, leastSignificantBit, mostSignificantBit, trailingZeros } from \"./util\";\n\nexport const EXTENSION_TICKARRAY_BITMAP_SIZE = 14;\n\nexport class TickArrayBitmap {\n  public static maxTickInTickarrayBitmap(tickSpacing: number): number {\n    return tickSpacing * TICK_ARRAY_SIZE * TICK_ARRAY_BITMAP_SIZE;\n  }\n\n  public static getBitmapTickBoundary(\n    tickarrayStartIndex: number,\n    tickSpacing: number,\n  ): {\n    minValue: number;\n    maxValue: number;\n  } {\n    const ticksInOneBitmap = this.maxTickInTickarrayBitmap(tickSpacing);\n    let m = Math.floor(Math.abs(tickarrayStartIndex) / ticksInOneBitmap);\n    if (tickarrayStartIndex < 0 && Math.abs(tickarrayStartIndex) % ticksInOneBitmap != 0) m += 1;\n\n    const minValue = ticksInOneBitmap * m;\n\n    return tickarrayStartIndex < 0\n      ? { minValue: -minValue, maxValue: -minValue + ticksInOneBitmap }\n      : { minValue, maxValue: minValue + ticksInOneBitmap };\n  }\n\n  public static nextInitializedTickArrayStartIndex(\n    bitMap: BN,\n    lastTickArrayStartIndex: number,\n    tickSpacing: number,\n    zeroForOne: boolean,\n  ): { isInit: boolean; tickIndex: number } {\n    if (!TickQuery.checkIsValidStartIndex(lastTickArrayStartIndex, tickSpacing))\n      throw Error(\"nextInitializedTickArrayStartIndex check error\");\n\n    const tickBoundary = this.maxTickInTickarrayBitmap(tickSpacing);\n    const nextTickArrayStartIndex = zeroForOne\n      ? lastTickArrayStartIndex - TickQuery.tickCount(tickSpacing)\n      : lastTickArrayStartIndex + TickQuery.tickCount(tickSpacing);\n\n    if (nextTickArrayStartIndex < -tickBoundary || nextTickArrayStartIndex >= tickBoundary) {\n      return { isInit: false, tickIndex: lastTickArrayStartIndex };\n    }\n\n    const multiplier = tickSpacing * TICK_ARRAY_SIZE;\n    let compressed = nextTickArrayStartIndex / multiplier + 512;\n\n    if (nextTickArrayStartIndex < 0 && nextTickArrayStartIndex % multiplier != 0) {\n      compressed--;\n    }\n\n    const bitPos = Math.abs(compressed);\n\n    if (zeroForOne) {\n      const offsetBitMap = bitMap.shln(1024 - bitPos - 1);\n      const nextBit = mostSignificantBit(1024, offsetBitMap);\n      if (nextBit !== null) {\n        const nextArrayStartIndex = (bitPos - nextBit - 512) * multiplier;\n        return { isInit: true, tickIndex: nextArrayStartIndex };\n      } else {\n        return { isInit: false, tickIndex: -tickBoundary };\n      }\n    } else {\n      const offsetBitMap = bitMap.shrn(bitPos);\n      const nextBit = leastSignificantBit(1024, offsetBitMap);\n      if (nextBit !== null) {\n        const nextArrayStartIndex = (bitPos + nextBit - 512) * multiplier;\n        return { isInit: true, tickIndex: nextArrayStartIndex };\n      } else {\n        return { isInit: false, tickIndex: tickBoundary - TickQuery.tickCount(tickSpacing) };\n      }\n    }\n  }\n}\n\nexport class TickArrayBitmapExtensionUtils {\n  public static getBitmapOffset(tickIndex: number, tickSpacing: number): number {\n    if (!TickQuery.checkIsValidStartIndex(tickIndex, tickSpacing)) {\n      throw new Error(\"No enough initialized tickArray\");\n    }\n    this.checkExtensionBoundary(tickIndex, tickSpacing);\n\n    const ticksInOneBitmap = TickArrayBitmap.maxTickInTickarrayBitmap(tickSpacing);\n    let offset = Math.floor(Math.abs(tickIndex) / ticksInOneBitmap) - 1;\n\n    if (tickIndex < 0 && Math.abs(tickIndex) % ticksInOneBitmap === 0) offset--;\n    return offset;\n  }\n\n  public static getBitmap(\n    tickIndex: number,\n    tickSpacing: number,\n    tickArrayBitmapExtension: TickArrayBitmapExtensionType,\n  ): { offset: number; tickarrayBitmap: BN[] } {\n    const offset = this.getBitmapOffset(tickIndex, tickSpacing);\n    if (tickIndex < 0) {\n      return { offset, tickarrayBitmap: tickArrayBitmapExtension.negativeTickArrayBitmap[offset] };\n    } else {\n      return { offset, tickarrayBitmap: tickArrayBitmapExtension.positiveTickArrayBitmap[offset] };\n    }\n  }\n\n  public static checkExtensionBoundary(tickIndex: number, tickSpacing: number) {\n    const { positiveTickBoundary, negativeTickBoundary } = this.extensionTickBoundary(tickSpacing);\n\n    if (tickIndex >= negativeTickBoundary && tickIndex < positiveTickBoundary) {\n      throw Error(\"checkExtensionBoundary -> InvalidTickArrayBoundary\");\n    }\n  }\n\n  public static extensionTickBoundary(tickSpacing: number): {\n    positiveTickBoundary: number;\n    negativeTickBoundary: number;\n  } {\n    const positiveTickBoundary = TickArrayBitmap.maxTickInTickarrayBitmap(tickSpacing);\n\n    const negativeTickBoundary = -positiveTickBoundary;\n\n    if (MAX_TICK <= positiveTickBoundary)\n      throw Error(`extensionTickBoundary check error: ${MAX_TICK}, ${positiveTickBoundary}`);\n    if (negativeTickBoundary <= MIN_TICK)\n      throw Error(`extensionTickBoundary check error: ${negativeTickBoundary}, ${MIN_TICK}`);\n\n    return { positiveTickBoundary, negativeTickBoundary };\n  }\n\n  public static checkTickArrayIsInit(\n    tickArrayStartIndex: number,\n    tickSpacing: number,\n    tickArrayBitmapExtension: TickArrayBitmapExtensionType,\n  ): { isInitialized: boolean; startIndex: number } {\n    const { tickarrayBitmap } = this.getBitmap(tickArrayStartIndex, tickSpacing, tickArrayBitmapExtension);\n\n    const tickArrayOffsetInBitmap = this.tickArrayOffsetInBitmap(tickArrayStartIndex, tickSpacing);\n\n    return {\n      isInitialized: TickUtils.mergeTickArrayBitmap(tickarrayBitmap).testn(tickArrayOffsetInBitmap),\n      startIndex: tickArrayStartIndex,\n    };\n  }\n\n  public static nextInitializedTickArrayFromOneBitmap(\n    lastTickArrayStartIndex: number,\n    tickSpacing: number,\n    zeroForOne: boolean,\n    tickArrayBitmapExtension: TickArrayBitmapExtensionType,\n  ): {\n    isInit: boolean;\n    tickIndex: number;\n  } {\n    const multiplier = TickQuery.tickCount(tickSpacing);\n    const nextTickArrayStartIndex = zeroForOne\n      ? lastTickArrayStartIndex - multiplier\n      : lastTickArrayStartIndex + multiplier;\n    const { tickarrayBitmap } = this.getBitmap(nextTickArrayStartIndex, tickSpacing, tickArrayBitmapExtension);\n\n    return this.nextInitializedTickArrayInBitmap(tickarrayBitmap, nextTickArrayStartIndex, tickSpacing, zeroForOne);\n  }\n\n  public static nextInitializedTickArrayInBitmap(\n    tickarrayBitmap: BN[],\n    nextTickArrayStartIndex: number,\n    tickSpacing: number,\n    zeroForOne: boolean,\n  ): {\n    isInit: boolean;\n    tickIndex: number;\n  } {\n    const { minValue: bitmapMinTickBoundary, maxValue: bitmapMaxTickBoundary } = TickArrayBitmap.getBitmapTickBoundary(\n      nextTickArrayStartIndex,\n      tickSpacing,\n    );\n\n    const tickArrayOffsetInBitmap = this.tickArrayOffsetInBitmap(nextTickArrayStartIndex, tickSpacing);\n    if (zeroForOne) {\n      // tick from upper to lower\n      // find from highter bits to lower bits\n      const offsetBitMap = TickUtils.mergeTickArrayBitmap(tickarrayBitmap).shln(\n        TICK_ARRAY_BITMAP_SIZE - 1 - tickArrayOffsetInBitmap,\n      );\n\n      const nextBit = isZero(512, offsetBitMap) ? null : leadingZeros(512, offsetBitMap);\n\n      if (nextBit !== null) {\n        const nextArrayStartIndex = nextTickArrayStartIndex - nextBit * TickQuery.tickCount(tickSpacing);\n        return { isInit: true, tickIndex: nextArrayStartIndex };\n      } else {\n        // not found til to the end\n        return { isInit: false, tickIndex: bitmapMinTickBoundary };\n      }\n    } else {\n      // tick from lower to upper\n      // find from lower bits to highter bits\n      const offsetBitMap = TickUtils.mergeTickArrayBitmap(tickarrayBitmap).shrn(tickArrayOffsetInBitmap);\n\n      const nextBit = isZero(512, offsetBitMap) ? null : trailingZeros(512, offsetBitMap);\n\n      if (nextBit !== null) {\n        const nextArrayStartIndex = nextTickArrayStartIndex + nextBit * TickQuery.tickCount(tickSpacing);\n        return { isInit: true, tickIndex: nextArrayStartIndex };\n      } else {\n        // not found til to the end\n        return { isInit: false, tickIndex: bitmapMaxTickBoundary - TickQuery.tickCount(tickSpacing) };\n      }\n    }\n  }\n\n  public static tickArrayOffsetInBitmap(tickArrayStartIndex: number, tickSpacing: number): number {\n    const m = Math.abs(tickArrayStartIndex) % TickArrayBitmap.maxTickInTickarrayBitmap(tickSpacing);\n    let tickArrayOffsetInBitmap = Math.floor(m / TickQuery.tickCount(tickSpacing));\n    if (tickArrayStartIndex < 0 && m != 0) {\n      tickArrayOffsetInBitmap = TICK_ARRAY_BITMAP_SIZE - tickArrayOffsetInBitmap;\n    }\n    return tickArrayOffsetInBitmap;\n  }\n}\n","import BN from \"bn.js\";\n\nimport { ClmmPoolInfo, ClmmPoolPersonalPosition, ClmmPoolRewardInfo, SDKParsedConcentratedInfo } from \"../type\";\nimport { minExpirationTime, getTransferAmountFeeV2 } from \"@/common\";\nimport { Q64 } from \"./constants\";\nimport { MathUtil, SqrtPriceMath, LiquidityMath } from \"./math\";\nimport { Tick } from \"./tick\";\nimport { GetAmountParams, ReturnTypeGetLiquidityAmountOut } from \"../type\";\nimport Decimal from \"decimal.js\";\nimport { ClmmPositionLayout } from \"../layout\";\n\nexport class PositionUtils {\n  static getfeeGrowthInside(\n    poolState: Pick<ClmmPoolInfo, \"tickCurrent\" | \"feeGrowthGlobalX64A\" | \"feeGrowthGlobalX64B\">,\n    tickLowerState: Tick,\n    tickUpperState: Tick,\n  ): { feeGrowthInsideX64A: BN; feeGrowthInsideBX64: BN } {\n    let feeGrowthBelowX64A = new BN(0);\n    let feeGrowthBelowX64B = new BN(0);\n    if (poolState.tickCurrent >= tickLowerState.tick) {\n      feeGrowthBelowX64A = tickLowerState.feeGrowthOutsideX64A;\n      feeGrowthBelowX64B = tickLowerState.feeGrowthOutsideX64B;\n    } else {\n      feeGrowthBelowX64A = poolState.feeGrowthGlobalX64A.sub(tickLowerState.feeGrowthOutsideX64A);\n      feeGrowthBelowX64B = poolState.feeGrowthGlobalX64B.sub(tickLowerState.feeGrowthOutsideX64B);\n    }\n\n    let feeGrowthAboveX64A = new BN(0);\n    let feeGrowthAboveX64B = new BN(0);\n    if (poolState.tickCurrent < tickUpperState.tick) {\n      feeGrowthAboveX64A = tickUpperState.feeGrowthOutsideX64A;\n      feeGrowthAboveX64B = tickUpperState.feeGrowthOutsideX64B;\n    } else {\n      feeGrowthAboveX64A = poolState.feeGrowthGlobalX64A.sub(tickUpperState.feeGrowthOutsideX64A);\n      feeGrowthAboveX64B = poolState.feeGrowthGlobalX64B.sub(tickUpperState.feeGrowthOutsideX64B);\n    }\n\n    const feeGrowthInsideX64A = MathUtil.wrappingSubU128(\n      MathUtil.wrappingSubU128(poolState.feeGrowthGlobalX64A, feeGrowthBelowX64A),\n      feeGrowthAboveX64A,\n    );\n    const feeGrowthInsideBX64 = MathUtil.wrappingSubU128(\n      MathUtil.wrappingSubU128(poolState.feeGrowthGlobalX64B, feeGrowthBelowX64B),\n      feeGrowthAboveX64B,\n    );\n    return { feeGrowthInsideX64A, feeGrowthInsideBX64 };\n  }\n\n  static GetPositionFees(\n    ammPool: ClmmPoolInfo,\n    positionState: ClmmPoolPersonalPosition,\n    tickLowerState: Tick,\n    tickUpperState: Tick,\n  ): { tokenFeeAmountA: BN; tokenFeeAmountB: BN } {\n    const { feeGrowthInsideX64A, feeGrowthInsideBX64 } = this.getfeeGrowthInside(\n      ammPool,\n      tickLowerState,\n      tickUpperState,\n    );\n\n    const feeGrowthdeltaA = MathUtil.mulDivFloor(\n      MathUtil.wrappingSubU128(feeGrowthInsideX64A, positionState.feeGrowthInsideLastX64A),\n      positionState.liquidity,\n      Q64,\n    );\n    const tokenFeeAmountA = positionState.tokenFeesOwedA.add(feeGrowthdeltaA);\n\n    const feeGrowthdelta1 = MathUtil.mulDivFloor(\n      MathUtil.wrappingSubU128(feeGrowthInsideBX64, positionState.feeGrowthInsideLastX64B),\n      positionState.liquidity,\n      Q64,\n    );\n    const tokenFeeAmountB = positionState.tokenFeesOwedB.add(feeGrowthdelta1);\n\n    return { tokenFeeAmountA, tokenFeeAmountB };\n  }\n\n  static GetPositionFeesV2(\n    ammPool: Pick<ClmmPoolInfo, \"tickCurrent\" | \"feeGrowthGlobalX64A\" | \"feeGrowthGlobalX64B\">,\n    positionState: ClmmPositionLayout,\n    tickLowerState: Tick,\n    tickUpperState: Tick,\n  ): { tokenFeeAmountA: BN; tokenFeeAmountB: BN } {\n    const { feeGrowthInsideX64A, feeGrowthInsideBX64 } = this.getfeeGrowthInside(\n      ammPool,\n      tickLowerState,\n      tickUpperState,\n    );\n\n    const feeGrowthdeltaA = MathUtil.mulDivFloor(\n      MathUtil.wrappingSubU128(feeGrowthInsideX64A, positionState.feeGrowthInsideLastX64A),\n      positionState.liquidity,\n      Q64,\n    );\n    const tokenFeeAmountA = positionState.tokenFeesOwedA.add(feeGrowthdeltaA);\n\n    const feeGrowthdelta1 = MathUtil.mulDivFloor(\n      MathUtil.wrappingSubU128(feeGrowthInsideBX64, positionState.feeGrowthInsideLastX64B),\n      positionState.liquidity,\n      Q64,\n    );\n    const tokenFeeAmountB = positionState.tokenFeesOwedB.add(feeGrowthdelta1);\n\n    return { tokenFeeAmountA, tokenFeeAmountB };\n  }\n\n  static GetPositionRewardsV2(\n    ammPool: Pick<ClmmPoolInfo, \"tickCurrent\" | \"feeGrowthGlobalX64B\"> & {\n      rewardInfos: { rewardGrowthGlobalX64: BN }[];\n    },\n    positionState: ClmmPositionLayout,\n    tickLowerState: Tick,\n    tickUpperState: Tick,\n  ): BN[] {\n    const rewards: BN[] = [];\n\n    const rewardGrowthsInside = this.getRewardGrowthInsideV2(\n      ammPool.tickCurrent,\n      tickLowerState,\n      tickUpperState,\n      ammPool.rewardInfos,\n    );\n    for (let i = 0; i < rewardGrowthsInside.length; i++) {\n      const rewardGrowthInside = rewardGrowthsInside[i];\n      const currRewardInfo = positionState.rewardInfos[i];\n\n      const rewardGrowthDelta = MathUtil.wrappingSubU128(rewardGrowthInside, currRewardInfo.growthInsideLastX64);\n      const amountOwedDelta = MathUtil.mulDivFloor(rewardGrowthDelta, positionState.liquidity, Q64);\n      const rewardAmountOwed = currRewardInfo.rewardAmountOwed.add(amountOwedDelta);\n      rewards.push(rewardAmountOwed);\n    }\n    return rewards;\n  }\n\n  static GetPositionRewards(\n    ammPool: ClmmPoolInfo,\n    positionState: ClmmPoolPersonalPosition,\n    tickLowerState: Tick,\n    tickUpperState: Tick,\n  ): BN[] {\n    const rewards: BN[] = [];\n\n    const rewardGrowthsInside = this.getRewardGrowthInside(\n      ammPool.tickCurrent,\n      tickLowerState,\n      tickUpperState,\n      ammPool.rewardInfos,\n    );\n    for (let i = 0; i < rewardGrowthsInside.length; i++) {\n      const rewardGrowthInside = rewardGrowthsInside[i];\n      const currRewardInfo = positionState.rewardInfos[i];\n\n      const rewardGrowthDelta = MathUtil.wrappingSubU128(rewardGrowthInside, currRewardInfo.growthInsideLastX64);\n      const amountOwedDelta = MathUtil.mulDivFloor(rewardGrowthDelta, positionState.liquidity, Q64);\n      const rewardAmountOwed = currRewardInfo.rewardAmountOwed.add(amountOwedDelta);\n      rewards.push(rewardAmountOwed);\n    }\n    return rewards;\n  }\n\n  static getRewardGrowthInside(\n    tickCurrentIndex: number,\n    tickLowerState: Tick,\n    tickUpperState: Tick,\n    rewardInfos: ClmmPoolRewardInfo[],\n  ): BN[] {\n    const rewardGrowthsInside: BN[] = [];\n    for (let i = 0; i < rewardInfos.length; i++) {\n      let rewardGrowthsBelow = new BN(0);\n      if (tickLowerState.liquidityGross.eqn(0)) {\n        rewardGrowthsBelow = rewardInfos[i].rewardGrowthGlobalX64;\n      } else if (tickCurrentIndex < tickLowerState.tick) {\n        rewardGrowthsBelow = rewardInfos[i].rewardGrowthGlobalX64.sub(tickLowerState.rewardGrowthsOutsideX64[i]);\n      } else {\n        rewardGrowthsBelow = tickLowerState.rewardGrowthsOutsideX64[i];\n      }\n\n      let rewardGrowthsAbove = new BN(0);\n      if (tickUpperState.liquidityGross.eqn(0)) {\n        //\n      } else if (tickCurrentIndex < tickUpperState.tick) {\n        rewardGrowthsAbove = tickUpperState.rewardGrowthsOutsideX64[i];\n      } else {\n        rewardGrowthsAbove = rewardInfos[i].rewardGrowthGlobalX64.sub(tickUpperState.rewardGrowthsOutsideX64[i]);\n      }\n\n      rewardGrowthsInside.push(\n        MathUtil.wrappingSubU128(\n          MathUtil.wrappingSubU128(rewardInfos[i].rewardGrowthGlobalX64, rewardGrowthsBelow),\n          rewardGrowthsAbove,\n        ),\n      );\n    }\n\n    return rewardGrowthsInside;\n  }\n\n  static getRewardGrowthInsideV2(\n    tickCurrentIndex: number,\n    tickLowerState: Tick,\n    tickUpperState: Tick,\n    rewardInfos: Pick<ClmmPoolRewardInfo, \"rewardGrowthGlobalX64\">[],\n  ): BN[] {\n    const rewardGrowthsInside: BN[] = [];\n    for (let i = 0; i < rewardInfos.length; i++) {\n      let rewardGrowthsBelow = new BN(0);\n      if (tickLowerState.liquidityGross.eqn(0)) {\n        rewardGrowthsBelow = rewardInfos[i].rewardGrowthGlobalX64;\n      } else if (tickCurrentIndex < tickLowerState.tick) {\n        rewardGrowthsBelow = rewardInfos[i].rewardGrowthGlobalX64.sub(tickLowerState.rewardGrowthsOutsideX64[i]);\n      } else {\n        rewardGrowthsBelow = tickLowerState.rewardGrowthsOutsideX64[i];\n      }\n\n      let rewardGrowthsAbove = new BN(0);\n      if (tickUpperState.liquidityGross.eqn(0)) {\n        //\n      } else if (tickCurrentIndex < tickUpperState.tick) {\n        rewardGrowthsAbove = tickUpperState.rewardGrowthsOutsideX64[i];\n      } else {\n        rewardGrowthsAbove = rewardInfos[i].rewardGrowthGlobalX64.sub(tickUpperState.rewardGrowthsOutsideX64[i]);\n      }\n\n      rewardGrowthsInside.push(\n        MathUtil.wrappingSubU128(\n          MathUtil.wrappingSubU128(rewardInfos[i].rewardGrowthGlobalX64, rewardGrowthsBelow),\n          rewardGrowthsAbove,\n        ),\n      );\n    }\n\n    return rewardGrowthsInside;\n  }\n\n  static getAmountsFromLiquidity({\n    poolInfo,\n    ownerPosition,\n    liquidity,\n    slippage,\n    add,\n    epochInfo,\n  }: GetAmountParams): ReturnTypeGetLiquidityAmountOut {\n    const sqrtPriceX64 = SqrtPriceMath.priceToSqrtPriceX64(\n      new Decimal(poolInfo.price),\n      poolInfo.mintA.decimals,\n      poolInfo.mintB.decimals,\n    );\n    const sqrtPriceX64A = SqrtPriceMath.getSqrtPriceX64FromTick(ownerPosition.tickLower);\n    const sqrtPriceX64B = SqrtPriceMath.getSqrtPriceX64FromTick(ownerPosition.tickUpper);\n\n    const coefficientRe = add ? 1 + slippage : 1 - slippage;\n\n    const amounts = LiquidityMath.getAmountsFromLiquidity(sqrtPriceX64, sqrtPriceX64A, sqrtPriceX64B, liquidity, add);\n\n    const [amountA, amountB] = [\n      getTransferAmountFeeV2(amounts.amountA, poolInfo.mintA.extensions?.feeConfig, epochInfo, true),\n      getTransferAmountFeeV2(amounts.amountB, poolInfo.mintB.extensions?.feeConfig, epochInfo, true),\n    ];\n    const [amountSlippageA, amountSlippageB] = [\n      getTransferAmountFeeV2(\n        new BN(new Decimal(amounts.amountA.toString()).mul(coefficientRe).toFixed(0)),\n        poolInfo.mintA.extensions?.feeConfig,\n        epochInfo,\n        true,\n      ),\n      getTransferAmountFeeV2(\n        new BN(new Decimal(amounts.amountB.toString()).mul(coefficientRe).toFixed(0)),\n        poolInfo.mintB.extensions?.feeConfig,\n        epochInfo,\n        true,\n      ),\n    ];\n\n    return {\n      liquidity,\n      amountA,\n      amountB,\n      amountSlippageA,\n      amountSlippageB,\n      expirationTime: minExpirationTime(amountA.expirationTime, amountB.expirationTime),\n    };\n  }\n}\n","import { blob, bool, i128, publicKey, s32, seq, struct, u128, u16, u32, u64, u8 } from \"@/marshmallow\";\n\nimport { TICK_ARRAY_SIZE } from \"./utils/tick\";\nimport { EXTENSION_TICKARRAY_BITMAP_SIZE } from \"./utils/tickarrayBitmap\";\n\nexport const ClmmConfigLayout = struct([\n  blob(8),\n  u8(\"bump\"),\n  u16(\"index\"),\n  publicKey(\"\"),\n  u32(\"protocolFeeRate\"),\n  u32(\"tradeFeeRate\"),\n  u16(\"tickSpacing\"),\n  seq(u64(), 8, \"\"),\n]);\n\nexport const ObservationLayout = struct([\n  u32(\"blockTimestamp\"),\n  u128(\"sqrtPriceX64\"),\n  u128(\"cumulativeTimePriceX64\"),\n  seq(u128(), 1, \"\"),\n]);\nexport const ObservationInfoLayout = struct([\n  blob(8),\n  bool(\"initialized\"),\n  publicKey(\"poolId\"),\n  seq(ObservationLayout, 1000, \"observations\"),\n  seq(u128(), 5, \"\"),\n]);\n\nexport const RewardInfo = struct([\n  u8(\"rewardState\"),\n  u64(\"openTime\"),\n  u64(\"endTime\"),\n  u64(\"lastUpdateTime\"),\n  u128(\"emissionsPerSecondX64\"),\n  u64(\"rewardTotalEmissioned\"),\n  u64(\"rewardClaimed\"),\n  publicKey(\"tokenMint\"),\n  publicKey(\"tokenVault\"),\n  publicKey(\"creator\"),\n  u128(\"rewardGrowthGlobalX64\"),\n]);\nexport const PoolInfoLayout = struct([\n  blob(8),\n  u8(\"bump\"),\n  publicKey(\"ammConfig\"),\n  publicKey(\"creator\"),\n  publicKey(\"mintA\"),\n  publicKey(\"mintB\"),\n  publicKey(\"vaultA\"),\n  publicKey(\"vaultB\"),\n  publicKey(\"observationId\"),\n  u8(\"mintDecimalsA\"),\n  u8(\"mintDecimalsB\"),\n  u16(\"tickSpacing\"),\n  u128(\"liquidity\"),\n  u128(\"sqrtPriceX64\"),\n  s32(\"tickCurrent\"),\n  u16(\"observationIndex\"),\n  u16(\"observationUpdateDuration\"),\n  u128(\"feeGrowthGlobalX64A\"),\n  u128(\"feeGrowthGlobalX64B\"),\n  u64(\"protocolFeesTokenA\"),\n  u64(\"protocolFeesTokenB\"),\n\n  u128(\"swapInAmountTokenA\"),\n  u128(\"swapOutAmountTokenB\"),\n  u128(\"swapInAmountTokenB\"),\n  u128(\"swapOutAmountTokenA\"),\n\n  u8(\"status\"),\n\n  seq(u8(), 7, \"\"),\n\n  seq(RewardInfo, 3, \"rewardInfos\"),\n  seq(u64(), 16, \"tickArrayBitmap\"),\n\n  u64(\"totalFeesTokenA\"),\n  u64(\"totalFeesClaimedTokenA\"),\n  u64(\"totalFeesTokenB\"),\n  u64(\"totalFeesClaimedTokenB\"),\n\n  u64(\"fundFeesTokenA\"),\n  u64(\"fundFeesTokenB\"),\n\n  u64(\"startTime\"),\n\n  seq(u64(), 15 * 4 - 3, \"padding\"),\n]);\n\nexport const PositionRewardInfoLayout = struct([u128(\"growthInsideLastX64\"), u64(\"rewardAmountOwed\")]);\nexport const PositionInfoLayout = struct([\n  blob(8),\n  u8(\"bump\"),\n  publicKey(\"nftMint\"),\n  publicKey(\"poolId\"),\n\n  s32(\"tickLower\"),\n  s32(\"tickUpper\"),\n  u128(\"liquidity\"),\n  u128(\"feeGrowthInsideLastX64A\"),\n  u128(\"feeGrowthInsideLastX64B\"),\n  u64(\"tokenFeesOwedA\"),\n  u64(\"tokenFeesOwedB\"),\n\n  seq(PositionRewardInfoLayout, 3, \"rewardInfos\"),\n\n  seq(u64(), 8, \"\"),\n]);\n\nexport type ClmmPositionLayout = ReturnType<typeof PositionInfoLayout.decode>;\n\nexport const ProtocolPositionLayout = struct([\n  blob(8),\n  u8(\"bump\"),\n  publicKey(\"poolId\"),\n  s32(\"tickLowerIndex\"),\n  s32(\"tickUpperIndex\"),\n  u128(\"liquidity\"),\n  u128(\"feeGrowthInsideLastX64A\"),\n  u128(\"feeGrowthInsideLastX64B\"),\n  u64(\"tokenFeesOwedA\"),\n  u64(\"tokenFeesOwedB\"),\n  seq(u128(), 3, \"rewardGrowthInside\"),\n\n  seq(u64(), 8, \"\"),\n]);\n\nexport const TickLayout = struct([\n  s32(\"tick\"),\n  i128(\"liquidityNet\"),\n  u128(\"liquidityGross\"),\n  u128(\"feeGrowthOutsideX64A\"),\n  u128(\"feeGrowthOutsideX64B\"),\n  seq(u128(), 3, \"rewardGrowthsOutsideX64\"),\n\n  seq(u32(), 13, \"\"),\n]);\n\nexport const TickArrayLayout = struct([\n  blob(8),\n  publicKey(\"poolId\"),\n  s32(\"startTickIndex\"),\n  seq(TickLayout, TICK_ARRAY_SIZE, \"ticks\"),\n  u8(\"initializedTickCount\"),\n\n  seq(u8(), 115, \"\"),\n]);\n\nexport const OperationLayout = struct([blob(329), seq(publicKey(), 100, \"whitelistMints\")]);\n\nexport const TickArrayBitmapExtensionLayout = struct([\n  blob(8),\n  publicKey(\"poolId\"),\n  seq(seq(u64(), 8), EXTENSION_TICKARRAY_BITMAP_SIZE, \"positiveTickArrayBitmap\"),\n  seq(seq(u64(), 8), EXTENSION_TICKARRAY_BITMAP_SIZE, \"negativeTickArrayBitmap\"),\n]);\n","import { Connection, PublicKey } from \"@solana/web3.js\";\nimport { TOKEN_PROGRAM_ID } from \"@solana/spl-token\";\nimport { AmmV4Keys, AmmV5Keys } from \"@/api/type\";\nimport { toApiV3Token } from \"@/raydium/token/utils\";\nimport {\n  findProgramAddress,\n  simulateMultipleInstruction,\n  parseSimulateLogToJson,\n  parseSimulateValue,\n} from \"@/common/txTool/txUtils\";\nimport { getSerumAssociatedAuthority } from \"./serum\";\nimport { LiquidityPoolKeys, ComputeAmountOutParam, AmmRpcData } from \"./type\";\nimport { StableLayout } from \"./stable\";\nimport { makeSimulatePoolInfoInstruction } from \"./instruction\";\nimport { liquidityStateV4Layout } from \"./layout\";\nimport BN from \"bn.js\";\nimport Decimal from \"decimal.js\";\n\ntype AssociatedName =\n  | \"amm_associated_seed\"\n  | \"lp_mint_associated_seed\"\n  | \"coin_vault_associated_seed\"\n  | \"pc_vault_associated_seed\"\n  | \"lp_mint_associated_seed\"\n  | \"temp_lp_token_associated_seed\"\n  | \"open_order_associated_seed\"\n  | \"target_associated_seed\"\n  | \"withdraw_associated_seed\";\n\ninterface GetAssociatedParam {\n  name: AssociatedName;\n  programId: PublicKey;\n  marketId: PublicKey;\n}\n\nexport function getAssociatedConfigId({ programId }: { programId: PublicKey }): PublicKey {\n  const { publicKey } = findProgramAddress([Buffer.from(\"amm_config_account_seed\", \"utf-8\")], programId);\n  return publicKey;\n}\n\nexport function getLiquidityAssociatedId({ name, programId, marketId }: GetAssociatedParam): PublicKey {\n  const { publicKey } = findProgramAddress(\n    [programId.toBuffer(), marketId.toBuffer(), Buffer.from(name, \"utf-8\")],\n    programId,\n  );\n  return publicKey;\n}\n\nexport function getAssociatedOpenOrders({ programId, marketId }: { programId: PublicKey; marketId: PublicKey }) {\n  const { publicKey } = findProgramAddress(\n    [programId.toBuffer(), marketId.toBuffer(), Buffer.from(\"open_order_associated_seed\", \"utf-8\")],\n    programId,\n  );\n  return publicKey;\n}\n\nexport function getLiquidityAssociatedAuthority({ programId }: { programId: PublicKey }): {\n  publicKey: PublicKey;\n  nonce: number;\n} {\n  return findProgramAddress([Buffer.from([97, 109, 109, 32, 97, 117, 116, 104, 111, 114, 105, 116, 121])], programId);\n}\n\nexport function getAssociatedPoolKeys({\n  version,\n  marketVersion,\n  marketId,\n  baseMint,\n  quoteMint,\n  baseDecimals,\n  quoteDecimals,\n  programId,\n  marketProgramId,\n}: {\n  version: 4 | 5;\n  marketVersion: 3;\n  marketId: PublicKey;\n  baseMint: PublicKey;\n  quoteMint: PublicKey;\n  baseDecimals: number;\n  quoteDecimals: number;\n  programId: PublicKey;\n  marketProgramId: PublicKey;\n}): LiquidityPoolKeys {\n  const id = getLiquidityAssociatedId({ name: \"amm_associated_seed\", programId, marketId });\n  const lpMint = getLiquidityAssociatedId({ name: \"lp_mint_associated_seed\", programId, marketId });\n  const { publicKey: authority, nonce } = getLiquidityAssociatedAuthority({ programId });\n  const baseVault = getLiquidityAssociatedId({ name: \"coin_vault_associated_seed\", programId, marketId });\n  const quoteVault = getLiquidityAssociatedId({ name: \"pc_vault_associated_seed\", programId, marketId });\n  const lpVault = getLiquidityAssociatedId({ name: \"temp_lp_token_associated_seed\", programId, marketId });\n  const openOrders = getAssociatedOpenOrders({ programId, marketId });\n  const targetOrders = getLiquidityAssociatedId({ name: \"target_associated_seed\", programId, marketId });\n  const withdrawQueue = getLiquidityAssociatedId({ name: \"withdraw_associated_seed\", programId, marketId });\n\n  const { publicKey: marketAuthority } = getSerumAssociatedAuthority({\n    programId: marketProgramId,\n    marketId,\n  });\n\n  return {\n    // base\n    id,\n    baseMint,\n    quoteMint,\n    lpMint,\n    baseDecimals,\n    quoteDecimals,\n    lpDecimals: baseDecimals,\n    // version\n    version,\n    programId,\n    // keys\n    authority,\n    nonce,\n    baseVault,\n    quoteVault,\n    lpVault,\n    openOrders,\n    targetOrders,\n    withdrawQueue,\n    // market version\n    marketVersion,\n    marketProgramId,\n    // market keys\n    marketId,\n    marketAuthority,\n    lookupTableAccount: PublicKey.default,\n    configId: getAssociatedConfigId({ programId }),\n  };\n}\n\nlet stableLayout: StableLayout | undefined;\n\nexport async function fetchMultipleInfo({\n  connection,\n  poolKeysList,\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  config,\n}: {\n  connection: Connection;\n  poolKeysList: (AmmV4Keys | AmmV5Keys)[];\n  config: any;\n}): Promise<\n  {\n    status: BN;\n    baseDecimals: number;\n    quoteDecimals: number;\n    lpDecimals: number;\n    baseReserve: BN;\n    quoteReserve: BN;\n    lpSupply: BN;\n    startTime: BN;\n  }[]\n> {\n  if (!stableLayout) {\n    stableLayout = new StableLayout({ connection });\n    await stableLayout.initStableModelLayout();\n  }\n\n  const instructions = poolKeysList.map((pool) => makeSimulatePoolInfoInstruction({ poolKeys: pool }));\n  const logs = await simulateMultipleInstruction(\n    connection,\n    instructions.map((i) => i.instruction),\n    \"GetPoolData\",\n  );\n\n  const poolsInfo = logs.map((log) => {\n    const json = parseSimulateLogToJson(log, \"GetPoolData\");\n\n    const status = new BN(parseSimulateValue(json, \"status\"));\n    const baseDecimals = Number(parseSimulateValue(json, \"coin_decimals\"));\n    const quoteDecimals = Number(parseSimulateValue(json, \"pc_decimals\"));\n    const lpDecimals = Number(parseSimulateValue(json, \"lp_decimals\"));\n    const baseReserve = new BN(parseSimulateValue(json, \"pool_coin_amount\"));\n    const quoteReserve = new BN(parseSimulateValue(json, \"pool_pc_amount\"));\n    const lpSupply = new BN(parseSimulateValue(json, \"pool_lp_supply\"));\n    // TODO fix it when split stable\n    let startTime = \"0\";\n    try {\n      startTime = parseSimulateValue(json, \"pool_open_time\");\n    } catch (error) {\n      //\n    }\n\n    return {\n      status,\n      baseDecimals,\n      quoteDecimals,\n      lpDecimals,\n      baseReserve,\n      quoteReserve,\n      lpSupply,\n      startTime: new BN(startTime),\n    };\n  });\n\n  return poolsInfo;\n}\n\nconst mockRewardData = {\n  volume: 0,\n  volumeQuote: 0,\n  volumeFee: 0,\n  apr: 0,\n  feeApr: 0,\n  priceMin: 0,\n  priceMax: 0,\n  rewardApr: [],\n};\n\nexport const toAmmComputePoolInfo = (\n  poolData: Record<string, AmmRpcData>,\n): Record<string, ComputeAmountOutParam[\"poolInfo\"]> => {\n  const data: Record<string, ComputeAmountOutParam[\"poolInfo\"]> = {};\n  const tokenProgramStr = TOKEN_PROGRAM_ID.toBase58();\n\n  Object.keys(poolData).map((poolId) => {\n    const poolInfo = poolData[poolId];\n    const [mintA, mintB] = [poolInfo.baseMint.toBase58(), poolInfo.quoteMint.toBase58()];\n    data[poolId] = {\n      id: poolId,\n      version: 4,\n      status: poolInfo.status.toNumber(),\n      programId: poolInfo.programId.toBase58(), // needed\n      mintA: toApiV3Token({\n        address: mintA, // needed\n        programId: tokenProgramStr,\n        decimals: poolInfo.baseDecimal.toNumber(),\n      }),\n      mintB: toApiV3Token({\n        address: mintB, // needed\n        programId: tokenProgramStr,\n        decimals: poolInfo.quoteDecimal.toNumber(),\n      }),\n      rewardDefaultInfos: [],\n      rewardDefaultPoolInfos: \"Ecosystem\",\n      price: poolInfo.poolPrice.toNumber(),\n      mintAmountA: new Decimal(poolInfo.mintAAmount.toString()).div(10 ** poolInfo.baseDecimal.toNumber()).toNumber(),\n      mintAmountB: new Decimal(poolInfo.mintBAmount.toString()).div(10 ** poolInfo.quoteDecimal.toNumber()).toNumber(),\n      baseReserve: poolInfo.baseReserve, // needed\n      quoteReserve: poolInfo.quoteReserve, // needed\n      feeRate: new Decimal(poolInfo.tradeFeeNumerator.toString())\n        .div(poolInfo.tradeFeeDenominator.toString())\n        .toNumber(),\n      openTime: poolInfo.poolOpenTime.toString(),\n      tvl: 0,\n      day: mockRewardData,\n      week: mockRewardData,\n      month: mockRewardData,\n      pooltype: [],\n      farmUpcomingCount: 0,\n      farmOngoingCount: 0,\n      farmFinishedCount: 0,\n      type: \"Standard\",\n      marketId: poolInfo.marketId.toBase58(),\n      configId: getAssociatedConfigId({ programId: poolInfo.programId }).toBase58(),\n      lpPrice: 0,\n      lpAmount: 0,\n      lpMint: toApiV3Token({\n        address: poolInfo.lpMint.toBase58(),\n        programId: tokenProgramStr,\n        decimals: Math.min(poolInfo.baseDecimal.toNumber(), poolInfo.quoteDecimal.toNumber()),\n      }),\n    };\n  });\n  return data;\n};\n","import { PublicKey } from \"@solana/web3.js\";\nimport { LIQUIDITY_VERSION_TO_SERUM_VERSION } from \"./constant\";\nimport { SerumVersion } from \"../serum\";\nimport { createLogger } from \"@/common/logger\";\n\nconst logger = createLogger(\"Raydium_liquidity_serum\");\n\nexport function getSerumVersion(version: number): SerumVersion {\n  const serumVersion = LIQUIDITY_VERSION_TO_SERUM_VERSION[version];\n  if (!serumVersion) logger.logWithError(\"invalid version\", \"version\", version);\n\n  return serumVersion;\n}\n\nexport function getSerumAssociatedAuthority({ programId, marketId }: { programId: PublicKey; marketId: PublicKey }): {\n  publicKey: PublicKey;\n  nonce: number;\n} {\n  const seeds = [marketId.toBuffer()];\n\n  let nonce = 0;\n  let publicKey: PublicKey;\n\n  while (nonce < 100) {\n    try {\n      const seedsWithNonce = seeds.concat(Buffer.from([nonce]), Buffer.alloc(7));\n      publicKey = PublicKey.createProgramAddressSync(seedsWithNonce, programId);\n    } catch (err) {\n      if (err instanceof TypeError) {\n        throw err;\n      }\n      nonce++;\n      continue;\n    }\n    return { publicKey, nonce };\n  }\n\n  logger.logWithError(\"unable to find a viable program address nonce\", \"params\", {\n    programId,\n    marketId,\n  });\n  throw new Error(\"unable to find a viable program address nonce\");\n}\n","import BN from \"bn.js\";\nimport { SerumVersion } from \"../serum\";\n\nexport const LIQUIDITY_FEES_NUMERATOR = new BN(25);\nexport const LIQUIDITY_FEES_DENOMINATOR = new BN(10000);\n\n// liquidity version => serum version\nexport const LIQUIDITY_VERSION_TO_SERUM_VERSION: {\n  [key in 4 | 5]?: SerumVersion;\n} = {\n  4: 3,\n  5: 3,\n};\n","import { PublicKey } from \"@solana/web3.js\";\nimport Decimal from \"decimal.js\";\nimport { InstructionType, WSOLMint, fetchMultipleMintInfos, getMultipleAccountsInfoWithCustomFlags } from \"@/common\";\nimport { ApiV3PoolInfoConcentratedItem, ClmmKeys } from \"@/api/type\";\nimport { MakeTxData, MakeMultiTxData } from \"@/common/txTool/txTool\";\nimport { TxVersion } from \"@/common/txTool/txType\";\nimport { getATAAddress } from \"@/common\";\nimport { toApiV3Token, toFeeConfig } from \"@/raydium/token/utils\";\nimport { ReturnTypeFetchMultipleMintInfos } from \"@/raydium/type\";\nimport ModuleBase, { ModuleBaseProps } from \"../moduleBase\";\nimport { mockV3CreatePoolInfo, MIN_SQRT_PRICE_X64, MAX_SQRT_PRICE_X64 } from \"./utils/constants\";\nimport { SqrtPriceMath } from \"./utils/math\";\nimport {\n  CreateConcentratedPool,\n  IncreasePositionFromLiquidity,\n  IncreasePositionFromBase,\n  DecreaseLiquidity,\n  OpenPositionFromBase,\n  OpenPositionFromLiquidity,\n  InitRewardParams,\n  InitRewardsParams,\n  SetRewardParams,\n  SetRewardsParams,\n  CollectRewardParams,\n  CollectRewardsParams,\n  ManipulateLiquidityExtInfo,\n  OpenPositionFromLiquidityExtInfo,\n  OpenPositionFromBaseExtInfo,\n  ClosePositionExtInfo,\n  InitRewardExtInfo,\n  HarvestAllRewardsParams,\n  ComputeClmmPoolInfo,\n  ReturnTypeFetchMultiplePoolTickArrays,\n  ClmmRpcData,\n} from \"./type\";\nimport { ClmmInstrument } from \"./instrument\";\nimport { MakeTransaction } from \"../type\";\nimport { MathUtil } from \"./utils/math\";\nimport { PoolUtils, clmmComputeInfoToApiInfo } from \"./utils/pool\";\nimport { getPdaOperationAccount, getPdaPersonalPositionAddress } from \"./utils/pda\";\nimport { ClmmPositionLayout, OperationLayout, PositionInfoLayout, PoolInfoLayout, ClmmConfigLayout } from \"./layout\";\nimport BN from \"bn.js\";\nimport { AccountLayout, TOKEN_PROGRAM_ID } from \"@solana/spl-token\";\nimport { fetchMultipleInfo } from \"../liquidity\";\n\nexport class Clmm extends ModuleBase {\n  constructor(params: ModuleBaseProps) {\n    super(params);\n  }\n\n  public async getClmmPoolKeys(poolId: string): Promise<ClmmKeys> {\n    return ((await this.scope.api.fetchPoolKeysById({ idList: [poolId] })) as ClmmKeys[])[0];\n  }\n\n  public async createPool<T extends TxVersion>(\n    props: CreateConcentratedPool<T>,\n  ): Promise<MakeTxData<T, { mockPoolInfo: ApiV3PoolInfoConcentratedItem; address: ClmmKeys }>> {\n    const {\n      programId,\n      owner = this.scope.owner?.publicKey || PublicKey.default,\n      mint1,\n      mint2,\n      ammConfig,\n      initialPrice,\n      startTime,\n      computeBudgetConfig,\n      forerunCreate,\n      txVersion,\n    } = props;\n    const txBuilder = this.createTxBuilder();\n    const [mintA, mintB, initPrice] = new BN(new PublicKey(mint1.address).toBuffer()).gt(\n      new BN(new PublicKey(mint2.address).toBuffer()),\n    )\n      ? [mint2, mint1, new Decimal(1).div(initialPrice)]\n      : [mint1, mint2, initialPrice];\n\n    const initialPriceX64 = SqrtPriceMath.priceToSqrtPriceX64(initPrice, mintA.decimals, mintB.decimals);\n\n    const insInfo = await ClmmInstrument.createPoolInstructions({\n      connection: this.scope.connection,\n      programId,\n      owner,\n      mintA,\n      mintB,\n      ammConfigId: ammConfig.id,\n      initialPriceX64,\n      startTime,\n      forerunCreate,\n    });\n\n    txBuilder.addInstruction(insInfo);\n    txBuilder.addCustomComputeBudget(computeBudgetConfig);\n\n    return txBuilder.versionBuild<{\n      mockPoolInfo: ApiV3PoolInfoConcentratedItem;\n      address: ClmmKeys;\n      forerunCreate?: boolean;\n    }>({\n      txVersion,\n      extInfo: {\n        address: {\n          ...insInfo.address,\n          programId: programId.toString(),\n          id: insInfo.address.poolId.toString(),\n          mintA,\n          mintB,\n          openTime: startTime.toString(),\n          vault: { A: insInfo.address.mintAVault.toString(), B: insInfo.address.mintBVault.toString() },\n          rewardInfos: [],\n          config: {\n            id: ammConfig.id.toString(),\n            index: ammConfig.index,\n            protocolFeeRate: ammConfig.protocolFeeRate,\n            tradeFeeRate: ammConfig.tradeFeeRate,\n            tickSpacing: ammConfig.tickSpacing,\n            fundFeeRate: ammConfig.fundFeeRate,\n            description: ammConfig.description,\n            defaultRange: 0,\n            defaultRangePoint: [],\n          },\n        },\n        mockPoolInfo: {\n          type: \"Concentrated\",\n          rewardDefaultPoolInfos: \"Clmm\",\n          id: insInfo.address.poolId.toString(),\n          mintA,\n          mintB,\n          feeRate: ammConfig.tradeFeeRate,\n          openTime: startTime.toString(),\n          programId: programId.toString(),\n          price: initPrice.toNumber(),\n          config: {\n            id: ammConfig.id.toString(),\n            index: ammConfig.index,\n            protocolFeeRate: ammConfig.protocolFeeRate,\n            tradeFeeRate: ammConfig.tradeFeeRate,\n            tickSpacing: ammConfig.tickSpacing,\n            fundFeeRate: ammConfig.fundFeeRate,\n            description: ammConfig.description,\n            defaultRange: 0,\n            defaultRangePoint: [],\n          },\n          ...mockV3CreatePoolInfo,\n        },\n        forerunCreate,\n      },\n    }) as Promise<MakeTxData<T, { mockPoolInfo: ApiV3PoolInfoConcentratedItem; address: ClmmKeys }>>;\n  }\n\n  public async openPositionFromBase<T extends TxVersion>({\n    poolInfo,\n    poolKeys: propPoolKeys,\n    ownerInfo,\n    tickLower,\n    tickUpper,\n    base,\n    baseAmount,\n    otherAmountMax,\n    associatedOnly = true,\n    checkCreateATAOwner = false,\n    withMetadata = \"create\",\n    getEphemeralSigners,\n    computeBudgetConfig,\n    txVersion,\n  }: OpenPositionFromBase<T>): Promise<MakeTxData<T, OpenPositionFromBaseExtInfo>> {\n    if (this.scope.availability.addConcentratedPosition === false)\n      this.logAndCreateError(\"add position feature disabled in your region\");\n\n    this.scope.checkOwner();\n    const txBuilder = this.createTxBuilder();\n\n    let ownerTokenAccountA: PublicKey | null = null;\n    let ownerTokenAccountB: PublicKey | null = null;\n    const mintAUseSOLBalance = ownerInfo.useSOLBalance && poolInfo.mintA.address === WSOLMint.toString();\n    const mintBUseSOLBalance = ownerInfo.useSOLBalance && poolInfo.mintB.address === WSOLMint.toString();\n    const [amountA, amountB] = base === \"MintA\" ? [baseAmount, otherAmountMax] : [otherAmountMax, baseAmount];\n\n    const { account: _ownerTokenAccountA, instructionParams: _tokenAccountAInstruction } =\n      await this.scope.account.getOrCreateTokenAccount({\n        tokenProgram: poolInfo.mintA.programId,\n        mint: new PublicKey(poolInfo.mintA.address),\n        owner: this.scope.ownerPubKey,\n\n        createInfo:\n          mintAUseSOLBalance || amountA.isZero()\n            ? {\n                payer: this.scope.ownerPubKey,\n                amount: amountA,\n              }\n            : undefined,\n        skipCloseAccount: !mintAUseSOLBalance,\n        notUseTokenAccount: mintAUseSOLBalance,\n        associatedOnly: mintAUseSOLBalance ? false : associatedOnly,\n        checkCreateATAOwner,\n      });\n    if (_ownerTokenAccountA) ownerTokenAccountA = _ownerTokenAccountA;\n    txBuilder.addInstruction(_tokenAccountAInstruction || {});\n\n    const { account: _ownerTokenAccountB, instructionParams: _tokenAccountBInstruction } =\n      await this.scope.account.getOrCreateTokenAccount({\n        tokenProgram: poolInfo.mintB.programId,\n        mint: new PublicKey(poolInfo.mintB.address),\n        owner: this.scope.ownerPubKey,\n\n        createInfo:\n          mintBUseSOLBalance || amountB.isZero()\n            ? {\n                payer: this.scope.ownerPubKey!,\n                amount: amountB,\n              }\n            : undefined,\n        skipCloseAccount: !mintBUseSOLBalance,\n        notUseTokenAccount: mintBUseSOLBalance,\n        associatedOnly: mintBUseSOLBalance ? false : associatedOnly,\n        checkCreateATAOwner,\n      });\n    if (_ownerTokenAccountB) ownerTokenAccountB = _ownerTokenAccountB;\n    txBuilder.addInstruction(_tokenAccountBInstruction || {});\n\n    if (!ownerTokenAccountA || !ownerTokenAccountB)\n      this.logAndCreateError(\"cannot found target token accounts\", \"tokenAccounts\", {\n        ownerTokenAccountA: ownerTokenAccountA?.toBase58(),\n        ownerTokenAccountB: ownerTokenAccountB?.toBase58(),\n      });\n\n    const poolKeys = propPoolKeys || (await this.getClmmPoolKeys(poolInfo.id));\n    const insInfo = await ClmmInstrument.openPositionFromBaseInstructions({\n      poolInfo,\n      poolKeys,\n      ownerInfo: {\n        ...ownerInfo,\n        feePayer: this.scope.ownerPubKey,\n        wallet: this.scope.ownerPubKey,\n        tokenAccountA: ownerTokenAccountA!,\n        tokenAccountB: ownerTokenAccountB!,\n      },\n      tickLower,\n      tickUpper,\n      base,\n      baseAmount,\n      otherAmountMax,\n      withMetadata,\n      getEphemeralSigners,\n    });\n\n    txBuilder.addInstruction(insInfo);\n    txBuilder.addCustomComputeBudget(computeBudgetConfig);\n    return txBuilder.versionBuild<OpenPositionFromBaseExtInfo>({ txVersion, extInfo: insInfo.address }) as Promise<\n      MakeTxData<T, OpenPositionFromBaseExtInfo>\n    >;\n  }\n\n  public async openPositionFromLiquidity<T extends TxVersion>({\n    poolInfo,\n    poolKeys: propPoolKeys,\n    ownerInfo,\n    amountMaxA,\n    amountMaxB,\n    tickLower,\n    tickUpper,\n    liquidity,\n    associatedOnly = true,\n    checkCreateATAOwner = false,\n    withMetadata = \"create\",\n    txVersion,\n    getEphemeralSigners,\n  }: OpenPositionFromLiquidity<T>): Promise<MakeTxData<T, OpenPositionFromLiquidityExtInfo>> {\n    if (this.scope.availability.createConcentratedPosition === false)\n      this.logAndCreateError(\"open position feature disabled in your region\");\n    const txBuilder = this.createTxBuilder();\n\n    let ownerTokenAccountA: PublicKey | null = null;\n    let ownerTokenAccountB: PublicKey | null = null;\n    const mintAUseSOLBalance = ownerInfo.useSOLBalance && poolInfo.mintA.address === WSOLMint.toBase58();\n    const mintBUseSOLBalance = ownerInfo.useSOLBalance && poolInfo.mintB.address === WSOLMint.toBase58();\n\n    const { account: _ownerTokenAccountA, instructionParams: _tokenAccountAInstruction } =\n      await this.scope.account.getOrCreateTokenAccount({\n        tokenProgram: poolInfo.mintA.programId,\n        mint: new PublicKey(poolInfo.mintA.address),\n        owner: this.scope.ownerPubKey,\n\n        createInfo:\n          mintAUseSOLBalance || amountMaxA.isZero()\n            ? {\n                payer: this.scope.ownerPubKey,\n                amount: amountMaxA,\n              }\n            : undefined,\n\n        skipCloseAccount: !mintAUseSOLBalance,\n        notUseTokenAccount: mintAUseSOLBalance,\n        associatedOnly: mintAUseSOLBalance ? false : associatedOnly,\n        checkCreateATAOwner,\n      });\n    if (_ownerTokenAccountA) ownerTokenAccountA = _ownerTokenAccountA;\n    txBuilder.addInstruction(_tokenAccountAInstruction || {});\n\n    const { account: _ownerTokenAccountB, instructionParams: _tokenAccountBInstruction } =\n      await this.scope.account.getOrCreateTokenAccount({\n        tokenProgram: poolInfo.mintB.programId,\n        mint: new PublicKey(poolInfo.mintB.address),\n        owner: this.scope.ownerPubKey,\n\n        createInfo:\n          mintBUseSOLBalance || amountMaxB.isZero()\n            ? {\n                payer: this.scope.ownerPubKey!,\n                amount: amountMaxB,\n              }\n            : undefined,\n        skipCloseAccount: !mintBUseSOLBalance,\n        notUseTokenAccount: mintBUseSOLBalance,\n        associatedOnly: mintBUseSOLBalance ? false : associatedOnly,\n        checkCreateATAOwner,\n      });\n    if (_ownerTokenAccountB) ownerTokenAccountB = _ownerTokenAccountB;\n    txBuilder.addInstruction(_tokenAccountBInstruction || {});\n\n    if (ownerTokenAccountA === undefined || ownerTokenAccountB === undefined)\n      this.logAndCreateError(\"cannot found target token accounts\", \"tokenAccounts\", this.scope.account.tokenAccounts);\n\n    const poolKeys = propPoolKeys || (await this.getClmmPoolKeys(poolInfo.id));\n\n    const makeOpenPositionInstructions = await ClmmInstrument.openPositionFromLiquidityInstructions({\n      poolInfo,\n      poolKeys,\n      ownerInfo: {\n        wallet: this.scope.ownerPubKey,\n        tokenAccountA: ownerTokenAccountA!,\n        tokenAccountB: ownerTokenAccountB!,\n      },\n      tickLower,\n      tickUpper,\n      liquidity,\n      amountMaxA,\n      amountMaxB,\n      withMetadata,\n      getEphemeralSigners,\n    });\n    txBuilder.addInstruction(makeOpenPositionInstructions);\n\n    return txBuilder.versionBuild<OpenPositionFromLiquidityExtInfo>({\n      txVersion,\n      extInfo: { address: makeOpenPositionInstructions.address },\n    }) as Promise<MakeTxData<T, OpenPositionFromLiquidityExtInfo>>;\n  }\n\n  public async increasePositionFromLiquidity<T extends TxVersion>(\n    props: IncreasePositionFromLiquidity<T>,\n  ): Promise<MakeTxData<T, ManipulateLiquidityExtInfo>> {\n    const {\n      poolInfo,\n      poolKeys: propPoolKeys,\n      ownerPosition,\n      amountMaxA,\n      amountMaxB,\n      liquidity,\n      ownerInfo,\n      associatedOnly = true,\n      checkCreateATAOwner = false,\n      computeBudgetConfig,\n      txVersion,\n    } = props;\n    const txBuilder = this.createTxBuilder();\n\n    let ownerTokenAccountA: PublicKey | undefined = undefined;\n    let ownerTokenAccountB: PublicKey | undefined = undefined;\n\n    const mintAUseSOLBalance = ownerInfo.useSOLBalance && poolInfo.mintA.address === WSOLMint.toString();\n    const mintBUseSOLBalance = ownerInfo.useSOLBalance && poolInfo.mintB.address === WSOLMint.toString();\n    const { account: _ownerTokenAccountA, instructionParams: _tokenAccountAInstruction } =\n      await this.scope.account.getOrCreateTokenAccount({\n        tokenProgram: poolInfo.mintA.programId,\n        mint: new PublicKey(poolInfo.mintA.address),\n        notUseTokenAccount: mintAUseSOLBalance,\n        owner: this.scope.ownerPubKey,\n\n        createInfo:\n          mintAUseSOLBalance || amountMaxA.isZero()\n            ? {\n                payer: this.scope.ownerPubKey,\n                amount: amountMaxA,\n              }\n            : undefined,\n        skipCloseAccount: !mintAUseSOLBalance,\n        associatedOnly: mintAUseSOLBalance ? false : associatedOnly,\n        checkCreateATAOwner,\n      });\n    if (_ownerTokenAccountA) ownerTokenAccountA = _ownerTokenAccountA;\n    txBuilder.addInstruction(_tokenAccountAInstruction || {});\n    const { account: _ownerTokenAccountB, instructionParams: _tokenAccountBInstruction } =\n      await this.scope.account.getOrCreateTokenAccount({\n        tokenProgram: poolInfo.mintB.programId,\n        mint: new PublicKey(poolInfo.mintB.address),\n        owner: this.scope.ownerPubKey,\n\n        createInfo:\n          mintBUseSOLBalance || amountMaxB.isZero()\n            ? {\n                payer: this.scope.ownerPubKey!,\n                amount: amountMaxB,\n              }\n            : undefined,\n        notUseTokenAccount: mintBUseSOLBalance,\n        skipCloseAccount: !mintBUseSOLBalance,\n        associatedOnly: mintBUseSOLBalance ? false : associatedOnly,\n        checkCreateATAOwner,\n      });\n    if (_ownerTokenAccountB) ownerTokenAccountB = _ownerTokenAccountB;\n    txBuilder.addInstruction(_tokenAccountBInstruction || {});\n\n    if (!ownerTokenAccountA && !ownerTokenAccountB)\n      this.logAndCreateError(\"cannot found target token accounts\", \"tokenAccounts\", this.scope.account.tokenAccounts);\n    const poolKeys = propPoolKeys ?? (await this.getClmmPoolKeys(poolInfo.id));\n    const ins = ClmmInstrument.increasePositionFromLiquidityInstructions({\n      poolInfo,\n      poolKeys,\n      ownerPosition,\n      ownerInfo: {\n        wallet: this.scope.ownerPubKey,\n        tokenAccountA: ownerTokenAccountA!,\n        tokenAccountB: ownerTokenAccountB!,\n      },\n      liquidity,\n      amountMaxA,\n      amountMaxB,\n    });\n    txBuilder.addInstruction(ins);\n    txBuilder.addCustomComputeBudget(computeBudgetConfig);\n    return txBuilder.versionBuild<ManipulateLiquidityExtInfo>({\n      txVersion,\n      extInfo: { address: ins.address },\n    }) as Promise<MakeTxData<T, ManipulateLiquidityExtInfo>>;\n  }\n\n  public async increasePositionFromBase<T extends TxVersion>(\n    props: IncreasePositionFromBase<T>,\n  ): Promise<MakeTxData<T, ManipulateLiquidityExtInfo>> {\n    const {\n      poolInfo,\n      ownerPosition,\n      base,\n      baseAmount,\n      otherAmountMax,\n      ownerInfo,\n      associatedOnly = true,\n      checkCreateATAOwner = false,\n      computeBudgetConfig,\n      txVersion,\n    } = props;\n    const txBuilder = this.createTxBuilder();\n\n    let ownerTokenAccountA: PublicKey | undefined = undefined;\n    let ownerTokenAccountB: PublicKey | undefined = undefined;\n    const mintAUseSOLBalance = ownerInfo.useSOLBalance && poolInfo.mintA.address === WSOLMint.toString();\n    const mintBUseSOLBalance = ownerInfo.useSOLBalance && poolInfo.mintB.address === WSOLMint.toString();\n\n    const { account: _ownerTokenAccountA, instructionParams: _tokenAccountAInstruction } =\n      await this.scope.account.getOrCreateTokenAccount({\n        tokenProgram: poolInfo.mintA.programId,\n        mint: new PublicKey(poolInfo.mintA.address),\n        notUseTokenAccount: mintAUseSOLBalance,\n        owner: this.scope.ownerPubKey,\n\n        createInfo:\n          mintAUseSOLBalance || (base === \"MintA\" ? baseAmount : otherAmountMax).isZero()\n            ? {\n                payer: this.scope.ownerPubKey,\n                amount: base === \"MintA\" ? baseAmount : otherAmountMax,\n              }\n            : undefined,\n        skipCloseAccount: !mintAUseSOLBalance,\n        associatedOnly: mintAUseSOLBalance ? false : associatedOnly,\n        checkCreateATAOwner,\n      });\n    if (_ownerTokenAccountA) ownerTokenAccountA = _ownerTokenAccountA;\n    txBuilder.addInstruction(_tokenAccountAInstruction || {});\n\n    const { account: _ownerTokenAccountB, instructionParams: _tokenAccountBInstruction } =\n      await this.scope.account.getOrCreateTokenAccount({\n        tokenProgram: poolInfo.mintB.programId,\n        mint: new PublicKey(poolInfo.mintB.address),\n        owner: this.scope.ownerPubKey,\n\n        createInfo:\n          mintBUseSOLBalance || (base === \"MintA\" ? otherAmountMax : baseAmount).isZero()\n            ? {\n                payer: this.scope.ownerPubKey!,\n                amount: base === \"MintA\" ? otherAmountMax : baseAmount,\n              }\n            : undefined,\n        notUseTokenAccount: mintBUseSOLBalance,\n        skipCloseAccount: !mintBUseSOLBalance,\n        associatedOnly: mintBUseSOLBalance ? false : associatedOnly,\n        checkCreateATAOwner,\n      });\n    if (_ownerTokenAccountB) ownerTokenAccountB = _ownerTokenAccountB;\n    txBuilder.addInstruction(_tokenAccountBInstruction || {});\n    if (!ownerTokenAccountA && !ownerTokenAccountB)\n      this.logAndCreateError(\"cannot found target token accounts\", \"tokenAccounts\", this.scope.account.tokenAccounts);\n\n    const poolKeys = await this.getClmmPoolKeys(poolInfo.id);\n    const ins = ClmmInstrument.increasePositionFromBaseInstructions({\n      poolInfo,\n      poolKeys,\n      ownerPosition,\n      ownerInfo: {\n        wallet: this.scope.ownerPubKey,\n        tokenAccountA: ownerTokenAccountA!,\n        tokenAccountB: ownerTokenAccountB!,\n      },\n      base,\n      baseAmount,\n      otherAmountMax,\n    });\n    txBuilder.addInstruction(ins);\n    txBuilder.addCustomComputeBudget(computeBudgetConfig);\n\n    return txBuilder.versionBuild<ManipulateLiquidityExtInfo>({\n      txVersion,\n      extInfo: { address: ins.address },\n    }) as Promise<MakeTxData<T, ManipulateLiquidityExtInfo>>;\n  }\n\n  public async decreaseLiquidity<T extends TxVersion>(\n    props: DecreaseLiquidity<T>,\n  ): Promise<MakeTxData<T, ManipulateLiquidityExtInfo & Partial<ClosePositionExtInfo>>> {\n    const {\n      poolInfo,\n      poolKeys: propPoolKeys,\n      ownerPosition,\n      ownerInfo,\n      amountMinA,\n      amountMinB,\n      liquidity,\n      associatedOnly = true,\n      checkCreateATAOwner = false,\n      computeBudgetConfig,\n      txVersion,\n    } = props;\n    if (this.scope.availability.removeConcentratedPosition === false)\n      this.logAndCreateError(\"remove position feature disabled in your region\");\n    const txBuilder = this.createTxBuilder();\n\n    const mintAUseSOLBalance = ownerInfo.useSOLBalance && poolInfo.mintA.address === WSOLMint.toString();\n    const mintBUseSOLBalance = ownerInfo.useSOLBalance && poolInfo.mintB.address === WSOLMint.toString();\n\n    let ownerTokenAccountA: PublicKey | undefined = undefined;\n    let ownerTokenAccountB: PublicKey | undefined = undefined;\n    const { account: _ownerTokenAccountA, instructionParams: accountAInstructions } =\n      await this.scope.account.getOrCreateTokenAccount({\n        tokenProgram: poolInfo.mintA.programId,\n        mint: new PublicKey(poolInfo.mintA.address),\n        notUseTokenAccount: mintAUseSOLBalance,\n        owner: this.scope.ownerPubKey,\n        createInfo: {\n          payer: this.scope.ownerPubKey,\n          amount: 0,\n        },\n        skipCloseAccount: !mintAUseSOLBalance,\n        associatedOnly: mintAUseSOLBalance ? false : associatedOnly,\n        checkCreateATAOwner,\n      });\n    ownerTokenAccountA = _ownerTokenAccountA;\n    accountAInstructions && txBuilder.addInstruction(accountAInstructions);\n\n    const { account: _ownerTokenAccountB, instructionParams: accountBInstructions } =\n      await this.scope.account.getOrCreateTokenAccount({\n        tokenProgram: poolInfo.mintB.programId,\n        mint: new PublicKey(poolInfo.mintB.address),\n        notUseTokenAccount: mintBUseSOLBalance,\n        owner: this.scope.ownerPubKey,\n        createInfo: {\n          payer: this.scope.ownerPubKey,\n          amount: 0,\n        },\n        skipCloseAccount: !mintBUseSOLBalance,\n        associatedOnly: mintBUseSOLBalance ? false : associatedOnly,\n        checkCreateATAOwner,\n      });\n    ownerTokenAccountB = _ownerTokenAccountB;\n    accountBInstructions && txBuilder.addInstruction(accountBInstructions);\n\n    const rewardAccounts: PublicKey[] = [];\n    for (const itemReward of poolInfo.rewardDefaultInfos) {\n      const rewardUseSOLBalance = ownerInfo.useSOLBalance && itemReward.mint.address === WSOLMint.toString();\n\n      let ownerRewardAccount: PublicKey | undefined;\n\n      if (itemReward.mint.address === poolInfo.mintA.address) ownerRewardAccount = ownerTokenAccountA;\n      else if (itemReward.mint.address === poolInfo.mintB.address) ownerRewardAccount = ownerTokenAccountB;\n      else {\n        const { account: _ownerRewardAccount, instructionParams: ownerRewardAccountInstructions } =\n          await this.scope.account.getOrCreateTokenAccount({\n            tokenProgram: new PublicKey(itemReward.mint.programId),\n            mint: new PublicKey(itemReward.mint.address),\n            notUseTokenAccount: rewardUseSOLBalance,\n            owner: this.scope.ownerPubKey,\n            createInfo: {\n              payer: this.scope.ownerPubKey,\n              amount: 0,\n            },\n            skipCloseAccount: !rewardUseSOLBalance,\n            associatedOnly: rewardUseSOLBalance ? false : associatedOnly,\n            checkCreateATAOwner,\n          });\n        ownerRewardAccount = _ownerRewardAccount;\n        ownerRewardAccountInstructions && txBuilder.addInstruction(ownerRewardAccountInstructions);\n      }\n\n      rewardAccounts.push(ownerRewardAccount!);\n    }\n\n    if (!ownerTokenAccountA && !ownerTokenAccountB)\n      this.logAndCreateError(\n        \"cannot found target token accounts\",\n        \"tokenAccounts\",\n        this.scope.account.tokenAccountRawInfos,\n      );\n\n    const poolKeys = propPoolKeys ?? (await this.getClmmPoolKeys(poolInfo.id));\n\n    const decreaseInsInfo = await ClmmInstrument.decreaseLiquidityInstructions({\n      poolInfo,\n      poolKeys,\n      ownerPosition,\n      ownerInfo: {\n        wallet: this.scope.ownerPubKey,\n        tokenAccountA: ownerTokenAccountA!,\n        tokenAccountB: ownerTokenAccountB!,\n        rewardAccounts,\n      },\n      liquidity,\n      amountMinA,\n      amountMinB,\n    });\n\n    txBuilder.addInstruction({\n      instructions: decreaseInsInfo.instructions,\n      instructionTypes: [InstructionType.ClmmDecreasePosition],\n    });\n\n    let extInfo = { ...decreaseInsInfo.address };\n    if (ownerInfo.closePosition) {\n      const closeInsInfo = await ClmmInstrument.closePositionInstructions({\n        poolInfo,\n        poolKeys,\n        ownerInfo: { wallet: this.scope.ownerPubKey },\n        ownerPosition,\n      });\n      txBuilder.addInstruction({\n        endInstructions: closeInsInfo.instructions,\n        endInstructionTypes: closeInsInfo.instructionTypes,\n      });\n      extInfo = { ...extInfo, ...closeInsInfo.address };\n    }\n    txBuilder.addCustomComputeBudget(computeBudgetConfig);\n\n    return txBuilder.versionBuild<ManipulateLiquidityExtInfo>({\n      txVersion,\n      extInfo: { address: extInfo },\n    }) as Promise<MakeTxData<T, ManipulateLiquidityExtInfo>>;\n  }\n\n  public async closePosition<T extends TxVersion>({\n    poolInfo,\n    poolKeys: propPoolKeys,\n    ownerPosition,\n    txVersion,\n  }: {\n    poolInfo: ApiV3PoolInfoConcentratedItem;\n    poolKeys?: ClmmKeys;\n    ownerPosition: ClmmPositionLayout;\n    txVersion: T;\n  }): Promise<MakeTxData<T, ClosePositionExtInfo>> {\n    if (this.scope.availability.removeConcentratedPosition === false)\n      this.logAndCreateError(\"remove position feature disabled in your region\");\n    const txBuilder = this.createTxBuilder();\n    const poolKeys = propPoolKeys ?? (await this.getClmmPoolKeys(poolInfo.id));\n    const ins = ClmmInstrument.closePositionInstructions({\n      poolInfo,\n      poolKeys,\n      ownerInfo: { wallet: this.scope.ownerPubKey },\n      ownerPosition,\n    });\n\n    return txBuilder.addInstruction(ins).versionBuild<ClosePositionExtInfo>({\n      txVersion,\n      extInfo: { address: ins.address },\n    }) as Promise<MakeTxData<T, ClosePositionExtInfo>>;\n  }\n\n  public async initReward<T extends TxVersion>({\n    poolInfo,\n    ownerInfo,\n    rewardInfo,\n    associatedOnly = true,\n    checkCreateATAOwner = false,\n    computeBudgetConfig,\n    txVersion,\n  }: InitRewardParams<T>): Promise<MakeTxData<T, InitRewardExtInfo>> {\n    if (rewardInfo.endTime <= rewardInfo.openTime)\n      this.logAndCreateError(\"reward time error\", \"rewardInfo\", rewardInfo);\n\n    const txBuilder = this.createTxBuilder();\n\n    const rewardMintUseSOLBalance =\n      ownerInfo.useSOLBalance && rewardInfo.mint.address.toString() === WSOLMint.toString();\n    const _baseRewardAmount = rewardInfo.perSecond.mul(rewardInfo.endTime - rewardInfo.openTime);\n\n    const { account: ownerRewardAccount, instructionParams: ownerRewardAccountIns } =\n      await this.scope.account.getOrCreateTokenAccount({\n        tokenProgram: new PublicKey(rewardInfo.mint.address),\n        mint: new PublicKey(rewardInfo.mint.address),\n        notUseTokenAccount: !!rewardMintUseSOLBalance,\n        skipCloseAccount: !rewardMintUseSOLBalance,\n        owner: this.scope.ownerPubKey,\n        createInfo: rewardMintUseSOLBalance\n          ? {\n              payer: ownerInfo.feePayer || this.scope.ownerPubKey,\n              amount: new BN(\n                new Decimal(_baseRewardAmount.toFixed(0)).gte(_baseRewardAmount)\n                  ? _baseRewardAmount.toFixed(0)\n                  : _baseRewardAmount.add(1).toFixed(0),\n              ),\n            }\n          : undefined,\n        associatedOnly: rewardMintUseSOLBalance ? false : associatedOnly,\n        checkCreateATAOwner,\n      });\n    ownerRewardAccountIns && txBuilder.addInstruction(ownerRewardAccountIns);\n\n    if (!ownerRewardAccount)\n      this.logAndCreateError(\"no money\", \"ownerRewardAccount\", this.scope.account.tokenAccountRawInfos);\n    const poolKeys = await this.getClmmPoolKeys(poolInfo.id);\n    const insInfo = ClmmInstrument.initRewardInstructions({\n      poolInfo,\n      poolKeys,\n      ownerInfo: {\n        wallet: this.scope.ownerPubKey,\n        tokenAccount: ownerRewardAccount!,\n      },\n      rewardInfo: {\n        programId: new PublicKey(rewardInfo.mint.programId),\n        mint: new PublicKey(rewardInfo.mint.address),\n        openTime: rewardInfo.openTime,\n        endTime: rewardInfo.endTime,\n        emissionsPerSecondX64: MathUtil.decimalToX64(rewardInfo.perSecond),\n      },\n    });\n    txBuilder.addInstruction(insInfo);\n    txBuilder.addCustomComputeBudget(computeBudgetConfig);\n    return txBuilder.versionBuild<InitRewardExtInfo>({\n      txVersion,\n      extInfo: { address: insInfo.address },\n    }) as Promise<MakeTxData<T, InitRewardExtInfo>>;\n  }\n\n  public async initRewards<T extends TxVersion>({\n    poolInfo,\n    poolKeys: propPoolKeys,\n    ownerInfo,\n    rewardInfos,\n    associatedOnly = true,\n    checkCreateATAOwner = false,\n    computeBudgetConfig,\n    txVersion,\n  }: InitRewardsParams<T>): Promise<MakeTxData<T, { address: Record<string, PublicKey> }>> {\n    for (const rewardInfo of rewardInfos) {\n      if (rewardInfo.endTime <= rewardInfo.openTime)\n        this.logAndCreateError(\"reward time error\", \"rewardInfo\", rewardInfo);\n    }\n\n    const txBuilder = this.createTxBuilder();\n    let address: Record<string, PublicKey> = {};\n\n    for (const rewardInfo of rewardInfos) {\n      const rewardMintUseSOLBalance = ownerInfo.useSOLBalance && rewardInfo.mint.address === WSOLMint.toString();\n      const _baseRewardAmount = rewardInfo.perSecond.mul(rewardInfo.endTime - rewardInfo.openTime);\n\n      const { account: ownerRewardAccount, instructionParams: ownerRewardAccountIns } =\n        await this.scope.account.getOrCreateTokenAccount({\n          tokenProgram: new PublicKey(rewardInfo.mint.programId),\n          mint: new PublicKey(rewardInfo.mint.address),\n          notUseTokenAccount: !!rewardMintUseSOLBalance,\n          skipCloseAccount: !rewardMintUseSOLBalance,\n          owner: this.scope.ownerPubKey,\n          createInfo: rewardMintUseSOLBalance\n            ? {\n                payer: ownerInfo.feePayer || this.scope.ownerPubKey,\n                amount: new BN(\n                  new Decimal(_baseRewardAmount.toFixed(0)).gte(_baseRewardAmount)\n                    ? _baseRewardAmount.toFixed(0)\n                    : _baseRewardAmount.add(1).toFixed(0),\n                ),\n              }\n            : undefined,\n          associatedOnly: rewardMintUseSOLBalance ? false : associatedOnly,\n          checkCreateATAOwner,\n        });\n      ownerRewardAccountIns && txBuilder.addInstruction(ownerRewardAccountIns);\n\n      if (!ownerRewardAccount)\n        this.logAndCreateError(\"no money\", \"ownerRewardAccount\", this.scope.account.tokenAccountRawInfos);\n\n      const poolKeys = propPoolKeys ?? (await this.getClmmPoolKeys(poolInfo.id));\n      const insInfo = ClmmInstrument.initRewardInstructions({\n        poolInfo,\n        poolKeys,\n        ownerInfo: {\n          wallet: this.scope.ownerPubKey,\n          tokenAccount: ownerRewardAccount!,\n        },\n        rewardInfo: {\n          programId: new PublicKey(rewardInfo.mint.programId),\n          mint: new PublicKey(rewardInfo.mint.address),\n          openTime: rewardInfo.openTime,\n          endTime: rewardInfo.endTime,\n          emissionsPerSecondX64: MathUtil.decimalToX64(rewardInfo.perSecond),\n        },\n      });\n      address = {\n        ...address,\n        ...insInfo.address,\n      };\n      txBuilder.addInstruction(insInfo);\n    }\n    txBuilder.addCustomComputeBudget(computeBudgetConfig);\n    return txBuilder.versionBuild({\n      txVersion,\n      extInfo: { address },\n    }) as Promise<MakeTxData<T, { address: Record<string, PublicKey> }>>;\n  }\n\n  public async setReward<T extends TxVersion>({\n    poolInfo,\n    ownerInfo,\n    rewardInfo,\n    associatedOnly = true,\n    checkCreateATAOwner = false,\n    computeBudgetConfig,\n    txVersion,\n  }: SetRewardParams<T>): Promise<MakeTxData<T, { address: Record<string, PublicKey> }>> {\n    if (rewardInfo.endTime <= rewardInfo.openTime)\n      this.logAndCreateError(\"reward time error\", \"rewardInfo\", rewardInfo);\n\n    const txBuilder = this.createTxBuilder();\n    const rewardMintUseSOLBalance = ownerInfo.useSOLBalance && rewardInfo.mint.equals(WSOLMint);\n    const { account: ownerRewardAccount, instructionParams: ownerRewardIns } =\n      await this.scope.account.getOrCreateTokenAccount({\n        tokenProgram: rewardInfo.programId,\n        mint: rewardInfo.mint,\n        notUseTokenAccount: rewardMintUseSOLBalance,\n        owner: this.scope.ownerPubKey,\n        createInfo: rewardMintUseSOLBalance\n          ? {\n              payer: ownerInfo.feePayer || this.scope.ownerPubKey,\n              amount: new BN(\n                new Decimal(rewardInfo.perSecond.sub(rewardInfo.endTime - rewardInfo.openTime).toFixed(0)).gte(\n                  rewardInfo.perSecond.sub(rewardInfo.endTime - rewardInfo.openTime),\n                )\n                  ? rewardInfo.perSecond.sub(rewardInfo.endTime - rewardInfo.openTime).toFixed(0)\n                  : rewardInfo.perSecond\n                      .sub(rewardInfo.endTime - rewardInfo.openTime)\n                      .add(1)\n                      .toFixed(0),\n              ),\n            }\n          : undefined,\n\n        associatedOnly: rewardMintUseSOLBalance ? false : associatedOnly,\n        checkCreateATAOwner,\n      });\n    ownerRewardIns && txBuilder.addInstruction(ownerRewardIns);\n    if (!ownerRewardAccount)\n      this.logAndCreateError(\"no money\", \"ownerRewardAccount\", this.scope.account.tokenAccountRawInfos);\n    const poolKeys = await this.getClmmPoolKeys(poolInfo.id);\n    const insInfo = ClmmInstrument.setRewardInstructions({\n      poolInfo,\n      poolKeys,\n      ownerInfo: {\n        wallet: this.scope.ownerPubKey,\n        tokenAccount: ownerRewardAccount!,\n      },\n      rewardInfo: {\n        mint: rewardInfo.mint,\n        openTime: rewardInfo.openTime,\n        endTime: rewardInfo.endTime,\n        emissionsPerSecondX64: MathUtil.decimalToX64(rewardInfo.perSecond),\n      },\n    });\n\n    txBuilder.addInstruction(insInfo);\n    txBuilder.addCustomComputeBudget(computeBudgetConfig);\n    return txBuilder.versionBuild<{ address: Record<string, PublicKey> }>({\n      txVersion,\n      extInfo: { address: insInfo.address },\n    }) as Promise<MakeTxData<T, { address: Record<string, PublicKey> }>>;\n  }\n\n  public async setRewards<T extends TxVersion>({\n    poolInfo,\n    poolKeys: propPoolKeys,\n    ownerInfo,\n    rewardInfos,\n    associatedOnly = true,\n    checkCreateATAOwner = false,\n    computeBudgetConfig,\n    txVersion,\n  }: SetRewardsParams<T>): Promise<MakeTxData<T, { address: Record<string, PublicKey> }>> {\n    const txBuilder = this.createTxBuilder();\n    let address: Record<string, PublicKey> = {};\n    for (const rewardInfo of rewardInfos) {\n      if (rewardInfo.endTime <= rewardInfo.openTime)\n        this.logAndCreateError(\"reward time error\", \"rewardInfo\", rewardInfo);\n\n      const rewardMintUseSOLBalance = ownerInfo.useSOLBalance && rewardInfo.mint.address === WSOLMint.toString();\n      const { account: ownerRewardAccount, instructionParams: ownerRewardIns } =\n        await this.scope.account.getOrCreateTokenAccount({\n          tokenProgram: new PublicKey(rewardInfo.mint.programId),\n          mint: new PublicKey(rewardInfo.mint.address),\n          notUseTokenAccount: rewardMintUseSOLBalance,\n          owner: this.scope.ownerPubKey,\n          createInfo: rewardMintUseSOLBalance\n            ? {\n                payer: ownerInfo.feePayer || this.scope.ownerPubKey,\n                amount: new BN(\n                  new Decimal(rewardInfo.perSecond.sub(rewardInfo.endTime - rewardInfo.openTime).toFixed(0)).gte(\n                    rewardInfo.perSecond.sub(rewardInfo.endTime - rewardInfo.openTime),\n                  )\n                    ? rewardInfo.perSecond.sub(rewardInfo.endTime - rewardInfo.openTime).toFixed(0)\n                    : rewardInfo.perSecond\n                        .sub(rewardInfo.endTime - rewardInfo.openTime)\n                        .add(1)\n                        .toFixed(0),\n                ),\n              }\n            : undefined,\n          associatedOnly: rewardMintUseSOLBalance ? false : associatedOnly,\n          checkCreateATAOwner,\n        });\n      ownerRewardIns && txBuilder.addInstruction(ownerRewardIns);\n      if (!ownerRewardAccount)\n        this.logAndCreateError(\"no money\", \"ownerRewardAccount\", this.scope.account.tokenAccountRawInfos);\n      const poolKeys = propPoolKeys ?? (await this.getClmmPoolKeys(poolInfo.id));\n      const insInfo = ClmmInstrument.setRewardInstructions({\n        poolInfo,\n        poolKeys,\n        ownerInfo: {\n          wallet: this.scope.ownerPubKey,\n          tokenAccount: ownerRewardAccount!,\n        },\n        rewardInfo: {\n          mint: new PublicKey(rewardInfo.mint.address),\n          openTime: rewardInfo.openTime,\n          endTime: rewardInfo.endTime,\n          emissionsPerSecondX64: MathUtil.decimalToX64(rewardInfo.perSecond),\n        },\n      });\n      txBuilder.addInstruction(insInfo);\n      address = {\n        ...address,\n        ...insInfo.address,\n      };\n    }\n    txBuilder.addCustomComputeBudget(computeBudgetConfig);\n    return txBuilder.versionBuild<{ address: Record<string, PublicKey> }>({\n      txVersion,\n      extInfo: { address },\n    }) as Promise<MakeTxData<T, { address: Record<string, PublicKey> }>>;\n  }\n\n  public async collectReward({\n    poolInfo,\n    ownerInfo,\n    rewardMint,\n    associatedOnly = true,\n    checkCreateATAOwner = false,\n  }: CollectRewardParams): Promise<MakeTransaction> {\n    const rewardInfo = poolInfo!.rewardDefaultInfos.find((i) => i.mint.address === rewardMint.toString());\n    if (!rewardInfo) this.logAndCreateError(\"reward mint error\", \"not found reward mint\", rewardMint);\n\n    const txBuilder = this.createTxBuilder();\n    const rewardMintUseSOLBalance = ownerInfo.useSOLBalance && rewardMint.equals(WSOLMint);\n    const { account: ownerRewardAccount, instructionParams: ownerRewardIns } =\n      await this.scope.account.getOrCreateTokenAccount({\n        tokenProgram: new PublicKey(rewardInfo!.mint.programId),\n        mint: rewardMint,\n        notUseTokenAccount: rewardMintUseSOLBalance,\n        owner: this.scope.ownerPubKey,\n        skipCloseAccount: !rewardMintUseSOLBalance,\n        createInfo: {\n          payer: ownerInfo.feePayer || this.scope.ownerPubKey,\n          amount: 0,\n        },\n        associatedOnly: rewardMintUseSOLBalance ? false : associatedOnly,\n        checkCreateATAOwner,\n      });\n    ownerRewardIns && txBuilder.addInstruction(ownerRewardIns);\n\n    if (!ownerRewardAccount)\n      this.logAndCreateError(\"no money\", \"ownerRewardAccount\", this.scope.account.tokenAccountRawInfos);\n    const poolKeys = await this.getClmmPoolKeys(poolInfo.id);\n    const insInfo = ClmmInstrument.collectRewardInstructions({\n      poolInfo,\n      poolKeys,\n      ownerInfo: {\n        wallet: this.scope.ownerPubKey,\n        tokenAccount: ownerRewardAccount!,\n      },\n      rewardMint,\n    });\n    txBuilder.addInstruction(insInfo);\n\n    return txBuilder.build<{ address: Record<string, PublicKey> }>({ address: insInfo.address });\n  }\n\n  public async collectRewards({\n    poolInfo,\n    ownerInfo,\n    rewardMints,\n    associatedOnly = true,\n    checkCreateATAOwner = false,\n  }: CollectRewardsParams): Promise<MakeTransaction> {\n    const txBuilder = this.createTxBuilder();\n    let address: Record<string, PublicKey> = {};\n\n    for (const rewardMint of rewardMints) {\n      const rewardInfo = poolInfo!.rewardDefaultInfos.find((i) => i.mint.address === rewardMint.toString());\n      if (!rewardInfo) {\n        this.logAndCreateError(\"reward mint error\", \"not found reward mint\", rewardMint);\n        continue;\n      }\n\n      const rewardMintUseSOLBalance = ownerInfo.useSOLBalance && rewardMint.equals(WSOLMint);\n      const { account: ownerRewardAccount, instructionParams: ownerRewardIns } =\n        await this.scope.account.getOrCreateTokenAccount({\n          tokenProgram: new PublicKey(rewardInfo.mint.programId),\n          mint: rewardMint,\n          notUseTokenAccount: rewardMintUseSOLBalance,\n          owner: this.scope.ownerPubKey,\n          skipCloseAccount: !rewardMintUseSOLBalance,\n          createInfo: {\n            payer: ownerInfo.feePayer || this.scope.ownerPubKey,\n            amount: 0,\n          },\n          associatedOnly: rewardMintUseSOLBalance ? false : associatedOnly,\n          checkCreateATAOwner,\n        });\n      if (!ownerRewardAccount)\n        this.logAndCreateError(\"no money\", \"ownerRewardAccount\", this.scope.account.tokenAccountRawInfos);\n      ownerRewardIns && txBuilder.addInstruction(ownerRewardIns);\n      const poolKeys = await this.getClmmPoolKeys(poolInfo.id);\n      const insInfo = ClmmInstrument.collectRewardInstructions({\n        poolInfo,\n        poolKeys,\n        ownerInfo: {\n          wallet: this.scope.ownerPubKey,\n          tokenAccount: ownerRewardAccount!,\n        },\n\n        rewardMint,\n      });\n      txBuilder.addInstruction(insInfo);\n      address = { ...address, ...insInfo.address };\n    }\n\n    return txBuilder.build<{ address: Record<string, PublicKey> }>({ address });\n  }\n\n  // currently only support\n  public async swap<T extends TxVersion>({\n    poolInfo,\n    poolKeys: propPoolKeys,\n    inputMint,\n    amountIn,\n    amountOutMin,\n    priceLimit,\n    observationId,\n    ownerInfo,\n    remainingAccounts,\n    associatedOnly = true,\n    checkCreateATAOwner = false,\n    txVersion,\n  }: {\n    poolInfo: ApiV3PoolInfoConcentratedItem;\n    poolKeys?: ClmmKeys;\n    inputMint: string | PublicKey;\n    amountIn: BN;\n    amountOutMin: BN;\n    priceLimit?: Decimal;\n    observationId: PublicKey;\n    ownerInfo: {\n      useSOLBalance?: boolean;\n      feePayer?: PublicKey;\n    };\n    remainingAccounts: PublicKey[];\n    associatedOnly?: boolean;\n    checkCreateATAOwner?: boolean;\n    txVersion?: T;\n  }): Promise<MakeTxData<T>> {\n    const txBuilder = this.createTxBuilder();\n    const baseIn = inputMint.toString() === poolInfo.mintA.address;\n    const mintAUseSOLBalance = ownerInfo.useSOLBalance && poolInfo.mintA.address === WSOLMint.toBase58();\n    const mintBUseSOLBalance = ownerInfo.useSOLBalance && poolInfo.mintB.address === WSOLMint.toBase58();\n\n    let sqrtPriceLimitX64: BN;\n    if (!priceLimit || priceLimit.equals(new Decimal(0))) {\n      sqrtPriceLimitX64 = baseIn ? MIN_SQRT_PRICE_X64.add(new BN(1)) : MAX_SQRT_PRICE_X64.sub(new BN(1));\n    } else {\n      sqrtPriceLimitX64 = SqrtPriceMath.priceToSqrtPriceX64(\n        priceLimit,\n        poolInfo.mintA.decimals,\n        poolInfo.mintB.decimals,\n      );\n    }\n\n    let ownerTokenAccountA: PublicKey | undefined;\n    if (!ownerTokenAccountA) {\n      const { account, instructionParams } = await this.scope.account.getOrCreateTokenAccount({\n        tokenProgram: poolInfo.mintA.programId,\n        mint: new PublicKey(poolInfo.mintA.address),\n        notUseTokenAccount: mintAUseSOLBalance,\n        owner: this.scope.ownerPubKey,\n        skipCloseAccount: !mintAUseSOLBalance,\n        createInfo:\n          mintAUseSOLBalance || !baseIn\n            ? {\n                payer: ownerInfo.feePayer || this.scope.ownerPubKey,\n                amount: baseIn ? amountIn : 0,\n              }\n            : undefined,\n        associatedOnly: mintAUseSOLBalance ? false : associatedOnly,\n        checkCreateATAOwner,\n      });\n      ownerTokenAccountA = account!;\n      instructionParams && txBuilder.addInstruction(instructionParams);\n    }\n\n    let ownerTokenAccountB: PublicKey | undefined;\n    if (!ownerTokenAccountB) {\n      const { account, instructionParams } = await this.scope.account.getOrCreateTokenAccount({\n        tokenProgram: poolInfo.mintB.programId,\n        mint: new PublicKey(poolInfo.mintB.address),\n        notUseTokenAccount: mintBUseSOLBalance,\n        owner: this.scope.ownerPubKey,\n        skipCloseAccount: !mintBUseSOLBalance,\n        createInfo:\n          mintBUseSOLBalance || baseIn\n            ? {\n                payer: ownerInfo.feePayer || this.scope.ownerPubKey,\n                amount: baseIn ? 0 : amountIn,\n              }\n            : undefined,\n        associatedOnly: mintBUseSOLBalance ? false : associatedOnly,\n        checkCreateATAOwner,\n      });\n      ownerTokenAccountB = account!;\n      instructionParams && txBuilder.addInstruction(instructionParams);\n    }\n\n    if (!ownerTokenAccountA || !ownerTokenAccountB)\n      this.logAndCreateError(\"user do not have token account\", {\n        tokenA: poolInfo.mintA.symbol || poolInfo.mintA.address,\n        tokenB: poolInfo.mintB.symbol || poolInfo.mintB.address,\n        ownerTokenAccountA,\n        ownerTokenAccountB,\n        mintAUseSOLBalance,\n        mintBUseSOLBalance,\n        associatedOnly,\n      });\n\n    const poolKeys = propPoolKeys ?? (await this.getClmmPoolKeys(poolInfo.id));\n    txBuilder.addInstruction(\n      ClmmInstrument.makeSwapBaseInInstructions({\n        poolInfo,\n        poolKeys,\n        observationId,\n        ownerInfo: {\n          wallet: this.scope.ownerPubKey,\n          tokenAccountA: ownerTokenAccountA!,\n          tokenAccountB: ownerTokenAccountB!,\n        },\n        inputMint: new PublicKey(inputMint),\n        amountIn,\n        amountOutMin,\n        sqrtPriceLimitX64,\n        remainingAccounts,\n      }),\n    );\n\n    return txBuilder.versionBuild({ txVersion }) as Promise<MakeTxData<T>>;\n  }\n\n  public async harvestAllRewards<T extends TxVersion = TxVersion.LEGACY>({\n    allPoolInfo,\n    allPositions,\n    ownerInfo,\n    associatedOnly = true,\n    checkCreateATAOwner = false,\n    programId,\n    txVersion,\n    computeBudgetConfig,\n  }: HarvestAllRewardsParams<T>): Promise<MakeMultiTxData<T>> {\n    const ownerMintToAccount: { [mint: string]: PublicKey } = {};\n    for (const item of this.scope.account.tokenAccountRawInfos) {\n      if (associatedOnly) {\n        const ata = getATAAddress(this.scope.ownerPubKey, item.accountInfo.mint, programId).publicKey;\n        if (ata.equals(item.pubkey)) ownerMintToAccount[item.accountInfo.mint.toString()] = item.pubkey;\n      } else {\n        ownerMintToAccount[item.accountInfo.mint.toString()] = item.pubkey;\n      }\n    }\n    const txBuilder = this.createTxBuilder();\n    for (const itemInfo of Object.values(allPoolInfo)) {\n      if (allPositions[itemInfo.id] === undefined) continue;\n      if (\n        !allPositions[itemInfo.id].find(\n          (i) => !i.liquidity.isZero() || i.rewardInfos.find((ii) => !ii.rewardAmountOwed.isZero()),\n        )\n      )\n        continue;\n\n      const poolInfo = itemInfo;\n      const mintAUseSOLBalance = ownerInfo.useSOLBalance && poolInfo.mintA.address === WSOLMint.toString();\n      const mintBUseSOLBalance = ownerInfo.useSOLBalance && poolInfo.mintB.address === WSOLMint.toString();\n\n      let ownerTokenAccountA = ownerMintToAccount[poolInfo.mintA.address];\n      if (!ownerTokenAccountA) {\n        const { account, instructionParams } = await this.scope.account.getOrCreateTokenAccount({\n          tokenProgram: poolInfo.mintA.programId,\n          mint: new PublicKey(poolInfo.mintA.address),\n          notUseTokenAccount: mintAUseSOLBalance,\n          owner: this.scope.ownerPubKey,\n          skipCloseAccount: !mintAUseSOLBalance,\n          createInfo: {\n            payer: ownerInfo.feePayer || this.scope.ownerPubKey,\n            amount: 0,\n          },\n          associatedOnly: mintAUseSOLBalance ? false : associatedOnly,\n          checkCreateATAOwner,\n        });\n        ownerTokenAccountA = account!;\n        instructionParams && txBuilder.addInstruction(instructionParams);\n      }\n\n      let ownerTokenAccountB = ownerMintToAccount[poolInfo.mintB.address];\n      if (!ownerTokenAccountB) {\n        const { account, instructionParams } = await this.scope.account.getOrCreateTokenAccount({\n          tokenProgram: poolInfo.mintB.programId,\n          mint: new PublicKey(poolInfo.mintB.address),\n          notUseTokenAccount: mintBUseSOLBalance,\n          owner: this.scope.ownerPubKey,\n          skipCloseAccount: !mintBUseSOLBalance,\n          createInfo: {\n            payer: ownerInfo.feePayer || this.scope.ownerPubKey,\n            amount: 0,\n          },\n          associatedOnly: mintBUseSOLBalance ? false : associatedOnly,\n          checkCreateATAOwner,\n        });\n        ownerTokenAccountB = account!;\n        instructionParams && txBuilder.addInstruction(instructionParams);\n      }\n\n      ownerMintToAccount[poolInfo.mintA.address] = ownerTokenAccountA;\n      ownerMintToAccount[poolInfo.mintB.address] = ownerTokenAccountB;\n\n      const rewardAccounts: PublicKey[] = [];\n      for (const itemReward of poolInfo.rewardDefaultInfos) {\n        const rewardUseSOLBalance = ownerInfo.useSOLBalance && itemReward.mint.address === WSOLMint.toString();\n        let ownerRewardAccount = ownerMintToAccount[itemReward.mint.address];\n        if (!ownerRewardAccount) {\n          const { account, instructionParams } = await this.scope.account.getOrCreateTokenAccount({\n            tokenProgram: new PublicKey(itemReward.mint.programId),\n            mint: new PublicKey(itemReward.mint.address),\n            notUseTokenAccount: rewardUseSOLBalance,\n            owner: this.scope.ownerPubKey,\n            skipCloseAccount: !rewardUseSOLBalance,\n            createInfo: {\n              payer: ownerInfo.feePayer || this.scope.ownerPubKey,\n              amount: 0,\n            },\n            associatedOnly: rewardUseSOLBalance ? false : associatedOnly,\n          });\n          ownerRewardAccount = account!;\n          instructionParams && txBuilder.addInstruction(instructionParams);\n        }\n\n        ownerMintToAccount[itemReward.mint.address] = ownerRewardAccount;\n        rewardAccounts.push(ownerRewardAccount!);\n      }\n\n      const poolKeys = await this.getClmmPoolKeys(poolInfo.id);\n\n      for (const itemPosition of allPositions[itemInfo.id]) {\n        const insData = ClmmInstrument.decreaseLiquidityInstructions({\n          poolInfo,\n          poolKeys,\n          ownerPosition: itemPosition,\n          ownerInfo: {\n            wallet: this.scope.ownerPubKey,\n            tokenAccountA: ownerTokenAccountA,\n            tokenAccountB: ownerTokenAccountB,\n            rewardAccounts,\n          },\n          liquidity: new BN(0),\n          amountMinA: new BN(0),\n          amountMinB: new BN(0),\n        });\n        txBuilder.addInstruction(insData);\n      }\n    }\n\n    if (txVersion === TxVersion.V0)\n      return txBuilder.sizeCheckBuildV0({ computeBudgetConfig }) as Promise<MakeMultiTxData<T>>;\n    return txBuilder.sizeCheckBuild({ computeBudgetConfig }) as Promise<MakeMultiTxData<T>>;\n  }\n\n  public async getWhiteListMint({ programId }: { programId: PublicKey }): Promise<PublicKey[]> {\n    const accountInfo = await this.scope.connection.getAccountInfo(getPdaOperationAccount(programId).publicKey);\n    if (!accountInfo) return [];\n    const whitelistMintsInfo = OperationLayout.decode(accountInfo.data);\n    return whitelistMintsInfo.whitelistMints.filter((i) => !i.equals(PublicKey.default));\n  }\n\n  public async getOwnerPositionInfo({\n    programId,\n  }: {\n    programId: string | PublicKey;\n  }): Promise<ReturnType<typeof PositionInfoLayout.decode>[]> {\n    await this.scope.account.fetchWalletTokenAccounts();\n    const balanceMints = this.scope.account.tokenAccountRawInfos.filter((acc) => acc.accountInfo.amount.eq(new BN(1)));\n    const allPositionKey = balanceMints.map(\n      (acc) => getPdaPersonalPositionAddress(new PublicKey(programId), acc.accountInfo.mint).publicKey,\n    );\n\n    const accountInfo = await this.scope.connection.getMultipleAccountsInfo(allPositionKey);\n    const allPosition: ReturnType<typeof PositionInfoLayout.decode>[] = [];\n    accountInfo.forEach((positionRes) => {\n      if (!positionRes) return;\n      const position = PositionInfoLayout.decode(positionRes.data);\n      allPosition.push(position);\n    });\n\n    return allPosition;\n  }\n\n  public async getRpcClmmPoolInfo({ poolId }: { poolId: string | PublicKey }): Promise<ClmmRpcData> {\n    return (await this.getRpcClmmPoolInfos({ poolIds: [poolId] }))[String(poolId)];\n  }\n\n  public async getRpcClmmPoolInfos({\n    poolIds,\n    config,\n  }: {\n    poolIds: (string | PublicKey)[];\n    config?: { batchRequest?: boolean; chunkCount?: number };\n  }): Promise<{\n    [poolId: string]: ClmmRpcData;\n  }> {\n    const accounts = await getMultipleAccountsInfoWithCustomFlags(\n      this.scope.connection,\n      poolIds.map((i) => ({ pubkey: new PublicKey(i) })),\n      config,\n    );\n    const returnData: {\n      [poolId: string]: ClmmRpcData;\n    } = {};\n    for (let i = 0; i < poolIds.length; i++) {\n      const item = accounts[i];\n      if (item === null || !item.accountInfo) throw Error(\"fetch pool info error: \" + String(poolIds[i]));\n      const rpc = PoolInfoLayout.decode(item.accountInfo.data);\n      const currentPrice = SqrtPriceMath.sqrtPriceX64ToPrice(\n        rpc.sqrtPriceX64,\n        rpc.mintDecimalsA,\n        rpc.mintDecimalsB,\n      ).toNumber();\n\n      returnData[String(poolIds[i])] = {\n        ...rpc,\n        currentPrice,\n        programId: item.accountInfo.owner,\n      };\n    }\n    return returnData;\n  }\n\n  public async getComputeClmmPoolInfos({\n    clmmPoolsRpcInfo,\n    mintInfos,\n  }: {\n    clmmPoolsRpcInfo: Record<\n      string,\n      ReturnType<typeof PoolInfoLayout.decode> & { currentPrice: number; programId: PublicKey }\n    >;\n    mintInfos: ReturnTypeFetchMultipleMintInfos;\n  }): Promise<{\n    computeClmmPoolInfo: Record<string, ComputeClmmPoolInfo>;\n    computePoolTickData: ReturnTypeFetchMultiplePoolTickArrays;\n  }> {\n    const configSet = new Set(Object.keys(clmmPoolsRpcInfo).map((p) => clmmPoolsRpcInfo[p].ammConfig.toBase58()));\n    const res = await getMultipleAccountsInfoWithCustomFlags(\n      this.scope.connection,\n      Array.from(configSet).map((s) => ({ pubkey: new PublicKey(s) })),\n    );\n    const clmmConfigs: Record<string, ReturnType<typeof ClmmConfigLayout.decode>> = {};\n    res.forEach((acc) => {\n      if (!acc.accountInfo) return;\n      clmmConfigs[acc.pubkey.toBase58()] = ClmmConfigLayout.decode(acc.accountInfo.data);\n    });\n    const computeClmmPoolInfo = await PoolUtils.fetchComputeMultipleClmmInfo({\n      connection: this.scope.connection,\n      rpcDataMap: clmmPoolsRpcInfo,\n      poolList: Object.keys(clmmPoolsRpcInfo).map((poolId) => {\n        const [mintA, mintB] = [clmmPoolsRpcInfo[poolId].mintA.toBase58(), clmmPoolsRpcInfo[poolId].mintB.toBase58()];\n        return {\n          id: poolId,\n          programId: clmmPoolsRpcInfo[poolId].programId.toBase58(),\n          mintA: toApiV3Token({\n            address: mintA,\n            decimals: clmmPoolsRpcInfo[poolId].mintDecimalsA,\n            programId: mintInfos[mintA].programId.toBase58() || TOKEN_PROGRAM_ID.toBase58(),\n            extensions: {\n              feeConfig: mintInfos[mintA]?.feeConfig ? toFeeConfig(mintInfos[mintA]?.feeConfig) : undefined,\n            },\n          }),\n          mintB: toApiV3Token({\n            address: mintB,\n            decimals: clmmPoolsRpcInfo[poolId].mintDecimalsB,\n            programId: mintInfos[mintB].programId.toBase58() || TOKEN_PROGRAM_ID.toBase58(),\n            extensions: {\n              feeConfig: mintInfos[mintB]?.feeConfig ? toFeeConfig(mintInfos[mintB]?.feeConfig) : undefined,\n            },\n          }),\n          price: clmmPoolsRpcInfo[poolId].currentPrice,\n          config: {\n            ...clmmConfigs[clmmPoolsRpcInfo[poolId].ammConfig.toBase58()],\n            id: clmmPoolsRpcInfo[poolId].ammConfig.toBase58(),\n\n            fundFeeRate: 0,\n            description: \"\",\n            defaultRange: 0,\n            defaultRangePoint: [],\n          },\n        };\n      }),\n    });\n\n    const computePoolTickData = await PoolUtils.fetchMultiplePoolTickArrays({\n      connection: this.scope.connection,\n      poolKeys: Object.values(computeClmmPoolInfo),\n    });\n\n    return {\n      computeClmmPoolInfo,\n      computePoolTickData,\n    };\n  }\n\n  public async getPoolInfoFromRpc(poolId: string): Promise<{\n    poolInfo: ApiV3PoolInfoConcentratedItem;\n    poolKeys: ClmmKeys;\n    computePoolInfo: ComputeClmmPoolInfo;\n    tickData: ReturnTypeFetchMultiplePoolTickArrays;\n  }> {\n    const rpcData = await this.getRpcClmmPoolInfo({ poolId });\n\n    const mintSet = new Set([rpcData.mintA.toBase58(), rpcData.mintB.toBase58()]);\n\n    const mintInfos = await fetchMultipleMintInfos({\n      connection: this.scope.connection,\n      mints: Array.from(mintSet).map((m) => new PublicKey(m)),\n    });\n\n    const { computeClmmPoolInfo, computePoolTickData } = await this.scope.clmm.getComputeClmmPoolInfos({\n      clmmPoolsRpcInfo: { [poolId]: rpcData },\n      mintInfos,\n    });\n    const vaultData = await getMultipleAccountsInfoWithCustomFlags(this.scope.connection, [\n      { pubkey: rpcData.vaultA },\n      { pubkey: rpcData.vaultB },\n    ]);\n\n    const poolInfo = clmmComputeInfoToApiInfo(computeClmmPoolInfo[poolId]);\n\n    if (!vaultData[0].accountInfo || !vaultData[1].accountInfo) throw new Error(\"pool vault data not found\");\n    poolInfo.mintAmountA = Number(AccountLayout.decode(vaultData[0].accountInfo.data).amount.toString());\n    poolInfo.mintAmountB = Number(AccountLayout.decode(vaultData[1].accountInfo?.data).amount.toString());\n\n    const poolKeys: ClmmKeys = {\n      ...computeClmmPoolInfo[poolId],\n      id: poolId,\n      programId: rpcData.programId.toBase58(),\n      openTime: rpcData.startTime.toString(),\n      vault: {\n        A: rpcData.vaultA.toBase58(),\n        B: rpcData.vaultB.toBase58(),\n      },\n      rewardInfos: [],\n      config: poolInfo.config,\n    };\n    return { poolInfo, poolKeys, computePoolInfo: computeClmmPoolInfo[poolId], tickData: computePoolTickData };\n  }\n}\n","import { PublicKey } from \"@solana/web3.js\";\nimport { NATIVE_MINT, TOKEN_PROGRAM_ID, AccountLayout } from \"@solana/spl-token\";\nimport { ApiV3PoolInfoConcentratedItem, ApiV3PoolInfoStandardItemCpmm, CpmmKeys } from \"@/api/type\";\nimport { Percent } from \"@/module\";\nimport { BN_ZERO } from \"@/common/bignumber\";\nimport { getATAAddress } from \"@/common/pda\";\nimport { WSOLMint } from \"@/common/pubKey\";\nimport { InstructionType, TxVersion } from \"@/common/txTool/txType\";\nimport { MakeTxData } from \"@/common/txTool/txTool\";\nimport { CurveCalculator } from \"./curve/calculator\";\n\nimport ModuleBase, { ModuleBaseProps } from \"../moduleBase\";\nimport {\n  CreateCpmmPoolParam,\n  CreateCpmmPoolAddress,\n  AddCpmmLiquidityParams,\n  WithdrawCpmmLiquidityParams,\n  CpmmSwapParams,\n  ComputePairAmountParams,\n  CpmmRpcData,\n  CpmmComputeData,\n} from \"./type\";\nimport { getCreatePoolKeys, getPdaObservationId } from \"./pda\";\nimport {\n  makeCreateCpmmPoolInInstruction,\n  makeDepositCpmmInInstruction,\n  makeWithdrawCpmmInInstruction,\n  makeSwapCpmmBaseInInInstruction,\n  makeSwapCpmmBaseOutInInstruction,\n} from \"./instruction\";\nimport BN from \"bn.js\";\nimport { CpmmPoolInfoLayout, CpmmConfigInfoLayout } from \"./layout\";\nimport Decimal from \"decimal.js\";\nimport { fetchMultipleMintInfos, getMultipleAccountsInfoWithCustomFlags, getTransferAmountFeeV2 } from \"@/common\";\nimport { GetTransferAmountFee, ReturnTypeFetchMultipleMintInfos } from \"@/raydium/type\";\nimport { toApiV3Token, toFeeConfig } from \"../token\";\nimport { getPdaPoolAuthority } from \"./pda\";\n\nexport default class CpmmModule extends ModuleBase {\n  constructor(params: ModuleBaseProps) {\n    super(params);\n  }\n\n  public async load(): Promise<void> {\n    this.checkDisabled();\n  }\n\n  public async getCpmmPoolKeys(poolId: string): Promise<CpmmKeys> {\n    return ((await this.scope.api.fetchPoolKeysById({ idList: [poolId] })) as CpmmKeys[])[0];\n  }\n\n  public async getRpcPoolInfo(poolId: string, fetchConfigInfo?: boolean): Promise<CpmmRpcData> {\n    return (await this.getRpcPoolInfos([poolId], fetchConfigInfo))[poolId];\n  }\n\n  public async getRpcPoolInfos(\n    poolIds: string[],\n    fetchConfigInfo?: boolean,\n  ): Promise<{\n    [poolId: string]: CpmmRpcData;\n  }> {\n    const accounts = await getMultipleAccountsInfoWithCustomFlags(\n      this.scope.connection,\n      poolIds.map((i) => ({ pubkey: new PublicKey(i) })),\n    );\n    const poolInfos: { [poolId: string]: ReturnType<typeof CpmmPoolInfoLayout.decode> & { programId: PublicKey } } = {};\n\n    const needFetchConfigId = new Set<string>();\n    const needFetchVaults: PublicKey[] = [];\n\n    for (let i = 0; i < poolIds.length; i++) {\n      const item = accounts[i];\n      if (item.accountInfo === null) throw Error(\"fetch pool info error: \" + String(poolIds[i]));\n      const rpc = CpmmPoolInfoLayout.decode(item.accountInfo.data);\n      poolInfos[String(poolIds[i])] = {\n        ...rpc,\n        programId: item.accountInfo.owner,\n      };\n      needFetchConfigId.add(String(rpc.configId));\n\n      needFetchVaults.push(rpc.vaultA, rpc.vaultB);\n    }\n\n    const configInfo: { [configId: string]: ReturnType<typeof CpmmConfigInfoLayout.decode> } = {};\n\n    if (fetchConfigInfo) {\n      const configIds = [...needFetchConfigId];\n      const configState = await getMultipleAccountsInfoWithCustomFlags(\n        this.scope.connection,\n        configIds.map((i) => ({ pubkey: new PublicKey(i) })),\n      );\n\n      for (let i = 0; i < configIds.length; i++) {\n        const configItemInfo = configState[i].accountInfo;\n        if (configItemInfo === null) throw Error(\"fetch pool config error: \" + configIds[i]);\n        configInfo[configIds[i]] = CpmmConfigInfoLayout.decode(configItemInfo.data);\n      }\n    }\n\n    const vaultInfo: { [vaultId: string]: BN } = {};\n\n    const vaultAccountInfo = await getMultipleAccountsInfoWithCustomFlags(\n      this.scope.connection,\n      needFetchVaults.map((i) => ({ pubkey: new PublicKey(i) })),\n    );\n\n    for (let i = 0; i < needFetchVaults.length; i++) {\n      const vaultItemInfo = vaultAccountInfo[i].accountInfo;\n      if (vaultItemInfo === null) throw Error(\"fetch vault info error: \" + needFetchVaults[i]);\n\n      vaultInfo[String(needFetchVaults[i])] = new BN(AccountLayout.decode(vaultItemInfo.data).amount.toString());\n    }\n\n    const returnData: { [poolId: string]: CpmmRpcData } = {};\n\n    for (const [id, info] of Object.entries(poolInfos)) {\n      const baseReserve = vaultInfo[info.vaultA.toString()].sub(info.protocolFeesMintA).sub(info.fundFeesMintA);\n      const quoteReserve = vaultInfo[info.vaultB.toString()].sub(info.protocolFeesMintB).sub(info.fundFeesMintB);\n      returnData[id] = {\n        ...info,\n        baseReserve,\n        quoteReserve,\n        vaultAAmount: vaultInfo[info.vaultA.toString()],\n        vaultBAmount: vaultInfo[info.vaultB.toString()],\n        configInfo: configInfo[info.configId.toString()],\n        poolPrice: new Decimal(quoteReserve.toString())\n          .div(new Decimal(10).pow(info.mintDecimalB))\n          .div(new Decimal(baseReserve.toString()).div(new Decimal(10).pow(info.mintDecimalA))),\n      };\n    }\n\n    return returnData;\n  }\n\n  public toComputePoolInfos({\n    pools,\n    mintInfos,\n  }: {\n    pools: Record<string, CpmmRpcData>;\n    mintInfos: ReturnTypeFetchMultipleMintInfos;\n  }): Record<string, CpmmComputeData> {\n    return Object.keys(pools).reduce((acc, cur) => {\n      const pool = pools[cur];\n      const [mintA, mintB] = [pool.mintA.toBase58(), pool.mintB.toBase58()];\n\n      return {\n        ...acc,\n        [cur]: {\n          ...pool,\n          id: new PublicKey(cur),\n          configInfo: pool.configInfo!,\n          version: 7 as const,\n          authority: getPdaPoolAuthority(pool.programId).publicKey,\n          mintA: toApiV3Token({\n            address: mintA,\n            decimals: pool.mintDecimalA,\n            programId: pool.mintProgramA.toBase58(),\n            extensions: {\n              feeConfig: mintInfos[mintA]?.feeConfig ? toFeeConfig(mintInfos[mintA]?.feeConfig) : undefined,\n            },\n          }),\n          mintB: toApiV3Token({\n            address: mintB,\n            decimals: pool.mintDecimalB,\n            programId: pool.mintProgramB.toBase58(),\n            extensions: {\n              feeConfig: mintInfos[mintB]?.feeConfig ? toFeeConfig(mintInfos[mintB]?.feeConfig) : undefined,\n            },\n          }),\n        },\n      };\n    }, {} as Record<string, CpmmComputeData>);\n  }\n\n  public async getPoolInfoFromRpc(poolId: string): Promise<{\n    poolInfo: ApiV3PoolInfoStandardItemCpmm;\n    poolKeys: CpmmKeys;\n    rpcData: CpmmRpcData;\n  }> {\n    const rpcData = await this.getRpcPoolInfo(poolId, true);\n    const mintInfos = await fetchMultipleMintInfos({\n      connection: this.scope.connection,\n      mints: [rpcData.mintA, rpcData.mintB],\n    });\n\n    const mintA = toApiV3Token({\n      address: rpcData.mintA.toBase58(),\n      decimals: rpcData.mintDecimalA,\n      programId: rpcData.mintProgramA.toBase58(),\n      extensions: {\n        feeConfig: mintInfos[rpcData.mintA.toBase58()].feeConfig\n          ? toFeeConfig(mintInfos[rpcData.mintA.toBase58()].feeConfig)\n          : undefined,\n      },\n    });\n    const mintB = toApiV3Token({\n      address: rpcData.mintB.toBase58(),\n      decimals: rpcData.mintDecimalB,\n      programId: rpcData.mintProgramB.toBase58(),\n      extensions: {\n        feeConfig: mintInfos[rpcData.mintB.toBase58()].feeConfig\n          ? toFeeConfig(mintInfos[rpcData.mintB.toBase58()].feeConfig)\n          : undefined,\n      },\n    });\n\n    const lpMint = toApiV3Token({\n      address: rpcData.mintLp.toBase58(),\n      decimals: rpcData.lpDecimals,\n      programId: TOKEN_PROGRAM_ID.toBase58(),\n    });\n\n    const configInfo = {\n      id: rpcData.configId.toBase58(),\n      index: rpcData.configInfo!.index,\n      protocolFeeRate: rpcData.configInfo!.protocolFeeRate.toNumber(),\n      tradeFeeRate: rpcData.configInfo!.tradeFeeRate.toNumber(),\n      fundFeeRate: rpcData.configInfo!.fundFeeRate.toNumber(),\n      createPoolFee: rpcData.configInfo!.createPoolFee.toString(),\n    };\n\n    const mockRewardData = {\n      volume: 0,\n      volumeQuote: 0,\n      volumeFee: 0,\n      apr: 0,\n      feeApr: 0,\n      priceMin: 0,\n      priceMax: 0,\n      rewardApr: [],\n    };\n\n    return {\n      poolInfo: {\n        programId: rpcData.programId.toBase58(),\n        id: poolId,\n        type: \"Standard\",\n        lpMint,\n        lpPrice: 0,\n        lpAmount: rpcData.lpAmount.toNumber(),\n        config: configInfo,\n        mintA,\n        mintB,\n        rewardDefaultInfos: [],\n        rewardDefaultPoolInfos: \"Ecosystem\",\n        price: rpcData.poolPrice.toNumber(),\n        mintAmountA: new Decimal(rpcData.vaultAAmount.toString()).div(10 ** mintA.decimals).toNumber(),\n        mintAmountB: new Decimal(rpcData.vaultBAmount.toString()).div(10 ** mintB.decimals).toNumber(),\n        feeRate: rpcData.configInfo!.tradeFeeRate.toNumber(),\n        openTime: rpcData.openTime.toString(),\n        tvl: 0,\n\n        day: mockRewardData,\n        week: mockRewardData,\n        month: mockRewardData,\n        pooltype: [],\n\n        farmUpcomingCount: 0,\n        farmOngoingCount: 0,\n        farmFinishedCount: 0,\n      },\n      poolKeys: {\n        programId: rpcData.programId.toBase58(),\n        id: poolId,\n        mintA,\n        mintB,\n        openTime: rpcData.openTime.toString(),\n        vault: { A: rpcData.vaultA.toBase58(), B: rpcData.vaultB.toBase58() },\n        authority: getPdaPoolAuthority(rpcData.programId).publicKey.toBase58(),\n        mintLp: lpMint,\n        config: configInfo,\n      },\n      rpcData,\n    };\n  }\n\n  public async createPool<T extends TxVersion>({\n    programId,\n    poolFeeAccount,\n    startTime,\n    ownerInfo,\n    associatedOnly = false,\n    checkCreateATAOwner = false,\n    txVersion,\n    computeBudgetConfig,\n    ...params\n  }: CreateCpmmPoolParam<T>): Promise<MakeTxData<T, { address: CreateCpmmPoolAddress }>> {\n    const payer = ownerInfo.feePayer || this.scope.owner?.publicKey;\n    const isFront = new BN(new PublicKey(params.mintA.address).toBuffer()).lte(\n      new BN(new PublicKey(params.mintB.address).toBuffer()),\n    );\n\n    const [mintA, mintB] = isFront ? [params.mintA, params.mintB] : [params.mintB, params.mintA];\n    const [mintAAmount, mintBAmount] = isFront\n      ? [params.mintAAmount, params.mintBAmount]\n      : [params.mintBAmount, params.mintAAmount];\n\n    const mintAUseSOLBalance = ownerInfo.useSOLBalance && mintA.address === NATIVE_MINT.toBase58();\n    const mintBUseSOLBalance = ownerInfo.useSOLBalance && mintB.address === NATIVE_MINT.toBase58();\n    const [mintAPubkey, mintBPubkey] = [new PublicKey(mintA.address), new PublicKey(mintB.address)];\n    const txBuilder = this.createTxBuilder();\n\n    const { account: userVaultA, instructionParams: userVaultAInstruction } =\n      await this.scope.account.getOrCreateTokenAccount({\n        mint: mintAPubkey,\n        tokenProgram: mintA.programId,\n        owner: this.scope.ownerPubKey,\n        createInfo: mintAUseSOLBalance\n          ? {\n            payer: payer!,\n            amount: mintAAmount,\n          }\n          : undefined,\n        notUseTokenAccount: mintAUseSOLBalance,\n        skipCloseAccount: !mintAUseSOLBalance,\n        associatedOnly: mintAUseSOLBalance ? false : associatedOnly,\n        checkCreateATAOwner,\n      });\n    txBuilder.addInstruction(userVaultAInstruction || {});\n    const { account: userVaultB, instructionParams: userVaultBInstruction } =\n      await this.scope.account.getOrCreateTokenAccount({\n        mint: new PublicKey(mintB.address),\n        tokenProgram: mintB.programId,\n        owner: this.scope.ownerPubKey,\n        createInfo: mintBUseSOLBalance\n          ? {\n            payer: payer!,\n            amount: mintBAmount,\n          }\n          : undefined,\n\n        notUseTokenAccount: mintBUseSOLBalance,\n        skipCloseAccount: !mintBUseSOLBalance,\n        associatedOnly: mintBUseSOLBalance ? false : associatedOnly,\n        checkCreateATAOwner,\n      });\n    txBuilder.addInstruction(userVaultBInstruction || {});\n\n    if (userVaultA === undefined || userVaultB === undefined) throw Error(\"you don't has some token account\");\n\n    const poolKeys = getCreatePoolKeys({\n      programId,\n      mintA: mintAPubkey,\n      mintB: mintBPubkey,\n    });\n\n    txBuilder.addInstruction({\n      instructions: [\n        makeCreateCpmmPoolInInstruction(\n          programId,\n          this.scope.ownerPubKey,\n          poolKeys.configId,\n          poolKeys.authority,\n          poolKeys.poolId,\n          mintAPubkey,\n          mintBPubkey,\n          poolKeys.lpMint,\n          userVaultA,\n          userVaultB,\n          getATAAddress(this.scope.ownerPubKey, poolKeys.lpMint).publicKey,\n          poolKeys.vaultA,\n          poolKeys.vaultB,\n          poolFeeAccount,\n          new PublicKey(mintA.programId ?? TOKEN_PROGRAM_ID),\n          new PublicKey(mintB.programId ?? TOKEN_PROGRAM_ID),\n          poolKeys.observationId,\n          mintAAmount,\n          mintBAmount,\n          startTime,\n        ),\n      ],\n      instructionTypes: [InstructionType.CpmmCreatePool],\n    });\n\n    txBuilder.addCustomComputeBudget(computeBudgetConfig);\n\n    return txBuilder.versionBuild({\n      txVersion,\n      extInfo: {\n        address: { ...poolKeys, mintA, mintB, programId, poolFeeAccount },\n      },\n    }) as Promise<MakeTxData<T, { address: CreateCpmmPoolAddress }>>;\n  }\n\n  public async addLiquidity<T extends TxVersion>(params: AddCpmmLiquidityParams<T>): Promise<MakeTxData<T>> {\n    const {\n      poolInfo,\n      poolKeys: propPoolKeys,\n      inputAmount,\n      baseIn,\n      slippage,\n      computeResult,\n      computeBudgetConfig,\n      config,\n      txVersion,\n    } = params;\n\n    if (this.scope.availability.addStandardPosition === false)\n      this.logAndCreateError(\"add liquidity feature disabled in your region\");\n\n    if (inputAmount.isZero())\n      this.logAndCreateError(\"amounts must greater than zero\", \"amountInA\", {\n        amountInA: inputAmount.toString(),\n      });\n    const { account } = this.scope;\n    const { bypassAssociatedCheck, checkCreateATAOwner } = {\n      // default\n      ...{ bypassAssociatedCheck: false, checkCreateATAOwner: false },\n      // custom\n      ...config,\n    };\n    const rpcPoolData = computeResult ? undefined : await this.getRpcPoolInfo(poolInfo.id);\n\n    const {\n      liquidity,\n      inputAmountFee,\n      anotherAmount: _anotherAmount,\n    } = computeResult ||\n      this.computePairAmount({\n        poolInfo: {\n          ...poolInfo,\n          lpAmount: new Decimal(rpcPoolData!.lpAmount.toString()).div(10 ** poolInfo.lpMint.decimals).toNumber(),\n        },\n        baseReserve: rpcPoolData!.baseReserve,\n        quoteReserve: rpcPoolData!.quoteReserve,\n        slippage: new Percent(0),\n        baseIn,\n        epochInfo: await this.scope.fetchEpochInfo(),\n        amount: new Decimal(inputAmount.toString()).div(\n          10 ** (baseIn ? poolInfo.mintA.decimals : poolInfo.mintB.decimals),\n        ),\n      });\n\n    const anotherAmount = _anotherAmount.amount;\n    const mintAUseSOLBalance = poolInfo.mintA.address === NATIVE_MINT.toString();\n    const mintBUseSOLBalance = poolInfo.mintB.address === NATIVE_MINT.toString();\n\n    const txBuilder = this.createTxBuilder();\n    const [mintA, mintB] = [new PublicKey(poolInfo.mintA.address), new PublicKey(poolInfo.mintB.address)];\n\n    const { account: tokenAccountA, instructionParams: _tokenAccountAInstruction } =\n      await this.scope.account.getOrCreateTokenAccount({\n        tokenProgram: poolInfo.mintA.programId,\n        mint: new PublicKey(poolInfo.mintA.address),\n        owner: this.scope.ownerPubKey,\n\n        createInfo:\n          mintAUseSOLBalance || (baseIn ? inputAmount : anotherAmount).isZero()\n            ? {\n              payer: this.scope.ownerPubKey,\n              amount: baseIn ? inputAmount : anotherAmount,\n            }\n            : undefined,\n        skipCloseAccount: !mintAUseSOLBalance,\n        notUseTokenAccount: mintAUseSOLBalance,\n        associatedOnly: false,\n        checkCreateATAOwner,\n      });\n\n    txBuilder.addInstruction(_tokenAccountAInstruction || {});\n\n    const { account: tokenAccountB, instructionParams: _tokenAccountBInstruction } =\n      await this.scope.account.getOrCreateTokenAccount({\n        tokenProgram: poolInfo.mintB.programId,\n        mint: new PublicKey(poolInfo.mintB.address),\n        owner: this.scope.ownerPubKey,\n\n        createInfo:\n          mintBUseSOLBalance || (baseIn ? anotherAmount : inputAmount).isZero()\n            ? {\n              payer: this.scope.ownerPubKey,\n              amount: baseIn ? anotherAmount : inputAmount,\n            }\n            : undefined,\n        skipCloseAccount: !mintBUseSOLBalance,\n        notUseTokenAccount: mintBUseSOLBalance,\n        associatedOnly: false,\n        checkCreateATAOwner,\n      });\n\n    txBuilder.addInstruction(_tokenAccountBInstruction || {});\n\n    if (!tokenAccountA && !tokenAccountB)\n      this.logAndCreateError(\"cannot found target token accounts\", \"tokenAccounts\", account.tokenAccounts);\n    const lpTokenAccount = await account.getCreatedTokenAccount({\n      mint: new PublicKey(poolInfo.lpMint.address),\n    });\n    const { tokenAccount: _lpTokenAccount, ...lpInstruction } = await account.handleTokenAccount({\n      side: \"out\",\n      amount: 0,\n      mint: new PublicKey(poolInfo.lpMint.address),\n      tokenAccount: lpTokenAccount,\n      bypassAssociatedCheck,\n      checkCreateATAOwner,\n    });\n    txBuilder.addInstruction(lpInstruction);\n    const poolKeys = propPoolKeys ?? (await this.getCpmmPoolKeys(poolInfo.id));\n    const _slippage = new Percent(new BN(1)).sub(slippage);\n\n    txBuilder.addInstruction({\n      instructions: [\n        makeDepositCpmmInInstruction(\n          new PublicKey(poolInfo.programId),\n          this.scope.ownerPubKey,\n          new PublicKey(poolKeys.authority),\n          new PublicKey(poolInfo.id),\n          _lpTokenAccount!,\n          tokenAccountA!,\n          tokenAccountB!,\n          new PublicKey(poolKeys.vault.A),\n          new PublicKey(poolKeys.vault.B),\n          mintA,\n          mintB,\n          new PublicKey(poolInfo.lpMint.address),\n\n          computeResult ? computeResult?.liquidity : _slippage.mul(liquidity).quotient,\n          baseIn ? inputAmountFee.amount : anotherAmount,\n          baseIn ? anotherAmount : inputAmountFee.amount,\n        ),\n      ],\n      instructionTypes: [InstructionType.CpmmAddLiquidity],\n      lookupTableAddress: poolKeys.lookupTableAccount ? [poolKeys.lookupTableAccount] : [],\n    });\n    txBuilder.addCustomComputeBudget(computeBudgetConfig);\n    return txBuilder.versionBuild({ txVersion }) as Promise<MakeTxData<T>>;\n  }\n\n  public async withdrawLiquidity<T extends TxVersion>(params: WithdrawCpmmLiquidityParams<T>): Promise<MakeTxData<T>> {\n    const { poolInfo, poolKeys: propPoolKeys, lpAmount, slippage, computeBudgetConfig, txVersion } = params;\n\n    if (this.scope.availability.addStandardPosition === false)\n      this.logAndCreateError(\"add liquidity feature disabled in your region\");\n\n    const _slippage = new Percent(new BN(1)).sub(slippage);\n\n    const rpcPoolData = await this.getRpcPoolInfo(poolInfo.id);\n    const [amountMintA, amountMintB] = [\n      _slippage.mul(lpAmount.mul(rpcPoolData.baseReserve).div(rpcPoolData.lpAmount)).quotient,\n      _slippage.mul(lpAmount.mul(rpcPoolData.quoteReserve).div(rpcPoolData.lpAmount)).quotient,\n    ];\n\n    const epochInfo = await this.scope.fetchEpochInfo();\n    const [mintAAmountFee, mintBAmountFee] = [\n      getTransferAmountFeeV2(amountMintA, poolInfo.mintA.extensions.feeConfig, epochInfo, false),\n      getTransferAmountFeeV2(amountMintB, poolInfo.mintB.extensions.feeConfig, epochInfo, false),\n    ];\n\n    const { account } = this.scope;\n    const txBuilder = this.createTxBuilder();\n    const [mintA, mintB] = [new PublicKey(poolInfo.mintA.address), new PublicKey(poolInfo.mintB.address)];\n\n    const mintAUseSOLBalance = mintA.equals(WSOLMint);\n    const mintBUseSOLBalance = mintB.equals(WSOLMint);\n\n    let tokenAccountA: PublicKey | undefined = undefined;\n    let tokenAccountB: PublicKey | undefined = undefined;\n    const { account: _ownerTokenAccountA, instructionParams: accountAInstructions } =\n      await this.scope.account.getOrCreateTokenAccount({\n        tokenProgram: poolInfo.mintA.programId,\n        mint: new PublicKey(poolInfo.mintA.address),\n        notUseTokenAccount: mintAUseSOLBalance,\n        owner: this.scope.ownerPubKey,\n        createInfo: {\n          payer: this.scope.ownerPubKey,\n          amount: 0,\n        },\n        skipCloseAccount: !mintAUseSOLBalance,\n        associatedOnly: mintAUseSOLBalance ? false : true,\n        checkCreateATAOwner: false,\n      });\n    tokenAccountA = _ownerTokenAccountA;\n    accountAInstructions && txBuilder.addInstruction(accountAInstructions);\n\n    const { account: _ownerTokenAccountB, instructionParams: accountBInstructions } =\n      await this.scope.account.getOrCreateTokenAccount({\n        tokenProgram: poolInfo.mintB.programId,\n        mint: new PublicKey(poolInfo.mintB.address),\n        notUseTokenAccount: mintBUseSOLBalance,\n        owner: this.scope.ownerPubKey,\n        createInfo: {\n          payer: this.scope.ownerPubKey,\n          amount: 0,\n        },\n        skipCloseAccount: !mintBUseSOLBalance,\n        associatedOnly: mintBUseSOLBalance ? false : true,\n        checkCreateATAOwner: false,\n      });\n    tokenAccountB = _ownerTokenAccountB;\n    accountBInstructions && txBuilder.addInstruction(accountBInstructions);\n\n    if (!tokenAccountA || !tokenAccountB)\n      this.logAndCreateError(\"cannot found target token accounts\", \"tokenAccounts\", account.tokenAccounts);\n\n    const lpTokenAccount = await account.getCreatedTokenAccount({\n      mint: new PublicKey(poolInfo.lpMint.address),\n    });\n\n    if (!lpTokenAccount)\n      this.logAndCreateError(\"cannot found lp token account\", \"tokenAccounts\", account.tokenAccounts);\n    const poolKeys = propPoolKeys ?? (await this.getCpmmPoolKeys(poolInfo.id));\n    txBuilder.addInstruction({\n      instructions: [\n        makeWithdrawCpmmInInstruction(\n          new PublicKey(poolInfo.programId),\n          this.scope.ownerPubKey,\n          new PublicKey(poolKeys.authority),\n          new PublicKey(poolInfo.id),\n          lpTokenAccount!,\n          tokenAccountA!,\n          tokenAccountB!,\n          new PublicKey(poolKeys.vault.A),\n          new PublicKey(poolKeys.vault.B),\n          mintA,\n          mintB,\n          new PublicKey(poolInfo.lpMint.address),\n\n          lpAmount,\n          amountMintA.sub(mintAAmountFee.fee ?? new BN(0)),\n          amountMintB.sub(mintBAmountFee.fee ?? new BN(0)),\n        ),\n      ],\n      instructionTypes: [InstructionType.CpmmWithdrawLiquidity],\n      lookupTableAddress: poolKeys.lookupTableAccount ? [poolKeys.lookupTableAccount] : [],\n    });\n    txBuilder.addCustomComputeBudget(computeBudgetConfig);\n    return txBuilder.versionBuild({ txVersion }) as Promise<MakeTxData<T>>;\n  }\n\n  public async swap<T extends TxVersion>(params: CpmmSwapParams): Promise<MakeTxData<T>> {\n    const {\n      poolInfo,\n      poolKeys: propPoolKeys,\n      baseIn,\n      swapResult,\n      slippage = 0,\n      config,\n      computeBudgetConfig,\n      txVersion,\n    } = params;\n\n    const { bypassAssociatedCheck, checkCreateATAOwner, associatedOnly } = {\n      // default\n      ...{ bypassAssociatedCheck: false, checkCreateATAOwner: false, associatedOnly: true },\n      // custom\n      ...config,\n    };\n\n    const txBuilder = this.createTxBuilder();\n\n    const [mintA, mintB] = [new PublicKey(poolInfo.mintA.address), new PublicKey(poolInfo.mintB.address)];\n    swapResult.destinationAmountSwapped = swapResult.destinationAmountSwapped\n      .mul(new BN((1 - slippage) * 10000))\n      .div(new BN(10000));\n\n    const mintAUseSOLBalance = poolInfo.mintA.address === WSOLMint.toBase58();\n    const mintBUseSOLBalance = poolInfo.mintB.address === WSOLMint.toBase58();\n    const { account: mintATokenAcc, instructionParams: mintATokenAccInstruction } =\n      await this.scope.account.getOrCreateTokenAccount({\n        mint: mintA,\n        tokenProgram: new PublicKey(poolInfo.mintA.programId ?? TOKEN_PROGRAM_ID),\n        owner: this.scope.ownerPubKey,\n        createInfo:\n          mintAUseSOLBalance || !baseIn\n            ? {\n              payer: this.scope.ownerPubKey,\n              amount: baseIn ? swapResult.sourceAmountSwapped : 0,\n            }\n            : undefined,\n        notUseTokenAccount: mintAUseSOLBalance,\n        skipCloseAccount: !mintAUseSOLBalance,\n        associatedOnly: mintAUseSOLBalance ? false : associatedOnly,\n        checkCreateATAOwner,\n      });\n    mintATokenAccInstruction && txBuilder.addInstruction(mintATokenAccInstruction);\n\n    const { account: mintBTokenAcc, instructionParams: mintBTokenAccInstruction } =\n      await this.scope.account.getOrCreateTokenAccount({\n        mint: mintB,\n        tokenProgram: new PublicKey(poolInfo.mintB.programId ?? TOKEN_PROGRAM_ID),\n        owner: this.scope.ownerPubKey,\n        createInfo:\n          mintBUseSOLBalance || baseIn\n            ? {\n              payer: this.scope.ownerPubKey,\n              amount: baseIn ? 0 : swapResult.sourceAmountSwapped,\n            }\n            : undefined,\n        notUseTokenAccount: mintBUseSOLBalance,\n        skipCloseAccount: !mintBUseSOLBalance,\n        associatedOnly: mintBUseSOLBalance ? false : associatedOnly,\n        checkCreateATAOwner,\n      });\n    mintBTokenAccInstruction && txBuilder.addInstruction(mintBTokenAccInstruction);\n\n    if (!mintATokenAcc || !mintBTokenAcc)\n      this.logAndCreateError(\"user do not have token account\", {\n        mintA: poolInfo.mintA.symbol || poolInfo.mintA.address,\n        mintB: poolInfo.mintB.symbol || poolInfo.mintB.address,\n        mintATokenAcc,\n        mintBTokenAcc,\n        mintAUseSOLBalance,\n        mintBUseSOLBalance,\n        associatedOnly,\n      });\n\n    const poolKeys = propPoolKeys ?? (await this.getCpmmPoolKeys(poolInfo.id));\n\n    txBuilder.addInstruction({\n      instructions: [\n        baseIn\n          ? makeSwapCpmmBaseInInInstruction(\n            new PublicKey(poolInfo.programId),\n            this.scope.ownerPubKey,\n            new PublicKey(poolKeys.authority),\n            new PublicKey(poolKeys.config.id),\n            new PublicKey(poolInfo.id),\n            mintATokenAcc!,\n            mintBTokenAcc!,\n            new PublicKey(poolKeys.vault.A),\n            new PublicKey(poolKeys.vault.B),\n            new PublicKey(poolInfo.mintA.programId ?? TOKEN_PROGRAM_ID),\n            new PublicKey(poolInfo.mintB.programId ?? TOKEN_PROGRAM_ID),\n            mintA,\n            mintB,\n            getPdaObservationId(new PublicKey(poolInfo.programId), new PublicKey(poolInfo.id)).publicKey,\n\n            swapResult.sourceAmountSwapped,\n            swapResult.destinationAmountSwapped,\n          )\n          : makeSwapCpmmBaseOutInInstruction(\n            new PublicKey(poolInfo.programId),\n            this.scope.ownerPubKey,\n            new PublicKey(poolKeys.authority),\n            new PublicKey(poolKeys.config.id),\n            new PublicKey(poolInfo.id),\n\n            mintBTokenAcc!,\n            mintATokenAcc!,\n\n            new PublicKey(poolKeys.vault.B),\n            new PublicKey(poolKeys.vault.A),\n\n            new PublicKey(poolInfo.mintB.programId ?? TOKEN_PROGRAM_ID),\n            new PublicKey(poolInfo.mintA.programId ?? TOKEN_PROGRAM_ID),\n\n            mintB,\n            mintA,\n\n            getPdaObservationId(new PublicKey(poolInfo.programId), new PublicKey(poolInfo.id)).publicKey,\n\n            swapResult.sourceAmountSwapped,\n            swapResult.destinationAmountSwapped,\n          ),\n      ],\n      instructionTypes: [baseIn ? InstructionType.CpmmSwapBaseIn : InstructionType.CpmmSwapBaseOut],\n    });\n\n    txBuilder.addCustomComputeBudget(computeBudgetConfig);\n\n    return txBuilder.versionBuild({ txVersion }) as Promise<MakeTxData<T>>;\n  }\n\n  public computeSwapAmount({\n    pool,\n    amountIn,\n    outputMint,\n    slippage,\n  }: {\n    pool: CpmmComputeData;\n    amountIn: BN;\n    outputMint: string | PublicKey;\n    slippage: number;\n  }): {\n    allTrade: boolean;\n    amountIn: BN;\n    amountOut: BN;\n    minAmountOut: BN;\n    fee: BN;\n    executionPrice: Decimal;\n    priceImpact: any;\n  } {\n    const isBaseIn = outputMint.toString() === pool.mintB.address;\n\n    const swapResult = CurveCalculator.swap(\n      amountIn,\n      isBaseIn ? pool.baseReserve : pool.quoteReserve,\n      isBaseIn ? pool.quoteReserve : pool.baseReserve,\n      pool.configInfo.tradeFeeRate,\n    );\n\n    const executionPrice = new Decimal(swapResult.destinationAmountSwapped.toString()).div(\n      swapResult.sourceAmountSwapped.toString(),\n    );\n\n    const minAmountOut = swapResult.destinationAmountSwapped.mul(new BN((1 - slippage) * 10000)).div(new BN(10000));\n\n    return {\n      allTrade: swapResult.sourceAmountSwapped.eq(amountIn),\n      amountIn,\n      amountOut: swapResult.destinationAmountSwapped,\n      minAmountOut,\n      executionPrice,\n      fee: swapResult.tradeFee,\n      priceImpact: pool.poolPrice.sub(executionPrice).div(pool.poolPrice),\n    };\n  }\n\n  public computePairAmount({\n    poolInfo,\n    baseReserve,\n    quoteReserve,\n    amount,\n    slippage,\n    epochInfo,\n    baseIn,\n  }: ComputePairAmountParams): {\n    inputAmountFee: GetTransferAmountFee;\n    anotherAmount: GetTransferAmountFee;\n    maxAnotherAmount: GetTransferAmountFee;\n    liquidity: BN;\n  } {\n    const coefficient = 1 - Number(slippage.toSignificant()) / 100;\n    const inputAmount = new BN(\n      new Decimal(amount)\n        .mul(10 ** poolInfo[baseIn ? \"mintA\" : \"mintB\"].decimals)\n        .mul(coefficient)\n        .toFixed(0),\n    );\n    const inputAmountFee = getTransferAmountFeeV2(\n      inputAmount,\n      poolInfo[baseIn ? \"mintA\" : \"mintB\"].extensions.feeConfig,\n      epochInfo,\n      false,\n    );\n    const _inputAmountWithoutFee = inputAmount.sub(inputAmountFee.fee ?? new BN(0));\n\n    const lpAmount = new BN(\n      new Decimal(poolInfo.lpAmount).mul(10 ** poolInfo.lpMint.decimals).toFixed(0, Decimal.ROUND_DOWN),\n    );\n    this.logDebug(\"baseReserve:\", baseReserve.toString(), \"quoteReserve:\", quoteReserve.toString());\n\n    this.logDebug(\n      \"tokenIn:\",\n      baseIn ? poolInfo.mintA.symbol : poolInfo.mintB.symbol,\n      \"amountIn:\",\n      inputAmount.toString(),\n      \"amountInFee:\",\n      inputAmountFee.fee?.toString() ?? 0,\n      \"anotherToken:\",\n      baseIn ? poolInfo.mintB.symbol : poolInfo.mintA.symbol,\n      \"slippage:\",\n      `${slippage.toSignificant()}%`,\n    );\n\n    // input is fixed\n    const input = baseIn ? \"base\" : \"quote\";\n    this.logDebug(\"input side:\", input);\n\n    const liquidity = _inputAmountWithoutFee.mul(lpAmount).div(input === \"base\" ? baseReserve : quoteReserve);\n    let anotherAmountFee: GetTransferAmountFee = {\n      amount: BN_ZERO,\n      fee: undefined,\n      expirationTime: undefined,\n    };\n    if (!_inputAmountWithoutFee.isZero()) {\n      const lpAmountData = lpToAmount(liquidity, baseReserve, quoteReserve, lpAmount);\n      this.logDebug(\"lpAmountData:\", {\n        amountA: lpAmountData.amountA.toString(),\n        amountB: lpAmountData.amountB.toString(),\n      });\n      anotherAmountFee = getTransferAmountFeeV2(\n        lpAmountData[baseIn ? \"amountB\" : \"amountA\"],\n        poolInfo[baseIn ? \"mintB\" : \"mintA\"].extensions.feeConfig,\n        epochInfo,\n        true,\n      );\n    }\n\n    const _slippage = new Percent(new BN(1)).add(slippage);\n    const slippageAdjustedAmount = getTransferAmountFeeV2(\n      _slippage.mul(anotherAmountFee.amount.sub(anotherAmountFee.fee ?? new BN(0))).quotient,\n      poolInfo[baseIn ? \"mintB\" : \"mintA\"].extensions.feeConfig,\n      epochInfo,\n      true,\n    );\n\n    this.logDebug(\n      \"anotherAmount:\",\n      anotherAmountFee.amount.toString(),\n      \"anotherAmountFee:\",\n      anotherAmountFee.fee?.toString() ?? 0,\n      \"maxAnotherAmount:\",\n      slippageAdjustedAmount.amount.toString(),\n      \"maxAnotherAmountFee:\",\n      slippageAdjustedAmount.fee?.toString() ?? 0,\n    );\n\n    return {\n      inputAmountFee,\n      anotherAmount: anotherAmountFee,\n      maxAnotherAmount: slippageAdjustedAmount,\n      liquidity,\n    };\n  }\n}\n\nfunction lpToAmount(lp: BN, poolAmountA: BN, poolAmountB: BN, supply: BN): { amountA: BN; amountB: BN } {\n  let amountA = lp.mul(poolAmountA).div(supply);\n  if (!amountA.isZero() && !lp.mul(poolAmountA).mod(supply).isZero()) amountA = amountA.add(new BN(1));\n  let amountB = lp.mul(poolAmountB).div(supply);\n  if (!amountB.isZero() && !lp.mul(poolAmountB).mod(supply).isZero()) amountB = amountB.add(new BN(1));\n\n  return {\n    amountA,\n    amountB,\n  };\n}\n","import BN from \"bn.js\";\n\nexport const FEE_RATE_DENOMINATOR_VALUE = new BN(1_000_000);\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\nexport class CpmmFee {\n  static tradingFee(amount: BN, tradeFeeRate: BN): BN {\n    return ceilDiv(amount, tradeFeeRate, FEE_RATE_DENOMINATOR_VALUE);\n  }\n  static protocolFee(amount: BN, protocolFeeRate: BN): BN {\n    return floorDiv(amount, protocolFeeRate, FEE_RATE_DENOMINATOR_VALUE);\n  }\n  static fundFee(amount: BN, fundFeeRate: BN): BN {\n    return floorDiv(amount, fundFeeRate, FEE_RATE_DENOMINATOR_VALUE);\n  }\n}\n","import BN from \"bn.js\";\nimport { RoundDirection, SwapWithoutFeesResult, TradingTokenResult } from \"./calculator\";\n\nfunction checkedRem(dividend: BN, divisor: BN): BN {\n  if (divisor.isZero()) throw Error(\"divisor is zero\");\n\n  const result = dividend.mod(divisor);\n  return result;\n}\n\nfunction checkedCeilDiv(dividend: BN, rhs: BN): BN[] {\n  if (rhs.isZero()) throw Error(\"rhs is zero\");\n\n  let quotient = dividend.div(rhs);\n\n  if (quotient.isZero()) throw Error(\"quotient is zero\");\n\n  let remainder = checkedRem(dividend, rhs);\n\n  if (remainder.gt(ZERO)) {\n    quotient = quotient.add(new BN(1));\n\n    rhs = dividend.div(quotient);\n    remainder = checkedRem(dividend, quotient);\n    if (remainder.gt(ZERO)) {\n      rhs = rhs.add(new BN(1));\n    }\n  }\n  return [quotient, rhs];\n}\n\nconst ZERO = new BN(0);\n\nexport class ConstantProductCurve {\n  static swapWithoutFees(sourceAmount: BN, swapSourceAmount: BN, swapDestinationAmount: BN): SwapWithoutFeesResult {\n    const invariant = swapSourceAmount.mul(swapDestinationAmount);\n\n    const newSwapSourceAmount = swapSourceAmount.add(sourceAmount);\n    const [newSwapDestinationAmount, _newSwapSourceAmount] = checkedCeilDiv(invariant, newSwapSourceAmount);\n\n    const sourceAmountSwapped = _newSwapSourceAmount.sub(swapSourceAmount);\n    const destinationAmountSwapped = swapDestinationAmount.sub(newSwapDestinationAmount);\n    if (destinationAmountSwapped.isZero()) throw Error(\"destinationAmountSwapped is zero\");\n\n    return {\n      sourceAmountSwapped,\n      destinationAmountSwapped,\n    };\n  }\n\n  static lpTokensToTradingTokens(\n    lpTokenAmount: BN,\n    lpTokenSupply: BN,\n    swapTokenAmount0: BN,\n    swapTokenAmount1: BN,\n    roundDirection: RoundDirection,\n  ): TradingTokenResult {\n    let tokenAmount0 = lpTokenAmount.mul(swapTokenAmount0).div(lpTokenSupply);\n    let tokenAmount1 = lpTokenAmount.mul(swapTokenAmount1).div(lpTokenSupply);\n\n    if (roundDirection === RoundDirection.Floor) {\n      return { tokenAmount0, tokenAmount1 };\n    } else if (roundDirection === RoundDirection.Ceiling) {\n      const tokenRemainder0 = checkedRem(lpTokenAmount.mul(swapTokenAmount0), lpTokenSupply);\n\n      if (tokenRemainder0.gt(ZERO) && tokenAmount0.gt(ZERO)) {\n        tokenAmount0 = tokenAmount0.add(new BN(1));\n      }\n\n      const token1Remainder = checkedRem(lpTokenAmount.mul(swapTokenAmount1), lpTokenSupply);\n\n      if (token1Remainder.gt(ZERO) && tokenAmount1.gt(ZERO)) {\n        tokenAmount1 = tokenAmount1.add(new BN(1));\n      }\n\n      return { tokenAmount0, tokenAmount1 };\n    }\n    throw Error(\"roundDirection value error\");\n  }\n}\n","import BN from \"bn.js\";\nimport { CpmmFee } from \"./fee\";\nimport { ConstantProductCurve } from \"./constantProduct\";\n\nexport enum RoundDirection {\n  Floor,\n  Ceiling,\n}\n\nexport type SwapWithoutFeesResult = { sourceAmountSwapped: BN; destinationAmountSwapped: BN };\n\nexport type TradingTokenResult = { tokenAmount0: BN; tokenAmount1: BN };\n\nexport type SwapResult = {\n  newSwapSourceAmount: BN;\n  newSwapDestinationAmount: BN;\n  sourceAmountSwapped: BN;\n  destinationAmountSwapped: BN;\n  tradeFee: BN;\n};\n\nexport class CurveCalculator {\n  static validate_supply(tokenAmount0: BN, tokenAmount1: BN): void {\n    if (tokenAmount0.isZero()) throw Error(\"tokenAmount0 is zero\");\n    if (tokenAmount1.isZero()) throw Error(\"tokenAmount1 is zero\");\n  }\n\n  static swap(sourceAmount: BN, swapSourceAmount: BN, swapDestinationAmount: BN, tradeFeeRate: BN): SwapResult {\n    const tradeFee = CpmmFee.tradingFee(sourceAmount, tradeFeeRate);\n\n    const sourceAmountLessFees = sourceAmount.sub(tradeFee);\n\n    const { sourceAmountSwapped, destinationAmountSwapped } = ConstantProductCurve.swapWithoutFees(\n      sourceAmountLessFees,\n      swapSourceAmount,\n      swapDestinationAmount,\n    );\n\n    const _sourceAmountSwapped = sourceAmountSwapped.add(tradeFee);\n    return {\n      newSwapSourceAmount: swapSourceAmount.add(_sourceAmountSwapped),\n      newSwapDestinationAmount: swapDestinationAmount.sub(destinationAmountSwapped),\n      sourceAmountSwapped: _sourceAmountSwapped,\n      destinationAmountSwapped,\n      tradeFee,\n    };\n  }\n}\n","import { PublicKey } from \"@solana/web3.js\";\nimport { findProgramAddress } from \"@/common/txTool/txUtils\";\n\nconst AUTH_SEED = Buffer.from(\"vault_and_lp_mint_auth_seed\", \"utf8\");\nconst AMM_CONFIG_SEED = Buffer.from(\"amm_config\", \"utf8\");\nconst POOL_SEED = Buffer.from(\"pool\", \"utf8\");\nconst POOL_LP_MINT_SEED = Buffer.from(\"pool_lp_mint\", \"utf8\");\nconst POOL_VAULT_SEED = Buffer.from(\"pool_vault\", \"utf8\");\nconst OBSERVATION_SEED = Buffer.from(\"observation\", \"utf8\");\n\nexport function getPdaPoolAuthority(programId: PublicKey): {\n  publicKey: PublicKey;\n  nonce: number;\n} {\n  return findProgramAddress([AUTH_SEED], programId);\n}\n\nexport function getCpmmPdaAmmConfigId(\n  programId: PublicKey,\n  index: number,\n): {\n  publicKey: PublicKey;\n  nonce: number;\n} {\n  return findProgramAddress([AMM_CONFIG_SEED, u16ToBytes(index)], programId);\n}\n\nexport function getCpmmPdaPoolId(\n  programId: PublicKey,\n  ammConfigId: PublicKey,\n  mintA: PublicKey,\n  mintB: PublicKey,\n): {\n  publicKey: PublicKey;\n  nonce: number;\n} {\n  return findProgramAddress([POOL_SEED, ammConfigId.toBuffer(), mintA.toBuffer(), mintB.toBuffer()], programId);\n}\n\nexport function getPdaLpMint(\n  programId: PublicKey,\n  poolId: PublicKey,\n): {\n  publicKey: PublicKey;\n  nonce: number;\n} {\n  return findProgramAddress([POOL_LP_MINT_SEED, poolId.toBuffer()], programId);\n}\n\nexport function getPdaVault(\n  programId: PublicKey,\n  poolId: PublicKey,\n  mint: PublicKey,\n): {\n  publicKey: PublicKey;\n  nonce: number;\n} {\n  return findProgramAddress([POOL_VAULT_SEED, poolId.toBuffer(), mint.toBuffer()], programId);\n}\n\nexport function getPdaObservationId(\n  programId: PublicKey,\n  poolId: PublicKey,\n): {\n  publicKey: PublicKey;\n  nonce: number;\n} {\n  return findProgramAddress([OBSERVATION_SEED, poolId.toBuffer()], programId);\n}\n\nfunction u16ToBytes(num: number): Uint8Array {\n  const arr = new ArrayBuffer(2);\n  const view = new DataView(arr);\n  view.setUint16(0, num, false);\n  return new Uint8Array(arr);\n}\n\nexport function getCreatePoolKeys({\n  programId,\n  mintA,\n  mintB,\n}: {\n  programId: PublicKey;\n  mintA: PublicKey;\n  mintB: PublicKey;\n}): {\n  poolId: PublicKey;\n  configId: PublicKey;\n  authority: PublicKey;\n  lpMint: PublicKey;\n  vaultA: PublicKey;\n  vaultB: PublicKey;\n  observationId: PublicKey;\n} {\n  const configId = getCpmmPdaAmmConfigId(programId, 0).publicKey;\n  const authority = getPdaPoolAuthority(programId).publicKey;\n  const poolId = getCpmmPdaPoolId(programId, configId, mintA, mintB).publicKey;\n  const lpMint = getPdaLpMint(programId, poolId).publicKey;\n  const vaultA = getPdaVault(programId, poolId, mintA).publicKey;\n  const vaultB = getPdaVault(programId, poolId, mintB).publicKey;\n  const observationId = getPdaObservationId(programId, poolId).publicKey;\n\n  return {\n    poolId,\n    configId,\n    authority,\n    lpMint,\n    vaultA,\n    vaultB,\n    observationId,\n  };\n}\n","import BN from \"bn.js\";\n\nimport { AccountMeta, PublicKey, TransactionInstruction } from \"@solana/web3.js\";\nimport { TOKEN_PROGRAM_ID, TOKEN_2022_PROGRAM_ID, ASSOCIATED_TOKEN_PROGRAM_ID } from \"@solana/spl-token\";\nimport { SYSTEM_PROGRAM_ID, RENT_PROGRAM_ID, MEMO_PROGRAM_ID2, createLogger } from \"@/common\";\n\nimport { struct, u64 } from \"@/marshmallow\";\nconst logger = createLogger(\"Raydium_cpmm\");\nconst anchorDataBuf = {\n  initialize: [175, 175, 109, 31, 13, 152, 155, 237],\n  deposit: [242, 35, 198, 137, 82, 225, 242, 182],\n  withdraw: [183, 18, 70, 156, 148, 109, 161, 34],\n  swapBaseInput: [143, 190, 90, 218, 196, 30, 51, 222],\n  swapBaseOutput: [55, 217, 98, 86, 163, 74, 180, 173],\n};\n\nexport function makeCreateCpmmPoolInInstruction(\n  programId: PublicKey,\n  creator: PublicKey,\n  configId: PublicKey,\n  authority: PublicKey,\n  poolId: PublicKey,\n  mintA: PublicKey,\n  mintB: PublicKey,\n  lpMint: PublicKey,\n  userVaultA: PublicKey,\n  userVaultB: PublicKey,\n  userLpAccount: PublicKey,\n  vaultA: PublicKey,\n  vaultB: PublicKey,\n  createPoolFeeAccount: PublicKey,\n  mintProgramA: PublicKey,\n  mintProgramB: PublicKey,\n  observationId: PublicKey,\n\n  amountMaxA: BN,\n  amountMaxB: BN,\n  openTime: BN,\n): TransactionInstruction {\n  const dataLayout = struct([u64(\"amountMaxA\"), u64(\"amountMaxB\"), u64(\"openTime\")]);\n\n  const keys: Array<AccountMeta> = [\n    { pubkey: creator, isSigner: true, isWritable: false },\n    { pubkey: configId, isSigner: false, isWritable: false },\n    { pubkey: authority, isSigner: false, isWritable: false },\n    { pubkey: poolId, isSigner: false, isWritable: true },\n    { pubkey: mintA, isSigner: false, isWritable: false },\n    { pubkey: mintB, isSigner: false, isWritable: false },\n    { pubkey: lpMint, isSigner: false, isWritable: true },\n    { pubkey: userVaultA, isSigner: false, isWritable: true },\n    { pubkey: userVaultB, isSigner: false, isWritable: true },\n    { pubkey: userLpAccount, isSigner: false, isWritable: true },\n    { pubkey: vaultA, isSigner: false, isWritable: true },\n    { pubkey: vaultB, isSigner: false, isWritable: true },\n    { pubkey: createPoolFeeAccount, isSigner: false, isWritable: true },\n    { pubkey: observationId, isSigner: false, isWritable: true },\n\n    { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },\n    { pubkey: mintProgramA, isSigner: false, isWritable: false },\n    { pubkey: mintProgramB, isSigner: false, isWritable: false },\n    { pubkey: ASSOCIATED_TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },\n    { pubkey: SYSTEM_PROGRAM_ID, isSigner: false, isWritable: false },\n    { pubkey: RENT_PROGRAM_ID, isSigner: false, isWritable: false },\n  ];\n\n  const data = Buffer.alloc(dataLayout.span);\n  dataLayout.encode(\n    {\n      amountMaxA,\n      amountMaxB,\n      openTime,\n    },\n    data,\n  );\n\n  return new TransactionInstruction({\n    keys,\n    programId,\n    data: Buffer.from([...anchorDataBuf.initialize, ...data]),\n  });\n}\n\nexport function makeDepositCpmmInInstruction(\n  programId: PublicKey,\n  owner: PublicKey,\n  authority: PublicKey,\n  poolId: PublicKey,\n  userLpAccount: PublicKey,\n  userVaultA: PublicKey,\n  userVaultB: PublicKey,\n  vaultA: PublicKey,\n  vaultB: PublicKey,\n  mintA: PublicKey,\n  mintB: PublicKey,\n  lpMint: PublicKey,\n\n  lpAmount: BN,\n  amountMaxA: BN,\n  amountMaxB: BN,\n): TransactionInstruction {\n  const dataLayout = struct([u64(\"lpAmount\"), u64(\"amountMaxA\"), u64(\"amountMaxB\")]);\n\n  const keys: Array<AccountMeta> = [\n    { pubkey: owner, isSigner: true, isWritable: false },\n    { pubkey: authority, isSigner: false, isWritable: false },\n    { pubkey: poolId, isSigner: false, isWritable: true },\n    { pubkey: userLpAccount, isSigner: false, isWritable: true },\n    { pubkey: userVaultA, isSigner: false, isWritable: true },\n    { pubkey: userVaultB, isSigner: false, isWritable: true },\n    { pubkey: vaultA, isSigner: false, isWritable: true },\n    { pubkey: vaultB, isSigner: false, isWritable: true },\n    { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },\n    { pubkey: TOKEN_2022_PROGRAM_ID, isSigner: false, isWritable: false },\n    { pubkey: mintA, isSigner: false, isWritable: false },\n    { pubkey: mintB, isSigner: false, isWritable: false },\n    { pubkey: lpMint, isSigner: false, isWritable: true },\n  ];\n\n  const data = Buffer.alloc(dataLayout.span);\n  logger.debug(\"cpmm deposit data\", {\n    lpAmount: lpAmount.toString(),\n    amountMaxA: amountMaxA.toString(),\n    amountMaxB: amountMaxB.toString(),\n  });\n  dataLayout.encode(\n    {\n      lpAmount,\n      amountMaxA,\n      amountMaxB,\n    },\n    data,\n  );\n\n  return new TransactionInstruction({\n    keys,\n    programId,\n    data: Buffer.from([...anchorDataBuf.deposit, ...data]),\n  });\n}\n\nexport function makeWithdrawCpmmInInstruction(\n  programId: PublicKey,\n  owner: PublicKey,\n  authority: PublicKey,\n  poolId: PublicKey,\n  userLpAccount: PublicKey,\n  userVaultA: PublicKey,\n  userVaultB: PublicKey,\n  vaultA: PublicKey,\n  vaultB: PublicKey,\n  mintA: PublicKey,\n  mintB: PublicKey,\n  lpMint: PublicKey,\n\n  lpAmount: BN,\n  amountMinA: BN,\n  amountMinB: BN,\n): TransactionInstruction {\n  const dataLayout = struct([u64(\"lpAmount\"), u64(\"amountMinA\"), u64(\"amountMinB\")]);\n\n  const keys: Array<AccountMeta> = [\n    { pubkey: owner, isSigner: true, isWritable: false },\n    { pubkey: authority, isSigner: false, isWritable: false },\n    { pubkey: poolId, isSigner: false, isWritable: true },\n    { pubkey: userLpAccount, isSigner: false, isWritable: true },\n    { pubkey: userVaultA, isSigner: false, isWritable: true },\n    { pubkey: userVaultB, isSigner: false, isWritable: true },\n    { pubkey: vaultA, isSigner: false, isWritable: true },\n    { pubkey: vaultB, isSigner: false, isWritable: true },\n    { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },\n    { pubkey: TOKEN_2022_PROGRAM_ID, isSigner: false, isWritable: false },\n    { pubkey: mintA, isSigner: false, isWritable: false },\n    { pubkey: mintB, isSigner: false, isWritable: false },\n    { pubkey: lpMint, isSigner: false, isWritable: true },\n    { pubkey: MEMO_PROGRAM_ID2, isSigner: false, isWritable: false },\n  ];\n\n  const data = Buffer.alloc(dataLayout.span);\n  dataLayout.encode(\n    {\n      lpAmount,\n      amountMinA,\n      amountMinB,\n    },\n    data,\n  );\n\n  return new TransactionInstruction({\n    keys,\n    programId,\n    data: Buffer.from([...anchorDataBuf.withdraw, ...data]),\n  });\n}\n\nexport function makeSwapCpmmBaseInInInstruction(\n  programId: PublicKey,\n  payer: PublicKey,\n  authority: PublicKey,\n  configId: PublicKey,\n  poolId: PublicKey,\n  userInputAccount: PublicKey,\n  userOutputAccount: PublicKey,\n  inputVault: PublicKey,\n  outputVault: PublicKey,\n  inputTokenProgram: PublicKey,\n  outputTokenProgram: PublicKey,\n  inputMint: PublicKey,\n  outputMint: PublicKey,\n  observationId: PublicKey,\n\n  amountIn: BN,\n  amounOutMin: BN,\n): TransactionInstruction {\n  const dataLayout = struct([u64(\"amountIn\"), u64(\"amounOutMin\")]);\n\n  const keys: Array<AccountMeta> = [\n    { pubkey: payer, isSigner: true, isWritable: false },\n    { pubkey: authority, isSigner: false, isWritable: false },\n    { pubkey: configId, isSigner: false, isWritable: false },\n    { pubkey: poolId, isSigner: false, isWritable: true },\n    { pubkey: userInputAccount, isSigner: false, isWritable: true },\n    { pubkey: userOutputAccount, isSigner: false, isWritable: true },\n    { pubkey: inputVault, isSigner: false, isWritable: true },\n    { pubkey: outputVault, isSigner: false, isWritable: true },\n    { pubkey: inputTokenProgram, isSigner: false, isWritable: false },\n    { pubkey: outputTokenProgram, isSigner: false, isWritable: false },\n    { pubkey: inputMint, isSigner: false, isWritable: false },\n    { pubkey: outputMint, isSigner: false, isWritable: false },\n    { pubkey: observationId, isSigner: false, isWritable: true },\n  ];\n\n  const data = Buffer.alloc(dataLayout.span);\n  dataLayout.encode(\n    {\n      amountIn,\n      amounOutMin,\n    },\n    data,\n  );\n\n  return new TransactionInstruction({\n    keys,\n    programId,\n    data: Buffer.from([...anchorDataBuf.swapBaseInput, ...data]),\n  });\n}\nexport function makeSwapCpmmBaseOutInInstruction(\n  programId: PublicKey,\n  payer: PublicKey,\n  authority: PublicKey,\n  configId: PublicKey,\n  poolId: PublicKey,\n  userInputAccount: PublicKey,\n  userOutputAccount: PublicKey,\n  inputVault: PublicKey,\n  outputVault: PublicKey,\n  inputTokenProgram: PublicKey,\n  outputTokenProgram: PublicKey,\n  inputMint: PublicKey,\n  outputMint: PublicKey,\n  observationId: PublicKey,\n\n  amountInMax: BN,\n  amountOut: BN,\n): TransactionInstruction {\n  const dataLayout = struct([u64(\"amountInMax\"), u64(\"amountOut\")]);\n\n  const keys: Array<AccountMeta> = [\n    { pubkey: payer, isSigner: true, isWritable: false },\n    { pubkey: authority, isSigner: false, isWritable: false },\n    { pubkey: configId, isSigner: false, isWritable: false },\n    { pubkey: poolId, isSigner: false, isWritable: true },\n    { pubkey: userInputAccount, isSigner: false, isWritable: true },\n    { pubkey: userOutputAccount, isSigner: false, isWritable: true },\n    { pubkey: inputVault, isSigner: false, isWritable: true },\n    { pubkey: outputVault, isSigner: false, isWritable: true },\n    { pubkey: inputTokenProgram, isSigner: false, isWritable: false },\n    { pubkey: outputTokenProgram, isSigner: false, isWritable: false },\n    { pubkey: inputMint, isSigner: false, isWritable: false },\n    { pubkey: outputMint, isSigner: false, isWritable: false },\n    { pubkey: observationId, isSigner: false, isWritable: true },\n  ];\n\n  const data = Buffer.alloc(dataLayout.span);\n  dataLayout.encode(\n    {\n      amountInMax,\n      amountOut,\n    },\n    data,\n  );\n\n  return new TransactionInstruction({\n    keys,\n    programId,\n    data: Buffer.from([...anchorDataBuf.swapBaseOutput, ...data]),\n  });\n}\n","import { publicKey, seq, struct, u64, u8, u16, blob, bool } from \"@/marshmallow\";\n\nexport const CpmmConfigInfoLayout = struct([\n  blob(8),\n  u8(\"bump\"),\n  bool(\"disableCreatePool\"),\n  u16(\"index\"),\n  u64(\"tradeFeeRate\"),\n  u64(\"protocolFeeRate\"),\n  u64(\"fundFeeRate\"),\n  u64(\"createPoolFee\"),\n\n  publicKey(\"protocolOwner\"),\n  publicKey(\"fundOwner\"),\n  seq(u64(), 16),\n]);\n\nexport const CpmmPoolInfoLayout = struct([\n  blob(8),\n\n  publicKey(\"configId\"),\n  publicKey(\"poolCreator\"),\n  publicKey(\"vaultA\"),\n  publicKey(\"vaultB\"),\n\n  publicKey(\"mintLp\"),\n  publicKey(\"mintA\"),\n  publicKey(\"mintB\"),\n\n  publicKey(\"mintProgramA\"),\n  publicKey(\"mintProgramB\"),\n\n  publicKey(\"observationId\"),\n\n  u8(\"bump\"),\n  u8(\"status\"),\n\n  u8(\"lpDecimals\"),\n  u8(\"mintDecimalA\"),\n  u8(\"mintDecimalB\"),\n\n  u64(\"lpAmount\"),\n  u64(\"protocolFeesMintA\"),\n  u64(\"protocolFeesMintB\"),\n  u64(\"fundFeesMintA\"),\n  u64(\"fundFeesMintB\"),\n  u64(\"openTime\"),\n\n  seq(u64(), 32),\n]);\n","import { PublicKey, EpochInfo } from \"@solana/web3.js\";\nimport { TOKEN_PROGRAM_ID, TOKEN_2022_PROGRAM_ID, createTransferInstruction } from \"@solana/spl-token\";\nimport {\n  WSOLMint,\n  AMM_V4,\n  CLMM_PROGRAM_ID,\n  CREATE_CPMM_POOL_PROGRAM,\n  minExpirationTime,\n  getMultipleAccountsInfoWithCustomFlags,\n  solToWSol,\n  fetchMultipleMintInfos,\n} from \"@/common\";\nimport { InstructionType, TxVersion } from \"@/common/txTool/txType\";\nimport { MakeTxData, MakeMultiTxData } from \"@/common/txTool/txTool\";\nimport ModuleBase, { ModuleBaseProps } from \"../moduleBase\";\nimport { BigNumberish, parseBigNumberish } from \"@/common/bignumber\";\nimport {\n  createWSolAccountInstructions,\n  closeAccountInstruction,\n  makeTransferInstruction,\n} from \"../account/instruction\";\nimport { TokenAccount } from \"../account/types\";\nimport { ComputeBudgetConfig, ReturnTypeFetchMultipleMintInfos } from \"@/raydium/type\";\nimport {\n  getLiquidityAssociatedAuthority,\n  ComputeAmountOutParam,\n  liquidityStateV4Layout,\n  toAmmComputePoolInfo,\n} from \"@/raydium/liquidity\";\nimport { PoolInfoLayout } from \"@/raydium/clmm/layout\";\nimport { CpmmPoolInfoLayout, getPdaPoolAuthority } from \"@/raydium/cpmm\";\nimport { ReturnTypeFetchMultiplePoolTickArrays, PoolUtils, ClmmRpcData, ComputeClmmPoolInfo } from \"@/raydium/clmm\";\nimport { struct, publicKey } from \"@/marshmallow\";\nimport {\n  ReturnTypeGetAllRoute,\n  BasicPoolInfo,\n  RoutePathType,\n  ReturnTypeFetchMultipleInfo,\n  ComputeAmountOutLayout,\n  ComputeAmountOutAmmLayout,\n  ComputePoolType,\n  ComputeRoutePathType,\n} from \"./type\";\nimport { TokenAmount, Price } from \"@/module\";\nimport BN from \"bn.js\";\nimport { AmmV4Keys, ApiV3Token, ClmmKeys, PoolKeys } from \"@/api\";\nimport { toApiV3Token, toToken, toTokenAmount } from \"../token\";\nimport Decimal from \"decimal.js\";\nimport { makeSwapInstruction } from \"./instrument\";\nimport { AmmRpcData } from \"../liquidity\";\nimport { MARKET_STATE_LAYOUT_V3, Market } from \"../serum\";\nimport { CpmmComputeData } from \"../cpmm\";\n\nconst ZERO = new BN(0);\nexport default class TradeV2 extends ModuleBase {\n  constructor(params: ModuleBaseProps) {\n    super(params);\n  }\n\n  private async getWSolAccounts(): Promise<TokenAccount[]> {\n    this.scope.checkOwner();\n    await this.scope.account.fetchWalletTokenAccounts();\n    const tokenAccounts = this.scope.account.tokenAccounts.filter((acc) => acc.mint.equals(WSOLMint));\n    tokenAccounts.sort((a, b) => {\n      if (a.isAssociated) return 1;\n      if (b.isAssociated) return -1;\n      return a.amount.lt(b.amount) ? -1 : 1;\n    });\n    return tokenAccounts;\n  }\n\n  public async unWrapWSol<T extends TxVersion>(props: {\n    amount: BigNumberish;\n    computeBudgetConfig?: ComputeBudgetConfig;\n    tokenProgram?: PublicKey;\n    txVersion?: T;\n  }): Promise<MakeTxData<T>> {\n    const { amount, tokenProgram, txVersion = TxVersion.LEGACY } = props;\n    const tokenAccounts = await this.getWSolAccounts();\n    const txBuilder = this.createTxBuilder();\n    txBuilder.addCustomComputeBudget(props.computeBudgetConfig);\n    const ins = await createWSolAccountInstructions({\n      connection: this.scope.connection,\n      owner: this.scope.ownerPubKey,\n      payer: this.scope.ownerPubKey,\n      amount: 0,\n    });\n    txBuilder.addInstruction(ins);\n\n    const amountBN = parseBigNumberish(amount);\n    for (let i = 0; i < tokenAccounts.length; i++) {\n      if (amountBN.gte(tokenAccounts[i].amount)) {\n        txBuilder.addInstruction({\n          instructions: [\n            closeAccountInstruction({\n              tokenAccount: tokenAccounts[i].publicKey!,\n              payer: this.scope.ownerPubKey,\n              owner: this.scope.ownerPubKey,\n              programId: tokenProgram,\n            }),\n          ],\n        });\n        amountBN.sub(tokenAccounts[i].amount);\n      } else {\n        txBuilder.addInstruction({\n          instructions: [\n            closeAccountInstruction({\n              tokenAccount: tokenAccounts[i].publicKey!,\n              payer: this.scope.ownerPubKey,\n              owner: this.scope.ownerPubKey,\n              programId: tokenProgram,\n            }),\n          ],\n        });\n        makeTransferInstruction({\n          destination: ins.addresses.newAccount,\n          source: tokenAccounts[i].publicKey!,\n          amount: amountBN,\n          owner: this.scope.ownerPubKey,\n          tokenProgram,\n        });\n      }\n    }\n\n    return txBuilder.versionBuild({ txVersion }) as Promise<MakeTxData<T>>;\n  }\n\n  public async wrapWSol<T extends TxVersion>(\n    amount: BigNumberish,\n    tokenProgram?: PublicKey,\n    txVersion?: T,\n  ): Promise<MakeTxData<T>> {\n    const tokenAccounts = await this.getWSolAccounts();\n\n    const txBuilder = this.createTxBuilder();\n    const ins = await createWSolAccountInstructions({\n      connection: this.scope.connection,\n      owner: this.scope.ownerPubKey,\n      payer: this.scope.ownerPubKey,\n      amount,\n      skipCloseAccount: true,\n    });\n    txBuilder.addInstruction(ins);\n\n    if (tokenAccounts.length) {\n      // already have wsol account\n      txBuilder.addInstruction({\n        instructions: [\n          makeTransferInstruction({\n            // destination: ins.signers![0].publicKey,\n            destination: tokenAccounts[0].publicKey!,\n            source: ins.addresses.newAccount,\n            amount,\n            owner: this.scope.ownerPubKey,\n            tokenProgram,\n          }),\n        ],\n        endInstructions: [\n          closeAccountInstruction({\n            tokenAccount: ins.addresses.newAccount,\n            payer: this.scope.ownerPubKey,\n            owner: this.scope.ownerPubKey,\n            programId: tokenProgram,\n          }),\n        ],\n      });\n    }\n    return txBuilder.versionBuild({ txVersion: txVersion ?? TxVersion.LEGACY }) as Promise<MakeTxData<T>>;\n  }\n\n  public async swap<T extends TxVersion>({\n    swapInfo,\n    swapPoolKeys,\n    ownerInfo,\n    computeBudgetConfig,\n    routeProgram,\n    txVersion,\n  }: {\n    txVersion: T;\n    swapInfo: ComputeAmountOutLayout;\n    swapPoolKeys?: PoolKeys[];\n    ownerInfo: {\n      associatedOnly: boolean;\n      checkCreateATAOwner: boolean;\n    };\n    routeProgram: PublicKey;\n    computeBudgetConfig?: ComputeBudgetConfig;\n  }): Promise<MakeMultiTxData<T>> {\n    const txBuilder = this.createTxBuilder();\n\n    const amountIn = swapInfo.amountIn;\n    const amountOut = swapInfo.amountOut;\n    const useSolBalance = amountIn.amount.token.mint.equals(WSOLMint);\n    const isOutputSol = amountOut.amount.token.mint.equals(WSOLMint);\n    const inputMint = amountIn.amount.token.mint;\n    const outputMint = amountOut.amount.token.mint;\n\n    const { account: sourceAcc, instructionParams: sourceAccInsParams } =\n      await this.scope.account.getOrCreateTokenAccount({\n        tokenProgram: amountIn.amount.token.isToken2022 ? TOKEN_2022_PROGRAM_ID : TOKEN_PROGRAM_ID,\n        mint: inputMint,\n        notUseTokenAccount: useSolBalance,\n        owner: this.scope.ownerPubKey,\n        skipCloseAccount: !useSolBalance,\n        createInfo: useSolBalance\n          ? {\n              payer: this.scope.ownerPubKey,\n              amount: amountIn.amount.raw,\n            }\n          : undefined,\n        associatedOnly: useSolBalance ? false : ownerInfo.associatedOnly,\n        checkCreateATAOwner: ownerInfo.checkCreateATAOwner,\n      });\n\n    sourceAccInsParams && txBuilder.addInstruction(sourceAccInsParams);\n\n    if (sourceAcc === undefined) {\n      throw Error(\"input account check error\");\n    }\n\n    const destinationAcc = this.scope.account.getAssociatedTokenAccount(\n      outputMint,\n      amountOut.amount.token.isToken2022 ? TOKEN_2022_PROGRAM_ID : TOKEN_PROGRAM_ID,\n    );\n\n    if (isOutputSol) {\n      txBuilder.addInstruction({\n        endInstructions: [\n          closeAccountInstruction({\n            owner: this.scope.ownerPubKey,\n            payer: this.scope.ownerPubKey,\n            tokenAccount: destinationAcc,\n            programId: TOKEN_PROGRAM_ID,\n          }),\n        ],\n        endInstructionTypes: [InstructionType.CloseAccount],\n      });\n    }\n\n    let routeTokenAcc: PublicKey | undefined = undefined;\n    if (swapInfo.routeType === \"route\") {\n      const middleMint = swapInfo.middleToken;\n      routeTokenAcc = this.scope.account.getAssociatedTokenAccount(\n        middleMint.mint,\n        middleMint.isToken2022 ? TOKEN_2022_PROGRAM_ID : TOKEN_PROGRAM_ID,\n      );\n    }\n\n    const poolKeys = swapPoolKeys ? swapPoolKeys : await this.computePoolToPoolKeys({ pools: swapInfo.poolInfoList });\n    const swapIns = makeSwapInstruction({\n      routeProgram,\n      inputMint,\n      swapInfo: {\n        ...swapInfo,\n        poolInfo: [...swapInfo.poolInfoList],\n        poolKey: poolKeys,\n        outputMint,\n      },\n      ownerInfo: {\n        wallet: this.scope.ownerPubKey,\n        sourceToken: sourceAcc,\n        routeToken: routeTokenAcc,\n        destinationToken: destinationAcc!,\n      },\n    });\n\n    if (swapInfo.feeConfig !== undefined) {\n      const checkTxBuilder = this.createTxBuilder();\n      checkTxBuilder.addInstruction({\n        instructions: [\n          createTransferInstruction(\n            sourceAcc,\n            swapInfo.feeConfig.feeAccount,\n            this.scope.ownerPubKey,\n            swapInfo.feeConfig.feeAmount.toNumber(),\n          ),\n        ],\n        instructionTypes: [InstructionType.TransferAmount],\n      });\n      checkTxBuilder.addInstruction(swapIns);\n\n      const { transactions } =\n        txVersion === TxVersion.V0 ? await checkTxBuilder.sizeCheckBuildV0() : await checkTxBuilder.sizeCheckBuild();\n      if (transactions.length < 2) {\n        txBuilder.addInstruction({\n          instructions: [\n            createTransferInstruction(\n              sourceAcc,\n              swapInfo.feeConfig.feeAccount,\n              this.scope.ownerPubKey,\n              swapInfo.feeConfig.feeAmount.toNumber(),\n            ),\n          ],\n          instructionTypes: [InstructionType.TransferAmount],\n        });\n      }\n    }\n    txBuilder.addInstruction(swapIns);\n\n    if (txVersion === TxVersion.V0)\n      return txBuilder.sizeCheckBuildV0({ computeBudgetConfig, address: swapIns.address }) as Promise<\n        MakeMultiTxData<T>\n      >;\n    return txBuilder.sizeCheckBuild({ computeBudgetConfig, address: swapIns.address }) as Promise<MakeMultiTxData<T>>;\n  }\n\n  // get all amm/clmm/cpmm pools data only with id and mint\n  public async fetchRoutePoolBasicInfo(programIds?: { amm: PublicKey; clmm: PublicKey; cpmm: PublicKey }): Promise<{\n    ammPools: BasicPoolInfo[];\n    clmmPools: BasicPoolInfo[];\n    cpmmPools: BasicPoolInfo[];\n  }> {\n    const { amm = AMM_V4, clmm = CLMM_PROGRAM_ID, cpmm = CREATE_CPMM_POOL_PROGRAM } = programIds || {};\n    const ammPoolsData = await this.scope.connection.getProgramAccounts(amm, {\n      dataSlice: { offset: liquidityStateV4Layout.offsetOf(\"baseMint\"), length: 64 },\n    });\n\n    const layoutAmm = struct([publicKey(\"baseMint\"), publicKey(\"quoteMint\")]);\n    const ammData = ammPoolsData.map((data) => ({\n      id: data.pubkey,\n      version: 4,\n      mintA: layoutAmm.decode(data.account.data).baseMint,\n      mintB: layoutAmm.decode(data.account.data).quoteMint,\n    }));\n\n    const layout = struct([publicKey(\"mintA\"), publicKey(\"mintB\")]);\n    const clmmPoolsData = await this.scope.connection.getProgramAccounts(clmm, {\n      filters: [{ dataSize: PoolInfoLayout.span }],\n      dataSlice: { offset: PoolInfoLayout.offsetOf(\"mintA\"), length: 64 },\n    });\n\n    const clmmData = clmmPoolsData.map((data) => {\n      const clmm = layout.decode(data.account.data);\n      return {\n        id: data.pubkey,\n        version: 6,\n        mintA: clmm.mintA,\n        mintB: clmm.mintB,\n      };\n    });\n\n    const cpmmPools = await this.scope.connection.getProgramAccounts(cpmm, {\n      dataSlice: { offset: CpmmPoolInfoLayout.offsetOf(\"mintA\"), length: 64 },\n    });\n\n    const cpmmData = cpmmPools.map((data) => {\n      const clmm = layout.decode(data.account.data);\n      return {\n        id: data.pubkey,\n        version: 7,\n        mintA: clmm.mintA,\n        mintB: clmm.mintB,\n      };\n    });\n\n    return {\n      clmmPools: clmmData,\n      ammPools: ammData,\n      cpmmPools: cpmmData,\n    };\n  }\n\n  // get pools with in routes\n  public getAllRoute({\n    inputMint,\n    outputMint,\n    clmmPools,\n    ammPools,\n    cpmmPools,\n  }: {\n    inputMint: PublicKey;\n    outputMint: PublicKey;\n    clmmPools: BasicPoolInfo[];\n    ammPools: BasicPoolInfo[];\n    cpmmPools: BasicPoolInfo[];\n  }): ReturnTypeGetAllRoute {\n    inputMint = inputMint.toString() === PublicKey.default.toString() ? WSOLMint : inputMint;\n    outputMint = outputMint.toString() === PublicKey.default.toString() ? WSOLMint : outputMint;\n\n    const needSimulate: { [poolKey: string]: BasicPoolInfo } = {};\n    const needTickArray: { [poolKey: string]: BasicPoolInfo } = {};\n    const cpmmPoolList: { [poolKey: string]: BasicPoolInfo } = {};\n\n    const directPath: BasicPoolInfo[] = [];\n\n    const routePathDict: RoutePathType = {}; // {[route mint: string]: {in: [] , out: []}}\n\n    for (const itemClmmPool of clmmPools ?? []) {\n      if (\n        (itemClmmPool.mintA.equals(inputMint) && itemClmmPool.mintB.equals(outputMint)) ||\n        (itemClmmPool.mintA.equals(outputMint) && itemClmmPool.mintB.equals(inputMint))\n      ) {\n        directPath.push(itemClmmPool);\n        needTickArray[itemClmmPool.id.toString()] = itemClmmPool;\n      }\n\n      if (itemClmmPool.mintA.equals(inputMint)) {\n        const t = itemClmmPool.mintB.toString();\n        if (routePathDict[t] === undefined)\n          routePathDict[t] = {\n            mintProgram: TOKEN_PROGRAM_ID, // to fetch later\n            in: [],\n            out: [],\n            mDecimals: 0, // to fetch later\n          };\n        routePathDict[t].in.push(itemClmmPool);\n      }\n      if (itemClmmPool.mintB.equals(inputMint)) {\n        const t = itemClmmPool.mintA.toString();\n        if (routePathDict[t] === undefined)\n          routePathDict[t] = {\n            mintProgram: TOKEN_PROGRAM_ID, // to fetch later\n            in: [],\n            out: [],\n            mDecimals: 0, // to fetch later\n          };\n        routePathDict[t].in.push(itemClmmPool);\n      }\n      if (itemClmmPool.mintA.equals(outputMint)) {\n        const t = itemClmmPool.mintB.toString();\n        if (routePathDict[t] === undefined)\n          routePathDict[t] = {\n            mintProgram: TOKEN_PROGRAM_ID, // to fetch later\n            in: [],\n            out: [],\n            mDecimals: 0, // to fetch later\n          };\n        routePathDict[t].out.push(itemClmmPool);\n      }\n      if (itemClmmPool.mintB.equals(outputMint)) {\n        const t = itemClmmPool.mintA.toString();\n        if (routePathDict[t] === undefined)\n          routePathDict[t] = {\n            mintProgram: TOKEN_PROGRAM_ID, // to fetch later\n            in: [],\n            out: [],\n            mDecimals: 0, // to fetch later\n          };\n        routePathDict[t].out.push(itemClmmPool);\n      }\n    }\n\n    const addLiquidityPools: BasicPoolInfo[] = [];\n\n    for (const itemAmmPool of ammPools) {\n      if (\n        (itemAmmPool.mintA.equals(inputMint) && itemAmmPool.mintB.equals(outputMint)) ||\n        (itemAmmPool.mintA.equals(outputMint) && itemAmmPool.mintB.equals(inputMint))\n      ) {\n        directPath.push(itemAmmPool);\n        needSimulate[itemAmmPool.id.toBase58()] = itemAmmPool;\n        addLiquidityPools.push(itemAmmPool);\n      }\n      if (itemAmmPool.mintA.equals(inputMint)) {\n        if (routePathDict[itemAmmPool.mintB.toBase58()] === undefined)\n          routePathDict[itemAmmPool.mintB.toBase58()] = {\n            mintProgram: TOKEN_PROGRAM_ID,\n            in: [],\n            out: [],\n            mDecimals: 0, // to fetch later\n          };\n        routePathDict[itemAmmPool.mintB.toBase58()].in.push(itemAmmPool);\n      }\n      if (itemAmmPool.mintB.equals(inputMint)) {\n        if (routePathDict[itemAmmPool.mintA.toBase58()] === undefined)\n          routePathDict[itemAmmPool.mintA.toBase58()] = {\n            mintProgram: TOKEN_PROGRAM_ID,\n            in: [],\n            out: [],\n            mDecimals: 0, // to fetch later\n          };\n        routePathDict[itemAmmPool.mintA.toBase58()].in.push(itemAmmPool);\n      }\n      if (itemAmmPool.mintA.equals(outputMint)) {\n        if (routePathDict[itemAmmPool.mintB.toBase58()] === undefined)\n          routePathDict[itemAmmPool.mintB.toBase58()] = {\n            mintProgram: TOKEN_PROGRAM_ID,\n            in: [],\n            out: [],\n            mDecimals: 0, // to fetch later\n          };\n        routePathDict[itemAmmPool.mintB.toBase58()].out.push(itemAmmPool);\n      }\n      if (itemAmmPool.mintB.equals(outputMint)) {\n        if (routePathDict[itemAmmPool.mintA.toBase58()] === undefined)\n          routePathDict[itemAmmPool.mintA.toBase58()] = {\n            mintProgram: TOKEN_PROGRAM_ID,\n            in: [],\n            out: [],\n            mDecimals: 0, // to fetch later\n          };\n        routePathDict[itemAmmPool.mintA.toBase58()].out.push(itemAmmPool);\n      }\n    }\n\n    for (const itemCpmmPool of cpmmPools) {\n      if (\n        (itemCpmmPool.mintA.equals(inputMint) && itemCpmmPool.mintB.equals(outputMint)) ||\n        (itemCpmmPool.mintA.equals(outputMint) && itemCpmmPool.mintB.equals(inputMint))\n      ) {\n        directPath.push(itemCpmmPool);\n        cpmmPoolList[itemCpmmPool.id.toBase58()] = itemCpmmPool;\n      }\n      if (itemCpmmPool.mintA.equals(inputMint)) {\n        if (routePathDict[itemCpmmPool.mintB.toBase58()] === undefined)\n          routePathDict[itemCpmmPool.mintB.toBase58()] = {\n            mintProgram: TOKEN_PROGRAM_ID,\n            in: [],\n            out: [],\n            mDecimals: 0, // to fetch later\n          };\n        routePathDict[itemCpmmPool.mintB.toBase58()].in.push(itemCpmmPool);\n      }\n      if (itemCpmmPool.mintB.equals(inputMint)) {\n        if (routePathDict[itemCpmmPool.mintA.toBase58()] === undefined)\n          routePathDict[itemCpmmPool.mintA.toBase58()] = {\n            mintProgram: TOKEN_PROGRAM_ID,\n            in: [],\n            out: [],\n            mDecimals: 0, // to fetch later\n          };\n        routePathDict[itemCpmmPool.mintA.toBase58()].in.push(itemCpmmPool);\n      }\n      if (itemCpmmPool.mintA.equals(outputMint)) {\n        if (routePathDict[itemCpmmPool.mintB.toBase58()] === undefined)\n          routePathDict[itemCpmmPool.mintB.toBase58()] = {\n            mintProgram: TOKEN_PROGRAM_ID,\n            in: [],\n            out: [],\n            mDecimals: 0, // to fetch later\n          };\n        routePathDict[itemCpmmPool.mintB.toBase58()].out.push(itemCpmmPool);\n      }\n      if (itemCpmmPool.mintB.equals(outputMint)) {\n        if (routePathDict[itemCpmmPool.mintA.toBase58()] === undefined)\n          routePathDict[itemCpmmPool.mintA.toBase58()] = {\n            mintProgram: TOKEN_PROGRAM_ID,\n            in: [],\n            out: [],\n            mDecimals: 0, // to fetch later\n          };\n        routePathDict[itemCpmmPool.mintA.toBase58()].out.push(itemCpmmPool);\n      }\n    }\n\n    for (const t of Object.keys(routePathDict)) {\n      if (\n        routePathDict[t].in.length === 1 &&\n        routePathDict[t].out.length === 1 &&\n        routePathDict[t].in[0].id.equals(routePathDict[t].out[0].id)\n      ) {\n        delete routePathDict[t];\n        continue;\n      }\n      if (routePathDict[t].in.length === 0 || routePathDict[t].out.length === 0) {\n        delete routePathDict[t];\n        continue;\n      }\n\n      const info = routePathDict[t];\n\n      for (const infoIn of info.in) {\n        for (const infoOut of info.out) {\n          if (infoIn.version === 6 && needTickArray[infoIn.id.toString()] === undefined) {\n            needTickArray[infoIn.id.toString()] = infoIn;\n          } else if (infoIn.version === 7 && cpmmPools[infoIn.id.toString()] === undefined) {\n            cpmmPoolList[infoIn.id.toString()] = infoIn;\n          } else if (\n            (infoIn.version === 4 || infoIn.version === 5) &&\n            needSimulate[infoIn.id.toString()] === undefined\n          ) {\n            needSimulate[infoIn.id.toString()] = infoIn;\n          }\n          if (infoOut.version === 6 && needTickArray[infoOut.id.toString()] === undefined) {\n            needTickArray[infoOut.id.toString()] = infoOut;\n          } else if (infoOut.version === 7 && cpmmPools[infoOut.id.toString()] === undefined) {\n            cpmmPoolList[infoOut.id.toString()] = infoOut;\n          } else if (\n            (infoOut.version === 4 || infoOut.version === 5) &&\n            needSimulate[infoOut.id.toString()] === undefined\n          ) {\n            needSimulate[infoOut.id.toString()] = infoOut;\n          }\n        }\n      }\n    }\n\n    return {\n      directPath,\n      addLiquidityPools,\n      routePathDict,\n      needSimulate: Object.values(needSimulate),\n      needTickArray: Object.values(needTickArray),\n      cpmmPoolList: Object.values(cpmmPoolList),\n    };\n  }\n\n  // fetch pools detail info in route\n  public async fetchSwapRoutesData({\n    routes,\n    inputMint,\n    outputMint,\n  }: {\n    inputMint: string | PublicKey;\n    outputMint: string | PublicKey;\n    routes: ReturnTypeGetAllRoute;\n  }): Promise<{\n    mintInfos: ReturnTypeFetchMultipleMintInfos;\n    ammPoolsRpcInfo: Record<string, AmmRpcData>;\n    ammSimulateCache: Record<string, ComputeAmountOutParam[\"poolInfo\"]>;\n    clmmPoolsRpcInfo: Record<string, ClmmRpcData>;\n    computeClmmPoolInfo: Record<string, ComputeClmmPoolInfo>;\n    computePoolTickData: ReturnTypeFetchMultiplePoolTickArrays;\n    computeCpmmData: Record<string, CpmmComputeData>;\n    routePathDict: ComputeRoutePathType;\n  }> {\n    const mintSet = new Set([\n      ...routes.needTickArray.map((p) => [p.mintA.toBase58(), p.mintB.toBase58()]).flat(),\n      inputMint.toString(),\n      outputMint.toString(),\n    ]);\n\n    console.log(\"fetching amm pools info, total: \", routes.needSimulate.length);\n    const ammPoolsRpcInfo = await this.scope.liquidity.getRpcPoolInfos(routes.needSimulate.map((p) => p.id));\n    const ammSimulateCache = toAmmComputePoolInfo(ammPoolsRpcInfo);\n\n    let mintInfos: ReturnTypeFetchMultipleMintInfos = {};\n    // amm doesn't support token2022 yet, so don't need to fetch mint info\n    Object.values(ammSimulateCache).forEach((p) => {\n      mintSet.delete(p.mintA.address);\n      mintInfos[p.mintA.address] = {\n        address: new PublicKey(p.mintA.address),\n        programId: TOKEN_PROGRAM_ID,\n        mintAuthority: null,\n        supply: BigInt(0),\n        decimals: p.mintA.decimals,\n        isInitialized: true,\n        freezeAuthority: null,\n        tlvData: Buffer.from(\"0\", \"hex\"),\n        feeConfig: undefined,\n      };\n\n      mintSet.delete(p.mintB.address);\n      mintInfos[p.mintB.address] = {\n        address: new PublicKey(p.mintB.address),\n        programId: TOKEN_PROGRAM_ID,\n        mintAuthority: null,\n        supply: BigInt(0),\n        decimals: p.mintB.decimals,\n        isInitialized: true,\n        freezeAuthority: null,\n        tlvData: Buffer.from(\"0\", \"hex\"),\n        feeConfig: undefined,\n      };\n    });\n\n    console.log(\"fetching cpmm pools info, total: \", routes.cpmmPoolList.length);\n    const cpmmPoolsRpcInfo = await this.scope.cpmm.getRpcPoolInfos(\n      routes.cpmmPoolList.map((p) => p.id.toBase58()),\n      true,\n    );\n\n    Object.values(cpmmPoolsRpcInfo).forEach((p) => {\n      const [mintA, mintB] = [p.mintA.toBase58(), p.mintB.toBase58()];\n      if (p.mintProgramA.equals(TOKEN_PROGRAM_ID)) {\n        mintSet.delete(mintA);\n        mintInfos[mintA] = {\n          address: p.mintA,\n          programId: p.mintProgramA,\n          mintAuthority: null,\n          supply: BigInt(0),\n          decimals: p.mintDecimalA,\n          isInitialized: true,\n          freezeAuthority: null,\n          tlvData: Buffer.from(\"0\", \"hex\"),\n          feeConfig: undefined,\n        };\n      } else mintSet.add(mintA); // 2022, need to fetch fee config\n      if (p.mintProgramB.equals(TOKEN_PROGRAM_ID)) {\n        mintSet.delete(mintB);\n        mintInfos[mintB] = {\n          address: p.mintB,\n          programId: p.mintProgramB,\n          mintAuthority: null,\n          supply: BigInt(0),\n          decimals: p.mintDecimalB,\n          isInitialized: true,\n          freezeAuthority: null,\n          tlvData: Buffer.from(\"0\", \"hex\"),\n          feeConfig: undefined,\n        };\n      } else mintSet.add(mintB); // 2022, need to fetch fee config\n    });\n\n    console.log(\"fetching mints info, total: \", mintSet.size);\n    const fetchMintInfoRes = await fetchMultipleMintInfos({\n      connection: this.scope.connection,\n      mints: Array.from(mintSet).map((m) => new PublicKey(m)),\n    });\n\n    mintInfos = {\n      ...mintInfos,\n      ...fetchMintInfoRes,\n    };\n\n    const computeCpmmData = this.scope.cpmm.toComputePoolInfos({\n      pools: cpmmPoolsRpcInfo,\n      mintInfos,\n    });\n\n    console.log(\"fetching clmm pools info, total:\", routes.needTickArray.length);\n    const clmmPoolsRpcInfo = await this.scope.clmm.getRpcClmmPoolInfos({\n      poolIds: routes.needTickArray.map((p) => p.id),\n    });\n    const { computeClmmPoolInfo, computePoolTickData } = await this.scope.clmm.getComputeClmmPoolInfos({\n      clmmPoolsRpcInfo,\n      mintInfos,\n    });\n\n    // update route pool mint info\n    const routePathDict = Object.keys(routes.routePathDict).reduce((acc, cur) => {\n      return {\n        ...acc,\n        [cur]: {\n          ...routes.routePathDict[cur],\n          mintProgram: mintInfos[cur].programId,\n          mDecimals: mintInfos[cur].decimals,\n          in: routes.routePathDict[cur].in.map(\n            (p) =>\n              ammSimulateCache[p.id.toBase58()] ||\n              computeClmmPoolInfo[p.id.toBase58()] ||\n              computeCpmmData[p.id.toBase58()],\n          ),\n          out: routes.routePathDict[cur].out.map(\n            (p) =>\n              ammSimulateCache[p.id.toBase58()] ||\n              computeClmmPoolInfo[p.id.toBase58()] ||\n              computeCpmmData[p.id.toBase58()],\n          ),\n        },\n      };\n    }, {} as ComputeRoutePathType);\n\n    return {\n      mintInfos,\n\n      ammPoolsRpcInfo,\n      ammSimulateCache,\n\n      clmmPoolsRpcInfo,\n      computeClmmPoolInfo,\n      computePoolTickData,\n\n      computeCpmmData,\n\n      routePathDict,\n    };\n  }\n\n  // compute amount from routes\n  public getAllRouteComputeAmountOut({\n    inputTokenAmount,\n    outputToken: propOutputToken,\n    directPath,\n    routePathDict,\n    simulateCache,\n    tickCache,\n    slippage,\n    chainTime,\n    epochInfo,\n    feeConfig,\n  }: {\n    directPath: ComputePoolType[];\n    routePathDict: ComputeRoutePathType;\n    simulateCache: ReturnTypeFetchMultipleInfo;\n    tickCache: ReturnTypeFetchMultiplePoolTickArrays;\n\n    mintInfos: ReturnTypeFetchMultipleMintInfos;\n\n    inputTokenAmount: TokenAmount;\n    outputToken: ApiV3Token;\n    slippage: number;\n    chainTime: number;\n    epochInfo: EpochInfo;\n\n    feeConfig?: {\n      feeBps: BN;\n      feeAccount: PublicKey;\n    };\n  }): ComputeAmountOutLayout[] {\n    const _amountInFee =\n      feeConfig === undefined\n        ? new BN(0)\n        : inputTokenAmount.raw.mul(new BN(feeConfig.feeBps.toNumber())).div(new BN(10000));\n    const _amoutIn = inputTokenAmount.raw.sub(_amountInFee);\n    const amountIn = new TokenAmount(inputTokenAmount.token, _amoutIn);\n    const _inFeeConfig =\n      feeConfig === undefined\n        ? undefined\n        : {\n            feeAmount: _amountInFee,\n            feeAccount: feeConfig.feeAccount,\n          };\n    const outputToken = {\n      ...propOutputToken,\n      address: solToWSol(propOutputToken.address).toString(),\n    };\n    const outRoute: ComputeAmountOutLayout[] = [];\n    for (const itemPool of directPath) {\n      try {\n        outRoute.push({\n          ...this.computeAmountOut({\n            itemPool,\n            tickCache,\n            simulateCache,\n            chainTime,\n            epochInfo,\n            slippage,\n            outputToken,\n            amountIn,\n          }),\n          feeConfig: _inFeeConfig,\n        });\n      } catch (e: any) {\n        this.logDebug(\"direct error\", itemPool.version, itemPool.id.toString(), e.message);\n        /* empty */\n      }\n    }\n    this.logDebug(\"direct done\");\n    for (const [routeMint, info] of Object.entries(routePathDict)) {\n      // const routeToken = new Token(info.mintProgram, routeMint, info.mDecimals);\n      const routeToken = {\n        chainId: 101,\n        address: routeMint,\n        programId: info.mintProgram.toBase58(),\n        logoURI: \"\",\n        symbol: \"\",\n        name: \"\",\n        decimals: info.mDecimals,\n        tags: [],\n        extensions: {},\n      };\n      const maxFirstIn = info.in\n        .map((i) => {\n          try {\n            return {\n              pool: i,\n              data: this.computeAmountOut({\n                itemPool: i,\n                tickCache,\n                simulateCache,\n                chainTime,\n                epochInfo,\n                slippage,\n                outputToken: routeToken,\n                amountIn,\n              }),\n            };\n          } catch (e: any) {\n            this.logDebug(\"route in error\", i.version, i.id.toString(), e.message);\n            return undefined;\n          }\n        })\n        .sort((_a, _b) => {\n          const a = _a === undefined ? ZERO : _a.data.amountOut.amount.raw.sub(_a.data.amountOut.fee?.raw ?? ZERO);\n          const b = _b === undefined ? ZERO : _b.data.amountOut.amount.raw.sub(_b.data.amountOut.fee?.raw ?? ZERO);\n          return a.lt(b) ? 1 : -1;\n        })[0];\n      if (maxFirstIn === undefined) continue;\n      const routeAmountIn = new TokenAmount(\n        toToken(routeToken),\n        maxFirstIn.data.amountOut.amount.raw.sub(maxFirstIn.data.amountOut.fee?.raw ?? ZERO),\n      );\n      for (const iOutPool of info.out) {\n        try {\n          const outC = this.computeAmountOut({\n            itemPool: iOutPool,\n            tickCache,\n            simulateCache,\n            chainTime,\n            epochInfo,\n            slippage,\n            outputToken,\n            amountIn: routeAmountIn,\n          });\n          outRoute.push({\n            ...outC,\n            allTrade: maxFirstIn.data.allTrade && outC.allTrade ? true : false,\n            amountIn: maxFirstIn.data.amountIn,\n            amountOut: outC.amountOut,\n            minAmountOut: outC.minAmountOut,\n            currentPrice: undefined,\n            executionPrice: new Decimal(\n              new Price({\n                baseToken: maxFirstIn.data.amountIn.amount.token,\n                denominator: maxFirstIn.data.amountIn.amount.raw,\n                quoteToken: outC.amountOut.amount.token,\n                numerator: outC.amountOut.amount.raw.sub(outC.amountOut.fee?.raw ?? ZERO),\n              }).toFixed(),\n            ),\n            priceImpact: new Decimal(maxFirstIn.data.priceImpact.add(outC.priceImpact).toFixed()),\n            fee: [maxFirstIn.data.fee[0], outC.fee[0]],\n            routeType: \"route\",\n            poolInfoList: [maxFirstIn.pool, iOutPool],\n            remainingAccounts: [maxFirstIn.data.remainingAccounts[0], outC.remainingAccounts[0]],\n            minMiddleAmountFee: outC.amountOut.fee?.raw\n              ? new TokenAmount(\n                  (maxFirstIn.data.amountOut.amount as TokenAmount).token,\n                  (maxFirstIn.data.amountOut.fee?.raw ?? ZERO).add(outC.amountOut.fee?.raw ?? ZERO),\n                )\n              : undefined,\n            middleToken: (maxFirstIn.data.amountOut.amount as TokenAmount).token,\n            poolReady: maxFirstIn.data.poolReady && outC.poolReady,\n            poolType: [maxFirstIn.data.poolType, outC.poolType],\n            feeConfig: _inFeeConfig,\n            expirationTime: minExpirationTime(maxFirstIn.data.expirationTime, outC.expirationTime),\n          });\n        } catch (e: any) {\n          this.logDebug(\"route out error\", iOutPool.version, iOutPool.id.toString(), e.message);\n          /* empty */\n        }\n      }\n    }\n\n    return outRoute\n      .filter((i) => i.allTrade)\n      .sort((a, b) => (a.amountOut.amount.raw.sub(b.amountOut.amount.raw).gt(ZERO) ? -1 : 1));\n  }\n\n  /** trade related utils */\n\n  private computeAmountOut({\n    itemPool,\n    tickCache,\n    simulateCache,\n    chainTime,\n    epochInfo,\n    slippage,\n    outputToken,\n    amountIn,\n  }: {\n    itemPool: ComputePoolType;\n    tickCache: ReturnTypeFetchMultiplePoolTickArrays;\n    simulateCache: ReturnTypeFetchMultipleInfo;\n    chainTime: number;\n    epochInfo: EpochInfo;\n    amountIn: TokenAmount;\n    outputToken: ApiV3Token;\n    slippage: number;\n  }): ComputeAmountOutAmmLayout {\n    if (itemPool.version === 6) {\n      const {\n        allTrade,\n        realAmountIn,\n        amountOut,\n        minAmountOut,\n        expirationTime,\n        currentPrice,\n        executionPrice,\n        priceImpact,\n        fee,\n        remainingAccounts,\n        executionPriceX64,\n      } = PoolUtils.computeAmountOutFormat({\n        poolInfo: itemPool,\n        tickArrayCache: tickCache[itemPool.id.toString()],\n        amountIn: amountIn.raw,\n        tokenOut: outputToken,\n        slippage,\n        epochInfo,\n        catchLiquidityInsufficient: true,\n      });\n      return {\n        allTrade,\n        amountIn: realAmountIn,\n        amountOut,\n        minAmountOut,\n        currentPrice: new Decimal(currentPrice.toFixed()),\n        executionPrice: new Decimal(executionPrice.toFixed()),\n        priceImpact: new Decimal(priceImpact.toFixed()),\n        fee: [fee],\n        remainingAccounts: [remainingAccounts],\n        routeType: \"amm\",\n        poolInfoList: [itemPool],\n        poolReady: itemPool.startTime < chainTime,\n        poolType: \"CLMM\",\n        slippage,\n        clmmExPriceX64: [executionPriceX64],\n        expirationTime: minExpirationTime(realAmountIn.expirationTime, expirationTime),\n      };\n    } else if (itemPool.version === 7) {\n      const { allTrade, executionPrice, amountOut, minAmountOut, priceImpact, fee } = this.scope.cpmm.computeSwapAmount(\n        {\n          pool: itemPool,\n          outputMint: outputToken.address,\n          amountIn: amountIn.raw,\n          slippage,\n        },\n      );\n\n      return {\n        allTrade,\n        amountIn: { amount: amountIn, fee: undefined, expirationTime: undefined },\n        amountOut: {\n          amount: toTokenAmount({\n            ...outputToken,\n            amount: amountOut,\n          }),\n          fee: undefined,\n          expirationTime: undefined,\n        },\n        minAmountOut: {\n          amount: toTokenAmount({\n            ...outputToken,\n            amount: minAmountOut,\n          }),\n          fee: undefined,\n          expirationTime: undefined,\n        },\n        currentPrice: itemPool.poolPrice,\n        executionPrice,\n        priceImpact,\n        fee: [new TokenAmount(amountIn.token, fee)],\n        remainingAccounts: [],\n        routeType: \"amm\",\n        poolInfoList: [itemPool],\n        poolReady: itemPool.openTime.toNumber() < chainTime,\n        poolType: \"CPMM\",\n        slippage,\n        clmmExPriceX64: [undefined],\n        expirationTime: undefined,\n      };\n    } else {\n      if (![1, 6, 7].includes(simulateCache[itemPool.id.toString()].status)) throw Error(\"swap error\");\n      const { amountOut, minAmountOut, currentPrice, executionPrice, priceImpact, fee } =\n        this.scope.liquidity.computeAmountOut({\n          poolInfo: simulateCache[itemPool.id.toString()],\n          amountIn: amountIn.raw,\n          mintIn: amountIn.token.mint,\n          mintOut: outputToken.address,\n          slippage,\n        });\n      return {\n        amountIn: { amount: amountIn, fee: undefined, expirationTime: undefined },\n        amountOut: {\n          amount: toTokenAmount({\n            ...outputToken,\n            amount: amountOut,\n          }),\n          fee: undefined,\n          expirationTime: undefined,\n        },\n        minAmountOut: {\n          amount: toTokenAmount({\n            ...outputToken,\n            amount: minAmountOut,\n          }),\n          fee: undefined,\n          expirationTime: undefined,\n        },\n        currentPrice,\n        executionPrice,\n        priceImpact,\n        fee: [new TokenAmount(amountIn.token, fee)],\n        routeType: \"amm\",\n        poolInfoList: [itemPool],\n        remainingAccounts: [],\n        poolReady: Number(simulateCache[itemPool.id as string].openTime) < chainTime,\n        poolType: itemPool.version === 5 ? \"STABLE\" : undefined,\n        expirationTime: undefined,\n        allTrade: true,\n        slippage,\n        clmmExPriceX64: [undefined],\n      };\n    }\n  }\n\n  public async computePoolToPoolKeys({\n    pools,\n    clmmRpcData = {},\n    ammRpcData = {},\n  }: {\n    pools: ComputePoolType[];\n    clmmRpcData?: Record<string, ClmmRpcData>;\n    ammRpcData?: Record<string, AmmRpcData>;\n  }): Promise<PoolKeys[]> {\n    const clmmFetchKeys = new Set(\n      pools.filter((p) => p.version === 6 && !clmmRpcData[p.id.toString()]).map((p) => p.id.toString()),\n    );\n    if (clmmFetchKeys.size > 0) {\n      const clmmData = this.scope.clmm.getRpcClmmPoolInfos({ poolIds: Array.from(clmmFetchKeys) });\n      Object.keys(clmmData).forEach((poolId) => {\n        clmmRpcData[poolId] = clmmData[poolId];\n      });\n    }\n\n    const ammFetchKeys = new Set(\n      pools.filter((p) => p.version === 4 && !ammRpcData[p.id.toString()]).map((p) => p.id.toString()),\n    );\n    if (ammFetchKeys.size > 0) {\n      const ammData = this.scope.liquidity.getRpcPoolInfos(Array.from(clmmFetchKeys));\n      Object.keys(ammData).forEach((poolId) => {\n        ammRpcData[poolId] = ammData[poolId];\n      });\n    }\n\n    const ammMarketFetchKeys = new Set(\n      pools.filter((p) => p.version === 4).map((p) => (p as ComputeAmountOutParam[\"poolInfo\"]).marketId),\n    );\n    const marketData: Record<\n      string,\n      {\n        marketProgramId: string;\n        marketId: string;\n        marketAuthority: string;\n        marketBaseVault: string;\n        marketQuoteVault: string;\n        marketBids: string;\n        marketAsks: string;\n        marketEventQueue: string;\n      }\n    > = {};\n    if (ammMarketFetchKeys.size > 0) {\n      const marketAccount = await getMultipleAccountsInfoWithCustomFlags(\n        this.scope.connection,\n        Array.from(ammMarketFetchKeys).map((p) => ({ pubkey: new PublicKey(p) })),\n      );\n      marketAccount.forEach((m) => {\n        if (!m.accountInfo) return;\n        const itemMarketInfo = MARKET_STATE_LAYOUT_V3.decode(m.accountInfo.data);\n        marketData[m.pubkey.toBase58()] = {\n          marketId: m.pubkey.toString(),\n          marketProgramId: m.accountInfo.owner.toString(),\n          marketAuthority: Market.getAssociatedAuthority({\n            programId: m.accountInfo.owner,\n            marketId: m.pubkey,\n          }).publicKey.toString(),\n          marketBaseVault: itemMarketInfo.baseVault.toString(),\n          marketQuoteVault: itemMarketInfo.quoteVault.toString(),\n          marketBids: itemMarketInfo.bids.toString(),\n          marketAsks: itemMarketInfo.asks.toString(),\n          marketEventQueue: itemMarketInfo.eventQueue.toString(),\n        };\n      });\n    }\n\n    const poolKeys: PoolKeys[] = [];\n    pools.forEach((pool) => {\n      if (pool.version === 6) {\n        const rpcInfo = clmmRpcData[pool.id.toString()];\n        const clmmKeys: ClmmKeys = {\n          programId: pool.programId.toBase58(),\n          id: pool.id.toBase58(),\n          mintA: pool.mintA,\n          mintB: pool.mintB,\n          openTime: String(pool.startTime),\n          vault: {\n            A: rpcInfo.vaultA.toBase58(),\n            B: rpcInfo.vaultB.toBase58(),\n          },\n          config: {\n            ...pool.ammConfig,\n            id: pool.ammConfig.id.toString(),\n            defaultRange: 0,\n            defaultRangePoint: [],\n          },\n          rewardInfos: [],\n        };\n        poolKeys.push(clmmKeys);\n      } else if (pool.version === 4) {\n        const rpcInfo = ammRpcData[pool.id.toString()];\n        const ammKeys: AmmV4Keys = {\n          programId: pool.programId,\n          id: pool.id,\n          mintA: pool.mintA,\n          mintB: pool.mintB,\n          openTime: String(pool.openTime),\n          vault: {\n            A: rpcInfo.baseVault.toBase58(),\n            B: rpcInfo.quoteVault.toBase58(),\n          },\n          authority: getLiquidityAssociatedAuthority({ programId: new PublicKey(pool.programId) }).publicKey.toString(),\n          openOrders: rpcInfo.openOrders.toBase58(),\n          targetOrders: rpcInfo.targetOrders.toBase58(),\n          mintLp: pool.lpMint,\n          ...marketData[pool.marketId],\n        };\n        poolKeys.push(ammKeys);\n      } else if (pool.version === 7) {\n        poolKeys.push({\n          programId: pool.programId.toBase58(),\n          id: pool.id.toBase58(),\n          mintA: pool.mintA,\n          mintB: pool.mintB,\n          openTime: String(pool.openTime),\n          authority: getPdaPoolAuthority(pool.programId).publicKey.toBase58(),\n          vault: {\n            A: pool.vaultA.toBase58(),\n            B: pool.vaultB.toBase58(),\n          },\n          mintLp: toApiV3Token({\n            address: pool.mintLp.toBase58(),\n            programId: TOKEN_PROGRAM_ID.toBase58(),\n            decimals: pool.lpDecimals,\n          }),\n          config: {\n            id: pool.configId.toBase58(),\n            ...pool.configInfo,\n            protocolFeeRate: pool.configInfo.protocolFeeRate.toNumber(),\n            tradeFeeRate: pool.configInfo.tradeFeeRate.toNumber(),\n            fundFeeRate: pool.configInfo.fundFeeRate.toNumber(),\n            createPoolFee: pool.configInfo.createPoolFee.toString(),\n          },\n        });\n      }\n    });\n    return poolKeys;\n  }\n}\n","import { TOKEN_PROGRAM_ID, TOKEN_2022_PROGRAM_ID, ASSOCIATED_TOKEN_PROGRAM_ID } from \"@solana/spl-token\";\nimport { PublicKey, TransactionInstruction, SystemProgram } from \"@solana/web3.js\";\nimport BN from \"bn.js\";\n\nimport {\n  ClmmInstrument,\n  ONE,\n  MIN_SQRT_PRICE_X64,\n  MAX_SQRT_PRICE_X64,\n  MIN_SQRT_PRICE_X64_ADD_ONE,\n  MAX_SQRT_PRICE_X64_SUB_ONE,\n  getPdaExBitmapAccount,\n} from \"../clmm\";\nimport {\n  InstructionType,\n  jsonInfo2PoolKeys,\n  MEMO_PROGRAM_ID,\n  MEMO_PROGRAM_ID2,\n  LIQUIDITY_POOL_PROGRAM_ID_V5_MODEL,\n  accountMeta,\n} from \"@/common\";\nimport { struct, u64, u8, seq, u128 } from \"@/marshmallow\";\nimport { makeAMMSwapInstruction } from \"../liquidity/instruction\";\n\nimport { ApiV3PoolInfoItem, PoolKeys, ClmmKeys, AmmV4Keys, AmmV5Keys, CpmmKeys } from \"@/api/type\";\nimport { ComputePoolType, MakeSwapInstructionParam, ReturnTypeMakeSwapInstruction } from \"./type\";\nimport { makeSwapCpmmBaseInInInstruction, makeSwapCpmmBaseOutInInstruction } from \"@/raydium/cpmm\";\n\nexport function route1Instruction(\n  programId: PublicKey,\n  poolInfoA: ApiV3PoolInfoItem,\n  poolKeyA: PoolKeys,\n  poolKeyB: PoolKeys,\n\n  userSourceToken: PublicKey,\n  userRouteToken: PublicKey,\n  // userDestinationToken: PublicKey,\n  userPdaAccount: PublicKey,\n  ownerWallet: PublicKey,\n\n  inputMint: PublicKey,\n\n  amountIn: BN,\n  amountOut: BN,\n\n  tickArrayA?: PublicKey[],\n  // tickArrayB?: PublicKey[],\n): TransactionInstruction {\n  const dataLayout = struct([u8(\"instruction\"), u64(\"amountIn\"), u64(\"amountOut\")]);\n\n  const keys: { pubkey: PublicKey; isSigner: boolean; isWritable: boolean }[] = [\n    { pubkey: SystemProgram.programId, isSigner: false, isWritable: false },\n    { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },\n    { pubkey: new PublicKey(poolKeyA.programId), isSigner: false, isWritable: false },\n    { pubkey: new PublicKey(poolKeyA.id), isSigner: false, isWritable: true },\n    { pubkey: new PublicKey(poolKeyB.id), isSigner: false, isWritable: true },\n\n    { pubkey: userSourceToken, isSigner: false, isWritable: true },\n    { pubkey: userRouteToken, isSigner: false, isWritable: true },\n    { pubkey: userPdaAccount, isSigner: false, isWritable: true },\n    { pubkey: ownerWallet, isSigner: true, isWritable: false },\n  ];\n\n  if (poolInfoA.type === \"Concentrated\") {\n    const poolKey = jsonInfo2PoolKeys(poolKeyA as ClmmKeys);\n    keys.push(\n      ...[\n        { pubkey: poolKey.config.id, isSigner: false, isWritable: false },\n        { pubkey: poolKey.id, isSigner: false, isWritable: true },\n        {\n          pubkey: poolKey.mintA.address.equals(inputMint) ? poolKey.vault.A : poolKey.vault.B,\n          isSigner: false,\n          isWritable: true,\n        },\n        {\n          pubkey: poolKey.mintA.address.equals(inputMint) ? poolKey.vault.B : poolKey.vault.A,\n          isSigner: false,\n          isWritable: true,\n        },\n        // { pubkey: poolKey.observationId, isSigner: false, isWritable: true }, // to do\n        { pubkey: poolKey.id, isSigner: false, isWritable: true },\n        ...tickArrayA!.map((i) => ({ pubkey: i, isSigner: false, isWritable: true })),\n      ],\n    );\n  } else if (poolInfoA.pooltype.includes(\"StablePool\")) {\n    const poolKey = jsonInfo2PoolKeys(poolKeyA as AmmV5Keys);\n    keys.push(\n      ...[\n        { pubkey: poolKey.authority, isSigner: false, isWritable: false },\n        { pubkey: poolKey.marketProgramId, isSigner: false, isWritable: false },\n        { pubkey: poolKey.id, isSigner: false, isWritable: true },\n        { pubkey: new PublicKey(\"CDSr3ssLcRB6XYPJwAfFt18MZvEZp4LjHcvzBVZ45duo\"), isSigner: false, isWritable: false },\n        { pubkey: poolKey.openOrders, isSigner: false, isWritable: true },\n        { pubkey: poolKey.vault.A, isSigner: false, isWritable: true },\n        { pubkey: poolKey.vault.B, isSigner: false, isWritable: true },\n        { pubkey: poolKey.marketId, isSigner: false, isWritable: true },\n        { pubkey: poolKey.marketBids, isSigner: false, isWritable: true },\n        { pubkey: poolKey.marketAsks, isSigner: false, isWritable: true },\n        { pubkey: poolKey.marketEventQueue, isSigner: false, isWritable: true },\n        { pubkey: poolKey.id, isSigner: false, isWritable: true },\n        { pubkey: poolKey.id, isSigner: false, isWritable: true },\n      ],\n    );\n  } else {\n    const poolKey = jsonInfo2PoolKeys(poolKeyA as AmmV4Keys);\n    keys.push(\n      ...[\n        { pubkey: poolKey.authority, isSigner: false, isWritable: false },\n        { pubkey: poolKey.marketProgramId, isSigner: false, isWritable: false },\n        { pubkey: poolKey.marketAuthority, isSigner: false, isWritable: false },\n        { pubkey: poolKey.openOrders, isSigner: false, isWritable: true },\n        { pubkey: poolKey.vault.A, isSigner: false, isWritable: true },\n        { pubkey: poolKey.vault.B, isSigner: false, isWritable: true },\n        { pubkey: poolKey.marketId, isSigner: false, isWritable: true },\n        { pubkey: poolKey.marketBids, isSigner: false, isWritable: true },\n        { pubkey: poolKey.marketAsks, isSigner: false, isWritable: true },\n        { pubkey: poolKey.marketEventQueue, isSigner: false, isWritable: true },\n        ...(poolKey.marketProgramId.toString() === \"srmqPvymJeFKQ4zGQed1GFppgkRHL9kaELCbyksJtPX\"\n          ? [\n              { pubkey: poolKey.marketBaseVault, isSigner: false, isWritable: true },\n              { pubkey: poolKey.marketQuoteVault, isSigner: false, isWritable: true },\n            ]\n          : [\n              { pubkey: poolKey.id, isSigner: false, isWritable: true },\n              { pubkey: poolKey.id, isSigner: false, isWritable: true },\n            ]),\n      ],\n    );\n  }\n\n  const data = Buffer.alloc(dataLayout.span);\n  dataLayout.encode(\n    {\n      instruction: 4,\n      amountIn,\n      amountOut,\n    },\n    data,\n  );\n\n  return new TransactionInstruction({\n    keys,\n    programId,\n    data,\n  });\n}\n\nexport function route2Instruction(\n  programId: PublicKey,\n  poolInfoB: ApiV3PoolInfoItem,\n  poolKeyA: PoolKeys,\n  poolKeyB: PoolKeys,\n\n  // userSourceToken: PublicKey,\n  userRouteToken: PublicKey,\n  userDestinationToken: PublicKey,\n  userPdaAccount: PublicKey,\n  ownerWallet: PublicKey,\n\n  routeMint: PublicKey,\n\n  // tickArrayA?: PublicKey[],\n  tickArrayB?: PublicKey[],\n): TransactionInstruction {\n  const dataLayout = struct([u8(\"instruction\")]);\n\n  const keys: { pubkey: PublicKey; isSigner: boolean; isWritable: boolean }[] = [\n    { pubkey: SystemProgram.programId, isSigner: false, isWritable: false },\n    { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },\n    { pubkey: new PublicKey(String(poolKeyB.programId)), isSigner: false, isWritable: false },\n    { pubkey: new PublicKey(String(poolKeyB.id)), isSigner: false, isWritable: true },\n    { pubkey: new PublicKey(String(poolKeyA.id)), isSigner: false, isWritable: true },\n\n    { pubkey: userRouteToken, isSigner: false, isWritable: true },\n    { pubkey: userDestinationToken, isSigner: false, isWritable: true },\n    { pubkey: userPdaAccount, isSigner: false, isWritable: true },\n    { pubkey: ownerWallet, isSigner: true, isWritable: false },\n  ];\n\n  if (poolInfoB.type === \"Concentrated\") {\n    const poolKey = jsonInfo2PoolKeys(poolKeyB as ClmmKeys);\n    keys.push(\n      ...[\n        { pubkey: poolKey.config.id, isSigner: false, isWritable: false },\n        { pubkey: poolKey.id, isSigner: false, isWritable: true },\n        {\n          pubkey: poolKey.mintA.address.equals(routeMint) ? poolKey.vault.A : poolKey.vault.B,\n          isSigner: false,\n          isWritable: true,\n        },\n        {\n          pubkey: poolKey.mintA.address.equals(routeMint) ? poolKey.vault.B : poolKey.vault.A,\n          isSigner: false,\n          isWritable: true,\n        },\n        // { pubkey: poolKey.observationId, isSigner: false, isWritable: true }, // to do\n        { pubkey: poolKey.id, isSigner: false, isWritable: true },\n        ...tickArrayB!.map((i) => ({ pubkey: i, isSigner: false, isWritable: true })),\n      ],\n    );\n  } else if (poolInfoB.pooltype.includes(\"StablePool\")) {\n    const poolKey = jsonInfo2PoolKeys(poolKeyB as AmmV5Keys);\n    keys.push(\n      ...[\n        { pubkey: poolKey.authority, isSigner: false, isWritable: false },\n        { pubkey: poolKey.marketProgramId, isSigner: false, isWritable: false },\n        { pubkey: poolKey.id, isSigner: false, isWritable: true },\n        { pubkey: new PublicKey(\"CDSr3ssLcRB6XYPJwAfFt18MZvEZp4LjHcvzBVZ45duo\"), isSigner: false, isWritable: false },\n        { pubkey: poolKey.openOrders, isSigner: false, isWritable: true },\n        { pubkey: poolKey.vault.A, isSigner: false, isWritable: true },\n        { pubkey: poolKey.vault.B, isSigner: false, isWritable: true },\n        { pubkey: poolKey.marketId, isSigner: false, isWritable: true },\n        { pubkey: poolKey.marketBids, isSigner: false, isWritable: true },\n        { pubkey: poolKey.marketAsks, isSigner: false, isWritable: true },\n        { pubkey: poolKey.marketEventQueue, isSigner: false, isWritable: true },\n        { pubkey: poolKey.id, isSigner: false, isWritable: true },\n        { pubkey: poolKey.id, isSigner: false, isWritable: true },\n      ],\n    );\n  } else {\n    const poolKey = jsonInfo2PoolKeys(poolKeyB as AmmV4Keys);\n    keys.push(\n      ...[\n        { pubkey: poolKey.authority, isSigner: false, isWritable: false },\n        { pubkey: poolKey.marketProgramId, isSigner: false, isWritable: false },\n        { pubkey: poolKey.marketAuthority, isSigner: false, isWritable: false },\n        { pubkey: poolKey.openOrders, isSigner: false, isWritable: true },\n        { pubkey: poolKey.vault.A, isSigner: false, isWritable: true },\n        { pubkey: poolKey.vault.B, isSigner: false, isWritable: true },\n        { pubkey: poolKey.marketId, isSigner: false, isWritable: true },\n        { pubkey: poolKey.marketBids, isSigner: false, isWritable: true },\n        { pubkey: poolKey.marketAsks, isSigner: false, isWritable: true },\n        { pubkey: poolKey.marketEventQueue, isSigner: false, isWritable: true },\n        ...(poolKey.marketProgramId.toString() === \"srmqPvymJeFKQ4zGQed1GFppgkRHL9kaELCbyksJtPX\"\n          ? [\n              { pubkey: poolKey.marketBaseVault, isSigner: false, isWritable: true },\n              { pubkey: poolKey.marketQuoteVault, isSigner: false, isWritable: true },\n            ]\n          : [\n              { pubkey: poolKey.id, isSigner: false, isWritable: true },\n              { pubkey: poolKey.id, isSigner: false, isWritable: true },\n            ]),\n      ],\n    );\n  }\n\n  const data = Buffer.alloc(dataLayout.span);\n  dataLayout.encode(\n    {\n      instruction: 5,\n    },\n    data,\n  );\n\n  return new TransactionInstruction({\n    keys,\n    programId,\n    data,\n  });\n}\n\n/*\nfunction makeInnerInsKey(\n  itemPool: ComputePoolType,\n  itemPoolKey: PoolKeys,\n  inMint: string,\n  userInAccount: PublicKey,\n  userOutAccount: PublicKey,\n  remainingAccount: PublicKey[] | undefined,\n): AccountMeta[] {\n  if (itemPool.version === 4) {\n    const poolKey = jsonInfo2PoolKeys(itemPoolKey as AmmV4Keys);\n\n    return [\n      { pubkey: poolKey.programId, isSigner: false, isWritable: false },\n      { pubkey: userInAccount, isSigner: false, isWritable: true },\n      { pubkey: userOutAccount, isSigner: false, isWritable: true },\n\n      { pubkey: poolKey.id, isSigner: false, isWritable: true },\n      { pubkey: poolKey.authority, isSigner: false, isWritable: false },\n      { pubkey: poolKey.marketProgramId, isSigner: false, isWritable: false },\n      { pubkey: poolKey.marketAuthority, isSigner: false, isWritable: true },\n\n      { pubkey: poolKey.openOrders, isSigner: false, isWritable: true },\n      { pubkey: poolKey.vault.A, isSigner: false, isWritable: true },\n      { pubkey: poolKey.vault.B, isSigner: false, isWritable: true },\n      { pubkey: poolKey.marketId, isSigner: false, isWritable: true },\n      { pubkey: poolKey.marketBids, isSigner: false, isWritable: true },\n      { pubkey: poolKey.marketAsks, isSigner: false, isWritable: true },\n      { pubkey: poolKey.marketEventQueue, isSigner: false, isWritable: true },\n      ...(poolKey.marketProgramId.toString() === \"srmqPvymJeFKQ4zGQed1GFppgkRHL9kaELCbyksJtPX\"\n        ? [\n            { pubkey: poolKey.marketBaseVault, isSigner: false, isWritable: true },\n            { pubkey: poolKey.marketQuoteVault, isSigner: false, isWritable: true },\n          ]\n        : [\n            { pubkey: poolKey.id, isSigner: false, isWritable: true },\n            { pubkey: poolKey.id, isSigner: false, isWritable: true },\n          ]),\n    ];\n  } else if (itemPool.version === 5) {\n    const poolKey = jsonInfo2PoolKeys(itemPoolKey as AmmV4Keys);\n\n    return [\n      { pubkey: poolKey.programId, isSigner: false, isWritable: false },\n      { pubkey: userInAccount, isSigner: false, isWritable: true },\n      { pubkey: userOutAccount, isSigner: false, isWritable: true },\n\n      { pubkey: poolKey.id, isSigner: false, isWritable: true },\n      { pubkey: poolKey.authority, isSigner: false, isWritable: false },\n      { pubkey: poolKey.marketProgramId, isSigner: false, isWritable: false },\n      { pubkey: poolKey.id, isSigner: false, isWritable: true },\n      { pubkey: new PublicKey(\"CDSr3ssLcRB6XYPJwAfFt18MZvEZp4LjHcvzBVZ45duo\"), isSigner: false, isWritable: false },\n      { pubkey: poolKey.openOrders, isSigner: false, isWritable: true },\n      { pubkey: poolKey.vault.A, isSigner: false, isWritable: true },\n      { pubkey: poolKey.vault.B, isSigner: false, isWritable: true },\n      { pubkey: poolKey.marketId, isSigner: false, isWritable: true },\n      { pubkey: poolKey.marketBids, isSigner: false, isWritable: true },\n      { pubkey: poolKey.marketAsks, isSigner: false, isWritable: true },\n      { pubkey: poolKey.marketEventQueue, isSigner: false, isWritable: true },\n      { pubkey: poolKey.id, isSigner: false, isWritable: true },\n      { pubkey: poolKey.id, isSigner: false, isWritable: true },\n    ];\n  } else if (itemPool.version === 6) {\n    const pool = itemPool;\n    const poolKey = jsonInfo2PoolKeys(itemPoolKey as ClmmKeys);\n    const baseIn = pool.mintA.address === inMint;\n    return [\n      { pubkey: new PublicKey(String(itemPool.programId)), isSigner: false, isWritable: false },\n      { pubkey: userInAccount, isSigner: false, isWritable: true },\n      { pubkey: userOutAccount, isSigner: false, isWritable: true },\n      { pubkey: poolKey.config.id, isSigner: false, isWritable: false },\n      { pubkey: poolKey.id, isSigner: false, isWritable: true },\n      { pubkey: baseIn ? poolKey.vault.A : poolKey.vault.B, isSigner: false, isWritable: true },\n      { pubkey: baseIn ? poolKey.vault.B : poolKey.vault.A, isSigner: false, isWritable: true },\n      { pubkey: itemPool.observationId, isSigner: false, isWritable: true },\n      ...(poolKey.mintA.programId.equals(TOKEN_2022_PROGRAM_ID) || poolKey.mintB.programId.equals(TOKEN_2022_PROGRAM_ID)\n        ? [\n            { pubkey: TOKEN_2022_PROGRAM_ID, isSigner: false, isWritable: false },\n            { pubkey: MEMO_PROGRAM_ID, isSigner: false, isWritable: false },\n            { pubkey: baseIn ? poolKey.mintA.address : poolKey.mintB.address, isSigner: false, isWritable: false },\n            { pubkey: baseIn ? poolKey.mintB.address : poolKey.mintA.address, isSigner: false, isWritable: false },\n          ]\n        : []),\n      ...(remainingAccount ?? []).map((i) => ({ pubkey: i, isSigner: false, isWritable: true })),\n      {\n        pubkey: getPdaExBitmapAccount(new PublicKey(String(itemPool.programId)), new PublicKey(itemPool.id)).publicKey,\n        isSigner: false,\n        isWritable: true,\n      },\n    ];\n  } else if (itemPool.version === 7) {\n    const pool = itemPool;\n    const poolKey = jsonInfo2PoolKeys(itemPoolKey as CpmmKeys);\n    const baseIn = pool.mintA.address === inMint;\n    return [\n      { pubkey: new PublicKey(String(itemPool.programId)), isSigner: false, isWritable: false },\n      { pubkey: userInAccount, isSigner: false, isWritable: true },\n      { pubkey: userOutAccount, isSigner: false, isWritable: true },\n      { pubkey: poolKey.config.id, isSigner: false, isWritable: false },\n      { pubkey: poolKey.id, isSigner: false, isWritable: true },\n      { pubkey: baseIn ? poolKey.vault.A : poolKey.vault.B, isSigner: false, isWritable: true },\n      { pubkey: baseIn ? poolKey.vault.B : poolKey.vault.A, isSigner: false, isWritable: true },\n      { pubkey: itemPool.observationId, isSigner: false, isWritable: true },\n      ...(poolKey.mintA.programId.equals(TOKEN_2022_PROGRAM_ID) || poolKey.mintB.programId.equals(TOKEN_2022_PROGRAM_ID)\n        ? [\n            { pubkey: TOKEN_2022_PROGRAM_ID, isSigner: false, isWritable: false },\n            { pubkey: MEMO_PROGRAM_ID, isSigner: false, isWritable: false },\n            { pubkey: baseIn ? poolKey.mintA.address : poolKey.mintB.address, isSigner: false, isWritable: false },\n            { pubkey: baseIn ? poolKey.mintB.address : poolKey.mintA.address, isSigner: false, isWritable: false },\n          ]\n        : []),\n      ...(remainingAccount ?? []).map((i) => ({ pubkey: i, isSigner: false, isWritable: true })),\n      {\n        pubkey: getPdaExBitmapAccount(new PublicKey(String(itemPool.programId)), new PublicKey(itemPool.id)).publicKey,\n        isSigner: false,\n        isWritable: true,\n      },\n    ];\n  } else {\n    throw Error(\"make swap ins error\");\n  }\n}\n*/\n\nexport function routeInstruction(\n  programId: PublicKey,\n  wallet: PublicKey,\n\n  userSourceToken: PublicKey,\n  userRouteToken: PublicKey,\n  userDestinationToken: PublicKey,\n\n  inputMint: string,\n  routeMint: string,\n  outputMint: string,\n\n  poolInfoA: ComputePoolType,\n  poolInfoB: ComputePoolType,\n\n  poolKeyA: PoolKeys,\n  poolKeyB: PoolKeys,\n\n  amountIn: BN,\n  amountOut: BN,\n\n  remainingAccounts: (PublicKey[] | undefined)[],\n): TransactionInstruction {\n  const clmmPriceLimit: BN[] = [];\n  const keys = [\n    accountMeta({ pubkey: TOKEN_PROGRAM_ID, isWritable: false }),\n    accountMeta({ pubkey: TOKEN_2022_PROGRAM_ID, isWritable: false }),\n    accountMeta({ pubkey: ASSOCIATED_TOKEN_PROGRAM_ID, isWritable: false }),\n    accountMeta({ pubkey: SystemProgram.programId, isWritable: false }),\n    accountMeta({ pubkey: wallet, isSigner: true }),\n  ];\n\n  keys.push(accountMeta({ pubkey: userSourceToken }));\n  keys.push(accountMeta({ pubkey: userDestinationToken }));\n\n  const poolInfos = [poolInfoA, poolInfoB];\n  const poolKeys = [poolKeyA, poolKeyB];\n  const routeMints = [inputMint, routeMint, outputMint];\n\n  for (let index = 0; index < poolInfos.length; index++) {\n    const _poolInfo = poolInfos[index];\n    const inputIsA = routeMints[index] === _poolInfo.mintA.address;\n    keys.push(accountMeta({ pubkey: new PublicKey(_poolInfo.programId), isWritable: false }));\n    if (index === poolInfos.length - 1) {\n      keys.push(accountMeta({ pubkey: userDestinationToken }));\n    } else {\n      keys.push(accountMeta({ pubkey: userRouteToken }));\n    }\n    keys.push(accountMeta({ pubkey: new PublicKey(routeMints[index]) }));\n    keys.push(accountMeta({ pubkey: new PublicKey(routeMints[index + 1]) }));\n    if (_poolInfo.version === 6) {\n      const _poolKey = poolKeys[index] as ClmmKeys;\n\n      keys.push(accountMeta({ pubkey: new PublicKey(_poolKey.config.id) }));\n      keys.push(accountMeta({ pubkey: new PublicKey(_poolKey.id) }));\n      keys.push(accountMeta({ pubkey: new PublicKey(inputIsA ? _poolKey.vault.A : _poolKey.vault.B) }));\n      keys.push(accountMeta({ pubkey: new PublicKey(inputIsA ? _poolKey.vault.B : _poolKey.vault.A) }));\n      keys.push(accountMeta({ pubkey: new PublicKey(_poolInfo.observationId) })); //todo\n      keys.push(accountMeta({ pubkey: MEMO_PROGRAM_ID2 }));\n      keys.push(\n        accountMeta({\n          pubkey: getPdaExBitmapAccount(new PublicKey(_poolInfo.programId), new PublicKey(_poolInfo.id)).publicKey,\n        }),\n      );\n      clmmPriceLimit.push(clmmPriceLimitX64InsData(_poolInfo.sqrtPriceX64.toString(), inputIsA));\n      for (const item of remainingAccounts[index] ?? []) {\n        keys.push(accountMeta({ pubkey: new PublicKey(item) }));\n      }\n    } else if (_poolInfo.version === 5) {\n      const _poolKey = poolKeys[index] as AmmV5Keys;\n      keys.push(accountMeta({ pubkey: new PublicKey(_poolKey.id) }));\n      keys.push(accountMeta({ pubkey: new PublicKey(_poolKey.authority), isWritable: false }));\n      keys.push(accountMeta({ pubkey: new PublicKey(_poolKey.marketProgramId) }));\n      keys.push(accountMeta({ pubkey: new PublicKey(_poolKey.marketAuthority) }));\n      keys.push(accountMeta({ pubkey: LIQUIDITY_POOL_PROGRAM_ID_V5_MODEL, isWritable: false }));\n      keys.push(accountMeta({ pubkey: new PublicKey(_poolKey.openOrders) }));\n      keys.push(accountMeta({ pubkey: new PublicKey(_poolKey.vault.A) }));\n      keys.push(accountMeta({ pubkey: new PublicKey(_poolKey.vault.B) }));\n      keys.push(accountMeta({ pubkey: new PublicKey(_poolKey.id) }));\n      keys.push(accountMeta({ pubkey: new PublicKey(_poolKey.id) }));\n      keys.push(accountMeta({ pubkey: new PublicKey(_poolKey.id) }));\n      keys.push(accountMeta({ pubkey: new PublicKey(_poolKey.id) }));\n      keys.push(accountMeta({ pubkey: new PublicKey(_poolKey.id) }));\n      keys.push(accountMeta({ pubkey: new PublicKey(_poolKey.id) }));\n      keys.push(accountMeta({ pubkey: new PublicKey(_poolKey.marketId) }));\n      keys.push(accountMeta({ pubkey: new PublicKey(_poolKey.marketBids) }));\n      keys.push(accountMeta({ pubkey: new PublicKey(_poolKey.marketAsks) }));\n      keys.push(accountMeta({ pubkey: new PublicKey(_poolKey.marketEventQueue) }));\n      keys.push(accountMeta({ pubkey: new PublicKey(_poolKey.marketBaseVault) }));\n      keys.push(accountMeta({ pubkey: new PublicKey(_poolKey.marketQuoteVault) }));\n    } else if (_poolInfo.version === 4) {\n      const _poolKey = poolKeys[index] as AmmV4Keys;\n      const isSupportIdOnly = _poolInfo.status !== 1;\n      keys.push(accountMeta({ pubkey: new PublicKey(_poolKey.id) }));\n      keys.push(accountMeta({ pubkey: new PublicKey(_poolKey.authority), isWritable: false }));\n      keys.push(accountMeta({ pubkey: new PublicKey(isSupportIdOnly ? _poolKey.id : _poolKey.marketProgramId) }));\n      keys.push(accountMeta({ pubkey: new PublicKey(isSupportIdOnly ? _poolKey.id : _poolKey.marketAuthority) }));\n      keys.push(accountMeta({ pubkey: new PublicKey(isSupportIdOnly ? _poolKey.id : _poolKey.openOrders) }));\n      keys.push(accountMeta({ pubkey: new PublicKey(_poolKey.vault.A) }));\n      keys.push(accountMeta({ pubkey: new PublicKey(_poolKey.vault.B) }));\n      keys.push(accountMeta({ pubkey: new PublicKey(isSupportIdOnly ? _poolKey.id : _poolKey.marketId) }));\n      keys.push(accountMeta({ pubkey: new PublicKey(isSupportIdOnly ? _poolKey.id : _poolKey.marketBids) }));\n      keys.push(accountMeta({ pubkey: new PublicKey(isSupportIdOnly ? _poolKey.id : _poolKey.marketAsks) }));\n      keys.push(accountMeta({ pubkey: new PublicKey(isSupportIdOnly ? _poolKey.id : _poolKey.marketEventQueue) }));\n      keys.push(accountMeta({ pubkey: new PublicKey(isSupportIdOnly ? _poolKey.id : _poolKey.marketBaseVault) }));\n      keys.push(accountMeta({ pubkey: new PublicKey(isSupportIdOnly ? _poolKey.id : _poolKey.marketQuoteVault) }));\n    } else if (_poolInfo.version === 7) {\n      const _poolKey = poolKeys[index] as CpmmKeys;\n      keys.push(accountMeta({ pubkey: new PublicKey(_poolKey.authority) }));\n      keys.push(accountMeta({ pubkey: new PublicKey(_poolKey.config.id) }));\n      keys.push(accountMeta({ pubkey: new PublicKey(_poolKey.id) }));\n      keys.push(accountMeta({ pubkey: new PublicKey(inputIsA ? _poolKey.vault.A : _poolKey.vault.B) }));\n      keys.push(accountMeta({ pubkey: new PublicKey(inputIsA ? _poolKey.vault.B : _poolKey.vault.A) }));\n      keys.push(accountMeta({ pubkey: new PublicKey(_poolInfo.observationId) }));\n    } else throw Error(\"pool type error\");\n  }\n\n  const dataLayout = struct([\n    u8(\"insId\"),\n    u64(\"amountIn\"),\n    u64(\"amountOut\"),\n    seq(u128(), clmmPriceLimit.length, \"clmmPriceLimit\"),\n  ]);\n  const data = Buffer.alloc(dataLayout.span);\n  dataLayout.encode(\n    {\n      insId: 0,\n      amountIn,\n      amountOut,\n      clmmPriceLimit,\n    },\n    data,\n  );\n  return new TransactionInstruction({\n    keys,\n    programId,\n    data,\n  });\n}\n\nfunction clmmPriceLimitX64InsData(x64Price: string | undefined, inputIsA: boolean): BN {\n  if (x64Price) {\n    if (inputIsA) {\n      const _m = new BN(x64Price).div(new BN(25));\n      return _m.gt(MIN_SQRT_PRICE_X64_ADD_ONE) ? _m : MIN_SQRT_PRICE_X64_ADD_ONE;\n    } else {\n      const _m = new BN(x64Price).mul(new BN(25));\n      return _m.lt(MAX_SQRT_PRICE_X64_SUB_ONE) ? _m : MAX_SQRT_PRICE_X64_SUB_ONE;\n    }\n  } else {\n    return inputIsA ? MIN_SQRT_PRICE_X64_ADD_ONE : MAX_SQRT_PRICE_X64_SUB_ONE;\n  }\n}\n\nexport function makeSwapInstruction({\n  routeProgram,\n  ownerInfo,\n  inputMint,\n  swapInfo,\n}: MakeSwapInstructionParam): ReturnTypeMakeSwapInstruction {\n  if (swapInfo.routeType === \"amm\") {\n    if (swapInfo.poolInfo[0].version === 6) {\n      const poolKeys = swapInfo.poolKey[0] as ClmmKeys;\n      const _poolKey = jsonInfo2PoolKeys(poolKeys);\n      const sqrtPriceLimitX64 = inputMint.equals(_poolKey.mintA.address)\n        ? MIN_SQRT_PRICE_X64.add(ONE)\n        : MAX_SQRT_PRICE_X64.sub(ONE);\n\n      return ClmmInstrument.makeSwapBaseInInstructions({\n        poolInfo: poolKeys,\n        poolKeys,\n        observationId: swapInfo.poolInfo[0].observationId,\n        ownerInfo: {\n          wallet: ownerInfo.wallet,\n          tokenAccountA: _poolKey.mintA.address.equals(inputMint) ? ownerInfo.sourceToken : ownerInfo.destinationToken,\n          tokenAccountB: _poolKey.mintA.address.equals(inputMint) ? ownerInfo.destinationToken : ownerInfo.sourceToken,\n        },\n        inputMint,\n        amountIn: swapInfo.amountIn.amount.raw,\n        amountOutMin: swapInfo.minAmountOut.amount.raw.sub(swapInfo.minAmountOut.fee?.raw ?? new BN(0)),\n        sqrtPriceLimitX64,\n        remainingAccounts: swapInfo.remainingAccounts[0] ?? [],\n      });\n    } else if (swapInfo.poolInfo[0].version === 7) {\n      const poolInfo = swapInfo.poolInfo[0];\n      const baseIn = inputMint.toString() === swapInfo.poolInfo[0].mintA.address;\n\n      return {\n        signers: [],\n        instructions: [\n          baseIn\n            ? makeSwapCpmmBaseInInInstruction(\n                poolInfo.programId,\n                ownerInfo.wallet,\n                poolInfo.authority,\n                poolInfo.configId,\n                poolInfo.id,\n                ownerInfo.sourceToken!,\n                ownerInfo.destinationToken!,\n                poolInfo.vaultA,\n                poolInfo.vaultB,\n                poolInfo.mintProgramA,\n                poolInfo.mintProgramA,\n                new PublicKey(poolInfo.mintA.address),\n                new PublicKey(poolInfo.mintB.address),\n                poolInfo.observationId,\n\n                swapInfo.amountIn.amount.raw,\n                swapInfo.minAmountOut.amount.raw,\n              )\n            : makeSwapCpmmBaseOutInInstruction(\n                poolInfo.programId,\n                ownerInfo.wallet,\n                poolInfo.authority,\n                poolInfo.configId,\n                poolInfo.id,\n\n                ownerInfo.destinationToken!,\n                ownerInfo.sourceToken!,\n\n                poolInfo.vaultB,\n                poolInfo.vaultA,\n\n                poolInfo.mintProgramB,\n                poolInfo.mintProgramA,\n\n                new PublicKey(poolInfo.mintB.address),\n                new PublicKey(poolInfo.mintA.address),\n\n                poolInfo.observationId,\n\n                swapInfo.amountIn.amount.raw,\n                swapInfo.minAmountOut.amount.raw,\n              ),\n        ],\n        lookupTableAddress: [],\n        instructionTypes: [baseIn ? InstructionType.CpmmSwapBaseIn : InstructionType.CpmmSwapBaseOut],\n        address: {},\n      };\n    } else {\n      const _poolKey = swapInfo.poolKey[0] as AmmV4Keys | AmmV5Keys;\n\n      return {\n        signers: [],\n        instructions: [\n          makeAMMSwapInstruction({\n            poolKeys: _poolKey,\n            version: swapInfo.poolInfo[0].pooltype.includes(\"StablePool\") ? 5 : 4,\n            userKeys: {\n              tokenAccountIn: ownerInfo.sourceToken,\n              tokenAccountOut: ownerInfo.destinationToken,\n              owner: ownerInfo.wallet,\n            },\n            amountIn: swapInfo.amountIn.amount.raw,\n            amountOut: swapInfo.minAmountOut.amount.raw.sub(swapInfo.minAmountOut.fee?.raw ?? new BN(0)),\n            fixedSide: \"in\",\n          }),\n        ],\n        lookupTableAddress: _poolKey.lookupTableAccount ? [_poolKey.lookupTableAccount] : [],\n        instructionTypes: [\n          swapInfo.poolInfo[0].pooltype.includes(\"StablePool\")\n            ? InstructionType.AmmV5SwapBaseIn\n            : InstructionType.AmmV4SwapBaseIn,\n        ],\n        address: {},\n      };\n    }\n  } else if (swapInfo.routeType === \"route\") {\n    const poolInfo1 = swapInfo.poolInfo[0];\n    const poolInfo2 = swapInfo.poolInfo[1];\n    const poolKey1 = swapInfo.poolKey[0];\n    const poolKey2 = swapInfo.poolKey[1];\n\n    if (ownerInfo.routeToken === undefined) throw Error(\"owner route token account check error\");\n\n    return {\n      signers: [],\n      instructions: [\n        routeInstruction(\n          routeProgram,\n          ownerInfo.wallet,\n          ownerInfo.sourceToken,\n          ownerInfo.routeToken,\n          ownerInfo.destinationToken,\n\n          inputMint.toString(),\n          swapInfo.middleToken.mint.toString(),\n          swapInfo.outputMint.toString(),\n\n          poolInfo1,\n          poolInfo2,\n          poolKey1,\n          poolKey2,\n\n          swapInfo.amountIn.amount.raw,\n          swapInfo.minAmountOut.amount.raw.sub(swapInfo.minAmountOut.fee?.raw ?? new BN(0)),\n\n          swapInfo.remainingAccounts,\n        ),\n      ],\n      instructionTypes: [InstructionType.RouteSwap],\n      lookupTableAddress: [poolKey1.lookupTableAccount, poolKey2.lookupTableAccount].filter(\n        (a) => a !== undefined,\n      ) as string[],\n      address: {},\n    };\n  } else {\n    throw Error(\"route type error\");\n  }\n}\n","import { PublicKey } from \"@solana/web3.js\";\nimport { SERUM_PROGRAM_ID_V3 } from \"@/common/programId\";\nimport { SerumVersion } from \"./type\";\n\n// serum program id string => serum version\nexport const SERUM_PROGRAMID_TO_VERSION: {\n  [key: string]: SerumVersion;\n} = {\n  [SERUM_PROGRAM_ID_V3.toBase58()]: 3,\n};\n\n// serum version => serum program id\nexport const SERUM_VERSION_TO_PROGRAMID: { [key in SerumVersion]?: PublicKey } & {\n  [K: number]: PublicKey;\n} = {\n  3: SERUM_PROGRAM_ID_V3,\n};\n","import { blob, GetStructureSchema, publicKey, struct, u64 } from \"@/marshmallow\";\n\n/* ================= state layouts ================= */\nexport const MARKET_STATE_LAYOUT_V3 = struct([\n  blob(5),\n\n  blob(8), // accountFlagsLayout('accountFlags'),\n\n  publicKey(\"ownAddress\"),\n\n  u64(\"vaultSignerNonce\"),\n\n  publicKey(\"baseMint\"),\n  publicKey(\"quoteMint\"),\n\n  publicKey(\"baseVault\"),\n  u64(\"baseDepositsTotal\"),\n  u64(\"baseFeesAccrued\"),\n\n  publicKey(\"quoteVault\"),\n  u64(\"quoteDepositsTotal\"),\n  u64(\"quoteFeesAccrued\"),\n\n  u64(\"quoteDustThreshold\"),\n\n  publicKey(\"requestQueue\"),\n  publicKey(\"eventQueue\"),\n\n  publicKey(\"bids\"),\n  publicKey(\"asks\"),\n\n  u64(\"baseLotSize\"),\n  u64(\"quoteLotSize\"),\n\n  u64(\"feeRateBps\"),\n\n  u64(\"referrerRebatesAccrued\"),\n\n  blob(7),\n]);\n\nexport type MarketStateLayoutV3 = typeof MARKET_STATE_LAYOUT_V3;\nexport type MarketStateLayout = MarketStateLayoutV3;\n\nexport type MarketStateV3 = GetStructureSchema<MarketStateLayoutV3>;\nexport type MarketState = MarketStateV3;\n\n/* ================= index ================= */\n// version => market state layout\nexport const MARKET_VERSION_TO_STATE_LAYOUT: {\n  [version: number]: MarketStateLayout;\n} = {\n  3: MARKET_STATE_LAYOUT_V3,\n};\n","import { PublicKey } from \"@solana/web3.js\";\n\nimport { createLogger } from \"@/common/logger\";\n\nimport { SERUM_PROGRAMID_TO_VERSION, SERUM_VERSION_TO_PROGRAMID } from \"./id\";\nimport { MARKET_VERSION_TO_STATE_LAYOUT, MarketStateLayout } from \"./layout\";\n\nconst logger = createLogger(\"Serum\");\n\nexport class Market {\n  /* ================= get version and program id ================= */\n  static getProgramId(version: number): PublicKey {\n    const programId = SERUM_VERSION_TO_PROGRAMID[version];\n    if (!programId) logger.logWithError(\"invalid version\", \"version\", version);\n\n    return programId;\n  }\n\n  static getVersion(programId: PublicKey): number {\n    const programIdString = programId.toBase58();\n\n    const version = SERUM_PROGRAMID_TO_VERSION[programIdString];\n    if (!version) logger.logWithError(\"invalid program id\", \"programId\", programIdString);\n\n    return version;\n  }\n\n  /* ================= get layout ================= */\n  static getStateLayout(version: number): MarketStateLayout {\n    const STATE_LAYOUT = MARKET_VERSION_TO_STATE_LAYOUT[version];\n    if (!STATE_LAYOUT) logger.logWithError(!!STATE_LAYOUT, \"invalid version\", \"version\", version);\n\n    return STATE_LAYOUT;\n  }\n\n  static getLayouts(version: number): { state: MarketStateLayout } {\n    return { state: this.getStateLayout(version) };\n  }\n\n  /* ================= get key ================= */\n  static getAssociatedAuthority({ programId, marketId }: { programId: PublicKey; marketId: PublicKey }): {\n    publicKey: PublicKey;\n    nonce: number;\n  } {\n    const seeds = [marketId.toBuffer()];\n\n    let nonce = 0;\n    let publicKey: PublicKey;\n\n    while (nonce < 100) {\n      try {\n        const seedsWithNonce = seeds.concat(Buffer.from([nonce]), Buffer.alloc(7));\n        publicKey = PublicKey.createProgramAddressSync(seedsWithNonce, programId);\n      } catch (err) {\n        if (err instanceof TypeError) {\n          throw err;\n        }\n        nonce++;\n        continue;\n      }\n      return { publicKey, nonce };\n    }\n\n    logger.logWithError(\"unable to find a viable program address nonce\", \"params\", {\n      programId,\n      marketId,\n    });\n\n    return { publicKey: PublicKey.default, nonce };\n  }\n}\n","import { TOKEN_PROGRAM_ID } from \"@solana/spl-token\";\nimport { Connection, PublicKey, Signer, Transaction, TransactionInstruction } from \"@solana/web3.js\";\nimport BN from \"bn.js\";\nimport ModuleBase from \"../moduleBase\";\nimport { findProgramAddress, forecastTransactionSize, getMultipleAccountsInfo } from \"@/common\";\nimport { Token } from \"@/module\";\nimport { blob, publicKey, seq, struct, u64, u8 } from \"@/marshmallow\";\n\nexport interface SHOW_INFO {\n  programId: PublicKey;\n  poolId: PublicKey;\n  ammId: PublicKey;\n  ownerAccountId: PublicKey;\n  snapshotLpAmount: BN;\n\n  openTime: number;\n  endTime: number;\n\n  project: typeof Utils1216.VERSION_PROJECT[number];\n\n  canClaim: boolean;\n  canClaimErrorType: canClaimErrorType;\n\n  tokenInfo: {\n    mintAddress: PublicKey;\n    mintVault: PublicKey;\n    mintDecimals: number;\n    perLpLoss: BN;\n    debtAmount: BN;\n  }[];\n}\n\nexport type canClaimErrorType = \"outOfOperationalTime\" | \"alreadyClaimIt\" | undefined;\n\nexport default class Utils1216 extends ModuleBase {\n  static CLAIMED_NUM = 3;\n  static POOL_LAYOUT = struct([\n    blob(8),\n    u8(\"bump\"),\n    u8(\"status\"),\n    u64(\"openTime\"),\n    u64(\"endTime\"),\n    publicKey(\"ammId\"),\n\n    seq(\n      struct([\n        u8(\"mintDecimals\"),\n        publicKey(\"mintAddress\"),\n        publicKey(\"mintVault\"),\n        u64(\"perLpLoss\"),\n        u64(\"totalClaimedAmount\"),\n      ]),\n      Utils1216.CLAIMED_NUM,\n      \"tokenInfo\",\n    ),\n    seq(u64(), 10, \"padding\"),\n  ]);\n\n  static OWNER_LAYOUT = struct([\n    blob(8),\n    u8(\"bump\"),\n    u8(\"version\"),\n    publicKey(\"poolId\"),\n    publicKey(\"owner\"),\n    u64(\"lpAmount\"),\n\n    seq(\n      struct([publicKey(\"mintAddress\"), u64(\"debtAmount\"), u64(\"claimedAmount\")]),\n      Utils1216.CLAIMED_NUM,\n      \"tokenInfo\",\n    ),\n    seq(u64(), 4, \"padding\"),\n  ]);\n\n  static DEFAULT_POOL_ID = [\n    \"58oQChx4yWmvKdwLLZzBi4ChoCc2fqCUWBkwMihLYQo2\",\n    \"6UmmUiYoBjSrhakAobJw8BvkmJtDVxaeBtbt7rxWo1mg\",\n    \"AVs9TA4nWDzfPJE9gGVNJMVhcQy3V9PGazuz33BfG2RA\",\n    \"DVa7Qmb5ct9RCpaU7UTpSaf3GVMYz17vNVU67XpdCRut\",\n    \"7XawhbbxtsRcQA8KTkHT9f9nc6d69UwqCDh6U5EEbEmX\",\n    \"6a1CsrpeZubDjEJE9s1CMVheB6HWM5d7m1cj2jkhyXhj\",\n    \"EoNrn8iUhwgJySD1pHu8Qxm5gSQqLK3za4m8xzD2RuEb\",\n    \"AceAyRTWt4PyB2pHqf2qhDgNZDtKVNaxgL8Ru3V4aN1P\",\n    \"6tmFJbMk5yVHFcFy7X2K8RwHjKLr6KVFLYXpgpBNeAxB\",\n  ].map((i) => new PublicKey(i));\n\n  static SEED_CONFIG = {\n    pool: {\n      id: Buffer.from(\"pool_seed\", \"utf8\"),\n    },\n    owner: {\n      id: Buffer.from(\"user_claim_seed\", \"utf8\"),\n    },\n  };\n\n  static VERSION_PROJECT = [undefined, \"Francium\", \"Tulip\", \"Larix\"] as const;\n\n  // pda\n  static getPdaPoolId(\n    programId: PublicKey,\n    ammId: PublicKey,\n  ): {\n    publicKey: PublicKey;\n    nonce: number;\n  } {\n    return findProgramAddress([Utils1216.SEED_CONFIG.pool.id, ammId.toBuffer()], programId);\n  }\n\n  static getPdaOwnerId(\n    programId: PublicKey,\n    poolId: PublicKey,\n    owner: PublicKey,\n    version: number,\n  ): {\n    publicKey: PublicKey;\n    nonce: number;\n  } {\n    return findProgramAddress(\n      [\n        Utils1216.SEED_CONFIG.owner.id,\n        poolId.toBuffer(),\n        owner.toBuffer(),\n        // new BN(version).toBuffer()\n        Buffer.from(new BN(version).toArray()),\n      ],\n      programId,\n    );\n  }\n\n  static async getAllInfo({\n    connection,\n    programId,\n    poolIds,\n    wallet,\n    chainTime,\n  }: {\n    connection: Connection;\n    programId: PublicKey;\n    poolIds: PublicKey[];\n    wallet: PublicKey;\n    chainTime: number;\n  }): Promise<SHOW_INFO[]> {\n    if (poolIds.length === 0) return [];\n\n    const allPoolPda = poolIds.map((id) => Utils1216.getPdaPoolId(programId, id).publicKey);\n\n    const allOwnerPda: PublicKey[] = [];\n    for (let itemVersion = 0; itemVersion < Utils1216.VERSION_PROJECT.length; itemVersion++) {\n      allOwnerPda.push(\n        ...allPoolPda.map((id) => Utils1216.getPdaOwnerId(programId, id, wallet, itemVersion).publicKey),\n      );\n    }\n\n    const pdaInfo = await getMultipleAccountsInfo(connection, [...allPoolPda, ...allOwnerPda]);\n\n    const info: SHOW_INFO[] = [];\n    for (let index = 0; index < pdaInfo.length; index++) {\n      const version = Math.floor(index / poolIds.length);\n      const i = index % poolIds.length;\n\n      const itemPoolId = allPoolPda[i];\n      const itemOwnerId = allOwnerPda[index];\n      const itemPoolInfoS = pdaInfo[i];\n      const itemOwnerInfoS = pdaInfo[poolIds.length + index];\n      if (!(itemPoolInfoS && itemOwnerInfoS)) continue;\n      if (\n        itemPoolInfoS.data.length !== Utils1216.POOL_LAYOUT.span ||\n        itemOwnerInfoS.data.length !== Utils1216.OWNER_LAYOUT.span\n      )\n        continue;\n\n      const itemPoolInfo = Utils1216.POOL_LAYOUT.decode(itemPoolInfoS.data);\n      const itemOwnerInfo = Utils1216.OWNER_LAYOUT.decode(itemOwnerInfoS.data);\n\n      const openTime = itemPoolInfo.openTime.toNumber();\n      const endTime = itemPoolInfo.endTime.toNumber();\n\n      const hasCanClaimToken =\n        itemOwnerInfo.tokenInfo.map((i) => i.debtAmount.gt(new BN(0))).filter((i) => !i).length !== 3;\n      const inCanClaimTime = chainTime > openTime && chainTime < endTime && itemPoolInfo.status === 1;\n\n      const canClaim = hasCanClaimToken && inCanClaimTime;\n\n      info.push({\n        programId,\n        poolId: itemPoolId,\n        ammId: itemPoolInfo.ammId,\n        ownerAccountId: itemOwnerId,\n        snapshotLpAmount: itemOwnerInfo.lpAmount,\n\n        project: Utils1216.VERSION_PROJECT[version],\n\n        openTime,\n        endTime,\n\n        canClaim,\n        canClaimErrorType: !hasCanClaimToken ? \"alreadyClaimIt\" : !inCanClaimTime ? \"outOfOperationalTime\" : undefined,\n\n        tokenInfo: itemPoolInfo.tokenInfo.map((itemPoolToken, i) => ({\n          mintAddress: itemPoolToken.mintAddress,\n          mintVault: itemPoolToken.mintVault,\n          mintDecimals: itemPoolToken.mintDecimals,\n          perLpLoss: itemPoolToken.perLpLoss,\n          debtAmount: itemOwnerInfo.tokenInfo[i].debtAmount.add(itemOwnerInfo.tokenInfo[i].claimedAmount),\n        })),\n      });\n    }\n\n    return info;\n  }\n\n  public async makeClaimTransaction({\n    poolInfo,\n    ownerInfo,\n  }: {\n    connection: Connection;\n    poolInfo: SHOW_INFO;\n    ownerInfo: {\n      wallet?: PublicKey;\n      associatedOnly: boolean;\n    };\n  }): Promise<\n    {\n      transaction: Transaction;\n      signer: Signer[];\n    }[]\n  > {\n    if (!ownerInfo.wallet) this.scope.checkOwner();\n    const txBuilder = this.createTxBuilder();\n    const wallet = ownerInfo.wallet || this.scope.ownerPubKey;\n\n    const ownerVaultList: PublicKey[] = [];\n    for (const itemToken of poolInfo.tokenInfo) {\n      const { account, instructionParams } = await this.scope.account.getOrCreateTokenAccount({\n        mint: itemToken.mintAddress,\n        owner: this.scope.ownerPubKey,\n        notUseTokenAccount: itemToken.mintAddress.equals(Token.WSOL.mint),\n        createInfo: {\n          payer: wallet,\n          amount: 0,\n        },\n        skipCloseAccount: !itemToken.mintAddress.equals(Token.WSOL.mint),\n\n        associatedOnly: itemToken.mintAddress.equals(Token.WSOL.mint) ? false : ownerInfo.associatedOnly,\n      });\n      instructionParams && txBuilder.addInstruction(instructionParams);\n      ownerVaultList.push(account!);\n    }\n\n    txBuilder.addInstruction({\n      instructions: [\n        Utils1216.makeClaimInstruction({\n          programId: poolInfo.programId,\n          poolInfo,\n          ownerInfo: {\n            wallet,\n            ownerPda: poolInfo.ownerAccountId,\n            claimAddress: ownerVaultList,\n          },\n        }),\n      ],\n    });\n    const { transaction, signers } = txBuilder.build();\n\n    return [\n      {\n        transaction,\n        signer: signers,\n      },\n    ];\n  }\n\n  public async makeClaimAllTransaction({\n    poolInfos,\n    ownerInfo,\n  }: {\n    poolInfos: SHOW_INFO[];\n    ownerInfo: {\n      wallet?: PublicKey;\n      associatedOnly: boolean;\n    };\n  }): Promise<\n    {\n      transaction: Transaction;\n      signer: Signer[];\n    }[]\n  > {\n    const txBuilder = this.createTxBuilder();\n    const wallet = ownerInfo.wallet || this.scope.ownerPubKey;\n\n    const tempNewVault: { [mint: string]: PublicKey } = {};\n\n    for (const poolInfo of poolInfos) {\n      const ownerVaultList: PublicKey[] = [];\n      for (const itemToken of poolInfo.tokenInfo) {\n        const { account: tempVault, instructionParams } = await this.scope.account.getOrCreateTokenAccount({\n          mint: itemToken.mintAddress,\n          owner: this.scope.ownerPubKey,\n          notUseTokenAccount: itemToken.mintAddress.equals(Token.WSOL.mint),\n          createInfo: {\n            payer: wallet,\n            amount: 0,\n          },\n          skipCloseAccount: !itemToken.mintAddress.equals(Token.WSOL.mint),\n\n          associatedOnly: itemToken.mintAddress.equals(Token.WSOL.mint) ? false : ownerInfo.associatedOnly,\n        });\n        instructionParams && txBuilder.addInstruction(instructionParams);\n\n        if (tempVault) {\n          tempNewVault[itemToken.mintAddress.toString()] = tempVault;\n          ownerVaultList.push(tempVault);\n        }\n      }\n\n      txBuilder.addInstruction({\n        instructions: [\n          Utils1216.makeClaimInstruction({\n            programId: poolInfo.programId,\n            poolInfo,\n            ownerInfo: {\n              wallet,\n              ownerPda: poolInfo.ownerAccountId,\n              claimAddress: ownerVaultList,\n            },\n          }),\n        ],\n      });\n    }\n\n    const { transaction, signers } = txBuilder.build();\n    const instructions = txBuilder.allInstructions;\n\n    if (forecastTransactionSize(instructions, [wallet, ...signers.map((s) => s.publicKey)])) {\n      return [\n        {\n          transaction,\n          signer: signers,\n        },\n      ];\n    } else {\n      return [\n        {\n          transaction: new Transaction().add(...instructions.slice(0, txBuilder.AllTxData.instructions.length - 1)),\n          signer: signers,\n        },\n        {\n          transaction: new Transaction().add(...instructions.slice(txBuilder.AllTxData.instructions.length - 1)),\n          signer: [],\n        },\n        { transaction: new Transaction().add(...txBuilder.AllTxData.endInstructions), signer: [] },\n      ];\n    }\n  }\n\n  static makeClaimInstruction({\n    programId,\n    poolInfo,\n    ownerInfo,\n  }: {\n    programId: PublicKey;\n\n    poolInfo: SHOW_INFO;\n    ownerInfo: {\n      wallet: PublicKey;\n      ownerPda: PublicKey;\n      claimAddress: PublicKey[];\n    };\n  }): TransactionInstruction {\n    const dataLayout = struct([]);\n\n    const keys = [\n      { pubkey: ownerInfo.wallet, isSigner: true, isWritable: true },\n      { pubkey: poolInfo.poolId, isSigner: false, isWritable: true },\n      { pubkey: ownerInfo.ownerPda, isSigner: false, isWritable: true },\n\n      ...ownerInfo.claimAddress.map((i) => ({ pubkey: i, isSigner: false, isWritable: true })),\n      ...poolInfo.tokenInfo.map(({ mintVault }) => ({ pubkey: mintVault, isSigner: false, isWritable: true })),\n\n      { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },\n    ];\n\n    const data = Buffer.alloc(dataLayout.span);\n    dataLayout.encode({}, data);\n    const aData = Buffer.from([...[10, 66, 208, 184, 161, 6, 191, 98], ...data]);\n\n    return new TransactionInstruction({\n      keys,\n      programId,\n      data: aData,\n    });\n  }\n}\n","import { PublicKey } from \"@solana/web3.js\";\nimport { TOKEN_PROGRAM_ID } from \"@solana/spl-token\";\nimport BN from \"bn.js\";\nimport ModuleBase from \"../moduleBase\";\nimport { TxVersion } from \"@/common/txTool/txType\";\nimport { MakeMultiTxData, TxBuildData, TxV0BuildData } from \"@/common/txTool/txTool\";\nimport { generatePubKey } from \"../account/util\";\nimport { BN_ZERO } from \"@/common/bignumber\";\nimport { makeCreateMarketInstruction } from \"./instrument\";\nimport { ComputeBudgetConfig, MakeMultiTransaction } from \"@/raydium/type\";\n\ninterface ExtInfo {\n  address: {\n    marketId: PublicKey;\n    requestQueue: PublicKey;\n    eventQueue: PublicKey;\n    bids: PublicKey;\n    asks: PublicKey;\n    baseVault: PublicKey;\n    quoteVault: PublicKey;\n    baseMint: PublicKey;\n    quoteMin: PublicKey;\n  };\n}\n\nexport default class MarketV2 extends ModuleBase {\n  public async create<T extends TxVersion>({\n    baseInfo,\n    quoteInfo,\n    lotSize, // 1\n    tickSize, // 0.01\n    dexProgramId,\n    txVersion,\n    computeBudgetConfig,\n  }: {\n    baseInfo: {\n      mint: PublicKey;\n      decimals: number;\n    };\n    quoteInfo: {\n      mint: PublicKey;\n      decimals: number;\n    };\n    lotSize: number;\n    tickSize: number;\n    dexProgramId: PublicKey;\n    eventQueue?: PublicKey;\n    requestQueue?: PublicKey;\n    txVersion?: T;\n    computeBudgetConfig?: ComputeBudgetConfig;\n  }): Promise<MakeMultiTxData<T, ExtInfo>> {\n    const wallet = this.scope.ownerPubKey;\n    const market = generatePubKey({ fromPublicKey: wallet, programId: dexProgramId });\n    const requestQueue = generatePubKey({ fromPublicKey: wallet, programId: dexProgramId });\n    const eventQueue = generatePubKey({ fromPublicKey: wallet, programId: dexProgramId });\n    const bids = generatePubKey({ fromPublicKey: wallet, programId: dexProgramId });\n    const asks = generatePubKey({ fromPublicKey: wallet, programId: dexProgramId });\n    const baseVault = generatePubKey({ fromPublicKey: wallet, programId: TOKEN_PROGRAM_ID });\n    const quoteVault = generatePubKey({ fromPublicKey: wallet, programId: TOKEN_PROGRAM_ID });\n    const feeRateBps = 0;\n    const quoteDustThreshold = new BN(100);\n    function getVaultOwnerAndNonce() {\n      const vaultSignerNonce = new BN(0);\n      // eslint-disable-next-line no-constant-condition\n      while (true) {\n        try {\n          const vaultOwner = PublicKey.createProgramAddressSync(\n            [market.publicKey.toBuffer(), vaultSignerNonce.toArrayLike(Buffer, \"le\", 8)],\n            dexProgramId,\n          );\n          return { vaultOwner, vaultSignerNonce };\n        } catch (e) {\n          vaultSignerNonce.iaddn(1);\n          if (vaultSignerNonce.gt(new BN(25555))) throw Error(\"find vault owner error\");\n        }\n      }\n    }\n    const { vaultOwner, vaultSignerNonce } = getVaultOwnerAndNonce();\n    const baseLotSize = new BN(Math.round(10 ** baseInfo.decimals * lotSize));\n    const quoteLotSize = new BN(Math.round(lotSize * 10 ** quoteInfo.decimals * tickSize));\n\n    if (baseLotSize.eq(BN_ZERO)) throw Error(\"lot size is too small\");\n    if (quoteLotSize.eq(BN_ZERO)) throw Error(\"tick size or lot size is too small\");\n    const allTxArr = await makeCreateMarketInstruction({\n      connection: this.scope.connection,\n      wallet: this.scope.ownerPubKey,\n      marketInfo: {\n        programId: dexProgramId,\n        id: market,\n        baseMint: baseInfo.mint,\n        quoteMint: quoteInfo.mint,\n        baseVault,\n        quoteVault,\n        vaultOwner,\n        requestQueue,\n        eventQueue,\n        bids,\n        asks,\n\n        feeRateBps,\n        quoteDustThreshold,\n        vaultSignerNonce,\n        baseLotSize,\n        quoteLotSize,\n      },\n    });\n    const txBuilder = this.createTxBuilder();\n    // txBuilder.addCustomComputeBudget(computeBudgetConfig);\n    txBuilder.addInstruction({\n      instructions: allTxArr[0].transaction.instructions,\n      signers: allTxArr[0].signer,\n    });\n\n    // const extraTxBuildData: any[] = [];\n\n    for await (const txData of allTxArr.slice(1, allTxArr.length)) {\n      // const extraTxBuilder = this.createTxBuilder();\n      // extraTxBuilder.addCustomComputeBudget(computeBudgetConfig);\n      txBuilder.addInstruction({\n        instructions: txData.transaction.instructions,\n        signers: txData.signer,\n        instructionTypes: txData.instructionTypes,\n      });\n\n      // const build = await extraTxBuilder.versionBuild({ txVersion });\n      // extraTxBuildData.push(build);\n    }\n\n    if (txVersion === TxVersion.V0)\n      return txBuilder.sizeCheckBuildV0({\n        computeBudgetConfig,\n        address: {\n          marketId: market.publicKey,\n          requestQueue: requestQueue.publicKey,\n          eventQueue: eventQueue.publicKey,\n          bids: bids.publicKey,\n          asks: asks.publicKey,\n          baseVault: baseVault.publicKey,\n          quoteVault: quoteVault.publicKey,\n          baseMint: new PublicKey(baseInfo.mint),\n          quoteMin: new PublicKey(quoteInfo.mint),\n        },\n      }) as Promise<MakeMultiTxData<T, ExtInfo>>;\n\n    return txBuilder.sizeCheckBuild({\n      computeBudgetConfig,\n      address: {\n        marketId: market.publicKey,\n        requestQueue: requestQueue.publicKey,\n        eventQueue: eventQueue.publicKey,\n        bids: bids.publicKey,\n        asks: asks.publicKey,\n        baseVault: baseVault.publicKey,\n        quoteVault: quoteVault.publicKey,\n        baseMint: new PublicKey(baseInfo.mint),\n        quoteMin: new PublicKey(quoteInfo.mint),\n      },\n    }) as Promise<MakeMultiTxData<T, ExtInfo>>;\n  }\n}\n","import { TransactionInstruction, SYSVAR_RENT_PUBKEY } from \"@solana/web3.js\";\nimport { TOKEN_PROGRAM_ID } from \"@solana/spl-token\";\nimport { createInitializeAccountInstruction } from \"@solana/spl-token\";\nimport { Connection, Keypair, PublicKey, SystemProgram, Transaction } from \"@solana/web3.js\";\nimport BN from \"bn.js\";\nimport { MARKET_STATE_LAYOUT_V2 } from \"./layout\";\nimport { struct, u16, u32, u64, u8 } from \"@/marshmallow\";\nimport { InstructionType } from \"@/common/txTool/txType\";\n\ntype Transactions = {\n  transaction: Transaction;\n  signer?: Keypair[] | undefined;\n  instructionTypes?: string[];\n}[];\n\nexport function initializeMarket({\n  programId,\n  marketInfo,\n}: {\n  programId: PublicKey;\n  marketInfo: {\n    id: PublicKey;\n    requestQueue: PublicKey;\n    eventQueue: PublicKey;\n    bids: PublicKey;\n    asks: PublicKey;\n    baseVault: PublicKey;\n    quoteVault: PublicKey;\n    baseMint: PublicKey;\n    quoteMint: PublicKey;\n    authority?: PublicKey;\n    pruneAuthority?: PublicKey;\n\n    baseLotSize: BN;\n    quoteLotSize: BN;\n    feeRateBps: number;\n    vaultSignerNonce: BN;\n    quoteDustThreshold: BN;\n  };\n}): TransactionInstruction {\n  const dataLayout = struct([\n    u8(\"version\"),\n    u32(\"instruction\"),\n    u64(\"baseLotSize\"),\n    u64(\"quoteLotSize\"),\n    u16(\"feeRateBps\"),\n    u64(\"vaultSignerNonce\"),\n    u64(\"quoteDustThreshold\"),\n  ]);\n\n  const keys = [\n    { pubkey: marketInfo.id, isSigner: false, isWritable: true },\n    { pubkey: marketInfo.requestQueue, isSigner: false, isWritable: true },\n    { pubkey: marketInfo.eventQueue, isSigner: false, isWritable: true },\n    { pubkey: marketInfo.bids, isSigner: false, isWritable: true },\n    { pubkey: marketInfo.asks, isSigner: false, isWritable: true },\n    { pubkey: marketInfo.baseVault, isSigner: false, isWritable: true },\n    { pubkey: marketInfo.quoteVault, isSigner: false, isWritable: true },\n    { pubkey: marketInfo.baseMint, isSigner: false, isWritable: false },\n    { pubkey: marketInfo.quoteMint, isSigner: false, isWritable: false },\n    // Use a dummy address if using the new dex upgrade to save tx space.\n    {\n      pubkey: marketInfo.authority ? marketInfo.quoteMint : SYSVAR_RENT_PUBKEY,\n      isSigner: false,\n      isWritable: false,\n    },\n  ]\n    .concat(marketInfo.authority ? { pubkey: marketInfo.authority, isSigner: false, isWritable: false } : [])\n    .concat(\n      marketInfo.authority && marketInfo.pruneAuthority\n        ? { pubkey: marketInfo.pruneAuthority, isSigner: false, isWritable: false }\n        : [],\n    );\n\n  const data = Buffer.alloc(dataLayout.span);\n  dataLayout.encode(\n    {\n      version: 0,\n      instruction: 0,\n      baseLotSize: marketInfo.baseLotSize,\n      quoteLotSize: marketInfo.quoteLotSize,\n      feeRateBps: marketInfo.feeRateBps,\n      vaultSignerNonce: marketInfo.vaultSignerNonce,\n      quoteDustThreshold: marketInfo.quoteDustThreshold,\n    },\n    data,\n  );\n\n  return new TransactionInstruction({\n    keys,\n    programId,\n    data,\n  });\n}\n\nexport async function makeCreateMarketInstruction({\n  connection,\n  wallet,\n  marketInfo,\n}: {\n  connection: Connection;\n  wallet: PublicKey;\n  marketInfo: {\n    programId: PublicKey;\n    id: { publicKey: PublicKey; seed: string };\n    baseMint: PublicKey;\n    quoteMint: PublicKey;\n    baseVault: { publicKey: PublicKey; seed: string };\n    quoteVault: { publicKey: PublicKey; seed: string };\n    vaultOwner: PublicKey;\n\n    requestQueue: { publicKey: PublicKey; seed: string };\n    eventQueue: { publicKey: PublicKey; seed: string };\n    bids: { publicKey: PublicKey; seed: string };\n    asks: { publicKey: PublicKey; seed: string };\n\n    feeRateBps: number;\n    vaultSignerNonce: BN;\n    quoteDustThreshold: BN;\n\n    baseLotSize: BN;\n    quoteLotSize: BN;\n  };\n}): Promise<Transactions> {\n  const tx1 = new Transaction();\n  const accountLamports = await connection.getMinimumBalanceForRentExemption(165);\n  tx1.add(\n    SystemProgram.createAccountWithSeed({\n      fromPubkey: wallet,\n      basePubkey: wallet,\n      seed: marketInfo.baseVault.seed,\n      newAccountPubkey: marketInfo.baseVault.publicKey,\n      lamports: accountLamports,\n      space: 165,\n      programId: TOKEN_PROGRAM_ID,\n    }),\n    SystemProgram.createAccountWithSeed({\n      fromPubkey: wallet,\n      basePubkey: wallet,\n      seed: marketInfo.quoteVault.seed,\n      newAccountPubkey: marketInfo.quoteVault.publicKey,\n      lamports: accountLamports,\n      space: 165,\n      programId: TOKEN_PROGRAM_ID,\n    }),\n    createInitializeAccountInstruction(marketInfo.baseVault.publicKey, marketInfo.baseMint, marketInfo.vaultOwner),\n    createInitializeAccountInstruction(marketInfo.quoteVault.publicKey, marketInfo.quoteMint, marketInfo.vaultOwner),\n  );\n\n  const tx2 = new Transaction();\n  tx2.add(\n    SystemProgram.createAccountWithSeed({\n      fromPubkey: wallet,\n      basePubkey: wallet,\n      seed: marketInfo.id.seed,\n      newAccountPubkey: marketInfo.id.publicKey,\n      lamports: await connection.getMinimumBalanceForRentExemption(MARKET_STATE_LAYOUT_V2.span),\n      space: MARKET_STATE_LAYOUT_V2.span,\n      programId: marketInfo.programId,\n    }),\n    SystemProgram.createAccountWithSeed({\n      fromPubkey: wallet,\n      basePubkey: wallet,\n      seed: marketInfo.requestQueue.seed,\n      newAccountPubkey: marketInfo.requestQueue.publicKey,\n      lamports: await connection.getMinimumBalanceForRentExemption(5120 + 12),\n      space: 5120 + 12,\n      programId: marketInfo.programId,\n    }),\n    SystemProgram.createAccountWithSeed({\n      fromPubkey: wallet,\n      basePubkey: wallet,\n      seed: marketInfo.eventQueue.seed,\n      newAccountPubkey: marketInfo.eventQueue.publicKey,\n      lamports: await connection.getMinimumBalanceForRentExemption(262144 + 12),\n      space: 262144 + 12,\n      programId: marketInfo.programId,\n    }),\n    SystemProgram.createAccountWithSeed({\n      fromPubkey: wallet,\n      basePubkey: wallet,\n      seed: marketInfo.bids.seed,\n      newAccountPubkey: marketInfo.bids.publicKey,\n      lamports: await connection.getMinimumBalanceForRentExemption(65536 + 12),\n      space: 65536 + 12,\n      programId: marketInfo.programId,\n    }),\n    SystemProgram.createAccountWithSeed({\n      fromPubkey: wallet,\n      basePubkey: wallet,\n      seed: marketInfo.asks.seed,\n      newAccountPubkey: marketInfo.asks.publicKey,\n      lamports: await connection.getMinimumBalanceForRentExemption(65536 + 12),\n      space: 65536 + 12,\n      programId: marketInfo.programId,\n    }),\n    initializeMarket({\n      programId: marketInfo.programId,\n      marketInfo: {\n        id: marketInfo.id.publicKey,\n        requestQueue: marketInfo.requestQueue.publicKey,\n        eventQueue: marketInfo.eventQueue.publicKey,\n        bids: marketInfo.bids.publicKey,\n        asks: marketInfo.asks.publicKey,\n        baseVault: marketInfo.baseVault.publicKey,\n        quoteVault: marketInfo.quoteVault.publicKey,\n        baseMint: marketInfo.baseMint,\n        quoteMint: marketInfo.quoteMint,\n\n        baseLotSize: marketInfo.baseLotSize,\n        quoteLotSize: marketInfo.quoteLotSize,\n        feeRateBps: marketInfo.feeRateBps,\n        vaultSignerNonce: marketInfo.vaultSignerNonce,\n        quoteDustThreshold: marketInfo.quoteDustThreshold,\n      },\n    }),\n  );\n\n  return [\n    {\n      transaction: tx1,\n      signer: [],\n      instructionTypes: [\n        InstructionType.CreateAccount,\n        InstructionType.CreateAccount,\n        InstructionType.InitAccount,\n        InstructionType.InitAccount,\n      ],\n    },\n    {\n      transaction: tx2,\n      signer: [],\n      instructionTypes: [\n        InstructionType.CreateAccount,\n        InstructionType.CreateAccount,\n        InstructionType.CreateAccount,\n        InstructionType.CreateAccount,\n        InstructionType.CreateAccount,\n        InstructionType.InitMarket,\n      ],\n    },\n  ];\n}\n","import { blob, publicKey, struct, u64, WideBits } from \"@/marshmallow\";\n\nfunction accountFlagsLayout(property = \"accountFlags\"): WideBits<string> {\n  const ACCOUNT_FLAGS_LAYOUT = new WideBits(property);\n  ACCOUNT_FLAGS_LAYOUT.addBoolean(\"initialized\");\n  ACCOUNT_FLAGS_LAYOUT.addBoolean(\"market\");\n  ACCOUNT_FLAGS_LAYOUT.addBoolean(\"openOrders\");\n  ACCOUNT_FLAGS_LAYOUT.addBoolean(\"requestQueue\");\n  ACCOUNT_FLAGS_LAYOUT.addBoolean(\"eventQueue\");\n  ACCOUNT_FLAGS_LAYOUT.addBoolean(\"bids\");\n  ACCOUNT_FLAGS_LAYOUT.addBoolean(\"asks\");\n  return ACCOUNT_FLAGS_LAYOUT;\n}\n\nexport const MARKET_STATE_LAYOUT_V2 = struct([\n  blob(5),\n  accountFlagsLayout(\"accountFlags\"),\n  publicKey(\"ownAddress\"),\n  u64(\"vaultSignerNonce\"),\n  publicKey(\"baseMint\"),\n  publicKey(\"quoteMint\"),\n  publicKey(\"baseVault\"),\n  u64(\"baseDepositsTotal\"),\n  u64(\"baseFeesAccrued\"),\n  publicKey(\"quoteVault\"),\n  u64(\"quoteDepositsTotal\"),\n  u64(\"quoteFeesAccrued\"),\n  u64(\"quoteDustThreshold\"),\n  publicKey(\"requestQueue\"),\n  publicKey(\"eventQueue\"),\n  publicKey(\"bids\"),\n  publicKey(\"asks\"),\n  u64(\"baseLotSize\"),\n  u64(\"quoteLotSize\"),\n  u64(\"feeRateBps\"),\n  u64(\"referrerRebatesAccrued\"),\n  blob(7),\n]);\n","import { PublicKey } from \"@solana/web3.js\";\nimport ModuleBase from \"../moduleBase\";\nimport { makeClaimInstruction, makeClaimInstructionV4 } from \"./instruction\";\nimport { jsonInfo2PoolKeys } from \"@/common/utility\";\nimport { OwnerIdoInfo, IdoKeysData } from \"@/api/type\";\nimport { IDO_ALL_PROGRAM } from \"@/common/programId\";\nimport { WSOLMint } from \"@/common/pubKey\";\nimport { TxVersion } from \"@/common/txTool/txType\";\nimport { MakeTxData } from \"@/common/txTool/txTool\";\nimport BN from \"bn.js\";\n\nconst PROGRAM_TO_VERSION = {\n  [IDO_ALL_PROGRAM.IDO_PROGRAM_ID_V1.toString()]: 1,\n  [IDO_ALL_PROGRAM.IDO_PROGRAM_ID_V2.toString()]: 2,\n  [IDO_ALL_PROGRAM.IDO_PROGRAM_ID_V3.toString()]: 3,\n  [IDO_ALL_PROGRAM.IDO_PROGRAM_ID_V4.toString()]: 4,\n};\n\nexport default class MarketV2 extends ModuleBase {\n  public async claim<T extends TxVersion>({\n    ownerInfo,\n    idoKeys,\n    associatedOnly = true,\n    checkCreateATAOwner = false,\n    txVersion,\n  }: {\n    ownerInfo: OwnerIdoInfo[keyof OwnerIdoInfo] & { userIdoInfo: string };\n    idoKeys: IdoKeysData;\n    associatedOnly?: boolean;\n    checkCreateATAOwner?: boolean;\n    txVersion?: T;\n  }): Promise<MakeTxData> {\n    const txBuilder = this.createTxBuilder();\n    const version = PROGRAM_TO_VERSION[idoKeys.programId];\n\n    if (!version) this.logAndCreateError(\"invalid version\", version);\n    const poolConfigKey = jsonInfo2PoolKeys(idoKeys);\n\n    const [hasUnClaimedProject, hasUnClaimedBuy] = [!new BN(ownerInfo.coin).isZero(), !new BN(ownerInfo.pc).isZero()];\n\n    const userProjectUseSolBalance = poolConfigKey.projectInfo.mint.address.equals(WSOLMint);\n    const { account: userProjectTokenAccount, instructionParams: userProjectInstructionParams } =\n      await this.scope.account.getOrCreateTokenAccount({\n        tokenProgram: poolConfigKey.projectInfo.mint.programId,\n        mint: poolConfigKey.projectInfo.mint.address,\n        owner: this.scope.ownerPubKey,\n        createInfo: {\n          payer: this.scope.ownerPubKey,\n          amount: 0,\n        },\n        skipCloseAccount: !userProjectUseSolBalance,\n        notUseTokenAccount: userProjectUseSolBalance,\n        associatedOnly: userProjectUseSolBalance ? false : associatedOnly,\n        checkCreateATAOwner,\n      });\n\n    if (!userProjectTokenAccount && hasUnClaimedProject)\n      this.logAndCreateError(\"target token accounts not found\", \"mint\", idoKeys.projectInfo.mint.address);\n    hasUnClaimedProject && userProjectInstructionParams && txBuilder.addInstruction(userProjectInstructionParams);\n\n    const buyMintUseSolBalance = poolConfigKey.buyInfo.mint.address.equals(WSOLMint);\n    const { account: userBuyTokenAccount, instructionParams } = await this.scope.account.getOrCreateTokenAccount({\n      tokenProgram: poolConfigKey.buyInfo.mint.programId,\n      mint: poolConfigKey.buyInfo.mint.address,\n      owner: this.scope.ownerPubKey,\n      createInfo: {\n        payer: this.scope.ownerPubKey,\n        amount: 0,\n      },\n      skipCloseAccount: !buyMintUseSolBalance,\n      notUseTokenAccount: buyMintUseSolBalance,\n      associatedOnly: buyMintUseSolBalance ? false : associatedOnly,\n      checkCreateATAOwner,\n    });\n    if (!userProjectTokenAccount && hasUnClaimedBuy)\n      this.logAndCreateError(\"target token accounts not found\", \"mint\", idoKeys.projectInfo.mint.address);\n    hasUnClaimedBuy && instructionParams && txBuilder.addInstruction(instructionParams);\n\n    if (!userProjectTokenAccount || !userBuyTokenAccount)\n      this.logAndCreateError(\n        \"target token accounts not found\",\n        \"mint\",\n        idoKeys.projectInfo.mint.address,\n        idoKeys.buyInfo.mint.address,\n      );\n\n    if (version === 3) {\n      return txBuilder\n        .addInstruction({\n          instructions: [\n            ...(hasUnClaimedProject\n              ? [\n                  makeClaimInstruction<\"3\">(\n                    { programId: poolConfigKey.programId },\n                    {\n                      idoId: poolConfigKey.id,\n                      authority: poolConfigKey.authority,\n                      poolTokenAccount: poolConfigKey.projectInfo.vault,\n                      userTokenAccount: userProjectTokenAccount!,\n                      userIdoInfo: new PublicKey(ownerInfo.userIdoInfo),\n                      userOwner: this.scope.ownerPubKey,\n                    },\n                  ),\n                ]\n              : []),\n            ...(hasUnClaimedBuy\n              ? [\n                  makeClaimInstruction<\"3\">(\n                    { programId: new PublicKey(idoKeys.programId) },\n                    {\n                      idoId: poolConfigKey.id,\n                      authority: poolConfigKey.authority,\n                      poolTokenAccount: poolConfigKey.buyInfo.vault,\n                      userTokenAccount: userBuyTokenAccount!,\n                      userIdoInfo: new PublicKey(ownerInfo.userIdoInfo),\n                      userOwner: this.scope.ownerPubKey,\n                    },\n                  ),\n                ]\n              : []),\n          ],\n        })\n        .versionBuild({ txVersion }) as Promise<MakeTxData>;\n    }\n    if (version < 3) {\n      if (!hasUnClaimedProject && !hasUnClaimedBuy) this.logAndCreateError(\"no claimable rewards\");\n      return txBuilder\n        .addInstruction({\n          instructions: [\n            makeClaimInstruction<\"\">(\n              { programId: poolConfigKey.programId },\n              {\n                idoId: poolConfigKey.id,\n                authority: poolConfigKey.authority,\n                poolQuoteTokenAccount: poolConfigKey.buyInfo.vault,\n                poolBaseTokenAccount: poolConfigKey.projectInfo.vault,\n                userQuoteTokenAccount: userBuyTokenAccount!,\n                userBaseTokenAccount: userProjectTokenAccount!,\n                userIdoInfo: new PublicKey(ownerInfo.userIdoInfo),\n                userOwner: this.scope.ownerPubKey,\n              },\n            ),\n          ],\n        })\n        .versionBuild({ txVersion }) as Promise<MakeTxData>;\n    }\n\n    const keys = {\n      poolConfig: {\n        id: poolConfigKey.id,\n        programId: poolConfigKey.programId,\n        authority: poolConfigKey.authority,\n        baseVault: poolConfigKey.projectInfo.vault,\n        quoteVault: poolConfigKey.buyInfo.vault,\n        baseToken: idoKeys.projectInfo.mint,\n        quoteToken: idoKeys.buyInfo.mint,\n      },\n      userKeys: {\n        baseTokenAccount: userProjectTokenAccount!,\n        quoteTokenAccount: userBuyTokenAccount!,\n        ledgerAccount: new PublicKey(ownerInfo.userIdoInfo),\n        owner: this.scope.ownerPubKey,\n      },\n    };\n\n    return txBuilder\n      .addInstruction({\n        instructions: [\n          ...(hasUnClaimedProject ? [makeClaimInstructionV4({ ...keys, side: \"base\" })] : []),\n          ...(hasUnClaimedBuy ? [makeClaimInstructionV4({ ...keys, side: \"quote\" })] : []),\n        ],\n      })\n      .versionBuild({ txVersion }) as Promise<MakeTxData>;\n  }\n}\n","import { PublicKey, TransactionInstruction, SYSVAR_CLOCK_PUBKEY } from \"@solana/web3.js\";\nimport { TOKEN_PROGRAM_ID } from \"@solana/spl-token\";\nimport { RENT_PROGRAM_ID, CLOCK_PROGRAM_ID, SYSTEM_PROGRAM_ID } from \"@/common/pubKey\";\nimport {\n  PurchaseInstructionKeys,\n  ClaimInstructionKeysV3,\n  ClaimInstructionKeys,\n  IdoClaimInstructionParams,\n} from \"./type\";\nimport { purchaseLayout, claimLayout } from \"./layout\";\n\nexport function makePurchaseInstruction({\n  programId,\n  amount,\n  instructionKeys,\n}: {\n  programId: PublicKey;\n  amount: string | number;\n  instructionKeys: PurchaseInstructionKeys;\n}): TransactionInstruction {\n  const keys = [\n    // system\n    { pubkey: SYSTEM_PROGRAM_ID, isSigner: false, isWritable: false },\n    { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },\n    { pubkey: RENT_PROGRAM_ID, isSigner: false, isWritable: false },\n    { pubkey: CLOCK_PROGRAM_ID, isSigner: false, isWritable: false },\n    // pubkeys\n    ...Object.entries(instructionKeys).map(([name, pubkey]) => ({\n      pubkey,\n      isSigner: name === \"userOwner\",\n      isWritable: ![\"authority\", \"userOwner\", \"userIdoCheck\", \"userStakeInfo\"].includes(name),\n    })),\n  ];\n\n  const data = Buffer.alloc(purchaseLayout.span);\n  purchaseLayout.encode({ instruction: 1, amount: Number(amount) }, data);\n\n  return new TransactionInstruction({ keys, programId, data });\n}\n\nexport function makeClaimInstruction<Version extends \"\" | \"3\" = \"\">(\n  { programId }: { programId: PublicKey },\n  instructionKeys: Version extends \"3\" ? ClaimInstructionKeysV3 : ClaimInstructionKeys,\n): TransactionInstruction {\n  const keys = [\n    { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },\n    { pubkey: CLOCK_PROGRAM_ID, isSigner: false, isWritable: false },\n    ...Object.entries(instructionKeys).map(([name, pubkey]) => ({\n      pubkey,\n      isSigner: name === \"userOwner\",\n      isWritable: ![\"authority\", \"userOwner\"].includes(name),\n    })),\n  ];\n\n  const data = Buffer.alloc(claimLayout.span);\n  claimLayout.encode({ instruction: 2 }, data);\n\n  return new TransactionInstruction({ keys, programId, data });\n}\n\nexport function makeClaimInstructionV4(params: IdoClaimInstructionParams): TransactionInstruction {\n  const { poolConfig, userKeys, side } = params;\n\n  const tokenAccount = side === \"base\" ? userKeys.baseTokenAccount : userKeys.quoteTokenAccount;\n  const vault = side === \"base\" ? poolConfig.baseVault : poolConfig.quoteVault;\n  const data = Buffer.alloc(claimLayout.span);\n  claimLayout.encode(\n    {\n      instruction: 2,\n    },\n    data,\n  );\n\n  const keys = [\n    {\n      pubkey: TOKEN_PROGRAM_ID,\n      isWritable: false,\n      isSigner: false,\n    },\n    {\n      pubkey: SYSVAR_CLOCK_PUBKEY,\n      isWritable: false,\n      isSigner: false,\n    },\n    // ido\n    {\n      pubkey: poolConfig.id,\n      isWritable: true,\n      isSigner: false,\n    },\n    {\n      pubkey: poolConfig.authority,\n      isWritable: false,\n      isSigner: false,\n    },\n    {\n      pubkey: vault,\n      isWritable: true,\n      isSigner: false,\n    },\n    // user\n    {\n      pubkey: tokenAccount,\n      isWritable: true,\n      isSigner: false,\n    },\n    {\n      pubkey: userKeys.ledgerAccount,\n      isWritable: true,\n      isSigner: false,\n    },\n    {\n      pubkey: userKeys.owner,\n      isWritable: false,\n      isSigner: true,\n    },\n  ];\n\n  return new TransactionInstruction({\n    programId: poolConfig.programId,\n    keys,\n    data,\n  });\n}\n","import { nu64, struct, u8 } from \"@/marshmallow\";\n\nexport const purchaseLayout = struct([u8(\"instruction\"), nu64(\"amount\")]);\nexport const claimLayout = struct([u8(\"instruction\")]);\n","import { PublicKey } from \"@solana/web3.js\";\nimport { MintLayout, TOKEN_2022_PROGRAM_ID, TOKEN_PROGRAM_ID } from \"@solana/spl-token\";\n\nimport { Price, Token } from \"@/module\";\nimport { validateAndParsePublicKey, SOLMint } from \"@/common/pubKey\";\nimport { ApiV3Token, JupTokenType } from \"@/api/type\";\nimport ModuleBase, { ModuleBaseProps } from \"../moduleBase\";\nimport { LoadParams } from \"../type\";\n\nimport { TokenInfo } from \"./type\";\nimport { SOL_INFO } from \"./constant\";\n\nexport default class TokenModule extends ModuleBase {\n  private _tokenList: TokenInfo[] = [];\n  private _tokenMap: Map<string, TokenInfo> = new Map();\n  private _blackTokenMap: Map<string, TokenInfo> = new Map();\n  private _mintGroup: { official: Set<string>; jup: Set<string>; extra: Set<string> } = {\n    official: new Set(),\n    jup: new Set(),\n    extra: new Set(),\n  };\n  private _whiteMap: Set<string> = new Set();\n  private _extraTokenList: TokenInfo[] = [];\n\n  constructor(params: ModuleBaseProps) {\n    super(params);\n  }\n\n  public async load(params?: LoadParams & { type?: JupTokenType }): Promise<void> {\n    this.checkDisabled();\n    const { forceUpdate = false, type = JupTokenType.Strict } = params || {};\n    const { mintList, blacklist, whiteList } = await this.scope.fetchV3TokenList(forceUpdate);\n    const jup = await this.scope.fetchJupTokenList(type, forceUpdate);\n    // reset all data\n    this._tokenList = [];\n    this._tokenMap = new Map();\n    this._blackTokenMap = new Map();\n    this._mintGroup = { official: new Set(), jup: new Set(), extra: new Set() };\n    this._whiteMap = new Set(whiteList);\n\n    this._tokenMap.set(SOL_INFO.address, SOL_INFO);\n    this._mintGroup.official.add(SOL_INFO.address);\n    blacklist.forEach((token) => {\n      this._blackTokenMap.set(token.address, { ...token, priority: -1 });\n    });\n\n    mintList.forEach((token) => {\n      if (this._blackTokenMap.has(token.address)) return;\n      this._tokenMap.set(token.address, {\n        ...token,\n        type: \"raydium\",\n        priority: 2,\n        programId:\n          token.programId ??\n          (token.tags.includes(\"token-2022\") ? TOKEN_2022_PROGRAM_ID.toBase58() : TOKEN_PROGRAM_ID.toBase58()),\n      });\n      this._mintGroup.official.add(token.address);\n    });\n\n    jup.forEach((token) => {\n      if (this._blackTokenMap.has(token.address) || this._tokenMap.has(token.address)) return;\n      this._tokenMap.set(token.address, {\n        ...token,\n        type: \"jupiter\",\n        priority: 1,\n        programId:\n          token.programId ??\n          (token.tags.includes(\"token-2022\") ? TOKEN_2022_PROGRAM_ID.toBase58() : TOKEN_PROGRAM_ID.toBase58()),\n      });\n      this._mintGroup.jup.add(token.address);\n    });\n\n    this._extraTokenList.forEach((token) => {\n      if (this._blackTokenMap.has(token.address) || this._tokenMap.has(token.address)) return;\n      this._tokenMap.set(token.address, {\n        ...token,\n        type: \"extra\",\n        priority: 1,\n        programId:\n          token.programId || token.tags.includes(\"token-2022\")\n            ? TOKEN_2022_PROGRAM_ID.toBase58()\n            : TOKEN_PROGRAM_ID.toBase58(),\n      });\n      this._mintGroup.extra.add(token.address);\n    });\n\n    this._tokenList = Array.from(this._tokenMap).map((data) => data[1]);\n  }\n\n  get tokenList(): TokenInfo[] {\n    return this._tokenList;\n  }\n  get tokenMap(): Map<string, TokenInfo> {\n    return this._tokenMap;\n  }\n  get blackTokenMap(): Map<string, TokenInfo> {\n    return this._blackTokenMap;\n  }\n  get mintGroup(): { official: Set<string>; jup: Set<string> } {\n    return this._mintGroup;\n  }\n  get whiteListMap(): Set<string> {\n    return this._whiteMap;\n  }\n\n  /** === util functions === */\n\n  public async getTokenInfo(mint: string | PublicKey): Promise<ApiV3Token> {\n    if (!mint) throw new Error(\"please input mint\");\n    const mintStr = mint.toString();\n    const info = this._tokenMap.get(mintStr);\n    if (info) return info;\n    if (mintStr.toLocaleUpperCase() === \"SOL\") return SOL_INFO;\n\n    const apiTokenInfo = (await this.scope.api.getTokenInfo([mintStr]))[0];\n    if (apiTokenInfo) {\n      this._mintGroup.extra.add(mintStr);\n      this._tokenMap.set(mintStr, { ...apiTokenInfo, priority: 2 });\n      return apiTokenInfo;\n    }\n\n    const onlineInfo = await this.scope.connection.getAccountInfo(new PublicKey(mintStr));\n    if (!onlineInfo) throw new Error(`mint address not found: ${mintStr}`);\n    const data = MintLayout.decode(onlineInfo.data);\n    const mintSymbol = mintStr.toString().substring(0, 6);\n    const fullInfo = {\n      chainId: 101,\n      address: mintStr,\n      programId: onlineInfo.owner.toBase58(),\n      logoURI: \"\",\n      symbol: mintSymbol,\n      name: mintSymbol,\n      decimals: data.decimals,\n      tags: [],\n      extensions: {},\n      priority: 0,\n      type: \"unknown\",\n    };\n    this._mintGroup.extra.add(mintStr);\n    this._tokenMap.set(mintStr, fullInfo);\n    return fullInfo;\n  }\n}\n","import { PublicKey, Signer, Transaction, TransactionInstruction, VersionedTransaction } from \"@solana/web3.js\";\nimport { Mint, TransferFeeConfig } from \"@solana/spl-token\";\nimport { MultiTxExecuteParam, TxBuilder } from \"../common/txTool/txTool\";\nimport { TokenAmount } from \"../module/amount\";\nimport BN from \"bn.js\";\n\nexport type SignAllTransactions =\n  | (<T extends Transaction | VersionedTransaction>(transaction: T[]) => Promise<T[]>)\n  | undefined;\n\nexport interface MakeTransaction<T = Record<string, any>> {\n  builder: TxBuilder;\n  signers: Signer[];\n  transaction: Transaction;\n  instructionTypes: string[];\n  execute: () => Promise<{ txId: string; signedTx: Transaction }>;\n  extInfo: T;\n}\n\nexport interface MakeV0Transaction<T = Record<string, any>> {\n  builder: TxBuilder;\n  signers: Signer[];\n  transaction: VersionedTransaction;\n  instructionTypes: string[];\n  execute: () => Promise<string>;\n  extInfo: T;\n}\n\nexport interface MakeMultiTransaction {\n  builder: TxBuilder;\n  signers: Signer[][];\n  transactions: Transaction[];\n  instructionTypes: string[];\n  execute: (params?: MultiTxExecuteParam) => Promise<{\n    txIds: string[];\n    signedTxs: Transaction[];\n  }>;\n  extInfo: Record<string, any>;\n}\n\nexport interface InstructionReturn {\n  instruction: TransactionInstruction;\n  instructionType: string;\n}\n\nexport interface ComputeBudgetConfig {\n  units?: number;\n  microLamports?: number;\n}\n\nexport interface LoadParams {\n  forceUpdate?: boolean;\n}\n\nexport interface TransferAmountFee {\n  amount: TokenAmount;\n  fee: TokenAmount | undefined;\n  expirationTime: number | undefined;\n}\nexport interface GetTransferAmountFee {\n  amount: BN;\n  fee: BN | undefined;\n  expirationTime: number | undefined;\n}\n\nexport type ReturnTypeFetchMultipleMintInfo = Mint & { feeConfig: TransferFeeConfig | undefined };\nexport interface ReturnTypeFetchMultipleMintInfos {\n  [mint: string]: ReturnTypeFetchMultipleMintInfo & { programId: PublicKey };\n}\n\ntype Primitive = boolean | number | string | null | undefined | PublicKey;\n\n/**\n *\n * @example\n * ```typescript\n * interface A {\n *   keyA: string;\n *   keyB: string;\n *   map: {\n *     hello: string;\n *     i: number;\n *   };\n *   list: (string | number)[];\n *   keyC: number;\n * }\n *\n * type WrappedA = ReplaceType<A, string, boolean> // {\n *   keyA: boolean;\n *   keyB: boolean;\n *   map: {\n *     hello: boolean;\n *     i: number;\n *   };\n *   list: (number | boolean)[];\n *   keyC: number;\n * }\n * ```\n */\nexport type ReplaceType<Old, From, To> = {\n  [T in keyof Old]: Old[T] extends From // to avoid case: Old[T] is an Object,\n    ? Exclude<Old[T], From> | To // when match,  directly replace\n    : Old[T] extends Primitive // judge whether need recursively replace\n    ? From extends Old[T] // it's an Object\n      ? Exclude<Old[T], From> | To // directly replace\n      : Old[T] // stay same\n    : ReplaceType<Old[T], From, To>; // recursively replace\n};\n\nexport type MayArray<T> = T | Array<T>;\n\nexport type MayDeepArray<T> = T | Array<MayDeepArray<T>>;\n\nexport type MayFunction<T, PS extends any[] = []> = T | ((...Params: PS) => T);\n\nexport type ArrayItem<T extends ReadonlyArray<any>> = T extends Array<infer P> ? P : never;\n\nexport type ExactPartial<T, U> = {\n  [P in Extract<keyof T, U>]?: T[P];\n} & {\n  [P in Exclude<keyof T, U>]: T[P];\n};\n\nexport type ExactRequired<T, U> = {\n  [P in Extract<keyof T, U>]-?: T[P];\n} & {\n  [P in Exclude<keyof T, U>]: T[P];\n};\n\n/**\n * extract only string and number\n */\nexport type SKeyof<O> = Extract<keyof O, string>;\n\nexport type GetValue<T, K> = K extends keyof T ? T[K] : undefined;\n/**\n * @example\n * type A = { a: number; b: string; c?: string }\n * type B = { a: string; c: string; d?: boolean }\n *\n * type D = SOR<A, B> // { a: number | string; b: string | undefined; c: string | undefined; d: boolean | undefined } // ! if use SOR, you lost union type guard feature, try NOT to use this trick\n */\nexport type SOR<T, U> = { [K in keyof T | keyof U]: GetValue<T, K> | GetValue<U, K> };\n\nexport type Fallback<T, FallbackT> = T extends undefined ? FallbackT : T;\n\n/**\n * @example\n * type A = { a: number; b: string; c?: string }\n * type B = { a: string; c: string; d?: boolean }\n *\n * type D = Cover<A, B> // { a: string; b: string; c: string; d?: boolean}\n */\nexport type Cover<O, T> = { [K in SKeyof<O> | SKeyof<T>]: Fallback<GetValue<T, K>, GetValue<O, K>> };\n\nexport type UnionCover<O, T> = T extends T ? Cover<O, T> : never;\n\ntype MergeArr<Arr> = (Arr extends (infer T)[] ? T : never)[];\n\n/**\n * typescript type helper function\n * @example\n * type A = { hello: string; version: 3 }[]\n * type B = { hello: string; version: 5 }[]\n * type OK = MergeArr<A | B> // ({ hello: string; version: 3 } | { hello: string; version: 5 })[]\n * type Wrong = A | B // { hello: string; version: 3 }[] | { hello: string; version: 5 }[] // <= this type can't have auto type intelligense of array.map\n */\nexport const unionArr = <T>(arr: T): MergeArr<T> => arr as unknown as MergeArr<T>;\n"],"mappings":"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","names":[]}