{"version":3,"sources":["../../src/raydium/raydium.ts","../../src/api/api.ts","../../src/common/accountInfo.ts","../../src/common/logger.ts","../../src/common/bignumber.ts","../../src/module/amount.ts","../../src/module/formatter.ts","../../src/module/fraction.ts","../../src/common/constant.ts","../../src/raydium/token/constant.ts","../../src/module/token.ts","../../src/common/pubKey.ts","../../src/module/currency.ts","../../src/module/percent.ts","../../src/module/price.ts","../../src/common/utility.ts","../../src/common/lodash.ts","../../src/common/owner.ts","../../src/common/pda.ts","../../src/common/txTool/txUtils.ts","../../src/common/txTool/txType.ts","../../src/common/programId.ts","../../src/common/transfer.ts","../../src/common/txTool/lookupTable.ts","../../src/common/txTool/txTool.ts","../../src/common/fee.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","../../src/raydium/farm/farm.ts","../../src/raydium/farm/config.ts","../../src/raydium/farm/layout.ts","../../src/raydium/farm/instruction.ts","../../src/raydium/farm/util.ts","../../src/raydium/liquidity/liquidity.ts","../../src/raydium/clmm/instrument.ts","../../src/raydium/clmm/utils/tick.ts","../../src/raydium/clmm/utils/constants.ts","../../src/raydium/clmm/utils/math.ts","../../src/raydium/clmm/utils/util.ts","../../src/raydium/clmm/utils/pda.ts","../../src/raydium/clmm/utils/pool.ts","../../src/raydium/clmm/utils/position.ts","../../src/raydium/clmm/utils/tickQuery.ts","../../src/raydium/clmm/utils/tickarrayBitmap.ts","../../src/raydium/clmm/layout.ts","../../src/raydium/token/layout.ts","../../src/raydium/token/utils.ts","../../src/raydium/liquidity/constant.ts","../../src/raydium/liquidity/instruction.ts","../../src/raydium/liquidity/layout.ts","../../src/raydium/liquidity/stable.ts","../../src/raydium/liquidity/utils.ts","../../src/raydium/liquidity/serum.ts","../../src/raydium/marketV2/createMarket.ts","../../src/raydium/marketV2/instrument.ts","../../src/raydium/marketV2/layout.ts","../../src/raydium/clmm/clmm.ts","../../src/raydium/cpmm/cpmm.ts","../../src/raydium/cpmm/curve/calculator.ts","../../src/raydium/cpmm/curve/constantProduct.ts","../../src/raydium/cpmm/curve/fee.ts","../../src/raydium/cpmm/instruction.ts","../../src/raydium/cpmm/pda.ts","../../src/raydium/cpmm/layout.ts","../../src/raydium/tradeV2/trade.ts","../../src/raydium/serum/id.ts","../../src/raydium/serum/layout.ts","../../src/raydium/serum/serum.ts","../../src/raydium/tradeV2/instrument.ts","../../src/raydium/utils1216/utils1216.ts","../../src/raydium/ido/ido.ts","../../src/raydium/ido/instruction.ts","../../src/raydium/ido/layout.ts","../../src/raydium/launchpad/pda.ts","../../src/raydium/launchpad/instrument.ts","../../src/raydium/launchpad/launchpad.ts","../../src/raydium/launchpad/layout.ts","../../src/raydium/launchpad/curve/curve.ts","../../src/raydium/launchpad/curve/constantProductCurve.ts","../../src/raydium/launchpad/curve/curveBase.ts","../../src/raydium/launchpad/curve/fixedPriceCurve.ts","../../src/raydium/launchpad/curve/linearPriceCurve.ts","../../src/raydium/launchpad/curve/func.ts","../../src/raydium/token/token.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\";\nimport Launchpad from \"./launchpad/launchpad\";\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  loopMultiTxStatus?: boolean;\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?: DataBase<ApiV3Token[]>;\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 launchpad: Launchpad;\n  public rawBalances: Map<string, string> = new Map();\n  public apiData: ApiData;\n  public availability: Partial<AvailabilityCheckAPI3>;\n  public blockhashCommitment: Commitment;\n  public loopMultiTxStatus?: boolean;\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      loopMultiTxStatus,\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    this.loopMultiTxStatus = loopMultiTxStatus;\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    this.launchpad = new Launchpad({ scope: this, moduleName: \"Raydium_lauchpad\" });\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    this.account.resetTokenAccounts();\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      console.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    try {\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    } catch (e) {\n      console.error(e);\n      return {\n        mintList: [],\n        blacklist: [],\n        whiteList: [],\n      };\n    }\n  }\n\n  public async fetchJupTokenList(forceUpdate?: boolean): Promise<ApiV3Token[]> {\n    const prevFetched = this.apiData.jupTokenList;\n    if (prevFetched && !this.isCacheInvalidate(prevFetched.fetched) && !forceUpdate) return prevFetched.data;\n    try {\n      const jupList = await this.api.getJupTokenList();\n\n      this.apiData.jupTokenList = {\n        fetched: Date.now(),\n        data: jupList.map((t) => ({\n          ...t,\n          mintAuthority: t.mint_authority || undefined,\n          freezeAuthority: t.freeze_authority || undefined,\n        })),\n      };\n\n      return this.apiData.jupTokenList.data;\n    } catch (e) {\n      console.error(e);\n      return [];\n    }\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  ApiCpmmConfigInfo,\n  ApiV3Token,\n  FetchPoolParams,\n  PoolsApiReturn,\n  ApiV3PoolInfoItem,\n  PoolKeys,\n  FormatFarmInfoOut,\n  FormatFarmKeyOut,\n  AvailabilityCheckAPI3,\n  PoolFetchType,\n  ExtensionsItem,\n  JupToken,\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\";\nimport { TOKEN_2022_PROGRAM_ID, TOKEN_PROGRAM_ID } from \"@solana/spl-token\";\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 getCpmmConfigs(): Promise<ApiCpmmConfigInfo[]> {\n    const res = await this.api.get(this.urlConfigs.CPMM_CONFIG || API_URLS.CPMM_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: string[]; 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(): Promise<\n    (ApiV3Token & {\n      freeze_authority: string | null;\n      mint_authority: string | null;\n      permanent_delegate: string | null;\n      minted_at: string;\n    })[]\n  > {\n    const r: JupToken[] = await this.api.get(\"\", {\n      baseURL: this.urlConfigs.JUP_TOKEN_LIST || API_URLS.JUP_TOKEN_LIST,\n    });\n    return r.map((t) => ({\n      ...t,\n      chainId: 101,\n      programId: t.tags.includes(\"token-2022\") ? TOKEN_2022_PROGRAM_ID.toBase58() : TOKEN_PROGRAM_ID.toBase58(),\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<PoolsApiReturn> {\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","import { AccountInfo, Commitment, Connection, PublicKey } from \"@solana/web3.js\";\nimport { ReturnTypeFetchMultipleMintInfos } from \"../raydium/type\";\nimport { WSOLMint, chunkArray, solToWSol } from \"./\";\nimport { createLogger } from \"./logger\";\nimport { MINT_SIZE, TOKEN_PROGRAM_ID, getTransferFeeConfig, unpackMint } from \"@solana/spl-token\";\n\ninterface MultipleAccountsJsonRpcResponse {\n  jsonrpc: string;\n  id: string;\n  error?: {\n    code: number;\n    message: string;\n  };\n  result: {\n    context: { slot: number };\n    value: { data: Array<string>; executable: boolean; lamports: number; owner: string; rentEpoch: number }[];\n  };\n}\n\nexport interface GetMultipleAccountsInfoConfig {\n  batchRequest?: boolean;\n  commitment?: Commitment;\n  chunkCount?: number;\n}\n\nconst logger = createLogger(\"Raydium_accountInfo_util\");\n\nexport async function getMultipleAccountsInfo(\n  connection: Connection,\n  publicKeys: PublicKey[],\n  config?: GetMultipleAccountsInfoConfig,\n): Promise<(AccountInfo<Buffer> | null)[]> {\n  const {\n    batchRequest,\n    commitment = \"confirmed\",\n    chunkCount = 100,\n  } = {\n    batchRequest: false,\n    ...config,\n  };\n\n  const chunkedKeys = chunkArray(publicKeys, chunkCount);\n  let results: (AccountInfo<Buffer> | null)[][] = new Array(chunkedKeys.length).fill([]);\n\n  if (batchRequest) {\n    const batch = chunkedKeys.map((keys) => {\n      const args = connection._buildArgs([keys.map((key) => key.toBase58())], commitment, \"base64\");\n      return {\n        methodName: \"getMultipleAccounts\",\n        args,\n      };\n    });\n\n    const _batch = chunkArray(batch, 10);\n\n    const unsafeResponse: MultipleAccountsJsonRpcResponse[] = await (\n      await Promise.all(_batch.map(async (i) => await (connection as any)._rpcBatchRequest(i)))\n    ).flat();\n    results = unsafeResponse.map((unsafeRes: MultipleAccountsJsonRpcResponse) => {\n      if (unsafeRes.error)\n        logger.logWithError(`failed to get info for multiple accounts, RPC_ERROR, ${unsafeRes.error.message}`);\n\n      return unsafeRes.result.value.map((accountInfo) => {\n        if (accountInfo) {\n          const { data, executable, lamports, owner, rentEpoch } = accountInfo;\n\n          if (data.length !== 2 && data[1] !== \"base64\") logger.logWithError(`info must be base64 encoded, RPC_ERROR`);\n\n          return {\n            data: Buffer.from(data[0], \"base64\"),\n            executable,\n            lamports,\n            owner: new PublicKey(owner),\n            rentEpoch,\n          };\n        }\n        return null;\n      });\n    });\n  } else {\n    try {\n      results = (await Promise.all(\n        chunkedKeys.map((keys) => connection.getMultipleAccountsInfo(keys, commitment)),\n      )) as (AccountInfo<Buffer> | null)[][];\n    } catch (error) {\n      if (error instanceof Error) {\n        logger.logWithError(`failed to get info for multiple accounts, RPC_ERROR, ${error.message}`);\n      }\n    }\n  }\n\n  return results.flat();\n}\n\nexport async function getMultipleAccountsInfoWithCustomFlags<T extends { pubkey: PublicKey }>(\n  connection: Connection,\n  publicKeysWithCustomFlag: T[],\n  config?: GetMultipleAccountsInfoConfig,\n): Promise<({ accountInfo: AccountInfo<Buffer> | null } & T)[]> {\n  const multipleAccountsInfo = await getMultipleAccountsInfo(\n    connection,\n    publicKeysWithCustomFlag.map((o) => o.pubkey),\n    config,\n  );\n\n  return publicKeysWithCustomFlag.map((o, idx) => ({ ...o, accountInfo: multipleAccountsInfo[idx] }));\n}\n\nexport enum AccountType {\n  Uninitialized,\n  Mint,\n  Account,\n}\nexport const ACCOUNT_TYPE_SIZE = 1;\n\nexport async function fetchMultipleMintInfos({\n  connection,\n  mints,\n  config,\n}: {\n  connection: Connection;\n  mints: PublicKey[];\n  config?: { batchRequest?: boolean };\n}): Promise<ReturnTypeFetchMultipleMintInfos> {\n  if (mints.length === 0) return {};\n  const mintInfos = await getMultipleAccountsInfoWithCustomFlags(\n    connection,\n    mints.map((i) => ({ pubkey: solToWSol(i) })),\n    config,\n  );\n\n  const mintK: ReturnTypeFetchMultipleMintInfos = {};\n  for (const i of mintInfos) {\n    if (!i.accountInfo || i.accountInfo.data.length < MINT_SIZE) {\n      console.log(\"invalid mint account\", i.pubkey.toBase58());\n      continue;\n    }\n    const t = unpackMint(i.pubkey, i.accountInfo, i.accountInfo?.owner);\n    mintK[i.pubkey.toString()] = {\n      ...t,\n      programId: i.accountInfo?.owner || TOKEN_PROGRAM_ID,\n      feeConfig: getTransferFeeConfig(t) ?? undefined,\n    };\n  }\n  mintK[PublicKey.default.toBase58()] = mintK[WSOLMint.toBase58()];\n\n  return mintK;\n}\n","import { get, set } from \"lodash\";\n\nexport type ModuleName = \"Common.Api\";\n\nexport enum LogLevel {\n  Error,\n  Warning,\n  Info,\n  Debug,\n}\nexport class Logger {\n  private logLevel: LogLevel;\n  private name: string;\n  constructor(params: { name: string; logLevel?: LogLevel }) {\n    this.logLevel = params.logLevel !== undefined ? params.logLevel : LogLevel.Error;\n    this.name = params.name;\n  }\n\n  set level(logLevel: LogLevel) {\n    this.logLevel = logLevel;\n  }\n  get time(): string {\n    return Date.now().toString();\n  }\n  get moduleName(): string {\n    return this.name;\n  }\n\n  private isLogLevel(level: LogLevel): boolean {\n    return level <= this.logLevel;\n  }\n\n  public error(...props): Logger {\n    if (!this.isLogLevel(LogLevel.Error)) return this;\n    console.error(this.time, this.name, \"sdk logger error\", ...props);\n    return this;\n  }\n\n  public logWithError(...props): Logger {\n    // this.error(...props)\n    const msg = props.map((arg) => (typeof arg === \"object\" ? JSON.stringify(arg) : arg)).join(\", \");\n    throw new Error(msg);\n  }\n\n  public warning(...props): Logger {\n    if (!this.isLogLevel(LogLevel.Warning)) return this;\n    console.warn(this.time, this.name, \"sdk logger warning\", ...props);\n    return this;\n  }\n\n  public info(...props): Logger {\n    if (!this.isLogLevel(LogLevel.Info)) return this;\n    console.info(this.time, this.name, \"sdk logger info\", ...props);\n    return this;\n  }\n\n  public debug(...props): Logger {\n    if (!this.isLogLevel(LogLevel.Debug)) return this;\n    console.debug(this.time, this.name, \"sdk logger debug\", ...props);\n    return this;\n  }\n}\n\nconst moduleLoggers: { [key in ModuleName]?: Logger } = {};\nconst moduleLevels: { [key in ModuleName]?: LogLevel } = {};\n\nexport function createLogger(moduleName: string): Logger {\n  let logger = get(moduleLoggers, moduleName);\n  if (!logger) {\n    // default level is error\n    const logLevel = get(moduleLevels, moduleName);\n\n    logger = new Logger({ name: moduleName, logLevel });\n    set(moduleLoggers, moduleName, logger);\n  }\n\n  return logger;\n}\n\nexport function setLoggerLevel(moduleName: string, level: LogLevel): void {\n  set(moduleLevels, moduleName, level);\n\n  const logger = get(moduleLoggers, moduleName);\n  if (logger) logger.level = level;\n}\n","import BN from \"bn.js\";\nimport Decimal from \"decimal.js\";\nimport { CurrencyAmount, TokenAmount } from \"../module/amount\";\nimport { Currency } from \"../module/currency\";\nimport { Fraction } from \"../module/fraction\";\nimport { Percent } from \"../module/percent\";\nimport { Price } from \"../module/price\";\nimport { Token } from \"../module/token\";\nimport { SplToken, TokenJson } from \"../raydium/token/type\";\nimport { ReplaceType } from \"../raydium/type\";\nimport { parseBigNumberish } from \"./constant\";\nimport { mul } from \"./fractionUtil\";\nimport { notInnerObject } from \"./utility\";\n\nexport const BN_ZERO = new BN(0);\nexport const BN_ONE = new BN(1);\nexport const BN_TWO = new BN(2);\nexport const BN_THREE = new BN(3);\nexport const BN_FIVE = new BN(5);\nexport const BN_TEN = new BN(10);\nexport const BN_100 = new BN(100);\nexport const BN_1000 = new BN(1000);\nexport const BN_10000 = new BN(10000);\nexport type BigNumberish = BN | string | number | bigint;\nexport type Numberish = number | string | bigint | Fraction | BN;\n\nexport function tenExponential(shift: BigNumberish): BN {\n  return BN_TEN.pow(parseBigNumberish(shift));\n}\n\n/**\n *\n * @example\n * getIntInfo(0.34) => { numerator: '34', denominator: '100'}\n * getIntInfo('0.34') //=> { numerator: '34', denominator: '100'}\n */\nexport function parseNumberInfo(n: Numberish | undefined): {\n  denominator: string;\n  numerator: string;\n  sign?: string;\n  int?: string;\n  dec?: string;\n} {\n  if (n === undefined) return { denominator: \"1\", numerator: \"0\" };\n  if (n instanceof BN) {\n    return { numerator: n.toString(), denominator: \"1\" };\n  }\n\n  if (n instanceof Fraction) {\n    return { denominator: n.denominator.toString(), numerator: n.numerator.toString() };\n  }\n\n  const s = String(n);\n  const [, sign = \"\", int = \"\", dec = \"\"] = s.replace(\",\", \"\").match(/(-?)(\\d*)\\.?(\\d*)/) ?? [];\n  const denominator = \"1\" + \"0\".repeat(dec.length);\n  const numerator = sign + (int === \"0\" ? \"\" : int) + dec || \"0\";\n  return { denominator, numerator, sign, int, dec };\n}\n\n// round up\nexport function divCeil(a: BN, b: BN): BN {\n  // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n  // @ts-ignore\n  const dm = a.divmod(b);\n\n  // Fast case - exact division\n  if (dm.mod.isZero()) return dm.div;\n\n  // Round up\n  return dm.div.isNeg() ? dm.div.isubn(1) : dm.div.iaddn(1);\n}\n\nexport function shakeFractionDecimal(n: Fraction): string {\n  const [, sign = \"\", int = \"\"] = n.toFixed(2).match(/(-?)(\\d*)\\.?(\\d*)/) ?? [];\n  return `${sign}${int}`;\n}\n\nexport function toBN(n: Numberish, decimal: BigNumberish = 0): BN {\n  if (n instanceof BN) return n;\n  return new BN(shakeFractionDecimal(toFraction(n).mul(BN_TEN.pow(new BN(String(decimal))))));\n}\n\nexport function toFraction(value: Numberish): Fraction {\n  //  to complete math format(may have decimal), not int\n  if (value instanceof Percent) return new Fraction(value.numerator, value.denominator);\n\n  if (value instanceof Price) return value.adjusted;\n\n  // to complete math format(may have decimal), not BN\n  if (value instanceof TokenAmount)\n    try {\n      return toFraction(value.toExact());\n    } catch {\n      return new Fraction(BN_ZERO);\n    }\n\n  // do not ideal with other fraction value\n  if (value instanceof Fraction) return value;\n\n  // wrap to Fraction\n  const n = String(value);\n  const details = parseNumberInfo(n);\n  return new Fraction(details.numerator, details.denominator);\n}\n\nexport function ceilDiv(tokenAmount: BN, feeNumerator: BN, feeDenominator: BN): BN {\n  return tokenAmount.mul(feeNumerator).add(feeDenominator).sub(new BN(1)).div(feeDenominator);\n}\n\nexport function floorDiv(tokenAmount: BN, feeNumerator: BN, feeDenominator: BN): BN {\n  return tokenAmount.mul(feeNumerator).div(feeDenominator);\n}\n\n/**\n * @example\n * toPercent(3.14) // => Percent { 314.00% }\n * toPercent(3.14, { alreadyDecimaled: true }) // => Percent {3.14%}\n */\nexport function toPercent(\n  n: Numberish,\n  options?: { /* usually used for backend data */ alreadyDecimaled?: boolean },\n): Percent {\n  const { numerator, denominator } = parseNumberInfo(n);\n  return new Percent(new BN(numerator), new BN(denominator).mul(options?.alreadyDecimaled ? new BN(100) : new BN(1)));\n}\n\nexport function toTokenPrice(params: {\n  token: TokenJson | Token | SplToken;\n  numberPrice: Numberish;\n  decimalDone?: boolean;\n}): Price {\n  const { token, numberPrice, decimalDone } = params;\n  const usdCurrency = new Token({ mint: \"\", decimals: 6, symbol: \"usd\", name: \"usd\", skipMint: true });\n  const { numerator, denominator } = parseNumberInfo(numberPrice);\n  const parsedNumerator = decimalDone ? new BN(numerator).mul(BN_TEN.pow(new BN(token.decimals))) : numerator;\n  const parsedDenominator = new BN(denominator).mul(BN_TEN.pow(new BN(usdCurrency.decimals)));\n\n  return new Price({\n    baseToken: usdCurrency,\n    denominator: parsedDenominator.toString(),\n    quoteToken: new Token({ ...token, skipMint: true, mint: \"\" }),\n    numerator: parsedNumerator.toString(),\n  });\n}\n\nexport function toUsdCurrency(amount: Numberish): CurrencyAmount {\n  const usdCurrency = new Currency({ decimals: 6, symbol: \"usd\", name: \"usd\" });\n  const amountBigNumber = toBN(mul(amount, 10 ** usdCurrency.decimals)!);\n  return new CurrencyAmount(usdCurrency, amountBigNumber);\n}\n\nexport function toTotalPrice(amount: Numberish | undefined, price: Price | undefined): CurrencyAmount {\n  if (!price || !amount) return toUsdCurrency(0);\n  return toUsdCurrency(mul(amount, price)!);\n}\n\nexport function decimalToFraction(n: Decimal | undefined): Fraction | undefined {\n  if (n == null) return undefined;\n  const { numerator, denominator } = parseNumberInfo(n.toString());\n  return new Fraction(numerator, denominator);\n}\n\nexport function isDecimal(val: unknown): boolean {\n  return val instanceof Decimal;\n}\n\nexport function recursivelyDecimalToFraction<T>(info: T): ReplaceType<T, Decimal, Fraction> {\n  // @ts-expect-error no need type for inner code\n  return isDecimal(info)\n    ? decimalToFraction(info as any)\n    : Array.isArray(info)\n    ? info.map((k) => recursivelyDecimalToFraction(k))\n    : notInnerObject(info)\n    ? Object.fromEntries(Object.entries(info as any).map(([k, v]) => [k, recursivelyDecimalToFraction(v)]))\n    : info;\n}\n","import _Big from \"big.js\";\nimport BN from \"bn.js\";\n\nimport { BigNumberish, BN_TEN } from \"../common/bignumber\";\nimport { createLogger, Logger } from \"../common/logger\";\n\nimport { parseBigNumberish, Rounding } from \"../common\";\nimport { Currency } from \"./currency\";\nimport toFormat, { WrappedBig } from \"./formatter\";\nimport { Fraction } from \"./fraction\";\nimport { Token } from \"./token\";\n\nconst logger = createLogger(\"Raydium_amount\");\n\nconst Big = toFormat(_Big);\ntype Big = WrappedBig;\n\nexport function splitNumber(num: string, decimals: number): [string, string] {\n  let integral = \"0\";\n  let fractional = \"0\";\n\n  if (num.includes(\".\")) {\n    const splited = num.split(\".\");\n    if (splited.length === 2) {\n      [integral, fractional] = splited;\n      fractional = fractional.padEnd(decimals, \"0\");\n    } else {\n      logger.logWithError(`invalid number string, num: ${num}`);\n    }\n  } else {\n    integral = num;\n  }\n\n  // fix decimals is 0\n  return [integral, fractional.slice(0, decimals) || fractional];\n}\n\nexport class TokenAmount extends Fraction {\n  public readonly token: Token;\n  protected logger: Logger;\n\n  public constructor(token: Token, amount: BigNumberish, isRaw = true, name?: string) {\n    let parsedAmount = new BN(0);\n    const multiplier = BN_TEN.pow(new BN(token.decimals));\n\n    if (isRaw) {\n      parsedAmount = parseBigNumberish(amount);\n    } else {\n      let integralAmount = new BN(0);\n      let fractionalAmount = new BN(0);\n\n      // parse fractional string\n      if (typeof amount === \"string\" || typeof amount === \"number\" || typeof amount === \"bigint\") {\n        const [integral, fractional] = splitNumber(amount.toString(), token.decimals);\n        integralAmount = parseBigNumberish(integral);\n        fractionalAmount = parseBigNumberish(fractional);\n      }\n\n      integralAmount = integralAmount.mul(multiplier);\n      parsedAmount = integralAmount.add(fractionalAmount);\n    }\n\n    super(parsedAmount, multiplier);\n    this.logger = createLogger(name || \"TokenAmount\");\n    this.token = token;\n  }\n\n  public get raw(): BN {\n    return this.numerator;\n  }\n  public isZero(): boolean {\n    return this.raw.isZero();\n  }\n  public gt(other: TokenAmount): boolean {\n    if (!this.token.equals(other.token)) this.logger.logWithError(\"gt token not equals\");\n    return this.raw.gt(other.raw);\n  }\n\n  /**\n   * a less than b\n   */\n  public lt(other: TokenAmount): boolean {\n    if (!this.token.equals(other.token)) this.logger.logWithError(\"lt token not equals\");\n    return this.raw.lt(other.raw);\n  }\n\n  public add(other: TokenAmount): TokenAmount {\n    if (!this.token.equals(other.token)) this.logger.logWithError(\"add token not equals\");\n    return new TokenAmount(this.token, this.raw.add(other.raw));\n  }\n\n  public subtract(other: TokenAmount): TokenAmount {\n    if (!this.token.equals(other.token)) this.logger.logWithError(\"sub token not equals\");\n    return new TokenAmount(this.token, this.raw.sub(other.raw));\n  }\n\n  public toSignificant(\n    significantDigits = this.token.decimals,\n    format?: object,\n    rounding: Rounding = Rounding.ROUND_DOWN,\n  ): string {\n    return super.toSignificant(significantDigits, format, rounding);\n  }\n\n  /**\n   * To fixed\n   *\n   * @example\n   * ```\n   * 1 -> 1.000000000\n   * 1.234 -> 1.234000000\n   * 1.123456789876543 -> 1.123456789\n   * ```\n   */\n  public toFixed(\n    decimalPlaces = this.token.decimals,\n    format?: object,\n    rounding: Rounding = Rounding.ROUND_DOWN,\n  ): string {\n    if (decimalPlaces > this.token.decimals) this.logger.logWithError(\"decimals overflow\");\n    return super.toFixed(decimalPlaces, format, rounding);\n  }\n\n  /**\n   * To exact\n   *\n   * @example\n   * ```\n   * 1 -> 1\n   * 1.234 -> 1.234\n   * 1.123456789876543 -> 1.123456789\n   * ```\n   */\n  public toExact(format: object = { groupSeparator: \"\" }): string {\n    Big.DP = this.token.decimals;\n    return new Big(this.numerator.toString()).div(this.denominator.toString()).toFormat(format);\n  }\n}\n\nexport class CurrencyAmount extends Fraction {\n  public readonly currency: Currency;\n  protected logger: Logger;\n\n  public constructor(currency: Currency, amount: BigNumberish, isRaw = true, name?: string) {\n    let parsedAmount = new BN(0);\n    const multiplier = BN_TEN.pow(new BN(currency.decimals));\n\n    if (isRaw) {\n      parsedAmount = parseBigNumberish(amount);\n    } else {\n      let integralAmount = new BN(0);\n      let fractionalAmount = new BN(0);\n\n      // parse fractional string\n      if (typeof amount === \"string\" || typeof amount === \"number\" || typeof amount === \"bigint\") {\n        const [integral, fractional] = splitNumber(amount.toString(), currency.decimals);\n        integralAmount = parseBigNumberish(integral);\n        fractionalAmount = parseBigNumberish(fractional);\n      }\n\n      integralAmount = integralAmount.mul(multiplier);\n      parsedAmount = integralAmount.add(fractionalAmount);\n    }\n\n    super(parsedAmount, multiplier);\n    this.logger = createLogger(name || \"TokenAmount\");\n    this.currency = currency;\n  }\n\n  public get raw(): BN {\n    return this.numerator;\n  }\n\n  public isZero(): boolean {\n    return this.raw.isZero();\n  }\n\n  /**\n   * a greater than b\n   */\n  public gt(other: CurrencyAmount): boolean {\n    if (!this.currency.equals(other.currency)) this.logger.logWithError(\"gt currency not equals\");\n    return this.raw.gt(other.raw);\n  }\n\n  /**\n   * a less than b\n   */\n  public lt(other: CurrencyAmount): boolean {\n    if (!this.currency.equals(other.currency)) this.logger.logWithError(\"lt currency not equals\");\n    return this.raw.lt(other.raw);\n  }\n\n  public add(other: CurrencyAmount): CurrencyAmount {\n    if (!this.currency.equals(other.currency)) this.logger.logWithError(\"add currency not equals\");\n    return new CurrencyAmount(this.currency, this.raw.add(other.raw));\n  }\n\n  public sub(other: CurrencyAmount): CurrencyAmount {\n    if (!this.currency.equals(other.currency)) this.logger.logWithError(\"sub currency not equals\");\n    return new CurrencyAmount(this.currency, this.raw.sub(other.raw));\n  }\n\n  public toSignificant(\n    significantDigits = this.currency.decimals,\n    format?: object,\n    rounding: Rounding = Rounding.ROUND_DOWN,\n  ): string {\n    return super.toSignificant(significantDigits, format, rounding);\n  }\n\n  /**\n   * To fixed\n   *\n   * @example\n   * ```\n   * 1 -> 1.000000000\n   * 1.234 -> 1.234000000\n   * 1.123456789876543 -> 1.123456789\n   * ```\n   */\n  public toFixed(\n    decimalPlaces = this.currency.decimals,\n    format?: object,\n    rounding: Rounding = Rounding.ROUND_DOWN,\n  ): string {\n    if (decimalPlaces > this.currency.decimals) this.logger.logWithError(\"decimals overflow\");\n\n    return super.toFixed(decimalPlaces, format, rounding);\n  }\n\n  /**\n   * To exact\n   *\n   * @example\n   * ```\n   * 1 -> 1\n   * 1.234 -> 1.234\n   * 1.123456789876543 -> 1.123456789\n   * ```\n   */\n  public toExact(format: object = { groupSeparator: \"\" }): string {\n    Big.DP = this.currency.decimals;\n    return new Big(this.numerator.toString()).div(this.denominator.toString()).toFormat(format);\n  }\n}\n","import Big, { BigConstructor, BigSource, RoundingMode } from \"big.js\";\nimport Decimal, { Config, Numeric } from \"decimal.js-light\";\nimport _toFarmat from \"toformat\";\n\ntype TakeStatic<T> = { [P in keyof T]: T[P] };\ninterface FormatOptions {\n  decimalSeparator?: string;\n  groupSeparator?: string;\n  groupSize?: number;\n  fractionGroupSeparator?: string;\n  fractionGroupSize?: number;\n}\ninterface WrappedBigConstructor extends TakeStatic<BigConstructor> {\n  new (value: BigSource): WrappedBig;\n  (value: BigSource): WrappedBig;\n  (): WrappedBigConstructor;\n\n  format: FormatOptions;\n}\nexport interface WrappedBig extends Big {\n  add(n: BigSource): WrappedBig;\n  abs(): WrappedBig;\n  div(n: BigSource): WrappedBig;\n  minus(n: BigSource): WrappedBig;\n  mod(n: BigSource): WrappedBig;\n  mul(n: BigSource): WrappedBig;\n  plus(n: BigSource): WrappedBig;\n  pow(exp: number): WrappedBig;\n  round(dp?: number, rm?: RoundingMode): WrappedBig;\n  sqrt(): WrappedBig;\n  sub(n: BigSource): WrappedBig;\n  times(n: BigSource): WrappedBig;\n  toFormat(): string;\n  toFormat(options: FormatOptions): string;\n  toFormat(fractionLength: number): string;\n  toFormat(fractionLength: number, options: FormatOptions): string;\n  toFormat(fractionLength: number, missionUnknown: number): string;\n  toFormat(fractionLength: number, missionUnknown: number, options: FormatOptions): string;\n}\n\ntype DecimalConstructor = typeof Decimal;\ninterface WrappedDecimalConstructor extends TakeStatic<DecimalConstructor> {\n  new (value: Numeric): WrappedDecimal;\n  clone(config?: Config): WrappedDecimalConstructor;\n  config(config: Config): WrappedDecimal;\n  set(config: Config): WrappedDecimal;\n  format: FormatOptions;\n}\nexport interface WrappedDecimal extends Decimal {\n  absoluteValue(): WrappedDecimal;\n  abs(): WrappedDecimal;\n  dividedBy(y: Numeric): WrappedDecimal;\n  div(y: Numeric): WrappedDecimal;\n  dividedToIntegerBy(y: Numeric): WrappedDecimal;\n  idiv(y: Numeric): WrappedDecimal;\n  logarithm(base?: Numeric): WrappedDecimal;\n  log(base?: Numeric): WrappedDecimal;\n  minus(y: Numeric): WrappedDecimal;\n  sub(y: Numeric): WrappedDecimal;\n  modulo(y: Numeric): WrappedDecimal;\n  mod(y: Numeric): WrappedDecimal;\n  naturalExponetial(): WrappedDecimal;\n  exp(): WrappedDecimal;\n  naturalLogarithm(): WrappedDecimal;\n  ln(): WrappedDecimal;\n  negated(): WrappedDecimal;\n  neg(): WrappedDecimal;\n  plus(y: Numeric): WrappedDecimal;\n  add(y: Numeric): WrappedDecimal;\n  squareRoot(): WrappedDecimal;\n  sqrt(): WrappedDecimal;\n  times(y: Numeric): WrappedDecimal;\n  mul(y: Numeric): WrappedDecimal;\n  toWrappedDecimalPlaces(dp?: number, rm?: number): WrappedDecimal;\n  todp(dp?: number, rm?: number): WrappedDecimal;\n  toInteger(): WrappedDecimal;\n  toint(): WrappedDecimal;\n  toPower(y: Numeric): WrappedDecimal;\n  pow(y: Numeric): WrappedDecimal;\n  toSignificantDigits(sd?: number, rm?: number): WrappedDecimal;\n  tosd(sd?: number, rm?: number): WrappedDecimal;\n  toFormat(options: FormatOptions): string;\n  toFormat(fractionLength: number): string;\n  toFormat(fractionLength: number, options: FormatOptions): string;\n  toFormat(fractionLength: number, missionUnknown: number): string;\n  toFormat(fractionLength: number, missionUnknown: number, options: FormatOptions): string;\n}\n\nconst toFormat: {\n  (fn: BigConstructor): WrappedBigConstructor;\n  (fn: DecimalConstructor): WrappedDecimalConstructor;\n} = _toFarmat;\nexport default toFormat;\n","import _Big from \"big.js\";\nimport BN from \"bn.js\";\nimport _Decimal from \"decimal.js-light\";\n\nimport { BigNumberish } from \"../common/bignumber\";\nimport { createLogger } from \"../common/logger\";\n\nimport { parseBigNumberish, Rounding } from \"../common/constant\";\nimport toFormat, { WrappedBig } from \"./formatter\";\n\nconst logger = createLogger(\"module/fraction\");\n\nconst Big = toFormat(_Big);\ntype Big = WrappedBig;\n\nconst Decimal = toFormat(_Decimal);\n\nconst toSignificantRounding = {\n  [Rounding.ROUND_DOWN]: Decimal.ROUND_DOWN,\n  [Rounding.ROUND_HALF_UP]: Decimal.ROUND_HALF_UP,\n  [Rounding.ROUND_UP]: Decimal.ROUND_UP,\n};\n\nconst toFixedRounding = {\n  [Rounding.ROUND_DOWN]: _Big.roundDown,\n  [Rounding.ROUND_HALF_UP]: _Big.roundHalfUp,\n  [Rounding.ROUND_UP]: _Big.roundUp,\n};\n\nexport class Fraction {\n  public readonly numerator: BN;\n  public readonly denominator: BN;\n\n  public constructor(numerator: BigNumberish, denominator: BigNumberish = new BN(1)) {\n    this.numerator = parseBigNumberish(numerator);\n    this.denominator = parseBigNumberish(denominator);\n  }\n\n  public get quotient(): BN {\n    return this.numerator.div(this.denominator);\n  }\n\n  public invert(): Fraction {\n    return new Fraction(this.denominator, this.numerator);\n  }\n\n  public add(other: Fraction | BigNumberish): Fraction {\n    const otherParsed = other instanceof Fraction ? other : new Fraction(parseBigNumberish(other));\n\n    if (this.denominator.eq(otherParsed.denominator)) {\n      return new Fraction(this.numerator.add(otherParsed.numerator), this.denominator);\n    }\n\n    return new Fraction(\n      this.numerator.mul(otherParsed.denominator).add(otherParsed.numerator.mul(this.denominator)),\n      this.denominator.mul(otherParsed.denominator),\n    );\n  }\n\n  public sub(other: Fraction | BigNumberish): Fraction {\n    const otherParsed = other instanceof Fraction ? other : new Fraction(parseBigNumberish(other));\n\n    if (this.denominator.eq(otherParsed.denominator)) {\n      return new Fraction(this.numerator.sub(otherParsed.numerator), this.denominator);\n    }\n\n    return new Fraction(\n      this.numerator.mul(otherParsed.denominator).sub(otherParsed.numerator.mul(this.denominator)),\n      this.denominator.mul(otherParsed.denominator),\n    );\n  }\n\n  public mul(other: Fraction | BigNumberish): Fraction {\n    const otherParsed = other instanceof Fraction ? other : new Fraction(parseBigNumberish(other));\n\n    return new Fraction(this.numerator.mul(otherParsed.numerator), this.denominator.mul(otherParsed.denominator));\n  }\n\n  public div(other: Fraction | BigNumberish): Fraction {\n    const otherParsed = other instanceof Fraction ? other : new Fraction(parseBigNumberish(other));\n\n    return new Fraction(this.numerator.mul(otherParsed.denominator), this.denominator.mul(otherParsed.numerator));\n  }\n\n  public toSignificant(\n    significantDigits: number,\n    format: object = { groupSeparator: \"\" },\n    rounding: Rounding = Rounding.ROUND_HALF_UP,\n  ): string {\n    if (!Number.isInteger(significantDigits)) logger.logWithError(`${significantDigits} is not an integer.`);\n    if (significantDigits <= 0) logger.logWithError(`${significantDigits} is not positive.`);\n\n    Decimal.set({ precision: significantDigits + 1, rounding: toSignificantRounding[rounding] });\n    const quotient = new Decimal(this.numerator.toString())\n      .div(this.denominator.toString())\n      .toSignificantDigits(significantDigits);\n    return quotient.toFormat(quotient.decimalPlaces(), format);\n  }\n\n  public toFixed(\n    decimalPlaces: number,\n    format: object = { groupSeparator: \"\" },\n    rounding: Rounding = Rounding.ROUND_HALF_UP,\n  ): string {\n    if (!Number.isInteger(decimalPlaces)) logger.logWithError(`${decimalPlaces} is not an integer.`);\n    if (decimalPlaces < 0) logger.logWithError(`${decimalPlaces} is negative.`);\n\n    Big.DP = decimalPlaces;\n    Big.RM = toFixedRounding[rounding] || 1;\n    return new Big(this.numerator.toString()).div(this.denominator.toString()).toFormat(decimalPlaces, format);\n  }\n\n  public isZero(): boolean {\n    return this.numerator.isZero();\n  }\n}\n","import BN from \"bn.js\";\nimport { BigNumberish } from \"./bignumber\";\nimport { createLogger } from \"./logger\";\n\nexport enum Rounding {\n  ROUND_DOWN,\n  ROUND_HALF_UP,\n  ROUND_UP,\n}\n\nconst MAX_SAFE = 0x1fffffffffffff;\n\nexport function parseBigNumberish(value: BigNumberish): BN {\n  const logger = createLogger(\"Raydium_parseBigNumberish\");\n  // BN\n  if (value instanceof BN) {\n    return value;\n  }\n\n  if (typeof value === \"string\") {\n    if (value.match(/^-?[0-9]+$/)) {\n      return new BN(value);\n    }\n    logger.logWithError(`invalid BigNumberish string: ${value}`);\n  }\n\n  if (typeof value === \"number\") {\n    if (value % 1) {\n      logger.logWithError(`BigNumberish number underflow: ${value}`);\n    }\n\n    if (value >= MAX_SAFE || value <= -MAX_SAFE) {\n      logger.logWithError(`BigNumberish number overflow: ${value}`);\n    }\n\n    return new BN(String(value));\n  }\n\n  if (typeof value === \"bigint\") {\n    return new BN(value.toString());\n  }\n  logger.error(`invalid BigNumberish value: ${value}`);\n  return new BN(0); // never reach, because logWithError will throw error\n}","import { PublicKey } from \"@solana/web3.js\";\nimport { TOKEN_PROGRAM_ID } from \"@solana/spl-token\";\nimport { TokenInfo } from \"./type\";\n\nexport const SOL_INFO: TokenInfo = {\n  chainId: 101,\n  address: PublicKey.default.toBase58(),\n  programId: TOKEN_PROGRAM_ID.toBase58(),\n  decimals: 9,\n  symbol: \"SOL\",\n  name: \"solana\",\n  logoURI: `https://img-v1.raydium.io/icon/So11111111111111111111111111111111111111112.png`,\n  tags: [],\n  priority: 2,\n  type: \"raydium\",\n  extensions: {\n    coingeckoId: \"solana\",\n  },\n};\n\nexport const TOKEN_WSOL: TokenInfo = {\n  chainId: 101,\n  address: \"So11111111111111111111111111111111111111112\",\n  programId: TOKEN_PROGRAM_ID.toBase58(),\n  decimals: 9,\n  symbol: \"WSOL\",\n  name: \"Wrapped SOL\",\n  logoURI: `https://img-v1.raydium.io/icon/So11111111111111111111111111111111111111112.png`,\n  tags: [],\n  priority: 2,\n  type: \"raydium\",\n  extensions: {\n    coingeckoId: \"solana\",\n  },\n};\n","import { PublicKey } from \"@solana/web3.js\";\n\nimport { PublicKeyish, SOLMint, validateAndParsePublicKey } from \"../common/pubKey\";\nimport { TOKEN_WSOL } from \"../raydium/token/constant\";\n\n/**\n * A token is any fungible financial instrument on Solana, including SOL and all SPL tokens.\n */\nexport interface TokenProps {\n  mint: PublicKeyish;\n  decimals: number;\n  symbol?: string;\n  name?: string;\n  skipMint?: boolean;\n  isToken2022?: boolean;\n}\n\nexport class Token {\n  public readonly symbol?: string;\n  public readonly name?: string;\n  public readonly decimals: number;\n  public readonly isToken2022: boolean;\n\n  public readonly mint: PublicKey;\n  public static readonly WSOL: Token = new Token({\n    ...TOKEN_WSOL,\n    mint: TOKEN_WSOL.address,\n  });\n\n  /**\n   *\n   * @param mint - pass \"sol\" as mint will auto generate wsol token config\n   */\n  public constructor({ mint, decimals, symbol, name, skipMint = false, isToken2022 = false }: TokenProps) {\n    if (mint === SOLMint.toBase58() || (mint instanceof PublicKey && SOLMint.equals(mint))) {\n      this.decimals = TOKEN_WSOL.decimals;\n      this.symbol = TOKEN_WSOL.symbol;\n      this.name = TOKEN_WSOL.name;\n      this.mint = new PublicKey(TOKEN_WSOL.address);\n      this.isToken2022 = false;\n      return;\n    }\n\n    this.decimals = decimals;\n    this.symbol = symbol || mint.toString().substring(0, 6);\n    this.name = name || mint.toString().substring(0, 6);\n    this.mint = skipMint ? PublicKey.default : validateAndParsePublicKey({ publicKey: mint });\n    this.isToken2022 = isToken2022;\n  }\n\n  public equals(other: Token): boolean {\n    // short circuit on reference equality\n    if (this === other) {\n      return true;\n    }\n    return this.mint.equals(other.mint);\n  }\n}\n","import { AccountMeta, PublicKey, SystemProgram, SYSVAR_RENT_PUBKEY } from \"@solana/web3.js\";\nimport { TOKEN_PROGRAM_ID } from \"@solana/spl-token\";\n\ninterface AccountMetaProps {\n  pubkey: PublicKey;\n  isSigner?: boolean;\n  isWritable?: boolean;\n}\n\nexport function accountMeta({ pubkey, isSigner = false, isWritable = true }: AccountMetaProps): AccountMeta {\n  return {\n    pubkey,\n    isWritable,\n    isSigner,\n  };\n}\n\nexport const commonSystemAccountMeta = [\n  accountMeta({ pubkey: TOKEN_PROGRAM_ID, isWritable: false }),\n  accountMeta({ pubkey: SystemProgram.programId, isWritable: false }),\n  accountMeta({ pubkey: SYSVAR_RENT_PUBKEY, isWritable: false }),\n];\n\nexport type PublicKeyish = PublicKey | string;\n\nexport function validateAndParsePublicKey({\n  publicKey: orgPubKey,\n  transformSol,\n}: {\n  publicKey: PublicKeyish;\n  transformSol?: boolean;\n}): PublicKey {\n  const publicKey = tryParsePublicKey(orgPubKey.toString());\n\n  if (publicKey instanceof PublicKey) {\n    if (transformSol && publicKey.equals(SOLMint)) return WSOLMint;\n    return publicKey;\n  }\n\n  if (transformSol && publicKey.toString() === SOLMint.toBase58()) return WSOLMint;\n\n  if (typeof publicKey === \"string\") {\n    if (publicKey === PublicKey.default.toBase58()) return PublicKey.default;\n    try {\n      const key = new PublicKey(publicKey);\n      return key;\n    } catch {\n      throw new Error(\"invalid public key\");\n    }\n  }\n\n  throw new Error(\"invalid public key\");\n}\n\nexport function tryParsePublicKey(v: string): PublicKey | string {\n  try {\n    return new PublicKey(v);\n  } catch (e) {\n    return v;\n  }\n}\n\nexport const MEMO_PROGRAM_ID = new PublicKey(\"MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr\");\nexport const MEMO_PROGRAM_ID2 = new PublicKey(\"MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr\");\nexport const RENT_PROGRAM_ID = new PublicKey(\"SysvarRent111111111111111111111111111111111\");\nexport const CLOCK_PROGRAM_ID = new PublicKey(\"SysvarC1ock11111111111111111111111111111111\");\nexport const METADATA_PROGRAM_ID = new PublicKey(\"metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s\");\nexport const INSTRUCTION_PROGRAM_ID = new PublicKey(\"Sysvar1nstructions1111111111111111111111111\");\nexport const SYSTEM_PROGRAM_ID = SystemProgram.programId;\n\nexport const RAYMint = new PublicKey(\"4k3Dyjzvzp8eMZWUXbBCjEvwSkkk59S5iCNLY3QrkX6R\");\nexport const PAIMint = new PublicKey(\"Ea5SjE2Y6yvCeW5dYTn7PYMuW5ikXkvbGdcmSnXeaLjS\");\nexport const SRMMint = new PublicKey(\"SRMuApVNdxXokk5GT7XD5cUUgXMBCoAz2LHeuAoKWRt\");\nexport const USDCMint = new PublicKey(\"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v\");\nexport const USDTMint = new PublicKey(\"Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB\");\nexport const mSOLMint = new PublicKey(\"mSoLzYCxHdYgdzU16g5QSh3i5K3z3KZK7ytfqcJm7So\");\nexport const stSOLMint = new PublicKey(\"7dHbWXmci3dT8UFYWYZweBLXgycu7Y3iL6trKn1Y7ARj\");\nexport const USDHMint = new PublicKey(\"USDH1SM1ojwWUga67PGrgFWUHibbjqMvuMaDkRJTgkX\");\nexport const NRVMint = new PublicKey(\"NRVwhjBQiUPYtfDT5zRBVJajzFQHaBUNtC7SNVvqRFa\");\nexport const ANAMint = new PublicKey(\"ANAxByE6G2WjFp7A4NqtWYXb3mgruyzZYg3spfxe6Lbo\");\nexport const ETHMint = new PublicKey(\"7vfCXTUXx5WJV5JADk17DUJ4ksgau7utNKj4b963voxs\");\nexport const WSOLMint = new PublicKey(\"So11111111111111111111111111111111111111112\");\nexport const SOLMint = PublicKey.default;\n\nexport function solToWSol(mint: PublicKeyish): PublicKey {\n  return validateAndParsePublicKey({ publicKey: mint, transformSol: true });\n}\n","import { SOL_INFO } from \"../raydium/token/constant\";\n\nimport { Token } from \"./token\";\n\ninterface CurrencyProps {\n  decimals: number;\n  symbol?: string;\n  name?: string;\n}\n/**\n * A currency is any fungible financial instrument on Solana, including SOL and all SPL tokens.\n * The only instance of the base class `Currency` is SOL.\n */\nexport class Currency {\n  public readonly symbol?: string;\n  public readonly name?: string;\n  public readonly decimals: number;\n\n  /**\n   * The only instance of the base class `Currency`.\n   */\n  public static readonly SOL: Currency = new Currency(SOL_INFO);\n\n  /**\n   * Constructs an instance of the base class `Currency`. The only instance of the base class `Currency` is `Currency.SOL`.\n   * @param decimals - decimals of the currency\n   * @param symbol - symbol of the currency\n   * @param name - name of the currency\n   */\n  public constructor({ decimals, symbol = \"UNKNOWN\", name = \"UNKNOWN\" }: CurrencyProps) {\n    this.decimals = decimals;\n    this.symbol = symbol;\n    this.name = name;\n  }\n\n  public equals(other: Currency): boolean {\n    return this === other;\n  }\n}\n\n/**\n * Compares two currencies for equality\n */\nexport function currencyEquals(currencyA: Currency, currencyB: Currency): boolean {\n  if (currencyA instanceof Token && currencyB instanceof Token) {\n    return currencyA.equals(currencyB);\n  } else if (currencyA instanceof Token || currencyB instanceof Token) {\n    return false;\n  } else {\n    return currencyA === currencyB;\n  }\n}\n","import BN from \"bn.js\";\nimport { Rounding } from \"../common\";\nimport { Fraction } from \"./fraction\";\n\nexport const _100_PERCENT = new Fraction(new BN(100));\n\nexport class Percent extends Fraction {\n  public toSignificant(significantDigits = 5, format?: object, rounding?: Rounding): string {\n    return this.mul(_100_PERCENT).toSignificant(significantDigits, format, rounding);\n  }\n\n  public toFixed(decimalPlaces = 2, format?: object, rounding?: Rounding): string {\n    return this.mul(_100_PERCENT).toFixed(decimalPlaces, format, rounding);\n  }\n}\n","import { Rounding } from \"../common\";\nimport { BigNumberish, tenExponential } from \"../common/bignumber\";\nimport { createLogger } from \"../common/logger\";\n\nimport { Fraction } from \"./fraction\";\nimport { Token } from \"./token\";\n\nconst logger = createLogger(\"Raydium_price\");\n\ninterface PriceProps {\n  baseToken: Token;\n  denominator: BigNumberish;\n  quoteToken: Token;\n  numerator: BigNumberish;\n}\n\nexport class Price extends Fraction {\n  public readonly baseToken: Token; // input i.e. denominator\n  public readonly quoteToken: Token; // output i.e. numerator\n  // used to adjust the raw fraction w/r/t the decimals of the {base,quote}Token\n  public readonly scalar: Fraction;\n\n  // denominator and numerator _must_ be raw, i.e. in the native representation\n  public constructor(params: PriceProps) {\n    const { baseToken, quoteToken, numerator, denominator } = params;\n    super(numerator, denominator);\n\n    this.baseToken = baseToken;\n    this.quoteToken = quoteToken;\n    this.scalar = new Fraction(tenExponential(baseToken.decimals), tenExponential(quoteToken.decimals));\n  }\n\n  public get raw(): Fraction {\n    return new Fraction(this.numerator, this.denominator);\n  }\n\n  public get adjusted(): Fraction {\n    return super.mul(this.scalar);\n  }\n\n  public invert(): Price {\n    return new Price({\n      baseToken: this.quoteToken,\n      quoteToken: this.baseToken,\n      denominator: this.numerator,\n      numerator: this.denominator,\n    });\n  }\n\n  public mul(other: Price): Price {\n    if (this.quoteToken !== other.baseToken) logger.logWithError(\"mul token not equals\");\n\n    const fraction = super.mul(other);\n    return new Price({\n      baseToken: this.baseToken,\n      quoteToken: other.quoteToken,\n      denominator: fraction.denominator,\n      numerator: fraction.numerator,\n    });\n  }\n\n  public toSignificant(significantDigits = this.quoteToken.decimals, format?: object, rounding?: Rounding): string {\n    return this.adjusted.toSignificant(significantDigits, format, rounding);\n  }\n\n  public toFixed(decimalPlaces = this.quoteToken.decimals, format?: object, rounding?: Rounding): string {\n    return this.adjusted.toFixed(decimalPlaces, format, rounding);\n  }\n}\n","import { PublicKey } from \"@solana/web3.js\";\nimport BN from \"bn.js\";\n\nimport { Fraction, Percent, Price, Token, TokenAmount } from \"../module\";\nimport { ReplaceType } from \"../raydium/type\";\n\nimport { tryParsePublicKey } from \"./pubKey\";\n\nexport async function sleep(ms: number): Promise<void> {\n  new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport function getTimestamp(): number {\n  return new Date().getTime();\n}\n\nexport function notInnerObject(v: unknown): v is Record<string, any> {\n  return (\n    typeof v === \"object\" &&\n    v !== null &&\n    ![Token, TokenAmount, PublicKey, Fraction, BN, Price, Percent].some((o) => typeof o === \"object\" && v instanceof o)\n  );\n}\n\nexport function jsonInfo2PoolKeys<T>(jsonInfo: T): ReplaceType<T, string, PublicKey> {\n  // @ts-expect-error no need type for inner code\n  return typeof jsonInfo === \"string\"\n    ? tryParsePublicKey(jsonInfo)\n    : Array.isArray(jsonInfo)\n    ? jsonInfo.map((k) => jsonInfo2PoolKeys(k))\n    : notInnerObject(jsonInfo)\n    ? Object.fromEntries(Object.entries(jsonInfo).map(([k, v]) => [k, jsonInfo2PoolKeys(v)]))\n    : jsonInfo;\n}\n","/**\n * https://youmightnotneed.com/lodash/\n */\n\nexport function chunkArray<T>(arr: T[], chunkSize = 1, cache: T[][] = []): T[][] {\n  const tmp = [...arr];\n  if (chunkSize <= 0) return cache;\n  while (tmp.length) cache.push(tmp.splice(0, chunkSize));\n  return cache;\n}\n\nexport function intersection<T>(arr: T[], ...args: T[][]): T[] {\n  return arr.filter((item) => args.every((arr) => arr.includes(item)));\n}\n\nexport function xor<T>(arr: T[], ...args: T[][]): T[] {\n  return arr.filter((item) => args.every((arr) => !arr.includes(item)));\n}\n\nexport function uniq<T>(arr: T[]): T[] {\n  return [...new Set(arr)];\n}\n","import { 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","import { PublicKey } from \"@solana/web3.js\";\n\nimport { TOKEN_PROGRAM_ID } from \"@solana/spl-token\";\nimport { findProgramAddress } from \"./txTool/txUtils\";\n\nexport function getATAAddress(\n  owner: PublicKey,\n  mint: PublicKey,\n  programId?: PublicKey,\n): {\n  publicKey: PublicKey;\n  nonce: number;\n} {\n  return findProgramAddress(\n    [owner.toBuffer(), (programId ?? TOKEN_PROGRAM_ID).toBuffer(), mint.toBuffer()],\n    new PublicKey(\"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL\"),\n  );\n}\n","import {\n  Commitment,\n  ComputeBudgetProgram,\n  Connection,\n  EpochInfo,\n  Keypair,\n  PublicKey,\n  SimulatedTransactionResponse,\n  Transaction,\n  TransactionInstruction,\n  TransactionMessage,\n  VersionedTransaction,\n} from \"@solana/web3.js\";\n\nimport { createLogger } from \"../logger\";\nimport { CacheLTA } from \"./lookupTable\";\nimport { InstructionType } from \"./txType\";\n\nimport { ComputeBudgetConfig } from \"../../raydium/type\";\nimport { TOKEN_PROGRAM_ID } from \"@solana/spl-token\";\n\nconst logger = createLogger(\"Raydium_txUtil\");\n\nexport const MAX_BASE64_SIZE = 1644;\n\nexport function addComputeBudget(config: ComputeBudgetConfig): {\n  instructions: TransactionInstruction[];\n  instructionTypes: string[];\n} {\n  const ins: TransactionInstruction[] = [];\n  const insTypes: string[] = [];\n  if (config.microLamports) {\n    ins.push(ComputeBudgetProgram.setComputeUnitPrice({ microLamports: config.microLamports }));\n    insTypes.push(InstructionType.SetComputeUnitPrice);\n  }\n  if (config.units) {\n    ins.push(ComputeBudgetProgram.setComputeUnitLimit({ units: config.units }));\n    insTypes.push(InstructionType.SetComputeUnitLimit);\n  }\n\n  return {\n    instructions: ins,\n    instructionTypes: insTypes,\n  };\n}\n\nexport async function getRecentBlockHash(connection: Connection, propsCommitment?: Commitment): Promise<string> {\n  const commitment = propsCommitment ?? \"confirmed\";\n  return (await connection.getLatestBlockhash?.({ commitment }))?.blockhash;\n}\n\nexport async function confirmTransaction(connection: Connection, txId: string): Promise<string> {\n  connection.getSignatureStatuses([txId]);\n  return new Promise((resolve, reject) => {\n    const id = setTimeout(reject, 60 * 1000);\n    connection.onSignature(\n      txId,\n      (signatureResult) => {\n        clearTimeout(id);\n        if (!signatureResult.err) {\n          resolve(\"\");\n          return;\n        }\n        reject(Object.assign(signatureResult.err, { txId }));\n      },\n      \"confirmed\",\n    );\n  });\n}\n\n/**\n * Forecast transaction size\n */\nexport function forecastTransactionSize(instructions: TransactionInstruction[], signers: PublicKey[]): boolean {\n  if (instructions.length < 1) logger.logWithError(`no instructions provided: ${instructions.toString()}`);\n  if (signers.length < 1) logger.logWithError(`no signers provided:, ${signers.toString()}`);\n\n  const transaction = new Transaction();\n  transaction.recentBlockhash = \"11111111111111111111111111111111\";\n  transaction.feePayer = signers[0];\n  transaction.add(...instructions);\n\n  try {\n    return Buffer.from(transaction.serialize({ verifySignatures: false })).toString(\"base64\").length < MAX_BASE64_SIZE;\n  } catch (error) {\n    return false;\n  }\n}\n\n/**\n * Simulates multiple instruction\n */\n/**\n * Simulates multiple instruction\n */\nexport async function simulateMultipleInstruction(\n  connection: Connection,\n  instructions: TransactionInstruction[],\n  keyword: string,\n  batchRequest = true,\n): Promise<string[]> {\n  const feePayer = new PublicKey(\"RaydiumSimuLateTransaction11111111111111111\");\n\n  const transactions: Transaction[] = [];\n\n  let transaction = new Transaction();\n  transaction.feePayer = feePayer;\n\n  for (const instruction of instructions) {\n    if (!forecastTransactionSize([...transaction.instructions, instruction], [feePayer])) {\n      transactions.push(transaction);\n      transaction = new Transaction();\n      transaction.feePayer = feePayer;\n    }\n    transaction.add(instruction);\n  }\n  if (transaction.instructions.length > 0) {\n    transactions.push(transaction);\n  }\n\n  let results: SimulatedTransactionResponse[] = [];\n\n  try {\n    results = await simulateTransaction(connection, transactions, batchRequest);\n    if (results.find((i) => i.err !== null)) throw Error(\"rpc simulateTransaction error\");\n  } catch (error) {\n    if (error instanceof Error) {\n      logger.logWithError(\"failed to simulate for instructions\", \"RPC_ERROR\", {\n        message: error.message,\n      });\n    }\n  }\n\n  const logs: string[] = [];\n  for (const result of results) {\n    logger.debug(\"simulate result:\", result);\n\n    if (result.logs) {\n      const filteredLog = result.logs.filter((log) => log && log.includes(keyword));\n      logger.debug(\"filteredLog:\", logs);\n      if (!filteredLog.length) logger.logWithError(\"simulate log not match keyword\", \"keyword\", keyword);\n      logs.push(...filteredLog);\n    }\n  }\n\n  return logs;\n}\n\nexport function parseSimulateLogToJson(log: string, keyword: string): any {\n  const results = log.match(/{[\"\\w:,]+}/g);\n  if (!results || results.length !== 1) {\n    return logger.logWithError(`simulate log fail to match json, keyword: ${keyword}`);\n  }\n\n  return results[0];\n}\n\nexport function parseSimulateValue(log: string, key: string): any {\n  const reg = new RegExp(`\"${key}\":(\\\\d+)`, \"g\");\n\n  const results = reg.exec(log);\n  if (!results || results.length !== 2) {\n    return logger.logWithError(`simulate log fail to match key\", key: ${key}`);\n  }\n\n  return results[1];\n}\n\nexport interface ProgramAddress {\n  publicKey: PublicKey;\n  nonce: number;\n}\nexport function findProgramAddress(\n  seeds: Array<Buffer | Uint8Array>,\n  programId: PublicKey,\n): {\n  publicKey: PublicKey;\n  nonce: number;\n} {\n  const [publicKey, nonce] = PublicKey.findProgramAddressSync(seeds, programId);\n  return { publicKey, nonce };\n}\n\nexport async function simulateTransaction(\n  connection: Connection,\n  transactions: Transaction[],\n  batchRequest?: boolean,\n): Promise<any[]> {\n  let results: any[] = [];\n  if (batchRequest) {\n    const getLatestBlockhash = await connection.getLatestBlockhash();\n\n    const encodedTransactions: string[] = [];\n    for (const transaction of transactions) {\n      transaction.recentBlockhash = getLatestBlockhash.blockhash;\n      transaction.lastValidBlockHeight = getLatestBlockhash.lastValidBlockHeight;\n\n      // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n      // @ts-ignore\n      const message = transaction._compile();\n      const signData = message.serialize();\n\n      // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n      // @ts-ignore\n      const wireTransaction = transaction._serialize(signData);\n      const encodedTransaction = wireTransaction.toString(\"base64\");\n\n      encodedTransactions.push(encodedTransaction);\n    }\n\n    const batch = encodedTransactions.map((keys) => {\n      const args = connection._buildArgs([keys], undefined, \"base64\");\n      return {\n        methodName: \"simulateTransaction\",\n        args,\n      };\n    });\n\n    const reqData: { methodName: string; args: any[] }[][] = [];\n    const itemReqIndex = 20;\n    for (let i = 0; i < Math.ceil(batch.length / itemReqIndex); i++) {\n      reqData.push(batch.slice(i * itemReqIndex, (i + 1) * itemReqIndex));\n    }\n    // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n    // @ts-ignore\n    results = await (\n      await Promise.all(\n        reqData.map(async (i) => (await (connection as any)._rpcBatchRequest(i)).map((ii) => ii.result.value)),\n      )\n    ).flat();\n  } else {\n    try {\n      results = await Promise.all(\n        transactions.map(async (transaction) => await (await connection.simulateTransaction(transaction)).value),\n      );\n    } catch (error) {\n      if (error instanceof Error) {\n        logger.logWithError(\"failed to get info for multiple accounts\", \"RPC_ERROR\", {\n          message: error.message,\n        });\n      }\n    }\n  }\n\n  return results;\n}\n\nexport function checkLegacyTxSize({\n  instructions,\n  payer,\n  signers,\n}: {\n  instructions: TransactionInstruction[];\n  payer: PublicKey;\n  signers: PublicKey[];\n}): boolean {\n  return forecastTransactionSize(instructions, [payer, ...signers]);\n}\n\nexport function checkV0TxSize({\n  instructions,\n  payer,\n  lookupTableAddressAccount,\n  recentBlockhash = Keypair.generate().publicKey.toString(),\n}: {\n  instructions: TransactionInstruction[];\n  payer: PublicKey;\n  lookupTableAddressAccount?: CacheLTA;\n  recentBlockhash?: string;\n}): boolean {\n  const transactionMessage = new TransactionMessage({\n    payerKey: payer,\n    recentBlockhash,\n    instructions,\n  });\n\n  const messageV0 = transactionMessage.compileToV0Message(Object.values(lookupTableAddressAccount ?? {}));\n  try {\n    const buildLength = Buffer.from(new VersionedTransaction(messageV0).serialize()).toString(\"base64\").length;\n    return buildLength < MAX_BASE64_SIZE;\n  } catch (error) {\n    return false;\n  }\n}\n\nlet epochInfoCache: { time: number; data?: EpochInfo } = {\n  time: 0,\n  data: undefined,\n};\n\nexport async function getEpochInfo(connection: Connection): Promise<EpochInfo> {\n  if (!epochInfoCache.data || (Date.now() - epochInfoCache.time) / 1000 > 30) {\n    const data = await connection.getEpochInfo();\n    epochInfoCache = {\n      time: Date.now(),\n      data,\n    };\n    return data;\n  } else {\n    return epochInfoCache.data;\n  }\n}\n\nexport const toBuffer = (arr: Buffer | Uint8Array | Array<number>): Buffer => {\n  if (Buffer.isBuffer(arr)) {\n    return arr;\n  } else if (arr instanceof Uint8Array) {\n    return Buffer.from(arr.buffer, arr.byteOffset, arr.byteLength);\n  } else {\n    return Buffer.from(arr);\n  }\n};\n\nexport const txToBase64 = (transaction: Transaction | VersionedTransaction): string => {\n  let serialized = transaction.serialize({ requireAllSignatures: false, verifySignatures: false });\n  if (transaction instanceof VersionedTransaction) serialized = toBuffer(serialized);\n  try {\n    return serialized instanceof Buffer ? serialized.toString(\"base64\") : Buffer.from(serialized).toString(\"base64\");\n  } catch {\n    return serialized.toString(\"base64\");\n  }\n};\n\nexport function printSimulate(transactions: Transaction[] | VersionedTransaction[]): string[] {\n  const allBase64: string[] = [];\n  transactions.forEach((transaction) => {\n    if (transaction instanceof Transaction) {\n      if (!transaction.recentBlockhash) transaction.recentBlockhash = TOKEN_PROGRAM_ID.toBase58();\n      if (!transaction.feePayer) transaction.feePayer = Keypair.generate().publicKey;\n    }\n    allBase64.push(txToBase64(transaction));\n  });\n  console.log(\"simulate tx string:\", allBase64);\n\n  return allBase64;\n}\n\nexport function transformTxToBase64(tx: Transaction | VersionedTransaction): string {\n  let serialized = tx.serialize({ requireAllSignatures: false, verifySignatures: false });\n  if (tx instanceof VersionedTransaction) serialized = toBuffer(serialized);\n  return serialized.toString(\"base64\");\n}\n","export enum TxVersion {\n  \"V0\",\n  \"LEGACY\",\n}\n\nexport const InstructionType = {\n  CreateAccount: \"CreateAccount\",\n  InitAccount: \"InitAccount\",\n  CreateATA: \"CreateATA\",\n  CloseAccount: \"CloseAccount\",\n  TransferAmount: \"TransferAmount\",\n  InitMint: \"InitMint\",\n  MintTo: \"MintTo\",\n\n  InitMarket: \"InitMarket\", // create market main ins\n  Util1216OwnerClaim: \"Util1216OwnerClaim\", // owner claim token ins\n\n  SetComputeUnitPrice: \"SetComputeUnitPrice\",\n  SetComputeUnitLimit: \"SetComputeUnitLimit\",\n\n  // CLMM\n  ClmmCreatePool: \"ClmmCreatePool\",\n  ClmmOpenPosition: \"ClmmOpenPosition\",\n  ClmmIncreasePosition: \"ClmmIncreasePosition\",\n  ClmmDecreasePosition: \"ClmmDecreasePosition\",\n  ClmmClosePosition: \"ClmmClosePosition\",\n  ClmmSwapBaseIn: \"ClmmSwapBaseIn\",\n  ClmmSwapBaseOut: \"ClmmSwapBaseOut\",\n  ClmmInitReward: \"ClmmInitReward\",\n  ClmmSetReward: \"ClmmSetReward\",\n  ClmmCollectReward: \"ClmmCollectReward\",\n  ClmmLockPosition: \"ClmmLockPosition\",\n  ClmmHarvestLockPosition: \"ClmmHarvestLockPosition\",\n\n  AmmV4Swap: \"AmmV4Swap\",\n  AmmV4AddLiquidity: \"AmmV4AddLiquidity\",\n  AmmV4RemoveLiquidity: \"AmmV4RemoveLiquidity\",\n  AmmV4SimulatePoolInfo: \"AmmV4SimulatePoolInfo\",\n  AmmV4SwapBaseIn: \"AmmV4SwapBaseIn\",\n  AmmV4SwapBaseOut: \"AmmV4SwapBaseOut\",\n  AmmV4CreatePool: \"AmmV4CreatePool\",\n  AmmV4InitPool: \"AmmV4InitPool\",\n\n  AmmV5AddLiquidity: \"AmmV5AddLiquidity\",\n  AmmV5RemoveLiquidity: \"AmmV5RemoveLiquidity\",\n  AmmV5SimulatePoolInfo: \"AmmV5SimulatePoolInfo\",\n  AmmV5SwapBaseIn: \"AmmV5SwapBaseIn\",\n  AmmV5SwapBaseOut: \"AmmV5SwapBaseOut\",\n\n  RouteSwap: \"RouteSwap\",\n  RouteSwap1: \"RouteSwap1\",\n  RouteSwap2: \"RouteSwap2\",\n\n  FarmV3Deposit: \"FarmV3Deposit\",\n  FarmV3Withdraw: \"FarmV3Withdraw\",\n  FarmV3CreateLedger: \"FarmV3CreateLedger\",\n\n  FarmV4Withdraw: \"FarmV4Withdraw\",\n\n  FarmV5Deposit: \"FarmV5Deposit\",\n  FarmV5Withdraw: \"FarmV5Withdraw\",\n  FarmV5CreateLedger: \"FarmV5CreateLedger\",\n\n  FarmV6Deposit: \"FarmV6Deposit\",\n  FarmV6Withdraw: \"FarmV6Withdraw\",\n  FarmV6Create: \"FarmV6Create\",\n  FarmV6Restart: \"FarmV6Restart\",\n  FarmV6CreatorAddReward: \"FarmV6CreatorAddReward\",\n  FarmV6CreatorWithdraw: \"FarmV6CreatorWithdraw\",\n\n  CpmmCreatePool: \"CpmmCreatePool\",\n  CpmmAddLiquidity: \"CpmmAddLiquidity\",\n  CpmmWithdrawLiquidity: \"CpmmWithdrawLiquidity\",\n  CpmmSwapBaseIn: \"CpmmSwapBaseIn\",\n  CpmmSwapBaseOut: \"CpmmSwapBaseOut\",\n\n  CpmmLockLp: \"CpmmLockLp\",\n  CpmmCollectLockFee: \"CpmmCollectLockFee\",\n  TransferTip: \"TransferTip\",\n};\n","import { PublicKey } from \"@solana/web3.js\";\n\n// raydium\nexport const FARM_PROGRAM_ID_V3 = new PublicKey(\"EhhTKczWMGQt46ynNeRX1WfeagwwJd7ufHvCDjRxjo5Q\");\n// temp fusion\nexport const FARM_PROGRAM_ID_V4 = new PublicKey(\"CBuCnLe26faBpcBP2fktp4rp8abpcAnTWft6ZrP5Q4T\");\n// \"fusion\"\nexport const FARM_PROGRAM_ID_V5 = new PublicKey(\"9KEPoZmtHUrBbhWN1v1KWLMkkvwY6WLtAVUCPRtRjP4z\");\n// echosystem\nexport const FARM_PROGRAM_ID_V6 = new PublicKey(\"FarmqiPv5eAj3j1GMdMCMUGXqPUvmquZtMy86QH6rzhG\");\n\nexport const UTIL1216 = new PublicKey(\"CLaimxFqjHzgTJtAGHU47NPhg6qrc5sCnpC4tBLyABQS\");\n\nexport const OPEN_BOOK_PROGRAM = new PublicKey(\"srmqPvymJeFKQ4zGQed1GFppgkRHL9kaELCbyksJtPX\");\nexport const SERUM_PROGRAM_ID_V3 = new PublicKey(\"9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin\");\n\nexport const AMM_V4 = new PublicKey(\"675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8\");\nexport const AMM_STABLE = new PublicKey(\"5quBtoiQqxF9Jv6KYKctB59NT3gtJD2Y65kdnB1Uev3h\");\nexport const LIQUIDITY_POOL_PROGRAM_ID_V5_MODEL = new PublicKey(\"CDSr3ssLcRB6XYPJwAfFt18MZvEZp4LjHcvzBVZ45duo\");\nexport const CLMM_PROGRAM_ID = new PublicKey(\"CAMMCzo5YL8w4VFF8KVHrK22GGUsp5VTaW7grrKgrWqK\");\nexport const CLMM_LOCK_PROGRAM_ID = new PublicKey(\"LockrWmn6K5twhz3y9w1dQERbmgSaRkfnTeTKbpofwE\");\nexport const CLMM_LOCK_AUTH_ID = new PublicKey(\"kN1kEznaF5Xbd8LYuqtEFcxzWSBk5Fv6ygX6SqEGJVy\");\n\nexport const Router = new PublicKey(\"routeUGWgWzqBWFcrCfv8tritsqukccJPu3q5GPP3xS\");\nexport const FEE_DESTINATION_ID = new PublicKey(\"7YttLkHDoNj9wyDur5pM1ejNaAvT9X4eqaYcHQqtj2G5\");\n\nexport const IDO_PROGRAM_ID_V1 = new PublicKey(\"6FJon3QE27qgPVggARueB22hLvoh22VzJpXv4rBEoSLF\");\nexport const IDO_PROGRAM_ID_V2 = new PublicKey(\"CC12se5To1CdEuw7fDS27B7Geo5jJyL7t5UK2B44NgiH\");\nexport const IDO_PROGRAM_ID_V3 = new PublicKey(\"9HzJyW1qZsEiSfMUf6L2jo3CcTKAyBmSyKdwQeYisHrC\");\nexport const IDO_PROGRAM_ID_V4 = new PublicKey(\"DropEU8AvevN3UrXWXTMuz3rqnMczQVNjq3kcSdW2SQi\");\n\nexport const CREATE_CPMM_POOL_PROGRAM = new PublicKey(\"8dJuKxXufKDynREfeu5zkbSsVA69p7BpvHu62kUgwE3H\");\nexport const CREATE_CPMM_POOL_AUTH = new PublicKey(\"DDGbigvGH49guY7PaaSdaNd3FiF5fyMzywzkF35bjZz7\");\nexport const CREATE_CPMM_POOL_FEE_ACC = new PublicKey(\"DDGbigvGH49guY7PaaSdaNd3FiF5fyMzywzkF35bjZz7\");\n\nexport const DEV_CREATE_CPMM_POOL_PROGRAM = new PublicKey(\"CPMDWBwJDtYax9qW7AyRuVC19Cc4L4Vcy4n2BHAbHkCW\");\nexport const DEV_CREATE_CPMM_POOL_AUTH = new PublicKey(\"7rQ1QFNosMkUCuh7Z7fPbTHvh73b68sQYdirycEzJVuw\");\nexport const DEV_CREATE_CPMM_POOL_FEE_ACC = new PublicKey(\"G11FKBRaAkHAKuLCgLM6K6NUc9rTjPAznRCjZifrTQe2\");\n\nexport const LOCK_CPMM_PROGRAM = new PublicKey(\"LockrWmn6K5twhz3y9w1dQERbmgSaRkfnTeTKbpofwE\");\nexport const DEV_LOCK_CPMM_PROGRAM = new PublicKey(\"DLockwT7X7sxtLmGH9g5kmfcjaBtncdbUmi738m5bvQC\");\n\nexport const LOCK_CPMM_AUTH = new PublicKey(\"3f7GcQFG397GAaEnv51zR6tsTVihYRydnydDD1cXekxH\");\nexport const DEV_LOCK_CPMM_AUTH = new PublicKey(\"7AFUeLVRjBfzqK3tTGw8hN48KLQWSk6DTE8xprWdPqix\");\n\nexport const LAUNCHPAD_PROGRAM = new PublicKey(\"LanMV9sAd7wArD4vJFi2qDdfnVhFxYSUg6eADduJ3uj\");\nexport const LAUNCHPAD_AUTH = new PublicKey(\"WLHv2UAZm6z4KyaaELi5pjdbJh6RESMva1Rnn8pJVVh\");\n\nexport const DEV_LAUNCHPAD_PROGRAM = new PublicKey(\"LanD8FpTBBvzZFXjTxsAoipkFsxPUCDB4qAqKxYDiNP\");\nexport const DEV_LAUNCHPAD_AUTH = new PublicKey(\"HYNHiyKJ3gGVFvyxJAurK7qr7P2o5J9THmvCGMdULtpW\");\n\nexport const IDO_ALL_PROGRAM = {\n  IDO_PROGRAM_ID_V1,\n  IDO_PROGRAM_ID_V2,\n  IDO_PROGRAM_ID_V3,\n  IDO_PROGRAM_ID_V4,\n};\n\nexport const ALL_PROGRAM_ID = {\n  AMM_V4,\n  AMM_STABLE,\n  CLMM_PROGRAM_ID,\n  CLMM_LOCK_PROGRAM_ID,\n  CLMM_LOCK_AUTH_ID,\n\n  FARM_PROGRAM_ID_V3,\n  FARM_PROGRAM_ID_V5,\n  FARM_PROGRAM_ID_V6,\n\n  OPEN_BOOK_PROGRAM,\n  SERUM_PROGRAM_ID_V3,\n\n  UTIL1216,\n\n  Router,\n\n  CREATE_CPMM_POOL_PROGRAM,\n  CREATE_CPMM_POOL_AUTH,\n  CREATE_CPMM_POOL_FEE_ACC,\n\n  LOCK_CPMM_PROGRAM,\n  LOCK_CPMM_AUTH,\n\n  LAUNCHPAD_PROGRAM,\n  LAUNCHPAD_AUTH,\n};\n\nexport type ProgramIdConfig = Partial<typeof ALL_PROGRAM_ID>;\n\nexport const DEVNET_PROGRAM_ID = {\n  SERUM_MARKET: PublicKey.default,\n  OPENBOOK_MARKET: new PublicKey(\"EoTcMgcDRTJVZDMZWBoU6rhYHZfkNTVEAfz3uUJRcYGj\"),\n\n  UTIL1216: PublicKey.default,\n\n  FarmV3: new PublicKey(\"85BFyr98MbCUU9MVTEgzx1nbhWACbJqLzho6zd6DZcWL\"),\n  FarmV5: new PublicKey(\"EcLzTrNg9V7qhcdyXDe2qjtPkiGzDM2UbdRaeaadU5r2\"),\n  FarmV6: new PublicKey(\"Farm2hJLcqPtPg8M4rR6DMrsRNc5TPm5Cs4bVQrMe2T7\"),\n\n  AmmV4: new PublicKey(\"HWy1jotHpo6UqeQxx49dpYYdQB8wj9Qk9MdxwjLvDHB8\"),\n  AmmStable: new PublicKey(\"DDg4VmQaJV9ogWce7LpcjBA9bv22wRp5uaTPa5pGjijF\"),\n\n  CLMM: new PublicKey(\"devi51mZmdwUJGU9hjN27vEz64Gps7uUefqxg27EAtH\"),\n  CLMM_LOCK_PROGRAM_ID: new PublicKey(\"DLockwT7X7sxtLmGH9g5kmfcjaBtncdbUmi738m5bvQC\"),\n  CLMM_LOCK_AUTH_ID: new PublicKey(\"8qmHNvu2Kr2C7U8mJL4Vz1vTDxMhVuXKREwU7TNoaVEo\"),\n\n  Router: new PublicKey(\"BVChZ3XFEwTMUk1o9i3HAf91H6mFxSwa5X2wFAWhYPhU\"),\n\n  CREATE_CPMM_POOL_PROGRAM: DEV_CREATE_CPMM_POOL_PROGRAM,\n  CREATE_CPMM_POOL_AUTH: DEV_CREATE_CPMM_POOL_AUTH,\n  CREATE_CPMM_POOL_FEE_ACC: DEV_CREATE_CPMM_POOL_FEE_ACC,\n\n  FEE_DESTINATION_ID: new PublicKey(\"3XMrhbv989VxAMi3DErLV9eJht1pHppW5LbKxe9fkEFR\"),\n\n  LOCK_CPMM_PROGRAM: DEV_LOCK_CPMM_PROGRAM,\n  LCOK_CPMM_AUTH: DEV_LOCK_CPMM_AUTH,\n\n  LAUNCHPAD_PROGRAM: DEV_LAUNCHPAD_PROGRAM,\n  LAUNCHPAD_AUTH: DEV_LAUNCHPAD_AUTH,\n};\n","import { EpochInfo } from \"@solana/web3.js\";\nimport BN from \"bn.js\";\nimport { TransferFee, TransferFeeConfig } from \"@solana/spl-token\";\n\nimport { TransferFeeDataBaseType } from \"../api/type\";\nimport { GetTransferAmountFee } from \"../raydium/type\";\n\nconst POINT = 10_000;\nexport function getTransferAmountFee(\n  amount: BN,\n  feeConfig: TransferFeeConfig | undefined,\n  epochInfo: EpochInfo,\n  addFee: boolean,\n): GetTransferAmountFee {\n  if (feeConfig === undefined) {\n    return {\n      amount,\n      fee: undefined,\n      expirationTime: undefined,\n    };\n  }\n\n  const nowFeeConfig: TransferFee =\n    epochInfo.epoch < feeConfig.newerTransferFee.epoch ? feeConfig.olderTransferFee : feeConfig.newerTransferFee;\n  const maxFee = new BN(nowFeeConfig.maximumFee.toString());\n  const expirationTime: number | undefined =\n    epochInfo.epoch < feeConfig.newerTransferFee.epoch\n      ? ((Number(feeConfig.newerTransferFee.epoch) * epochInfo.slotsInEpoch - epochInfo.absoluteSlot) * 400) / 1000\n      : undefined;\n\n  if (addFee) {\n    if (nowFeeConfig.transferFeeBasisPoints === POINT) {\n      const nowMaxFee = new BN(nowFeeConfig.maximumFee.toString());\n      return {\n        amount: amount.add(nowMaxFee),\n        fee: nowMaxFee,\n        expirationTime,\n      };\n    } else {\n      const _TAmount = BNDivCeil(amount.mul(new BN(POINT)), new BN(POINT - nowFeeConfig.transferFeeBasisPoints));\n\n      const nowMaxFee = new BN(nowFeeConfig.maximumFee.toString());\n      const TAmount = _TAmount.sub(amount).gt(nowMaxFee) ? amount.add(nowMaxFee) : _TAmount;\n\n      const _fee = BNDivCeil(TAmount.mul(new BN(nowFeeConfig.transferFeeBasisPoints)), new BN(POINT));\n      const fee = _fee.gt(maxFee) ? maxFee : _fee;\n      return {\n        amount: TAmount,\n        fee,\n        expirationTime,\n      };\n    }\n  } else {\n    const _fee = BNDivCeil(amount.mul(new BN(nowFeeConfig.transferFeeBasisPoints)), new BN(POINT));\n    const fee = _fee.gt(maxFee) ? maxFee : _fee;\n\n    return {\n      amount,\n      fee,\n      expirationTime,\n    };\n  }\n}\n\nexport function getTransferAmountFeeV2(\n  amount: BN,\n  _feeConfig: TransferFeeDataBaseType | undefined,\n  epochInfo: EpochInfo,\n  addFee: boolean,\n): GetTransferAmountFee {\n  if (_feeConfig === undefined) {\n    return {\n      amount,\n      fee: undefined,\n      expirationTime: undefined,\n    };\n  }\n  const feeConfig = {\n    ..._feeConfig,\n    olderTransferFee: {\n      epoch: BigInt(_feeConfig.olderTransferFee.epoch),\n      maximumFee: BigInt(_feeConfig.olderTransferFee.maximumFee),\n      transferFeeBasisPoints: _feeConfig.olderTransferFee.transferFeeBasisPoints,\n    },\n    newerTransferFee: {\n      epoch: BigInt(_feeConfig.newerTransferFee.epoch),\n      maximumFee: BigInt(_feeConfig.newerTransferFee.maximumFee),\n      transferFeeBasisPoints: _feeConfig.newerTransferFee.transferFeeBasisPoints,\n    },\n  };\n\n  const nowFeeConfig: TransferFee =\n    epochInfo.epoch < feeConfig.newerTransferFee.epoch ? feeConfig.olderTransferFee : feeConfig.newerTransferFee;\n  const maxFee = new BN(nowFeeConfig.maximumFee.toString());\n  const expirationTime: number | undefined =\n    epochInfo.epoch < feeConfig.newerTransferFee.epoch\n      ? ((Number(feeConfig.newerTransferFee.epoch) * epochInfo.slotsInEpoch - epochInfo.absoluteSlot) * 400) / 1000\n      : undefined;\n\n  if (addFee) {\n    if (nowFeeConfig.transferFeeBasisPoints === POINT) {\n      const nowMaxFee = new BN(nowFeeConfig.maximumFee.toString());\n      return {\n        amount: amount.add(nowMaxFee),\n        fee: nowMaxFee,\n        expirationTime,\n      };\n    } else {\n      const _TAmount = BNDivCeil(amount.mul(new BN(POINT)), new BN(POINT - nowFeeConfig.transferFeeBasisPoints));\n\n      const nowMaxFee = new BN(nowFeeConfig.maximumFee.toString());\n      const TAmount = _TAmount.sub(amount).gt(nowMaxFee) ? amount.add(nowMaxFee) : _TAmount;\n\n      const _fee = BNDivCeil(TAmount.mul(new BN(nowFeeConfig.transferFeeBasisPoints)), new BN(POINT));\n      const fee = _fee.gt(maxFee) ? maxFee : _fee;\n      return {\n        amount: TAmount,\n        fee,\n        expirationTime,\n      };\n    }\n  } else {\n    const _fee = BNDivCeil(amount.mul(new BN(nowFeeConfig.transferFeeBasisPoints)), new BN(POINT));\n    const fee = _fee.gt(maxFee) ? maxFee : _fee;\n\n    return {\n      amount,\n      fee,\n      expirationTime,\n    };\n  }\n}\n\nexport function minExpirationTime(\n  expirationTime1: number | undefined,\n  expirationTime2: number | undefined,\n): number | undefined {\n  if (expirationTime1 === undefined) return expirationTime2;\n  if (expirationTime2 === undefined) return expirationTime1;\n\n  return Math.min(expirationTime1, expirationTime2);\n}\n\nexport function BNDivCeil(bn1: BN, bn2: BN): BN {\n  const { div, mod } = bn1.divmod(bn2);\n\n  if (mod.gt(new BN(0))) {\n    return div.add(new BN(1));\n  } else {\n    return div;\n  }\n}\n\nexport function ceilDivBN(amountA: BN, amountB: BN): BN {\n  if (amountA.isZero()) return new BN(0);\n\n  const quotient = amountA.div(amountB);\n\n  if (quotient.isZero()) return new BN(1);\n\n  const remainder = amountA.mod(amountB);\n  if (remainder.gt(new BN(0))) {\n    return quotient.add(new BN(1));\n  }\n  return quotient;\n}\n","import { Connection, PublicKey, AddressLookupTableAccount } from \"@solana/web3.js\";\nimport { getMultipleAccountsInfo } from \"../accountInfo\";\n\nexport interface CacheLTA {\n  [key: string]: AddressLookupTableAccount;\n}\n\nexport async function getMultipleLookupTableInfo({\n  connection,\n  address,\n}: {\n  connection: Connection;\n  address: PublicKey[];\n}): Promise<CacheLTA> {\n  const dataInfos = await getMultipleAccountsInfo(\n    connection,\n    [...new Set<string>(address.map((i) => i.toString()))].map((i) => new PublicKey(i)),\n  );\n\n  const outDict: CacheLTA = {};\n  for (let i = 0; i < address.length; i++) {\n    const info = dataInfos[i];\n    const key = address[i];\n    if (!info) continue;\n    const lookupAccount = new AddressLookupTableAccount({\n      key,\n      state: AddressLookupTableAccount.deserialize(info.data),\n    });\n    outDict[key.toString()] = lookupAccount;\n    LOOKUP_TABLE_CACHE[key.toString()] = lookupAccount;\n  }\n\n  return outDict;\n}\n\nexport const LOOKUP_TABLE_CACHE: CacheLTA = {\n  \"AcL1Vo8oy1ULiavEcjSUcwfBSForXMudcZvDZy5nzJkU\": new AddressLookupTableAccount({\n    key: new PublicKey(\"AcL1Vo8oy1ULiavEcjSUcwfBSForXMudcZvDZy5nzJkU\"),\n    state: AddressLookupTableAccount.deserialize(\n      Buffer.from(\n        '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',\n        \"base64\",\n      ),\n    ),\n  }),\n};\n","import {\n  Commitment,\n  Connection,\n  PublicKey,\n  sendAndConfirmTransaction,\n  SignatureResult,\n  Signer,\n  SystemProgram,\n  Transaction,\n  TransactionInstruction,\n  TransactionMessage,\n  VersionedTransaction,\n} from \"@solana/web3.js\";\nimport axios from \"axios\";\n\nimport { Api } from \"../../api\";\nimport { ComputeBudgetConfig, SignAllTransactions, TxTipConfig } from \"../../raydium/type\";\nimport { Cluster } from \"../../solana\";\nimport { Owner } from \"../owner\";\nimport { CacheLTA, getMultipleLookupTableInfo, LOOKUP_TABLE_CACHE } from \"./lookupTable\";\nimport { InstructionType, TxVersion } from \"./txType\";\nimport {\n  addComputeBudget,\n  checkLegacyTxSize,\n  checkV0TxSize,\n  confirmTransaction,\n  getRecentBlockHash,\n  printSimulate,\n} from \"./txUtils\";\n\ninterface SolanaFeeInfo {\n  min: number;\n  max: number;\n  avg: number;\n  priorityTx: number;\n  nonVotes: number;\n  priorityRatio: number;\n  avgCuPerBlock: number;\n  blockspaceUsageRatio: number;\n}\ntype SolanaFeeInfoJson = {\n  \"1\": SolanaFeeInfo;\n  \"5\": SolanaFeeInfo;\n  \"15\": SolanaFeeInfo;\n};\n\ninterface ExecuteParams {\n  skipPreflight?: boolean;\n  recentBlockHash?: string;\n  sendAndConfirm?: boolean;\n  notSendToRpc?: boolean;\n}\n\ninterface TxBuilderInit {\n  connection: Connection;\n  feePayer: PublicKey;\n  cluster: Cluster;\n  owner?: Owner;\n  blockhashCommitment?: Commitment;\n  loopMultiTxStatus?: boolean;\n  api?: Api;\n  signAllTransactions?: SignAllTransactions;\n}\n\nexport interface AddInstructionParam {\n  addresses?: Record<string, PublicKey>;\n  instructions?: TransactionInstruction[];\n  endInstructions?: TransactionInstruction[];\n  lookupTableAddress?: string[];\n  signers?: Signer[];\n  instructionTypes?: string[];\n  endInstructionTypes?: string[];\n}\n\nexport interface TxBuildData<T = Record<string, any>> {\n  builder: TxBuilder;\n  transaction: Transaction;\n  instructionTypes: string[];\n  signers: Signer[];\n  execute: (params?: ExecuteParams) => Promise<{ txId: string; signedTx: Transaction }>;\n  extInfo: T;\n}\n\nexport interface TxV0BuildData<T = Record<string, any>> extends Omit<TxBuildData<T>, \"transaction\" | \"execute\"> {\n  builder: TxBuilder;\n  transaction: VersionedTransaction;\n  buildProps?: {\n    lookupTableCache?: CacheLTA;\n    lookupTableAddress?: string[];\n  };\n  execute: (params?: ExecuteParams) => Promise<{ txId: string; signedTx: VersionedTransaction }>;\n}\n\ntype TxUpdateParams = {\n  txId: string;\n  status: \"success\" | \"error\" | \"sent\";\n  signedTx: Transaction | VersionedTransaction;\n};\nexport interface MultiTxExecuteParam extends ExecuteParams {\n  sequentially: boolean;\n  skipTxCount?: number;\n  onTxUpdate?: (completeTxs: TxUpdateParams[]) => void;\n}\nexport interface MultiTxBuildData<T = Record<string, any>> {\n  builder: TxBuilder;\n  transactions: Transaction[];\n  instructionTypes: string[];\n  signers: Signer[][];\n  execute: (executeParams?: MultiTxExecuteParam) => Promise<{ txIds: string[]; signedTxs: Transaction[] }>;\n  extInfo: T;\n}\n\nexport interface MultiTxV0BuildData<T = Record<string, any>>\n  extends Omit<MultiTxBuildData<T>, \"transactions\" | \"execute\"> {\n  builder: TxBuilder;\n  transactions: VersionedTransaction[];\n  buildProps?: {\n    lookupTableCache?: CacheLTA;\n    lookupTableAddress?: string[];\n  };\n  execute: (executeParams?: MultiTxExecuteParam) => Promise<{ txIds: string[]; signedTxs: VersionedTransaction[] }>;\n}\n\nexport type MakeMultiTxData<T = TxVersion.LEGACY, O = Record<string, any>> = T extends TxVersion.LEGACY\n  ? MultiTxBuildData<O>\n  : MultiTxV0BuildData<O>;\n\nexport type MakeTxData<T = TxVersion.LEGACY, O = Record<string, any>> = T extends TxVersion.LEGACY\n  ? TxBuildData<O>\n  : TxV0BuildData<O>;\n\nconst LOOP_INTERVAL = 2000;\n\nexport class TxBuilder {\n  private connection: Connection;\n  private owner?: Owner;\n  private instructions: TransactionInstruction[] = [];\n  private endInstructions: TransactionInstruction[] = [];\n  private lookupTableAddress: string[] = [];\n  private signers: Signer[] = [];\n  private instructionTypes: string[] = [];\n  private endInstructionTypes: string[] = [];\n  private feePayer: PublicKey;\n  private cluster: Cluster;\n  private signAllTransactions?: SignAllTransactions;\n  private blockhashCommitment?: Commitment;\n  private loopMultiTxStatus: boolean;\n\n  constructor(params: TxBuilderInit) {\n    this.connection = params.connection;\n    this.feePayer = params.feePayer;\n    this.signAllTransactions = params.signAllTransactions;\n    this.owner = params.owner;\n    this.cluster = params.cluster;\n    this.blockhashCommitment = params.blockhashCommitment;\n    this.loopMultiTxStatus = !!params.loopMultiTxStatus;\n  }\n\n  get AllTxData(): {\n    instructions: TransactionInstruction[];\n    endInstructions: TransactionInstruction[];\n    signers: Signer[];\n    instructionTypes: string[];\n    endInstructionTypes: string[];\n    lookupTableAddress: string[];\n  } {\n    return {\n      instructions: this.instructions,\n      endInstructions: this.endInstructions,\n      signers: this.signers,\n      instructionTypes: this.instructionTypes,\n      endInstructionTypes: this.endInstructionTypes,\n      lookupTableAddress: this.lookupTableAddress,\n    };\n  }\n\n  get allInstructions(): TransactionInstruction[] {\n    return [...this.instructions, ...this.endInstructions];\n  }\n\n  public async getComputeBudgetConfig(): Promise<ComputeBudgetConfig | undefined> {\n    const json = (\n      await axios.get<SolanaFeeInfoJson>(`https://solanacompass.com/api/fees?cacheFreshTime=${5 * 60 * 1000}`)\n    ).data;\n    const { avg } = json?.[15] ?? {};\n    if (!avg) return undefined;\n    return {\n      units: 600000,\n      microLamports: Math.min(Math.ceil((avg * 1000000) / 600000), 25000),\n    };\n  }\n\n  public addCustomComputeBudget(config?: ComputeBudgetConfig): boolean {\n    if (config) {\n      const { instructions, instructionTypes } = addComputeBudget(config);\n      this.instructions.unshift(...instructions);\n      this.instructionTypes.unshift(...instructionTypes);\n      return true;\n    }\n    return false;\n  }\n\n  public addTipInstruction(tipConfig?: TxTipConfig): boolean {\n    if (tipConfig) {\n      this.endInstructions.push(\n        SystemProgram.transfer({\n          fromPubkey: tipConfig.feePayer ?? this.feePayer,\n          toPubkey: new PublicKey(tipConfig.address),\n          lamports: BigInt(tipConfig.amount.toString()),\n        }),\n      );\n      this.endInstructionTypes.push(InstructionType.TransferTip);\n      return true;\n    }\n    return false;\n  }\n\n  public async calComputeBudget({\n    config: propConfig,\n    defaultIns,\n  }: {\n    config?: ComputeBudgetConfig;\n    defaultIns?: TransactionInstruction[];\n  }): Promise<void> {\n    try {\n      const config = propConfig || (await this.getComputeBudgetConfig());\n      if (this.addCustomComputeBudget(config)) return;\n      defaultIns && this.instructions.unshift(...defaultIns);\n    } catch {\n      defaultIns && this.instructions.unshift(...defaultIns);\n    }\n  }\n\n  public addInstruction({\n    instructions = [],\n    endInstructions = [],\n    signers = [],\n    instructionTypes = [],\n    endInstructionTypes = [],\n    lookupTableAddress = [],\n  }: AddInstructionParam): TxBuilder {\n    this.instructions.push(...instructions);\n    this.endInstructions.push(...endInstructions);\n    this.signers.push(...signers);\n    this.instructionTypes.push(...instructionTypes);\n    this.endInstructionTypes.push(...endInstructionTypes);\n    this.lookupTableAddress.push(...lookupTableAddress.filter((address) => address !== PublicKey.default.toString()));\n    return this;\n  }\n\n  public async versionBuild<O = Record<string, any>>({\n    txVersion,\n    extInfo,\n  }: {\n    txVersion?: TxVersion;\n    extInfo?: O;\n  }): Promise<MakeTxData<TxVersion.LEGACY, O> | MakeTxData<TxVersion.V0, O>> {\n    if (txVersion === TxVersion.V0) return (await this.buildV0({ ...(extInfo || {}) })) as MakeTxData<TxVersion.V0, O>;\n    return this.build<O>(extInfo) as MakeTxData<TxVersion.LEGACY, O>;\n  }\n\n  public build<O = Record<string, any>>(extInfo?: O): MakeTxData<TxVersion.LEGACY, O> {\n    const transaction = new Transaction();\n    if (this.allInstructions.length) transaction.add(...this.allInstructions);\n    transaction.feePayer = this.feePayer;\n    if (this.owner?.signer && !this.signers.some((s) => s.publicKey.equals(this.owner!.publicKey)))\n      this.signers.push(this.owner.signer);\n\n    return {\n      builder: this,\n      transaction,\n      signers: this.signers,\n      instructionTypes: [...this.instructionTypes, ...this.endInstructionTypes],\n      execute: async (params) => {\n        const { recentBlockHash: propBlockHash, skipPreflight = true, sendAndConfirm, notSendToRpc } = params || {};\n        const recentBlockHash = propBlockHash ?? (await getRecentBlockHash(this.connection, this.blockhashCommitment));\n        transaction.recentBlockhash = recentBlockHash;\n        if (this.signers.length) transaction.sign(...this.signers);\n\n        printSimulate([transaction]);\n        if (this.owner?.isKeyPair) {\n          const txId = sendAndConfirm\n            ? await sendAndConfirmTransaction(\n                this.connection,\n                transaction,\n                this.signers.find((s) => s.publicKey.equals(this.owner!.publicKey))\n                  ? this.signers\n                  : [...this.signers, this.owner.signer!],\n                { skipPreflight },\n              )\n            : await this.connection.sendRawTransaction(transaction.serialize(), { skipPreflight });\n\n          return {\n            txId,\n            signedTx: transaction,\n          };\n        }\n        if (this.signAllTransactions) {\n          const txs = await this.signAllTransactions([transaction]);\n          if (this.signers.length) {\n            for (const item of txs) {\n              try {\n                item.sign(...this.signers);\n              } catch (e) {\n                //\n              }\n            }\n          }\n          return {\n            txId: notSendToRpc ? \"\" : await this.connection.sendRawTransaction(txs[0].serialize(), { skipPreflight }),\n            signedTx: txs[0],\n          };\n        }\n        throw new Error(\"please provide owner in keypair format or signAllTransactions function\");\n      },\n      extInfo: extInfo || ({} as O),\n    };\n  }\n\n  public buildMultiTx<T = Record<string, any>>(params: {\n    extraPreBuildData?: MakeTxData<TxVersion.LEGACY>[];\n    extInfo?: T;\n  }): MultiTxBuildData {\n    const { extraPreBuildData = [], extInfo } = params;\n    const { transaction } = this.build(extInfo);\n\n    const filterExtraBuildData = extraPreBuildData.filter((data) => data.transaction.instructions.length > 0);\n\n    const allTransactions: Transaction[] = [transaction, ...filterExtraBuildData.map((data) => data.transaction)];\n    const allSigners: Signer[][] = [this.signers, ...filterExtraBuildData.map((data) => data.signers)];\n    const allInstructionTypes: string[] = [\n      ...this.instructionTypes,\n      ...filterExtraBuildData.map((data) => data.instructionTypes).flat(),\n    ];\n\n    if (this.owner?.signer) {\n      allSigners.forEach((signers) => {\n        if (!signers.some((s) => s.publicKey.equals(this.owner!.publicKey))) this.signers.push(this.owner!.signer!);\n      });\n    }\n\n    return {\n      builder: this,\n      transactions: allTransactions,\n      signers: allSigners,\n      instructionTypes: allInstructionTypes,\n      execute: async (executeParams?: MultiTxExecuteParam) => {\n        const {\n          sequentially,\n          onTxUpdate,\n          skipTxCount = 0,\n          recentBlockHash: propBlockHash,\n          skipPreflight = true,\n        } = executeParams || {};\n        const recentBlockHash = propBlockHash ?? (await getRecentBlockHash(this.connection, this.blockhashCommitment));\n        if (this.owner?.isKeyPair) {\n          if (sequentially) {\n            const txIds: string[] = [];\n            let i = 0;\n            for (const tx of allTransactions) {\n              ++i;\n              if (i <= skipTxCount) continue;\n              const txId = await sendAndConfirmTransaction(\n                this.connection,\n                tx,\n                this.signers.find((s) => s.publicKey.equals(this.owner!.publicKey))\n                  ? this.signers\n                  : [...this.signers, this.owner.signer!],\n                { skipPreflight },\n              );\n              txIds.push(txId);\n            }\n\n            return {\n              txIds,\n              signedTxs: allTransactions,\n            };\n          }\n          return {\n            txIds: await await Promise.all(\n              allTransactions.map(async (tx) => {\n                tx.recentBlockhash = recentBlockHash;\n                return await this.connection.sendRawTransaction(tx.serialize(), { skipPreflight });\n              }),\n            ),\n            signedTxs: allTransactions,\n          };\n        }\n\n        if (this.signAllTransactions) {\n          const partialSignedTxs = allTransactions.map((tx, idx) => {\n            tx.recentBlockhash = recentBlockHash;\n            if (allSigners[idx].length) tx.sign(...allSigners[idx]);\n            return tx;\n          });\n          printSimulate(partialSignedTxs);\n          const signedTxs = await this.signAllTransactions(partialSignedTxs);\n          if (sequentially) {\n            let i = 0;\n            const processedTxs: TxUpdateParams[] = [];\n            const checkSendTx = async (): Promise<void> => {\n              if (!signedTxs[i]) return;\n              const txId = await this.connection.sendRawTransaction(signedTxs[i].serialize(), { skipPreflight });\n              processedTxs.push({ txId, status: \"sent\", signedTx: signedTxs[i] });\n              onTxUpdate?.([...processedTxs]);\n              i++;\n              let confirmed = false;\n              // eslint-disable-next-line\n              let intervalId: NodeJS.Timer | null = null,\n                subSignatureId: number | null = null;\n              const cbk = (signatureResult: SignatureResult): void => {\n                intervalId !== null && clearInterval(intervalId);\n                subSignatureId !== null && this.connection.removeSignatureListener(subSignatureId);\n                const targetTxIdx = processedTxs.findIndex((tx) => tx.txId === txId);\n                if (targetTxIdx > -1) {\n                  if (processedTxs[targetTxIdx].status === \"error\" || processedTxs[targetTxIdx].status === \"success\")\n                    return;\n                  processedTxs[targetTxIdx].status = signatureResult.err ? \"error\" : \"success\";\n                }\n                onTxUpdate?.([...processedTxs]);\n                if (!signatureResult.err) checkSendTx();\n              };\n\n              if (this.loopMultiTxStatus)\n                intervalId = setInterval(async () => {\n                  if (confirmed) {\n                    clearInterval(intervalId!);\n                    return;\n                  }\n                  try {\n                    const r = await this.connection.getTransaction(txId, {\n                      commitment: \"confirmed\",\n                      maxSupportedTransactionVersion: TxVersion.V0,\n                    });\n                    if (r) {\n                      confirmed = true;\n                      clearInterval(intervalId!);\n                      cbk({ err: r.meta?.err || null });\n                      console.log(\"tx status from getTransaction:\", txId);\n                    }\n                  } catch (e) {\n                    confirmed = true;\n                    clearInterval(intervalId!);\n                    console.error(\"getTransaction timeout:\", e, txId);\n                  }\n                }, LOOP_INTERVAL);\n\n              subSignatureId = this.connection.onSignature(\n                txId,\n                (result) => {\n                  if (confirmed) {\n                    this.connection.removeSignatureListener(subSignatureId!);\n                    return;\n                  }\n                  confirmed = true;\n                  cbk(result);\n                },\n                \"confirmed\",\n              );\n              this.connection.getSignatureStatus(txId);\n            };\n            await checkSendTx();\n            return {\n              txIds: processedTxs.map((d) => d.txId),\n              signedTxs,\n            };\n          } else {\n            const txIds: string[] = [];\n            for (let i = 0; i < signedTxs.length; i += 1) {\n              const txId = await this.connection.sendRawTransaction(signedTxs[i].serialize(), { skipPreflight });\n              txIds.push(txId);\n            }\n            return {\n              txIds,\n              signedTxs,\n            };\n          }\n        }\n        throw new Error(\"please provide owner in keypair format or signAllTransactions function\");\n      },\n      extInfo: extInfo || {},\n    };\n  }\n\n  public async versionMultiBuild<T extends TxVersion, O = Record<string, any>>({\n    extraPreBuildData,\n    txVersion,\n    extInfo,\n  }: {\n    extraPreBuildData?: MakeTxData<TxVersion.V0>[] | MakeTxData<TxVersion.LEGACY>[];\n    txVersion?: T;\n    extInfo?: O;\n  }): Promise<MakeMultiTxData<T, O>> {\n    if (txVersion === TxVersion.V0)\n      return (await this.buildV0MultiTx({\n        extraPreBuildData: extraPreBuildData as MakeTxData<TxVersion.V0>[],\n        buildProps: extInfo || {},\n      })) as MakeMultiTxData<T, O>;\n    return this.buildMultiTx<O>({\n      extraPreBuildData: extraPreBuildData as MakeTxData<TxVersion.LEGACY>[],\n      extInfo,\n    }) as MakeMultiTxData<T, O>;\n  }\n\n  public async buildV0<O = Record<string, any>>(\n    props?: O & {\n      lookupTableCache?: CacheLTA;\n      lookupTableAddress?: string[];\n      forerunCreate?: boolean;\n      recentBlockhash?: string;\n    },\n  ): Promise<MakeTxData<TxVersion.V0, O>> {\n    const {\n      lookupTableCache = {},\n      lookupTableAddress = [],\n      forerunCreate,\n      recentBlockhash: propRecentBlockhash,\n      ...extInfo\n    } = props || {};\n    const lookupTableAddressAccount = {\n      ...(this.cluster === \"devnet\" ? {} : LOOKUP_TABLE_CACHE),\n      ...lookupTableCache,\n    };\n    const allLTA = Array.from(new Set<string>([...lookupTableAddress, ...this.lookupTableAddress]));\n    const needCacheLTA: PublicKey[] = [];\n    for (const item of allLTA) {\n      if (lookupTableAddressAccount[item] === undefined) needCacheLTA.push(new PublicKey(item));\n    }\n    const newCacheLTA = await getMultipleLookupTableInfo({ connection: this.connection, address: needCacheLTA });\n    for (const [key, value] of Object.entries(newCacheLTA)) lookupTableAddressAccount[key] = value;\n\n    const recentBlockhash = forerunCreate\n      ? PublicKey.default.toBase58()\n      : propRecentBlockhash ?? (await getRecentBlockHash(this.connection, this.blockhashCommitment));\n    const messageV0 = new TransactionMessage({\n      payerKey: this.feePayer,\n      recentBlockhash,\n      instructions: [...this.allInstructions],\n    }).compileToV0Message(Object.values(lookupTableAddressAccount));\n    if (this.owner?.signer && !this.signers.some((s) => s.publicKey.equals(this.owner!.publicKey)))\n      this.signers.push(this.owner.signer);\n    const transaction = new VersionedTransaction(messageV0);\n\n    transaction.sign(this.signers);\n\n    return {\n      builder: this,\n      transaction,\n      signers: this.signers,\n      instructionTypes: [...this.instructionTypes, ...this.endInstructionTypes],\n      execute: async (params) => {\n        const { skipPreflight = true, sendAndConfirm, notSendToRpc } = params || {};\n        printSimulate([transaction]);\n        if (this.owner?.isKeyPair) {\n          const txId = await this.connection.sendTransaction(transaction, { skipPreflight });\n          if (sendAndConfirm) {\n            await confirmTransaction(this.connection, txId);\n          }\n\n          return {\n            txId,\n            signedTx: transaction,\n          };\n        }\n        if (this.signAllTransactions) {\n          const txs = await this.signAllTransactions<VersionedTransaction>([transaction]);\n          if (this.signers.length) {\n            for (const item of txs) {\n              try {\n                item.sign(this.signers);\n              } catch (e) {\n                //\n              }\n            }\n          }\n          return {\n            txId: notSendToRpc ? \"\" : await this.connection.sendTransaction(txs[0], { skipPreflight }),\n            signedTx: txs[0],\n          };\n        }\n        throw new Error(\"please provide owner in keypair format or signAllTransactions function\");\n      },\n      extInfo: (extInfo || {}) as O,\n    };\n  }\n\n  public async buildV0MultiTx<T = Record<string, any>>(params: {\n    extraPreBuildData?: MakeTxData<TxVersion.V0>[];\n    buildProps?: T & {\n      lookupTableCache?: CacheLTA;\n      lookupTableAddress?: string[];\n      forerunCreate?: boolean;\n      recentBlockhash?: string;\n    };\n  }): Promise<MultiTxV0BuildData> {\n    const { extraPreBuildData = [], buildProps } = params;\n    const { transaction } = await this.buildV0(buildProps);\n\n    const filterExtraBuildData = extraPreBuildData.filter((data) => data.builder.instructions.length > 0);\n\n    const allTransactions: VersionedTransaction[] = [\n      transaction,\n      ...filterExtraBuildData.map((data) => data.transaction),\n    ];\n    const allSigners: Signer[][] = [this.signers, ...filterExtraBuildData.map((data) => data.signers)];\n    const allInstructionTypes: string[] = [\n      ...this.instructionTypes,\n      ...filterExtraBuildData.map((data) => data.instructionTypes).flat(),\n    ];\n\n    if (this.owner?.signer) {\n      allSigners.forEach((signers) => {\n        if (!signers.some((s) => s.publicKey.equals(this.owner!.publicKey))) this.signers.push(this.owner!.signer!);\n      });\n    }\n\n    allTransactions.forEach(async (tx, idx) => {\n      tx.sign(allSigners[idx]);\n    });\n\n    return {\n      builder: this,\n      transactions: allTransactions,\n      signers: allSigners,\n      instructionTypes: allInstructionTypes,\n      buildProps,\n      execute: async (executeParams?: MultiTxExecuteParam) => {\n        const { sequentially, onTxUpdate, recentBlockHash: propBlockHash, skipPreflight = true } = executeParams || {};\n        if (propBlockHash) allTransactions.forEach((tx) => (tx.message.recentBlockhash = propBlockHash));\n        printSimulate(allTransactions);\n        if (this.owner?.isKeyPair) {\n          if (sequentially) {\n            const txIds: string[] = [];\n            for (const tx of allTransactions) {\n              const txId = await this.connection.sendTransaction(tx, { skipPreflight });\n              await confirmTransaction(this.connection, txId);\n              txIds.push(txId);\n            }\n\n            return { txIds, signedTxs: allTransactions };\n          }\n\n          return {\n            txIds: await Promise.all(\n              allTransactions.map(async (tx) => {\n                return await this.connection.sendTransaction(tx, { skipPreflight });\n              }),\n            ),\n            signedTxs: allTransactions,\n          };\n        }\n\n        if (this.signAllTransactions) {\n          const signedTxs = await this.signAllTransactions(allTransactions);\n\n          if (sequentially) {\n            let i = 0;\n            const processedTxs: TxUpdateParams[] = [];\n            const checkSendTx = async (): Promise<void> => {\n              if (!signedTxs[i]) return;\n              const txId = await this.connection.sendTransaction(signedTxs[i], { skipPreflight });\n              processedTxs.push({ txId, status: \"sent\", signedTx: signedTxs[i] });\n              onTxUpdate?.([...processedTxs]);\n              i++;\n\n              let confirmed = false;\n              // eslint-disable-next-line\n              let intervalId: NodeJS.Timer | null = null,\n                subSignatureId: number | null = null;\n              const cbk = (signatureResult: SignatureResult): void => {\n                intervalId !== null && clearInterval(intervalId);\n                subSignatureId !== null && this.connection.removeSignatureListener(subSignatureId);\n                const targetTxIdx = processedTxs.findIndex((tx) => tx.txId === txId);\n                if (targetTxIdx > -1) {\n                  if (processedTxs[targetTxIdx].status === \"error\" || processedTxs[targetTxIdx].status === \"success\")\n                    return;\n                  processedTxs[targetTxIdx].status = signatureResult.err ? \"error\" : \"success\";\n                }\n                onTxUpdate?.([...processedTxs]);\n                if (!signatureResult.err) checkSendTx();\n              };\n\n              if (this.loopMultiTxStatus)\n                intervalId = setInterval(async () => {\n                  if (confirmed) {\n                    clearInterval(intervalId!);\n                    return;\n                  }\n                  try {\n                    const r = await this.connection.getTransaction(txId, {\n                      commitment: \"confirmed\",\n                      maxSupportedTransactionVersion: TxVersion.V0,\n                    });\n                    if (r) {\n                      confirmed = true;\n                      clearInterval(intervalId!);\n                      cbk({ err: r.meta?.err || null });\n                      console.log(\"tx status from getTransaction:\", txId);\n                    }\n                  } catch (e) {\n                    confirmed = true;\n                    clearInterval(intervalId!);\n                    console.error(\"getTransaction timeout:\", e, txId);\n                  }\n                }, LOOP_INTERVAL);\n\n              subSignatureId = this.connection.onSignature(\n                txId,\n                (result) => {\n                  if (confirmed) {\n                    this.connection.removeSignatureListener(subSignatureId!);\n                    return;\n                  }\n                  confirmed = true;\n                  cbk(result);\n                },\n                \"confirmed\",\n              );\n              this.connection.getSignatureStatus(txId);\n            };\n            checkSendTx();\n            return {\n              txIds: [],\n              signedTxs,\n            };\n          } else {\n            const txIds: string[] = [];\n            for (let i = 0; i < signedTxs.length; i += 1) {\n              const txId = await this.connection.sendTransaction(signedTxs[i], { skipPreflight });\n              txIds.push(txId);\n            }\n            return { txIds, signedTxs };\n          }\n        }\n        throw new Error(\"please provide owner in keypair format or signAllTransactions function\");\n      },\n      extInfo: buildProps || {},\n    };\n  }\n\n  public async sizeCheckBuild(\n    props?: Record<string, any> & { computeBudgetConfig?: ComputeBudgetConfig; splitIns?: TransactionInstruction[] },\n  ): Promise<MultiTxBuildData> {\n    const { splitIns = [], computeBudgetConfig, ...extInfo } = props || {};\n    const computeBudgetData: { instructions: TransactionInstruction[]; instructionTypes: string[] } =\n      computeBudgetConfig\n        ? addComputeBudget(computeBudgetConfig)\n        : {\n            instructions: [],\n            instructionTypes: [],\n          };\n\n    const signerKey: { [key: string]: Signer } = this.signers.reduce(\n      (acc, cur) => ({ ...acc, [cur.publicKey.toBase58()]: cur }),\n      {},\n    );\n\n    const allTransactions: Transaction[] = [];\n    const allSigners: Signer[][] = [];\n\n    let instructionQueue: TransactionInstruction[] = [];\n    let splitInsIdx = 0;\n    this.allInstructions.forEach((item) => {\n      const _itemIns = [...instructionQueue, item];\n      const _itemInsWithCompute = computeBudgetConfig ? [...computeBudgetData.instructions, ..._itemIns] : _itemIns;\n      const _signerStrs = new Set<string>(\n        _itemIns.map((i) => i.keys.filter((ii) => ii.isSigner).map((ii) => ii.pubkey.toString())).flat(),\n      );\n      const _signer = [..._signerStrs.values()].map((i) => new PublicKey(i));\n\n      if (\n        item !== splitIns[splitInsIdx] &&\n        instructionQueue.length < 12 &&\n        (checkLegacyTxSize({ instructions: _itemInsWithCompute, payer: this.feePayer, signers: _signer }) ||\n          checkLegacyTxSize({ instructions: _itemIns, payer: this.feePayer, signers: _signer }))\n      ) {\n        // current ins add to queue still not exceed tx size limit\n        instructionQueue.push(item);\n      } else {\n        if (instructionQueue.length === 0) throw Error(\"item ins too big\");\n        splitInsIdx += item === splitIns[splitInsIdx] ? 1 : 0;\n        // if add computeBudget still not exceed tx size limit\n        if (\n          checkLegacyTxSize({\n            instructions: computeBudgetConfig\n              ? [...computeBudgetData.instructions, ...instructionQueue]\n              : [...instructionQueue],\n            payer: this.feePayer,\n            signers: _signer,\n          })\n        ) {\n          allTransactions.push(new Transaction().add(...computeBudgetData.instructions, ...instructionQueue));\n        } else {\n          allTransactions.push(new Transaction().add(...instructionQueue));\n        }\n        allSigners.push(\n          Array.from(\n            new Set<string>(\n              instructionQueue.map((i) => i.keys.filter((ii) => ii.isSigner).map((ii) => ii.pubkey.toString())).flat(),\n            ),\n          )\n            .map((i) => signerKey[i])\n            .filter((i) => i !== undefined),\n        );\n        instructionQueue = [item];\n      }\n    });\n\n    if (instructionQueue.length > 0) {\n      const _signerStrs = new Set<string>(\n        instructionQueue.map((i) => i.keys.filter((ii) => ii.isSigner).map((ii) => ii.pubkey.toString())).flat(),\n      );\n      const _signers = [..._signerStrs.values()].map((i) => signerKey[i]).filter((i) => i !== undefined);\n\n      if (\n        checkLegacyTxSize({\n          instructions: computeBudgetConfig\n            ? [...computeBudgetData.instructions, ...instructionQueue]\n            : [...instructionQueue],\n          payer: this.feePayer,\n          signers: _signers.map((s) => s.publicKey),\n        })\n      ) {\n        allTransactions.push(new Transaction().add(...computeBudgetData.instructions, ...instructionQueue));\n      } else {\n        allTransactions.push(new Transaction().add(...instructionQueue));\n      }\n      allSigners.push(_signers);\n    }\n    allTransactions.forEach((tx) => (tx.feePayer = this.feePayer));\n\n    if (this.owner?.signer) {\n      allSigners.forEach((signers) => {\n        if (!signers.some((s) => s.publicKey.equals(this.owner!.publicKey))) signers.push(this.owner!.signer!);\n      });\n    }\n\n    return {\n      builder: this,\n      transactions: allTransactions,\n      signers: allSigners,\n      instructionTypes: this.instructionTypes,\n      execute: async (executeParams?: MultiTxExecuteParam) => {\n        const {\n          sequentially,\n          onTxUpdate,\n          skipTxCount = 0,\n          recentBlockHash: propBlockHash,\n          skipPreflight = true,\n        } = executeParams || {};\n        const recentBlockHash = propBlockHash ?? (await getRecentBlockHash(this.connection, this.blockhashCommitment));\n        allTransactions.forEach(async (tx, idx) => {\n          tx.recentBlockhash = recentBlockHash;\n          if (allSigners[idx].length) tx.sign(...allSigners[idx]);\n        });\n        printSimulate(allTransactions);\n        if (this.owner?.isKeyPair) {\n          if (sequentially) {\n            let i = 0;\n            const txIds: string[] = [];\n            for (const tx of allTransactions) {\n              ++i;\n              if (i <= skipTxCount) {\n                txIds.push(\"tx skipped\");\n                continue;\n              }\n              const txId = await sendAndConfirmTransaction(\n                this.connection,\n                tx,\n                this.signers.find((s) => s.publicKey.equals(this.owner!.publicKey))\n                  ? this.signers\n                  : [...this.signers, this.owner.signer!],\n                { skipPreflight },\n              );\n              txIds.push(txId);\n            }\n\n            return {\n              txIds,\n              signedTxs: allTransactions,\n            };\n          }\n          return {\n            txIds: await Promise.all(\n              allTransactions.map(async (tx) => {\n                return await this.connection.sendRawTransaction(tx.serialize(), { skipPreflight });\n              }),\n            ),\n            signedTxs: allTransactions,\n          };\n        }\n        if (this.signAllTransactions) {\n          const needSignedTx = await this.signAllTransactions(\n            allTransactions.slice(skipTxCount, allTransactions.length),\n          );\n          const signedTxs = [...allTransactions.slice(0, skipTxCount), ...needSignedTx];\n          if (sequentially) {\n            let i = 0;\n            const processedTxs: TxUpdateParams[] = [];\n            const checkSendTx = async (): Promise<void> => {\n              if (!signedTxs[i]) return;\n              if (i < skipTxCount) {\n                // success before, do not send again\n                processedTxs.push({ txId: \"\", status: \"success\", signedTx: signedTxs[i] });\n                onTxUpdate?.([...processedTxs]);\n                i++;\n                checkSendTx();\n              }\n              const txId = await this.connection.sendRawTransaction(signedTxs[i].serialize(), { skipPreflight });\n              processedTxs.push({ txId, status: \"sent\", signedTx: signedTxs[i] });\n              onTxUpdate?.([...processedTxs]);\n              i++;\n\n              let confirmed = false;\n              // eslint-disable-next-line\n              let intervalId: NodeJS.Timer | null = null,\n                subSignatureId: number | null = null;\n              const cbk = (signatureResult: SignatureResult): void => {\n                intervalId !== null && clearInterval(intervalId);\n                subSignatureId !== null && this.connection.removeSignatureListener(subSignatureId);\n                const targetTxIdx = processedTxs.findIndex((tx) => tx.txId === txId);\n                if (targetTxIdx > -1) {\n                  if (processedTxs[targetTxIdx].status === \"error\" || processedTxs[targetTxIdx].status === \"success\")\n                    return;\n                  processedTxs[targetTxIdx].status = signatureResult.err ? \"error\" : \"success\";\n                }\n                onTxUpdate?.([...processedTxs]);\n                if (!signatureResult.err) checkSendTx();\n              };\n\n              if (this.loopMultiTxStatus)\n                intervalId = setInterval(async () => {\n                  if (confirmed) {\n                    clearInterval(intervalId!);\n                    return;\n                  }\n                  try {\n                    const r = await this.connection.getTransaction(txId, {\n                      commitment: \"confirmed\",\n                      maxSupportedTransactionVersion: TxVersion.V0,\n                    });\n                    if (r) {\n                      confirmed = true;\n                      clearInterval(intervalId!);\n                      cbk({ err: r.meta?.err || null });\n                      console.log(\"tx status from getTransaction:\", txId);\n                    }\n                  } catch (e) {\n                    confirmed = true;\n                    clearInterval(intervalId!);\n                    console.error(\"getTransaction timeout:\", e, txId);\n                  }\n                }, LOOP_INTERVAL);\n\n              subSignatureId = this.connection.onSignature(\n                txId,\n                (result) => {\n                  if (confirmed) {\n                    this.connection.removeSignatureListener(subSignatureId!);\n                    return;\n                  }\n                  confirmed = true;\n                  cbk(result);\n                },\n                \"confirmed\",\n              );\n              this.connection.getSignatureStatus(txId);\n            };\n            await checkSendTx();\n            return {\n              txIds: processedTxs.map((d) => d.txId),\n              signedTxs,\n            };\n          } else {\n            const txIds: string[] = [];\n            for (let i = 0; i < signedTxs.length; i += 1) {\n              const txId = await this.connection.sendRawTransaction(signedTxs[i].serialize(), { skipPreflight });\n              txIds.push(txId);\n            }\n            return { txIds, signedTxs };\n          }\n        }\n        throw new Error(\"please provide owner in keypair format or signAllTransactions function\");\n      },\n      extInfo: extInfo || {},\n    };\n  }\n\n  public async sizeCheckBuildV0(\n    props?: Record<string, any> & {\n      computeBudgetConfig?: ComputeBudgetConfig;\n      lookupTableCache?: CacheLTA;\n      lookupTableAddress?: string[];\n      splitIns?: TransactionInstruction[];\n    },\n  ): Promise<MultiTxV0BuildData> {\n    const {\n      computeBudgetConfig,\n      splitIns = [],\n      lookupTableCache = {},\n      lookupTableAddress = [],\n      ...extInfo\n    } = props || {};\n    const lookupTableAddressAccount = {\n      ...(this.cluster === \"devnet\" ? {} : LOOKUP_TABLE_CACHE),\n      ...lookupTableCache,\n    };\n    const allLTA = Array.from(new Set<string>([...this.lookupTableAddress, ...lookupTableAddress]));\n    const needCacheLTA: PublicKey[] = [];\n    for (const item of allLTA) {\n      if (lookupTableAddressAccount[item] === undefined) needCacheLTA.push(new PublicKey(item));\n    }\n    const newCacheLTA = await getMultipleLookupTableInfo({ connection: this.connection, address: needCacheLTA });\n    for (const [key, value] of Object.entries(newCacheLTA)) lookupTableAddressAccount[key] = value;\n\n    const computeBudgetData: { instructions: TransactionInstruction[]; instructionTypes: string[] } =\n      computeBudgetConfig\n        ? addComputeBudget(computeBudgetConfig)\n        : {\n            instructions: [],\n            instructionTypes: [],\n          };\n\n    const blockHash = await getRecentBlockHash(this.connection, this.blockhashCommitment);\n\n    const signerKey: { [key: string]: Signer } = this.signers.reduce(\n      (acc, cur) => ({ ...acc, [cur.publicKey.toBase58()]: cur }),\n      {},\n    );\n    const allTransactions: VersionedTransaction[] = [];\n    const allSigners: Signer[][] = [];\n\n    let instructionQueue: TransactionInstruction[] = [];\n    let splitInsIdx = 0;\n    this.allInstructions.forEach((item) => {\n      const _itemIns = [...instructionQueue, item];\n      const _itemInsWithCompute = computeBudgetConfig ? [...computeBudgetData.instructions, ..._itemIns] : _itemIns;\n      if (\n        item !== splitIns[splitInsIdx] &&\n        instructionQueue.length < 12 &&\n        (checkV0TxSize({ instructions: _itemInsWithCompute, payer: this.feePayer, lookupTableAddressAccount }) ||\n          checkV0TxSize({ instructions: _itemIns, payer: this.feePayer, lookupTableAddressAccount }))\n      ) {\n        // current ins add to queue still not exceed tx size limit\n        instructionQueue.push(item);\n      } else {\n        if (instructionQueue.length === 0) throw Error(\"item ins too big\");\n        splitInsIdx += item === splitIns[splitInsIdx] ? 1 : 0;\n        const lookupTableAddress: undefined | CacheLTA = {};\n        for (const item of [...new Set<string>(allLTA)]) {\n          if (lookupTableAddressAccount[item] !== undefined) lookupTableAddress[item] = lookupTableAddressAccount[item];\n        }\n        // if add computeBudget still not exceed tx size limit\n        if (\n          computeBudgetConfig &&\n          checkV0TxSize({\n            instructions: [...computeBudgetData.instructions, ...instructionQueue],\n            payer: this.feePayer,\n            lookupTableAddressAccount,\n            recentBlockhash: blockHash,\n          })\n        ) {\n          const messageV0 = new TransactionMessage({\n            payerKey: this.feePayer,\n            recentBlockhash: blockHash,\n\n            instructions: [...computeBudgetData.instructions, ...instructionQueue],\n          }).compileToV0Message(Object.values(lookupTableAddressAccount));\n          allTransactions.push(new VersionedTransaction(messageV0));\n        } else {\n          const messageV0 = new TransactionMessage({\n            payerKey: this.feePayer,\n            recentBlockhash: blockHash,\n            instructions: [...instructionQueue],\n          }).compileToV0Message(Object.values(lookupTableAddressAccount));\n          allTransactions.push(new VersionedTransaction(messageV0));\n        }\n        allSigners.push(\n          Array.from(\n            new Set<string>(\n              instructionQueue.map((i) => i.keys.filter((ii) => ii.isSigner).map((ii) => ii.pubkey.toString())).flat(),\n            ),\n          )\n            .map((i) => signerKey[i])\n            .filter((i) => i !== undefined),\n        );\n        instructionQueue = [item];\n      }\n    });\n\n    if (instructionQueue.length > 0) {\n      const _signerStrs = new Set<string>(\n        instructionQueue.map((i) => i.keys.filter((ii) => ii.isSigner).map((ii) => ii.pubkey.toString())).flat(),\n      );\n      const _signers = [..._signerStrs.values()].map((i) => signerKey[i]).filter((i) => i !== undefined);\n\n      if (\n        computeBudgetConfig &&\n        checkV0TxSize({\n          instructions: [...computeBudgetData.instructions, ...instructionQueue],\n          payer: this.feePayer,\n          lookupTableAddressAccount,\n          recentBlockhash: blockHash,\n        })\n      ) {\n        const messageV0 = new TransactionMessage({\n          payerKey: this.feePayer,\n          recentBlockhash: blockHash,\n          instructions: [...computeBudgetData.instructions, ...instructionQueue],\n        }).compileToV0Message(Object.values(lookupTableAddressAccount));\n        allTransactions.push(new VersionedTransaction(messageV0));\n      } else {\n        const messageV0 = new TransactionMessage({\n          payerKey: this.feePayer,\n          recentBlockhash: blockHash,\n          instructions: [...instructionQueue],\n        }).compileToV0Message(Object.values(lookupTableAddressAccount));\n        allTransactions.push(new VersionedTransaction(messageV0));\n      }\n\n      allSigners.push(_signers);\n    }\n\n    if (this.owner?.signer) {\n      allSigners.forEach((signers) => {\n        if (!signers.some((s) => s.publicKey.equals(this.owner!.publicKey))) signers.push(this.owner!.signer!);\n      });\n    }\n\n    allTransactions.forEach((tx, idx) => {\n      tx.sign(allSigners[idx]);\n    });\n\n    return {\n      builder: this,\n      transactions: allTransactions,\n      buildProps: props,\n      signers: allSigners,\n      instructionTypes: this.instructionTypes,\n      execute: async (executeParams?: MultiTxExecuteParam) => {\n        const {\n          sequentially,\n          onTxUpdate,\n          skipTxCount = 0,\n          recentBlockHash: propBlockHash,\n          skipPreflight = true,\n        } = executeParams || {};\n        allTransactions.map(async (tx, idx) => {\n          if (allSigners[idx].length) tx.sign(allSigners[idx]);\n          if (propBlockHash) tx.message.recentBlockhash = propBlockHash;\n        });\n        printSimulate(allTransactions);\n        if (this.owner?.isKeyPair) {\n          if (sequentially) {\n            let i = 0;\n            const txIds: string[] = [];\n            for (const tx of allTransactions) {\n              ++i;\n              if (i <= skipTxCount) {\n                console.log(\"skip tx: \", i);\n                txIds.push(\"tx skipped\");\n                continue;\n              }\n              const txId = await this.connection.sendTransaction(tx, { skipPreflight });\n              await confirmTransaction(this.connection, txId);\n\n              txIds.push(txId);\n            }\n\n            return { txIds, signedTxs: allTransactions };\n          }\n\n          return {\n            txIds: await Promise.all(\n              allTransactions.map(async (tx) => {\n                return await this.connection.sendTransaction(tx, { skipPreflight });\n              }),\n            ),\n            signedTxs: allTransactions,\n          };\n        }\n        if (this.signAllTransactions) {\n          const needSignedTx = await this.signAllTransactions(\n            allTransactions.slice(skipTxCount, allTransactions.length),\n          );\n          const signedTxs = [...allTransactions.slice(0, skipTxCount), ...needSignedTx];\n          if (sequentially) {\n            let i = 0;\n            const processedTxs: TxUpdateParams[] = [];\n            const checkSendTx = async (): Promise<void> => {\n              if (!signedTxs[i]) return;\n              if (i < skipTxCount) {\n                // success before, do not send again\n                processedTxs.push({ txId: \"\", status: \"success\", signedTx: signedTxs[i] });\n                onTxUpdate?.([...processedTxs]);\n                i++;\n                checkSendTx();\n                return;\n              }\n              const txId = await this.connection.sendTransaction(signedTxs[i], { skipPreflight });\n              processedTxs.push({ txId, status: \"sent\", signedTx: signedTxs[i] });\n              onTxUpdate?.([...processedTxs]);\n              i++;\n\n              let confirmed = false;\n              // eslint-disable-next-line\n              let intervalId: NodeJS.Timer | null = null,\n                subSignatureId: number | null = null;\n              const cbk = (signatureResult: SignatureResult): void => {\n                intervalId !== null && clearInterval(intervalId);\n                subSignatureId !== null && this.connection.removeSignatureListener(subSignatureId);\n                const targetTxIdx = processedTxs.findIndex((tx) => tx.txId === txId);\n                if (targetTxIdx > -1) {\n                  if (processedTxs[targetTxIdx].status === \"error\" || processedTxs[targetTxIdx].status === \"success\")\n                    return;\n                  processedTxs[targetTxIdx].status = signatureResult.err ? \"error\" : \"success\";\n                }\n                onTxUpdate?.([...processedTxs]);\n                if (!signatureResult.err) checkSendTx();\n              };\n\n              if (this.loopMultiTxStatus)\n                intervalId = setInterval(async () => {\n                  if (confirmed) {\n                    clearInterval(intervalId!);\n                    return;\n                  }\n                  try {\n                    const r = await this.connection.getTransaction(txId, {\n                      commitment: \"confirmed\",\n                      maxSupportedTransactionVersion: TxVersion.V0,\n                    });\n                    if (r) {\n                      confirmed = true;\n                      clearInterval(intervalId!);\n                      cbk({ err: r.meta?.err || null });\n                      console.log(\"tx status from getTransaction:\", txId);\n                    }\n                  } catch (e) {\n                    confirmed = true;\n                    clearInterval(intervalId!);\n                    console.error(\"getTransaction timeout:\", e, txId);\n                  }\n                }, LOOP_INTERVAL);\n\n              subSignatureId = this.connection.onSignature(\n                txId,\n                (result) => {\n                  if (confirmed) {\n                    this.connection.removeSignatureListener(subSignatureId!);\n                    return;\n                  }\n                  confirmed = true;\n                  cbk(result);\n                },\n                \"confirmed\",\n              );\n              this.connection.getSignatureStatus(txId);\n            };\n            checkSendTx();\n            return {\n              txIds: [],\n              signedTxs,\n            };\n          } else {\n            const txIds: string[] = [];\n            for (let i = 0; i < signedTxs.length; i += 1) {\n              const txId = await this.connection.sendTransaction(signedTxs[i], { skipPreflight });\n              txIds.push(txId);\n            }\n            return { txIds, signedTxs };\n          }\n        }\n        throw new Error(\"please provide owner in keypair format or signAllTransactions function\");\n      },\n      extInfo: extInfo || {},\n    };\n  }\n}\n","import BN from \"bn.js\";\nexport const FEE_RATE_DENOMINATOR_VALUE = new BN(1_000_000);\n","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  MONITOR_BASE_HOST: \"https://monitor.raydium.io\",\n  SERVICE_1_BASE_HOST: \"https://service-v1.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  CPMM_CONFIG: \"/main/cpmm-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://lite-api.jup.ag/tokens/v1/tagged/verified\",\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  OWNER_LOCK_POSITION: \"/position/clmm-lock/{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\n  CPMM_LOCK: \"https://dynamic-ipfs.raydium.io/lock/cpmm/position\",\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 { Commitment, PublicKey, SystemProgram, TransactionInstruction } from \"@solana/web3.js\";\nimport { BigNumberish, getATAAddress, InstructionType, WSOLMint } from \"@/common\";\nimport {\n  AccountLayout,\n  createAssociatedTokenAccountInstruction,\n  TOKEN_PROGRAM_ID,\n  TOKEN_2022_PROGRAM_ID,\n} from \"@solana/spl-token\";\nimport { AddInstructionParam } from \"@/common/txTool/txTool\";\n\nimport ModuleBase, { ModuleBaseProps } from \"../moduleBase\";\nimport {\n  closeAccountInstruction,\n  createWSolAccountInstructions,\n  initTokenAccountInstruction,\n  makeTransferInstruction,\n} from \"./instruction\";\nimport { GetOrCreateTokenAccountParams, HandleTokenAccountParams, TokenAccount, TokenAccountRaw } from \"./types\";\nimport { generatePubKey, parseTokenAccountResp } from \"./util\";\n\nexport interface TokenAccountDataProp {\n  tokenAccounts?: TokenAccount[];\n  tokenAccountRawInfos?: TokenAccountRaw[];\n  notSubscribeAccountChange?: boolean;\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  private _notSubscribeAccountChange = false;\n  private _accountFetchTime = 0;\n\n  constructor(params: TokenAccountDataProp & ModuleBaseProps) {\n    super(params);\n    const { tokenAccounts, tokenAccountRawInfos, notSubscribeAccountChange } = params;\n    this._tokenAccounts = tokenAccounts || [];\n    this._tokenAccountRawInfos = tokenAccountRawInfos || [];\n    this._notSubscribeAccountChange = notSubscribeAccountChange ?? true;\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  set notSubscribeAccountChange(subscribe: boolean) {\n    this._notSubscribeAccountChange = subscribe;\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 resetTokenAccounts(): void {\n    if (this._clientOwnedToken) return;\n    this._tokenAccounts = [];\n    this._tokenAccountRawInfos = [];\n  }\n\n  public async fetchWalletTokenAccounts(config?: { forceUpdate?: boolean; commitment?: Commitment }): Promise<{\n    tokenAccounts: TokenAccount[];\n    tokenAccountRawInfos: TokenAccountRaw[];\n  }> {\n    if (\n      this._clientOwnedToken ||\n      (!config?.forceUpdate &&\n        this._tokenAccounts.length &&\n        Date.now() - this._accountFetchTime < (this._notSubscribeAccountChange ? 1000 * 5 : 1000 * 60 * 3))\n    ) {\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._accountFetchTime = Date.now();\n\n    if (!this._notSubscribeAccountChange) {\n      this._accountChangeListenerId && this.scope.connection.removeAccountChangeListener(this._accountChangeListenerId);\n      this._accountChangeListenerId = this.scope.connection.onAccountChange(\n        this.scope.ownerPubKey,\n        () => {\n          this.fetchWalletTokenAccounts({ forceUpdate: true });\n          this._accountListener.forEach((cb) =>\n            cb({ tokenAccounts: this._tokenAccounts, tokenAccountRawInfos: this._tokenAccountRawInfos }),\n          );\n        },\n        { commitment: config?.commitment },\n      );\n    }\n\n    return { tokenAccounts, tokenAccountRawInfos };\n  }\n\n  public clearAccountChangeCkb(): void {\n    if (this._accountChangeListenerId !== undefined)\n      this.scope.connection.removeAccountChangeListener(this._accountChangeListenerId);\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      assignSeed,\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      const _ataInTokenAcc = this.tokenAccountRawInfos.find((i) => i.pubkey.equals(ata))\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 if (_ataInTokenAcc === undefined) {\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 && _ataInTokenAcc === undefined) {\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      const newTokenAccount = generatePubKey({ fromPublicKey: owner, programId: tokenProgram, assignSeed });\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    feePayer?: PublicKey;\n  }): Promise<Promise<AddInstructionParam & { tokenAccount?: PublicKey }>> {\n    const { mint, programId = TOKEN_PROGRAM_ID, amount, useSOLBalance, handleTokenAccount, feePayer } = props;\n    let tokenAccount: PublicKey | undefined;\n    const txBuilder = this.createTxBuilder(feePayer);\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      loopMultiTxStatus: this.scope.loopMultiTxStatus,\n      api: this.scope.api,\n      signAllTransactions: this.scope.signAllTransactions,\n    });\n  }\n\n  public logDebug(...args: (string | number | Record<string, any>)[]): void {\n    this.logger.debug(joinMsg(args));\n  }\n\n  public logInfo(...args: (string | number | Record<string, any>)[]): void {\n    this.logger.info(joinMsg(args));\n  }\n\n  public logAndCreateError(...args: (string | number | Record<string, any>)[]): void {\n    const message = joinMsg(args);\n    throw new Error(message);\n  }\n\n  public checkDisabled(): void {\n    if (this.disabled || !this.scope) this.logAndCreateError(\"module not working\");\n  }\n}\n","import { Commitment, Connection, PublicKey, Signer, SystemProgram, TransactionInstruction } from \"@solana/web3.js\";\nimport BN from \"bn.js\";\nimport { BigNumberish, parseBigNumberish } from \"@/common\";\nimport {\n  createCloseAccountInstruction,\n  createInitializeAccountInstruction,\n  createTransferInstruction,\n  TOKEN_PROGRAM_ID,\n} from \"@solana/spl-token\";\nimport { AddInstructionParam } from \"@/common/txTool/txTool\";\nimport { InstructionType } from \"@/common/txTool/txType\";\nimport { TOKEN_WSOL } from \"../token/constant\";\nimport { generatePubKey } from \"./util\";\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, GetProgramAccountsResponse, Keypair, PublicKey, RpcResponseAndContext } from \"@solana/web3.js\";\nimport BN from \"bn.js\";\nimport { createLogger, getATAAddress } from \"../../common\";\nimport { TOKEN_PROGRAM_ID } from \"@solana/spl-token\";\nimport { sha256 } from \"@noble/hashes/sha256\";\nimport { splAccountLayout } from \"./layout\";\nimport { TokenAccount, TokenAccountRaw } from \"./types\";\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(String(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  assignSeed,\n}: {\n  fromPublicKey: PublicKey;\n  programId: PublicKey;\n  assignSeed?: string;\n}): { publicKey: PublicKey; seed: string } {\n  const seed = assignSeed ? btoa(assignSeed).slice(0, 32) : 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 { [key: string]: any; }> extends _Structure<T, P, D> {\n  /** @override */\n  decode(b: Buffer, offset?: number): D {\n    return super.decode(b, offset);\n  }\n}\n\nexport function struct<T, P extends string = \"\">(\n  fields: T,\n  property?: P,\n  decodePrefixes?: boolean,\n): T extends Layout<infer Value, infer Property>[]\n  ? Structure<\n    Value,\n    P,\n    {\n      [K in Exclude<Extract<Property, string>, \"\">]: Extract<T[number], Layout<any, K>> extends Layout<infer V, any>\n      ? V\n      : any;\n    }\n  >\n  : any {\n  //@ts-expect-error this type is not quite satisfied the define, but, never no need to worry about.\n  return new Structure(fields, property, decodePrefixes);\n}\n\nexport type GetLayoutSchemaFromStructure<T extends Structure<any, any, any>> = T extends Structure<any, any, infer S>\n  ? S\n  : any;\nexport type GetStructureFromLayoutSchema<S extends { [key: string]: any; }> = Structure<any, any, S>;\n\nexport class Union<Schema extends { [key: string]: any; }> extends _Union<Schema> {\n  encodeInstruction(instruction: any): Buffer {\n    const instructionMaxSpan = Math.max(...Object.values(this.registry).map((r) => r.span));\n    const b = Buffer.alloc(instructionMaxSpan);\n    return b.slice(0, this.encode(instruction, b));\n  }\n\n  decodeInstruction(instruction: any): Partial<Schema> {\n    return this.decode(instruction);\n  }\n}\nexport function union<UnionSchema extends { [key: string]: any } = any>(\n  discr: any,\n  defaultLayout?: any,\n  property?: string,\n): Union<UnionSchema> {\n  return new Union(discr, defaultLayout, property);\n}\n\nclass Zeros extends Blob {\n  decode(b: Buffer, offset: number): Buffer {\n    const slice = super.decode(b, offset);\n    if (!slice.every((v) => v === 0)) {\n      throw new Error(\"nonzero padding bytes\");\n    }\n    return slice;\n  }\n}\n\nexport function zeros(length: number): Zeros {\n  return new Zeros(length);\n}\n\nexport function seq<T, P extends string = \"\", AnotherP extends string = \"\">(\n  elementLayout: Layout<T, P>,\n  count: number | BN | Layout<BN | number, P>,\n  property?: AnotherP,\n): Layout<T[], AnotherP> {\n  let parsedCount: number;\n  const superCount =\n    typeof count === \"number\"\n      ? count\n      : isBN(count)\n        ? count.toNumber()\n        : new Proxy(count as unknown as Layout<number> /* pretend to be Layout<number> */, {\n          get(target, property): any {\n            if (!parsedCount) {\n              // get count in targetLayout. note that count may be BN\n              const countProperty = Reflect.get(target, \"count\");\n\n              // let targetLayout's  property:count be a number\n              parsedCount = isBN(countProperty) ? countProperty.toNumber() : countProperty;\n\n              // record the count\n              Reflect.set(target, \"count\", parsedCount);\n            }\n            return Reflect.get(target, property);\n          },\n          set(target, property, value): any {\n            if (property === \"count\") {\n              parsedCount = value;\n            }\n            return Reflect.set(target, property, value);\n          },\n        });\n\n  // @ts-expect-error force type\n  return _seq(elementLayout, superCount, property);\n}\n","import {\n  bits as _bits,\n  BitStructure as _BitStructure,\n  blob as _blob,\n  Blob as _Blob,\n  cstr as _cstr,\n  f32 as _f32,\n  f32be as _f32be,\n  f64 as _f64,\n  f64be as _f64be,\n  greedy as _greedy,\n  Layout as _Layout,\n  ns64 as _ns64,\n  ns64be as _ns64be,\n  nu64 as _nu64,\n  nu64be as _nu64be,\n  offset as _offset,\n  s16 as _s16,\n  s16be as _s16be,\n  s24 as _s24,\n  s24be as _s24be,\n  s32 as _s32,\n  s32be as _s32be,\n  s40 as _s40,\n  s40be as _s40be,\n  s48 as _s48,\n  s48be as _s48be,\n  s8 as _s8,\n  seq as _seq,\n  struct as _struct,\n  Structure as _Structure,\n  u16 as _u16,\n  u16be as _u16be,\n  u24 as _u24,\n  u24be as _u24be,\n  u32 as _u32,\n  u32be as _u32be,\n  u40 as _u40,\n  u40be as _u40be,\n  u48 as _u48,\n  u48be as _u48be,\n  u8 as _u8,\n  UInt as _UInt,\n  union as _union,\n  Union as _Union,\n  unionLayoutDiscriminator as _unionLayoutDiscriminator,\n  utf8 as _utf8,\n} from \"@solana/buffer-layout\";\n\n//#region ------------------- Layout -------------------\nexport interface Layout<T = any, P = \"\"> {\n  span: number;\n  property?: P;\n  decode(b: Buffer, offset?: number): T;\n  encode(src: T, b: Buffer, offset?: number): number;\n  getSpan(b: Buffer, offset?: number): number;\n  replicate<AP extends string>(name: AP): Layout<T, AP>;\n}\nexport interface LayoutConstructor {\n  new <T, P>(): Layout<T, P>; // for class extends syntex\n  new <T, P>(span?: T, property?: P): Layout<T, P>;\n  readonly prototype: Layout;\n}\nexport const Layout = _Layout as unknown as LayoutConstructor;\n//#endregion\n\n//#region ------------------- Structure -------------------\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport interface Structure<T = any, P = \"\", DecodeSchema extends { [key: string]: any } = any>\n  extends Layout<DecodeSchema, P> {\n  span: number;\n  decode(b: Buffer, offset?: number): DecodeSchema;\n  layoutFor<AP extends string>(property: AP): Layout<DecodeSchema[AP]>;\n  offsetOf<AP extends string>(property: AP): number;\n}\ninterface StructureConstructor {\n  new <T = any, P = \"\", DecodeSchema extends { [key: string]: any } = any>(): Structure<T, P, DecodeSchema>;\n  new <T = any, P = \"\", DecodeSchema extends { [key: string]: any } = any>(\n    fields: T,\n    property?: P,\n    decodePrefixes?: boolean,\n  ): Structure<T, P, DecodeSchema>;\n}\nexport const Structure = _Structure as unknown as StructureConstructor;\n//#endregion\n\n//#region ------------------- Union -------------------\nexport interface Union<UnionSchema extends { [key: string]: any } = any> extends Layout {\n  registry: object;\n  decode(b: Buffer, offset?: number): Partial<UnionSchema>;\n  addVariant(\n    variant: number,\n    layout: Structure<any, any, Partial<UnionSchema>> | Layout<any, keyof UnionSchema>,\n    property?: string,\n  ): any /* TEMP: code in Layout.js 1809 */;\n}\ninterface UnionConstructor {\n  new <UnionSchema extends { [key: string]: any } = any>(): Union<UnionSchema>;\n  new <UnionSchema extends { [key: string]: any } = any>(\n    discr: Layout<any, any>,\n    defaultLayout: Layout<any, any>,\n    property?: string,\n  ): Union<UnionSchema>;\n}\nexport const Union = _Union as unknown as UnionConstructor;\n//#endregion\n\n//#region ------------------- BitStructure -------------------\nexport type BitStructure<T = unknown /* TEMP */, P = \"\"> = Layout<T, P>;\ninterface BitStructureConstructor {\n  new (...params: any[]): BitStructure;\n}\nexport const BitStructure = _BitStructure as BitStructureConstructor;\n//#endregion\n\n//#region ------------------- UInt -------------------\nexport type UInt<T = any, P = \"\"> = Layout<T, P>;\ninterface UIntConstructor {\n  new <T, P>(span?: T, property?: P): UInt<T, P>;\n}\nexport const UInt = _UInt as UIntConstructor;\n//#endregion\n\n//#region ------------------- Blob -------------------\nexport type Blob<P extends string = \"\"> = Layout<Buffer, P>;\ninterface BlobConstructor {\n  new (...params: ConstructorParameters<LayoutConstructor>): Blob;\n}\nexport const Blob = _Blob as unknown as BlobConstructor;\n//#endregion\n\nexport const greedy = _greedy as <P extends string = \"\">(elementSpan?: number, property?: P) => Layout<number, P>;\nexport const u8 = _u8 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const u16 = _u16 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const u24 = _u24 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const u32 = _u32 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const u40 = _u40 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const u48 = _u48 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const nu64 = _nu64 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const u16be = _u16be as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const u24be = _u24be as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const u32be = _u32be as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const u40be = _u40be as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const u48be = _u48be as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const nu64be = _nu64be as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const s8 = _s8 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const s16 = _s16 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const s24 = _s24 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const s32 = _s32 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const s40 = _s40 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const s48 = _s48 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const ns64 = _ns64 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const s16be = _s16be as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const s24be = _s24be as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const s32be = _s32be as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const s40be = _s40be as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const s48be = _s48be as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const ns64be = _ns64be as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const f32 = _f32 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const f32be = _f32be as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const f64 = _f64 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const f64be = _f64be as <P extends string = \"\">(property?: P) => Layout<number, P>;\n\nexport const struct = _struct as <T, P extends string = \"\">(\n  fields: T,\n  property?: P,\n  decodePrefixes?: boolean,\n) => T extends Layout<infer Value, infer Property>[]\n  ? Structure<\n      Value,\n      P,\n      {\n        [K in Exclude<Extract<Property, string>, \"\">]: Extract<T[number], Layout<any, K>> extends Layout<infer V, any>\n          ? V\n          : any;\n      }\n    >\n  : any;\n\nexport const seq = _seq as unknown as <T, P>(\n  elementLayout: Layout<T, string>,\n  count: number | Layout<number, string>,\n  property?: P,\n) => Layout<T[]>;\nexport const union = _union as <UnionSchema extends { [key: string]: any } = any>(\n  discr: Layout<any, any>,\n  defaultLayout?: any,\n  property?: string,\n) => Union<UnionSchema>;\nexport const unionLayoutDiscriminator = _unionLayoutDiscriminator as <P extends string = \"\">(\n  layout: Layout<any, P>,\n  property?: P,\n) => any;\nexport const blob = _blob as unknown as <P extends string = \"\">(\n  length: number | Layout<number, P>,\n  property?: P,\n) => Blob<P>;\nexport const cstr = _cstr as <P extends string = \"\">(property?: P) => Layout<string, P>;\nexport const utf8 = _utf8 as <P extends string = \"\">(maxSpan: number, property?: P) => Layout<string, P>;\nexport const bits = _bits as unknown as <T, P extends string = \"\">(\n  word: Layout<T>,\n  msb?: boolean,\n  property?: P,\n) => BitStructure<T, P>; // TODO: not quite sure\nexport const offset = _offset as unknown as <T, P extends string = \"\">(\n  layout: Layout<T, P>,\n  offset?: number,\n  property?: P,\n) => Layout<T, P>;\n\nexport type GetStructureSchema<T extends Structure> = T extends Structure<any, any, infer S> ? S : unknown;\n","import { publicKey, struct, u32, u64, u8 } from \"../../marshmallow\";\n\nexport const splAccountLayout = struct([\n  publicKey(\"mint\"),\n  publicKey(\"owner\"),\n  u64(\"amount\"),\n  u32(\"delegateOption\"),\n  publicKey(\"delegate\"),\n  u8(\"state\"),\n  u32(\"isNativeOption\"),\n  u64(\"isNative\"),\n  u64(\"delegatedAmount\"),\n  u32(\"closeAuthorityOption\"),\n  publicKey(\"closeAuthority\"),\n]);\n","import { PublicKey, SystemProgram } from \"@solana/web3.js\";\nimport { createAssociatedTokenAccountInstruction } from \"@solana/spl-token\";\nimport { parseBigNumberish } from \"@/common\";\n\nimport { FormatFarmKeyOut } from \"../../api/type\";\nimport { AddInstructionParam, jsonInfo2PoolKeys } from \"@/common\";\nimport { BN_ZERO } from \"@/common/bignumber\";\nimport { getATAAddress } from \"@/common/pda\";\nimport { FARM_PROGRAM_ID_V6 } from \"@/common/programId\";\nimport { SOLMint, solToWSol, WSOLMint } from \"@/common/pubKey\";\nimport { MakeMultiTxData, MakeTxData } from \"@/common/txTool/txTool\";\nimport { InstructionType, TxVersion } from \"@/common/txTool/txType\";\nimport { generatePubKey } from \"../account/util\";\n\nimport Decimal from \"decimal.js\";\nimport { FormatFarmInfoOut, FormatFarmKeyOutV6 } from \"../../api/type\";\nimport { ComputeBudgetConfig, TxTipConfig } from \"../../raydium/type\";\nimport { createWSolAccountInstructions } from \"../account/instruction\";\nimport ModuleBase from \"../moduleBase\";\nimport { TOKEN_WSOL } from \"../token/constant\";\nimport {\n  FARM_LOCK_MINT,\n  FARM_LOCK_VAULT,\n  FARM_PROGRAM_TO_VERSION,\n  isValidFarmVersion,\n  poolTypeV6,\n  validateFarmRewards,\n} from \"./config\";\nimport {\n  createAssociatedLedgerAccountInstruction,\n  makeAddNewRewardInstruction,\n  makeCreateFarmInstruction,\n  makeCreatorWithdrawFarmRewardInstruction,\n  makeDepositInstructionV3,\n  makeDepositInstructionV5,\n  makeDepositInstructionV6,\n  makeRestartRewardInstruction,\n  makeWithdrawInstructionV3,\n  makeWithdrawInstructionV4,\n  makeWithdrawInstructionV5,\n  makeWithdrawInstructionV6,\n} from \"./instruction\";\nimport { FarmLedger, farmStateV6Layout } from \"./layout\";\nimport {\n  CreateFarm,\n  CreateFarmExtInfo,\n  FarmDWParam,\n  FarmRewardInfo,\n  FarmRewardInfoConfig,\n  RewardInfoKey,\n  UpdateFarmReward,\n  UpdateFarmRewards,\n} from \"./type\";\nimport {\n  calFarmRewardAmount,\n  farmRewardInfoToConfig,\n  getAssociatedAuthority,\n  getAssociatedLedgerAccount,\n  getAssociatedLedgerPoolAccount,\n  getFarmLedgerLayout,\n} from \"./util\";\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    feePayer,\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(feePayer);\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    feePayer,\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(feePayer);\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    feePayer,\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(feePayer);\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, feePayer } = 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(feePayer);\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, feePayer } = 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(feePayer);\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      txTipConfig,\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 (version === 4) this.logAndCreateError(\"V4 has suspended deposits:\", farmInfo.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: version as 3 | 5 | 6,\n    });\n\n    const txBuilder = this.createTxBuilder(feePayer);\n    txBuilder.addCustomComputeBudget(computeBudgetConfig);\n    txBuilder.addTipInstruction(txTipConfig);\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      txTipConfig,\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(feePayer);\n    txBuilder.addCustomComputeBudget(computeBudgetConfig);\n    txBuilder.addTipInstruction(txTipConfig);\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 (version !== 4) {\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\n      if (!ledgerData) {\n        // user has old none ata farm vault and don't have ata vault\n        if (version !== 6) {\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        }\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    }\n\n    if (deposited && deposited.isZero() && !(userAuxiliaryLedgers || []).length)\n      this.logAndCreateError(\"no deposited lp\", { farmId: farmInfo.id });\n\n    // if (!deposited && version !== 4) {\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 if (deposited) {\n    //   if (deposited.isZero() && !(userAuxiliaryLedgers || []).length)\n    //     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          : version === 4\n            ? makeWithdrawInstructionV4(insParams)\n            : makeWithdrawInstructionV3(insParams);\n\n    const insType = {\n      3: InstructionType.FarmV3Withdraw,\n      4: InstructionType.FarmV4Withdraw,\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    computeBudgetConfig,\n    txTipConfig,\n    feePayer,\n  }: {\n    farmInfo: FormatFarmInfoOut;\n    withdrawMint: PublicKey;\n    payer?: PublicKey;\n    computeBudgetConfig?: ComputeBudgetConfig;\n    txTipConfig?: TxTipConfig;\n    txVersion?: T;\n    feePayer?: PublicKey;\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.find((r) => solToWSol(r.mint.address).equals(solToWSol(withdrawMint)));\n    if (!rewardInfo) this.logAndCreateError(\"withdraw mint error\", \"rewardInfos\", farmInfo);\n\n    const rewardVault = rewardInfo?.vault ?? SOLMint;\n    const txBuilder = this.createTxBuilder(feePayer);\n\n    let userRewardToken: PublicKey;\n\n    if (withdrawMint.equals(SOLMint) || withdrawMint.equals(PublicKey.default)) {\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    txBuilder.addCustomComputeBudget(computeBudgetConfig);\n    txBuilder.addTipInstruction(txTipConfig);\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(feePayer);\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 { ApiV3Token } from \"../../api/type\";\nimport { createLogger } from \"../../common/logger\";\nimport { FARM_PROGRAM_ID_V3, FARM_PROGRAM_ID_V4, FARM_PROGRAM_ID_V5, FARM_PROGRAM_ID_V6 } from \"../../common/programId\";\n\nimport {\n  FarmLedgerLayout,\n  farmLedgerLayoutV3_2,\n  farmLedgerLayoutV5_2,\n  farmLedgerLayoutV6_1,\n  FarmStateLayout,\n  farmStateV3Layout,\n  farmStateV5Layout,\n  farmStateV6Layout,\n} from \"./layout\";\n\nconst logger = createLogger(\"Raydium_farm_config\");\n\nexport type FarmVersion = 3 | 4 | 5 | 6;\nexport const FARM_LOCK_MINT = new PublicKey(\"4k3Dyjzvzp8eMZWUXbBCjEvwSkkk59S5iCNLY3QrkX6R\");\nexport const FARM_LOCK_VAULT = new PublicKey(\"FrspKwj8i3pNmKwXreTveC4fu7KL5ZbGeXdZBe2XViu1\");\n\n/* ================= index ================= */\n// version => farm state layout\nexport const FARM_VERSION_TO_STATE_LAYOUT: {\n  [version in FarmVersion]?: FarmStateLayout;\n} = {\n  3: farmStateV3Layout,\n  5: farmStateV5Layout,\n  6: farmStateV6Layout,\n};\n\n// version => farm ledger layout\nexport const FARM_VERSION_TO_LEDGER_LAYOUT: {\n  [version in FarmVersion]?: FarmLedgerLayout;\n} = {\n  3: farmLedgerLayoutV3_2,\n  5: farmLedgerLayoutV5_2,\n  6: farmLedgerLayoutV6_1,\n};\n\nexport const isValidFarmVersion = (version: number): boolean => [3, 4, 5, 6].indexOf(version) !== -1;\n\nexport const validateFarmRewards = (params: {\n  version: number;\n  rewardInfos: { mint: ApiV3Token }[];\n  rewardTokenAccountsPublicKeys: PublicKey[];\n}): (() => string | undefined) => {\n  const { version, rewardInfos, rewardTokenAccountsPublicKeys } = params;\n\n  const infoMsg = `rewardInfo:${JSON.stringify(rewardInfos)}, rewardAccount:${JSON.stringify(\n    rewardTokenAccountsPublicKeys,\n  )}`;\n\n  const validator = {\n    3: (): string | undefined => {\n      if (rewardInfos.length !== 1 || rewardTokenAccountsPublicKeys.length !== 1) {\n        return `rewardInfos or rewardTokenAccounts lengths not equal 1: ${infoMsg}`;\n      }\n    },\n    5: (): string | undefined => {\n      if (rewardInfos.length !== rewardTokenAccountsPublicKeys.length) {\n        return `rewardInfos and rewardTokenAccounts lengths not equal: ${infoMsg}`;\n      }\n    },\n    6: (): string | undefined => {\n      if (!rewardTokenAccountsPublicKeys.length || rewardInfos.length !== rewardTokenAccountsPublicKeys.length) {\n        return `no rewardTokenAccounts or rewardInfos and rewardTokenAccounts lengths not equal: ${infoMsg}`;\n      }\n    },\n  };\n\n  return validator[version]?.();\n};\n\nexport const poolTypeV6 = { \"Standard SPL\": 0, \"Option tokens\": 1 };\n\nexport const FARM_PROGRAM_TO_VERSION: Record<string, 3 | 4 | 5 | 6> = {\n  [FARM_PROGRAM_ID_V3.toString()]: 3,\n  [FARM_PROGRAM_ID_V4.toString()]: 4,\n  [FARM_PROGRAM_ID_V5.toString()]: 5,\n  [FARM_PROGRAM_ID_V6.toString()]: 6,\n};\n","import { PublicKey } from \"@solana/web3.js\";\nimport BN from \"bn.js\";\n\nimport {\n  blob,\n  bool,\n  GetLayoutSchemaFromStructure,\n  GetStructureFromLayoutSchema,\n  GetStructureSchema,\n  i64,\n  i8,\n  publicKey,\n  seq,\n  struct,\n  u128,\n  u64,\n  u8,\n} from \"../../marshmallow\";\n\nimport { poolTypeV6 } from \"./config\";\nimport { RewardType } from \"./type\";\n\nexport const associatedLedgerAccountLayout = struct([u8(\"instruction\")]);\nexport const withdrawRewardLayout = struct([u8(\"instruction\")]);\n\nconst farmStateRewardInfoV6Layout = struct([\n  u64(\"rewardState\"),\n  u64(\"rewardOpenTime\"),\n  u64(\"rewardEndTime\"),\n  u64(\"rewardLastUpdateTime\"),\n  u64(\"totalReward\"),\n  u64(\"totalRewardEmissioned\"),\n  u64(\"rewardClaimed\"),\n  u64(\"rewardPerSecond\"),\n  u128(\"accRewardPerShare\"),\n  publicKey(\"rewardVault\"),\n  publicKey(\"rewardMint\"),\n  publicKey(\"rewardSender\"),\n  u64(\"rewardType\"),\n  seq(u64(), 15, \"padding\"),\n]);\n\nexport const realFarmStateV3Layout = struct([\n  u64(\"state\"),\n  u64(\"nonce\"),\n  publicKey(\"lpVault\"),\n  publicKey(\"rewardVault\"),\n  publicKey(),\n  publicKey(),\n  u64(),\n  u64(),\n  u64(\"totalReward\"),\n  u128(\"perShareReward\"),\n  u64(\"lastSlot\"),\n  u64(\"perSlotReward\"),\n]);\n\nexport const realFarmStateV5Layout = struct([\n  u64(\"state\"),\n  u64(\"nonce\"),\n  publicKey(\"lpVault\"),\n  publicKey(\"rewardVaultA\"),\n  u64(\"totalRewardA\"),\n  u128(\"perShareRewardA\"),\n  u64(\"perSlotRewardA\"),\n  u8(\"option\"),\n  publicKey(\"rewardVaultB\"),\n  blob(7),\n  u64(\"totalRewardB\"),\n  u128(\"perShareRewardB\"),\n  u64(\"perSlotRewardB\"),\n  u64(\"lastSlot\"),\n  publicKey(),\n]);\n\nexport const realFarmV6Layout = struct([\n  u64(),\n  u64(\"state\"),\n  u64(\"nonce\"),\n  u64(\"validRewardTokenNum\"),\n  u128(\"rewardMultiplier\"),\n  u64(\"rewardPeriodMax\"),\n  u64(\"rewardPeriodMin\"),\n  u64(\"rewardPeriodExtend\"),\n  publicKey(\"lpMint\"),\n  publicKey(\"lpVault\"),\n  seq(farmStateRewardInfoV6Layout, 5, \"rewardInfos\"),\n  publicKey(\"creator\"),\n  publicKey(),\n  seq(u64(), 32, \"padding\"),\n]);\n\nexport const farmStateV3Layout = new Proxy(\n  realFarmStateV3Layout as GetStructureFromLayoutSchema<\n    {\n      version: 3;\n      rewardInfos: {\n        rewardVault: PublicKey;\n        totalReward: BN;\n        perSlotReward: BN;\n        perShareReward: BN;\n      }[];\n    } & GetLayoutSchemaFromStructure<typeof realFarmStateV3Layout>\n  >,\n  {\n    get(target, p, receiver): any {\n      if (p === \"decode\")\n        return (...decodeParams: Parameters<typeof target[\"decode\"]>) => {\n          const originalResult = target.decode(...decodeParams);\n          return {\n            ...originalResult,\n            version: 3,\n            rewardInfos: [\n              {\n                rewardVault: originalResult.rewardVault,\n                totalReward: originalResult.totalReward,\n                perSlotReward: originalResult.perSlotReward,\n                perShareReward: originalResult.perShareReward,\n              },\n            ],\n          };\n        };\n      else return Reflect.get(target, p, receiver);\n    },\n  },\n);\n\nexport const farmStateV5Layout = new Proxy(\n  realFarmStateV5Layout as GetStructureFromLayoutSchema<\n    {\n      version: 5;\n      rewardInfos: {\n        rewardVault: PublicKey;\n        totalReward: BN;\n        perSlotReward: BN;\n        perShareReward: BN;\n      }[];\n    } & GetLayoutSchemaFromStructure<typeof realFarmStateV5Layout>\n  >,\n  {\n    get(target, p, receiver): any {\n      if (p === \"decode\")\n        return (...decodeParams: Parameters<typeof target[\"decode\"]>) => {\n          const originalResult = target.decode(...decodeParams);\n          return {\n            ...originalResult,\n            version: 5,\n            rewardInfos: [\n              {\n                rewardVault: originalResult.rewardVaultA,\n                totalReward: originalResult.totalRewardA,\n                perSlotReward: originalResult.perSlotRewardA,\n                perShareReward: originalResult.perShareRewardA,\n              },\n              {\n                rewardVault: originalResult.rewardVaultB,\n                totalReward: originalResult.totalRewardB,\n                perSlotReward: originalResult.perSlotRewardB,\n                perShareReward: originalResult.perShareRewardB,\n              },\n            ],\n          };\n        };\n      else return Reflect.get(target, p, receiver);\n    },\n  },\n);\n\nexport const farmStateV6Layout = new Proxy(\n  realFarmV6Layout as GetStructureFromLayoutSchema<\n    {\n      version: 6;\n      rewardInfos: {\n        rewardState: BN;\n        rewardOpenTime: BN;\n        rewardEndTime: BN;\n        rewardLastUpdateTime: BN;\n        totalReward: BN;\n        totalRewardEmissioned: BN;\n        rewardClaimed: BN;\n        rewardPerSecond: BN;\n        accRewardPerShare: BN;\n        rewardVault: PublicKey;\n        rewardMint: PublicKey;\n        rewardSender: PublicKey;\n        rewardType: RewardType;\n      }[];\n    } & GetLayoutSchemaFromStructure<typeof realFarmV6Layout>\n  >,\n  {\n    get(target, p, receiver): any {\n      if (p === \"decode\")\n        return (...decodeParams: Parameters<typeof target[\"decode\"]>) => {\n          const originalResult = target.decode(...decodeParams);\n          return {\n            ...originalResult,\n            version: 6,\n            rewardInfos: originalResult.rewardInfos.map((item) => ({\n              ...item,\n              rewardType: (Object.entries(poolTypeV6).find((i) => String(i[1]) === item.rewardType.toString()) ?? [\n                \"Standard SPL\",\n              ])[0],\n            })),\n          };\n        };\n      else return Reflect.get(target, p, receiver);\n    },\n  },\n);\n\nexport const farmRewardTimeInfoLayout = struct([\n  u64(\"isSet\"),\n  u64(\"rewardPerSecond\"),\n  u64(\"rewardOpenTime\"),\n  u64(\"rewardEndTime\"),\n  u64(\"rewardType\"),\n]);\n\nexport const farmRewardLayout = struct([\n  u8(\"instruction\"),\n  u64(\"nonce\"),\n  seq(farmRewardTimeInfoLayout, 5, \"rewardTimeInfo\"),\n]);\n\nexport const farmRewardRestartLayout = struct([\n  u8(\"instruction\"),\n  u64(\"rewardReopenTime\"),\n  u64(\"rewardEndTime\"),\n  u64(\"rewardPerSecond\"),\n]);\n\nexport const farmAddRewardLayout = struct([\n  u8(\"instruction\"),\n  u64(\"isSet\"),\n  u64(\"rewardPerSecond\"),\n  u64(\"rewardOpenTime\"),\n  u64(\"rewardEndTime\"),\n  u64(\"rewardType\"),\n]);\n\nexport type FarmStateLayoutV3 = typeof farmStateV3Layout;\nexport type FarmStateLayoutV5 = typeof farmStateV5Layout;\nexport type FarmStateLayoutV6 = typeof farmStateV6Layout;\n\nexport type FarmStateV3 = GetStructureSchema<FarmStateLayoutV3>;\nexport type FarmStateV5 = GetStructureSchema<FarmStateLayoutV5>;\nexport type FarmStateV6 = GetStructureSchema<FarmStateLayoutV6>;\n\nexport type FarmState = FarmStateV3 | FarmStateV5 | FarmStateV6;\n// farmStateLayoutV3\nexport type FarmStateLayout = FarmStateLayoutV3 | FarmStateLayoutV5 | FarmStateLayoutV6;\n\n/* ================= ledger layouts ================= */\nexport const farmLedgerLayoutV3_1 = struct([\n  u64(\"state\"),\n  publicKey(\"id\"),\n  publicKey(\"owner\"),\n  u64(\"deposited\"),\n  seq(u64(), 1, \"rewardDebts\"),\n]);\n\nexport const farmLedgerLayoutV3_2 = struct([\n  u64(\"state\"),\n  publicKey(\"id\"),\n  publicKey(\"owner\"),\n  u64(\"deposited\"),\n  seq(u128(), 1, \"rewardDebts\"),\n  u64(\"\"),\n  u64(\"voteLockedBalance\"),\n  seq(u64(), 15),\n]);\n\nexport const farmLedgerLayoutV5_1 = struct([\n  u64(\"state\"),\n  publicKey(\"id\"),\n  publicKey(\"owner\"),\n  u64(\"deposited\"),\n  seq(u64(), 2, \"rewardDebts\"),\n]);\n\nexport const farmLedgerLayoutV5_2 = struct([\n  u64(\"state\"),\n  publicKey(\"id\"),\n  publicKey(\"owner\"),\n  u64(\"deposited\"),\n  seq(u128(), 2, \"rewardDebts\"),\n  seq(u64(), 17),\n]);\n\nexport const farmLedgerLayoutV6_1 = struct([\n  u64(),\n  u64(\"state\"),\n  publicKey(\"id\"),\n  publicKey(\"owner\"),\n  u64(\"deposited\"),\n  seq(u128(), 5, \"rewardDebts\"),\n  seq(u64(), 16),\n]);\n\nexport type FarmLedgerLayoutV3_1 = typeof farmLedgerLayoutV3_1;\nexport type FarmLedgerLayoutV3_2 = typeof farmLedgerLayoutV3_2;\nexport type FarmLedgerLayoutV5_1 = typeof farmLedgerLayoutV5_1;\nexport type FarmLedgerLayoutV5_2 = typeof farmLedgerLayoutV5_2;\nexport type FarmLedgerLayoutV6_1 = typeof farmLedgerLayoutV6_1;\nexport type FarmLedgerLayout =\n  | FarmLedgerLayoutV3_1\n  | FarmLedgerLayoutV3_2\n  | FarmLedgerLayoutV5_1\n  | FarmLedgerLayoutV5_2\n  | FarmLedgerLayoutV6_1;\n\nexport type FarmLedgerV3_1 = GetStructureSchema<FarmLedgerLayoutV3_1>;\nexport type FarmLedgerV3_2 = GetStructureSchema<FarmLedgerLayoutV3_2>;\nexport type FarmLedgerV5_1 = GetStructureSchema<FarmLedgerLayoutV5_1>;\nexport type FarmLedgerV5_2 = GetStructureSchema<FarmLedgerLayoutV5_2>;\nexport type FarmLedgerV6_1 = GetStructureSchema<FarmLedgerLayoutV6_1>;\nexport type FarmLedger = FarmLedgerV3_1 | FarmLedgerV3_2 | FarmLedgerV5_1 | FarmLedgerV5_2 | FarmLedgerV6_1;\n\nexport const dwLayout = struct([u8(\"instruction\"), u64(\"amount\")]);\n\nexport const VoterVotingMintConfig = struct([\n  publicKey(\"mint\"),\n  publicKey(\"grantAuthority\"),\n  u64(\"baselineVoteWeightScaledFactor\"),\n  u64(\"maxExtraLockupVoteWeightScaledFactor\"),\n  u64(\"lockupSaturationSecs\"),\n\n  i8(\"digitShift\"), // TODO\n  seq(u8(), 7, \"reserved1\"),\n  seq(u64(), 7, \"reserved2\"),\n]);\n\nexport const VoterRegistrar = struct([\n  blob(8),\n  publicKey(\"governanceProgramId\"),\n  publicKey(\"realm\"),\n  publicKey(\"realmGoverningTokenMint\"),\n  publicKey(\"realmAuthority\"),\n\n  seq(u8(), 32, \"reserved1\"),\n  seq(VoterVotingMintConfig, 4, \"votingMints\"),\n\n  i64(\"timeOffset\"),\n  u8(\"bump\"),\n  seq(u8(), 7, \"reserved2\"),\n  seq(u64(), 11, \"reserved3\"),\n]);\n\nexport const VoterLockup = struct([i64(\"startTime\"), i64(\"endTime\"), u8(\"kind\"), seq(u8(), 15, \"reserved\")]);\n\nexport const VoterDepositEntry = struct([\n  seq(VoterLockup, 1, \"lockup\"),\n  u64(\"amountDeposited_native\"),\n  u64(\"amountInitiallyLockedNative\"),\n  bool(\"isUsed\"),\n  bool(\"allowClawback\"),\n  u8(\"votingMintConfigIdx\"),\n  seq(u8(), 29, \"reserved\"),\n]);\n\nexport const Voter = struct([\n  blob(8),\n  publicKey(\"voterAuthority\"),\n  publicKey(\"registrar\"),\n\n  seq(VoterDepositEntry, 32, \"deposits\"),\n\n  u8(\"voterBump\"),\n  u8(\"voterWweightRecordBump\"),\n  seq(u8(), 94, \"reserved\"),\n]);\n","import {\n  Connection,\n  PublicKey,\n  SystemProgram,\n  SYSVAR_CLOCK_PUBKEY,\n  SYSVAR_RENT_PUBKEY,\n  TransactionInstruction,\n} from \"@solana/web3.js\";\nimport BN from \"bn.js\";\nimport {\n  ASSOCIATED_TOKEN_PROGRAM_ID,\n  createAssociatedTokenAccountInstruction,\n  TOKEN_PROGRAM_ID,\n} from \"@solana/spl-token\";\n\nimport { FormatFarmKeyOut } from \"@/api/type\";\nimport { parseBigNumberish } from \"@/common\";\nimport { createLogger } from \"@/common/logger\";\nimport { getATAAddress } from \"@/common/pda\";\nimport {\n  accountMeta,\n  commonSystemAccountMeta,\n  INSTRUCTION_PROGRAM_ID,\n  RENT_PROGRAM_ID,\n  SOLMint,\n} from \"@/common/pubKey\";\nimport { InstructionType } from \"@/common/txTool/txType\";\nimport { bool, struct, u32, u64, u8 } from \"../../marshmallow\";\nimport { InstructionReturn } from \"../type\";\nimport { poolTypeV6 } from \"./config\";\nimport {\n  associatedLedgerAccountLayout,\n  dwLayout,\n  farmAddRewardLayout,\n  farmLedgerLayoutV3_2,\n  farmRewardLayout,\n  farmRewardRestartLayout,\n  withdrawRewardLayout,\n} from \"./layout\";\nimport {\n  getRegistrarAddress,\n  getTokenOwnerRecordAddress,\n  getVoterAddress,\n  getVoterWeightRecordAddress,\n  getVotingMintAuthority,\n  getVotingTokenMint,\n} from \"./pda\";\nimport { FarmRewardInfoConfig, RewardInfoKey, RewardType } from \"./type\";\nimport { getAssociatedLedgerAccount, getDepositEntryIndex } from \"./util\";\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 makeWithdrawInstructionV4(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 dataLayout = struct([u8('instruction'), u64('amount')])\n\n  const keys = [\n    accountMeta({ pubkey: id }),\n    accountMeta({ pubkey: new PublicKey(farmKeys.authority), isWritable: false }),\n    accountMeta({ pubkey: userAuxiliaryLedgers![0] }),\n    accountMeta({ pubkey: owner, isSigner: true, isWritable: false }),\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    accountMeta({ pubkey: SYSVAR_CLOCK_PUBKEY, isWritable: false }),\n    accountMeta({ pubkey: TOKEN_PROGRAM_ID, isWritable: false }),\n    accountMeta({ pubkey: rewardAccounts[1] }),\n    accountMeta({ pubkey: new PublicKey(farmKeys.rewardInfos[1].vault) }),\n  ]\n\n  const data = Buffer.alloc(dataLayout.span)\n  dataLayout.encode(\n    {\n      instruction: 2,\n      amount\n    },\n    data\n  )\n\n  return new TransactionInstruction({\n    keys,\n    programId,\n    data\n  })\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 { Connection, PublicKey } from \"@solana/web3.js\";\nimport BN from \"bn.js\";\n\nimport { RewardInfoV6 } from \"../../api/type\";\nimport { parseBigNumberish } from \"../../common\";\nimport { GetMultipleAccountsInfoConfig, getMultipleAccountsInfoWithCustomFlags } from \"../../common/accountInfo\";\nimport { DateParam, isDateAfter, isDateBefore } from \"../../common/date\";\nimport { createLogger } from \"../../common/logger\";\nimport { findProgramAddress, ProgramAddress } from \"../../common/txTool/txUtils\";\nimport { jsonInfo2PoolKeys } from \"../../common/utility\";\n\nimport { splAccountLayout } from \"../account/layout\";\nimport { SplAccount } from \"../account/types\";\nimport { FARM_VERSION_TO_LEDGER_LAYOUT, FARM_VERSION_TO_STATE_LAYOUT, poolTypeV6 } from \"./config\";\nimport { FarmLedger, FarmLedgerLayout, FarmState, FarmStateLayout } from \"./layout\";\nimport { FarmRewardInfo, FarmRewardInfoConfig } from \"./type\";\n\nimport { Voter, VoterRegistrar } from \"./layout\";\n\nconst logger = createLogger(\"Raydium.farm.util\");\ninterface AssociatedLedgerPoolAccount {\n  programId: PublicKey;\n  poolId: PublicKey;\n  mint: PublicKey;\n  type: \"lpVault\" | \"rewardVault\";\n}\n\nexport function getAssociatedLedgerPoolAccount({\n  programId,\n  poolId,\n  mint,\n  type,\n}: AssociatedLedgerPoolAccount): PublicKey {\n  const { publicKey } = findProgramAddress(\n    [\n      poolId.toBuffer(),\n      mint.toBuffer(),\n      Buffer.from(\n        type === \"lpVault\" ? \"lp_vault_associated_seed\" : type === \"rewardVault\" ? \"reward_vault_associated_seed\" : \"\",\n        \"utf-8\",\n      ),\n    ],\n    programId,\n  );\n  return publicKey;\n}\n\nexport function getAssociatedLedgerAccount({\n  programId,\n  poolId,\n  owner,\n  version,\n}: {\n  programId: PublicKey;\n  poolId: PublicKey;\n  owner: PublicKey;\n  version: 6 | 5 | 3;\n}): PublicKey {\n  const { publicKey } = findProgramAddress(\n    [\n      poolId.toBuffer(),\n      owner.toBuffer(),\n      Buffer.from(version === 6 ? \"farmer_info_associated_seed\" : \"staker_info_v2_associated_seed\", \"utf-8\"),\n    ],\n    programId,\n  );\n  return publicKey;\n}\n\nexport const getAssociatedAuthority = ({\n  programId,\n  poolId,\n}: {\n  programId: PublicKey;\n  poolId: PublicKey;\n}): ProgramAddress => findProgramAddress([poolId.toBuffer()], programId);\n\nexport function farmRewardInfoToConfig(data: FarmRewardInfo): FarmRewardInfoConfig {\n  return {\n    isSet: new BN(1),\n    rewardPerSecond: parseBigNumberish(data.perSecond),\n    rewardOpenTime: parseBigNumberish(data.openTime),\n    rewardEndTime: parseBigNumberish(data.endTime),\n    rewardType: parseBigNumberish(poolTypeV6[data.rewardType]),\n  };\n}\n\nexport function calFarmRewardAmount(data: Pick<RewardInfoV6, \"openTime\" | \"endTime\"> & { perSecond: string }): BN {\n  return parseBigNumberish(data.endTime).sub(parseBigNumberish(data.openTime)).mul(parseBigNumberish(data.perSecond));\n}\n\nexport function getFarmLedgerLayout(version: number): FarmLedgerLayout | undefined {\n  const ledgerLayout = FARM_VERSION_TO_LEDGER_LAYOUT[version];\n  if (!ledgerLayout) logger.logWithError(\"invalid version\", version);\n  return ledgerLayout;\n}\n\nexport function getFarmStateLayout(version: number): FarmStateLayout | undefined {\n  const stateLayout = FARM_VERSION_TO_STATE_LAYOUT[version];\n  if (!stateLayout) logger.logWithError(\"invalid version\", version);\n  return stateLayout;\n}\n\nexport function updateFarmPoolInfo(\n  poolInfo: FarmState,\n  lpVault: SplAccount,\n  slot: number,\n  chainTime: number,\n): FarmState {\n  if (poolInfo.version === 3 || poolInfo.version === 5) {\n    if (poolInfo.lastSlot.gte(new BN(slot))) return poolInfo;\n\n    const spread = new BN(slot).sub(poolInfo.lastSlot);\n    poolInfo.lastSlot = new BN(slot);\n\n    for (const itemRewardInfo of poolInfo.rewardInfos) {\n      if (lpVault.amount.eq(new BN(0))) continue;\n\n      const reward = itemRewardInfo.perSlotReward.mul(spread);\n      itemRewardInfo.perShareReward = itemRewardInfo.perShareReward.add(\n        reward.mul(new BN(10).pow(new BN(poolInfo.version === 3 ? 9 : 15))).div(lpVault.amount),\n      );\n      itemRewardInfo.totalReward = itemRewardInfo.totalReward.add(reward);\n    }\n  } else if (poolInfo.version === 6) {\n    for (const itemRewardInfo of poolInfo.rewardInfos) {\n      if (itemRewardInfo.rewardState.eq(new BN(0))) continue;\n      const updateTime = BN.min(new BN(chainTime), itemRewardInfo.rewardEndTime);\n      if (itemRewardInfo.rewardOpenTime.gte(updateTime)) continue;\n      const spread = updateTime.sub(itemRewardInfo.rewardLastUpdateTime);\n      let reward = spread.mul(itemRewardInfo.rewardPerSecond);\n      const leftReward = itemRewardInfo.totalReward.sub(itemRewardInfo.totalRewardEmissioned);\n      if (leftReward.lt(reward)) {\n        reward = leftReward;\n        itemRewardInfo.rewardLastUpdateTime = itemRewardInfo.rewardLastUpdateTime.add(\n          leftReward.div(itemRewardInfo.rewardPerSecond),\n        );\n      } else {\n        itemRewardInfo.rewardLastUpdateTime = updateTime;\n      }\n      if (lpVault.amount.eq(new BN(0))) continue;\n      itemRewardInfo.accRewardPerShare = itemRewardInfo.accRewardPerShare.add(\n        reward.mul(poolInfo.rewardMultiplier).div(lpVault.amount),\n      );\n      itemRewardInfo.totalRewardEmissioned = itemRewardInfo.totalRewardEmissioned.add(reward);\n    }\n  }\n  return poolInfo;\n}\n\ninterface FarmPoolsInfo {\n  [id: string]: {\n    state: FarmState;\n    lpVault: SplAccount;\n    ledger?: FarmLedger;\n    wrapped?: { pendingRewards: BN[] };\n  };\n}\n\nexport interface FarmFetchMultipleInfoParams {\n  connection: Connection;\n  farmPools: any[];\n  owner?: PublicKey;\n  config?: GetMultipleAccountsInfoConfig;\n  chainTime: number;\n}\n\nexport async function fetchMultipleFarmInfoAndUpdate({\n  connection,\n  farmPools,\n  owner,\n  config,\n  chainTime,\n}: FarmFetchMultipleInfoParams): Promise<FarmPoolsInfo> {\n  let hasNotV6Pool = false;\n  let hasV6Pool = false;\n  const tenBN = new BN(10);\n\n  const publicKeys: {\n    pubkey: PublicKey;\n    version: number;\n    key: \"state\" | \"lpVault\" | \"ledger\";\n    poolId: PublicKey;\n  }[] = [];\n\n  for (const poolInfo of farmPools) {\n    const pool = jsonInfo2PoolKeys(poolInfo);\n    if (pool.version === 6) hasV6Pool = true;\n    else hasNotV6Pool = true;\n\n    publicKeys.push(\n      {\n        pubkey: pool.id,\n        version: pool.version,\n        key: \"state\",\n        poolId: pool.id,\n      },\n      {\n        pubkey: pool.lpVault,\n        version: pool.version,\n        key: \"lpVault\",\n        poolId: pool.id,\n      },\n    );\n\n    if (owner) {\n      publicKeys.push({\n        pubkey: getAssociatedLedgerAccount({\n          programId: pool.programId,\n          poolId: pool.id,\n          owner,\n          version: poolInfo.version as 6 | 5 | 3,\n        }),\n        version: pool.version,\n        key: \"ledger\",\n        poolId: pool.id,\n      });\n    }\n  }\n\n  const poolsInfo: FarmPoolsInfo = {};\n  const accountsInfo = await getMultipleAccountsInfoWithCustomFlags(connection, publicKeys, config);\n  for (const { pubkey, version, key, poolId, accountInfo } of accountsInfo) {\n    const _poolId = poolId.toBase58();\n    poolsInfo[_poolId] = { ...poolsInfo[_poolId] };\n    if (key === \"state\") {\n      const stateLayout = getFarmStateLayout(version);\n      if (!accountInfo || !accountInfo.data || accountInfo.data.length !== stateLayout!.span)\n        logger.logWithError(`invalid farm state account info, pools.id, ${pubkey}`);\n      poolsInfo[_poolId].state = stateLayout!.decode(accountInfo!.data);\n    } else if (key === \"lpVault\") {\n      if (!accountInfo || !accountInfo.data || accountInfo.data.length !== splAccountLayout.span)\n        logger.logWithError(`invalid farm lp vault account info, pools.lpVault, ${pubkey}`);\n      poolsInfo[_poolId].lpVault = splAccountLayout.decode(accountInfo!.data);\n    } else if (key === \"ledger\") {\n      const legerLayout = getFarmLedgerLayout(version)!;\n      if (accountInfo && accountInfo.data) {\n        if (accountInfo.data.length !== legerLayout.span)\n          logger.logWithError(`invalid farm ledger account info, ledger, ${pubkey}`);\n        poolsInfo[_poolId].ledger = legerLayout.decode(accountInfo.data);\n      }\n    }\n  }\n\n  const slot = hasV6Pool || hasNotV6Pool ? await connection.getSlot() : 0;\n\n  for (const poolId of Object.keys(poolsInfo)) {\n    if (poolsInfo[poolId] === undefined) continue;\n    poolsInfo[poolId].state = updateFarmPoolInfo(poolsInfo[poolId].state, poolsInfo[poolId].lpVault, slot, chainTime);\n  }\n\n  for (const [poolId, { state, ledger }] of Object.entries(poolsInfo)) {\n    if (ledger) {\n      const multiplier =\n        state.version === 6\n          ? state.rewardMultiplier\n          : state.rewardInfos.length === 1\n            ? tenBN.pow(new BN(9))\n            : tenBN.pow(new BN(15));\n\n      const pendingRewards = state.rewardInfos.map((rewardInfo, index) => {\n        const rewardDebt = ledger.rewardDebts[index];\n        const pendingReward = ledger.deposited\n          .mul(state.version === 6 ? rewardInfo.accRewardPerShare : rewardInfo.perShareReward)\n          .div(multiplier)\n          .sub(rewardDebt);\n\n        return pendingReward;\n      });\n\n      poolsInfo[poolId].wrapped = {\n        ...poolsInfo[poolId].wrapped,\n        pendingRewards,\n      };\n    }\n  }\n\n  return poolsInfo;\n}\n/** deprecated */\nexport function judgeFarmType(\n  info: any,\n  currentTime: DateParam = Date.now(),\n): \"closed pool\" | \"normal fusion pool\" | \"dual fusion pool\" | undefined | \"upcoming pool\" {\n  if (info.version === 6) {\n    const rewardInfos = info.state.rewardInfos;\n    if (rewardInfos.every(({ rewardOpenTime }) => isDateBefore(currentTime, rewardOpenTime.toNumber(), { unit: \"s\" })))\n      return \"upcoming pool\";\n    if (rewardInfos.every(({ rewardEndTime }) => isDateAfter(currentTime, rewardEndTime.toNumber(), { unit: \"s\" })))\n      return \"closed pool\";\n  } else {\n    const perSlotRewards = info.state.rewardInfos.map(({ perSlotReward }) => perSlotReward);\n    if (perSlotRewards.length === 2) {\n      // v5\n      if (String(perSlotRewards[0]) === \"0\" && String(perSlotRewards[1]) !== \"0\") {\n        return \"normal fusion pool\"; // reward xxx token\n      }\n      if (String(perSlotRewards[0]) !== \"0\" && String(perSlotRewards[1]) !== \"0\") {\n        return \"dual fusion pool\"; // reward ray and xxx token\n      }\n      if (String(perSlotRewards[0]) === \"0\" && String(perSlotRewards[1]) === \"0\") {\n        return \"closed pool\";\n      }\n    } else if (perSlotRewards.length === 1) {\n      // v3\n      if (String(perSlotRewards[0]) === \"0\") {\n        return \"closed pool\";\n      }\n    }\n  }\n}\n\nexport async function getDepositEntryIndex(\n  connection: Connection,\n  registrar: PublicKey,\n  voter: PublicKey,\n  voterMint: PublicKey,\n): Promise<{ index: number; isInit: boolean }> {\n  const registrarAccountData = await connection.getAccountInfo(registrar);\n  if (registrarAccountData === null) throw Error(\"registrar info check error\");\n  const registrarData = VoterRegistrar.decode(registrarAccountData.data);\n\n  const votingMintConfigIndex = registrarData.votingMints.findIndex((i) => i.mint.equals(voterMint));\n\n  if (votingMintConfigIndex === -1) throw Error(\"find voter mint error\");\n\n  const voterAccountData = await connection.getAccountInfo(voter);\n  if (voterAccountData === null) return { index: votingMintConfigIndex, isInit: false }; // throw Error('voter info check error')\n\n  const voterData = Voter.decode(voterAccountData.data);\n\n  const depositEntryIndex = voterData.deposits.findIndex(\n    (i) => i.isUsed && i.votingMintConfigIdx === votingMintConfigIndex,\n  );\n  if (depositEntryIndex === -1) return { index: votingMintConfigIndex, isInit: false };\n  else return { index: depositEntryIndex, isInit: true };\n}\n","import { PublicKey, TransactionInstruction } from \"@solana/web3.js\";\nimport {\n  AmmV4Keys,\n  AmmV5Keys,\n  ApiV3PoolInfoConcentratedItem,\n  ApiV3PoolInfoStandardItem,\n  FormatFarmInfoOutV6,\n} from \"../../api/type\";\nimport { AccountLayout, NATIVE_MINT, TOKEN_PROGRAM_ID } from \"@solana/spl-token\";\nimport { getMultipleAccountsInfoWithCustomFlags } from \"@/common/accountInfo\";\nimport { BN_ZERO, divCeil } from \"@/common/bignumber\";\nimport { getATAAddress } from \"@/common/pda\";\nimport { BNDivCeil } from \"@/common/transfer\";\nimport { MakeMultiTxData, MakeTxData } from \"@/common/txTool/txTool\";\nimport { InstructionType, TxVersion } from \"@/common/txTool/txType\";\nimport { Percent, Token, TokenAmount } from \"../../module\";\nimport {\n  FARM_PROGRAM_TO_VERSION,\n  FarmLedger,\n  createAssociatedLedgerAccountInstruction,\n  getAssociatedLedgerAccount,\n  getFarmLedgerLayout,\n  makeWithdrawInstructionV3,\n  makeWithdrawInstructionV5,\n  makeWithdrawInstructionV6,\n} from \"../../raydium/farm\";\nimport { ClmmInstrument } from \"../clmm/instrument\";\nimport ModuleBase, { ModuleBaseProps } from \"../moduleBase\";\nimport { toToken } from \"../token\";\nimport { ComputeBudgetConfig } from \"../type\";\nimport { LIQUIDITY_FEES_DENOMINATOR, LIQUIDITY_FEES_NUMERATOR } from \"./constant\";\nimport {\n  createPoolV4InstructionV2,\n  makeAMMSwapInstruction,\n  makeAddLiquidityInstruction,\n  removeLiquidityInstruction,\n} from \"./instruction\";\nimport { createPoolFeeLayout, liquidityStateV4Layout } from \"./layout\";\nimport { StableLayout, getDxByDyBaseIn, getDyByDxBaseIn, getStablePrice } from \"./stable\";\nimport {\n  AddLiquidityParams,\n  AmmRpcData,\n  AmountSide,\n  ComputeAmountInParam,\n  ComputeAmountOutParam,\n  CreatePoolAddress,\n  CreatePoolParam,\n  CreateMarketAndPoolParam,\n  RemoveParams,\n  SwapParam,\n} from \"./type\";\nimport { getAssociatedConfigId, getAssociatedPoolKeys, toAmmComputePoolInfo } from \"./utils\";\n\nimport BN from \"bn.js\";\nimport Decimal from \"decimal.js\";\nimport { AMM_V4, FEE_DESTINATION_ID, OPEN_BOOK_PROGRAM, WSOLMint } from \"@/common\";\nimport { generatePubKey } from \"../account\";\nimport { makeCreateMarketInstruction, MarketExtInfo } from \"../marketV2\";\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; minAnotherAmount: 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 _slippageMin = new Percent(new BN(1)).sub(slippage);\n    const slippageAdjustedAmount = _slippage.mul(amountRaw).quotient;\n    const slippageAdjustedMinAmount = _slippageMin.mul(amountRaw).quotient;\n\n    const _anotherAmount = new TokenAmount(_anotherToken, amountRaw);\n    const _maxAnotherAmount = new TokenAmount(_anotherToken, slippageAdjustedAmount);\n    const _minAnotherAmount = new TokenAmount(_anotherToken, slippageAdjustedMinAmount);\n    this.logDebug(\"anotherAmount:\", _anotherAmount.toFixed(), \"maxAnotherAmount:\", _maxAnotherAmount.toFixed());\n\n    return {\n      anotherAmount: _anotherAmount,\n      maxAnotherAmount: _maxAnotherAmount,\n      minAnotherAmount: _minAnotherAmount,\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      otherAmountMin,\n      fixedSide,\n      config,\n      txVersion,\n      computeBudgetConfig,\n      txTipConfig,\n      feePayer,\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(feePayer);\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          otherAmountMin: otherAmountMin.raw,\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    txBuilder.addTipInstruction(txTipConfig);\n    if (txVersion === TxVersion.V0) return (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 {\n      poolInfo,\n      poolKeys: propPoolKeys,\n      lpAmount,\n      baseAmountMin,\n      quoteAmountMin,\n      config,\n      txVersion,\n      computeBudgetConfig,\n      txTipConfig,\n      feePayer,\n    } = 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(\"lpAmount:\", lpAmount);\n    this.logDebug(\"baseAmountMin:\", baseAmountMin);\n    this.logDebug(\"quoteAmountMin:\", quoteAmountMin);\n    if (lpAmount.isZero()) this.logAndCreateError(\"amount must greater than zero\", \"lpAmount\", lpAmount.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(feePayer);\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          lpAmount,\n          baseAmountMin,\n          quoteAmountMin,\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    txBuilder.addTipInstruction(txTipConfig);\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    feePayer,\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    feePayer?: PublicKey;\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(feePayer);\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 as 3 | 5 | 6,\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      lpAmount: amountIn,\n      baseAmountMin: 0,\n      quoteAmountMin: 0,\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(clmmPoolInfo.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)\n      return txBuilder.sizeCheckBuildV0({ computeBudgetConfig }) as Promise<MakeMultiTxData<T>>;\n    return txBuilder.sizeCheckBuild({ computeBudgetConfig }) 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    txTipConfig,\n    feePayer,\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(feePayer);\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    txBuilder.addTipInstruction(txTipConfig);\n    return txBuilder.versionBuild({\n      txVersion,\n      extInfo: {\n        address: createPoolKeys,\n      },\n    }) as Promise<MakeTxData<T, { address: CreatePoolAddress }>>;\n  }\n\n  public async createMarketAndPoolV4<T extends TxVersion>({\n    programId = AMM_V4,\n    marketProgram = OPEN_BOOK_PROGRAM,\n    feeDestinationId = FEE_DESTINATION_ID,\n    tokenProgram,\n\n    baseMintInfo,\n    quoteMintInfo,\n    baseAmount,\n    quoteAmount,\n    startTime,\n\n    ownerInfo,\n    lowestFeeMarket,\n    assignSeed,\n\n    associatedOnly = false,\n    checkCreateATAOwner = false,\n\n    lotSize = 1,\n    tickSize = 0.01,\n\n    txVersion,\n    computeBudgetConfig,\n    txTipConfig,\n    feePayer,\n  }: CreateMarketAndPoolParam<T>): Promise<\n    MakeMultiTxData<T, { address: CreatePoolAddress & MarketExtInfo[\"address\"] }>\n  > {\n    const wallet = this.scope.ownerPubKey;\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 seed = assignSeed\n      ? `${baseMintInfo.mint.toBase58().slice(0, 7)}-${quoteMintInfo.mint.toBase58().slice(0, 7)}-${assignSeed}`\n      : undefined;\n\n    const market = generatePubKey({\n      fromPublicKey: wallet,\n      programId: marketProgram,\n      assignSeed: seed ? `${seed}-market` : seed,\n    });\n    const requestQueue = generatePubKey({\n      fromPublicKey: wallet,\n      programId: marketProgram,\n      assignSeed: seed ? `${seed}-request` : seed,\n    });\n    const eventQueue = generatePubKey({\n      fromPublicKey: wallet,\n      programId: marketProgram,\n      assignSeed: seed ? `${seed}-event` : seed,\n    });\n    const bids = generatePubKey({\n      fromPublicKey: wallet,\n      programId: marketProgram,\n      assignSeed: seed ? `${seed}-bids` : seed,\n    });\n    const asks = generatePubKey({\n      fromPublicKey: wallet,\n      programId: marketProgram,\n      assignSeed: seed ? `${seed}-asks` : seed,\n    });\n    const baseVault = generatePubKey({\n      fromPublicKey: wallet,\n      programId: TOKEN_PROGRAM_ID,\n      assignSeed: seed ? `${seed}-baseVault` : seed,\n    });\n    const quoteVault = generatePubKey({\n      fromPublicKey: wallet,\n      programId: TOKEN_PROGRAM_ID,\n      assignSeed: seed ? `${seed}-quoteVault` : seed,\n    });\n\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            marketProgram,\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 ** baseMintInfo.decimals * lotSize));\n    const quoteLotSize = new BN(Math.round(lotSize * 10 ** quoteMintInfo.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: marketProgram,\n        vaultOwner,\n        baseMint: baseMintInfo.mint,\n        quoteMint: quoteMintInfo.mint,\n\n        id: market,\n        baseVault,\n        quoteVault,\n        requestQueue,\n        eventQueue,\n        bids,\n        asks,\n\n        feeRateBps,\n        quoteDustThreshold,\n        vaultSignerNonce,\n        baseLotSize,\n        quoteLotSize,\n        lowestFeeMarket,\n      },\n    });\n\n    const txBuilder = this.createTxBuilder(feePayer);\n    txBuilder.addInstruction({\n      instructions: allTxArr[0].transaction.instructions,\n      signers: allTxArr[0].signer,\n    });\n\n    for await (const txData of allTxArr.slice(1, allTxArr.length)) {\n      txBuilder.addInstruction({\n        instructions: txData.transaction.instructions,\n        signers: txData.signer,\n        instructionTypes: txData.instructionTypes,\n      });\n    }\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        assignSeed: mintAUseSOLBalance && seed ? `${seed}-wsol` : undefined,\n      });\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        assignSeed: mintBUseSOLBalance && seed ? `${seed}-wsol` : undefined,\n      });\n    txBuilder.addInstruction(ownerTokenAccountQuoteInstruction || {});\n\n    if (ownerTokenAccountBase === undefined) throw Error(\"you don't has base token account\");\n    if (ownerTokenAccountQuote === undefined) throw Error(\"you don't has quote token account\");\n\n    // create pool ins\n    const poolInfo = getAssociatedPoolKeys({\n      version: 4,\n      marketVersion: 3,\n      marketId: market.publicKey,\n      baseMint: baseMintInfo.mint,\n      quoteMint: quoteMintInfo.mint,\n      baseDecimals: baseMintInfo.decimals,\n      quoteDecimals: quoteMintInfo.decimals,\n      programId,\n      marketProgramId: marketProgram,\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    const splitIns =\n      mintAUseSOLBalance || mintBUseSOLBalance\n        ? ([\n          ownerTokenAccountBaseInstruction?.instructions?.[0] || ownerTokenAccountQuoteInstruction?.instructions?.[0],\n        ].filter((i) => !!i) as TransactionInstruction[])\n        : undefined;\n\n    if (txVersion === TxVersion.V0)\n      return txBuilder.sizeCheckBuildV0({\n        computeBudgetConfig,\n        splitIns,\n        address: {\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(baseMintInfo.mint),\n          quoteMint: new PublicKey(quoteMintInfo.mint),\n          ...createPoolKeys,\n        },\n      }) as Promise<MakeMultiTxData<T, { address: CreatePoolAddress & MarketExtInfo[\"address\"] }>>;\n\n    return txBuilder.sizeCheckBuild({\n      computeBudgetConfig,\n      splitIns,\n      address: {\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(baseMintInfo.mint),\n        quoteMint: new PublicKey(quoteMintInfo.mint),\n        ...createPoolKeys,\n      },\n    }) as Promise<MakeMultiTxData<T, { address: CreatePoolAddress & MarketExtInfo[\"address\"] }>>;\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    const mintDecimals = [poolInfo.mintA.decimals, poolInfo.mintB.decimals];\n\n    // input is fixed\n    const input = mintIn == poolInfo.mintA.address ? \"base\" : \"quote\";\n    if (input === \"quote\") {\n      reserves.reverse();\n      mintDecimals.reverse();\n    }\n\n    const [reserveIn, reserveOut] = reserves;\n    const [mintInDecimals, mintOutDecimals] = mintDecimals;\n    const isVersion4 = poolInfo.version === 4;\n    let currentPrice: Decimal;\n    if (isVersion4) {\n      currentPrice = new Decimal(reserveOut.toString())\n        .div(10 ** mintOutDecimals)\n        .div(new Decimal(reserveIn.toString()).div(10 ** mintInDecimals));\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 Decimal(amountOutRaw.toString())\n        .div(10 ** mintOutDecimals)\n        .div(new Decimal(amountInRaw.sub(feeRaw).toString()).div(10 ** mintInDecimals));\n    }\n\n    const priceImpact = currentPrice.sub(executionPrice).div(currentPrice).mul(100);\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 computeAmountIn({ poolInfo, amountOut, mintIn, mintOut, slippage }: ComputeAmountInParam): {\n    amountIn: BN;\n    maxAmountIn: BN;\n    currentPrice: Decimal;\n    executionPrice: Decimal | null;\n    priceImpact: Decimal;\n  } {\n    const { baseReserve, quoteReserve } = poolInfo;\n    if (mintIn.toString() !== poolInfo.mintA.address && mintIn.toString() !== poolInfo.mintB.address)\n      this.logAndCreateError(\"mintIn does not match pool\");\n    if (mintOut.toString() !== poolInfo.mintA.address && mintOut.toString() !== poolInfo.mintB.address)\n      this.logAndCreateError(\"mintOut does not match pool\");\n    this.logDebug(\"baseReserve:\", baseReserve.toString());\n    this.logDebug(\"quoteReserve:\", quoteReserve.toString());\n\n    const baseIn = mintIn.toString() === poolInfo.mintA.address;\n    const [tokenIn, tokenOut] = baseIn ? [poolInfo.mintA, poolInfo.mintB] : [poolInfo.mintB, poolInfo.mintA];\n\n    this.logDebug(\"currencyOut:\", tokenOut.symbol || tokenOut.address);\n    this.logDebug(\n      \"amountOut:\",\n      new Decimal(amountOut.toString())\n        .div(10 ** tokenOut.decimals)\n        .toDecimalPlaces(tokenOut.decimals)\n        .toString(),\n      tokenIn.symbol || tokenIn.address,\n    );\n    this.logDebug(\"slippage:\", `${slippage * 100}%`);\n\n    const reserves = [baseReserve, quoteReserve];\n\n    // output is fixed\n    const output = !baseIn ? \"base\" : \"quote\";\n    if (output === \"base\") {\n      reserves.reverse();\n    }\n    this.logDebug(\"output side:\", output);\n\n    const [reserveIn, reserveOut] = reserves;\n\n    const currentPrice = new Decimal(reserveOut.toString())\n      .div(10 ** poolInfo[baseIn ? \"mintB\" : \"mintA\"].decimals)\n      .div(new Decimal(reserveIn.toString()).div(10 ** poolInfo[baseIn ? \"mintA\" : \"mintB\"].decimals));\n    this.logDebug(\n      \"currentPrice:\",\n      `1 ${tokenIn.symbol || tokenIn.address} ≈ ${currentPrice.toString()} ${tokenOut.symbol || tokenOut.address}`,\n    );\n    this.logDebug(\n      \"currentPrice invert:\",\n      `1 ${tokenOut.symbol || tokenOut.address} ≈ ${new Decimal(1).div(currentPrice).toString()} ${tokenIn.symbol || tokenIn.address\n      }`,\n    );\n\n    let amountInRaw = new BN(0);\n    let amountOutRaw = amountOut;\n    if (!amountOutRaw.isZero()) {\n      // if out > reserve, out = reserve - 1\n      if (amountOutRaw.gt(reserveOut)) {\n        amountOutRaw = reserveOut.sub(new BN(1));\n      }\n\n      const denominator = reserveOut.sub(amountOutRaw);\n      const amountInWithoutFee = reserveIn.mul(amountOutRaw).div(denominator);\n\n      amountInRaw = amountInWithoutFee\n        .mul(LIQUIDITY_FEES_DENOMINATOR)\n        .div(LIQUIDITY_FEES_DENOMINATOR.sub(LIQUIDITY_FEES_NUMERATOR));\n    }\n\n    const maxAmountInRaw = new BN(new Decimal(amountInRaw.toString()).mul(1 + slippage).toFixed(0));\n\n    const amountIn = amountInRaw;\n    const maxAmountIn = maxAmountInRaw;\n    this.logDebug(\n      \"amountIn:\",\n      new Decimal(amountIn.toString())\n        .div(10 ** tokenIn.decimals)\n        .toDecimalPlaces(tokenIn.decimals)\n        .toString(),\n    );\n    this.logDebug(\n      \"maxAmountIn:\",\n      new Decimal(maxAmountIn.toString())\n        .div(10 ** tokenIn.decimals)\n        .toDecimalPlaces(tokenIn.decimals)\n        .toString(),\n    );\n\n    let executionPrice: Decimal | null = null;\n    if (!amountInRaw.isZero() && !amountOutRaw.isZero()) {\n      executionPrice = new Decimal(amountOutRaw.toString())\n        .div(10 ** tokenOut.decimals)\n        .div(new Decimal(amountInRaw.toString()).div(10 ** tokenIn.decimals));\n      this.logDebug(\n        \"executionPrice:\",\n        `1 ${tokenOut.symbol || tokenOut.address} ≈ ${executionPrice\n          .toDecimalPlaces(Math.max(poolInfo.mintA.decimals, poolInfo.mintB.decimals))\n          .toString()} ${tokenIn.symbol || tokenIn.address}`,\n      );\n      this.logDebug(\n        \"executionPrice invert:\",\n        `1 ${tokenOut.symbol || tokenOut.address} ≈ ${new Decimal(1)\n          .div(executionPrice)\n          .toDecimalPlaces(Math.max(poolInfo.mintA.decimals, poolInfo.mintB.decimals))\n          .toString()} ${tokenIn.symbol || tokenIn.address}`,\n      );\n    }\n\n    const exactQuote = currentPrice.mul(amountIn.toString());\n    const priceImpact = exactQuote.sub(amountOut.toString()).abs().div(exactQuote);\n    this.logDebug(\"priceImpact:\", `${priceImpact.toString()}%`);\n\n    return {\n      amountIn,\n      maxAmountIn,\n      currentPrice,\n      executionPrice,\n      priceImpact,\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    txTipConfig,\n    feePayer,\n  }: SwapParam<T>): Promise<MakeTxData<T>> {\n    const txBuilder = this.createTxBuilder(feePayer);\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    txBuilder.addTipInstruction(txTipConfig);\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 { Connection, Keypair, PublicKey, Signer, SystemProgram, TransactionInstruction } from \"@solana/web3.js\";\nimport BN from \"bn.js\";\nimport { ReturnTypeMakeInstructions } from \"@/raydium/type\";\nimport { ApiV3PoolInfoConcentratedItem, ApiV3Token, ClmmKeys } from \"@/api/type\";\nimport {\n  InstructionType,\n  MEMO_PROGRAM_ID,\n  MEMO_PROGRAM_ID2,\n  METADATA_PROGRAM_ID,\n  RENT_PROGRAM_ID,\n  createLogger,\n  getATAAddress,\n  parseBigNumberish,\n} from \"@/common\";\nimport { ASSOCIATED_TOKEN_PROGRAM_ID, TOKEN_2022_PROGRAM_ID, TOKEN_PROGRAM_ID } from \"@solana/spl-token\";\nimport { bool, s32, struct, u128, u64, u8 } from \"@/marshmallow\";\nimport { ClmmPositionLayout, ObservationInfoLayout } from \"./layout\";\nimport {\n  ClmmPoolPersonalPosition,\n  ClosePositionExtInfo,\n  InitRewardExtInfo,\n  ManipulateLiquidityExtInfo,\n  OpenPositionFromBaseExtInfo,\n  OpenPositionFromLiquidityExtInfo,\n  ClmmLockAddress,\n} from \"./type\";\nimport {\n  getPdaExBitmapAccount,\n  getPdaLockPositionId,\n  getPdaMetadataKey,\n  getPdaObservationAccount,\n  getPdaOperationAccount,\n  getPdaPersonalPositionAddress,\n  getPdaPoolId,\n  getPdaPoolRewardVaulId,\n  getPdaPoolVaultId,\n  getPdaProtocolPositionAddress,\n  getPdaTickArrayAddress,\n  getPdaLockClPositionIdV2,\n  getPdaMintExAccount,\n} from \"./utils/pda\";\nimport { PoolUtils } from \"./utils/pool\";\nimport { TickUtils } from \"./utils/tick\";\nimport { ZERO } from \"./utils/constants\";\nObservationInfoLayout.span; // do not delete this line\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  openPositionWithTokenEx: [77, 255, 174, 82, 125, 29, 201, 46],\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\nconst lockInsDataBuf = [188, 37, 179, 131, 82, 150, 84, 73];\nconst lockHarvestInsDataBuf = [16, 72, 250, 198, 14, 162, 212, 19];\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  forerunCreate?: boolean;\n  extendMintAccount?: PublicKey[];\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    extendMintAccount?: PublicKey[],\n  ): TransactionInstruction {\n    const dataLayout = struct([u128(\"sqrtPriceX64\"), u64(\"zero\")]);\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: true },\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      ...(extendMintAccount?.map((k) => ({ pubkey: k, isSigner: false, isWritable: false })) || []),\n    ];\n\n    const data = Buffer.alloc(dataLayout.span);\n    dataLayout.encode(\n      {\n        sqrtPriceX64,\n        zero: ZERO,\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      exBitmapAccount: PublicKey;\n      mintAVault: PublicKey;\n      mintBVault: PublicKey;\n    }>\n  > {\n    const { programId, owner, mintA, mintB, ammConfigId, initialPriceX64, extendMintAccount } = props;\n    const [mintAAddress, mintBAddress] = [new PublicKey(mintA.address), new PublicKey(mintB.address)];\n\n    const { publicKey: poolId } = getPdaPoolId(programId, ammConfigId, mintAAddress, mintBAddress);\n    const { publicKey: observationId } = getPdaObservationAccount(programId, poolId);\n    const { publicKey: mintAVault } = getPdaPoolVaultId(programId, poolId, mintAAddress);\n    const { publicKey: mintBVault } = getPdaPoolVaultId(programId, poolId, mintBAddress);\n    const exBitmapAccount = getPdaExBitmapAccount(programId, poolId).publicKey;\n\n    const ins = [\n      this.createPoolInstruction(\n        programId,\n        poolId,\n        owner,\n        ammConfigId,\n        observationId,\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        exBitmapAccount,\n        initialPriceX64,\n        extendMintAccount,\n      ),\n    ];\n\n    return {\n      signers: [],\n      instructions: ins,\n      instructionTypes: [InstructionType.CreateAccount, InstructionType.ClmmCreatePool],\n      address: { poolId, observationId, exBitmapAccount, 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 openPositionFromLiquidityInstruction22(\n    programId: PublicKey,\n    payer: PublicKey,\n    poolId: PublicKey,\n    positionNftOwner: PublicKey,\n    positionNftMint: PublicKey,\n    positionNftAccount: 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: 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: 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.openPositionWithTokenEx, ...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    nft2022,\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    nft2022?: boolean;\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 } = nft2022\n      ? getATAAddress(ownerInfo.wallet, nftMintAccount, TOKEN_2022_PROGRAM_ID)\n      : 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 = nft2022\n      ? this.openPositionFromLiquidityInstruction22(\n          programId,\n          ownerInfo.feePayer,\n          id,\n          ownerInfo.wallet,\n          nftMintAccount,\n          positionNftAccount,\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          PoolUtils.isOverflowDefaultTickarrayBitmap(poolInfo.config.tickSpacing, [\n            tickArrayLowerStartIndex,\n            tickArrayUpperStartIndex,\n          ])\n            ? getPdaExBitmapAccount(programId, id).publicKey\n            : undefined,\n        )\n      : 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          PoolUtils.isOverflowDefaultTickarrayBitmap(poolInfo.config.tickSpacing, [\n            tickArrayLowerStartIndex,\n            tickArrayUpperStartIndex,\n          ])\n            ? getPdaExBitmapAccount(programId, id).publicKey\n            : undefined,\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    nft2022,\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    nft2022?: boolean;\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 } = nft2022\n      ? getATAAddress(ownerInfo.wallet, nftMintAccount, TOKEN_2022_PROGRAM_ID)\n      : 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 = nft2022\n      ? this.openPositionFromBaseInstruction22(\n          programId,\n          ownerInfo.feePayer,\n          id,\n          ownerInfo.wallet,\n          nftMintAccount,\n          positionNftAccount,\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      : 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 openPositionFromBaseInstruction22(\n    programId: PublicKey,\n    payer: PublicKey,\n    poolId: PublicKey,\n    positionNftOwner: PublicKey,\n    positionNftMint: PublicKey,\n    positionNftAccount: 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: 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: 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.openPositionWithTokenEx, ...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    nft2022,\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    nft2022?: boolean;\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 } = nft2022\n      ? getATAAddress(ownerInfo.wallet, nftMintAccount, TOKEN_2022_PROGRAM_ID)\n      : 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 = nft2022\n      ? this.openPositionFromLiquidityInstruction22(\n          programId,\n          ownerInfo.wallet,\n          id,\n          ownerInfo.wallet,\n          nftMintAccount,\n          positionNftAccount,\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      : 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    nft2022?: boolean,\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: nft2022 ? TOKEN_2022_PROGRAM_ID : 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    nft2022,\n  }: {\n    poolInfo: ApiV3PoolInfoConcentratedItem;\n    poolKeys: ClmmKeys;\n    ownerPosition: ClmmPositionLayout;\n    ownerInfo: {\n      wallet: PublicKey;\n    };\n    nft2022?: boolean;\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 positionNftAccount = nft2022\n      ? getATAAddress(ownerInfo.wallet, ownerPosition.nftMint, TOKEN_2022_PROGRAM_ID).publicKey\n      : getATAAddress(ownerInfo.wallet, ownerPosition.nftMint, TOKEN_PROGRAM_ID).publicKey;\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        nft2022,\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    nft2022,\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    nft2022?: boolean;\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 } = nft2022\n      ? getATAAddress(ownerInfo.wallet, ownerPosition.nftMint, TOKEN_2022_PROGRAM_ID)\n      : 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    nft2022,\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    nft2022?: boolean;\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 } = nft2022\n      ? getATAAddress(ownerInfo.wallet, ownerPosition.nftMint, TOKEN_2022_PROGRAM_ID)\n      : 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    nft2022,\n  }: {\n    poolInfo: ApiV3PoolInfoConcentratedItem;\n    poolKeys: ClmmKeys;\n    ownerPosition: ClmmPositionLayout;\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    nft2022?: boolean;\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 } = nft2022\n      ? getATAAddress(ownerInfo.wallet, ownerPosition.nftMint, TOKEN_2022_PROGRAM_ID)\n      : getATAAddress(ownerInfo.wallet, ownerPosition.nftMint, programId);\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    const decreaseIns = 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    ins.push(decreaseIns);\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,\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 makeSwapBaseOutInstructions({\n    poolInfo,\n    poolKeys,\n    observationId,\n    ownerInfo,\n    outputMint,\n    amountOut,\n    amountInMax,\n    sqrtPriceLimitX64,\n    remainingAccounts,\n  }: {\n    poolInfo: Pick<ApiV3PoolInfoConcentratedItem, \"id\" | \"programId\" | \"mintA\" | \"mintB\" | \"config\">;\n    poolKeys: ClmmKeys;\n    observationId: PublicKey;\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.toBase58();\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 ? mintB : mintA,\n        isInputMintA ? mintA : mintB,\n\n        remainingAccounts,\n        observationId,\n        amountOut,\n        amountInMax,\n        sqrtPriceLimitX64,\n        false,\n        getPdaExBitmapAccount(programId, id).publicKey,\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  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 async makeLockPositions({\n    programId,\n    authProgramId,\n    poolProgramId,\n    payer,\n    wallet,\n    nftMint,\n    nft2022,\n    getEphemeralSigners,\n  }: {\n    programId: PublicKey;\n    authProgramId: PublicKey;\n    poolProgramId: PublicKey;\n    wallet: PublicKey;\n    payer: PublicKey;\n    nftMint: PublicKey;\n    nft2022?: boolean;\n    getEphemeralSigners?: (k: number) => any;\n  }): Promise<ReturnTypeMakeInstructions<ClmmLockAddress>> {\n    const signers: Signer[] = [];\n    let lockNftMint: PublicKey;\n    if (getEphemeralSigners) {\n      lockNftMint = new PublicKey((await getEphemeralSigners(1))[0]);\n    } else {\n      const _k = Keypair.generate();\n      signers.push(_k);\n      lockNftMint = _k.publicKey;\n    }\n\n    const positionNftAccount = nft2022\n      ? getATAAddress(wallet, nftMint, TOKEN_2022_PROGRAM_ID).publicKey\n      : getATAAddress(wallet, nftMint, TOKEN_PROGRAM_ID).publicKey;\n    const { publicKey: positionId } = getPdaPersonalPositionAddress(poolProgramId, nftMint);\n    const lockPositionId = getPdaLockClPositionIdV2(programId, lockNftMint).publicKey;\n    const lockNftAccount = getATAAddress(wallet, lockNftMint, TOKEN_PROGRAM_ID).publicKey;\n    const metadataAccount = getPdaMetadataKey(lockNftMint).publicKey;\n\n    const ins = ClmmInstrument.lockPositionInstructionV2({\n      programId,\n      auth: authProgramId,\n      payer,\n      positionOwner: wallet,\n      lockOwner: wallet,\n      positionNftAccount,\n      positionId,\n      lockPositionId,\n      lockNftMint,\n      lockNftAccount,\n      metadataAccount,\n      withMetadata: true,\n      nft2022,\n\n      positionNftMint: nftMint,\n      authPositionNftAccount: getATAAddress(authProgramId, nftMint, nft2022 ? TOKEN_2022_PROGRAM_ID : TOKEN_PROGRAM_ID)\n        .publicKey,\n      positionNftProgram: nft2022 ? TOKEN_2022_PROGRAM_ID : TOKEN_PROGRAM_ID,\n    });\n\n    return {\n      address: {\n        positionId,\n        lockPositionId,\n        lockNftAccount,\n        lockNftMint,\n        positionNftAccount,\n        metadataAccount,\n      },\n      instructions: [ins],\n      signers,\n      instructionTypes: [InstructionType.ClmmLockPosition],\n      lookupTableAddress: [],\n    };\n  }\n\n  static lockPositionInstructionV2({\n    programId,\n    auth,\n    payer,\n    positionOwner,\n    lockOwner,\n    positionNftAccount,\n    positionId,\n    positionNftMint,\n    authPositionNftAccount,\n    positionNftProgram,\n    lockPositionId,\n    lockNftMint,\n    lockNftAccount,\n    metadataAccount,\n    withMetadata,\n  }: {\n    programId: PublicKey;\n    auth: PublicKey;\n    payer: PublicKey;\n    positionOwner: PublicKey;\n    lockOwner: PublicKey;\n    positionNftAccount: PublicKey;\n    positionId: PublicKey;\n    positionNftMint: PublicKey;\n    authPositionNftAccount: PublicKey;\n    positionNftProgram: PublicKey;\n    lockPositionId: PublicKey;\n    lockNftMint: PublicKey;\n    lockNftAccount: PublicKey;\n    metadataAccount: PublicKey;\n    withMetadata: boolean;\n    nft2022?: boolean;\n  }): TransactionInstruction {\n    const keys = [\n      { pubkey: auth, isSigner: false, isWritable: false },\n      { pubkey: payer, isSigner: true, isWritable: true },\n      { pubkey: positionOwner, isSigner: true, isWritable: true },\n      { pubkey: lockOwner, isSigner: false, isWritable: false },\n      { pubkey: positionNftAccount, isSigner: false, isWritable: true },\n      { pubkey: positionId, isSigner: false, isWritable: false },\n      { pubkey: positionNftMint, isSigner: false, isWritable: true },\n      { pubkey: authPositionNftAccount, isSigner: false, isWritable: true },\n      { pubkey: lockPositionId, isSigner: false, isWritable: true },\n      { pubkey: lockNftMint, isSigner: true, isWritable: true },\n      { pubkey: lockNftAccount, isSigner: false, isWritable: true },\n      { pubkey: metadataAccount, isSigner: false, isWritable: true },\n      { pubkey: METADATA_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      { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },\n      { pubkey: positionNftProgram, isSigner: false, isWritable: false },\n      { pubkey: SystemProgram.programId, isSigner: false, isWritable: false },\n    ];\n    const dataLayout = struct([bool(\"withMetadata\")]);\n    const data = Buffer.alloc(dataLayout.span);\n    dataLayout.encode(\n      {\n        withMetadata,\n      },\n      data,\n    );\n    const aData = Buffer.from([...lockInsDataBuf, ...data]);\n    return new TransactionInstruction({\n      keys,\n      programId,\n      data: aData,\n    });\n  }\n\n  static lockPositionInstruction({\n    programId,\n    authProgramId,\n    poolProgramId,\n    owner,\n    positionNft,\n  }: {\n    programId: PublicKey;\n    authProgramId: PublicKey;\n    poolProgramId: PublicKey;\n    owner: PublicKey;\n    positionNft: PublicKey;\n  }): TransactionInstruction {\n    const { publicKey: nftAccount } = getATAAddress(owner, positionNft, TOKEN_PROGRAM_ID);\n    const { publicKey: positionId } = getPdaPersonalPositionAddress(poolProgramId, positionNft);\n\n    const keys = [\n      { pubkey: authProgramId, isSigner: false, isWritable: false },\n      { pubkey: owner, isSigner: true, isWritable: false },\n      { pubkey: nftAccount, isSigner: false, isWritable: true },\n      { pubkey: positionId, isSigner: false, isWritable: false },\n      { pubkey: getPdaLockPositionId(programId, positionId).publicKey, isSigner: false, isWritable: true },\n      { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },\n      { pubkey: SystemProgram.programId, isSigner: false, isWritable: false },\n    ];\n    return new TransactionInstruction({\n      keys,\n      programId,\n      data: Buffer.from(lockInsDataBuf),\n    });\n  }\n\n  static harvestLockPositionInstruction(props: {\n    poolKeys: ClmmKeys;\n    programId: PublicKey;\n    authProgramId: PublicKey;\n    ownerPosition: ClmmPositionLayout;\n    owner: PublicKey;\n    ownerRewardAccounts: PublicKey[];\n    userVaultA: PublicKey;\n    userVaultB: PublicKey;\n  }): TransactionInstruction {\n    const [poolProgramId, poolId] = [new PublicKey(props.poolKeys.programId), new PublicKey(props.poolKeys.id)];\n\n    const tickArrayLowerStartIndex = TickUtils.getTickArrayStartIndexByTick(\n      props.ownerPosition.tickLower,\n      props.poolKeys.config.tickSpacing,\n    );\n    const tickArrayUpperStartIndex = TickUtils.getTickArrayStartIndexByTick(\n      props.ownerPosition.tickUpper,\n      props.poolKeys.config.tickSpacing,\n    );\n    const { publicKey: tickArrayLower } = getPdaTickArrayAddress(poolProgramId, poolId, tickArrayLowerStartIndex);\n    const { publicKey: tickArrayUpper } = getPdaTickArrayAddress(poolProgramId, poolId, tickArrayUpperStartIndex);\n    const { publicKey: nftAccount } = getATAAddress(props.owner, props.ownerPosition.nftMint, TOKEN_PROGRAM_ID);\n    const { publicKey: positionId } = getPdaPersonalPositionAddress(poolProgramId, props.ownerPosition.nftMint);\n    const { publicKey: protocolPosition } = getPdaProtocolPositionAddress(\n      poolProgramId,\n      poolId,\n      props.ownerPosition.tickLower,\n      props.ownerPosition.tickUpper,\n    );\n\n    const rewardAccounts: {\n      poolRewardVault: PublicKey;\n      ownerRewardVault: PublicKey;\n      rewardMint: PublicKey;\n    }[] = [];\n\n    for (let i = 0; i < props.poolKeys.rewardInfos.length; i++) {\n      rewardAccounts.push({\n        poolRewardVault: new PublicKey(props.poolKeys.rewardInfos[i].vault),\n        ownerRewardVault: props.ownerRewardAccounts[i],\n        rewardMint: new PublicKey(props.poolKeys.rewardInfos[i].mint.address),\n      });\n    }\n\n    const remainingAccounts = [\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: props.authProgramId, isSigner: false, isWritable: false },\n      { pubkey: getPdaLockPositionId(props.programId, positionId).publicKey, isSigner: false, isWritable: false },\n      { pubkey: poolProgramId, isSigner: false, isWritable: false },\n      { pubkey: props.owner, isSigner: true, isWritable: false },\n      { pubkey: nftAccount, isSigner: false, isWritable: true },\n      { pubkey: positionId, isSigner: false, isWritable: true },\n      { pubkey: poolId, isSigner: false, isWritable: true },\n      { pubkey: protocolPosition, isSigner: false, isWritable: true },\n      { pubkey: new PublicKey(props.poolKeys.vault.A), isSigner: false, isWritable: true },\n      { pubkey: new PublicKey(props.poolKeys.vault.B), isSigner: false, isWritable: true },\n      { pubkey: tickArrayLower, isSigner: false, isWritable: true },\n      { pubkey: tickArrayUpper, isSigner: false, isWritable: true },\n      { pubkey: props.userVaultA, isSigner: false, isWritable: true },\n      { pubkey: props.userVaultB, 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: MEMO_PROGRAM_ID2, isSigner: false, isWritable: false },\n      { pubkey: new PublicKey(props.poolKeys.mintA.address), isSigner: false, isWritable: false },\n      { pubkey: new PublicKey(props.poolKeys.mintB.address), isSigner: false, isWritable: false },\n      ...remainingAccounts,\n    ];\n\n    return new TransactionInstruction({\n      keys,\n      programId: props.programId,\n      data: Buffer.from(lockHarvestInsDataBuf),\n    });\n  }\n\n  static harvestLockPositionInstructionV2({\n    programId,\n    auth,\n    lockPositionId,\n    clmmProgram,\n    lockOwner,\n    lockNftMint,\n    lockNftAccount,\n    positionNftAccount,\n    positionId,\n    poolId,\n    protocolPosition,\n    vaultA,\n    vaultB,\n    tickArrayLower,\n    tickArrayUpper,\n    userVaultA,\n    userVaultB,\n    mintA,\n    mintB,\n    rewardAccounts,\n    exTickArrayBitmap,\n  }: {\n    programId: PublicKey;\n    auth: PublicKey;\n    lockPositionId: PublicKey;\n    clmmProgram: PublicKey;\n    lockOwner: PublicKey;\n    lockNftMint: PublicKey;\n    lockNftAccount: PublicKey;\n    positionNftAccount: PublicKey;\n    positionId: PublicKey;\n    poolId: PublicKey;\n    protocolPosition: PublicKey;\n    vaultA: PublicKey;\n    vaultB: PublicKey;\n    tickArrayLower: PublicKey;\n    tickArrayUpper: PublicKey;\n    userVaultA: PublicKey;\n    userVaultB: PublicKey;\n    mintA: PublicKey;\n    mintB: PublicKey;\n    rewardAccounts: {\n      poolRewardVault: PublicKey;\n      ownerRewardVault: PublicKey;\n      rewardMint: PublicKey;\n    }[];\n\n    exTickArrayBitmap?: PublicKey;\n  }): TransactionInstruction {\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: auth, isSigner: false, isWritable: false },\n      { pubkey: lockOwner, isSigner: true, isWritable: false },\n      // { pubkey: lockNftMint, isSigner: false, isWritable: false },\n      { pubkey: lockNftAccount, isSigner: false, isWritable: true },\n      { pubkey: lockPositionId, isSigner: false, isWritable: false },\n      { pubkey: clmmProgram, isSigner: false, isWritable: false },\n      { pubkey: positionNftAccount, isSigner: false, isWritable: true },\n      { pubkey: positionId, isSigner: false, isWritable: true },\n      { pubkey: poolId, isSigner: false, isWritable: true },\n      { pubkey: protocolPosition, isSigner: false, isWritable: true },\n      { pubkey: vaultA, isSigner: false, isWritable: true },\n      { pubkey: vaultB, isSigner: false, isWritable: true },\n      { pubkey: tickArrayLower, isSigner: false, isWritable: true },\n      { pubkey: tickArrayUpper, isSigner: false, isWritable: true },\n      { pubkey: userVaultA, isSigner: false, isWritable: true },\n      { pubkey: userVaultB, 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: MEMO_PROGRAM_ID2, isSigner: false, isWritable: false },\n      { pubkey: mintA, isSigner: false, isWritable: false },\n      { pubkey: mintB, isSigner: false, isWritable: false },\n      ...remainingAccounts,\n    ];\n\n    return new TransactionInstruction({\n      keys,\n      programId,\n      data: Buffer.from(lockHarvestInsDataBuf),\n    });\n  }\n}\n","import { PublicKey } from \"@solana/web3.js\";\nimport BN from \"bn.js\";\nimport Decimal from \"decimal.js\";\n\nimport { ApiV3PoolInfoConcentratedItem } from \"../../../api/type\";\nimport { ClmmPoolInfo, TickArrayBitmapExtensionType } from \"../type\";\nimport { MAX_TICK, MIN_TICK } from \"./constants\";\nimport { SqrtPriceMath, TickMath } from \"./math\";\nimport { getPdaTickArrayAddress } from \"./pda\";\nimport { TickQuery } from \"./tickQuery\";\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      -7680,\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\";\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  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 { EpochInfo, PublicKey } from \"@solana/web3.js\";\nimport BN from \"bn.js\";\nimport Decimal from \"decimal.js\";\n\nimport { ApiV3PoolInfoConcentratedItem } from \"../../../api/type\";\nimport { getTransferAmountFeeV2, minExpirationTime } from \"../../../common/transfer\";\nimport { ReturnTypeGetLiquidityAmountOut, TickArrayBitmapExtensionType } from \"../type\";\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  Q128,\n  Q64,\n  U64Resolution,\n  ZERO,\n} from \"./constants\";\nimport { getPdaTickArrayAddress } from \"./pda\";\nimport { PoolUtils } from \"./pool\";\nimport { Tick, TickArray, TickUtils } from \"./tick\";\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        zeroForOne,\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    zeroForOne: boolean,\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 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 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\");\nexport const OBSERVATION_SEED = Buffer.from(\"observation\", \"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\nexport function getPdaObservationAccount(\n  programId: PublicKey,\n  poolId: PublicKey,\n): {\n  publicKey: PublicKey;\n  nonce: number;\n} {\n  return findProgramAddress([OBSERVATION_SEED, poolId.toBuffer()], programId);\n}\n\nexport const POOL_LOCK_ID_SEED = Buffer.from(\"locked_position\", \"utf8\");\nexport function getPdaLockPositionId(\n  programId: PublicKey,\n  positionId: PublicKey,\n): {\n  publicKey: PublicKey;\n  nonce: number;\n} {\n  return findProgramAddress([POOL_LOCK_ID_SEED, positionId.toBuffer()], programId);\n}\n\nexport function getPdaLockClPositionIdV2(\n  programId: PublicKey,\n  lockNftMint: PublicKey,\n): {\n  publicKey: PublicKey;\n  nonce: number;\n} {\n  return findProgramAddress([POOL_LOCK_ID_SEED, lockNftMint.toBuffer()], programId);\n}\n\nexport const SUPPORT_MINT_SEED = Buffer.from(\"support_mint\", \"utf8\");\nexport function getPdaMintExAccount(\n  programId: PublicKey,\n  mintAddress: PublicKey,\n): {\n  publicKey: PublicKey;\n  nonce: number;\n} {\n  return findProgramAddress([SUPPORT_MINT_SEED, mintAddress.toBuffer()], programId);\n}\n","import { Connection, EpochInfo, PublicKey } from \"@solana/web3.js\";\nimport { TOKEN_2022_PROGRAM_ID } from \"@solana/spl-token\";\nimport BN from \"bn.js\";\n\nimport {\n  ClmmPoolInfo,\n  ClmmPoolRewardInfo,\n  ClmmPoolRewardLayoutInfo,\n  ComputeClmmPoolInfo,\n  ReturnTypeComputeAmountOut,\n  ReturnTypeComputeAmountOutBaseOut,\n  ReturnTypeComputeAmountOutFormat,\n  ReturnTypeFetchExBitmaps,\n  ReturnTypeFetchMultiplePoolTickArrays,\n  ReturnTypeGetLiquidityAmountOut,\n  SDKParsedConcentratedInfo,\n  TickArrayBitmapExtensionType,\n} from \"../type\";\n\nimport { ApiV3PoolInfoConcentratedItem, ApiV3Token } from \"@/api/type\";\n\nimport Decimal from \"decimal.js\";\nimport {\n  getMultipleAccountsInfo,\n  getMultipleAccountsInfoWithCustomFlags,\n  getTransferAmountFeeV2,\n  minExpirationTime,\n  solToWSol,\n} from \"@/common\";\nimport { Percent, Price, Token, TokenAmount } from \"@/module\";\nimport { TokenAccountRaw } from \"@/raydium/account/types\";\nimport { PoolInfoLayout, PositionInfoLayout, TickArrayBitmapExtensionLayout, TickArrayLayout } from \"../layout\";\nimport { MAX_SQRT_PRICE_X64, MAX_TICK, MIN_SQRT_PRICE_X64, MIN_TICK, NEGATIVE_ONE, Q64, ZERO } from \"./constants\";\nimport { LiquidityMath, MathUtil, SqrtPriceMath, SwapMath } from \"./math\";\nimport { getPdaExBitmapAccount, getPdaPersonalPositionAddress, getPdaTickArrayAddress } from \"./pda\";\nimport { PositionUtils } from \"./position\";\nimport { TICK_ARRAY_BITMAP_SIZE, Tick, TickArray, TickUtils } from \"./tick\";\nimport { TickArrayBitmap, TickArrayBitmapExtensionUtils } from \"./tickarrayBitmap\";\nimport { TickQuery } from \"./tickQuery\";\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 computeAmountIn({\n    poolInfo,\n    tickArrayCache,\n    baseMint,\n    epochInfo,\n    amountOut,\n    slippage,\n    priceLimit = new Decimal(0),\n  }: {\n    poolInfo: ComputeClmmPoolInfo;\n    tickArrayCache: { [key: string]: TickArray };\n    baseMint: PublicKey;\n\n    epochInfo: EpochInfo;\n\n    amountOut: BN;\n    slippage: number;\n    priceLimit?: Decimal;\n  }): ReturnTypeComputeAmountOutBaseOut {\n    const isBaseIn = baseMint.toBase58() === poolInfo.mintA.address;\n    const feeConfigs = {\n      [poolInfo.mintA.address]: poolInfo.mintA.extensions.feeConfig,\n      [poolInfo.mintB.address]: poolInfo.mintB.extensions.feeConfig,\n    };\n\n    let sqrtPriceLimitX64: BN;\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 realAmountOut = getTransferAmountFeeV2(amountOut, feeConfigs[baseMint.toString()], epochInfo, true);\n\n    const {\n      expectedAmountIn: _expectedAmountIn,\n      remainingAccounts,\n      executionPrice: _executionPriceX64,\n      feeAmount,\n    } = PoolUtils.getInputAmountAndRemainAccounts(\n      poolInfo,\n      tickArrayCache,\n      baseMint,\n      realAmountOut.amount.sub(realAmountOut.fee ?? ZERO),\n      sqrtPriceLimitX64,\n    );\n\n    const inMint = isBaseIn ? poolInfo.mintB.address : poolInfo.mintA.address;\n\n    const amountIn = getTransferAmountFeeV2(_expectedAmountIn, feeConfigs[inMint], epochInfo, false);\n    // const amountIn = getTransferAmountFee(\n    //   _expectedAmountIn,\n    //   token2022Infos[inMint.toString()]?.feeConfig,\n    //   epochInfo,\n    //   true,\n    // );\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 _maxAmountIn = _expectedAmountIn\n      .mul(new BN(Math.floor((1 + slippage) * 10000000000)))\n      .div(new BN(10000000000));\n    // const maxAmountIn = getTransferAmountFee(\n    //   _maxAmountIn,\n    //   token2022Infos[inMint.toString()]?.feeConfig,\n    //   epochInfo,\n    //   true,\n    // );\n    const maxAmountIn = getTransferAmountFeeV2(_maxAmountIn, feeConfigs[inMint], epochInfo, true);\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      amountIn,\n      maxAmountIn,\n      realAmountOut,\n      expirationTime: minExpirationTime(amountIn.expirationTime, realAmountOut.expirationTime),\n      currentPrice: poolInfo.currentPrice,\n      executionPrice,\n      priceImpact,\n      fee: feeAmount,\n\n      remainingAccounts,\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 async 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()).toFixed(0) // .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    const amountFromLiquidity = await PoolUtils.getAmountsFromLiquidity({\n      epochInfo,\n      poolInfo,\n      tickLower,\n      tickUpper,\n      liquidity,\n      slippage,\n      add,\n    });\n    return {\n      liquidity,\n      amountA: inputA ? addFeeAmount : amountFromLiquidity.amountA,\n      amountB: inputA ? amountFromLiquidity.amountB : addFeeAmount,\n      amountSlippageA: inputA ? addFeeAmount : amountFromLiquidity.amountSlippageA,\n      amountSlippageB: inputA ? amountFromLiquidity.amountSlippageB : addFeeAmount,\n      expirationTime: amountFromLiquidity.expirationTime,\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          exBitmapAccount: getPdaExBitmapAccount(new PublicKey(cur.programId), new PublicKey(cur.id)).publicKey,\n          exBitmapInfo:\n            exBitData[getPdaExBitmapAccount(new PublicKey(cur.programId), new PublicKey(cur.id)).publicKey.toBase58()],\n          startTime: rpcDataMap[cur.id].startTime.toNumber(),\n          rewardInfos: rpcDataMap[cur.id].rewardInfos,\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    burnPercent: 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 Decimal from \"decimal.js\";\nimport { getTransferAmountFeeV2, minExpirationTime } from \"../../../common\";\nimport { ClmmPositionLayout } from \"../layout\";\nimport { ClmmPoolInfo, ClmmPoolPersonalPosition, ClmmPoolRewardInfo, GetAmountParams, ReturnTypeGetLiquidityAmountOut } from \"../type\";\nimport { Q64 } from \"./constants\";\nimport { LiquidityMath, MathUtil, SqrtPriceMath } from \"./math\";\nimport { Tick } from \"./tick\";\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 { Connection, PublicKey } from \"@solana/web3.js\";\nimport BN from \"bn.js\";\n\nimport { getMultipleAccountsInfo } from \"../../../common\";\nimport { TickArrayLayout } from \"../layout\";\n\nimport { TickArrayBitmapExtensionType } from \"../type\";\nimport { MAX_TICK, MIN_TICK } from \"./constants\";\nimport { getPdaTickArrayAddress } from \"./pda\";\nimport { Tick, TICK_ARRAY_SIZE, TickArray, TickUtils } from \"./tick\";\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 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 { blob, bool, i128, i64, 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([u32(\"blockTimestamp\"), i64(\"tickCumulative\"), seq(u64(), 4)]);\nexport const ObservationInfoLayout = struct([\n  blob(8),\n  bool(\"initialized\"),\n  u64(\"recentEpoch\"),\n  u16(\"observationIndex\"),\n  publicKey(\"poolId\"),\n  seq(ObservationLayout, 100, \"observations\"),\n  seq(u64(), 4),\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  u32(),\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\nexport const LockPositionLayout = struct([\n  u64(),\n  u8(\"bump\"),\n  publicKey(\"owner\"),\n  publicKey(\"poolId\"),\n  publicKey(\"positionId\"),\n  publicKey(\"nftAccount\"),\n  seq(u64(), 8),\n]);\n\nexport const LockClPositionLayoutV2 = struct([\n  blob(8),\n  u8(\"bump\"),\n  publicKey(\"lockOwner\"),\n  publicKey(\"poolId\"),\n  publicKey(\"positionId\"),\n  publicKey(\"nftAccount\"),\n  publicKey(\"lockNftMint\"),\n  u64(\"recentEpoch\"),\n  seq(u64(), 8),\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, TransferFeeConfigLayout } from \"@solana/spl-token\";\nimport { BigNumberish } from \"@/common/bignumber\";\nimport { Token, TokenAmount } from \"../../module\";\nimport { SOL_INFO, TOKEN_WSOL } from \"./constant\";\nimport { TokenInfo } from \"./type\";\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  // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n  //@ts-ignore\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 = (\n  config?: ReturnType<typeof TransferFeeConfigLayout.decode> | undefined | null,\n): 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 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, SystemProgram, SYSVAR_RENT_PUBKEY, TransactionInstruction } from \"@solana/web3.js\";\nimport { ASSOCIATED_TOKEN_PROGRAM_ID, TOKEN_PROGRAM_ID } from \"@solana/spl-token\";\n\nimport { AmmV4Keys, AmmV5Keys } from \"@/api/type\";\nimport { BN_ONE, BN_ZERO, parseBigNumberish } from \"@/common\";\nimport { createLogger } from \"@/common/logger\";\nimport { accountMeta, RENT_PROGRAM_ID } from \"@/common/pubKey\";\nimport { InstructionType } from \"@/common/txTool/txType\";\nimport { struct, u64, u8 } from \"@/marshmallow\";\n\nimport BN from \"bn.js\";\nimport { jsonInfo2PoolKeys } from \"@/common/utility\";\nimport { InstructionReturn } from \"../type\";\nimport {\n  addLiquidityLayout,\n  fixedSwapInLayout,\n  fixedSwapOutLayout,\n  initPoolLayout,\n  removeLiquidityLayout,\n} from \"./layout\";\nimport { MODEL_DATA_PUBKEY } from \"./stable\";\nimport {\n  InitPoolInstructionParamsV4,\n  LiquidityAddInstructionParams,\n  RemoveLiquidityInstruction,\n  SwapFixedInInstructionParamsV4,\n  SwapFixedOutInstructionParamsV4,\n  SwapInstructionParams,\n} from \"./type\";\n\nconst logger = createLogger(\"Raydium_liquidity_instruction\");\nexport function makeAddLiquidityInstruction(params: LiquidityAddInstructionParams): TransactionInstruction {\n  const { poolInfo, poolKeys, userKeys, baseAmountIn, quoteAmountIn, fixedSide, otherAmountMin } = 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      otherAmountMin: parseBigNumberish(otherAmountMin),\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, lpAmount, baseAmountMin, quoteAmountMin } = 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        lpAmount: parseBigNumberish(lpAmount),\n        baseAmountMin: parseBigNumberish(baseAmountMin),\n        quoteAmountMin: parseBigNumberish(quoteAmountMin),\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, isSigner: true }),\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 } 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  u64(\"otherAmountMin\"),\n]);\n\nexport const removeLiquidityLayout = struct([\n  u8(\"instruction\"),\n  u64(\"lpAmount\"),\n  u64(\"baseAmountMin\"),\n  u64(\"quoteAmountMin\"),\n]);\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 { Connection, PublicKey } from \"@solana/web3.js\";\nimport BN from \"bn.js\";\nimport Decimal from \"decimal.js\";\nimport { AmmV4Keys, AmmV5Keys } from \"../../api/type\";\nimport { TOKEN_PROGRAM_ID } from \"@solana/spl-token\";\nimport {\n  findProgramAddress,\n  parseSimulateLogToJson,\n  parseSimulateValue,\n  simulateMultipleInstruction,\n} from \"@/common/txTool/txUtils\";\nimport { toApiV3Token } from \"../../raydium/token/utils\";\nimport { makeSimulatePoolInfoInstruction } from \"./instruction\";\nimport { getSerumAssociatedAuthority } from \"./serum\";\nimport { StableLayout } from \"./stable\";\nimport { AmmRpcData, ComputeAmountOutParam, LiquidityPoolKeys } from \"./type\";\nimport { liquidityStateV4Layout } from \"./layout\";\nimport { splAccountLayout } from \"../account\";\nimport { SPL_MINT_LAYOUT } from \"../token\";\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  // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n  // @ts-ignore\n  const loadStable = poolKeysList.find((i) => i.modelDataAccount);\n  if (loadStable) {\n    if (!stableLayout) {\n      stableLayout = new StableLayout({ connection });\n      await stableLayout.initStableModelLayout();\n    }\n  }\n  return await Promise.all(\n    poolKeysList.map(async (itemPoolKey) => {\n      // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n      // @ts-ignore\n      if (itemPoolKey.modelDataAccount) {\n        const instructions = makeSimulatePoolInfoInstruction({ poolKeys: itemPoolKey });\n        const logs = await simulateMultipleInstruction(connection, [instructions.instruction], \"GetPoolData\");\n        const poolsInfo = logs.map((log) => {\n          const json = parseSimulateLogToJson(log, \"GetPoolData\");\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          return {\n            status,\n            baseDecimals,\n            quoteDecimals,\n            lpDecimals,\n            baseReserve,\n            quoteReserve,\n            lpSupply,\n            startTime: new BN(startTime),\n          };\n        })[0];\n        return poolsInfo;\n      } else {\n        const [poolAcc, vaultAccA, vaultAccB, mintAccLp] = await connection.getMultipleAccountsInfo([\n          new PublicKey(itemPoolKey.id),\n          new PublicKey(itemPoolKey.vault.A),\n          new PublicKey(itemPoolKey.vault.B),\n          new PublicKey(itemPoolKey.mintLp.address),\n        ]);\n        if (poolAcc === null) throw Error(\"fetch pool error\");\n        if (vaultAccA === null) throw Error(\"fetch vaultAccA error\");\n        if (vaultAccB === null) throw Error(\"fetch vaultAccB error\");\n        if (mintAccLp === null) throw Error(\"fetch mintAccLp error\");\n        const poolInfo = liquidityStateV4Layout.decode(poolAcc.data);\n        const vaultInfoA = splAccountLayout.decode(vaultAccA.data);\n        const vaultInfoB = splAccountLayout.decode(vaultAccB.data);\n        const lpInfo = SPL_MINT_LAYOUT.decode(mintAccLp.data);\n        return {\n          status: poolInfo.status,\n          baseDecimals: poolInfo.baseDecimal.toNumber(),\n          quoteDecimals: poolInfo.quoteDecimal.toNumber(),\n          lpDecimals: lpInfo.decimals,\n          baseReserve: vaultInfoA.amount.sub(poolInfo.baseNeedTakePnl),\n          quoteReserve: vaultInfoB.amount.sub(poolInfo.quoteNeedTakePnl),\n          lpSupply: poolInfo.lpReserve,\n          startTime: poolInfo.poolOpenTime,\n        };\n      }\n    }),\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 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: new Decimal(poolInfo.lpReserve.toString())\n        .div(10 ** Math.min(poolInfo.baseDecimal.toNumber(), poolInfo.quoteDecimal.toNumber()))\n        .toNumber(),\n      lpMint: toApiV3Token({\n        address: poolInfo.lpMint.toBase58(),\n        programId: tokenProgramStr,\n        decimals: Math.min(poolInfo.baseDecimal.toNumber(), poolInfo.quoteDecimal.toNumber()),\n      }),\n      burnPercent: 0,\n    };\n  });\n  return data;\n};\n","import { PublicKey } from \"@solana/web3.js\";\nimport { createLogger } from \"../../common/logger\";\nimport { SerumVersion } from \"../serum\";\nimport { LIQUIDITY_VERSION_TO_SERUM_VERSION } from \"./constant\";\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 { PublicKey } from \"@solana/web3.js\";\nimport BN from \"bn.js\";\nimport { TOKEN_PROGRAM_ID } from \"@solana/spl-token\";\nimport { BN_ZERO } from \"@/common/bignumber\";\nimport { MakeMultiTxData } from \"@/common/txTool/txTool\";\nimport { TxVersion } from \"@/common/txTool/txType\";\nimport { ComputeBudgetConfig, TxTipConfig } from \"../../raydium/type\";\nimport { generatePubKey } from \"../account/util\";\nimport ModuleBase from \"../moduleBase\";\nimport { makeCreateMarketInstruction } from \"./instrument\";\n\nexport interface MarketExtInfo {\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    quoteMint: 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    requestQueueSpace,\n    eventQueueSpace,\n    orderbookQueueSpace,\n    lowestFeeMarket,\n    assignSeed,\n    txVersion,\n    computeBudgetConfig,\n    txTipConfig,\n    feePayer,\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    requestQueueSpace?: number;\n    eventQueueSpace?: number;\n    orderbookQueueSpace?: number;\n\n    lowestFeeMarket?: boolean;\n    assignSeed?: string;\n\n    txVersion?: T;\n    computeBudgetConfig?: ComputeBudgetConfig;\n    txTipConfig?: TxTipConfig;\n    feePayer?: PublicKey;\n  }): Promise<MakeMultiTxData<T, MarketExtInfo>> {\n    const wallet = this.scope.ownerPubKey;\n    const seed = assignSeed\n      ? `${baseInfo.mint.toBase58().slice(0, 10)}-${quoteInfo.mint.toBase58().slice(0, 10)}-${assignSeed}`\n      : undefined;\n    const market = generatePubKey({\n      fromPublicKey: wallet,\n      programId: dexProgramId,\n      assignSeed: seed ? `${seed}-market` : seed,\n    });\n    const requestQueue = generatePubKey({\n      fromPublicKey: wallet,\n      programId: dexProgramId,\n      assignSeed: seed ? `${seed}-request` : seed,\n    });\n    const eventQueue = generatePubKey({\n      fromPublicKey: wallet,\n      programId: dexProgramId,\n      assignSeed: seed ? `${seed}-event` : seed,\n    });\n    const bids = generatePubKey({\n      fromPublicKey: wallet,\n      programId: dexProgramId,\n      assignSeed: seed ? `${seed}-bids` : seed,\n    });\n    const asks = generatePubKey({\n      fromPublicKey: wallet,\n      programId: dexProgramId,\n      assignSeed: seed ? `${seed}-asks` : seed,\n    });\n    const baseVault = generatePubKey({\n      fromPublicKey: wallet,\n      programId: TOKEN_PROGRAM_ID,\n      assignSeed: seed ? `${seed}-baseVault` : seed,\n    });\n    const quoteVault = generatePubKey({\n      fromPublicKey: wallet,\n      programId: TOKEN_PROGRAM_ID,\n      assignSeed: seed ? `${seed}-quoteVault` : seed,\n    });\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        requestQueueSpace,\n        eventQueueSpace,\n        orderbookQueueSpace,\n\n        lowestFeeMarket,\n      },\n    });\n    const txBuilder = this.createTxBuilder(feePayer);\n    txBuilder.addInstruction({\n      instructions: allTxArr[0].transaction.instructions,\n      signers: allTxArr[0].signer,\n    });\n\n    for await (const txData of allTxArr.slice(1, allTxArr.length)) {\n      txBuilder.addInstruction({\n        instructions: txData.transaction.instructions,\n        signers: txData.signer,\n        instructionTypes: txData.instructionTypes,\n      });\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          quoteMint: new PublicKey(quoteInfo.mint),\n        },\n      }) as Promise<MakeMultiTxData<T, MarketExtInfo>>;\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        quoteMint: new PublicKey(quoteInfo.mint),\n      },\n    }) as Promise<MakeMultiTxData<T, MarketExtInfo>>;\n  }\n}\n","import {\n  Connection,\n  Keypair,\n  PublicKey,\n  SystemProgram,\n  SYSVAR_RENT_PUBKEY,\n  Transaction,\n  TransactionInstruction,\n} from \"@solana/web3.js\";\nimport BN from \"bn.js\";\nimport { createInitializeAccountInstruction, TOKEN_PROGRAM_ID } from \"@solana/spl-token\";\nimport { InstructionType } from \"@/common/txTool/txType\";\nimport { struct, u16, u32, u64, u8 } from \"../../marshmallow\";\nimport { MARKET_STATE_LAYOUT_V2 } from \"./layout\";\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    requestQueueSpace?: number;\n    eventQueueSpace?: number;\n    orderbookQueueSpace?: number;\n\n    lowestFeeMarket?: boolean;\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    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  );\n\n  const tx2 = new Transaction();\n  tx2.add(\n    SystemProgram.createAccountWithSeed({\n      fromPubkey: wallet,\n      basePubkey: wallet,\n      seed: marketInfo.requestQueue.seed,\n      newAccountPubkey: marketInfo.requestQueue.publicKey,\n      lamports: marketInfo.lowestFeeMarket\n        ? 6208320\n        : await connection.getMinimumBalanceForRentExemption(marketInfo.requestQueueSpace ?? 5120 + 12),\n      space: marketInfo.lowestFeeMarket ? 764 : marketInfo.requestQueueSpace ?? 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: marketInfo.lowestFeeMarket\n        ? 79594560\n        : await connection.getMinimumBalanceForRentExemption(marketInfo.eventQueueSpace ?? 262144 + 12),\n      space: marketInfo.lowestFeeMarket ? 11308 : marketInfo.eventQueueSpace ?? 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: marketInfo.lowestFeeMarket\n        ? 101977920\n        : await connection.getMinimumBalanceForRentExemption(marketInfo.orderbookQueueSpace ?? 65536 + 12),\n      space: marketInfo.lowestFeeMarket ? 14524 : marketInfo.orderbookQueueSpace ?? 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: marketInfo.lowestFeeMarket\n        ? 101977920\n        : await connection.getMinimumBalanceForRentExemption(marketInfo.orderbookQueueSpace ?? 65536 + 12),\n      space: marketInfo.lowestFeeMarket ? 14524 : marketInfo.orderbookQueueSpace ?? 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 BN from \"bn.js\";\nimport Decimal from \"decimal.js\";\nimport { ApiV3PoolInfoConcentratedItem, ClmmKeys } from \"../../api/type\";\nimport {\n  CLMM_LOCK_AUTH_ID,\n  CLMM_LOCK_PROGRAM_ID,\n  CLMM_PROGRAM_ID,\n  InstructionType,\n  WSOLMint,\n  fetchMultipleMintInfos,\n  getATAAddress,\n  getMultipleAccountsInfoWithCustomFlags,\n} from \"@/common\";\nimport { AccountLayout, TOKEN_2022_PROGRAM_ID, TOKEN_PROGRAM_ID } from \"@solana/spl-token\";\nimport { MakeMultiTxData, MakeTxData } from \"@/common/txTool/txTool\";\nimport { TxVersion } from \"@/common/txTool/txType\";\nimport { toApiV3Token, toFeeConfig } from \"../../raydium/token/utils\";\nimport { ComputeBudgetConfig, ReturnTypeFetchMultipleMintInfos, TxTipConfig } from \"../../raydium/type\";\nimport ModuleBase, { ModuleBaseProps } from \"../moduleBase\";\nimport { MakeTransaction } from \"../type\";\nimport { ClmmInstrument } from \"./instrument\";\nimport { ClmmConfigLayout, ClmmPositionLayout, OperationLayout, PoolInfoLayout, PositionInfoLayout } from \"./layout\";\nimport {\n  ClmmRpcData,\n  ClosePositionExtInfo,\n  CollectRewardParams,\n  CollectRewardsParams,\n  ComputeClmmPoolInfo,\n  CreateConcentratedPool,\n  DecreaseLiquidity,\n  HarvestAllRewardsParams,\n  HarvestLockPosition,\n  IncreasePositionFromBase,\n  IncreasePositionFromLiquidity,\n  InitRewardExtInfo,\n  InitRewardParams,\n  InitRewardsParams,\n  LockPosition,\n  ManipulateLiquidityExtInfo,\n  OpenPositionFromBase,\n  OpenPositionFromBaseExtInfo,\n  OpenPositionFromLiquidity,\n  OpenPositionFromLiquidityExtInfo,\n  ReturnTypeFetchMultiplePoolTickArrays,\n  SetRewardParams,\n  SetRewardsParams,\n  ClmmLockAddress,\n} from \"./type\";\nimport { MAX_SQRT_PRICE_X64, MIN_SQRT_PRICE_X64, mockV3CreatePoolInfo, ZERO } from \"./utils/constants\";\nimport { MathUtil, SqrtPriceMath } from \"./utils/math\";\nimport {\n  getPdaOperationAccount,\n  getPdaPersonalPositionAddress,\n  getPdaLockClPositionIdV2,\n  getPdaTickArrayAddress,\n  getPdaProtocolPositionAddress,\n  getPdaExBitmapAccount,\n  getPdaMintExAccount,\n} from \"./utils/pda\";\nimport { PoolUtils, clmmComputeInfoToApiInfo } from \"./utils/pool\";\nimport { TickUtils } from \"./utils/tick\";\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      computeBudgetConfig,\n      forerunCreate,\n      getObserveState,\n      txVersion,\n      txTipConfig,\n      feePayer,\n    } = props;\n    const txBuilder = this.createTxBuilder(feePayer);\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 extendMintAccount: PublicKey[] = [];\n    const fetchAccounts: PublicKey[] = [];\n    if (mintA.programId === TOKEN_2022_PROGRAM_ID.toBase58())\n      fetchAccounts.push(getPdaMintExAccount(programId, new PublicKey(mintA.address)).publicKey);\n    if (mintB.programId === TOKEN_2022_PROGRAM_ID.toBase58())\n      fetchAccounts.push(getPdaMintExAccount(programId, new PublicKey(mintB.address)).publicKey);\n    const extMintRes = await this.scope.connection.getMultipleAccountsInfo(fetchAccounts);\n\n    extMintRes.forEach((r, idx) => {\n      if (r) extendMintAccount.push(fetchAccounts[idx]);\n    });\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      forerunCreate: !getObserveState && forerunCreate,\n      extendMintAccount,\n    });\n\n    txBuilder.addInstruction(insInfo);\n    txBuilder.addCustomComputeBudget(computeBudgetConfig);\n    txBuilder.addTipInstruction(txTipConfig);\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          observationId: insInfo.address.observationId.toBase58(),\n          exBitmapAccount: insInfo.address.exBitmapAccount.toBase58(),\n          programId: programId.toString(),\n          id: insInfo.address.poolId.toString(),\n          mintA,\n          mintB,\n          openTime: \"0\",\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: \"0\",\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          burnPercent: 0,\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    nft2022,\n    associatedOnly = true,\n    checkCreateATAOwner = false,\n    withMetadata = \"create\",\n    getEphemeralSigners,\n    computeBudgetConfig,\n    txTipConfig,\n    txVersion,\n    feePayer,\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(feePayer);\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      nft2022,\n    });\n\n    txBuilder.addInstruction(insInfo);\n    txBuilder.addCustomComputeBudget(computeBudgetConfig);\n    txBuilder.addTipInstruction(txTipConfig);\n    return txBuilder.versionBuild<OpenPositionFromBaseExtInfo>({\n      txVersion,\n      extInfo: { ...insInfo.address },\n    }) as Promise<MakeTxData<T, OpenPositionFromBaseExtInfo>>;\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    computeBudgetConfig,\n    txTipConfig,\n    getEphemeralSigners,\n    nft2022,\n    feePayer,\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(feePayer);\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      nft2022,\n    });\n    txBuilder.addInstruction(makeOpenPositionInstructions);\n    txBuilder.addCustomComputeBudget(computeBudgetConfig);\n    txBuilder.addTipInstruction(txTipConfig);\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      txTipConfig,\n      txVersion,\n      feePayer,\n    } = props;\n    const txBuilder = this.createTxBuilder(feePayer);\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      nft2022: (await this.scope.connection.getAccountInfo(ownerPosition.nftMint))?.owner.equals(TOKEN_2022_PROGRAM_ID),\n    });\n    txBuilder.addInstruction(ins);\n    txBuilder.addCustomComputeBudget(computeBudgetConfig);\n    txBuilder.addTipInstruction(txTipConfig);\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      txTipConfig,\n      txVersion,\n      feePayer,\n    } = props;\n    const txBuilder = this.createTxBuilder(feePayer);\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      nft2022: (await this.scope.connection.getAccountInfo(ownerPosition.nftMint))?.owner.equals(TOKEN_2022_PROGRAM_ID),\n    });\n    txBuilder.addInstruction(ins);\n    txBuilder.addCustomComputeBudget(computeBudgetConfig);\n    txBuilder.addTipInstruction(txTipConfig);\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      txTipConfig,\n      txVersion,\n      feePayer,\n    } = props;\n    if (this.scope.availability.removeConcentratedPosition === false)\n      this.logAndCreateError(\"remove position feature disabled in your region\");\n    const txBuilder = this.createTxBuilder(feePayer);\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    const nft2022 = (await this.scope.connection.getAccountInfo(ownerPosition.nftMint))?.owner.equals(\n      TOKEN_2022_PROGRAM_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      nft2022,\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        nft2022,\n      });\n      txBuilder.addInstruction({\n        endInstructions: closeInsInfo.instructions,\n        endInstructionTypes: closeInsInfo.instructionTypes,\n      });\n      extInfo = { ...extInfo, ...closeInsInfo.address };\n    }\n    txBuilder.addCustomComputeBudget(computeBudgetConfig);\n    txBuilder.addTipInstruction(txTipConfig);\n    return txBuilder.versionBuild<ManipulateLiquidityExtInfo>({\n      txVersion,\n      extInfo: { address: extInfo },\n    }) as Promise<MakeTxData<T, ManipulateLiquidityExtInfo>>;\n  }\n\n  public async lockPosition<T extends TxVersion>(props: LockPosition<T>): Promise<MakeTxData<ClmmLockAddress>> {\n    const {\n      programId = CLMM_LOCK_PROGRAM_ID,\n      authProgramId = CLMM_LOCK_AUTH_ID,\n      poolProgramId = CLMM_PROGRAM_ID,\n      ownerPosition,\n      payer,\n      computeBudgetConfig,\n      txTipConfig,\n      txVersion,\n      getEphemeralSigners,\n      feePayer,\n    } = props;\n    const txBuilder = this.createTxBuilder(feePayer);\n    const lockIns = await ClmmInstrument.makeLockPositions({\n      programId,\n      authProgramId,\n      poolProgramId,\n      wallet: this.scope.ownerPubKey,\n      payer: payer ?? this.scope.ownerPubKey,\n      nftMint: ownerPosition.nftMint,\n      getEphemeralSigners,\n      nft2022: (await this.scope.connection.getAccountInfo(ownerPosition.nftMint))?.owner.equals(TOKEN_2022_PROGRAM_ID),\n    });\n\n    txBuilder.addInstruction(lockIns);\n    txBuilder.addCustomComputeBudget(computeBudgetConfig);\n    txBuilder.addTipInstruction(txTipConfig);\n    return txBuilder.versionBuild({\n      txVersion,\n      extInfo: lockIns.address,\n    }) as Promise<MakeTxData<ClmmLockAddress>>;\n  }\n\n  public async harvestLockPosition<T extends TxVersion>(props: HarvestLockPosition<T>): Promise<MakeTxData<T>> {\n    const {\n      programId = CLMM_LOCK_PROGRAM_ID,\n      authProgramId = CLMM_LOCK_AUTH_ID,\n      clmmProgram = CLMM_PROGRAM_ID,\n      poolKeys: propPoolKeys,\n      lockData,\n      ownerInfo = { useSOLBalance: true },\n      associatedOnly = true,\n      checkCreateATAOwner = false,\n      computeBudgetConfig,\n      txTipConfig,\n      txVersion,\n      feePayer,\n    } = props;\n\n    const poolKeys = propPoolKeys || (await this.getClmmPoolKeys(lockData.poolId.toString()));\n    const txBuilder = this.createTxBuilder(feePayer);\n\n    const positionData = await this.scope.connection.getAccountInfo(lockData.positionId);\n    if (!positionData) this.logger.logWithError(\"position not found\", lockData.positionId);\n    const position = PositionInfoLayout.decode(positionData!.data);\n\n    const mintAUseSOLBalance = ownerInfo.useSOLBalance && poolKeys.mintA.address === WSOLMint.toString();\n    const mintBUseSOLBalance = ownerInfo.useSOLBalance && poolKeys.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: poolKeys.mintA.programId,\n        mint: new PublicKey(poolKeys.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: poolKeys.mintB.programId,\n        mint: new PublicKey(poolKeys.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 ownerMintToAccount: { [mint: string]: PublicKey } = {};\n    const rewardAccounts: PublicKey[] = [];\n    for (const itemReward of poolKeys.rewardInfos) {\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: 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    const lockPositionId = getPdaLockClPositionIdV2(programId, lockData.lockNftMint).publicKey;\n    const lockNftAccount = getATAAddress(this.scope.ownerPubKey, lockData.lockNftMint, TOKEN_PROGRAM_ID).publicKey;\n\n    const tickArrayLowerStartIndex = TickUtils.getTickArrayStartIndexByTick(\n      position.tickLower,\n      poolKeys.config.tickSpacing,\n    );\n    const tickArrayUpperStartIndex = TickUtils.getTickArrayStartIndexByTick(\n      position.tickUpper,\n      poolKeys.config.tickSpacing,\n    );\n    const { publicKey: tickArrayLower } = getPdaTickArrayAddress(\n      new PublicKey(poolKeys.programId),\n      lockData.poolId,\n      tickArrayLowerStartIndex,\n    );\n    const { publicKey: tickArrayUpper } = getPdaTickArrayAddress(\n      new PublicKey(poolKeys.programId),\n      lockData.poolId,\n      tickArrayUpperStartIndex,\n    );\n    const { publicKey: protocolPosition } = getPdaProtocolPositionAddress(\n      new PublicKey(poolKeys.programId),\n      lockData.poolId,\n      position.tickLower,\n      position.tickUpper,\n    );\n\n    const rewardAccountsFullInfo: {\n      poolRewardVault: PublicKey;\n      ownerRewardVault: PublicKey;\n      rewardMint: PublicKey;\n    }[] = [];\n    for (let i = 0; i < poolKeys.rewardInfos.length; i++) {\n      rewardAccountsFullInfo.push({\n        poolRewardVault: new PublicKey(poolKeys.rewardInfos[i].vault),\n        ownerRewardVault: rewardAccounts[i],\n        rewardMint: new PublicKey(poolKeys.rewardInfos[i].mint.address),\n      });\n    }\n\n    const harvestLockIns = await ClmmInstrument.harvestLockPositionInstructionV2({\n      programId,\n      auth: authProgramId,\n      lockPositionId,\n      clmmProgram,\n      lockOwner: this.scope.ownerPubKey,\n      lockNftMint: lockData.lockNftMint,\n      lockNftAccount,\n      positionNftAccount: lockData.nftAccount,\n      positionId: lockData.positionId,\n      poolId: lockData.poolId,\n      protocolPosition,\n      vaultA: new PublicKey(poolKeys.vault.A),\n      vaultB: new PublicKey(poolKeys.vault.B),\n      tickArrayLower,\n      tickArrayUpper,\n      userVaultA: ownerTokenAccountA!,\n      userVaultB: ownerTokenAccountB!,\n      mintA: new PublicKey(poolKeys.mintA.address),\n      mintB: new PublicKey(poolKeys.mintB.address),\n      rewardAccounts: rewardAccountsFullInfo,\n      exTickArrayBitmap: getPdaExBitmapAccount(clmmProgram, lockData.poolId).publicKey,\n    });\n\n    txBuilder.addInstruction({\n      instructions: [harvestLockIns],\n      instructionTypes: [InstructionType.ClmmHarvestLockPosition],\n    });\n\n    txBuilder.addCustomComputeBudget(computeBudgetConfig);\n    txBuilder.addTipInstruction(txTipConfig);\n    return txBuilder.versionBuild({\n      txVersion,\n    }) as Promise<MakeTxData<T>>;\n  }\n\n  public async closePosition<T extends TxVersion>({\n    poolInfo,\n    poolKeys: propPoolKeys,\n    ownerPosition,\n    txVersion,\n    computeBudgetConfig,\n    txTipConfig,\n    feePayer,\n  }: {\n    poolInfo: ApiV3PoolInfoConcentratedItem;\n    poolKeys?: ClmmKeys;\n    ownerPosition: ClmmPositionLayout;\n    computeBudgetConfig?: ComputeBudgetConfig;\n    txTipConfig?: TxTipConfig;\n    txVersion: T;\n    feePayer?: PublicKey;\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(feePayer);\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      nft2022: (await this.scope.connection.getAccountInfo(ownerPosition.nftMint))?.owner.equals(TOKEN_2022_PROGRAM_ID),\n    });\n    txBuilder.addCustomComputeBudget(computeBudgetConfig);\n    txBuilder.addTipInstruction(txTipConfig);\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    feePayer,\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(feePayer);\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    txTipConfig,\n    txVersion,\n    feePayer,\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(feePayer);\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    txBuilder.addTipInstruction(txTipConfig);\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    txTipConfig,\n    txVersion,\n    feePayer,\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(feePayer);\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    txBuilder.addTipInstruction(txTipConfig);\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    txTipConfig,\n    txVersion,\n    feePayer,\n  }: SetRewardsParams<T>): Promise<MakeTxData<T, { address: Record<string, PublicKey> }>> {\n    const txBuilder = this.createTxBuilder(feePayer);\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    txBuilder.addTipInstruction(txTipConfig);\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<T extends TxVersion>({\n    poolInfo,\n    ownerInfo,\n    rewardMint,\n    associatedOnly = true,\n    checkCreateATAOwner = false,\n    computeBudgetConfig,\n    txTipConfig,\n    txVersion,\n    feePayer,\n  }: CollectRewardParams<T>): Promise<MakeTxData<{ address: Record<string, PublicKey> }>> {\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(feePayer);\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    txBuilder.addCustomComputeBudget(computeBudgetConfig);\n    txBuilder.addTipInstruction(txTipConfig);\n    return txBuilder.versionBuild<{ address: Record<string, PublicKey> }>({\n      txVersion,\n      extInfo: { address: insInfo.address },\n    }) as Promise<MakeTxData<{ address: Record<string, PublicKey> }>>;\n  }\n\n  public async collectRewards({\n    poolInfo,\n    ownerInfo,\n    rewardMints,\n    associatedOnly = true,\n    checkCreateATAOwner = false,\n    computeBudgetConfig,\n    txTipConfig,\n    feePayer,\n  }: CollectRewardsParams): Promise<MakeTransaction> {\n    const txBuilder = this.createTxBuilder(feePayer);\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    txBuilder.addCustomComputeBudget(computeBudgetConfig);\n    txBuilder.addTipInstruction(txTipConfig);\n    return txBuilder.build<{ address: Record<string, PublicKey> }>({ address });\n  }\n\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    computeBudgetConfig,\n    txTipConfig,\n    feePayer,\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    computeBudgetConfig?: ComputeBudgetConfig;\n    txTipConfig?: TxTipConfig;\n    feePayer?: PublicKey;\n  }): Promise<MakeTxData<T>> {\n    const txBuilder = this.createTxBuilder(feePayer);\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    txBuilder.addCustomComputeBudget(computeBudgetConfig);\n    txBuilder.addTipInstruction(txTipConfig);\n    return txBuilder.versionBuild({ txVersion }) as Promise<MakeTxData<T>>;\n  }\n\n  public async swapBaseOut<T extends TxVersion>({\n    poolInfo,\n    poolKeys: propPoolKeys,\n    outputMint,\n    amountOut,\n    amountInMax,\n    priceLimit,\n    observationId,\n    ownerInfo,\n    remainingAccounts,\n    associatedOnly = true,\n    checkCreateATAOwner = false,\n    txVersion,\n    computeBudgetConfig,\n    txTipConfig,\n    feePayer,\n  }: {\n    poolInfo: ApiV3PoolInfoConcentratedItem;\n    poolKeys?: ClmmKeys;\n    outputMint: string | PublicKey;\n    amountOut: BN;\n    amountInMax: 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    computeBudgetConfig?: ComputeBudgetConfig;\n    txTipConfig?: TxTipConfig;\n    feePayer?: PublicKey;\n  }): Promise<MakeTxData<T>> {\n    const txBuilder = this.createTxBuilder(feePayer);\n    const baseIn = outputMint.toString() === poolInfo.mintB.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 =\n        outputMint.toString() === poolInfo.mintB.address\n          ? MIN_SQRT_PRICE_X64.add(new BN(1))\n          : 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 ? amountInMax : 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 : amountInMax,\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.makeSwapBaseOutInstructions({\n        poolInfo,\n        poolKeys,\n        observationId,\n        ownerInfo: {\n          wallet: this.scope.ownerPubKey,\n          tokenAccountA: ownerTokenAccountA!,\n          tokenAccountB: ownerTokenAccountB!,\n        },\n        outputMint: new PublicKey(outputMint),\n        amountOut,\n        amountInMax,\n        sqrtPriceLimitX64,\n        remainingAccounts,\n      }),\n    );\n\n    txBuilder.addCustomComputeBudget(computeBudgetConfig);\n    txBuilder.addTipInstruction(txTipConfig);\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    lockInfo,\n    ownerInfo,\n    associatedOnly = true,\n    checkCreateATAOwner = false,\n    programId,\n    txVersion,\n    computeBudgetConfig,\n    feePayer,\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 allNftMints = Object.values(allPositions)\n      .flat()\n      .map((p) => p.nftMint);\n\n    const mintData = await getMultipleAccountsInfoWithCustomFlags(\n      this.scope.connection,\n      allNftMints.map((n) => ({ pubkey: n })),\n    );\n    const record: Record<string, PublicKey | null> = {};\n    mintData.forEach((data) => {\n      record[data.pubkey.toBase58()] = data?.accountInfo?.owner ?? null;\n    });\n\n    const txBuilder = this.createTxBuilder(feePayer);\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\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      const rewardAccountsFullInfo: {\n        poolRewardVault: PublicKey;\n        ownerRewardVault: PublicKey;\n        rewardMint: PublicKey;\n      }[] = [];\n      for (let i = 0; i < poolKeys.rewardInfos.length; i++) {\n        rewardAccountsFullInfo.push({\n          poolRewardVault: new PublicKey(poolKeys.rewardInfos[i].vault),\n          ownerRewardVault: rewardAccounts[i],\n          rewardMint: new PublicKey(poolKeys.rewardInfos[i].mint.address),\n        });\n      }\n\n      for (const itemPosition of allPositions[itemInfo.id]) {\n        const lockData = lockInfo?.[itemInfo.id]?.[itemPosition.nftMint.toBase58()];\n        if (lockData) {\n          const lockNftAccount = getATAAddress(\n            this.scope.ownerPubKey,\n            lockData.lockNftMint,\n            TOKEN_PROGRAM_ID,\n          ).publicKey;\n\n          const tickArrayLowerStartIndex = TickUtils.getTickArrayStartIndexByTick(\n            itemPosition.tickLower,\n            poolKeys.config.tickSpacing,\n          );\n          const tickArrayUpperStartIndex = TickUtils.getTickArrayStartIndexByTick(\n            itemPosition.tickUpper,\n            poolKeys.config.tickSpacing,\n          );\n          const { publicKey: tickArrayLower } = getPdaTickArrayAddress(\n            new PublicKey(poolKeys.programId),\n            lockData.poolId,\n            tickArrayLowerStartIndex,\n          );\n          const { publicKey: tickArrayUpper } = getPdaTickArrayAddress(\n            new PublicKey(poolKeys.programId),\n            lockData.poolId,\n            tickArrayUpperStartIndex,\n          );\n          const { publicKey: protocolPosition } = getPdaProtocolPositionAddress(\n            new PublicKey(poolKeys.programId),\n            lockData.poolId,\n            itemPosition.tickLower,\n            itemPosition.tickUpper,\n          );\n          const lockPositionId = getPdaLockClPositionIdV2(CLMM_LOCK_PROGRAM_ID, lockData.lockNftMint).publicKey;\n          const harvestLockIns = ClmmInstrument.harvestLockPositionInstructionV2({\n            programId: CLMM_LOCK_PROGRAM_ID,\n            auth: CLMM_LOCK_AUTH_ID,\n            lockPositionId,\n            clmmProgram: CLMM_PROGRAM_ID,\n            lockOwner: this.scope.ownerPubKey,\n            lockNftMint: lockData.lockNftMint,\n            lockNftAccount,\n            positionNftAccount: lockData.nftAccount,\n            positionId: lockData.positionId,\n            poolId: lockData.poolId,\n            protocolPosition,\n            vaultA: new PublicKey(poolKeys.vault.A),\n            vaultB: new PublicKey(poolKeys.vault.B),\n            tickArrayLower,\n            tickArrayUpper,\n            userVaultA: ownerTokenAccountA!,\n            userVaultB: ownerTokenAccountB!,\n            mintA: new PublicKey(poolKeys.mintA.address),\n            mintB: new PublicKey(poolKeys.mintB.address),\n            rewardAccounts: rewardAccountsFullInfo,\n            exTickArrayBitmap: getPdaExBitmapAccount(CLMM_PROGRAM_ID, lockData.poolId).publicKey,\n          });\n          txBuilder.addInstruction({\n            instructions: [harvestLockIns],\n            instructionTypes: [InstructionType.ClmmHarvestLockPosition],\n            lookupTableAddress: poolKeys.lookupTableAccount ? [poolKeys.lookupTableAccount] : [],\n          });\n        } else {\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            nft2022: record[itemPosition.nftMint.toBase58()]?.equals(TOKEN_2022_PROGRAM_ID),\n          });\n          txBuilder.addInstruction(insData);\n        }\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      exBitmapAccount: computeClmmPoolInfo[poolId].exBitmapAccount.toBase58(),\n      observationId: computeClmmPoolInfo[poolId].observationId.toBase58(),\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      config: poolInfo.config,\n      rewardInfos: computeClmmPoolInfo[poolId].rewardInfos\n        .filter((r) => !r.tokenVault.equals(PublicKey.default))\n        .map((r) => ({\n          mint: toApiV3Token({ address: r.tokenMint.toBase58(), programId: TOKEN_PROGRAM_ID.toBase58(), decimals: 10 }),\n          vault: r.tokenVault.toBase58(),\n        })),\n    };\n    return { poolInfo, poolKeys, computePoolInfo: computeClmmPoolInfo[poolId], tickData: computePoolTickData };\n  }\n}\n","import { PublicKey } from \"@solana/web3.js\";\nimport { ApiV3PoolInfoStandardItemCpmm, CpmmKeys } from \"../../api/type\";\nimport { AccountLayout, NATIVE_MINT, TOKEN_PROGRAM_ID } from \"@solana/spl-token\";\nimport { BN_ZERO } from \"@/common/bignumber\";\nimport { getATAAddress } from \"@/common/pda\";\nimport { WSOLMint } from \"@/common/pubKey\";\nimport { MakeTxData } from \"@/common/txTool/txTool\";\nimport { InstructionType, TxVersion } from \"@/common/txTool/txType\";\nimport { Percent } from \"../../module\";\nimport { CurveCalculator } from \"./curve/calculator\";\n\nimport BN from \"bn.js\";\nimport Decimal from \"decimal.js\";\nimport {\n  fetchMultipleMintInfos,\n  getMultipleAccountsInfoWithCustomFlags,\n  getTransferAmountFeeV2,\n  LOCK_CPMM_AUTH,\n  LOCK_CPMM_PROGRAM,\n} from \"@/common\";\nimport { GetTransferAmountFee, ReturnTypeFetchMultipleMintInfos } from \"../../raydium/type\";\nimport ModuleBase, { ModuleBaseProps } from \"../moduleBase\";\nimport { toApiV3Token, toFeeConfig } from \"../token\";\nimport {\n  makeCreateCpmmPoolInInstruction,\n  makeDepositCpmmInInstruction,\n  makeSwapCpmmBaseInInstruction,\n  makeSwapCpmmBaseOutInstruction,\n  makeWithdrawCpmmInInstruction,\n  makeCpmmLockInstruction,\n  collectCpFeeInstruction,\n} from \"./instruction\";\nimport { CpmmConfigInfoLayout, CpmmPoolInfoLayout } from \"./layout\";\nimport { getCreatePoolKeys, getPdaObservationId, getPdaPoolAuthority } from \"./pda\";\nimport {\n  AddCpmmLiquidityParams,\n  ComputePairAmountParams,\n  CpmmComputeData,\n  CpmmLockExtInfo,\n  CpmmRpcData,\n  CpmmSwapParams,\n  CreateCpmmPoolAddress,\n  CreateCpmmPoolParam,\n  LockCpmmLpParams,\n  HarvestLockCpmmLpParams,\n  WithdrawCpmmLiquidityParams,\n} from \"./type\";\nimport { getCpLockPda } 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        burnPercent: 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        observationId: getPdaObservationId(rpcData.programId, new PublicKey(poolId)).publicKey.toBase58(),\n      },\n      rpcData,\n    };\n  }\n\n  public async createPool<T extends TxVersion>({\n    poolId,\n    programId,\n    poolFeeAccount,\n    startTime,\n    ownerInfo,\n    associatedOnly = false,\n    checkCreateATAOwner = false,\n    txVersion,\n    feeConfig,\n    computeBudgetConfig,\n    txTipConfig,\n    feePayer,\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(feePayer);\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      poolId,\n      programId,\n      configId: new PublicKey(feeConfig.id),\n      mintA: mintAPubkey,\n      mintB: mintBPubkey,\n    });\n\n    txBuilder.addInstruction({\n      instructions: [\n        makeCreateCpmmPoolInInstruction(\n          programId,\n          this.scope.ownerPubKey,\n          new PublicKey(feeConfig.id),\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    txBuilder.addTipInstruction(txTipConfig);\n    return txBuilder.versionBuild({\n      txVersion,\n      extInfo: {\n        address: { ...poolKeys, mintA, mintB, programId, poolFeeAccount, feeConfig },\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      txTipConfig,\n      config,\n      txVersion,\n      feePayer,\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(feePayer);\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    txBuilder.addTipInstruction(txTipConfig);\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 {\n      poolInfo,\n      poolKeys: propPoolKeys,\n      lpAmount,\n      slippage,\n      computeBudgetConfig,\n      txTipConfig,\n      txVersion,\n      feePayer,\n      closeWsol = true,\n    } = 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(feePayer);\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 && closeWsol),\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 && closeWsol),\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    txBuilder.addTipInstruction(txTipConfig);\n    return txBuilder.versionBuild({ txVersion }) as Promise<MakeTxData<T>>;\n  }\n\n  public async swap<T extends TxVersion>(params: CpmmSwapParams<T>): Promise<MakeTxData<T>> {\n    const {\n      poolInfo,\n      poolKeys: propPoolKeys,\n      baseIn,\n      fixedOut,\n      inputAmount,\n      swapResult,\n      slippage = 0,\n      config,\n      computeBudgetConfig,\n      txTipConfig,\n      txVersion,\n      feePayer,\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(feePayer);\n\n    const [mintA, mintB] = [new PublicKey(poolInfo.mintA.address), new PublicKey(poolInfo.mintB.address)];\n\n    if (!fixedOut) {\n      swapResult.destinationAmountSwapped = swapResult.destinationAmountSwapped\n        .mul(new BN((1 - slippage) * 10000))\n        .div(new BN(10000));\n    } else {\n      swapResult.sourceAmountSwapped = swapResult.sourceAmountSwapped\n        .mul(new BN((1 + slippage) * 10000))\n        .div(new BN(10000));\n    }\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        !fixedOut\n          ? makeSwapCpmmBaseInInstruction(\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            baseIn ? mintATokenAcc! : mintBTokenAcc!,\n            baseIn ? mintBTokenAcc! : mintATokenAcc!,\n            new PublicKey(poolKeys.vault[baseIn ? \"A\" : \"B\"]),\n            new PublicKey(poolKeys.vault[baseIn ? \"B\" : \"A\"]),\n            new PublicKey(poolInfo[baseIn ? \"mintA\" : \"mintB\"].programId ?? TOKEN_PROGRAM_ID),\n            new PublicKey(poolInfo[baseIn ? \"mintB\" : \"mintA\"].programId ?? TOKEN_PROGRAM_ID),\n            baseIn ? mintA : mintB,\n            baseIn ? mintB : mintA,\n            getPdaObservationId(new PublicKey(poolInfo.programId), new PublicKey(poolInfo.id)).publicKey,\n\n            inputAmount,\n            swapResult.destinationAmountSwapped,\n          )\n          : makeSwapCpmmBaseOutInstruction(\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            baseIn ? mintATokenAcc! : mintBTokenAcc!,\n            baseIn ? mintBTokenAcc! : mintATokenAcc!,\n\n            new PublicKey(poolKeys.vault[baseIn ? \"A\" : \"B\"]),\n            new PublicKey(poolKeys.vault[baseIn ? \"B\" : \"A\"]),\n            new PublicKey(poolInfo[baseIn ? \"mintA\" : \"mintB\"].programId ?? TOKEN_PROGRAM_ID),\n            new PublicKey(poolInfo[baseIn ? \"mintB\" : \"mintA\"].programId ?? TOKEN_PROGRAM_ID),\n            baseIn ? mintA : mintB,\n            baseIn ? mintB : mintA,\n\n            getPdaObservationId(new PublicKey(poolInfo.programId), new PublicKey(poolInfo.id)).publicKey,\n\n            swapResult.sourceAmountSwapped,\n            swapResult.destinationAmountSwapped,\n          ),\n      ],\n      instructionTypes: [fixedOut ? InstructionType.CpmmSwapBaseOut : InstructionType.ClmmSwapBaseIn],\n    });\n\n    txBuilder.addCustomComputeBudget(computeBudgetConfig);\n    txBuilder.addTipInstruction(txTipConfig);\n    return txBuilder.versionBuild({ txVersion }) as Promise<MakeTxData<T>>;\n  }\n\n  public async lockLp<T extends TxVersion>(params: LockCpmmLpParams<T>): Promise<MakeTxData<CpmmLockExtInfo>> {\n    const { poolInfo, lpAmount, computeBudgetConfig, txTipConfig, txVersion, feePayer, feeNftOwner } = params;\n\n    if (lpAmount.isZero())\n      this.logAndCreateError(\"lpAmount must greater than zero\", {\n        lpAmount: lpAmount.toString(),\n      });\n\n    const txBuilder = this.createTxBuilder(feePayer);\n\n    const poolKeys = params.poolKeys ?? (await this.getCpmmPoolKeys(poolInfo.id));\n\n    const insData = await makeCpmmLockInstruction({\n      poolInfo,\n      poolKeys,\n      ownerInfo: {\n        wallet: this.scope.ownerPubKey,\n        feePayer: params.feePayer ?? this.scope.ownerPubKey,\n      },\n      feeNftOwner: feeNftOwner ?? this.scope.ownerPubKey,\n      lockProgram: params.programId ?? LOCK_CPMM_PROGRAM,\n      lockAuthProgram: params.authProgram ?? LOCK_CPMM_AUTH,\n      lpAmount,\n      withMetadata: params.withMetadata ?? true,\n      getEphemeralSigners: params.getEphemeralSigners,\n    });\n\n    txBuilder.addInstruction(insData);\n    txBuilder.addCustomComputeBudget(computeBudgetConfig);\n    txBuilder.addTipInstruction(txTipConfig);\n    return txBuilder.versionBuild({ txVersion, extInfo: insData.address }) as Promise<MakeTxData<CpmmLockExtInfo>>;\n  }\n\n  public async harvestLockLp<T extends TxVersion>(params: HarvestLockCpmmLpParams<T>): Promise<MakeTxData> {\n    const {\n      poolInfo,\n      lpFeeAmount,\n      nftMint,\n      programId = LOCK_CPMM_PROGRAM,\n      authProgram = LOCK_CPMM_AUTH,\n      cpmmProgram,\n      computeBudgetConfig,\n      txTipConfig,\n      txVersion,\n      closeWsol = true,\n    } = params;\n\n    if (lpFeeAmount.isZero())\n      this.logAndCreateError(\"lpFeeAmount must greater than zero\", {\n        lpAmount: lpFeeAmount.toString(),\n      });\n\n    const feePayer = params.feePayer || this.scope.ownerPubKey;\n\n    const txBuilder = this.createTxBuilder(feePayer);\n\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 && closeWsol),\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 && closeWsol),\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\", { tokenAccountA, tokenAccountB });\n\n    const poolKeys = params.poolKeys ?? (await this.getCpmmPoolKeys(poolInfo.id));\n\n    const { publicKey: nftAccount } = getATAAddress(feePayer, nftMint, TOKEN_PROGRAM_ID);\n    const { publicKey: lockPda } = getCpLockPda(programId, nftMint);\n    const { publicKey: lockLpVault } = getATAAddress(\n      authProgram,\n      new PublicKey(poolInfo.lpMint.address),\n      TOKEN_PROGRAM_ID,\n    );\n\n    txBuilder.addInstruction({\n      instructions: [\n        collectCpFeeInstruction({\n          programId: programId ?? LOCK_CPMM_PROGRAM,\n          nftOwner: this.scope.ownerPubKey,\n          auth: authProgram ?? LOCK_CPMM_AUTH,\n\n          nftMint,\n          nftAccount,\n\n          lockPda,\n          poolId: new PublicKey(poolInfo.id),\n          mintLp: new PublicKey(poolKeys.mintLp.address),\n\n          userVaultA: tokenAccountA!,\n          userVaultB: tokenAccountB!,\n          poolVaultA: new PublicKey(poolKeys.vault.A),\n          poolVaultB: new PublicKey(poolKeys.vault.B),\n\n          mintA,\n          mintB,\n          lockLpVault,\n          lpFeeAmount,\n\n          cpmmProgram: cpmmProgram?.programId,\n          cpmmAuthProgram: cpmmProgram?.authProgram,\n        }),\n      ],\n      instructionTypes: [InstructionType.CpmmCollectLockFee],\n    });\n\n    txBuilder.addCustomComputeBudget(computeBudgetConfig);\n    txBuilder.addTipInstruction(txTipConfig);\n    return txBuilder.versionBuild({ txVersion }) as Promise<MakeTxData>;\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    minAnotherAmount: 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 _slippageMin = new Percent(new BN(1)).sub(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    const slippageAdjustedMinAmount = getTransferAmountFeeV2(\n      _slippageMin.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      minAnotherAmount: slippageAdjustedMinAmount,\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 { PublicKey } from \"@solana/web3.js\";\nimport BN from \"bn.js\";\nimport Decimal from \"decimal.js-light\";\nimport { ApiV3Token } from \"../../../api/type\";\nimport { BNDivCeil } from \"../../../common\";\nimport { ConstantProductCurve } from \"./constantProduct\";\nimport { CpmmFee } from \"./fee\";\n\nexport enum RoundDirection {\n  Floor,\n  Ceiling,\n}\n\nexport type SwapWithoutFeesResult = { destinationAmountSwapped: BN };\n\nexport type TradingTokenResult = { tokenAmount0: BN; tokenAmount1: BN };\n\nexport type SwapResult = {\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 { destinationAmountSwapped } = ConstantProductCurve.swapWithoutFees(\n      sourceAmountLessFees,\n      swapSourceAmount,\n      swapDestinationAmount,\n    );\n\n    return {\n      newSwapDestinationAmount: swapDestinationAmount.sub(destinationAmountSwapped),\n      sourceAmountSwapped: sourceAmount,\n      destinationAmountSwapped,\n      tradeFee,\n    };\n  }\n\n  static swapBaseOut({\n    poolMintA,\n    poolMintB,\n    tradeFeeRate,\n    baseReserve,\n    quoteReserve,\n    outputMint,\n    outputAmount,\n  }: {\n    poolMintA: ApiV3Token;\n    poolMintB: ApiV3Token;\n    tradeFeeRate: BN;\n    baseReserve: BN;\n    quoteReserve: BN;\n    outputMint: string | PublicKey;\n    outputAmount: BN;\n  }): {\n    amountRealOut: BN;\n\n    amountIn: BN;\n    amountInWithoutFee: BN;\n\n    tradeFee: BN;\n    priceImpact: number;\n  } {\n    const [reserveInAmount, reserveOutAmount, reserveInDecimals, reserveOutDecimals, inputMint] =\n      poolMintB.address === outputMint.toString()\n        ? [baseReserve, quoteReserve, poolMintA.decimals, poolMintB.decimals, poolMintA.address]\n        : [quoteReserve, baseReserve, poolMintB.decimals, poolMintA.decimals, poolMintB.address];\n    const currentPrice = new Decimal(reserveOutAmount.toString())\n      .div(10 ** reserveOutDecimals)\n      .div(new Decimal(reserveInAmount.toString()).div(10 ** reserveInDecimals));\n    const amountRealOut = outputAmount.gte(reserveOutAmount) ? reserveOutAmount.sub(new BN(1)) : outputAmount;\n\n    const denominator = reserveOutAmount.sub(amountRealOut);\n    const amountInWithoutFee = BNDivCeil(reserveInAmount.mul(amountRealOut), denominator);\n    const amountIn = BNDivCeil(amountInWithoutFee.mul(new BN(1_000_000)), new BN(1_000_000).sub(tradeFeeRate));\n    const fee = amountIn.sub(amountInWithoutFee);\n    const executionPrice = new Decimal(amountRealOut.toString())\n      .div(10 ** reserveOutDecimals)\n      .div(new Decimal(amountIn.toString()).div(10 ** reserveInDecimals));\n    const priceImpact = currentPrice.isZero() ? 0 : executionPrice.sub(currentPrice).div(currentPrice).abs().toNumber();\n\n    return {\n      amountRealOut,\n\n      amountIn,\n      amountInWithoutFee,\n\n      tradeFee: fee,\n      priceImpact,\n    };\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] = checkedCeilDiv(invariant, newSwapSourceAmount);\n\n    const destinationAmountSwapped = swapDestinationAmount.sub(newSwapDestinationAmount);\n    if (destinationAmountSwapped.isZero()) throw Error(\"destinationAmountSwapped is zero\");\n\n    return {\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 { ceilDiv, floorDiv } from \"@/common/bignumber\";\nimport { FEE_RATE_DENOMINATOR_VALUE } from \"@/common/fee\";\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\";\n\nimport { AccountMeta, PublicKey, TransactionInstruction, Signer, Keypair, SystemProgram } from \"@solana/web3.js\";\nimport { ASSOCIATED_TOKEN_PROGRAM_ID, TOKEN_2022_PROGRAM_ID, TOKEN_PROGRAM_ID } from \"@solana/spl-token\";\nimport {\n  MEMO_PROGRAM_ID2,\n  RENT_PROGRAM_ID,\n  SYSTEM_PROGRAM_ID,\n  METADATA_PROGRAM_ID,\n  createLogger,\n  CREATE_CPMM_POOL_PROGRAM,\n  CREATE_CPMM_POOL_AUTH,\n  InstructionType,\n} from \"@/common\";\nimport { getCpmmPdaPoolId, getCpLockPda } from \"./pda\";\n\nimport { struct, u64, bool } from \"@/marshmallow\";\nimport { ReturnTypeMakeInstructions } from \"@/raydium/type\";\nimport { ApiV3PoolInfoStandardItemCpmm, CpmmKeys } from \"@/api\";\nimport { getATAAddress } from \"@/common\";\nimport { getPdaMetadataKey } from \"../clmm\";\nimport { CpmmLockExtInfo } from \"./type\";\n\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  lockCpLiquidity: [216, 157, 29, 78, 38, 51, 31, 26],\n  collectCpFee: [8, 30, 51, 199, 209, 184, 247, 133],\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 pdaPoolId = getCpmmPdaPoolId(programId, configId, mintA, mintB).publicKey;\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: !poolId.equals(pdaPoolId), 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 makeSwapCpmmBaseInInstruction(\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 makeSwapCpmmBaseOutInstruction(\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\nexport async function makeCpmmLockInstruction(props: {\n  poolInfo: ApiV3PoolInfoStandardItemCpmm;\n  poolKeys: CpmmKeys;\n  ownerInfo: {\n    feePayer: PublicKey;\n    wallet: PublicKey;\n  };\n  feeNftOwner: PublicKey;\n\n  lockProgram: PublicKey;\n  lockAuthProgram: PublicKey;\n  lpAmount: BN;\n  withMetadata?: boolean;\n  getEphemeralSigners?: (k: number) => any;\n}): Promise<ReturnTypeMakeInstructions<CpmmLockExtInfo>> {\n  const { ownerInfo, poolInfo, poolKeys, feeNftOwner, getEphemeralSigners } = props;\n\n  const signers: Signer[] = [];\n  const [poolId, lpMint] = [new PublicKey(poolInfo.id), new PublicKey(poolInfo.lpMint.address)];\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 { publicKey: nftAccount } = getATAAddress(feeNftOwner, nftMintAccount, TOKEN_PROGRAM_ID);\n  const { publicKey: metadataAccount } = getPdaMetadataKey(nftMintAccount);\n  const { publicKey: lockPda } = getCpLockPda(props.lockProgram, nftMintAccount);\n\n  const { publicKey: userLpVault } = getATAAddress(ownerInfo.wallet, lpMint, TOKEN_PROGRAM_ID);\n  const { publicKey: lockLpVault } = getATAAddress(props.lockAuthProgram, lpMint, TOKEN_PROGRAM_ID);\n\n  const ins = cpmmLockPositionInstruction({\n    programId: props.lockProgram,\n    auth: props.lockAuthProgram,\n    payer: ownerInfo.feePayer,\n    liquidityOwner: ownerInfo.wallet,\n    nftOwner: feeNftOwner,\n    nftMint: nftMintAccount,\n    nftAccount,\n    poolId,\n    lockPda,\n    mintLp: lpMint,\n    userLpVault,\n    lockLpVault,\n    poolVaultA: new PublicKey(poolKeys.vault.A),\n    poolVaultB: new PublicKey(poolKeys.vault.B),\n    metadataAccount,\n    lpAmount: props.lpAmount,\n    withMetadata: props.withMetadata ?? true,\n  });\n\n  return {\n    address: {\n      nftMint: nftMintAccount,\n      nftAccount,\n      metadataAccount,\n      lockPda,\n      userLpVault,\n      lockLpVault,\n    },\n    instructions: [ins],\n    signers,\n    instructionTypes: [InstructionType.CpmmLockLp],\n    lookupTableAddress: [],\n  };\n}\n\nexport function cpmmLockPositionInstruction({\n  programId,\n  auth,\n  payer,\n  liquidityOwner,\n  nftOwner,\n  nftMint,\n  nftAccount,\n  poolId,\n  lockPda,\n  mintLp,\n  userLpVault,\n  lockLpVault,\n  poolVaultA,\n  poolVaultB,\n  metadataAccount,\n  lpAmount,\n  withMetadata,\n}: {\n  programId: PublicKey;\n  auth: PublicKey;\n  payer: PublicKey;\n  liquidityOwner: PublicKey;\n  nftOwner: PublicKey;\n  nftMint: PublicKey;\n  nftAccount: PublicKey;\n  poolId: PublicKey;\n  lockPda: PublicKey;\n  mintLp: PublicKey;\n  userLpVault: PublicKey;\n  lockLpVault: PublicKey;\n  poolVaultA: PublicKey;\n  poolVaultB: PublicKey;\n  metadataAccount: PublicKey;\n  lpAmount: BN;\n  withMetadata: boolean;\n}): TransactionInstruction {\n  const keys = [\n    { pubkey: auth, isSigner: false, isWritable: false },\n    { pubkey: payer, isSigner: true, isWritable: true },\n    { pubkey: liquidityOwner, isSigner: true, isWritable: false },\n    { pubkey: nftOwner, isSigner: false, isWritable: false },\n    { pubkey: nftMint, isSigner: true, isWritable: true },\n    { pubkey: nftAccount, isSigner: false, isWritable: true },\n    { pubkey: poolId, isSigner: false, isWritable: false },\n    { pubkey: lockPda, isSigner: false, isWritable: true },\n    { pubkey: mintLp, isSigner: false, isWritable: false },\n    { pubkey: userLpVault, isSigner: false, isWritable: true },\n    { pubkey: lockLpVault, isSigner: false, isWritable: true },\n    { pubkey: poolVaultA, isSigner: false, isWritable: true },\n    { pubkey: poolVaultB, isSigner: false, isWritable: true },\n    { pubkey: metadataAccount, isSigner: false, isWritable: true },\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  ];\n  const dataLayout = struct([u64(\"lpAmount\"), bool(\"withMetadata\")]);\n  const data = Buffer.alloc(dataLayout.span);\n  dataLayout.encode(\n    {\n      lpAmount,\n      withMetadata,\n    },\n    data,\n  );\n  const aData = Buffer.from([...anchorDataBuf.lockCpLiquidity, ...data]);\n  return new TransactionInstruction({\n    keys,\n    programId,\n    data: aData,\n  });\n}\n\nexport function collectCpFeeInstruction({\n  programId,\n  nftOwner,\n  auth,\n  nftAccount,\n  lockPda,\n  poolId,\n  mintLp,\n  userVaultA,\n  userVaultB,\n  poolVaultA,\n  poolVaultB,\n  mintA,\n  mintB,\n  lockLpVault,\n  lpFeeAmount,\n  cpmmProgram,\n  cpmmAuthProgram,\n}: {\n  programId: PublicKey;\n  nftOwner: PublicKey;\n  auth: PublicKey;\n  nftMint: PublicKey;\n  nftAccount: PublicKey;\n  lockPda: PublicKey;\n  poolId: PublicKey;\n  mintLp: PublicKey;\n  userVaultA: PublicKey;\n  userVaultB: PublicKey;\n  poolVaultA: PublicKey;\n  poolVaultB: PublicKey;\n  mintA: PublicKey;\n  mintB: PublicKey;\n  lockLpVault: PublicKey;\n  lpFeeAmount: BN;\n  cpmmProgram?: PublicKey;\n  cpmmAuthProgram?: PublicKey;\n}): TransactionInstruction {\n  const keys = [\n    { pubkey: auth, isSigner: false, isWritable: false },\n    { pubkey: nftOwner, isSigner: true, isWritable: false },\n    // { pubkey: nftMint, isSigner: false, isWritable: true },\n    { pubkey: nftAccount, isSigner: false, isWritable: true },\n    { pubkey: lockPda, isSigner: false, isWritable: true },\n    { pubkey: cpmmProgram ?? CREATE_CPMM_POOL_PROGRAM, isSigner: false, isWritable: false },\n    { pubkey: cpmmAuthProgram ?? CREATE_CPMM_POOL_AUTH, isSigner: false, isWritable: false },\n    { pubkey: poolId, isSigner: false, isWritable: true },\n    { pubkey: mintLp, isSigner: false, isWritable: true },\n    { pubkey: userVaultA, isSigner: false, isWritable: true },\n    { pubkey: userVaultB, isSigner: false, isWritable: true },\n    { pubkey: poolVaultA, isSigner: false, isWritable: true },\n    { pubkey: poolVaultB, isSigner: false, isWritable: true },\n    { pubkey: mintA, isSigner: false, isWritable: false },\n    { pubkey: mintB, isSigner: false, isWritable: false },\n    { pubkey: lockLpVault, isSigner: false, isWritable: true },\n    // { pubkey: ASSOCIATED_TOKEN_PROGRAM_ID, 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_ID2, isSigner: false, isWritable: false },\n  ];\n  const dataLayout = struct([u64(\"lpFeeAmount\")]);\n  const data = Buffer.alloc(dataLayout.span);\n  dataLayout.encode(\n    {\n      lpFeeAmount,\n    },\n    data,\n  );\n  const aData = Buffer.from([...anchorDataBuf.collectCpFee, ...data]);\n  return new TransactionInstruction({\n    keys,\n    programId,\n    data: aData,\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  poolId: propPoolId,\n  programId,\n  configId,\n  mintA,\n  mintB,\n}: {\n  poolId?: PublicKey;\n  programId: PublicKey;\n  configId: 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 = propPoolId || 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\nexport const LOCK_LIQUIDITY_SEED = Buffer.from(\"locked_liquidity\", \"utf8\");\n\nexport function getCpLockPda(\n  programId: PublicKey,\n  mint: PublicKey,\n): {\n  publicKey: PublicKey;\n  nonce: number;\n} {\n  return findProgramAddress([LOCK_LIQUIDITY_SEED, mint.toBuffer()], programId);\n}\n","import { blob, bool, publicKey, seq, struct, u16, u64, u8, u128 } 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 { EpochInfo, PublicKey } from \"@solana/web3.js\";\nimport { createTransferInstruction, TOKEN_PROGRAM_ID, TOKEN_2022_PROGRAM_ID } from \"@solana/spl-token\";\nimport BN from \"bn.js\";\nimport Decimal from \"decimal.js\";\nimport { AmmV4Keys, ApiV3Token, ClmmKeys, PoolKeys } from \"@/api\";\nimport {\n  AMM_V4,\n  BigNumberish,\n  CLMM_PROGRAM_ID,\n  CREATE_CPMM_POOL_PROGRAM,\n  fetchMultipleMintInfos,\n  getMultipleAccountsInfoWithCustomFlags,\n  minExpirationTime,\n  parseBigNumberish,\n  solToWSol,\n  WSOLMint,\n} from \"@/common\";\nimport { MakeMultiTxData, MakeTxData } from \"@/common/txTool/txTool\";\nimport { InstructionType, TxVersion } from \"@/common/txTool/txType\";\nimport { publicKey, struct } from \"../../marshmallow\";\nimport { Price, TokenAmount } from \"../../module\";\nimport { ClmmRpcData, ComputeClmmPoolInfo, PoolUtils, ReturnTypeFetchMultiplePoolTickArrays } from \"../../raydium/clmm\";\nimport { PoolInfoLayout } from \"../../raydium/clmm/layout\";\nimport { CpmmPoolInfoLayout, getPdaPoolAuthority } from \"../../raydium/cpmm\";\nimport {\n  ComputeAmountOutParam,\n  getLiquidityAssociatedAuthority,\n  liquidityStateV4Layout,\n  toAmmComputePoolInfo,\n} from \"../../raydium/liquidity\";\nimport { ComputeBudgetConfig, ReturnTypeFetchMultipleMintInfos } from \"../../raydium/type\";\nimport { closeAccountInstruction, createWSolAccountInstructions } from \"../account/instruction\";\nimport { TokenAccount } from \"../account/types\";\nimport { CpmmComputeData } from \"../cpmm\";\nimport { AmmRpcData } from \"../liquidity\";\nimport ModuleBase, { ModuleBaseProps } from \"../moduleBase\";\nimport { Market, MARKET_STATE_LAYOUT_V3 } from \"../serum\";\nimport { toApiV3Token, toToken, toTokenAmount } from \"../token\";\nimport { makeSwapInstruction } from \"./instrument\";\nimport {\n  BasicPoolInfo,\n  ComputeAmountOutAmmLayout,\n  ComputeAmountOutLayout,\n  ComputePoolType,\n  ComputeRoutePathType,\n  ReturnTypeFetchMultipleInfo,\n  ReturnTypeGetAllRoute,\n  RoutePathType,\n} from \"./type\";\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    feePayer?: PublicKey;\n  }): Promise<MakeTxData<T>> {\n    const { amount, tokenProgram, txVersion = TxVersion.LEGACY, feePayer } = props;\n    const tokenAccounts = await this.getWSolAccounts();\n    const txBuilder = this.createTxBuilder(feePayer);\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      }\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    feePayer?: PublicKey,\n  ): Promise<MakeTxData<T>> {\n    // const tokenAccounts = await this.getWSolAccounts();\n\n    const txBuilder = this.createTxBuilder(feePayer);\n\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: 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    feePayer,\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    feePayer?: PublicKey;\n  }): Promise<MakeMultiTxData<T>> {\n    const txBuilder = this.createTxBuilder(feePayer);\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    let destinationAcc: PublicKey;\n    if (swapInfo.routeType === \"route\" && !isOutputSol) {\n      destinationAcc = this.scope.account.getAssociatedTokenAccount(\n        outputMint,\n        amountOut.amount.token.isToken2022 ? TOKEN_2022_PROGRAM_ID : TOKEN_PROGRAM_ID,\n      );\n    } else {\n      const { account, instructionParams } = await this.scope.account.getOrCreateTokenAccount({\n        tokenProgram: amountOut.amount.token.isToken2022 ? TOKEN_2022_PROGRAM_ID : TOKEN_PROGRAM_ID,\n        mint: outputMint,\n        notUseTokenAccount: isOutputSol,\n        owner: this.scope.ownerPubKey,\n        skipCloseAccount: true,\n        createInfo: {\n          payer: this.scope.ownerPubKey,\n          amount: 0,\n        },\n        associatedOnly: isOutputSol ? false : ownerInfo.associatedOnly,\n        checkCreateATAOwner: ownerInfo.checkCreateATAOwner,\n      });\n      destinationAcc = account!;\n      instructionParams && txBuilder.addInstruction(instructionParams);\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 && cpmmPoolList[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 && cpmmPoolList[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) => {\n        if (!i.allTrade)\n          this.logDebug(`pool ${i.poolInfoList.map((p) => p.id.toString()).join(\",\")} filter out since not all trade`);\n        return i.allTrade;\n      })\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 = await 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 = await this.scope.liquidity.getRpcPoolInfos(Array.from(ammFetchKeys));\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          observationId: pool.observationId.toBase58(),\n          exBitmapAccount: pool.exBitmapAccount.toBase58(),\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          observationId: pool.observationId.toBase58(),\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 { 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 { PublicKey, SystemProgram, TransactionInstruction } from \"@solana/web3.js\";\nimport BN from \"bn.js\";\nimport { ASSOCIATED_TOKEN_PROGRAM_ID, TOKEN_2022_PROGRAM_ID, TOKEN_PROGRAM_ID } from \"@solana/spl-token\";\n\nimport {\n  InstructionType,\n  LIQUIDITY_POOL_PROGRAM_ID_V5_MODEL,\n  MEMO_PROGRAM_ID2,\n  accountMeta,\n  jsonInfo2PoolKeys,\n  getATAAddress,\n  ALL_PROGRAM_ID,\n} from \"@/common\";\nimport { seq, struct, u128, u64, u8 } from \"../../marshmallow\";\nimport {\n  ClmmInstrument,\n  MAX_SQRT_PRICE_X64,\n  MAX_SQRT_PRICE_X64_SUB_ONE,\n  MIN_SQRT_PRICE_X64,\n  MIN_SQRT_PRICE_X64_ADD_ONE,\n  ONE,\n  getPdaExBitmapAccount,\n} from \"../clmm\";\nimport { makeAMMSwapInstruction } from \"../liquidity/instruction\";\n\nimport { AmmV4Keys, AmmV5Keys, ApiV3PoolInfoItem, ClmmKeys, CpmmKeys, PoolKeys } from \"../../api/type\";\nimport { makeSwapCpmmBaseInInstruction } from \"../../raydium/cpmm\";\nimport { ComputePoolType, MakeSwapInstructionParam, ReturnTypeMakeSwapInstruction } from \"./type\";\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          makeSwapCpmmBaseInInstruction(\n            poolInfo.programId,\n            ownerInfo.wallet,\n            poolInfo.authority,\n            poolInfo.configId,\n            poolInfo.id,\n            ownerInfo.sourceToken!,\n            ownerInfo.destinationToken!,\n            baseIn ? poolInfo.vaultA : poolInfo.vaultB,\n            baseIn ? poolInfo.vaultB : poolInfo.vaultA,\n            baseIn ? poolInfo.mintProgramA : poolInfo.mintProgramB,\n            baseIn ? poolInfo.mintProgramB : poolInfo.mintProgramA,\n            new PublicKey(poolInfo[baseIn ? \"mintA\" : \"mintB\"].address),\n            new PublicKey(poolInfo[baseIn ? \"mintB\" : \"mintA\"].address),\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\nexport interface ApiSwapV1Out {\n  id: string;\n  success: boolean;\n  version: \"V0\" | \"V1\";\n  openTime?: undefined;\n  msg: undefined;\n  data: {\n    swapType: \"BaseIn\" | \"BaseOut\";\n    inputMint: string;\n    inputAmount: string;\n    outputMint: string;\n    outputAmount: string;\n    otherAmountThreshold: string;\n    slippageBps: number;\n    priceImpactPct: number;\n    routePlan: {\n      poolId: string;\n      inputMint: string;\n      outputMint: string;\n      feeMint: string;\n      feeRate: number;\n      feeAmount: string;\n      remainingAccounts?: string[];\n      lastPoolPriceX64?: string;\n    }[];\n  };\n}\n\nexport function swapBaseInAutoAccount({\n  programId,\n  wallet,\n  amount,\n  inputAccount,\n  outputAccount,\n  routeInfo,\n  poolKeys,\n}: {\n  programId: PublicKey;\n  wallet: PublicKey;\n  amount: BN;\n  inputAccount: PublicKey;\n  outputAccount: PublicKey;\n  routeInfo: ApiSwapV1Out;\n  poolKeys: PoolKeys[];\n}): TransactionInstruction {\n  if (routeInfo.success === false) throw Error(\"route info error\");\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  const cacheAccount: { [mint: string]: PublicKey } = {\n    [routeInfo.data.inputMint]: inputAccount,\n    [routeInfo.data.outputMint]: outputAccount,\n  };\n  keys.push(accountMeta({ pubkey: cacheAccount[routeInfo.data.inputMint] }));\n  keys.push(accountMeta({ pubkey: cacheAccount[routeInfo.data.outputMint] }));\n  for (let index = 0; index < poolKeys.length; index++) {\n    const _routeInfo = routeInfo.data.routePlan[index];\n    const _poolKey = poolKeys[index];\n    const inputIsA = _routeInfo.inputMint === _poolKey.mintA.address;\n    keys.push(accountMeta({ pubkey: new PublicKey(_poolKey.programId), isWritable: false }));\n    if (index === poolKeys.length - 1) {\n      keys.push(accountMeta({ pubkey: cacheAccount[_routeInfo.outputMint] }));\n    } else {\n      const mint = _routeInfo.outputMint;\n      if (cacheAccount[mint] === undefined) {\n        const ata = getATAAddress(\n          wallet,\n          new PublicKey(mint),\n          _poolKey.programId === ALL_PROGRAM_ID.CLMM_PROGRAM_ID.toBase58() ||\n            _poolKey.programId === ALL_PROGRAM_ID.CREATE_CPMM_POOL_PROGRAM.toBase58()\n            ? new PublicKey(inputIsA ? _poolKey.mintB.programId : _poolKey.mintA.programId)\n            : TOKEN_PROGRAM_ID,\n        ).publicKey;\n        cacheAccount[mint] = ata;\n      }\n      keys.push(accountMeta({ pubkey: cacheAccount[mint] }));\n    }\n    keys.push(accountMeta({ pubkey: new PublicKey(_routeInfo.inputMint) }));\n    keys.push(accountMeta({ pubkey: new PublicKey(_routeInfo.outputMint) }));\n    if (_poolKey.programId === ALL_PROGRAM_ID.CLMM_PROGRAM_ID.toBase58()) {\n      const poolKey = _poolKey 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(poolKey.observationId) }));\n      keys.push(accountMeta({ pubkey: MEMO_PROGRAM_ID2, isWritable: false }));\n      keys.push(accountMeta({ pubkey: new PublicKey(poolKey.exBitmapAccount) }));\n      clmmPriceLimit.push(clmmPriceLimitX64InsData(_routeInfo.lastPoolPriceX64, inputIsA));\n      for (const item of _routeInfo.remainingAccounts ?? []) {\n        keys.push(accountMeta({ pubkey: new PublicKey(item) }));\n      }\n    } else if (_poolKey.programId === ALL_PROGRAM_ID.AMM_STABLE.toBase58()) {\n      const poolKey = _poolKey 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), isWritable: false }));\n      keys.push(accountMeta({ pubkey: new PublicKey(poolKey.marketAuthority), isWritable: false }));\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.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 (_poolKey.programId === ALL_PROGRAM_ID.AMM_V4.toBase58()) {\n      const poolKey = _poolKey as AmmV4Keys;\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.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.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.marketProgramId), isWritable: false }))\n      // keys.push(accountMeta({ pubkey: new PublicKey(_poolKey.marketAuthority), isWritable: false }))\n      // keys.push(accountMeta({ pubkey: new PublicKey(_poolKey.openOrder) }))\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.marketId) }))\n      // keys.push(accountMeta({ pubkey: new PublicKey(_poolKey.bids) }))\n      // keys.push(accountMeta({ pubkey: new PublicKey(_poolKey.asks) }))\n      // keys.push(accountMeta({ pubkey: new PublicKey(_poolKey.eventQueue) }))\n      // keys.push(accountMeta({ pubkey: new PublicKey(_poolKey.marketVaultA) }))\n      // keys.push(accountMeta({ pubkey: new PublicKey(_poolKey.marketVaultB) }))\n    } else if (_poolKey.programId === ALL_PROGRAM_ID.CREATE_CPMM_POOL_PROGRAM.toBase58()) {\n      const poolKey = _poolKey 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(poolKey.observationId) }));\n    } else throw Error(\"pool type error\");\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: amount,\n      amountOut: new BN(routeInfo.data.otherAmountThreshold),\n      clmmPriceLimit,\n    },\n    data,\n  );\n  return new TransactionInstruction({\n    keys,\n    programId,\n    data,\n  });\n}\n\nexport function swapBaseOutAutoAccount({\n  programId,\n  wallet,\n  inputAccount,\n  outputAccount,\n  routeInfo,\n  poolKeys,\n}: {\n  programId: PublicKey;\n  wallet: PublicKey;\n  inputAccount: PublicKey;\n  outputAccount: PublicKey;\n  routeInfo: ApiSwapV1Out;\n  poolKeys: PoolKeys[];\n}): TransactionInstruction {\n  if (routeInfo.success === false) throw Error(\"route info error\");\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  const cacheAccount: { [mint: string]: PublicKey } = {\n    [routeInfo.data.inputMint]: inputAccount,\n    [routeInfo.data.outputMint]: outputAccount,\n  };\n  for (let index = poolKeys.length - 1; index >= 0; index--) {\n    const _routeInfo = routeInfo.data.routePlan[index];\n    const _poolKey = poolKeys[index];\n    const inputIsA = _routeInfo.inputMint === _poolKey.mintA.address;\n    keys.push(accountMeta({ pubkey: new PublicKey(_poolKey.programId) }));\n    if (index === 0) {\n      keys.push(accountMeta({ pubkey: cacheAccount[_routeInfo.inputMint] }));\n    } else {\n      const mint = _routeInfo.inputMint;\n      if (cacheAccount[mint] === undefined) {\n        const ata = getATAAddress(\n          wallet,\n          new PublicKey(mint),\n          _poolKey.programId === ALL_PROGRAM_ID.CLMM_PROGRAM_ID.toBase58() ||\n            _poolKey.programId === ALL_PROGRAM_ID.CREATE_CPMM_POOL_PROGRAM.toBase58()\n            ? new PublicKey(inputIsA ? _poolKey.mintA.programId : _poolKey.mintB.programId)\n            : TOKEN_PROGRAM_ID,\n        ).publicKey;\n        cacheAccount[mint] = ata;\n      }\n      keys.push(accountMeta({ pubkey: cacheAccount[mint] }));\n    }\n    if (index === poolKeys.length - 1) {\n      keys.push(accountMeta({ pubkey: cacheAccount[_routeInfo.outputMint] }));\n    } else {\n      const mint = _routeInfo.outputMint;\n      if (cacheAccount[mint] === undefined) {\n        const ata = getATAAddress(\n          wallet,\n          new PublicKey(mint),\n          _poolKey.programId === ALL_PROGRAM_ID.CLMM_PROGRAM_ID.toBase58() ||\n            _poolKey.programId === ALL_PROGRAM_ID.CREATE_CPMM_POOL_PROGRAM.toBase58()\n            ? new PublicKey(inputIsA ? _poolKey.mintB.programId : _poolKey.mintA.programId)\n            : TOKEN_PROGRAM_ID,\n        ).publicKey;\n        cacheAccount[mint] = ata;\n      }\n      keys.push(accountMeta({ pubkey: cacheAccount[mint] }));\n    }\n    keys.push(accountMeta({ pubkey: new PublicKey(_routeInfo.inputMint) }));\n    keys.push(accountMeta({ pubkey: new PublicKey(_routeInfo.outputMint) }));\n    if (_poolKey.programId === ALL_PROGRAM_ID.CLMM_PROGRAM_ID.toBase58()) {\n      const poolKey = _poolKey as ClmmKeys;\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(poolKey.observationId) }));\n      keys.push(accountMeta({ pubkey: MEMO_PROGRAM_ID2, isWritable: false }));\n      keys.push(accountMeta({ pubkey: new PublicKey(poolKey.exBitmapAccount) }));\n      clmmPriceLimit.push(clmmPriceLimitX64InsData(_routeInfo.lastPoolPriceX64, inputIsA));\n      for (const item of _routeInfo.remainingAccounts ?? []) {\n        keys.push(accountMeta({ pubkey: new PublicKey(item) }));\n      }\n    } else if (_poolKey.programId === ALL_PROGRAM_ID.AMM_STABLE.toBase58()) {\n      const poolkey = _poolKey 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), isWritable: false }));\n      keys.push(accountMeta({ pubkey: new PublicKey(poolkey.marketAuthority), isWritable: false }));\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.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 (_poolKey.programId === ALL_PROGRAM_ID.AMM_V4.toBase58()) {\n      const poolkey = _poolKey as AmmV4Keys;\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.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.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.marketProgramId), isWritable: false }))\n      // keys.push(accountMeta({ pubkey: new PublicKey(_poolKey.marketAuthority), isWritable: false }))\n      // keys.push(accountMeta({ pubkey: new PublicKey(_poolKey.openOrder) }))\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.marketId) }))\n      // keys.push(accountMeta({ pubkey: new PublicKey(_poolKey.bids) }))\n      // keys.push(accountMeta({ pubkey: new PublicKey(_poolKey.asks) }))\n      // keys.push(accountMeta({ pubkey: new PublicKey(_poolKey.eventQueue) }))\n      // keys.push(accountMeta({ pubkey: new PublicKey(_poolKey.marketVaultA) }))\n      // keys.push(accountMeta({ pubkey: new PublicKey(_poolKey.marketVaultB) }))\n    } else if (_poolKey.programId === ALL_PROGRAM_ID.CREATE_CPMM_POOL_PROGRAM.toBase58()) {\n      const poolkey = _poolKey as CpmmKeys;\n\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(poolkey.observationId) }));\n    } else throw Error(\"pool type error\");\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: 1,\n      amountIn: new BN(routeInfo.data.otherAmountThreshold),\n      amountOut: new BN(routeInfo.data.outputAmount),\n      clmmPriceLimit,\n    },\n    data,\n  );\n  return new TransactionInstruction({\n    keys,\n    programId,\n    data,\n  });\n}\n","import { Connection, PublicKey, Signer, Transaction, TransactionInstruction } from \"@solana/web3.js\";\nimport { TOKEN_PROGRAM_ID } from \"@solana/spl-token\";\nimport BN from \"bn.js\";\nimport { findProgramAddress, forecastTransactionSize, getMultipleAccountsInfo } from \"@/common\";\nimport { blob, publicKey, seq, struct, u64, u8 } from \"@/marshmallow\";\nimport { Token } from \"@/module\";\nimport ModuleBase from \"../moduleBase\";\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    feePayer,\n  }: {\n    connection: Connection;\n    poolInfo: SHOW_INFO;\n    ownerInfo: {\n      wallet?: PublicKey;\n      associatedOnly: boolean;\n    };\n    feePayer?: PublicKey;\n  }): Promise<\n    {\n      transaction: Transaction;\n      signer: Signer[];\n    }[]\n  > {\n    if (!ownerInfo.wallet) this.scope.checkOwner();\n    const txBuilder = this.createTxBuilder(feePayer);\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    feePayer,\n  }: {\n    poolInfos: SHOW_INFO[];\n    ownerInfo: {\n      wallet?: PublicKey;\n      associatedOnly: boolean;\n    };\n    feePayer?: PublicKey;\n  }): Promise<\n    {\n      transaction: Transaction;\n      signer: Signer[];\n    }[]\n  > {\n    const txBuilder = this.createTxBuilder(feePayer);\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 BN from \"bn.js\";\nimport { IdoKeysData, OwnerIdoInfo } from \"../../api/type\";\nimport { IDO_ALL_PROGRAM } from \"../../common/programId\";\nimport { WSOLMint } from \"../../common/pubKey\";\nimport { MakeTxData } from \"../../common/txTool/txTool\";\nimport { TxVersion } from \"../../common/txTool/txType\";\nimport { jsonInfo2PoolKeys } from \"../../common/utility\";\nimport ModuleBase from \"../moduleBase\";\nimport { makeClaimInstruction, makeClaimInstructionV4 } from \"./instruction\";\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    feePayer,\n  }: {\n    ownerInfo: OwnerIdoInfo[keyof OwnerIdoInfo] & { userIdoInfo: string };\n    idoKeys: IdoKeysData;\n    associatedOnly?: boolean;\n    checkCreateATAOwner?: boolean;\n    txVersion?: T;\n    feePayer?: PublicKey;\n  }): Promise<MakeTxData> {\n    const txBuilder = this.createTxBuilder(feePayer);\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, SYSVAR_CLOCK_PUBKEY, TransactionInstruction } from \"@solana/web3.js\";\nimport { TOKEN_PROGRAM_ID } from \"@solana/spl-token\";\nimport { CLOCK_PROGRAM_ID, RENT_PROGRAM_ID, SYSTEM_PROGRAM_ID } from \"@/common/pubKey\";\nimport { claimLayout, purchaseLayout } from \"./layout\";\nimport {\n  ClaimInstructionKeys,\n  ClaimInstructionKeysV3,\n  IdoClaimInstructionParams,\n  PurchaseInstructionKeys,\n} from \"./type\";\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 { findProgramAddress, ProgramAddress } from \"@/common\";\nimport { u16ToBytes } from \"../clmm\";\n\nexport const LAUNCHPAD_AUTH_SEED = Buffer.from(\"vault_auth_seed\", \"utf8\");\nexport const LAUNCHPAD_CONFIG_SEED = Buffer.from(\"global_config\", \"utf8\");\nexport const LAUNCHPAD_POOL_SEED = Buffer.from(\"pool\", \"utf8\");\nexport const LAUNCHPAD_POOL_VAULT_SEED = Buffer.from(\"pool_vault\", \"utf8\");\nexport const LAUNCHPAD_POOL_VESTING_SEED = Buffer.from(\"pool_vesting\", \"utf8\");\nexport const LAUNCHPAD_POOL_PLATFORM_SEED = Buffer.from(\"platform_config\", \"utf8\");\n\nexport function getPdaLaunchpadAuth(programId: PublicKey): ProgramAddress {\n  return findProgramAddress([LAUNCHPAD_AUTH_SEED], programId);\n}\n\nexport function getPdaLaunchpadConfigId(\n  programId: PublicKey,\n  mintB: PublicKey,\n  curveType: number,\n  index: number,\n): ProgramAddress {\n  return findProgramAddress(\n    [LAUNCHPAD_CONFIG_SEED, mintB.toBuffer(), u8ToBytes(curveType), u16ToBytes(index)],\n    programId,\n  );\n}\n\nexport function getPdaLaunchpadPoolId(programId: PublicKey, mintA: PublicKey, mintB: PublicKey): ProgramAddress {\n  return findProgramAddress([LAUNCHPAD_POOL_SEED, mintA.toBuffer(), mintB.toBuffer()], programId);\n}\n\nexport function getPdaLaunchpadVaultId(programId: PublicKey, poolId: PublicKey, mint: PublicKey): ProgramAddress {\n  return findProgramAddress([LAUNCHPAD_POOL_VAULT_SEED, poolId.toBuffer(), mint.toBuffer()], programId);\n}\n\nexport function u8ToBytes(num: number): Uint8Array {\n  const arr = new ArrayBuffer(1);\n  const view = new DataView(arr);\n  view.setUint8(0, num);\n  return new Uint8Array(arr);\n}\n\nexport function getPdaCpiEvent(programId: PublicKey): ProgramAddress {\n  return findProgramAddress([Buffer.from(\"__event_authority\", \"utf8\")], programId);\n}\n\nexport function getPdaPlatformId(programId: PublicKey, platformAdminWallet: PublicKey): ProgramAddress {\n  return findProgramAddress([LAUNCHPAD_POOL_PLATFORM_SEED, platformAdminWallet.toBuffer()], programId);\n}\n\nexport function getPdaVestId(programId: PublicKey, poolId: PublicKey, owner: PublicKey): ProgramAddress {\n  return findProgramAddress([LAUNCHPAD_POOL_VESTING_SEED, poolId.toBuffer(), owner.toBuffer()], programId);\n}\n","import { PublicKey, SystemProgram, TransactionInstruction, AccountMeta } from \"@solana/web3.js\";\nimport { ASSOCIATED_TOKEN_PROGRAM_ID } from \"@solana/spl-token\";\nimport BN from \"bn.js\";\nimport { publicKey, str, struct, u64, u8 } from \"@/marshmallow\";\nimport { RENT_PROGRAM_ID, METADATA_PROGRAM_ID } from \"@/common\";\nimport { getPdaCpiEvent } from \"./pda\";\nexport const anchorDataBuf = {\n  initialize: Buffer.from([175, 175, 109, 31, 13, 152, 155, 237]),\n  buyExactIn: Buffer.from([250, 234, 13, 123, 213, 156, 19, 236]),\n  buyExactOut: Buffer.from([24, 211, 116, 40, 105, 3, 153, 56]),\n  sellExactIn: Buffer.from([149, 39, 222, 155, 211, 124, 152, 26]),\n  sellExactOut: Buffer.from([95, 200, 71, 34, 8, 9, 11, 166]),\n  createVestingAccount: Buffer.from([129, 178, 2, 13, 217, 172, 230, 218]),\n  claimVestedToken: Buffer.from([49, 33, 104, 30, 189, 157, 79, 35]),\n\n  createPlatformConfig: Buffer.from([176, 90, 196, 175, 253, 113, 220, 20]),\n  claimPlatformFee: Buffer.from([156, 39, 208, 135, 76, 237, 61, 72]),\n  updatePlaformConfig: Buffer.from([195, 60, 76, 129, 146, 45, 67, 143]),\n};\n\nexport function initialize(\n  programId: PublicKey,\n\n  payer: PublicKey,\n  creator: PublicKey,\n  configId: PublicKey,\n  platformId: PublicKey,\n  auth: PublicKey,\n  poolId: PublicKey,\n  mintA: PublicKey,\n  mintB: PublicKey,\n  vaultA: PublicKey,\n  vaultB: PublicKey,\n  metadataId: PublicKey,\n  tokenProgramA: PublicKey,\n  tokenProgramB: PublicKey,\n\n  decimals: number,\n  name: string,\n  symbol: string,\n  uri: string,\n\n  curveParam: ({ type: \"ConstantCurve\"; totalSellA: BN } | { type: \"FixedCurve\" } | { type: \"LinearCurve\" }) & {\n    migrateType: \"amm\" | \"cpmm\";\n    supply: BN;\n    totalFundRaisingB: BN;\n  },\n\n  totalLockedAmount: BN,\n  cliffPeriod: BN,\n  unlockPeriod: BN,\n): TransactionInstruction {\n  const dataLayout1 = struct([u8(\"decimals\"), str(\"name\"), str(\"symbol\"), str(\"uri\")]);\n  const dataLayout3 = struct([u64(\"totalLockedAmount\"), u64(\"cliffPeriod\"), u64(\"unlockPeriod\")]);\n\n  const dataLayout21 = struct([u8(\"index\"), u64(\"supply\"), u64(\"totalFundRaisingB\"), u8(\"migrateType\")]);\n  const dataLayout22 = struct([\n    u8(\"index\"),\n    u64(\"supply\"),\n    u64(\"totalSellA\"),\n    u64(\"totalFundRaisingB\"),\n    u8(\"migrateType\"),\n  ]);\n\n  const keys: Array<AccountMeta> = [\n    { pubkey: payer, isSigner: true, isWritable: false },\n    { pubkey: creator, isSigner: false, isWritable: false },\n    { pubkey: configId, isSigner: false, isWritable: false },\n    { pubkey: platformId, isSigner: false, isWritable: false },\n    { pubkey: auth, isSigner: false, isWritable: false },\n    { pubkey: poolId, isSigner: false, isWritable: true },\n    { pubkey: mintA, isSigner: true, isWritable: true },\n    { pubkey: mintB, isSigner: false, isWritable: false },\n    { pubkey: vaultA, isSigner: false, isWritable: true },\n    { pubkey: vaultB, isSigner: false, isWritable: true },\n    { pubkey: metadataId, isSigner: false, isWritable: true },\n\n    { pubkey: tokenProgramA, isSigner: false, isWritable: false },\n    { pubkey: tokenProgramB, isSigner: false, isWritable: false },\n    { pubkey: METADATA_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: getPdaCpiEvent(programId).publicKey, isSigner: false, isWritable: false },\n    { pubkey: programId, isSigner: false, isWritable: false },\n  ];\n\n  const data1 = Buffer.alloc(\n    Buffer.from(name, \"utf-8\").length +\n    Buffer.from(symbol, \"utf-8\").length +\n    Buffer.from(uri, \"utf-8\").length +\n    4 * 3 +\n    1,\n  );\n  const data3 = Buffer.alloc(dataLayout3.span);\n  const data2 = Buffer.alloc(curveParam.type === \"ConstantCurve\" ? dataLayout22.span : dataLayout21.span);\n\n  dataLayout1.encode({ decimals, name, symbol, uri }, data1);\n  if (curveParam.type === \"ConstantCurve\") {\n    dataLayout22.encode({ index: 0, ...curveParam, migrateType: curveParam.migrateType === \"amm\" ? 0 : 1 }, data2);\n  } else if (curveParam.type === \"FixedCurve\") {\n    dataLayout21.encode({ index: 1, ...curveParam, migrateType: curveParam.migrateType === \"amm\" ? 0 : 1 }, data2);\n  } else if (curveParam.type === \"LinearCurve\") {\n    dataLayout21.encode({ index: 2, ...curveParam, migrateType: curveParam.migrateType === \"amm\" ? 0 : 1 }, data2);\n  }\n\n  dataLayout3.encode({ totalLockedAmount, cliffPeriod, unlockPeriod }, data3);\n\n  return new TransactionInstruction({\n    keys,\n    programId,\n    data: Buffer.from([...anchorDataBuf.initialize, ...data1, ...data2, ...data3]),\n  });\n}\nexport function buyExactInInstruction(\n  programId: PublicKey,\n\n  owner: PublicKey,\n  auth: PublicKey,\n  configId: PublicKey,\n  platformId: PublicKey,\n  poolId: PublicKey,\n  userTokenAccountA: PublicKey,\n  userTokenAccountB: PublicKey,\n  vaultA: PublicKey,\n  vaultB: PublicKey,\n  mintA: PublicKey,\n  mintB: PublicKey,\n  tokenProgramA: PublicKey,\n  tokenProgramB: PublicKey,\n\n  amountB: BN,\n  minAmountA: BN,\n  shareFeeRate?: BN,\n\n  shareFeeReceiver?: PublicKey,\n): TransactionInstruction {\n  const dataLayout = struct([u64(\"amountB\"), u64(\"minAmountA\"), u64(\"shareFeeRate\")]);\n  const keys: Array<AccountMeta> = [\n    { pubkey: owner, isSigner: true, isWritable: false },\n    { pubkey: auth, isSigner: false, isWritable: false },\n    { pubkey: configId, isSigner: false, isWritable: false },\n    { pubkey: platformId, isSigner: false, isWritable: false },\n    { pubkey: poolId, isSigner: false, isWritable: true },\n\n    { pubkey: userTokenAccountA, isSigner: false, isWritable: true },\n    { pubkey: userTokenAccountB, isSigner: false, isWritable: true },\n    { pubkey: vaultA, isSigner: false, isWritable: true },\n    { pubkey: vaultB, isSigner: false, isWritable: true },\n    { pubkey: mintA, isSigner: false, isWritable: false },\n    { pubkey: mintB, isSigner: false, isWritable: false },\n\n    { pubkey: tokenProgramA, isSigner: false, isWritable: false },\n    { pubkey: tokenProgramB, isSigner: false, isWritable: false },\n    { pubkey: getPdaCpiEvent(programId).publicKey, isSigner: false, isWritable: false },\n    { pubkey: programId, isSigner: false, isWritable: false },\n  ];\n\n  if (shareFeeReceiver) {\n    keys.push({ pubkey: shareFeeReceiver, isSigner: false, isWritable: true });\n  }\n  console.log({\n    amountB: amountB.toString(),\n    minAmountA: minAmountA.toString(),\n  });\n  const data = Buffer.alloc(dataLayout.span);\n  dataLayout.encode(\n    {\n      amountB,\n      minAmountA,\n      shareFeeRate: shareFeeRate ?? new BN(0),\n    },\n    data,\n  );\n\n  return new TransactionInstruction({\n    keys,\n    programId,\n    data: Buffer.from([...anchorDataBuf.buyExactIn, ...data]),\n  });\n}\n\nexport function buyExactOutInstruction(\n  programId: PublicKey,\n\n  owner: PublicKey,\n  auth: PublicKey,\n  configId: PublicKey,\n  platformId: PublicKey,\n  poolId: PublicKey,\n  userTokenAccountA: PublicKey,\n  userTokenAccountB: PublicKey,\n  vaultA: PublicKey,\n  vaultB: PublicKey,\n  mintA: PublicKey,\n  mintB: PublicKey,\n  tokenProgramA: PublicKey,\n  tokenProgramB: PublicKey,\n\n  amountA: BN,\n  maxAmountB: BN,\n  shareFeeRate?: BN,\n\n  shareFeeReceiver?: PublicKey,\n): TransactionInstruction {\n  const dataLayout = struct([u64(\"amountA\"), u64(\"maxAmountB\"), u64(\"shareFeeRate\")]);\n\n  const keys: Array<AccountMeta> = [\n    { pubkey: owner, isSigner: true, isWritable: false },\n    { pubkey: auth, isSigner: false, isWritable: false },\n    { pubkey: configId, isSigner: false, isWritable: false },\n    { pubkey: platformId, isSigner: false, isWritable: false },\n    { pubkey: poolId, isSigner: false, isWritable: true },\n\n    { pubkey: userTokenAccountA, isSigner: false, isWritable: true },\n    { pubkey: userTokenAccountB, isSigner: false, isWritable: true },\n    { pubkey: vaultA, isSigner: false, isWritable: true },\n    { pubkey: vaultB, isSigner: false, isWritable: true },\n    { pubkey: mintA, isSigner: false, isWritable: false },\n    { pubkey: mintB, isSigner: false, isWritable: false },\n\n    { pubkey: tokenProgramA, isSigner: false, isWritable: false },\n    { pubkey: tokenProgramB, isSigner: false, isWritable: false },\n\n    { pubkey: getPdaCpiEvent(programId).publicKey, isSigner: false, isWritable: false },\n    { pubkey: programId, isSigner: false, isWritable: false },\n  ];\n\n  if (shareFeeReceiver) {\n    keys.push({ pubkey: shareFeeReceiver, isSigner: false, isWritable: true });\n  }\n\n  const data = Buffer.alloc(dataLayout.span);\n  dataLayout.encode(\n    {\n      amountA,\n      maxAmountB,\n      shareFeeRate: shareFeeRate ?? new BN(0),\n    },\n    data,\n  );\n\n  return new TransactionInstruction({\n    keys,\n    programId,\n    data: Buffer.from([...anchorDataBuf.buyExactOut, ...data]),\n  });\n}\n\nexport function sellExactInInstruction(\n  programId: PublicKey,\n\n  owner: PublicKey,\n  auth: PublicKey,\n  configId: PublicKey,\n  platformId: PublicKey,\n  poolId: PublicKey,\n  userTokenAccountA: PublicKey,\n  userTokenAccountB: PublicKey,\n  vaultA: PublicKey,\n  vaultB: PublicKey,\n  mintA: PublicKey,\n  mintB: PublicKey,\n  tokenProgramA: PublicKey,\n  tokenProgramB: PublicKey,\n\n  amountA: BN,\n  minAmountB: BN,\n  shareFeeRate?: BN,\n\n  shareFeeReceiver?: PublicKey,\n): TransactionInstruction {\n  const dataLayout = struct([u64(\"amountA\"), u64(\"minAmountB\"), u64(\"shareFeeRate\")]);\n  const keys: Array<AccountMeta> = [\n    { pubkey: owner, isSigner: true, isWritable: false },\n    { pubkey: auth, isSigner: false, isWritable: false },\n    { pubkey: configId, isSigner: false, isWritable: false },\n    { pubkey: platformId, isSigner: false, isWritable: false },\n    { pubkey: poolId, isSigner: false, isWritable: true },\n\n    { pubkey: userTokenAccountA, isSigner: false, isWritable: true },\n    { pubkey: userTokenAccountB, isSigner: false, isWritable: true },\n    { pubkey: vaultA, isSigner: false, isWritable: true },\n    { pubkey: vaultB, isSigner: false, isWritable: true },\n    { pubkey: mintA, isSigner: false, isWritable: false },\n    { pubkey: mintB, isSigner: false, isWritable: false },\n\n    { pubkey: tokenProgramA, isSigner: false, isWritable: false },\n    { pubkey: tokenProgramB, isSigner: false, isWritable: false },\n    { pubkey: getPdaCpiEvent(programId).publicKey, isSigner: false, isWritable: false },\n    { pubkey: programId, isSigner: false, isWritable: false },\n  ];\n\n  if (shareFeeReceiver) {\n    keys.push({ pubkey: shareFeeReceiver, isSigner: false, isWritable: true });\n  }\n\n  const data = Buffer.alloc(dataLayout.span);\n  dataLayout.encode(\n    {\n      amountA,\n      minAmountB,\n      shareFeeRate: shareFeeRate ?? new BN(0),\n    },\n    data,\n  );\n\n  return new TransactionInstruction({\n    keys,\n    programId,\n    data: Buffer.from([...anchorDataBuf.sellExactIn, ...data]),\n  });\n}\n\nexport function sellExactOut(\n  programId: PublicKey,\n\n  owner: PublicKey,\n  auth: PublicKey,\n  configId: PublicKey,\n  platformId: PublicKey,\n  poolId: PublicKey,\n  userTokenAccountA: PublicKey,\n  userTokenAccountB: PublicKey,\n  vaultA: PublicKey,\n  vaultB: PublicKey,\n  mintA: PublicKey,\n  mintB: PublicKey,\n  tokenProgramA: PublicKey,\n  tokenProgramB: PublicKey,\n\n  amountB: BN,\n  maxAmountA: BN,\n  shareFeeRate?: BN,\n\n  shareFeeReceiver?: PublicKey,\n): TransactionInstruction {\n  const dataLayout = struct([u64(\"amountB\"), u64(\"maxAmountA\"), u64(\"shareFeeRate\")]);\n\n  const keys: Array<AccountMeta> = [\n    { pubkey: owner, isSigner: true, isWritable: false },\n    { pubkey: auth, isSigner: false, isWritable: false },\n    { pubkey: configId, isSigner: false, isWritable: false },\n    { pubkey: platformId, isSigner: false, isWritable: false },\n    { pubkey: poolId, isSigner: false, isWritable: true },\n\n    { pubkey: userTokenAccountA, isSigner: false, isWritable: true },\n    { pubkey: userTokenAccountB, isSigner: false, isWritable: true },\n    { pubkey: vaultA, isSigner: false, isWritable: true },\n    { pubkey: vaultB, isSigner: false, isWritable: true },\n    { pubkey: mintA, isSigner: false, isWritable: false },\n    { pubkey: mintB, isSigner: false, isWritable: false },\n\n    { pubkey: tokenProgramA, isSigner: false, isWritable: false },\n    { pubkey: tokenProgramB, isSigner: false, isWritable: false },\n\n    { pubkey: getPdaCpiEvent(programId).publicKey, isSigner: false, isWritable: false },\n    { pubkey: programId, isSigner: false, isWritable: false },\n  ];\n\n  if (shareFeeReceiver) {\n    keys.push({ pubkey: shareFeeReceiver, isSigner: false, isWritable: true });\n  }\n\n  const data = Buffer.alloc(dataLayout.span);\n  dataLayout.encode(\n    {\n      amountB,\n      maxAmountA,\n      shareFeeRate: shareFeeRate ?? new BN(0),\n    },\n    data,\n  );\n\n  return new TransactionInstruction({\n    keys,\n    programId,\n    data: Buffer.from([...anchorDataBuf.sellExactOut, ...data]),\n  });\n}\n\nexport function claimVestedToken(\n  programId: PublicKey,\n\n  owner: PublicKey,\n  auth: PublicKey,\n  poolId: PublicKey,\n\n  vestingRecord: PublicKey,\n\n  userTokenAccountA: PublicKey,\n  vaultA: PublicKey,\n  mintA: PublicKey,\n  tokenProgramA: PublicKey,\n): TransactionInstruction {\n  const dataLayout = struct([]);\n\n  const keys: Array<AccountMeta> = [\n    { pubkey: owner, isSigner: true, isWritable: false },\n    { pubkey: auth, isSigner: false, isWritable: false },\n    { pubkey: poolId, isSigner: false, isWritable: true },\n\n    { pubkey: vestingRecord, isSigner: false, isWritable: true },\n\n    { pubkey: vaultA, isSigner: false, isWritable: true },\n    { pubkey: userTokenAccountA, isSigner: false, isWritable: true },\n\n    { pubkey: mintA, isSigner: false, isWritable: false },\n    { pubkey: tokenProgramA, isSigner: false, isWritable: false },\n    { pubkey: SystemProgram.programId, isSigner: false, isWritable: false },\n    { pubkey: ASSOCIATED_TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },\n  ];\n\n  const data = Buffer.alloc(dataLayout.span);\n  dataLayout.encode({}, data);\n\n  return new TransactionInstruction({\n    keys,\n    programId,\n    data: Buffer.from([...anchorDataBuf.claimVestedToken, ...data]),\n  });\n}\n\nexport function createVestingAccount(\n  programId: PublicKey,\n\n  owner: PublicKey,\n  beneficiary: PublicKey,\n  poolId: PublicKey,\n\n  vestingRecord: PublicKey,\n  shareAmount: BN,\n): TransactionInstruction {\n  const dataLayout = struct([u64(\"shareAmount\")]);\n\n  const keys: Array<AccountMeta> = [\n    { pubkey: owner, isSigner: true, isWritable: false },\n    { pubkey: beneficiary, isSigner: false, isWritable: true },\n    { pubkey: poolId, isSigner: false, isWritable: true },\n\n    { pubkey: vestingRecord, isSigner: false, isWritable: true },\n\n    { pubkey: SystemProgram.programId, isSigner: false, isWritable: false },\n  ];\n\n  const data = Buffer.alloc(dataLayout.span);\n  dataLayout.encode({ shareAmount }, data);\n\n  return new TransactionInstruction({\n    keys,\n    programId,\n    data: Buffer.from([...anchorDataBuf.createVestingAccount, ...data]),\n  });\n}\n\nexport function claimPlatformFee(\n  programId: PublicKey,\n  platformClaimFeeWallet: PublicKey,\n  auth: PublicKey,\n  poolId: PublicKey,\n  platformId: PublicKey,\n  vaultB: PublicKey,\n  userTokenAccountB: PublicKey,\n  mintB: PublicKey,\n  tokenProgramB: PublicKey,\n): TransactionInstruction {\n  const keys: Array<AccountMeta> = [\n    { pubkey: platformClaimFeeWallet, isSigner: true, isWritable: true },\n    { pubkey: auth, isSigner: false, isWritable: false },\n    { pubkey: poolId, isSigner: false, isWritable: true },\n    { pubkey: platformId, isSigner: false, isWritable: true },\n    { pubkey: vaultB, isSigner: false, isWritable: true },\n    { pubkey: userTokenAccountB, isSigner: false, isWritable: true },\n    { pubkey: mintB, isSigner: false, isWritable: true },\n    { pubkey: tokenProgramB, isSigner: false, isWritable: true },\n    { pubkey: SystemProgram.programId, isSigner: false, isWritable: true },\n    { pubkey: ASSOCIATED_TOKEN_PROGRAM_ID, isSigner: false, isWritable: true },\n  ];\n\n  return new TransactionInstruction({\n    keys,\n    programId,\n    data: anchorDataBuf.claimPlatformFee,\n  });\n}\n\nexport function createPlatformConfig(\n  programId: PublicKey,\n\n  platformAdmin: PublicKey,\n  platformClaimFeeWallet: PublicKey,\n  platformLockNftWallet: PublicKey,\n  platformId: PublicKey,\n\n  cpConfigId: PublicKey,\n\n  migrateCpLockNftScale: {\n    platformScale: BN;\n    creatorScale: BN;\n    burnScale: BN;\n  },\n  feeRate: BN,\n  name: string,\n  web: string,\n  img: string,\n): TransactionInstruction {\n  const dataLayout = struct([\n    u64(\"platformScale\"),\n    u64(\"creatorScale\"),\n    u64(\"burnScale\"),\n\n    u64(\"feeRate\"),\n    str(\"name\"),\n    str(\"web\"),\n    str(\"img\"),\n  ]);\n\n  const keys: Array<AccountMeta> = [\n    { pubkey: platformAdmin, isSigner: true, isWritable: true },\n    { pubkey: platformClaimFeeWallet, isSigner: false, isWritable: false },\n    { pubkey: platformLockNftWallet, isSigner: false, isWritable: false },\n    { pubkey: platformId, isSigner: false, isWritable: true },\n    { pubkey: cpConfigId, isSigner: false, isWritable: true },\n    { pubkey: SystemProgram.programId, isSigner: false, isWritable: false },\n  ];\n\n  const data = Buffer.alloc(\n    8 * 4 +\n    Buffer.from(name, \"utf-8\").length +\n    Buffer.from(web, \"utf-8\").length +\n    Buffer.from(img, \"utf-8\").length +\n    4 * 3,\n  );\n  dataLayout.encode(\n    {\n      platformScale: migrateCpLockNftScale.platformScale,\n      creatorScale: migrateCpLockNftScale.creatorScale,\n      burnScale: migrateCpLockNftScale.burnScale,\n      feeRate,\n      name,\n      web,\n      img,\n    },\n    data,\n  );\n\n  return new TransactionInstruction({\n    keys,\n    programId,\n    data: Buffer.from([...anchorDataBuf.createPlatformConfig, ...data]),\n  });\n}\n\nexport function updatePlatformConfig(\n  programId: PublicKey,\n\n  platformAdmin: PublicKey,\n  platformId: PublicKey,\n\n  updateInfo:\n    | { type: \"updateClaimFeeWallet\" | \"updateLockNftWallet\"; value: PublicKey }\n    | { type: \"updateFeeRate\"; value: BN }\n    | { type: \"updateName\" | \"updateImg\" | \"updateWeb\"; value: string }\n    | { type: \"migrateCpLockNftScale\"; value: { platformScale: BN; creatorScale: BN; burnScale: BN } }\n    | { type: 'updateCpConfigId', value: PublicKey },\n): TransactionInstruction {\n  const keys: Array<AccountMeta> = [\n    { pubkey: platformAdmin, isSigner: true, isWritable: false },\n    { pubkey: platformId, isSigner: false, isWritable: true },\n  ];\n\n  let data: Buffer;\n  if (updateInfo.type === \"updateClaimFeeWallet\") {\n    const dataLayout = struct([u8(\"index\"), publicKey(\"value\")]);\n    data = Buffer.alloc(dataLayout.span);\n    dataLayout.encode({ index: 0, value: updateInfo.value }, data);\n  } else if (updateInfo.type === \"updateLockNftWallet\") {\n    const dataLayout = struct([u8(\"index\"), publicKey(\"value\")]);\n    data = Buffer.alloc(dataLayout.span);\n    dataLayout.encode({ index: 1, value: updateInfo.value }, data);\n  } else if (updateInfo.type === \"migrateCpLockNftScale\") {\n    const dataLayout = struct([u8(\"index\"), u64(\"platformScale\"), u64(\"creatorScale\"), u64(\"burnScale\")]);\n    data = Buffer.alloc(dataLayout.span);\n    dataLayout.encode({ index: 2, ...updateInfo.value }, data);\n  } else if (updateInfo.type === \"updateFeeRate\") {\n    const dataLayout = struct([u8(\"index\"), u64(\"value\")]);\n    data = Buffer.alloc(dataLayout.span);\n    dataLayout.encode({ index: 3, value: updateInfo.value }, data);\n  } else if (updateInfo.type === \"updateImg\" || updateInfo.type === \"updateName\" || updateInfo.type === \"updateWeb\") {\n    const dataLayout = struct([u8(\"index\"), str(\"value\")]);\n    data = Buffer.alloc(Buffer.from(updateInfo.value, 'utf-8').length + 4 + 1 * 1);\n    if (updateInfo.type === \"updateName\") dataLayout.encode({ index: 4, value: updateInfo.value }, data);\n    else if (updateInfo.type === \"updateWeb\") dataLayout.encode({ index: 5, value: updateInfo.value }, data);\n    else if (updateInfo.type === \"updateImg\") dataLayout.encode({ index: 6, value: updateInfo.value }, data);\n  } else if (updateInfo.type === 'updateCpConfigId') {\n    keys.push({ pubkey: updateInfo.value, isSigner: false, isWritable: false })\n\n    const dataLayout = struct([u8('index')])\n    data = Buffer.alloc(dataLayout.span)\n    dataLayout.encode({ index: 7 }, data)\n  } else {\n    throw Error(\"updateInfo params type error\");\n  }\n\n  return new TransactionInstruction({\n    keys,\n    programId,\n    data: Buffer.from([...anchorDataBuf.updatePlaformConfig, ...data]),\n  });\n}\n","import ModuleBase, { ModuleBaseProps } from \"../moduleBase\";\nimport {\n  TxVersion,\n  MakeTxData,\n  LAUNCHPAD_PROGRAM,\n  getMultipleAccountsInfoWithCustomFlags,\n  getATAAddress,\n  MakeMultiTxData,\n} from \"@/common\";\nimport {\n  BuyToken,\n  ClaimPlatformFee,\n  ClaimVesting,\n  CreateLaunchPad,\n  CreatePlatform,\n  CreateVesting,\n  LaunchpadConfigInfo,\n  LaunchpadPoolInfo,\n  SellToken,\n  UpdatePlatform,\n} from \"./type\";\nimport {\n  getPdaLaunchpadAuth,\n  getPdaLaunchpadPoolId,\n  getPdaLaunchpadVaultId,\n  getPdaPlatformId,\n  getPdaVestId,\n} from \"./pda\";\nimport {\n  initialize,\n  buyExactInInstruction,\n  sellExactInInstruction,\n  createPlatformConfig,\n  updatePlatformConfig,\n  claimPlatformFee,\n  createVestingAccount,\n  claimVestedToken,\n} from \"./instrument\";\nimport { NATIVE_MINT, TOKEN_PROGRAM_ID, createAssociatedTokenAccountIdempotentInstruction } from \"@solana/spl-token\";\nimport BN from \"bn.js\";\nimport { PublicKey } from \"@solana/web3.js\";\nimport { getPdaMetadataKey } from \"../clmm\";\nimport { LaunchpadConfig, LaunchpadPool, PlatformConfig } from \"./layout\";\nimport { Curve } from \"./curve/curve\";\nimport Decimal from \"decimal.js\";\n\nexport const LaunchpadPoolInitParam = {\n  initPriceX64: new BN(\"515752397214619\"),\n  supply: new BN(1_000_000_000_000_000),\n  totalSellA: new BN(793_100_000_000_000),\n  totalFundRaisingB: new BN(85_000_000_000),\n  totalLockedAmount: new BN(\"0\"),\n  cliffPeriod: new BN(\"0\"),\n  unlockPeriod: new BN(\"0\"),\n  decimals: 6,\n  virtualA: new BN(\"1073471847374405\"),\n  virtualB: new BN(\"30050573465\"),\n  realA: new BN(0),\n  realB: new BN(0),\n  protocolFee: new BN(0),\n  platformId: new PublicKey(\"4Bu96XjU84XjPDSpveTVf6LYGCkfW5FK7SNkREWcEfV4\"),\n  vestingSchedule: {\n    totalLockedAmount: new BN(0),\n    cliffPeriod: new BN(0),\n    unlockPeriod: new BN(0),\n    startTime: new BN(0),\n    totalAllocatedShare: new BN(0),\n  },\n};\n\nconst SLIPPAGE_UNIT = new BN(10000);\nexport default class LaunchpadModule extends ModuleBase {\n  constructor(params: ModuleBaseProps) {\n    super(params);\n  }\n\n  public async createLaunchpad<T extends TxVersion>({\n    programId = LAUNCHPAD_PROGRAM,\n    authProgramId,\n    platformId = LaunchpadPoolInitParam.platformId,\n    mintA,\n    decimals = 6,\n    mintBDecimals = 9,\n    name,\n    symbol,\n    uri,\n    migrateType,\n    configId,\n\n    configInfo: propConfigInfo,\n    platformFeeRate,\n    txVersion,\n    computeBudgetConfig,\n    txTipConfig,\n    feePayer,\n    buyAmount,\n    minMintAAmount,\n    slippage,\n    associatedOnly = true,\n    checkCreateATAOwner = false,\n    extraSigners,\n    ...extraConfigs\n  }: CreateLaunchPad<T>): Promise<\n    MakeMultiTxData<T, { address: LaunchpadPoolInfo & { poolId: PublicKey }; outAmount: BN }>\n  > {\n    const txBuilder = this.createTxBuilder(feePayer);\n    authProgramId = authProgramId ?? getPdaLaunchpadAuth(programId).publicKey;\n\n    let configInfo = propConfigInfo;\n    if (!configInfo && configId) {\n      const r = await this.scope.connection.getAccountInfo(configId);\n      if (r) configInfo = LaunchpadConfig.decode(r.data);\n    }\n\n    if (!configInfo) this.logAndCreateError(\"config not found\");\n    const mintB = configInfo!.mintB;\n    const curType = configInfo!.curveType;\n\n    // const { publicKey: configId } = getPdaLaunchpadConfigId(programId, mintB, curType, configIndex);\n    const { publicKey: poolId } = getPdaLaunchpadPoolId(programId, mintA, mintB);\n    const { publicKey: vaultA } = getPdaLaunchpadVaultId(programId, poolId, mintA);\n    const { publicKey: vaultB } = getPdaLaunchpadVaultId(programId, poolId, mintB);\n    const { publicKey: metaId } = getPdaMetadataKey(mintA);\n\n    console.log(\n      `create token: ${mintA.toBase58()}, mintB: ${mintB.toBase58()}, decimals A:${decimals}/B:${mintBDecimals}, config:${configId.toBase58()}`,\n    );\n\n    if (symbol.length > 10) this.logAndCreateError(\"Symbol length should shorter than 11\");\n    if (!uri) this.logAndCreateError(\"uri should not empty\");\n    if (buyAmount.lte(new BN(0))) this.logAndCreateError(\"buy amount should gt 0:\", buyAmount.toString());\n\n    const supply = extraConfigs?.supply ?? LaunchpadPoolInitParam.supply;\n    const totalSellA = extraConfigs?.totalSellA ?? LaunchpadPoolInitParam.totalSellA;\n    const totalFundRaisingB = extraConfigs?.totalFundRaisingB ?? LaunchpadPoolInitParam.totalFundRaisingB;\n    const totalLockedAmount = extraConfigs?.totalLockedAmount ?? new BN(0);\n\n    let defaultPlatformFeeRate = platformFeeRate;\n    if (!platformFeeRate) {\n      const platformData = await this.scope.connection.getAccountInfo(platformId);\n      if (!platformData) this.logAndCreateError(\"platform id not found:\", platformId.toString());\n      defaultPlatformFeeRate = PlatformConfig.decode(platformData!.data).feeRate;\n    }\n\n    const curve = Curve.getCurve(configInfo!.curveType);\n    const initParam = curve.getInitParam({\n      supply,\n      totalFundRaising: totalFundRaisingB,\n      totalSell: totalSellA,\n      totalLockedAmount,\n      migrateFee: configInfo!.migrateFee,\n    });\n\n    const poolInfo: LaunchpadPoolInfo = {\n      epoch: new BN(896),\n      bump: 254,\n      status: 0,\n      mintDecimalsA: decimals,\n      mintDecimalsB: mintBDecimals,\n      supply,\n      totalSellA,\n      mintA: new PublicKey(mintA),\n      mintB,\n      virtualA: initParam.a,\n      virtualB: initParam.b,\n      realA: LaunchpadPoolInitParam.realA,\n      realB: LaunchpadPoolInitParam.realB,\n      migrateFee: configInfo!.migrateFee,\n      migrateType: migrateType === \"amm\" ? 0 : 1,\n      protocolFee: LaunchpadPoolInitParam.protocolFee,\n      platformFee: defaultPlatformFeeRate!,\n      platformId,\n      configId,\n      vaultA,\n      vaultB,\n      creator: this.scope.ownerPubKey,\n      totalFundRaisingB,\n      vestingSchedule: {\n        totalLockedAmount,\n        cliffPeriod: new BN(0),\n        unlockPeriod: new BN(0),\n        startTime: new BN(0),\n        totalAllocatedShare: new BN(0),\n      },\n    };\n\n    const initCurve = Curve.getCurve(configInfo!.curveType);\n    const { c } = initCurve.getInitParam({\n      supply: poolInfo.supply,\n      totalFundRaising: poolInfo.totalFundRaisingB,\n      totalLockedAmount,\n      totalSell: configInfo!.curveType === 0 ? poolInfo.totalSellA : new BN(0),\n      migrateFee: configInfo!.migrateFee,\n    });\n\n    try {\n      Curve.checkParam({\n        supply: poolInfo.supply,\n        totalFundRaising: poolInfo.totalFundRaisingB,\n        totalSell: c,\n        totalLockedAmount,\n        decimals: poolInfo.mintDecimalsA,\n        config: configInfo!,\n        migrateType,\n      });\n      console.log(\"check init params success\");\n    } catch (e: any) {\n      this.logAndCreateError(`check create mint params failed, ${e.message}`);\n    }\n\n    txBuilder.addInstruction({\n      instructions: [\n        initialize(\n          programId,\n          feePayer ?? this.scope.ownerPubKey,\n          this.scope.ownerPubKey,\n          configId,\n          platformId,\n          authProgramId,\n          poolId,\n          mintA,\n          mintB,\n          vaultA,\n          vaultB,\n          metaId,\n          TOKEN_PROGRAM_ID,\n          TOKEN_PROGRAM_ID,\n\n          decimals,\n          name,\n          symbol,\n          uri || \"https://\",\n\n          {\n            type:\n              curType === 0\n                ? \"ConstantCurve\"\n                : curType === 1\n                ? \"FixedCurve\"\n                : curType === 2\n                ? \"LinearCurve\"\n                : \"ConstantCurve\",\n            totalSellA,\n            migrateType,\n            supply,\n            totalFundRaisingB,\n          },\n          totalLockedAmount,\n          extraConfigs?.cliffPeriod ?? new BN(0),\n          extraConfigs?.unlockPeriod ?? new BN(0),\n        ),\n      ],\n    });\n\n    let outAmount = new BN(0);\n    let splitIns;\n    if (extraSigners?.length) txBuilder.addInstruction({ signers: extraSigners });\n    if (!extraConfigs.createOnly) {\n      const { builder, extInfo } = await this.buyToken({\n        programId,\n        authProgramId,\n        mintA,\n        mintB,\n        poolInfo,\n        buyAmount,\n        minMintAAmount,\n        shareFeeRate: extraConfigs.shareFeeRate,\n        shareFeeReceiver: extraConfigs.shareFeeReceiver,\n        configInfo,\n        platformFeeRate: defaultPlatformFeeRate,\n        slippage,\n        associatedOnly,\n        checkCreateATAOwner,\n      });\n      txBuilder.addInstruction({ ...builder.AllTxData });\n      outAmount = extInfo.outAmount;\n      splitIns =\n        (this.scope.cluster === \"devnet\" || txVersion === TxVersion.LEGACY) && extraConfigs.shareFeeReceiver\n          ? [builder.allInstructions[0]]\n          : undefined;\n    }\n\n    txBuilder.addTipInstruction(txTipConfig);\n\n    if (txVersion === TxVersion.V0)\n      return txBuilder.sizeCheckBuildV0({\n        computeBudgetConfig,\n        outAmount,\n        splitIns,\n        address: {\n          ...poolInfo,\n          poolId,\n        },\n      }) as Promise<MakeMultiTxData<T, { address: LaunchpadPoolInfo & { poolId: PublicKey }; outAmount: BN }>>;\n    return txBuilder.sizeCheckBuild({\n      computeBudgetConfig,\n      outAmount,\n      splitIns,\n      address: {\n        ...poolInfo,\n        poolId,\n      },\n    }) as Promise<MakeMultiTxData<T, { address: LaunchpadPoolInfo & { poolId: PublicKey }; outAmount: BN }>>;\n  }\n\n  public async buyToken<T extends TxVersion>({\n    programId = LAUNCHPAD_PROGRAM,\n    authProgramId,\n    mintA,\n    mintB = NATIVE_MINT,\n    poolInfo: propPoolInfo,\n\n    configInfo: propConfigInfo,\n    platformFeeRate,\n\n    txVersion,\n    computeBudgetConfig,\n    txTipConfig,\n    feePayer,\n    buyAmount,\n    minMintAAmount: propMinMintAAmount,\n    slippage,\n\n    shareFeeRate = new BN(0),\n    shareFeeReceiver,\n\n    associatedOnly = true,\n    checkCreateATAOwner = false,\n  }: BuyToken<T>): Promise<MakeTxData<T, { outAmount: BN }>> {\n    if (buyAmount.lte(new BN(0))) this.logAndCreateError(\"buy amount should gt 0:\", buyAmount.toString());\n    const txBuilder = this.createTxBuilder(feePayer);\n    const { publicKey: poolId } = getPdaLaunchpadPoolId(programId, mintA, mintB);\n    authProgramId = authProgramId ?? getPdaLaunchpadAuth(programId).publicKey;\n\n    let userTokenAccountA: PublicKey | null = null;\n    let userTokenAccountB: PublicKey | null = null;\n\n    const mintBUseSOLBalance = mintB.equals(NATIVE_MINT);\n\n    const { account: _ownerTokenAccountA, instructionParams: _tokenAccountAInstruction } =\n      await this.scope.account.getOrCreateTokenAccount({\n        mint: mintA,\n        owner: this.scope.ownerPubKey,\n\n        createInfo: {\n          payer: this.scope.ownerPubKey,\n          amount: 0,\n        },\n        skipCloseAccount: true,\n        notUseTokenAccount: false,\n        associatedOnly,\n        checkCreateATAOwner,\n      });\n    if (_ownerTokenAccountA) userTokenAccountA = _ownerTokenAccountA;\n    txBuilder.addInstruction(_tokenAccountAInstruction || {});\n\n    if (userTokenAccountA === undefined)\n      this.logAndCreateError(\n        `cannot found mintA(${mintA.toBase58()}) token accounts`,\n        \"tokenAccounts\",\n        this.scope.account.tokenAccounts,\n      );\n\n    const { account: _ownerTokenAccountB, instructionParams: _tokenAccountBInstruction } =\n      await this.scope.account.getOrCreateTokenAccount({\n        mint: mintB,\n        owner: this.scope.ownerPubKey,\n        createInfo: mintBUseSOLBalance\n          ? {\n              payer: this.scope.ownerPubKey!,\n              amount: buyAmount,\n            }\n          : undefined,\n        skipCloseAccount: !mintBUseSOLBalance,\n        notUseTokenAccount: mintBUseSOLBalance,\n        associatedOnly: mintBUseSOLBalance ? false : associatedOnly,\n        checkCreateATAOwner,\n      });\n    if (_ownerTokenAccountB) userTokenAccountB = _ownerTokenAccountB;\n    txBuilder.addInstruction(_tokenAccountBInstruction || {});\n    if (userTokenAccountB === undefined)\n      this.logAndCreateError(\n        `cannot found mintB(${mintB.toBase58()}) token accounts`,\n        \"tokenAccounts\",\n        this.scope.account.tokenAccounts,\n      );\n\n    let poolInfo = propPoolInfo;\n    if (!poolInfo) {\n      const poolData = await this.scope.connection.getAccountInfo(poolId, { commitment: \"processed\" });\n      if (!poolData) this.logAndCreateError(\"cannot found pool:\", poolId.toBase58());\n      poolInfo = LaunchpadPool.decode(poolData!.data);\n    }\n\n    let configInfo = propConfigInfo;\n    const allData = await getMultipleAccountsInfoWithCustomFlags(\n      this.scope.connection,\n      [configInfo ? undefined : poolInfo.configId, platformFeeRate ? undefined : poolInfo.platformId]\n        .filter(Boolean)\n        .map((key) => ({ pubkey: key! })),\n    );\n    if (!configInfo) {\n      const data = allData.find((d) => d.pubkey.equals(poolInfo!.configId));\n      if (!data || !data.accountInfo) this.logAndCreateError(\"config not found: \", poolInfo.configId.toBase58());\n      configInfo = LaunchpadConfig.decode(data!.accountInfo!.data);\n    }\n    if (!platformFeeRate) {\n      const data = allData.find((d) => d.pubkey.equals(poolInfo!.platformId));\n      if (!data || !data.accountInfo) this.logAndCreateError(\"platform info not found: \", poolInfo.configId.toBase58());\n      platformFeeRate = PlatformConfig.decode(data!.accountInfo!.data).feeRate;\n    }\n\n    const calculatedAmount = Curve.buyExactIn({\n      poolInfo,\n      amountB: buyAmount,\n      protocolFeeRate: configInfo.tradeFeeRate,\n      platformFeeRate,\n      curveType: configInfo.curveType,\n      shareFeeRate,\n    });\n\n    const decimalAmountA = new Decimal(calculatedAmount.amountA.toString());\n    const multiplier = slippage\n      ? new Decimal(SLIPPAGE_UNIT.sub(slippage).toNumber() / SLIPPAGE_UNIT.toNumber()).clampedTo(0, 1)\n      : new Decimal(1);\n\n    const minMintAAmount =\n      propMinMintAAmount ?? (slippage ? new BN(decimalAmountA.mul(multiplier).toFixed(0)) : calculatedAmount.amountA);\n\n    if (calculatedAmount.amountB.lt(buyAmount)) {\n      console.log(\n        `maximum ${mintA.toBase58()} amount can buy is ${calculatedAmount.amountA.toString()}, input ${mintB.toBase58()} amount: ${calculatedAmount.amountB.toString()}`,\n      );\n    }\n\n    // let shareATA: PublicKey | undefined;\n    // if (shareFeeReceiver) {\n    // if (mintB.equals(NATIVE_MINT)) {\n    //   const { addresses, ...txInstruction } = await createWSolAccountInstructions({\n    //     connection: this.scope.connection,\n    //     owner: shareFeeReceiver,\n    //     payer: this.scope.ownerPubKey,\n    //     amount: 0,\n    //     skipCloseAccount: true,\n    //   });\n    //   txBuilder.addInstruction(txInstruction);\n    //   shareATA = addresses.newAccount;\n    // } else {\n    //   shareATA = getATAAddress(shareFeeReceiver, mintB, TOKEN_PROGRAM_ID).publicKey;\n    //   txBuilder.addInstruction({\n    //     instructions: [\n    //       createAssociatedTokenAccountIdempotentInstruction(this.scope.ownerPubKey, shareATA, shareFeeReceiver!, mintB),\n    //     ],\n    //   });\n    //   // }\n    // }\n    const shareATA = shareFeeReceiver ? getATAAddress(shareFeeReceiver, mintB, TOKEN_PROGRAM_ID).publicKey : undefined;\n    if (shareATA) {\n      txBuilder.addInstruction({\n        instructions: [\n          createAssociatedTokenAccountIdempotentInstruction(this.scope.ownerPubKey, shareATA, shareFeeReceiver!, mintB),\n        ],\n      });\n    }\n\n    txBuilder.addInstruction({\n      instructions: [\n        buyExactInInstruction(\n          programId,\n          this.scope.ownerPubKey,\n          authProgramId,\n          poolInfo.configId,\n          poolInfo.platformId,\n          poolId,\n          userTokenAccountA!,\n          userTokenAccountB!,\n          poolInfo.vaultA,\n          poolInfo.vaultB,\n          mintA,\n          mintB,\n          TOKEN_PROGRAM_ID,\n          TOKEN_PROGRAM_ID,\n          calculatedAmount.amountB.lt(buyAmount) ? calculatedAmount.amountB : buyAmount,\n          minMintAAmount,\n          shareFeeRate,\n          shareATA,\n        ),\n      ],\n    });\n\n    txBuilder.addCustomComputeBudget(computeBudgetConfig);\n    txBuilder.addTipInstruction(txTipConfig);\n\n    return txBuilder.versionBuild<{ outAmount: BN }>({\n      txVersion,\n      extInfo: {\n        outAmount: minMintAAmount,\n      },\n    }) as Promise<MakeTxData<T, { outAmount: BN }>>;\n  }\n\n  public async sellToken<T extends TxVersion>({\n    programId = LAUNCHPAD_PROGRAM,\n    authProgramId,\n    mintA,\n    mintB = NATIVE_MINT,\n    poolInfo: propPoolInfo,\n    configInfo: propConfigInfo,\n    platformFeeRate,\n    txVersion,\n    computeBudgetConfig,\n    txTipConfig,\n    feePayer,\n    sellAmount,\n    minAmountB: propMinAmountB,\n    slippage,\n\n    shareFeeRate = new BN(0),\n    shareFeeReceiver,\n\n    associatedOnly = true,\n    checkCreateATAOwner = false,\n  }: SellToken<T>): Promise<MakeTxData<T, { outAmount: BN }>> {\n    authProgramId = authProgramId ?? getPdaLaunchpadAuth(programId).publicKey;\n    const txBuilder = this.createTxBuilder(feePayer);\n\n    if (sellAmount.lte(new BN(0))) this.logAndCreateError(\"sell amount should be gt 0\");\n\n    const { publicKey: poolId } = getPdaLaunchpadPoolId(programId, mintA, mintB);\n\n    let userTokenAccountA: PublicKey | null = null;\n    let userTokenAccountB: PublicKey | null = null;\n\n    const mintBUseSOLBalance = mintB.equals(NATIVE_MINT);\n\n    const { account: _ownerTokenAccountA, instructionParams: _tokenAccountAInstruction } =\n      await this.scope.account.getOrCreateTokenAccount({\n        mint: mintA,\n        owner: this.scope.ownerPubKey,\n\n        createInfo: undefined,\n        skipCloseAccount: true,\n        notUseTokenAccount: false,\n        associatedOnly,\n        checkCreateATAOwner,\n      });\n    if (_ownerTokenAccountA) userTokenAccountA = _ownerTokenAccountA;\n    txBuilder.addInstruction(_tokenAccountAInstruction || {});\n\n    if (userTokenAccountA === undefined)\n      this.logAndCreateError(\"cannot found mintA token accounts\", \"tokenAccounts\", this.scope.account.tokenAccounts);\n\n    const { account: _ownerTokenAccountB, instructionParams: _tokenAccountBInstruction } =\n      await this.scope.account.getOrCreateTokenAccount({\n        mint: mintB,\n        owner: this.scope.ownerPubKey,\n\n        createInfo: mintBUseSOLBalance\n          ? {\n              payer: this.scope.ownerPubKey!,\n              amount: 0,\n            }\n          : undefined,\n        skipCloseAccount: !mintBUseSOLBalance,\n        notUseTokenAccount: mintBUseSOLBalance,\n        associatedOnly: mintBUseSOLBalance ? false : associatedOnly,\n        checkCreateATAOwner,\n      });\n    if (_ownerTokenAccountB) userTokenAccountB = _ownerTokenAccountB;\n    txBuilder.addInstruction(_tokenAccountBInstruction || {});\n\n    if (userTokenAccountB === undefined)\n      this.logAndCreateError(\"cannot found mintB token accounts\", \"tokenAccounts\", this.scope.account.tokenAccounts);\n\n    let poolInfo = propPoolInfo;\n    if (!poolInfo) {\n      const poolData = await this.scope.connection.getAccountInfo(poolId, { commitment: \"processed\" });\n      if (!poolData) this.logAndCreateError(\"cannot found pool\", poolId.toBase58());\n      poolInfo = LaunchpadPool.decode(poolData!.data);\n    }\n\n    let configInfo = propConfigInfo;\n    const allData = await getMultipleAccountsInfoWithCustomFlags(\n      this.scope.connection,\n      [configInfo ? undefined : poolInfo.configId, platformFeeRate ? undefined : poolInfo.platformId]\n        .filter(Boolean)\n        .map((key) => ({ pubkey: key! })),\n    );\n    if (!configInfo) {\n      const data = allData.find((d) => d.pubkey.equals(poolInfo!.configId));\n      if (!data || !data.accountInfo) this.logAndCreateError(\"config not found: \", poolInfo.configId.toBase58());\n      configInfo = LaunchpadConfig.decode(data!.accountInfo!.data);\n    }\n    if (!platformFeeRate) {\n      const data = allData.find((d) => d.pubkey.equals(poolInfo!.platformId));\n      if (!data || !data.accountInfo) this.logAndCreateError(\"platform info not found: \", poolInfo.configId.toBase58());\n      platformFeeRate = PlatformConfig.decode(data!.accountInfo!.data).feeRate;\n    }\n\n    const calculatedAmount = Curve.sellExactIn({\n      poolInfo,\n      amountA: sellAmount,\n      protocolFeeRate: configInfo.tradeFeeRate,\n      platformFeeRate,\n      curveType: configInfo.curveType,\n      shareFeeRate,\n    });\n\n    const decimalAmountB = new Decimal(calculatedAmount.amountB.toString());\n    const multiplier = slippage\n      ? new Decimal(SLIPPAGE_UNIT.sub(slippage).toNumber() / SLIPPAGE_UNIT.toNumber()).clampedTo(0, 1)\n      : new Decimal(1);\n\n    const minAmountB =\n      propMinAmountB ?? (slippage ? new BN(decimalAmountB.mul(multiplier).toFixed(0)) : calculatedAmount.amountB);\n\n    if (minAmountB.lte(new BN(0))) this.logAndCreateError(`out ${mintB.toBase58()} amount should be gt 0`);\n\n    const shareATA = shareFeeReceiver ? getATAAddress(shareFeeReceiver, mintB, TOKEN_PROGRAM_ID).publicKey : undefined;\n    if (shareATA) {\n      txBuilder.addInstruction({\n        instructions: [\n          createAssociatedTokenAccountIdempotentInstruction(this.scope.ownerPubKey, shareATA, shareFeeReceiver!, mintB),\n        ],\n      });\n    }\n\n    txBuilder.addInstruction({\n      instructions: [\n        sellExactInInstruction(\n          programId,\n          this.scope.ownerPubKey,\n          authProgramId,\n          poolInfo.configId,\n          poolInfo.platformId,\n          poolId,\n          userTokenAccountA!,\n          userTokenAccountB!,\n          poolInfo.vaultA,\n          poolInfo.vaultB,\n          mintA,\n          mintB,\n          TOKEN_PROGRAM_ID,\n          TOKEN_PROGRAM_ID,\n          calculatedAmount.amountA.lt(sellAmount) ? calculatedAmount.amountA : sellAmount,\n          minAmountB,\n          shareFeeRate,\n          shareATA,\n        ),\n      ],\n    });\n\n    txBuilder.addCustomComputeBudget(computeBudgetConfig);\n    txBuilder.addTipInstruction(txTipConfig);\n\n    return txBuilder.versionBuild<{ outAmount: BN }>({\n      txVersion,\n      extInfo: {\n        outAmount: minAmountB,\n      },\n    }) as Promise<MakeTxData<T, { outAmount: BN }>>;\n  }\n\n  public async createPlatformConfig<T extends TxVersion>({\n    programId = LAUNCHPAD_PROGRAM,\n    platformAdmin,\n    platformClaimFeeWallet,\n    platformLockNftWallet,\n    cpConfigId,\n    migrateCpLockNftScale,\n    feeRate,\n    name,\n    web,\n    img,\n    txVersion,\n    computeBudgetConfig,\n    txTipConfig,\n    feePayer,\n  }: CreatePlatform<T>): Promise<MakeTxData<T, { platformId: PublicKey }>> {\n    const txBuilder = this.createTxBuilder(feePayer);\n\n    const { publicKey: platformId } = getPdaPlatformId(programId, platformAdmin);\n\n    txBuilder.addInstruction({\n      instructions: [\n        createPlatformConfig(\n          programId,\n          platformAdmin,\n          platformClaimFeeWallet,\n          platformLockNftWallet,\n          platformId,\n          cpConfigId,\n          migrateCpLockNftScale,\n          feeRate,\n          name,\n          web,\n          img,\n        ),\n      ],\n    });\n\n    txBuilder.addCustomComputeBudget(computeBudgetConfig);\n    txBuilder.addTipInstruction(txTipConfig);\n\n    return txBuilder.versionBuild({\n      txVersion,\n      extInfo: {\n        platformId,\n      },\n    }) as Promise<MakeTxData<T, { platformId: PublicKey }>>;\n  }\n\n  public async updatePlatformConfig<T extends TxVersion>({\n    programId = LAUNCHPAD_PROGRAM,\n    platformAdmin,\n    platformId: propsPlatformId,\n    updateInfo,\n    txVersion,\n    computeBudgetConfig,\n    txTipConfig,\n    feePayer,\n  }: UpdatePlatform<T>): Promise<MakeTxData> {\n    const txBuilder = this.createTxBuilder(feePayer);\n\n    const platformId = propsPlatformId ?? getPdaPlatformId(programId, platformAdmin).publicKey;\n\n    txBuilder.addInstruction({\n      instructions: [updatePlatformConfig(programId, platformAdmin, platformId, updateInfo)],\n    });\n\n    txBuilder.addCustomComputeBudget(computeBudgetConfig);\n    txBuilder.addTipInstruction(txTipConfig);\n\n    return txBuilder.versionBuild({\n      txVersion,\n    }) as Promise<MakeTxData>;\n  }\n\n  public async claimPlatformFee<T extends TxVersion>({\n    programId = LAUNCHPAD_PROGRAM,\n    authProgramId,\n    platformId,\n    poolId,\n    platformClaimFeeWallet,\n\n    mintB: propsMintB,\n    vaultB: propsVaultB,\n    mintBProgram = TOKEN_PROGRAM_ID,\n\n    txVersion,\n    computeBudgetConfig,\n    txTipConfig,\n    feePayer,\n\n    associatedOnly = true,\n    checkCreateATAOwner = false,\n  }: ClaimPlatformFee<T>): Promise<MakeTxData> {\n    const txBuilder = this.createTxBuilder(feePayer);\n    authProgramId = authProgramId ?? getPdaLaunchpadAuth(programId).publicKey;\n\n    let mintB = propsMintB;\n    let vaultB = propsVaultB;\n\n    if (!mintB) {\n      const poolData = await this.scope.connection.getAccountInfo(poolId, { commitment: \"processed\" });\n      if (!poolData) this.logAndCreateError(\"cannot found pool:\", poolId.toBase58());\n      const poolInfo = LaunchpadPool.decode(poolData!.data);\n\n      const configData = await this.scope.connection.getAccountInfo(poolInfo.configId, { commitment: \"processed\" });\n      if (!configData) this.logAndCreateError(\"cannot found config:\", poolInfo.configId.toBase58());\n      const configInfo = LaunchpadConfig.decode(configData!.data);\n\n      mintB = configInfo.mintB;\n      vaultB = vaultB ?? poolInfo.vaultB;\n    }\n\n    if (!mintB || !vaultB) {\n      this.logAndCreateError(\n        \"cannot found mint info, mintB: \",\n        mintB.toBase58(),\n        \", vaultB: \",\n        vaultB?.toBase58() ?? \"\",\n      );\n    }\n\n    let userTokenAccountB: PublicKey | null = null;\n    const { account: _ownerTokenAccountB, instructionParams: _tokenAccountAInstruction } =\n      await this.scope.account.getOrCreateTokenAccount({\n        mint: mintB,\n        owner: this.scope.ownerPubKey,\n\n        createInfo: {\n          payer: this.scope.ownerPubKey,\n          amount: 0,\n        },\n        skipCloseAccount: true,\n        notUseTokenAccount: false,\n        associatedOnly,\n        checkCreateATAOwner,\n      });\n    if (_ownerTokenAccountB) userTokenAccountB = _ownerTokenAccountB;\n    txBuilder.addInstruction(_tokenAccountAInstruction || {});\n\n    txBuilder.addInstruction({\n      instructions: [\n        claimPlatformFee(\n          programId,\n          platformClaimFeeWallet,\n          authProgramId,\n          poolId,\n          platformId,\n          vaultB!,\n          userTokenAccountB!,\n          mintB,\n          mintBProgram,\n        ),\n      ],\n    });\n\n    txBuilder.addCustomComputeBudget(computeBudgetConfig);\n    txBuilder.addTipInstruction(txTipConfig);\n\n    return txBuilder.versionBuild({\n      txVersion,\n    }) as Promise<MakeTxData>;\n  }\n\n  public async createVesting<T extends TxVersion>({\n    programId = LAUNCHPAD_PROGRAM,\n    poolId,\n    beneficiary,\n    shareAmount,\n    txVersion,\n    computeBudgetConfig,\n    txTipConfig,\n    feePayer,\n  }: CreateVesting<T>): Promise<MakeTxData> {\n    const txBuilder = this.createTxBuilder(feePayer);\n\n    const vestingRecord = getPdaVestId(programId, poolId, beneficiary).publicKey;\n\n    txBuilder.addInstruction({\n      instructions: [\n        createVestingAccount(programId, this.scope.ownerPubKey, beneficiary, poolId, vestingRecord, shareAmount),\n      ],\n    });\n\n    txBuilder.addCustomComputeBudget(computeBudgetConfig);\n    txBuilder.addTipInstruction(txTipConfig);\n\n    return txBuilder.versionBuild({\n      txVersion,\n    }) as Promise<MakeTxData>;\n  }\n\n  // public async claimVesting<T extends TxVersion>({\n  //   programId = LAUNCHPAD_PROGRAM,\n  //   poolId,\n  //   poolInfo: propsPoolInfo,\n  //   txVersion,\n  //   computeBudgetConfig,\n  //   txTipConfig,\n  //   feePayer,\n  //   associatedOnly = true,\n  //   checkCreateATAOwner = false,\n  // }: ClaimVesting<T>): Promise<MakeTxData> {\n  //   const txBuilder = this.createTxBuilder(feePayer);\n\n  //   const authProgramId = getPdaLaunchpadAuth(programId).publicKey;\n  //   const vestingRecord = getPdaVestId(programId, poolId, this.scope.ownerPubKey).publicKey;\n\n  //   let poolInfo = propsPoolInfo;\n  //   if (!poolInfo) {\n  //     const r = await this.scope.connection.getAccountInfo(poolId);\n  //     if (!r) this.logAndCreateError(\"pool not found\");\n  //     poolInfo = LaunchpadPool.decode(r!.data);\n  //   }\n\n  //   let userTokenAccountA: PublicKey | null = null;\n\n  //   const { account: _ownerTokenAccountA, instructionParams: _tokenAccountAInstruction } =\n  //     await this.scope.account.getOrCreateTokenAccount({\n  //       mint: poolInfo.mintA,\n  //       owner: this.scope.ownerPubKey,\n\n  //       createInfo: {\n  //         payer: this.scope.ownerPubKey,\n  //         amount: 0,\n  //       },\n  //       skipCloseAccount: true,\n  //       notUseTokenAccount: false,\n  //       associatedOnly,\n  //       checkCreateATAOwner,\n  //     });\n  //   if (_ownerTokenAccountA) userTokenAccountA = _ownerTokenAccountA;\n  //   txBuilder.addInstruction(_tokenAccountAInstruction || {});\n\n  //   // const userTokenAccountA = getATAAddress(this.scope.ownerPubKey, poolInfo.mintA).publicKey;\n\n  //   txBuilder.addInstruction({\n  //     instructions: [\n  //       claimVestedToken(\n  //         programId,\n  //         this.scope.ownerPubKey,\n  //         authProgramId,\n  //         poolId,\n  //         vestingRecord,\n  //         userTokenAccountA!,\n  //         poolInfo.vaultA,\n  //         poolInfo.mintA,\n  //         TOKEN_PROGRAM_ID,\n  //       ),\n  //     ],\n  //   });\n\n  //   txBuilder.addCustomComputeBudget(computeBudgetConfig);\n  //   txBuilder.addTipInstruction(txTipConfig);\n\n  //   return txBuilder.versionBuild({\n  //     txVersion,\n  //   }) as Promise<MakeTxData>;\n  // }\n\n  public async getRpcPoolInfo({\n    poolId,\n  }: {\n    poolId: PublicKey;\n  }): Promise<LaunchpadPoolInfo & { configInfo: LaunchpadConfigInfo }> {\n    const data = await this.getRpcPoolsInfo({ poolIdList: [poolId] });\n\n    return data.poolInfoMap[poolId.toBase58()];\n  }\n\n  public async getRpcPoolsInfo({\n    poolIdList,\n    config,\n  }: {\n    poolIdList: PublicKey[];\n    config?: { batchRequest?: boolean; chunkCount?: number };\n  }): Promise<{\n    poolInfoMap: Record<\n      string,\n      LaunchpadPoolInfo & {\n        poolId: PublicKey;\n        configInfo: LaunchpadConfigInfo;\n      }\n    >;\n  }> {\n    const accounts = await getMultipleAccountsInfoWithCustomFlags(\n      this.scope.connection,\n      poolIdList.map((i) => ({ pubkey: i })),\n      config,\n    );\n\n    const poolInfoMap: { [poolId: string]: LaunchpadPoolInfo & { poolId: PublicKey } } = {};\n    const configKeys: PublicKey[] = [];\n\n    for (let i = 0; i < poolIdList.length; i++) {\n      const item = accounts[i];\n      if (item === null || !item.accountInfo) throw Error(\"fetch pool info error: \" + poolIdList[i].toBase58());\n      const poolInfo = LaunchpadPool.decode(item.accountInfo.data);\n      poolInfoMap[poolIdList[i].toBase58()] = {\n        ...poolInfo,\n        poolId: item.accountInfo.owner,\n      };\n      configKeys.push(poolInfo.configId);\n    }\n\n    const configAccounts = await getMultipleAccountsInfoWithCustomFlags(\n      this.scope.connection,\n      configKeys.map((i) => ({ pubkey: i })),\n      config,\n    );\n\n    const configInfoMap: { [poolId: string]: LaunchpadConfigInfo & { configId: PublicKey } } = {};\n\n    for (let i = 0; i < configKeys.length; i++) {\n      const item = configAccounts[i];\n      if (item === null || !item.accountInfo) throw Error(\"fetch config info error: \" + configKeys[i].toBase58());\n      const configInfo = LaunchpadConfig.decode(item.accountInfo.data);\n      configInfoMap[configKeys[i].toBase58()] = {\n        ...configInfo,\n        configId: item.accountInfo.owner,\n      };\n    }\n\n    return {\n      poolInfoMap: Object.keys(poolInfoMap).reduce(\n        (acc, cur) => ({\n          ...acc,\n          [cur]: {\n            ...poolInfoMap[cur],\n            configInfo: configInfoMap[poolInfoMap[cur].configId.toBase58()],\n          },\n        }),\n        {},\n      ),\n    };\n  }\n}\n","import { publicKey, seq, struct, u16, u64, u8 } from \"../../marshmallow\";\n\nexport const LaunchpadConfig = struct([\n  u64(),\n  u64(\"epoch\"),\n  u8(\"curveType\"),\n  u16(\"index\"),\n  u64(\"migrateFee\"),\n  u64(\"tradeFeeRate\"),\n  u64(\"maxShareFeeRate\"),\n  u64(\"minSupplyA\"),\n  u64(\"maxLockRate\"),\n  u64(\"minSellRateA\"),\n  u64(\"minMigrateRateA\"),\n  u64(\"minFundRaisingB\"),\n  publicKey(\"mintB\"),\n  publicKey(\"protocolFeeOwner\"),\n  publicKey(\"migrateFeeOwner\"),\n  publicKey(\"migrateToAmmWallet\"),\n  publicKey(\"migrateToCpmmWallet\"),\n  seq(u64(), 16),\n]);\n\nexport const LaunchpadVestingSchedule = struct([\n  u64(\"totalLockedAmount\"),\n  u64(\"cliffPeriod\"),\n  u64(\"unlockPeriod\"),\n  u64(\"startTime\"),\n  u64(\"totalAllocatedShare\"),\n]);\n\nexport const LaunchpadPool = struct([\n  u64(),\n  u64(\"epoch\"),\n  u8(\"bump\"),\n  u8(\"status\"),\n  u8(\"mintDecimalsA\"),\n  u8(\"mintDecimalsB\"),\n  u8(\"migrateType\"),\n\n  u64(\"supply\"),\n  u64(\"totalSellA\"),\n  u64(\"virtualA\"),\n  u64(\"virtualB\"),\n  u64(\"realA\"),\n  u64(\"realB\"),\n\n  u64(\"totalFundRaisingB\"),\n  u64(\"protocolFee\"),\n  u64(\"platformFee\"),\n  u64(\"migrateFee\"),\n\n  LaunchpadVestingSchedule.replicate(\"vestingSchedule\"),\n\n  publicKey(\"configId\"),\n  publicKey(\"platformId\"),\n  publicKey(\"mintA\"),\n  publicKey(\"mintB\"),\n  publicKey(\"vaultA\"),\n  publicKey(\"vaultB\"),\n\n  publicKey(\"creator\"),\n\n  seq(u64(), 8),\n]);\n\nexport const LaunchpadVesting = struct([\n  u64(),\n  u64(\"epoch\"),\n  publicKey(\"poolId\"),\n  publicKey(\"beneficiary\"),\n  u64(\"claimedAmount\"),\n  u64(\"tokenShareAmount\"),\n  seq(u64(), 8),\n]);\n\nexport const PlatformConfig = struct([\n  u64(),\n  u64(\"epoch\"),\n  publicKey(\"platformClaimFeeWallet\"),\n  publicKey(\"platformLockNftWallet\"),\n  u64(\"platformScale\"),\n  u64(\"creatorScale\"),\n  u64(\"burnScale\"),\n  u64(\"feeRate\"),\n  seq(u8(), 64, \"name\"),\n  seq(u8(), 256, \"web\"),\n  seq(u8(), 256, \"img\"),\n  publicKey('cpConfigId'),\n  seq(u8(), 224),\n]);\n","import BN from \"bn.js\";\nimport { LaunchPadConstantProductCurve } from \"./constantProductCurve\";\nimport { FixedPriceCurve } from \"./fixedPriceCurve\";\nimport { CurveBase, PoolBaseAmount } from \"./curveBase\";\nimport { LaunchpadConfigInfo, LaunchpadPoolInfo } from \"../type\";\nimport { FEE_RATE_DENOMINATOR_VALUE } from \"@/common/fee\";\nimport { LinearPriceCurve } from \"./linearPriceCurve\";\nimport { ceilDiv } from \"@/common/bignumber\";\nimport Decimal from \"decimal.js\";\n\nexport class Curve {\n  static getPoolCurvePointByPoolInfo({\n    curveType,\n    pointCount,\n    poolInfo,\n  }: {\n    curveType: number;\n    poolInfo: LaunchpadPoolInfo;\n    pointCount: number;\n  }): {\n    price: Decimal;\n    totalSellSupply: number;\n  }[] {\n    return this.getPoolCurvePointByInit({\n      curveType,\n      pointCount,\n      supply: poolInfo.supply,\n      totalFundRaising: poolInfo.totalFundRaisingB,\n      totalSell: poolInfo.totalSellA,\n      totalLockedAmount: poolInfo.vestingSchedule.totalLockedAmount,\n      migrateFee: poolInfo.migrateFee,\n      decimalA: poolInfo.mintDecimalsA,\n      decimalB: poolInfo.mintDecimalsB,\n    });\n  }\n\n  static getPoolCurvePointByInit({\n    curveType,\n    pointCount,\n    supply,\n    totalFundRaising,\n    totalSell,\n    totalLockedAmount,\n    migrateFee,\n    decimalA,\n    decimalB,\n  }: {\n    curveType: number;\n    supply: BN;\n    totalSell: BN;\n    totalLockedAmount: BN;\n    totalFundRaising: BN;\n    migrateFee: BN;\n    decimalA: number;\n    decimalB: number;\n    pointCount: number;\n  }): {\n    price: Decimal;\n    totalSellSupply: number;\n  }[] {\n    if (pointCount < 3) throw Error(\"point count < 3\");\n\n    const curve = this.getCurve(curveType);\n    const initParam = curve.getInitParam({ supply, totalFundRaising, totalSell, totalLockedAmount, migrateFee });\n    const initPrice = curve.getPoolInitPriceByInit({ ...initParam, decimalA, decimalB });\n\n    const itemStepBuy = totalFundRaising.div(new BN(pointCount - 1));\n\n    const zero = new BN(0);\n\n    const returnPoints: { price: Decimal; totalSellSupply: number }[] = [{ price: initPrice, totalSellSupply: 0 }];\n    const { a, b } = initParam;\n    let realA = zero;\n    let realB = zero;\n    for (let i = 1; i < pointCount; i++) {\n      const amountB = i !== pointCount - 1 ? itemStepBuy : totalFundRaising.sub(realB);\n      const itemBuy = this.buyExactIn({\n        poolInfo: {\n          virtualA: a,\n          virtualB: b,\n          realA,\n          realB,\n          totalFundRaisingB: totalFundRaising,\n          totalSellA: totalSell,\n        },\n        amountB,\n        protocolFeeRate: zero,\n        platformFeeRate: zero,\n        curveType,\n        shareFeeRate: zero,\n      });\n      realA = realA.add(itemBuy.amountA);\n      realB = realB.add(itemBuy.amountB);\n\n      const nowPoolPrice = this.getPrice({\n        poolInfo: { virtualA: a, virtualB: b, realA, realB },\n        decimalA,\n        decimalB,\n        curveType,\n      });\n      returnPoints.push({\n        price: nowPoolPrice,\n        totalSellSupply: new Decimal(realA.toString()).div(10 ** decimalA).toNumber(),\n      });\n    }\n\n    return returnPoints;\n  }\n\n  static getPoolInitPriceByPool({\n    poolInfo,\n    decimalA,\n    decimalB,\n    curveType,\n  }: {\n    poolInfo: LaunchpadPoolInfo | PoolBaseAmount;\n    decimalA: number;\n    decimalB: number;\n    curveType: number;\n  }): Decimal {\n    const curve = this.getCurve(curveType);\n    return curve.getPoolInitPriceByPool({ poolInfo, decimalA, decimalB });\n  }\n  static getPoolInitPriceByInit({\n    a,\n    b,\n    decimalA,\n    decimalB,\n    curveType,\n  }: {\n    a: BN;\n    b: BN;\n    decimalA: number;\n    decimalB: number;\n    curveType: number;\n  }): Decimal {\n    const curve = this.getCurve(curveType);\n    return curve.getPoolInitPriceByInit({ a, b, decimalA, decimalB });\n  }\n\n  static getPrice({\n    poolInfo,\n    curveType,\n    decimalA,\n    decimalB,\n  }: {\n    poolInfo: LaunchpadPoolInfo | PoolBaseAmount;\n    curveType: number;\n    decimalA: number;\n    decimalB: number;\n  }): Decimal {\n    const curve = this.getCurve(curveType);\n    return curve.getPoolPrice({ poolInfo, decimalA, decimalB });\n  }\n\n  static getEndPrice({\n    poolInfo,\n    curveType,\n    decimalA,\n    decimalB,\n  }: {\n    poolInfo: LaunchpadPoolInfo;\n    curveType: number;\n    decimalA: number;\n    decimalB: number;\n  }): Decimal {\n    const curve = this.getCurve(curveType);\n    return curve.getPoolPrice({ poolInfo, decimalA, decimalB });\n  }\n  static getPoolEndPriceReal({\n    poolInfo,\n    curveType,\n    decimalA,\n    decimalB,\n  }: {\n    poolInfo: LaunchpadPoolInfo;\n    curveType: number;\n    decimalA: number;\n    decimalB: number;\n  }): Decimal {\n    const curve = this.getCurve(curveType);\n    return curve.getPoolEndPriceReal({ poolInfo, decimalA, decimalB });\n  }\n\n  static checkParam({\n    supply,\n    totalFundRaising,\n    totalSell,\n    totalLockedAmount,\n    decimals,\n    config,\n    migrateType,\n  }: {\n    supply: BN;\n    totalSell: BN;\n    totalLockedAmount: BN;\n    totalFundRaising: BN;\n    decimals: number;\n    config: LaunchpadConfigInfo;\n    migrateType: \"amm\" | \"cpmm\";\n  }): void {\n    if (Number(decimals) !== 6) throw Error(\"decimals = 6\");\n    const maxLockedA = supply.mul(config.maxLockRate).div(FEE_RATE_DENOMINATOR_VALUE);\n    if (maxLockedA.lt(totalLockedAmount)) throw Error(\"total lock amount gte max lock amount\");\n\n    if (supply.lt(config.minSupplyA.mul(new BN(10 ** decimals)))) throw Error(\"supply lt min supply\");\n\n    const minSellA = supply.mul(config.minSellRateA).div(FEE_RATE_DENOMINATOR_VALUE);\n    if (totalSell.lt(minSellA)) throw Error(\"invalid input\");\n    if (totalFundRaising.lt(config.minFundRaisingB)) throw Error(\"total fund raising lt min fund raising\");\n\n    const amountMigrate = supply.sub(totalSell).sub(totalLockedAmount);\n    const minAmountMigrate = supply.mul(config.minMigrateRateA).div(FEE_RATE_DENOMINATOR_VALUE);\n\n    if (amountMigrate.lt(minAmountMigrate)) throw Error(\"migrate lt min migrate amount\");\n\n    const migrateAmountA = supply.sub(totalSell).sub(totalLockedAmount);\n    const liquidity = new BN(new Decimal(migrateAmountA.mul(totalFundRaising).toString()).sqrt().toFixed(0));\n\n    if (migrateType === \"amm\") {\n      const minLockLp = new BN(10).pow(new BN(decimals));\n      if (liquidity.lte(minLockLp)) throw Error(\"check migrate lp error\");\n    } else if (migrateType === \"cpmm\") {\n      const minLockLp = new BN(100);\n      if (liquidity.lte(minLockLp)) throw Error(\"check migrate lp error\");\n    } else {\n      throw Error(\"migrate type error\");\n    }\n  }\n\n  /**\n   * @returns Please note that amountA/B is subject to change\n   */\n  static buyExactIn({\n    poolInfo,\n    amountB,\n    protocolFeeRate,\n    platformFeeRate,\n    curveType,\n    shareFeeRate,\n  }: {\n    poolInfo: LaunchpadPoolInfo | (PoolBaseAmount & { totalSellA: BN; totalFundRaisingB: BN });\n    amountB: BN;\n    protocolFeeRate: BN;\n    platformFeeRate: BN;\n    curveType: number;\n    shareFeeRate: BN;\n  }): {\n    amountA: BN;\n    amountB: BN;\n    splitFee: { platformFee: BN; shareFee: BN; protocolFee: BN };\n  } {\n    const feeRate = protocolFeeRate.add(shareFeeRate).add(platformFeeRate);\n    const _totalFee = this.calculateFee({ amount: amountB, feeRate });\n\n    const amountLessFeeB = amountB.sub(_totalFee);\n\n    const curve = this.getCurve(curveType);\n\n    const _amountA = curve.buyExactIn({ poolInfo, amount: amountLessFeeB });\n\n    const remainingAmountA = poolInfo.totalSellA.sub(poolInfo.realA);\n\n    let amountA: BN;\n    let realAmountB: BN;\n    let totalFee: BN;\n    if (_amountA.gt(remainingAmountA)) {\n      amountA = remainingAmountA;\n      // const amountLessFeeB = poolInfo.totalFundRaisingB.sub(poolInfo.realB);\n      const amountLessFeeB = curve.buyExactOut({\n        poolInfo,\n        amount: amountA,\n      });\n\n      realAmountB = this.calculatePreFee({ postFeeAmount: amountLessFeeB, feeRate });\n      totalFee = realAmountB.sub(amountLessFeeB);\n    } else {\n      amountA = _amountA;\n      realAmountB = amountB;\n      totalFee = _totalFee;\n    }\n\n    const splitFee = this.splitFee({ totalFee, protocolFeeRate, platformFeeRate, shareFeeRate });\n\n    return { amountA, amountB: realAmountB, splitFee };\n  }\n\n  /**\n   * @returns Please note that amountA/B is subject to change\n   */\n  static buyExactOut({\n    poolInfo,\n    amountA,\n    protocolFeeRate,\n    platformFeeRate,\n    curveType,\n    shareFeeRate,\n  }: {\n    poolInfo: LaunchpadPoolInfo | (PoolBaseAmount & { totalSellA: BN; totalFundRaisingB: BN });\n    amountA: BN;\n    protocolFeeRate: BN;\n    platformFeeRate: BN;\n    curveType: number;\n    shareFeeRate: BN;\n  }): {\n    amountA: BN;\n    amountB: BN;\n    splitFee: { platformFee: BN; shareFee: BN; protocolFee: BN };\n  } {\n    const remainingAmountA = poolInfo.totalSellA.sub(poolInfo.realA);\n\n    let realAmountA = amountA;\n    // const amountInLessFeeB;\n    if (amountA.gt(remainingAmountA)) {\n      realAmountA = remainingAmountA;\n      // amountInLessFeeB = poolInfo.totalFundRaisingB.sub(poolInfo.realB);\n    } else {\n      // const curve = this.getCurve(curveType);\n      // amountInLessFeeB = curve.buyExactOut({ poolInfo, amount: amountA });\n    }\n\n    const curve = this.getCurve(curveType);\n    const amountInLessFeeB = curve.buyExactOut({ poolInfo, amount: amountA });\n    const totalFeeRate = protocolFeeRate.add(shareFeeRate).add(platformFeeRate);\n\n    const amountB = this.calculatePreFee({ postFeeAmount: amountInLessFeeB, feeRate: totalFeeRate });\n    const totalFee = amountB.sub(amountInLessFeeB);\n\n    const splitFee = this.splitFee({ totalFee, protocolFeeRate, platformFeeRate, shareFeeRate });\n\n    return { amountA: realAmountA, amountB, splitFee };\n  }\n\n  static sellExactIn({\n    poolInfo,\n    amountA,\n    protocolFeeRate,\n    platformFeeRate,\n    curveType,\n    shareFeeRate,\n  }: {\n    poolInfo: LaunchpadPoolInfo | PoolBaseAmount;\n    amountA: BN;\n    protocolFeeRate: BN;\n    platformFeeRate: BN;\n    curveType: number;\n    shareFeeRate: BN;\n  }): {\n    amountA: BN;\n    amountB: BN;\n    splitFee: { platformFee: BN; shareFee: BN; protocolFee: BN };\n  } {\n    const curve = this.getCurve(curveType);\n\n    const amountB = curve.sellExactIn({ poolInfo, amount: amountA });\n    const totalFee = this.calculateFee({\n      amount: amountB,\n      feeRate: protocolFeeRate.add(shareFeeRate).add(platformFeeRate),\n    });\n\n    const splitFee = this.splitFee({ totalFee, protocolFeeRate, platformFeeRate, shareFeeRate });\n\n    return { amountA, amountB: amountB.sub(totalFee), splitFee };\n  }\n\n  static sellExactOut({\n    poolInfo,\n    amountB,\n    protocolFeeRate,\n    platformFeeRate,\n    curveType,\n    shareFeeRate,\n  }: {\n    poolInfo: LaunchpadPoolInfo | PoolBaseAmount;\n    amountB: BN;\n    protocolFeeRate: BN;\n    platformFeeRate: BN;\n    curveType: number;\n    shareFeeRate: BN;\n  }): {\n    amountA: BN;\n    amountB: BN;\n    splitFee: { platformFee: BN; shareFee: BN; protocolFee: BN };\n  } {\n    const totalFeeRate = protocolFeeRate.add(shareFeeRate).add(platformFeeRate);\n\n    const amountOutWithFeeB = this.calculatePreFee({ postFeeAmount: amountB, feeRate: totalFeeRate });\n    if (poolInfo.realB.lt(amountOutWithFeeB)) throw Error(\"Insufficient liquidity\");\n\n    const totalFee = amountOutWithFeeB.sub(amountB);\n\n    const curve = Curve.getCurve(curveType);\n    const amountA = curve.sellExactOut({ poolInfo, amount: amountOutWithFeeB });\n\n    if (amountA.gt(poolInfo.realA)) throw Error();\n\n    const splitFee = this.splitFee({ totalFee, protocolFeeRate, platformFeeRate, shareFeeRate });\n\n    return { amountA, amountB, splitFee };\n  }\n\n  static splitFee({\n    totalFee,\n    protocolFeeRate,\n    platformFeeRate,\n    shareFeeRate,\n  }: {\n    totalFee: BN;\n    protocolFeeRate: BN;\n    platformFeeRate: BN;\n    shareFeeRate: BN;\n  }): { platformFee: BN; shareFee: BN; protocolFee: BN } {\n    const totalFeeRate = protocolFeeRate.add(platformFeeRate).add(shareFeeRate);\n    const platformFee = totalFeeRate.isZero() ? new BN(0) : totalFee.mul(platformFeeRate).div(totalFeeRate);\n    const shareFee = totalFeeRate.isZero() ? new BN(0) : totalFee.mul(shareFeeRate).div(totalFeeRate);\n    const protocolFee = totalFee.sub(platformFee).sub(shareFee);\n\n    return { platformFee, shareFee, protocolFee };\n  }\n\n  static calculateFee({ amount, feeRate }: { amount: BN; feeRate: BN }): BN {\n    return ceilDiv(amount, feeRate, FEE_RATE_DENOMINATOR_VALUE);\n  }\n  static calculatePreFee({ postFeeAmount, feeRate }: { postFeeAmount: BN; feeRate: BN }): BN {\n    if (feeRate.isZero()) return postFeeAmount;\n\n    const numerator = postFeeAmount.mul(FEE_RATE_DENOMINATOR_VALUE);\n    const denominator = FEE_RATE_DENOMINATOR_VALUE.sub(feeRate);\n\n    return numerator.add(denominator).sub(new BN(1)).div(denominator);\n  }\n\n  static getCurve(curveType: number): typeof CurveBase {\n    switch (curveType) {\n      case 0:\n        return LaunchPadConstantProductCurve;\n      case 1:\n        return FixedPriceCurve;\n      case 2:\n        return LinearPriceCurve;\n    }\n    throw Error(\"find curve error\");\n  }\n}\n","import BN from \"bn.js\";\nimport Decimal from \"decimal.js\";\nimport { ceilDivBN } from \"@/common\";\nimport { CurveBase, PoolBaseAmount } from \"./curveBase\";\nimport { Q64 } from \"@/raydium/clmm\";\nimport { LaunchpadPoolInfo } from \"../type\";\nexport { Q64 };\n\nexport class LaunchPadConstantProductCurve extends CurveBase {\n  static getPoolInitPriceByPool({\n    poolInfo,\n    decimalA,\n    decimalB,\n  }: {\n    poolInfo: LaunchpadPoolInfo | PoolBaseAmount;\n    decimalA: number;\n    decimalB: number;\n  }): Decimal {\n    return new Decimal(poolInfo.virtualB.toString()).div(poolInfo.virtualA.toString()).mul(10 ** (decimalA - decimalB));\n  }\n  static getPoolInitPriceByInit({\n    a,\n    b,\n    decimalA,\n    decimalB,\n  }: {\n    a: BN;\n    b: BN;\n    decimalA: number;\n    decimalB: number;\n  }): Decimal {\n    return new Decimal(b.toString()).div(a.toString()).mul(10 ** (decimalA - decimalB));\n  }\n\n  static getPoolPrice({\n    poolInfo,\n    decimalA,\n    decimalB,\n  }: {\n    poolInfo: LaunchpadPoolInfo | PoolBaseAmount;\n    decimalA: number;\n    decimalB: number;\n  }): Decimal {\n    return new Decimal(poolInfo.virtualB.add(poolInfo.realB).toString())\n      .div(poolInfo.virtualA.sub(poolInfo.realA).toString())\n      .mul(10 ** (decimalA - decimalB));\n  }\n  static getPoolEndPrice({\n    supply,\n    totalSell,\n    totalLockedAmount,\n    totalFundRaising,\n    migrateFee,\n    decimalA,\n    decimalB,\n  }: {\n    supply: BN;\n    totalSell: BN;\n    totalLockedAmount: BN;\n    totalFundRaising: BN;\n    migrateFee: BN;\n    decimalA: number;\n    decimalB: number;\n  }): Decimal {\n    return new Decimal(totalFundRaising.sub(migrateFee).toString())\n      .div(supply.sub(totalSell).sub(totalLockedAmount).toString())\n      .mul(10 ** (decimalA - decimalB));\n  }\n\n  static getPoolEndPriceReal({\n    poolInfo,\n    decimalA,\n    decimalB,\n  }: {\n    poolInfo: LaunchpadPoolInfo;\n    decimalA: number;\n    decimalB: number;\n  }): Decimal {\n    const allSellToken = poolInfo.totalSellA.sub(poolInfo.realA);\n    const buyAllTokenUseB = poolInfo.totalFundRaisingB.sub(poolInfo.realB);\n\n    return new Decimal(poolInfo.virtualB.add(poolInfo.realB.add(buyAllTokenUseB)).toString())\n      .div(poolInfo.virtualA.sub(poolInfo.realA.add(allSellToken)).toString())\n      .mul(10 ** (decimalA - decimalB));\n  }\n\n  static getInitParam({\n    supply,\n    totalFundRaising,\n    totalSell,\n    totalLockedAmount,\n    migrateFee,\n  }: {\n    supply: BN;\n    totalSell: BN;\n    totalLockedAmount: BN;\n    totalFundRaising: BN;\n    migrateFee: BN;\n  }): { a: BN; b: BN; c: BN } {\n    if (supply.lte(totalSell)) throw Error(\"supply need gt total sell\");\n    const supplyMinusSellLocked = supply.sub(totalSell).sub(totalLockedAmount);\n    if (supplyMinusSellLocked.lte(new BN(0))) throw Error(\"supplyMinusSellLocked <= 0\");\n\n    const tfMinusMf = totalFundRaising.sub(migrateFee);\n    if (tfMinusMf.lte(new BN(0))) throw Error(\"tfMinusMf <= 0\");\n\n    // const migratePriceX64 = tfMinusMf.mul(Q64).div(supplyMinusSellLocked);\n\n    const numerator = tfMinusMf.mul(totalSell).mul(totalSell).div(supplyMinusSellLocked);\n    const denominator = tfMinusMf.mul(totalSell).div(supplyMinusSellLocked).sub(totalFundRaising);\n\n    if (denominator.lt(new BN(0))) throw Error(\"supply/totalSell/totalLockedAmount diff too high\");\n\n    const x0 = numerator.div(denominator);\n    const y0 = totalFundRaising.mul(totalFundRaising).div(denominator);\n\n    if (x0.lt(new BN(0)) || y0.lt(new BN(0))) throw Error(\"invalid input 0\");\n\n    return {\n      a: x0,\n      b: y0,\n      c: totalSell,\n    };\n  }\n\n  static buyExactIn({ poolInfo, amount }: { poolInfo: LaunchpadPoolInfo | PoolBaseAmount; amount: BN }): BN {\n    return this.getAmountOut({\n      amountIn: amount,\n      inputReserve: poolInfo.virtualB.add(poolInfo.realB),\n      outputReserve: poolInfo.virtualA.sub(poolInfo.realA),\n    });\n  }\n\n  static buyExactOut({ poolInfo, amount }: { poolInfo: LaunchpadPoolInfo | PoolBaseAmount; amount: BN }): BN {\n    return this.getAmountIn({\n      amountOut: amount,\n      inputReserve: poolInfo.virtualB.add(poolInfo.realB),\n      outputReserve: poolInfo.virtualA.sub(poolInfo.realA),\n    });\n  }\n\n  static sellExactIn({ poolInfo, amount }: { poolInfo: LaunchpadPoolInfo | PoolBaseAmount; amount: BN }): BN {\n    return this.getAmountOut({\n      amountIn: amount,\n      inputReserve: poolInfo.virtualA.sub(poolInfo.realA),\n      outputReserve: poolInfo.virtualB.add(poolInfo.realB),\n    });\n  }\n\n  static sellExactOut({ poolInfo, amount }: { poolInfo: LaunchpadPoolInfo | PoolBaseAmount; amount: BN }): BN {\n    return this.getAmountIn({\n      amountOut: amount,\n      inputReserve: poolInfo.virtualA.sub(poolInfo.realA),\n      outputReserve: poolInfo.virtualB.add(poolInfo.realB),\n    });\n  }\n\n  static getAmountOut({\n    amountIn,\n    inputReserve,\n    outputReserve,\n  }: {\n    amountIn: BN;\n    inputReserve: BN;\n    outputReserve: BN;\n  }): BN {\n    const numerator = amountIn.mul(outputReserve);\n    const denominator = inputReserve.add(amountIn);\n    const amountOut = numerator.div(denominator);\n    return amountOut;\n  }\n  static getAmountIn({\n    amountOut,\n    inputReserve,\n    outputReserve,\n  }: {\n    amountOut: BN;\n    inputReserve: BN;\n    outputReserve: BN;\n  }): BN {\n    const numerator = inputReserve.mul(amountOut);\n    const denominator = outputReserve.sub(amountOut);\n    const amountIn = ceilDivBN(numerator, denominator);\n    return amountIn;\n  }\n}\n","import BN from \"bn.js\";\nimport { LaunchpadPool } from \"../layout\";\nimport Decimal from \"decimal.js\";\nimport { LaunchpadPoolInfo } from \"../type\";\n\nexport interface PoolBaseAmount {\n  virtualA: BN;\n  virtualB: BN;\n  realA: BN;\n  realB: BN;\n}\n\nexport class CurveBase {\n  static getPoolInitPriceByPool({\n    poolInfo,\n    decimalA,\n    decimalB,\n  }: {\n    poolInfo: LaunchpadPoolInfo | PoolBaseAmount;\n    decimalA: number;\n    decimalB: number;\n  }): Decimal {\n    throw Error();\n  }\n  static getPoolInitPriceByInit({\n    a,\n    b,\n    decimalA,\n    decimalB,\n  }: {\n    a: BN;\n    b: BN;\n    decimalA: number;\n    decimalB: number;\n  }): Decimal {\n    throw Error();\n  }\n\n  static getPoolPrice({\n    poolInfo,\n    decimalA,\n    decimalB,\n  }: {\n    poolInfo: LaunchpadPoolInfo | PoolBaseAmount;\n    decimalA: number;\n    decimalB: number;\n  }): Decimal {\n    throw Error();\n  }\n  static getPoolEndPrice({\n    supply,\n    totalSell,\n    totalLockedAmount,\n    totalFundRaising,\n    migrateFee,\n    decimalA,\n    decimalB,\n  }: {\n    supply: BN;\n    totalSell: BN;\n    totalLockedAmount: BN;\n    totalFundRaising: BN;\n    migrateFee: BN;\n    decimalA: number;\n    decimalB: number;\n  }): Decimal {\n    throw Error();\n  }\n\n  static getPoolEndPriceReal({\n    poolInfo,\n    decimalA,\n    decimalB,\n  }: {\n    poolInfo: LaunchpadPoolInfo;\n    decimalA: number;\n    decimalB: number;\n  }): Decimal {\n    throw Error();\n  }\n\n  static getInitParam({\n    supply,\n    totalFundRaising,\n    totalSell,\n    totalLockedAmount,\n    migrateFee,\n  }: {\n    supply: BN;\n    totalSell: BN;\n    totalLockedAmount: BN;\n    totalFundRaising: BN;\n    migrateFee: BN;\n  }): { a: BN; b: BN; c: BN } {\n    throw Error();\n  }\n\n  static buyExactIn({ poolInfo, amount }: { poolInfo: LaunchpadPoolInfo | PoolBaseAmount; amount: BN }): BN {\n    throw Error();\n  }\n\n  static buyExactOut({ poolInfo, amount }: { poolInfo: LaunchpadPoolInfo | PoolBaseAmount; amount: BN }): BN {\n    throw Error();\n  }\n\n  static sellExactIn({ poolInfo, amount }: { poolInfo: LaunchpadPoolInfo | PoolBaseAmount; amount: BN }): BN {\n    throw Error();\n  }\n  static sellExactOut({ poolInfo, amount }: { poolInfo: LaunchpadPoolInfo | PoolBaseAmount; amount: BN }): BN {\n    throw Error();\n  }\n}\n","import BN from \"bn.js\";\nimport Decimal from \"decimal.js\";\nimport { CurveBase, PoolBaseAmount } from \"./curveBase\";\nimport { LaunchpadPoolInfo } from \"../type\";\nimport { ceilDivBN } from \"@/common\";\n\nexport class FixedPriceCurve extends CurveBase {\n  static getPoolInitPriceByPool({\n    poolInfo,\n    decimalA,\n    decimalB,\n  }: {\n    poolInfo: LaunchpadPoolInfo | PoolBaseAmount;\n    decimalA: number;\n    decimalB: number;\n  }): Decimal {\n    return new Decimal(poolInfo.virtualB.toString()).div(poolInfo.virtualA.toString()).mul(10 ** (decimalA - decimalB));\n  }\n  static getPoolInitPriceByInit({\n    a,\n    b,\n    decimalA,\n    decimalB,\n  }: {\n    a: BN;\n    b: BN;\n    decimalA: number;\n    decimalB: number;\n  }): Decimal {\n    return new Decimal(b.toString()).div(a.toString()).mul(10 ** (decimalA - decimalB));\n  }\n\n  static getPoolPrice({\n    poolInfo,\n    decimalA,\n    decimalB,\n  }: {\n    poolInfo: LaunchpadPoolInfo | PoolBaseAmount;\n    decimalA: number;\n    decimalB: number;\n  }): Decimal {\n    return new Decimal(poolInfo.virtualB.toString()).div(poolInfo.virtualA.toString()).mul(10 ** (decimalA - decimalB));\n  }\n  static getPoolEndPrice({\n    supply,\n    totalSell,\n    totalLockedAmount,\n    totalFundRaising,\n    migrateFee,\n    decimalA,\n    decimalB,\n  }: {\n    supply: BN;\n    totalSell: BN;\n    totalLockedAmount: BN;\n    totalFundRaising: BN;\n    migrateFee: BN;\n    decimalA: number;\n    decimalB: number;\n  }): Decimal {\n    return new Decimal(totalFundRaising.sub(migrateFee).toString())\n      .div(supply.sub(totalSell).sub(totalLockedAmount).toString())\n      .mul(10 ** (decimalA - decimalB));\n  }\n\n  static getPoolEndPriceReal({\n    poolInfo,\n    decimalA,\n    decimalB,\n  }: {\n    poolInfo: LaunchpadPoolInfo;\n    decimalA: number;\n    decimalB: number;\n  }): Decimal {\n    const allSellToken = poolInfo.totalSellA.sub(poolInfo.realA);\n    const buyAllTokenUseB = poolInfo.totalFundRaisingB.sub(poolInfo.realB);\n\n    return new Decimal(poolInfo.virtualB.add(poolInfo.realB).add(buyAllTokenUseB).toString())\n      .div(poolInfo.virtualA.sub(poolInfo.realA).add(allSellToken).toString())\n      .mul(10 ** (decimalA - decimalB));\n  }\n\n  static getInitParam({\n    supply,\n    totalFundRaising,\n    totalSell,\n    totalLockedAmount,\n    migrateFee,\n  }: {\n    supply: BN;\n    totalSell: BN;\n    totalFundRaising: BN;\n    totalLockedAmount: BN;\n    migrateFee: BN;\n  }): { a: BN; b: BN; c: BN } {\n    const supplyMinusLocked = supply.sub(totalLockedAmount);\n\n    if (supplyMinusLocked.lte(new BN(0))) throw Error(\"invalid input 1\");\n\n    const denominator = new BN(2).mul(totalFundRaising).sub(migrateFee);\n    const numerator = totalFundRaising.mul(supplyMinusLocked);\n    const totalSellExpect = numerator.div(denominator);\n\n    // if (!totalSell.eq(totalSellExpect)) throw Error(\"invalid input 2\");\n\n    return { a: totalSellExpect, b: totalFundRaising, c: totalSellExpect };\n  }\n\n  static buyExactIn({ poolInfo, amount }: { poolInfo: LaunchpadPoolInfo | PoolBaseAmount; amount: BN }): BN {\n    return this.getAmountOut({ amountIn: amount, initInput: poolInfo.virtualB, initOutput: poolInfo.virtualA });\n  }\n\n  static buyExactOut({ poolInfo, amount }: { poolInfo: LaunchpadPoolInfo | PoolBaseAmount; amount: BN }): BN {\n    return this.getAmountIn({ amountOut: amount, initInput: poolInfo.virtualB, initOutput: poolInfo.virtualA });\n  }\n\n  static sellExactIn({ poolInfo, amount }: { poolInfo: LaunchpadPoolInfo | PoolBaseAmount; amount: BN }): BN {\n    return this.getAmountOut({ amountIn: amount, initInput: poolInfo.virtualA, initOutput: poolInfo.virtualB });\n  }\n\n  static sellExactOut({ poolInfo, amount }: { poolInfo: LaunchpadPoolInfo | PoolBaseAmount; amount: BN }): BN {\n    return this.getAmountIn({ amountOut: amount, initInput: poolInfo.virtualA, initOutput: poolInfo.virtualB });\n  }\n\n  static getAmountOut({ amountIn, initInput, initOutput }: { amountIn: BN; initInput: BN; initOutput: BN }): BN {\n    const numerator = initOutput.mul(amountIn);\n    const amountOut = numerator.div(initInput);\n    return amountOut;\n  }\n\n  static getAmountIn({ amountOut, initInput, initOutput }: { amountOut: BN; initInput: BN; initOutput: BN }): BN {\n    const numerator = initInput.mul(amountOut);\n    const amountIn = ceilDivBN(numerator, initOutput);\n    return amountIn;\n  }\n}\n","import BN from \"bn.js\";\nimport Decimal from \"decimal.js\";\nimport { Q64 } from \"./constantProductCurve\";\nimport { MathLaunch } from \"./func\";\nimport { MaxU64 } from \"@/raydium/clmm\";\nimport { LaunchpadPoolInfo } from \"../type\";\nimport { CurveBase, PoolBaseAmount } from \"./curveBase\";\nexport class LinearPriceCurve extends CurveBase {\n  static getPoolInitPriceByPool({\n    poolInfo,\n    decimalA,\n    decimalB,\n  }: {\n    poolInfo: LaunchpadPoolInfo | PoolBaseAmount;\n    decimalA: number;\n    decimalB: number;\n  }): Decimal {\n    return new Decimal(0);\n  }\n  static getPoolInitPriceByInit({\n    a,\n    b,\n    decimalA,\n    decimalB,\n  }: {\n    a: BN;\n    b: BN;\n    decimalA: number;\n    decimalB: number;\n  }): Decimal {\n    return new Decimal(0);\n  }\n\n  static getPoolPrice({\n    poolInfo,\n    decimalA,\n    decimalB,\n  }: {\n    poolInfo: LaunchpadPoolInfo | PoolBaseAmount;\n    decimalA: number;\n    decimalB: number;\n  }): Decimal {\n    return new Decimal(poolInfo.virtualA.mul(poolInfo.realA).toString())\n      .div(MathLaunch._Q64)\n      .mul(10 ** (decimalA - decimalB));\n  }\n  static getPoolEndPrice({\n    supply,\n    totalSell,\n    totalLockedAmount,\n    totalFundRaising,\n    migrateFee,\n    decimalA,\n    decimalB,\n  }: {\n    supply: BN;\n    totalSell: BN;\n    totalLockedAmount: BN;\n    totalFundRaising: BN;\n    migrateFee: BN;\n    decimalA: number;\n    decimalB: number;\n  }): Decimal {\n    return new Decimal(totalFundRaising.sub(migrateFee).toString())\n      .div(supply.sub(totalSell).sub(totalLockedAmount).toString())\n      .mul(10 ** (decimalA - decimalB));\n  }\n\n  static getPoolEndPriceReal({\n    poolInfo,\n    decimalA,\n    decimalB,\n  }: {\n    poolInfo: LaunchpadPoolInfo;\n    decimalA: number;\n    decimalB: number;\n  }): Decimal {\n    const allSellToken = poolInfo.totalSellA.sub(poolInfo.realA);\n    const buyAllTokenUseB = poolInfo.totalFundRaisingB.sub(poolInfo.realB);\n\n    return new Decimal(poolInfo.virtualB.add(poolInfo.realB).add(buyAllTokenUseB).toString())\n      .div(poolInfo.virtualA.sub(poolInfo.realA).add(allSellToken).toString())\n      .mul(10 ** (decimalA - decimalB));\n  }\n\n  static getInitParam({\n    supply,\n    totalFundRaising,\n    totalSell,\n    totalLockedAmount,\n    migrateFee,\n  }: {\n    supply: BN;\n    totalSell: BN;\n    totalLockedAmount: BN;\n    totalFundRaising: BN;\n    migrateFee: BN;\n  }): { a: BN; b: BN; c: BN } {\n    const supplyMinusLocked = supply.sub(totalLockedAmount);\n    if (supplyMinusLocked.lte(new BN(0))) throw Error(\"supplyMinusLocked need gt 0\");\n    const denominator = totalFundRaising.mul(new BN(3)).sub(migrateFee);\n    const numerator = totalFundRaising.mul(new BN(2)).mul(supplyMinusLocked);\n\n    const totalSellExpect = numerator.div(denominator);\n\n    // if (!totalSell.eq(totalSellExpect)) throw Error(\"invalid input\");\n\n    const totalSellSquared = totalSellExpect.mul(totalSellExpect);\n    const a = totalFundRaising.mul(new BN(2)).mul(Q64).div(totalSellSquared);\n\n    if (!a.gt(new BN(0))) throw Error(\"a need gt 0\");\n\n    if (!MaxU64.gt(a)) throw Error(\"a need lt u64 max\");\n\n    return { a, b: new BN(0), c: totalSellExpect };\n  }\n\n  static buyExactIn({ poolInfo, amount }: { poolInfo: LaunchpadPoolInfo | PoolBaseAmount; amount: BN }): BN {\n    const newQuote = poolInfo.realB.add(amount);\n    const termInsideSqrt = new BN(2).mul(newQuote).mul(Q64).div(poolInfo.virtualA);\n    const sqrtTerm = new BN(new Decimal(termInsideSqrt.toString()).sqrt().toFixed(0));\n    const amountOut = sqrtTerm.sub(poolInfo.realA);\n\n    return amountOut;\n  }\n\n  static buyExactOut({ poolInfo, amount }: { poolInfo: LaunchpadPoolInfo | PoolBaseAmount; amount: BN }): BN {\n    const newBase = poolInfo.realA.add(amount);\n    const newBaseSquared = newBase.mul(newBase);\n    const { div: _newQuoteDiv, mod: _newQuoteMod } = poolInfo.virtualA.mul(newBaseSquared).divmod(new BN(2).mul(Q64));\n    const newQuote = _newQuoteMod.isZero() ? _newQuoteDiv : _newQuoteDiv.add(new BN(1));\n    return newQuote.sub(poolInfo.realB);\n  }\n\n  static sellExactIn({ poolInfo, amount }: { poolInfo: LaunchpadPoolInfo | PoolBaseAmount; amount: BN }): BN {\n    const newBase = poolInfo.realA.sub(amount);\n    const newBaseSquared = newBase.mul(newBase);\n\n    const { div: _newQuoteDiv, mod: _newQuoteMod } = poolInfo.virtualA.mul(newBaseSquared).divmod(new BN(2).mul(Q64));\n\n    const newQuote = _newQuoteMod.isZero() ? _newQuoteDiv : _newQuoteDiv.add(new BN(1));\n\n    return poolInfo.realB.sub(newQuote);\n  }\n\n  static sellExactOut({ poolInfo, amount }: { poolInfo: LaunchpadPoolInfo | PoolBaseAmount; amount: BN }): BN {\n    const newB = poolInfo.realB.sub(amount);\n    const termInsideSqrt = new BN(2).mul(newB).mul(Q64).div(poolInfo.virtualA);\n\n    const sqrtTerm = new BN(new Decimal(termInsideSqrt.toString()).sqrt().toFixed(0));\n\n    const amountIn = poolInfo.realA.sub(sqrtTerm);\n\n    return amountIn;\n  }\n}\n","import BN from \"bn.js\";\nimport Decimal from \"decimal.js\";\n\nexport class MathLaunch {\n  static _Q64 = new Decimal(new BN(1).shln(64).toString());\n\n  static _multipler(decimals: number): Decimal {\n    return new Decimal(10).pow(decimals);\n  }\n\n  static getPrice({ priceX64, decimalA, decimalB }: { priceX64: BN; decimalA: number; decimalB: number }): Decimal {\n    const priceWithDecimals = new Decimal(priceX64.toString()).div(this._Q64);\n    const price = priceWithDecimals.mul(this._multipler(decimalA)).div(this._multipler(decimalB));\n\n    return price;\n  }\n\n  static getPriceX64({ price, decimalA, decimalB }: { price: Decimal; decimalA: number; decimalB: number }): BN {\n    const priceWithDecimals = price.mul(this._multipler(decimalB)).div(this._multipler(decimalA));\n    const priceX64 = new BN(priceWithDecimals.mul(this._Q64).toFixed(0));\n    return priceX64;\n  }\n}\n\nexport function checkPoolToAmm({\n  supply,\n  totalFundRaisingB,\n  totalLockedAmount,\n  totalSellA,\n  migrateType,\n  decimalsA,\n}: {\n  supply: BN;\n  totalSellA: BN;\n  totalLockedAmount: BN;\n  totalFundRaisingB: BN;\n  migrateType: \"amm\" | \"cpmm\";\n  decimalsA: number;\n}): boolean {\n  const migrateAmountA = supply.sub(totalSellA).sub(totalLockedAmount);\n  const liquidity = new BN(new Decimal(migrateAmountA.mul(totalFundRaisingB).toString()).sqrt().toFixed(0));\n\n  if (migrateType === \"amm\") {\n    if (liquidity.gt(new BN(10).pow(new BN(decimalsA)))) return true;\n  } else if (migrateType === \"cpmm\") {\n    if (liquidity.gt(new BN(100))) return true;\n  } else {\n    throw Error(\"migrate type error\");\n  }\n\n  return false;\n}\n","import { PublicKey } from \"@solana/web3.js\";\nimport { MintLayout, TOKEN_2022_PROGRAM_ID, TOKEN_PROGRAM_ID } from \"@solana/spl-token\";\n\nimport { ApiV3Token, JupTokenType } from \"@/api/type\";\nimport ModuleBase, { ModuleBaseProps } from \"../moduleBase\";\nimport { LoadParams } from \"../type\";\n\nimport { SOL_INFO } from \"./constant\";\nimport { TokenInfo } from \"./type\";\n\nexport default class TokenModule extends ModuleBase {\n  private _tokenList: TokenInfo[] = [];\n  private _tokenMap: Map<string, TokenInfo> = new Map();\n  private _blackTokenMap: Set<string> = new Set();\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(forceUpdate);\n    // reset all data\n    this._tokenList = [];\n    this._tokenMap = new Map();\n    this._blackTokenMap = new Set(blacklist);\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\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        tags: token.freezeAuthority ? [...(token.tags || []), \"hasFreeze\"] : token.tags,\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(): Set<string> {\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"],"mappings":"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","names":["merge","axios","PublicKey","get","set","Logger","params","logLevel","level","props","msg","arg","moduleLoggers","moduleLevels","createLogger","moduleName","logger","get","set","MINT_SIZE","TOKEN_PROGRAM_ID","getTransferFeeConfig","unpackMint","logger","createLogger","getMultipleAccountsInfo","connection","publicKeys","config","batchRequest","commitment","chunkCount","chunkedKeys","chunkArray","results","batch","keys","args","key","_batch","i","unsafeRes","accountInfo","data","executable","lamports","owner","rentEpoch","PublicKey","error","getMultipleAccountsInfoWithCustomFlags","publicKeysWithCustomFlag","multipleAccountsInfo","idx","fetchMultipleMintInfos","connection","mints","config","_a","_b","_c","mintInfos","getMultipleAccountsInfoWithCustomFlags","i","solToWSol","mintK","MINT_SIZE","t","unpackMint","TOKEN_PROGRAM_ID","getTransferFeeConfig","PublicKey","WSOLMint","BN","Decimal","_Big","BN","_toFarmat","toFormat","formatter_default","_Big","BN","_Decimal","BN","MAX_SAFE","parseBigNumberish","value","logger","createLogger","BN","logger","createLogger","Big","formatter_default","_Big","Decimal","_Decimal","toSignificantRounding","toFixedRounding","Fraction","numerator","denominator","BN","parseBigNumberish","other","otherParsed","significantDigits","format","rounding","quotient","decimalPlaces","logger","createLogger","Big","formatter_default","_Big","splitNumber","num","decimals","integral","fractional","splited","TokenAmount","Fraction","token","amount","isRaw","name","parsedAmount","BN","multiplier","BN_TEN","parseBigNumberish","integralAmount","fractionalAmount","other","significantDigits","format","rounding","decimalPlaces","PublicKey","TOKEN_PROGRAM_ID","SOL_INFO","TOKEN_WSOL","PublicKey","PublicKey","SystemProgram","SYSVAR_RENT_PUBKEY","TOKEN_PROGRAM_ID","accountMeta","pubkey","isSigner","isWritable","commonSystemAccountMeta","validateAndParsePublicKey","orgPubKey","transformSol","publicKey","tryParsePublicKey","SOLMint","WSOLMint","v","MEMO_PROGRAM_ID","MEMO_PROGRAM_ID2","RENT_PROGRAM_ID","CLOCK_PROGRAM_ID","METADATA_PROGRAM_ID","INSTRUCTION_PROGRAM_ID","SYSTEM_PROGRAM_ID","RAYMint","PAIMint","SRMMint","USDCMint","USDTMint","mSOLMint","stSOLMint","USDHMint","NRVMint","ANAMint","ETHMint","solToWSol","mint","_Token","mint","decimals","symbol","name","skipMint","isToken2022","SOLMint","PublicKey","TOKEN_WSOL","validateAndParsePublicKey","other","Token","_Currency","decimals","symbol","name","other","Currency","SOL_INFO","BN","_100_PERCENT","Fraction","BN","Percent","significantDigits","format","rounding","decimalPlaces","logger","createLogger","Price","Fraction","params","baseToken","quoteToken","numerator","denominator","tenExponential","other","fraction","significantDigits","format","rounding","decimalPlaces","PublicKey","BN","notInnerObject","v","Token","TokenAmount","PublicKey","Fraction","BN","Price","Percent","o","jsonInfo2PoolKeys","jsonInfo","tryParsePublicKey","k","BN_ZERO","BN","BN_ONE","BN_TWO","BN_THREE","BN_FIVE","BN_TEN","BN_100","BN_1000","BN_10000","tenExponential","shift","parseBigNumberish","divCeil","a","b","dm","ceilDiv","tokenAmount","feeNumerator","feeDenominator","BN","floorDiv","chunkArray","arr","chunkSize","cache","tmp","Owner","owner","PublicKey","TOKEN_PROGRAM_ID","ComputeBudgetProgram","Keypair","PublicKey","Transaction","TransactionMessage","VersionedTransaction","InstructionType","TOKEN_PROGRAM_ID","logger","createLogger","MAX_BASE64_SIZE","addComputeBudget","config","ins","insTypes","ComputeBudgetProgram","InstructionType","getRecentBlockHash","connection","propsCommitment","_a","_b","commitment","confirmTransaction","txId","resolve","reject","id","signatureResult","forecastTransactionSize","instructions","signers","transaction","Transaction","findProgramAddress","seeds","programId","publicKey","nonce","PublicKey","checkLegacyTxSize","instructions","payer","signers","forecastTransactionSize","checkV0TxSize","lookupTableAddressAccount","recentBlockhash","Keypair","messageV0","TransactionMessage","VersionedTransaction","MAX_BASE64_SIZE","toBuffer","arr","txToBase64","transaction","serialized","VersionedTransaction","printSimulate","transactions","allBase64","Transaction","TOKEN_PROGRAM_ID","Keypair","getATAAddress","owner","mint","programId","findProgramAddress","TOKEN_PROGRAM_ID","PublicKey","PublicKey","FARM_PROGRAM_ID_V3","FARM_PROGRAM_ID_V4","FARM_PROGRAM_ID_V5","FARM_PROGRAM_ID_V6","UTIL1216","OPEN_BOOK_PROGRAM","SERUM_PROGRAM_ID_V3","AMM_V4","AMM_STABLE","LIQUIDITY_POOL_PROGRAM_ID_V5_MODEL","CLMM_PROGRAM_ID","CLMM_LOCK_PROGRAM_ID","CLMM_LOCK_AUTH_ID","Router","FEE_DESTINATION_ID","IDO_PROGRAM_ID_V1","IDO_PROGRAM_ID_V2","IDO_PROGRAM_ID_V3","IDO_PROGRAM_ID_V4","CREATE_CPMM_POOL_PROGRAM","CREATE_CPMM_POOL_AUTH","CREATE_CPMM_POOL_FEE_ACC","DEV_CREATE_CPMM_POOL_PROGRAM","DEV_CREATE_CPMM_POOL_AUTH","DEV_CREATE_CPMM_POOL_FEE_ACC","LOCK_CPMM_PROGRAM","DEV_LOCK_CPMM_PROGRAM","LOCK_CPMM_AUTH","DEV_LOCK_CPMM_AUTH","LAUNCHPAD_PROGRAM","LAUNCHPAD_AUTH","DEV_LAUNCHPAD_PROGRAM","DEV_LAUNCHPAD_AUTH","IDO_ALL_PROGRAM","DEVNET_PROGRAM_ID","PublicKey","DEV_CREATE_CPMM_POOL_PROGRAM","DEV_CREATE_CPMM_POOL_AUTH","DEV_CREATE_CPMM_POOL_FEE_ACC","DEV_LOCK_CPMM_PROGRAM","DEV_LOCK_CPMM_AUTH","DEV_LAUNCHPAD_PROGRAM","DEV_LAUNCHPAD_AUTH","BN","POINT","getTransferAmountFeeV2","amount","_feeConfig","epochInfo","addFee","feeConfig","nowFeeConfig","maxFee","BN","expirationTime","POINT","nowMaxFee","_TAmount","BNDivCeil","TAmount","_fee","fee","minExpirationTime","expirationTime1","expirationTime2","bn1","bn2","div","mod","ceilDivBN","amountA","amountB","quotient","PublicKey","AddressLookupTableAccount","getMultipleLookupTableInfo","connection","address","dataInfos","getMultipleAccountsInfo","i","PublicKey","outDict","info","key","lookupAccount","AddressLookupTableAccount","LOOKUP_TABLE_CACHE","PublicKey","sendAndConfirmTransaction","SystemProgram","Transaction","TransactionMessage","VersionedTransaction","axios","LOOP_INTERVAL","TxBuilder","params","_a","json","axios","avg","config","instructions","instructionTypes","addComputeBudget","tipConfig","SystemProgram","PublicKey","InstructionType","propConfig","defaultIns","endInstructions","signers","endInstructionTypes","lookupTableAddress","address","txVersion","extInfo","transaction","Transaction","s","propBlockHash","skipPreflight","sendAndConfirm","notSendToRpc","recentBlockHash","getRecentBlockHash","printSimulate","sendAndConfirmTransaction","txs","item","extraPreBuildData","filterExtraBuildData","data","allTransactions","allSigners","allInstructionTypes","executeParams","sequentially","onTxUpdate","skipTxCount","txIds","i","tx","txId","partialSignedTxs","idx","signedTxs","processedTxs","checkSendTx","confirmed","intervalId","subSignatureId","cbk","signatureResult","targetTxIdx","r","e","result","d","props","lookupTableCache","forerunCreate","propRecentBlockhash","lookupTableAddressAccount","LOOKUP_TABLE_CACHE","allLTA","needCacheLTA","newCacheLTA","getMultipleLookupTableInfo","key","value","recentBlockhash","messageV0","TransactionMessage","VersionedTransaction","confirmTransaction","buildProps","splitIns","computeBudgetConfig","computeBudgetData","signerKey","acc","cur","instructionQueue","splitInsIdx","_itemIns","_itemInsWithCompute","_signer","ii","checkLegacyTxSize","_signers","needSignedTx","blockHash","checkV0TxSize","BN","FEE_RATE_DENOMINATOR_VALUE","API_URLS","DEV_API_URLS","SESSION_KEY","STORAGE_KEY","getSessionKey","key","updateReqHistory","logCount","removeLastLog","resData","resolve","data","success","resStr","TOKEN_2022_PROGRAM_ID","TOKEN_PROGRAM_ID","logger","createLogger","poolKeysCache","Api","cluster","timeout","logRequests","logCount","urlConfigs","axios","API_URLS","config","method","baseURL","url","logger","error","response","data","status","updateReqHistory","poolId","endpointUrl","slotList","a","b","TOKEN_2022_PROGRAM_ID","TOKEN_PROGRAM_ID","mint","m","props","type","sort","order","page","pageSize","ids","idList","cacheList","readyList","poolKeysCache","poolKey","propMint1","propMint2","mint1","mint2","solToWSol","baseMint","quoteMint","EMPTY_OWNER","EMPTY_CONNECTION","PublicKey","SystemProgram","AccountLayout","createAssociatedTokenAccountInstruction","TOKEN_PROGRAM_ID","TOKEN_2022_PROGRAM_ID","joinMsg","args","arg","ModuleBase","scope","moduleName","createLogger","feePayer","TxBuilder","message","PublicKey","SystemProgram","BN","createCloseAccountInstruction","createInitializeAccountInstruction","createTransferInstruction","TOKEN_PROGRAM_ID","Keypair","PublicKey","BN","TOKEN_PROGRAM_ID","sha256","PublicKey","BN","isBN","_bits","_BitStructure","_blob","_Blob","_cstr","_f32","_f32be","_f64","_f64be","_greedy","_Layout","_ns64","_ns64be","_nu64","_nu64be","_offset","_s16","_s16be","_s24","_s24be","_s32","_s32be","_s40","_s40be","_s48","_s48be","_s8","_seq","_struct","_Structure","_u16","_u16be","_u24","_u24be","_u32","_u32be","_u40","_u40be","_u48","_u48be","_u8","_UInt","_union","_Union","_unionLayoutDiscriminator","_utf8","Layout","Structure","UInt","_UInt","u8","_u8","u16","_u16","u32","_u32","nu64","_nu64","s32","_s32","seq","_seq","blob","_blob","bits","_bits","offset","_offset","BNLayout","Layout","span","signed","property","blob","b","offset","num","BN","src","WideBits","bits","u32","lowerDecoded","upperDecoded","u8","UInt","u64","u128","i8","i64","i128","WrappedLayout","layout","decoder","encoder","publicKey","PublicKey","key","bool","property","WrappedLayout","u8","decodeBool","encodeBool","value","vecU8","property","length","u32","layout","struct","blob","offset","WrappedLayout","data","str","s","Structure","b","offset","struct","fields","property","decodePrefixes","seq","elementLayout","count","property","parsedCount","superCount","isBN","target","countProperty","value","splAccountLayout","struct","publicKey","u64","u32","u8","logger","createLogger","parseTokenAccountResp","owner","solAccountResp","tokenAccountResp","tokenAccounts","tokenAccountRawInfos","pubkey","account","accountInfo","splAccountLayout","mint","amount","getATAAddress","PublicKey","BN","generatePubKey","fromPublicKey","programId","TOKEN_PROGRAM_ID","assignSeed","seed","Keypair","createWithSeed","buffer","publicKeyBytes","sha256","initTokenAccountInstruction","params","mint","tokenAccount","owner","programId","TOKEN_PROGRAM_ID","createInitializeAccountInstruction","closeAccountInstruction","payer","multiSigners","createCloseAccountInstruction","createWSolAccountInstructions","connection","amount","commitment","skipCloseAccount","balanceNeeded","splAccountLayout","lamports","parseBigNumberish","BN","newAccount","generatePubKey","SystemProgram","PublicKey","TOKEN_WSOL","InstructionType","makeTransferInstruction","source","destination","tokenProgram","createTransferInstruction","Account","ModuleBase","params","tokenAccounts","tokenAccountRawInfos","notSubscribeAccountChange","subscribe","cbk","listener","mint","programId","getATAAddress","config","customConfig","solAccountResp","ownerTokenAccountResp","ownerToken2022AccountResp","TOKEN_PROGRAM_ID","TOKEN_2022_PROGRAM_ID","parseTokenAccountResp","cb","associatedOnly","accountMint","a","b","ata","tokenAccount","publicKey","_a","_b","_c","_d","createInfo","owner","notUseTokenAccount","skipCloseAccount","checkCreateATAOwner","assignSeed","tokenProgram","PublicKey","accounts","i","newTxInstructions","_createATAIns","createAssociatedTokenAccountInstruction","_ataInTokenAcc","ataInfo","InstructionType","AccountLayout","WSOLMint","txInstruction","createWSolAccountInstructions","makeTransferInstruction","closeAccountInstruction","newTokenAccount","generatePubKey","balanceNeeded","createAccountIns","SystemProgram","initTokenAccountInstruction","autoUnwrapWSOLToSOL","tokenAccountAddress","accountTokenMint","ataAddress","instruction","side","amount","payer","bypassAssociatedCheck","instructions","props","useSOLBalance","handleTokenAccount","feePayer","txBuilder","_tokenAccount","PublicKey","SystemProgram","createAssociatedTokenAccountInstruction","Decimal","PublicKey","associatedLedgerAccountLayout","struct","u8","withdrawRewardLayout","farmStateRewardInfoV6Layout","u64","u128","publicKey","seq","realFarmStateV3Layout","realFarmStateV5Layout","blob","realFarmV6Layout","farmStateV3Layout","target","p","receiver","decodeParams","originalResult","farmStateV5Layout","farmStateV6Layout","item","_a","poolTypeV6","i","farmRewardTimeInfoLayout","farmRewardLayout","farmRewardRestartLayout","farmAddRewardLayout","farmLedgerLayoutV3_1","farmLedgerLayoutV3_2","farmLedgerLayoutV5_1","farmLedgerLayoutV5_2","farmLedgerLayoutV6_1","dwLayout","VoterVotingMintConfig","i8","VoterRegistrar","i64","VoterLockup","VoterDepositEntry","bool","Voter","logger","createLogger","FARM_LOCK_MINT","PublicKey","FARM_LOCK_VAULT","FARM_VERSION_TO_LEDGER_LAYOUT","farmLedgerLayoutV3_2","farmLedgerLayoutV5_2","farmLedgerLayoutV6_1","isValidFarmVersion","version","validateFarmRewards","params","_a","rewardInfos","rewardTokenAccountsPublicKeys","infoMsg","validator","poolTypeV6","FARM_PROGRAM_TO_VERSION","FARM_PROGRAM_ID_V3","FARM_PROGRAM_ID_V4","FARM_PROGRAM_ID_V5","FARM_PROGRAM_ID_V6","PublicKey","SystemProgram","SYSVAR_CLOCK_PUBKEY","SYSVAR_RENT_PUBKEY","TransactionInstruction","BN","ASSOCIATED_TOKEN_PROGRAM_ID","createAssociatedTokenAccountInstruction","TOKEN_PROGRAM_ID","BN","logger","createLogger","getAssociatedLedgerPoolAccount","programId","poolId","mint","type","publicKey","findProgramAddress","getAssociatedLedgerAccount","owner","version","getAssociatedAuthority","farmRewardInfoToConfig","data","BN","parseBigNumberish","poolTypeV6","calFarmRewardAmount","getFarmLedgerLayout","ledgerLayout","FARM_VERSION_TO_LEDGER_LAYOUT","logger","createLogger","anchorDataBuf","createAssociatedLedgerAccountInstruction","params","version","id","ledger","programId","owner","instruction","data","associatedLedgerAccountLayout","keys","accountMeta","SystemProgram","SYSVAR_RENT_PUBKEY","TransactionInstruction","InstructionType","makeCreateFarmInstruction","_a","farmRewardLayout","BN","commonSystemAccountMeta","SOLMint","item","makeCreatorWithdrawFarmRewardInstruction","withdrawRewardLayout","TOKEN_PROGRAM_ID","makeRestartRewardInstruction","payer","rewardVault","userRewardTokenPub","farmKeys","rewardInfo","data","farmRewardRestartLayout","parseBigNumberish","keys","accountMeta","TOKEN_PROGRAM_ID","TransactionInstruction","makeAddNewRewardInstruction","farmAddRewardLayout","BN","poolTypeV6","commonSystemAccountMeta","makeWithdrawInstructionV6","params","farmInfo","farmKeys","lpAccount","rewardAccounts","owner","amount","programId","id","PublicKey","ledgerAddress","getAssociatedLedgerAccount","data","dwLayout","parseBigNumberish","keys","accountMeta","TOKEN_PROGRAM_ID","index","TransactionInstruction","makeWithdrawInstructionV5","userAuxiliaryLedgers","SYSVAR_CLOCK_PUBKEY","auxiliaryLedger","makeWithdrawInstructionV4","dataLayout","struct","u8","u64","makeWithdrawInstructionV3","makeDepositInstructionV3","makeDepositInstructionV5","makeDepositInstructionV6","SystemProgram","Farm","ModuleBase","payer","rewardInfo","SOLMint","txInstructions","createWSolAccountInstructions","calFarmRewardAmount","propPoolInfo","rewardInfos","programId","FARM_PROGRAM_ID_V6","txVersion","feePayer","poolInfo","PublicKey","FARM_LOCK_MINT","FARM_LOCK_VAULT","txBuilder","payerPubKey","farmKeyPair","generatePubKey","lamports","farmStateV6Layout","SystemProgram","authority","nonce","getAssociatedAuthority","lpVault","getAssociatedLedgerPoolAccount","rewardInfoConfig","rewardInfoKey","poolTypeV6","farmRewardInfoToConfig","rewardPubKey","newInstruction","rewardMint","TOKEN_WSOL","lockUserAccount","instructionParams","instruction","instructionType","makeCreateFarmInstruction","farmInfo","newRewardInfo","_a","version","FARM_PROGRAM_TO_VERSION","farmInfoKeys","jsonInfo2PoolKeys","farmKeys","rewardInfoIndex","item","rewardVault","userRewardTokenPub","makeRestartRewardInstruction","InstructionType","newRewardInfos","reward","itemReward","ins","params","makeAddNewRewardInstruction","amount","useSOLBalance","associatedOnly","checkCreateATAOwner","userAuxiliaryLedgers","computeBudgetConfig","txTipConfig","isValidFarmVersion","farmProgramId","farmId","ledger","getAssociatedLedgerAccount","ownerMintToAccount","ata","getATAAddress","lpMint","ownerLpTokenAccount","rewardAccounts","rewardUseSOLBalance","WSOLMint","ownerRewardAccount","_ownerRewardAccount","ledgerInfo","ledgerData","getFarmLedgerLayout","createAssociatedLedgerAccountInstruction","errorMsg","validateFarmRewards","insParams","parseBigNumberish","key","makeDepositInstructionV6","makeDepositInstructionV5","makeDepositInstructionV3","insType","deposited","lpMintUseSOLBalance","makeWithdrawInstructionV6","makeWithdrawInstructionV5","makeWithdrawInstructionV4","makeWithdrawInstructionV3","withdrawMint","r","solToWSol","userRewardToken","txInstruction","Decimal","selectUserRewardToken","createAssociatedTokenAccountInstruction","makeCreatorWithdrawFarmRewardInstruction","farmInfoList","farmKeyMap","acc","cur","farmLpMint","id","_ownerLpAccount","BN_ZERO","withdrawInstruction","PublicKey","AccountLayout","NATIVE_MINT","TOKEN_PROGRAM_ID","Keypair","PublicKey","SystemProgram","TransactionInstruction","BN","ASSOCIATED_TOKEN_PROGRAM_ID","TOKEN_2022_PROGRAM_ID","TOKEN_PROGRAM_ID","BN","Decimal","BN","ZERO","ONE","NEGATIVE_ONE","Q64","Q128","MaxU64","U64Resolution","MaxUint128","MIN_TICK","MAX_TICK","MIN_SQRT_PRICE_X64","MAX_SQRT_PRICE_X64","MIN_SQRT_PRICE_X64_ADD_ONE","MAX_SQRT_PRICE_X64_SUB_ONE","BIT_PRECISION","LOG_B_2_X32","LOG_B_P_ERR_MARGIN_LOWER_X64","LOG_B_P_ERR_MARGIN_UPPER_X64","FEE_RATE_DENOMINATOR","mockV3CreatePoolInfo","U64_IGNORE_RANGE","BN","BN","Decimal","i32ToBytes","num","arr","leadingZeros","bitNum","data","i","j","trailingZeros","isZero","mostSignificantBit","leastSignificantBit","AMM_CONFIG_SEED","POOL_SEED","POOL_VAULT_SEED","POOL_REWARD_VAULT_SEED","POSITION_SEED","TICK_ARRAY_SEED","OPERATION_SEED","POOL_TICK_ARRAY_BITMAP_SEED","OBSERVATION_SEED","getPdaPoolId","programId","ammConfigId","mintA","mintB","findProgramAddress","POOL_SEED","getPdaPoolVaultId","poolId","vaultMint","POOL_VAULT_SEED","getPdaPoolRewardVaulId","rewardMint","POOL_REWARD_VAULT_SEED","getPdaTickArrayAddress","startIndex","TICK_ARRAY_SEED","i32ToBytes","getPdaProtocolPositionAddress","tickLower","tickUpper","POSITION_SEED","getPdaPersonalPositionAddress","nftMint","getPdaMetadataKey","mint","METADATA_PROGRAM_ID","getPdaOperationAccount","OPERATION_SEED","getPdaExBitmapAccount","POOL_TICK_ARRAY_BITMAP_SEED","getPdaObservationAccount","OBSERVATION_SEED","POOL_LOCK_ID_SEED","getPdaLockPositionId","positionId","getPdaLockClPositionIdV2","lockNftMint","SUPPORT_MINT_SEED","getPdaMintExAccount","mintAddress","PublicKey","TOKEN_2022_PROGRAM_ID","BN","Decimal","BN","Decimal","PositionUtils","poolState","tickLowerState","tickUpperState","feeGrowthBelowX64A","BN","feeGrowthBelowX64B","feeGrowthAboveX64A","feeGrowthAboveX64B","feeGrowthInsideX64A","MathUtil","feeGrowthInsideBX64","ammPool","positionState","feeGrowthdeltaA","Q64","tokenFeeAmountA","feeGrowthdelta1","tokenFeeAmountB","rewards","rewardGrowthsInside","i","rewardGrowthInside","currRewardInfo","rewardGrowthDelta","amountOwedDelta","rewardAmountOwed","tickCurrentIndex","rewardInfos","rewardGrowthsBelow","rewardGrowthsAbove","poolInfo","ownerPosition","liquidity","slippage","add","epochInfo","_a","_b","_c","_d","sqrtPriceX64","SqrtPriceMath","Decimal","sqrtPriceX64A","sqrtPriceX64B","coefficientRe","amounts","LiquidityMath","amountA","amountB","getTransferAmountFeeV2","amountSlippageA","amountSlippageB","minExpirationTime","FETCH_TICKARRAY_COUNT","TickQuery","connection","programId","poolId","tickCurrent","tickSpacing","tickArrayBitmapArray","exTickArrayBitmap","tickArraysToFetch","currentTickArrayStartIndex","TickUtils","startIndexArray","i","tickArrayAddress","getPdaTickArrayAddress","fetchedTickArrays","getMultipleAccountsInfo","TickArrayLayout","tickArrayCache","_info","tickIndex","zeroForOne","nextTick","tickArrayStartTickIndex","cachedTickArray","_nextTick","_tickArrayAddress","_tickArrayStartTickIndex","tickArrayBitmap","exBitmapInfo","currentOffset","result","tickArray","nextInitializedTick","TICK_ARRAY_SIZE","tickInArray","startIndex","tickPositionInArray","ticksInArray","MAX_TICK","minStartIndex","MIN_TICK","EXTENSION_TICKARRAY_BITMAP_SIZE","TickArrayBitmap","tickSpacing","TICK_ARRAY_SIZE","TICK_ARRAY_BITMAP_SIZE","tickarrayStartIndex","ticksInOneBitmap","m","minValue","bitMap","lastTickArrayStartIndex","zeroForOne","TickQuery","tickBoundary","nextTickArrayStartIndex","multiplier","compressed","bitPos","offsetBitMap","nextBit","mostSignificantBit","nextArrayStartIndex","leastSignificantBit","TickArrayBitmapExtensionUtils","tickIndex","offset","tickArrayBitmapExtension","positiveTickBoundary","negativeTickBoundary","MAX_TICK","MIN_TICK","tickArrayStartIndex","tickarrayBitmap","tickArrayOffsetInBitmap","TickUtils","bitmapMinTickBoundary","bitmapMaxTickBoundary","isZero","leadingZeros","trailingZeros","PoolUtils","poolInfo","tickArrayCache","inputTokenMint","inputAmount","sqrtPriceLimitX64","catchLiquidityInsufficient","zeroForOne","allNeededAccounts","isExist","firstTickArrayStartIndex","nextAccountMeta","allTrade","outputAmount","reaminAccounts","executionPrice","feeAmount","SwapMath","NEGATIVE_ONE","outputTokenMint","preTick","address","getPdaTickArrayAddress","isInitialized","startIndex","TickArrayBitmapExtensionUtils","TickQuery","TickUtils","nextStartIndex","currentOffset","result","lastTickArrayStartIndex","startIsInit","TickArrayBitmap","isInit","tickIndex","MIN_TICK","MAX_TICK","connection","apiPoolInfo","chainTime","poolLiquidity","rewardInfos","_a","_b","_c","nRewardInfo","i","_itemReward","apiRewardProgram","itemReward","MathUtil","PublicKey","ZERO","latestUpdateTime","BN","timeDelta","rewardGrowthDeltaX64","rewardGrowthGlobalX64","rewardEmissionedDelta","Q64","rewardTotalEmissioned","tickSpacing","tickarrayStartIndexs","maxTickBoundary","minTickBoundary","tickarrayStartIndex","TICK_ARRAY_BITMAP_SIZE","exBitmapAddress","batchRequest","fetchedBitmapAccount","getMultipleAccountsInfoWithCustomFlags","returnTypeFetchExBitmaps","item","TickArrayBitmapExtensionLayout","poolKeys","tickArraysToPoolId","tickArrays","itemPoolInfo","currentTickArrayStartIndex","startIndexArray","itemIndex","tickArrayAddress","fetchedTickArrays","itemAccountInfo","poolId","accountLayoutData","TickArrayLayout","pools","ownerInfo","updateOwnerRewardAndFee","programIds","index","accountInfo","allMint","allPositionKey","itemMint","itemProgramId","getPdaPersonalPositionAddress","positionAccountInfos","getMultipleAccountsInfo","keyToTickArrayAddress","position","PositionInfoLayout","itemPoolId","poolInfoA","pool","priceLower","priceUpper","amountA","amountB","LiquidityMath","leverage","tickArrayLowerAddress","tickArrayUpperAddress","tickArrayKeys","tickArrayDatas","tickArrayLayout","tickArrayData","key","state","positionAccount","itemPA","keyLower","keyUpper","tickArrayLower","tickArrayUpper","tickLowerState","tickUpperState","tokenFeeAmountA","tokenFeeAmountB","PositionUtils","baseMint","epochInfo","amountIn","slippage","priceLimit","Decimal","isBaseIn","baseFeeConfig","outFeeConfig","MIN_SQRT_PRICE_X64","MAX_SQRT_PRICE_X64","SqrtPriceMath","realAmountIn","getTransferAmountFeeV2","_expectedAmountOut","remainingAccounts","_executionPriceX64","amountOut","_executionPrice","_minAmountOut","minAmountOut","poolPrice","_numerator","_denominator","priceImpact","Percent","minExpirationTime","_tokenOut","baseIn","inputMint","outMint","baseToken","outToken","Token","TOKEN_2022_PROGRAM_ID","_realAmountIn","_amountOut","expirationTime","currentPrice","fee","executionPriceX64","TokenAmount","_currentPrice","Price","_fee","feeConfigs","realAmountOut","_expectedAmountIn","inMint","_maxAmountIn","maxAmountIn","aprType","positionTickLowerIndex","positionTickUpperIndex","aprInfo","_minPrice","sub","userRange","tradeRange","mintPrice","liquidity","aprTypeDay","mintPriceA","solToWSol","mintPriceB","mintDecimalsA","mintDecimalsB","sqrtPriceX64","sqrtPriceX64A","sqrtPriceX64B","poolLiquidityA","poolLiquidityB","userLiquidityA","userLiquidityB","poolTvl","userTvl","p","feeApr","SECONDS_PER_YEAR","rewardsApr","iDecimal","iPrice","a","b","inputA","tickLower","tickUpper","amount","add","amountHasFee","addFeeAmount","_amount","liquidity0","liquidity1","amountFromLiquidity","_d","coefficientRe","amounts","amountSlippageA","amountSlippageB","poolList","rpcDataMap","fetchRpcList","r","idx","PoolInfoLayout","pdaList","getPdaExBitmapAccount","exBitData","acc","cur","rpcData","mockRewardData","clmmComputeInfoToApiInfo","pool","MathUtil","a","b","denominator","numerator","result","ZERO","ONE","num","decimalPlaces","Decimal","BN","n0","n1","Q128","mulRightShift","val","mulBy","signedRightShift","signedLeftShift","shiftBy","bitWidth","twosN0","twoN0","SqrtPriceMath","sqrtPriceX64","decimalsA","decimalsB","price","liquidity","amountIn","zeroForOne","amountOut","amount","add","liquidityLeftShift","U64Resolution","numerator1","amountMulSqrtPrice","deltaY","amountDivLiquidity","tick","MIN_TICK","MAX_TICK","tickAbs","ratio","MaxUint128","MAX_SQRT_PRICE_X64","MIN_SQRT_PRICE_X64","msb","adjustedMsb","log2pIntegerX32","bit","precision","log2pFractionX64","r","BIT_PRECISION","rMoreThanTwo","log2pFractionX32","logbpX64","LOG_B_2_X32","tickLow","LOG_B_P_ERR_MARGIN_LOWER_X64","tickHigh","LOG_B_P_ERR_MARGIN_UPPER_X64","TickMath","tickSpacing","mintDecimalsA","mintDecimalsB","LiquidityMath","x","y","sqrtPriceX64A","sqrtPriceX64B","roundUp","numerator2","Q64","amountA","MaxU64","amountB","sqrtPriceCurrentX64","liquidity0","liquidity1","amountMax","amountSlippage","coefficient","amount0Slippage","amount1Slippage","poolInfo","tickLower","tickUpper","slippage","epochInfo","amountAddFee","_a","_b","_c","_d","coefficientRe","amounts","getTransferAmountFeeV2","amountSlippageA","amountSlippageB","minExpirationTime","SwapMath","programId","poolId","tickArrayCache","tickArrayBitmap","tickarrayBitmapExtension","fee","currentTick","currentSqrtPriceX64","amountSpecified","lastSavedTickArrayStartIndex","sqrtPriceLimitX64","catchLiquidityInsufficient","baseInput","state","TickQuery","tickAarrayStartIndex","tickArrayCurrent","loopCount","t","step","tickState","TickUtils","nextInitTick","tickArrayAddress","nextInitTickArrayIndex","PoolUtils","expectedNextTickArrayAddress","getPdaTickArrayAddress","targetPrice","liquidityNet","NEGATIVE_ONE","_T","isExist","sqrtPriceX64Current","sqrtPriceX64Target","amountRemaining","feeRate","swapStep","amountRemainingSubtractFee","FEE_RATE_DENOMINATOR","reachTargetPrice","TICK_ARRAY_SIZE","TICK_ARRAY_BITMAP_SIZE","TickUtils","programId","poolId","tickIndex","tickSpacing","startIndex","tickArrayAddress","getPdaTickArrayAddress","startTickIndex","offsetInArray","ticksInArray","TickQuery","tick","multiplier","compressed","bitmap","bitPos","lastTickArrayStartIndex","zeroForOne","bns","b","BN","i","tickArrayBitmap","exTickArrayBitmap","tickArrayStartIndex","expectedCount","tickArrayOffset","result","allInitializedTickArrayIndex","address","tickArray","currentTickArrayBitStartIndex","tickArrayBitmaps","arrayIndex","searchIndex","tickCount","MIN_TICK","MAX_TICK","tickArrayCurrent","currentTickIndex","t","poolInfo","baseIn","tickSqrtPriceX64","SqrtPriceMath","tickPrice","Decimal","price","_price","TickMath","ClmmConfigLayout","struct","blob","u8","u16","publicKey","u32","seq","u64","ObservationLayout","i64","ObservationInfoLayout","bool","RewardInfo","u128","PoolInfoLayout","s32","PositionRewardInfoLayout","PositionInfoLayout","ProtocolPositionLayout","TickLayout","i128","TickArrayLayout","TICK_ARRAY_SIZE","OperationLayout","TickArrayBitmapExtensionLayout","EXTENSION_TICKARRAY_BITMAP_SIZE","LockPositionLayout","LockClPositionLayoutV2","ObservationInfoLayout","logger","createLogger","anchorDataBuf","lockInsDataBuf","lockHarvestInsDataBuf","ClmmInstrument","programId","poolId","poolCreator","ammConfigId","observationId","mintA","mintVaultA","mintProgramIdA","mintB","mintVaultB","mintProgramIdB","exTickArrayBitmap","sqrtPriceX64","extendMintAccount","dataLayout","struct","u128","u64","keys","SystemProgram","RENT_PROGRAM_ID","data","ZERO","aData","TransactionInstruction","props","owner","initialPriceX64","mintAAddress","mintBAddress","PublicKey","getPdaPoolId","getPdaObservationAccount","mintAVault","getPdaPoolVaultId","mintBVault","exBitmapAccount","getPdaExBitmapAccount","ins","TOKEN_PROGRAM_ID","InstructionType","payer","positionNftOwner","positionNftMint","positionNftAccount","metadataAccount","protocolPosition","tickArrayLower","tickArrayUpper","personalPosition","ownerTokenAccountA","ownerTokenAccountB","tokenVaultA","tokenVaultB","tokenMintA","tokenMintB","tickLowerIndex","tickUpperIndex","tickArrayLowerStartIndex","tickArrayUpperStartIndex","liquidity","amountMaxA","amountMaxB","withMetadata","s32","bool","u8","remainingAccounts","ASSOCIATED_TOKEN_PROGRAM_ID","METADATA_PROGRAM_ID","TOKEN_2022_PROGRAM_ID","poolInfo","poolKeys","ownerInfo","tickLower","tickUpper","getEphemeralSigners","nft2022","signers","id","nftMintAccount","_k","Keypair","TickUtils","getPdaTickArrayAddress","getATAAddress","getPdaMetadataKey","getPdaPersonalPositionAddress","getPdaProtocolPositionAddress","PoolUtils","base","baseAmount","otherAmountMax","BN","ownerPosition","mintMintA","mintMintB","rewardAccounts","amountMinA","amountMinB","i","MEMO_PROGRAM_ID","poolProgramId","decreaseIns","inputTokenAccount","outputTokenAccount","inputVault","outputVault","inputMint","outputMint","tickArray","amount","otherAmountThreshold","sqrtPriceLimitX64","isBaseInput","amountIn","amountOutMin","isInputMintA","amountOut","amountInMax","operationId","ownerTokenAccount","rewardProgramId","rewardMint","rewardVault","openTime","endTime","emissionsPerSecondX64","parseBigNumberish","rewardInfo","poolRewardVault","getPdaPoolRewardVaulId","getPdaOperationAccount","rewardIndex","index","authProgramId","wallet","nftMint","lockNftMint","positionId","lockPositionId","getPdaLockClPositionIdV2","lockNftAccount","auth","positionOwner","lockOwner","authPositionNftAccount","positionNftProgram","positionNft","nftAccount","getPdaLockPositionId","MEMO_PROGRAM_ID2","clmmProgram","vaultA","vaultB","userVaultA","userVaultB","SPL_MINT_LAYOUT","struct","u32","publicKey","u64","u8","PublicKey","MintLayout","TOKEN_PROGRAM_ID","toToken","props","Token","toTokenAmount","amount","isRaw","name","TokenAmount","solToWSol","toApiV3Token","address","programId","decimals","props","solToWSol","toFeeConfig","config","BN","LIQUIDITY_FEES_NUMERATOR","LIQUIDITY_FEES_DENOMINATOR","PublicKey","SystemProgram","SYSVAR_RENT_PUBKEY","TransactionInstruction","ASSOCIATED_TOKEN_PROGRAM_ID","TOKEN_PROGRAM_ID","fixedSwapInLayout","struct","u8","u64","fixedSwapOutLayout","createPoolV4Layout","initPoolLayout","liquidityStateV4Layout","u128","publicKey","seq","liquidityStateV5Layout","addLiquidityLayout","removeLiquidityLayout","createPoolFeeLayout","struct","u64","PublicKey","MODEL_DATA_PUBKEY","PublicKey","ELEMENT_SIZE","DataElement","struct","u64","modelDataInfoLayout","seq","estimateRangeByXyReal","_xReal","_yReal","estimateRangeByX","_x","estimateRangeByY","_y","getMininumRangeByXyReal","layoutData","xReal","yReal","min","max","minRangeIdx","maxRangeIdx","mid","target","cur","left","right","getRatio","find","x","x1","y1","x2","y2","xDenominator","xNumerator1","xNumerator2","xNumerator","realToTable","realValue","ratio","tableToReal","tableValue","getMinimumRangeByX","getMinimumRangeByY","y","getDataByX","dx","priceUp","xWithDx","minIdx","maxIdx","p1","p2","p","getDataByY","dy","yWithDy","getMidPrice","ret","getDyByDxBaseIn","dxReal","lessTrade","getDxByDyBaseIn","dyReal","formatLayout","buffer","layoutInfo","item","getStablePrice","coinReal","pcReal","baseCoin","price","StableLayout","connection","acc","logger","createLogger","makeAddLiquidityInstruction","params","poolInfo","poolKeys","userKeys","baseAmountIn","quoteAmountIn","fixedSide","otherAmountMin","data","addLiquidityLayout","parseBigNumberish","BN_ZERO","BN_ONE","keys","accountMeta","TOKEN_PROGRAM_ID","PublicKey","MODEL_DATA_PUBKEY","TransactionInstruction","removeLiquidityInstruction","poolKeyProps","lpAmount","baseAmountMin","quoteAmountMin","jsonInfo2PoolKeys","version","removeLiquidityLayout","createPoolV4InstructionV2","programId","ammId","ammAuthority","ammOpenOrders","lpMint","coinMint","pcMint","coinVault","pcVault","withdrawQueue","ammTargetOrders","poolTempLp","marketProgramId","marketId","userWallet","userCoinVault","userPcVault","userLpVault","nonce","openTime","coinAmount","pcAmount","ammConfigId","feeDestinationId","dataLayout","struct","u8","u64","ASSOCIATED_TOKEN_PROGRAM_ID","SystemProgram","RENT_PROGRAM_ID","InstructionType","makeSwapFixedInInstruction","propPoolKeys","userKeys","amountIn","minAmountOut","version","poolKeys","jsonInfo2PoolKeys","data","fixedSwapInLayout","parseBigNumberish","keys","accountMeta","TOKEN_PROGRAM_ID","MODEL_DATA_PUBKEY","TransactionInstruction","makeSwapFixedOutInstruction","maxAmountIn","amountOut","fixedSwapOutLayout","makeAMMSwapInstruction","params","fixedSide","props","logger","PublicKey","BN","Decimal","TOKEN_PROGRAM_ID","PublicKey","logger","createLogger","getSerumAssociatedAuthority","programId","marketId","seeds","nonce","publicKey","seedsWithNonce","PublicKey","err","logger","getAssociatedConfigId","programId","publicKey","findProgramAddress","getLiquidityAssociatedId","name","marketId","getAssociatedOpenOrders","getLiquidityAssociatedAuthority","getAssociatedPoolKeys","version","marketVersion","baseMint","quoteMint","baseDecimals","quoteDecimals","marketProgramId","id","lpMint","authority","nonce","baseVault","quoteVault","lpVault","openOrders","targetOrders","withdrawQueue","marketAuthority","getSerumAssociatedAuthority","PublicKey","mockRewardData","toAmmComputePoolInfo","poolData","data","tokenProgramStr","TOKEN_PROGRAM_ID","poolId","poolInfo","mintA","mintB","toApiV3Token","Decimal","getAssociatedConfigId","BN","Decimal","PublicKey","BN","TOKEN_PROGRAM_ID","SystemProgram","SYSVAR_RENT_PUBKEY","Transaction","TransactionInstruction","createInitializeAccountInstruction","TOKEN_PROGRAM_ID","accountFlagsLayout","property","ACCOUNT_FLAGS_LAYOUT","WideBits","MARKET_STATE_LAYOUT_V2","struct","blob","publicKey","u64","initializeMarket","programId","marketInfo","dataLayout","struct","u8","u32","u64","u16","keys","SYSVAR_RENT_PUBKEY","data","TransactionInstruction","makeCreateMarketInstruction","connection","wallet","_a","_b","_c","_d","_e","_f","_g","_h","tx1","Transaction","accountLamports","SystemProgram","TOKEN_PROGRAM_ID","createInitializeAccountInstruction","MARKET_STATE_LAYOUT_V2","tx2","InstructionType","MarketV2","ModuleBase","baseInfo","quoteInfo","lotSize","tickSize","dexProgramId","requestQueueSpace","eventQueueSpace","orderbookQueueSpace","lowestFeeMarket","assignSeed","txVersion","computeBudgetConfig","txTipConfig","feePayer","wallet","seed","market","generatePubKey","requestQueue","eventQueue","bids","asks","baseVault","TOKEN_PROGRAM_ID","quoteVault","feeRateBps","quoteDustThreshold","BN","getVaultOwnerAndNonce","vaultSignerNonce","PublicKey","vaultOwner","baseLotSize","quoteLotSize","BN_ZERO","allTxArr","makeCreateMarketInstruction","txBuilder","txData","LiquidityModule","ModuleBase","params","StableLayout","poolInfo","amount","slippage","baseIn","inputAmount","BN","Decimal","_anotherToken","toToken","baseReserve","quoteReserve","lpAmount","input","amountRaw","BN_ZERO","divCeil","liquidity","_slippage","Percent","_slippageMin","slippageAdjustedAmount","slippageAdjustedMinAmount","_anotherAmount","TokenAmount","_maxAnotherAmount","_minAnotherAmount","poolId","propPoolKeys","amountInA","amountInB","otherAmountMin","fixedSide","config","txVersion","computeBudgetConfig","txTipConfig","feePayer","account","bypassAssociatedCheck","checkCreateATAOwner","tokenA","tokenB","tokenAccountA","tokenAccountB","lpTokenAccount","PublicKey","tokens","_tokenAccounts","rawAmounts","sideA","_fixedSide","baseToken","quoteToken","baseTokenAccount","quoteTokenAccount","baseAmountRaw","quoteAmountRaw","poolKeys","txBuilder","_baseTokenAccount","baseInstruction","_quoteTokenAccount","quoteInstruction","_lpTokenAccount","lpInstruction","makeAddLiquidityInstruction","InstructionType","baseAmountMin","quoteAmountMin","baseMint","quoteMint","lpMint","removeLiquidityInstruction","clmmPoolInfo","removeLpAmount","createPositionInfo","farmInfo","userFarmLpAmount","base","payer","userAuxiliaryLedgers","tokenProgram","TOKEN_PROGRAM_ID","getEphemeralSigners","mintToAccount","item","getATAAddress","amountIn","mintBaseUseSOLBalance","Token","mintQuoteUseSOLBalance","ownerTokenAccountBaseInstruction","ownerTokenAccountQuoteInstruction","farmVersion","FARM_PROGRAM_TO_VERSION","ledger","getAssociatedLedgerAccount","ledgerInfo","ledgerData","getFarmLedgerLayout","instruction","instructionType","createAssociatedLedgerAccountInstruction","rewardTokenAccounts","rewardIsWsol","farmRewardAccount","ownerTokenAccountFarmInstruction","farmKeys","insParams","version","newInstruction","makeWithdrawInstructionV6","makeWithdrawInstructionV5","makeWithdrawInstructionV3","insType","removeIns","clmmPoolKeys","createPositionIns","ClmmInstrument","programId","marketInfo","baseMintInfo","quoteMintInfo","baseAmount","quoteAmount","startTime","ownerInfo","associatedOnly","feeDestinationId","_a","mintAUseSOLBalance","NATIVE_MINT","mintBUseSOLBalance","ownerTokenAccountBase","ownerTokenAccountQuote","getAssociatedPoolKeys","createPoolKeys","createPoolV4InstructionV2","AMM_V4","marketProgram","OPEN_BOOK_PROGRAM","FEE_DESTINATION_ID","lowestFeeMarket","assignSeed","lotSize","tickSize","_b","_c","wallet","seed","market","generatePubKey","requestQueue","eventQueue","bids","asks","baseVault","quoteVault","feeRateBps","quoteDustThreshold","getVaultOwnerAndNonce","vaultSignerNonce","vaultOwner","baseLotSize","quoteLotSize","allTxArr","makeCreateMarketInstruction","txData","splitIns","i","configId","getAssociatedConfigId","createPoolFeeLayout","propMintIn","propMintOut","mintIn","mintOut","reserves","mintDecimals","reserveIn","reserveOut","mintInDecimals","mintOutDecimals","isVersion4","currentPrice","p","getStablePrice","amountInRaw","amountOutRaw","feeRaw","BNDivCeil","LIQUIDITY_FEES_NUMERATOR","LIQUIDITY_FEES_DENOMINATOR","amountInWithFee","denominator","getDyByDxBaseIn","getDxByDyBaseIn","minAmountOutRaw","amountOut","minAmountOut","executionPrice","priceImpact","tokenIn","tokenOut","output","maxAmountInRaw","maxAmountIn","exactQuote","inputMint","inputUseSolBalance","outputUseSolBalance","inputTokenUseSolBalance","WSOLMint","outputTokenUseSolBalance","_tokenAccountIn","_tokenAccountOut","makeAMMSwapInstruction","poolIds","accounts","getMultipleAccountsInfoWithCustomFlags","poolInfos","needFetchVaults","rpc","liquidityStateV4Layout","vaultInfo","vaultAccountInfo","vaultItemInfo","AccountLayout","returnData","id","info","rpcData","computeData","toAmmComputePoolInfo","allKeys","PublicKey","BN","Decimal","AccountLayout","TOKEN_2022_PROGRAM_ID","TOKEN_PROGRAM_ID","Clmm","ModuleBase","params","poolId","props","_a","programId","owner","PublicKey","mint1","mint2","ammConfig","initialPrice","computeBudgetConfig","forerunCreate","getObserveState","txVersion","txTipConfig","feePayer","txBuilder","mintA","mintB","initPrice","BN","Decimal","initialPriceX64","SqrtPriceMath","extendMintAccount","fetchAccounts","TOKEN_2022_PROGRAM_ID","getPdaMintExAccount","r","idx","insInfo","ClmmInstrument","mockV3CreatePoolInfo","poolInfo","propPoolKeys","ownerInfo","tickLower","tickUpper","base","baseAmount","otherAmountMax","nft2022","associatedOnly","checkCreateATAOwner","withMetadata","getEphemeralSigners","ownerTokenAccountA","ownerTokenAccountB","mintAUseSOLBalance","WSOLMint","mintBUseSOLBalance","amountA","amountB","_ownerTokenAccountA","_tokenAccountAInstruction","_ownerTokenAccountB","_tokenAccountBInstruction","poolKeys","amountMaxA","amountMaxB","liquidity","makeOpenPositionInstructions","ownerPosition","ins","amountMinA","amountMinB","accountAInstructions","accountBInstructions","rewardAccounts","itemReward","rewardUseSOLBalance","ownerRewardAccount","_ownerRewardAccount","ownerRewardAccountInstructions","decreaseInsInfo","InstructionType","extInfo","closeInsInfo","CLMM_LOCK_PROGRAM_ID","authProgramId","CLMM_LOCK_AUTH_ID","poolProgramId","CLMM_PROGRAM_ID","payer","lockIns","clmmProgram","lockData","positionData","position","PositionInfoLayout","ownerMintToAccount","account","instructionParams","lockPositionId","getPdaLockClPositionIdV2","lockNftAccount","getATAAddress","TOKEN_PROGRAM_ID","tickArrayLowerStartIndex","TickUtils","tickArrayUpperStartIndex","tickArrayLower","getPdaTickArrayAddress","tickArrayUpper","protocolPosition","getPdaProtocolPositionAddress","rewardAccountsFullInfo","i","harvestLockIns","getPdaExBitmapAccount","rewardInfo","rewardMintUseSOLBalance","_baseRewardAmount","ownerRewardAccountIns","MathUtil","rewardInfos","address","ownerRewardIns","rewardMint","rewardMints","inputMint","amountIn","amountOutMin","priceLimit","observationId","remainingAccounts","baseIn","sqrtPriceLimitX64","MIN_SQRT_PRICE_X64","MAX_SQRT_PRICE_X64","outputMint","amountOut","amountInMax","allPoolInfo","allPositions","lockInfo","_b","item","allNftMints","p","mintData","getMultipleAccountsInfoWithCustomFlags","n","record","data","itemInfo","ii","itemPosition","insData","accountInfo","getPdaOperationAccount","OperationLayout","allPositionKey","acc","getPdaPersonalPositionAddress","allPosition","positionRes","poolIds","config","accounts","returnData","rpc","PoolInfoLayout","currentPrice","clmmPoolsRpcInfo","mintInfos","configSet","res","s","clmmConfigs","ClmmConfigLayout","computeClmmPoolInfo","PoolUtils","_c","_d","toApiV3Token","toFeeConfig","computePoolTickData","rpcData","mintSet","fetchMultipleMintInfos","vaultData","clmmComputeInfoToApiInfo","AccountLayout","PublicKey","AccountLayout","NATIVE_MINT","TOKEN_PROGRAM_ID","BN","Decimal","BN","checkedRem","dividend","divisor","checkedCeilDiv","rhs","quotient","remainder","ZERO","BN","ConstantProductCurve","sourceAmount","swapSourceAmount","swapDestinationAmount","invariant","newSwapSourceAmount","newSwapDestinationAmount","destinationAmountSwapped","lpTokenAmount","lpTokenSupply","swapTokenAmount0","swapTokenAmount1","roundDirection","tokenAmount0","tokenAmount1","CpmmFee","amount","tradeFeeRate","ceilDiv","FEE_RATE_DENOMINATOR_VALUE","protocolFeeRate","floorDiv","fundFeeRate","CurveCalculator","tokenAmount0","tokenAmount1","sourceAmount","swapSourceAmount","swapDestinationAmount","tradeFeeRate","tradeFee","CpmmFee","sourceAmountLessFees","destinationAmountSwapped","ConstantProductCurve","poolMintA","poolMintB","baseReserve","quoteReserve","outputMint","outputAmount","reserveInAmount","reserveOutAmount","reserveInDecimals","reserveOutDecimals","inputMint","currentPrice","Decimal","amountRealOut","BN","denominator","amountInWithoutFee","BNDivCeil","amountIn","fee","executionPrice","priceImpact","BN","Decimal","PublicKey","TransactionInstruction","Keypair","SystemProgram","ASSOCIATED_TOKEN_PROGRAM_ID","TOKEN_2022_PROGRAM_ID","TOKEN_PROGRAM_ID","AUTH_SEED","AMM_CONFIG_SEED","POOL_SEED","POOL_LP_MINT_SEED","POOL_VAULT_SEED","OBSERVATION_SEED","getPdaPoolAuthority","programId","findProgramAddress","getCpmmPdaPoolId","programId","ammConfigId","mintA","mintB","findProgramAddress","POOL_SEED","getPdaLpMint","poolId","POOL_LP_MINT_SEED","getPdaVault","mint","POOL_VAULT_SEED","getPdaObservationId","OBSERVATION_SEED","getCreatePoolKeys","propPoolId","programId","configId","mintA","mintB","authority","getPdaPoolAuthority","poolId","getCpmmPdaPoolId","lpMint","getPdaLpMint","vaultA","getPdaVault","vaultB","observationId","getPdaObservationId","LOCK_LIQUIDITY_SEED","getCpLockPda","mint","findProgramAddress","logger","createLogger","anchorDataBuf","makeCreateCpmmPoolInInstruction","programId","creator","configId","authority","poolId","mintA","mintB","lpMint","userVaultA","userVaultB","userLpAccount","vaultA","vaultB","createPoolFeeAccount","mintProgramA","mintProgramB","observationId","amountMaxA","amountMaxB","openTime","dataLayout","struct","u64","pdaPoolId","getCpmmPdaPoolId","keys","TOKEN_PROGRAM_ID","ASSOCIATED_TOKEN_PROGRAM_ID","SYSTEM_PROGRAM_ID","RENT_PROGRAM_ID","data","TransactionInstruction","makeDepositCpmmInInstruction","owner","lpAmount","TOKEN_2022_PROGRAM_ID","makeWithdrawCpmmInInstruction","amountMinA","amountMinB","MEMO_PROGRAM_ID2","makeSwapCpmmBaseInInstruction","payer","userInputAccount","userOutputAccount","inputVault","outputVault","inputTokenProgram","outputTokenProgram","inputMint","outputMint","amountIn","amounOutMin","makeSwapCpmmBaseOutInstruction","amountInMax","amountOut","makeCpmmLockInstruction","props","_a","ownerInfo","poolInfo","poolKeys","feeNftOwner","getEphemeralSigners","signers","PublicKey","nftMintAccount","_k","Keypair","nftAccount","getATAAddress","metadataAccount","getPdaMetadataKey","lockPda","getCpLockPda","userLpVault","lockLpVault","ins","cpmmLockPositionInstruction","InstructionType","auth","liquidityOwner","nftOwner","nftMint","mintLp","poolVaultA","poolVaultB","withMetadata","SystemProgram","METADATA_PROGRAM_ID","bool","aData","collectCpFeeInstruction","lpFeeAmount","cpmmProgram","cpmmAuthProgram","CREATE_CPMM_POOL_PROGRAM","CREATE_CPMM_POOL_AUTH","CpmmConfigInfoLayout","struct","blob","u8","bool","u16","u64","publicKey","seq","CpmmPoolInfoLayout","CpmmModule","ModuleBase","params","poolId","fetchConfigInfo","poolIds","accounts","getMultipleAccountsInfoWithCustomFlags","i","PublicKey","poolInfos","needFetchConfigId","needFetchVaults","item","rpc","CpmmPoolInfoLayout","configInfo","configIds","configState","configItemInfo","CpmmConfigInfoLayout","vaultInfo","vaultAccountInfo","vaultItemInfo","BN","AccountLayout","returnData","id","info","baseReserve","quoteReserve","Decimal","pools","mintInfos","acc","cur","_a","_b","_c","_d","pool","mintA","mintB","getPdaPoolAuthority","toApiV3Token","toFeeConfig","rpcData","fetchMultipleMintInfos","lpMint","TOKEN_PROGRAM_ID","mockRewardData","getPdaObservationId","programId","poolFeeAccount","startTime","ownerInfo","associatedOnly","checkCreateATAOwner","txVersion","feeConfig","computeBudgetConfig","txTipConfig","feePayer","payer","isFront","mintAAmount","mintBAmount","mintAUseSOLBalance","NATIVE_MINT","mintBUseSOLBalance","mintAPubkey","mintBPubkey","txBuilder","userVaultA","userVaultAInstruction","userVaultB","userVaultBInstruction","poolKeys","getCreatePoolKeys","makeCreateCpmmPoolInInstruction","getATAAddress","InstructionType","poolInfo","propPoolKeys","inputAmount","baseIn","slippage","computeResult","config","account","bypassAssociatedCheck","rpcPoolData","liquidity","inputAmountFee","_anotherAmount","Percent","anotherAmount","tokenAccountA","_tokenAccountAInstruction","tokenAccountB","_tokenAccountBInstruction","lpTokenAccount","_lpTokenAccount","lpInstruction","_slippage","makeDepositCpmmInInstruction","lpAmount","closeWsol","amountMintA","amountMintB","epochInfo","mintAAmountFee","mintBAmountFee","getTransferAmountFeeV2","WSOLMint","_ownerTokenAccountA","accountAInstructions","_ownerTokenAccountB","accountBInstructions","makeWithdrawCpmmInInstruction","_e","_f","fixedOut","swapResult","mintATokenAcc","mintATokenAccInstruction","mintBTokenAcc","mintBTokenAccInstruction","makeSwapCpmmBaseOutInstruction","makeSwapCpmmBaseInInstruction","feeNftOwner","insData","makeCpmmLockInstruction","LOCK_CPMM_PROGRAM","LOCK_CPMM_AUTH","lpFeeAmount","nftMint","authProgram","cpmmProgram","nftAccount","lockPda","getCpLockPda","lockLpVault","collectCpFeeInstruction","amountIn","outputMint","isBaseIn","CurveCalculator","executionPrice","minAmountOut","amount","_g","_h","_i","coefficient","_inputAmountWithoutFee","input","anotherAmountFee","BN_ZERO","lpAmountData","lpToAmount","_slippageMin","slippageAdjustedAmount","slippageAdjustedMinAmount","lp","poolAmountA","poolAmountB","supply","amountA","amountB","PublicKey","createTransferInstruction","TOKEN_PROGRAM_ID","TOKEN_2022_PROGRAM_ID","BN","Decimal","SERUM_PROGRAMID_TO_VERSION","SERUM_PROGRAM_ID_V3","SERUM_VERSION_TO_PROGRAMID","MARKET_STATE_LAYOUT_V3","struct","blob","publicKey","u64","MARKET_VERSION_TO_STATE_LAYOUT","PublicKey","logger","createLogger","Market","version","programId","SERUM_VERSION_TO_PROGRAMID","programIdString","SERUM_PROGRAMID_TO_VERSION","STATE_LAYOUT","MARKET_VERSION_TO_STATE_LAYOUT","marketId","seeds","nonce","publicKey","seedsWithNonce","PublicKey","err","PublicKey","SystemProgram","TransactionInstruction","BN","ASSOCIATED_TOKEN_PROGRAM_ID","TOKEN_2022_PROGRAM_ID","TOKEN_PROGRAM_ID","routeInstruction","programId","wallet","userSourceToken","userRouteToken","userDestinationToken","inputMint","routeMint","outputMint","poolInfoA","poolInfoB","poolKeyA","poolKeyB","amountIn","amountOut","remainingAccounts","_a","clmmPriceLimit","keys","accountMeta","TOKEN_PROGRAM_ID","TOKEN_2022_PROGRAM_ID","ASSOCIATED_TOKEN_PROGRAM_ID","SystemProgram","poolInfos","poolKeys","routeMints","index","_poolInfo","inputIsA","PublicKey","_poolKey","MEMO_PROGRAM_ID2","getPdaExBitmapAccount","clmmPriceLimitX64InsData","item","LIQUIDITY_POOL_PROGRAM_ID_V5_MODEL","isSupportIdOnly","dataLayout","struct","u8","u64","seq","u128","data","TransactionInstruction","x64Price","_m","BN","MIN_SQRT_PRICE_X64_ADD_ONE","MAX_SQRT_PRICE_X64_SUB_ONE","makeSwapInstruction","routeProgram","ownerInfo","swapInfo","_b","_c","_d","_e","_f","_g","jsonInfo2PoolKeys","sqrtPriceLimitX64","MIN_SQRT_PRICE_X64","ONE","MAX_SQRT_PRICE_X64","ClmmInstrument","poolInfo","baseIn","makeSwapCpmmBaseInInstruction","InstructionType","makeAMMSwapInstruction","poolInfo1","poolInfo2","poolKey1","poolKey2","a","ZERO","BN","TradeV2","ModuleBase","params","tokenAccounts","acc","WSOLMint","a","b","props","amount","tokenProgram","txVersion","feePayer","txBuilder","amountBN","parseBigNumberish","i","closeAccountInstruction","ins","createWSolAccountInstructions","swapInfo","swapPoolKeys","ownerInfo","computeBudgetConfig","routeProgram","amountIn","amountOut","useSolBalance","isOutputSol","inputMint","outputMint","sourceAcc","sourceAccInsParams","TOKEN_2022_PROGRAM_ID","TOKEN_PROGRAM_ID","destinationAcc","account","instructionParams","InstructionType","routeTokenAcc","middleMint","poolKeys","swapIns","makeSwapInstruction","checkTxBuilder","createTransferInstruction","transactions","programIds","amm","AMM_V4","clmm","CLMM_PROGRAM_ID","cpmm","CREATE_CPMM_POOL_PROGRAM","ammPoolsData","liquidityStateV4Layout","layoutAmm","struct","publicKey","ammData","data","layout","clmmData","PoolInfoLayout","cpmmData","CpmmPoolInfoLayout","clmmPools","ammPools","cpmmPools","PublicKey","needSimulate","needTickArray","cpmmPoolList","directPath","routePathDict","itemClmmPool","t","addLiquidityPools","itemAmmPool","itemCpmmPool","info","infoIn","infoOut","routes","mintSet","p","ammPoolsRpcInfo","ammSimulateCache","toAmmComputePoolInfo","mintInfos","cpmmPoolsRpcInfo","mintA","mintB","fetchMintInfoRes","fetchMultipleMintInfos","m","computeCpmmData","clmmPoolsRpcInfo","computeClmmPoolInfo","computePoolTickData","cur","inputTokenAmount","propOutputToken","simulateCache","tickCache","slippage","chainTime","epochInfo","feeConfig","_a","_b","_c","_d","_e","_f","_g","_h","_i","_amountInFee","_amoutIn","TokenAmount","_inFeeConfig","outputToken","solToWSol","outRoute","itemPool","e","routeMint","routeToken","maxFirstIn","routeAmountIn","toToken","iOutPool","outC","Decimal","Price","minExpirationTime","allTrade","realAmountIn","minAmountOut","expirationTime","currentPrice","executionPrice","priceImpact","fee","remainingAccounts","executionPriceX64","PoolUtils","toTokenAmount","pools","clmmRpcData","ammRpcData","clmmFetchKeys","poolId","ammFetchKeys","ammMarketFetchKeys","marketData","getMultipleAccountsInfoWithCustomFlags","itemMarketInfo","MARKET_STATE_LAYOUT_V3","Market","pool","rpcInfo","clmmKeys","ammKeys","getLiquidityAssociatedAuthority","getPdaPoolAuthority","toApiV3Token","PublicKey","Transaction","TransactionInstruction","TOKEN_PROGRAM_ID","BN","_Utils1216","ModuleBase","programId","ammId","findProgramAddress","poolId","owner","version","BN","connection","poolIds","wallet","chainTime","allPoolPda","id","allOwnerPda","itemVersion","pdaInfo","getMultipleAccountsInfo","info","index","i","itemPoolId","itemOwnerId","itemPoolInfoS","itemOwnerInfoS","itemPoolInfo","itemOwnerInfo","openTime","endTime","hasCanClaimToken","inCanClaimTime","canClaim","itemPoolToken","poolInfo","ownerInfo","feePayer","txBuilder","ownerVaultList","itemToken","account","instructionParams","Token","transaction","signers","poolInfos","tempNewVault","tempVault","instructions","forecastTransactionSize","s","Transaction","dataLayout","struct","keys","mintVault","TOKEN_PROGRAM_ID","data","aData","TransactionInstruction","Utils1216","blob","u8","u64","publicKey","seq","PublicKey","PublicKey","BN","SYSVAR_CLOCK_PUBKEY","TransactionInstruction","TOKEN_PROGRAM_ID","purchaseLayout","struct","u8","nu64","claimLayout","makeClaimInstruction","programId","instructionKeys","keys","TOKEN_PROGRAM_ID","CLOCK_PROGRAM_ID","name","pubkey","data","claimLayout","TransactionInstruction","makeClaimInstructionV4","params","poolConfig","userKeys","side","tokenAccount","vault","SYSVAR_CLOCK_PUBKEY","PROGRAM_TO_VERSION","IDO_ALL_PROGRAM","MarketV2","ModuleBase","ownerInfo","idoKeys","associatedOnly","checkCreateATAOwner","txVersion","feePayer","txBuilder","version","poolConfigKey","jsonInfo2PoolKeys","hasUnClaimedProject","hasUnClaimedBuy","BN","userProjectUseSolBalance","WSOLMint","userProjectTokenAccount","userProjectInstructionParams","buyMintUseSolBalance","userBuyTokenAccount","instructionParams","makeClaimInstruction","PublicKey","keys","makeClaimInstructionV4","LAUNCHPAD_AUTH_SEED","LAUNCHPAD_CONFIG_SEED","LAUNCHPAD_POOL_SEED","LAUNCHPAD_POOL_VAULT_SEED","LAUNCHPAD_POOL_VESTING_SEED","LAUNCHPAD_POOL_PLATFORM_SEED","getPdaLaunchpadAuth","programId","findProgramAddress","getPdaLaunchpadPoolId","programId","mintA","mintB","findProgramAddress","LAUNCHPAD_POOL_SEED","getPdaLaunchpadVaultId","poolId","mint","LAUNCHPAD_POOL_VAULT_SEED","getPdaCpiEvent","programId","findProgramAddress","getPdaPlatformId","platformAdminWallet","LAUNCHPAD_POOL_PLATFORM_SEED","getPdaVestId","poolId","owner","LAUNCHPAD_POOL_VESTING_SEED","SystemProgram","TransactionInstruction","ASSOCIATED_TOKEN_PROGRAM_ID","BN","anchorDataBuf","initialize","programId","payer","creator","configId","platformId","auth","poolId","mintA","mintB","vaultA","vaultB","metadataId","tokenProgramA","tokenProgramB","decimals","name","symbol","uri","curveParam","totalLockedAmount","cliffPeriod","unlockPeriod","dataLayout1","struct","u8","str","dataLayout3","u64","dataLayout21","dataLayout22","keys","METADATA_PROGRAM_ID","SystemProgram","RENT_PROGRAM_ID","getPdaCpiEvent","data1","data3","data2","TransactionInstruction","buyExactInInstruction","owner","userTokenAccountA","userTokenAccountB","amountB","minAmountA","shareFeeRate","shareFeeReceiver","dataLayout","data","BN","sellExactInInstruction","programId","owner","auth","configId","platformId","poolId","userTokenAccountA","userTokenAccountB","vaultA","vaultB","mintA","mintB","tokenProgramA","tokenProgramB","amountA","minAmountB","shareFeeRate","shareFeeReceiver","dataLayout","struct","u64","keys","getPdaCpiEvent","data","BN","TransactionInstruction","anchorDataBuf","createVestingAccount","programId","owner","beneficiary","poolId","vestingRecord","shareAmount","dataLayout","struct","u64","keys","SystemProgram","data","TransactionInstruction","anchorDataBuf","claimPlatformFee","platformClaimFeeWallet","auth","platformId","vaultB","userTokenAccountB","mintB","tokenProgramB","ASSOCIATED_TOKEN_PROGRAM_ID","createPlatformConfig","platformAdmin","platformLockNftWallet","cpConfigId","migrateCpLockNftScale","feeRate","name","web","img","str","updatePlatformConfig","updateInfo","u8","publicKey","NATIVE_MINT","TOKEN_PROGRAM_ID","createAssociatedTokenAccountIdempotentInstruction","BN","PublicKey","LaunchpadConfig","struct","u64","u8","u16","publicKey","seq","LaunchpadVestingSchedule","LaunchpadPool","LaunchpadVesting","PlatformConfig","BN","BN","Decimal","CurveBase","poolInfo","decimalA","decimalB","a","b","supply","totalSell","totalLockedAmount","totalFundRaising","migrateFee","amount","LaunchPadConstantProductCurve","CurveBase","poolInfo","decimalA","decimalB","Decimal","a","b","supply","totalSell","totalLockedAmount","totalFundRaising","migrateFee","allSellToken","buyAllTokenUseB","supplyMinusSellLocked","BN","tfMinusMf","numerator","denominator","x0","y0","amount","amountIn","inputReserve","outputReserve","amountOut","ceilDivBN","BN","Decimal","FixedPriceCurve","CurveBase","poolInfo","decimalA","decimalB","Decimal","a","b","supply","totalSell","totalLockedAmount","totalFundRaising","migrateFee","allSellToken","buyAllTokenUseB","supplyMinusLocked","BN","denominator","totalSellExpect","amount","amountIn","initInput","initOutput","amountOut","numerator","ceilDivBN","BN","Decimal","BN","Decimal","MathLaunch","decimals","priceX64","decimalA","decimalB","price","priceWithDecimals","LinearPriceCurve","CurveBase","poolInfo","decimalA","decimalB","Decimal","a","b","MathLaunch","supply","totalSell","totalLockedAmount","totalFundRaising","migrateFee","allSellToken","buyAllTokenUseB","supplyMinusLocked","BN","denominator","totalSellExpect","totalSellSquared","Q64","MaxU64","amount","newQuote","termInsideSqrt","newBase","newBaseSquared","_newQuoteDiv","_newQuoteMod","newB","sqrtTerm","Decimal","Curve","curveType","pointCount","poolInfo","supply","totalFundRaising","totalSell","totalLockedAmount","migrateFee","decimalA","decimalB","curve","initParam","initPrice","itemStepBuy","BN","zero","returnPoints","a","b","realA","realB","i","amountB","itemBuy","nowPoolPrice","decimals","config","migrateType","FEE_RATE_DENOMINATOR_VALUE","minSellA","amountMigrate","minAmountMigrate","migrateAmountA","liquidity","minLockLp","protocolFeeRate","platformFeeRate","shareFeeRate","feeRate","_totalFee","amountLessFeeB","_amountA","remainingAmountA","amountA","realAmountB","totalFee","splitFee","realAmountA","amountInLessFeeB","totalFeeRate","amountOutWithFeeB","platformFee","shareFee","protocolFee","amount","ceilDiv","postFeeAmount","numerator","denominator","LaunchPadConstantProductCurve","FixedPriceCurve","LinearPriceCurve","Decimal","LaunchpadPoolInitParam","BN","PublicKey","SLIPPAGE_UNIT","LaunchpadModule","ModuleBase","params","programId","LAUNCHPAD_PROGRAM","authProgramId","platformId","mintA","decimals","mintBDecimals","name","symbol","uri","migrateType","configId","propConfigInfo","platformFeeRate","txVersion","computeBudgetConfig","txTipConfig","feePayer","buyAmount","minMintAAmount","slippage","associatedOnly","checkCreateATAOwner","extraSigners","extraConfigs","_a","_b","_c","_d","_e","_f","txBuilder","getPdaLaunchpadAuth","configInfo","r","LaunchpadConfig","mintB","curType","poolId","getPdaLaunchpadPoolId","vaultA","getPdaLaunchpadVaultId","vaultB","metaId","getPdaMetadataKey","supply","totalSellA","totalFundRaisingB","totalLockedAmount","defaultPlatformFeeRate","platformData","PlatformConfig","initParam","Curve","poolInfo","initCurve","c","e","initialize","TOKEN_PROGRAM_ID","outAmount","splitIns","builder","extInfo","NATIVE_MINT","propPoolInfo","propMinMintAAmount","shareFeeRate","shareFeeReceiver","userTokenAccountA","userTokenAccountB","mintBUseSOLBalance","_ownerTokenAccountA","_tokenAccountAInstruction","_ownerTokenAccountB","_tokenAccountBInstruction","poolData","LaunchpadPool","allData","getMultipleAccountsInfoWithCustomFlags","key","data","d","calculatedAmount","decimalAmountA","multiplier","shareATA","getATAAddress","createAssociatedTokenAccountIdempotentInstruction","buyExactInInstruction","sellAmount","propMinAmountB","decimalAmountB","minAmountB","sellExactInInstruction","platformAdmin","platformClaimFeeWallet","platformLockNftWallet","cpConfigId","migrateCpLockNftScale","feeRate","web","img","getPdaPlatformId","createPlatformConfig","propsPlatformId","updateInfo","updatePlatformConfig","propsMintB","propsVaultB","mintBProgram","configData","claimPlatformFee","beneficiary","shareAmount","vestingRecord","getPdaVestId","createVestingAccount","poolIdList","config","accounts","i","poolInfoMap","configKeys","item","configAccounts","configInfoMap","acc","cur","PublicKey","MintLayout","TOKEN_2022_PROGRAM_ID","TOKEN_PROGRAM_ID","TokenModule","ModuleBase","params","forceUpdate","type","mintList","blacklist","whiteList","jup","SOL_INFO","token","_a","TOKEN_2022_PROGRAM_ID","TOKEN_PROGRAM_ID","data","mint","mintStr","info","apiTokenInfo","onlineInfo","PublicKey","MintLayout","mintSymbol","fullInfo","Raydium","config","connection","cluster","owner","api","defaultChainTime","defaultChainTimeOffset","apiCacheTime","blockhashCommitment","loopMultiTxStatus","Owner","createLogger","Farm","Account","LiquidityModule","TokenModule","TradeV2","Clmm","CpmmModule","Utils1216","MarketV2","LaunchpadModule","now","_a","custom","merge","apiRequestTimeout","logCount","logRequests","urlConfigs","Api","raydium","EMPTY_OWNER","EMPTY_CONNECTION","signAllTransactions","time","data","forceUpdate","raydiumList","dataObject","e","prevFetched","jupList","t","skipCheck","isAllDisabled"]}