{"version":3,"sources":["../src/api/api.ts","../src/common/logger.ts","../src/common/utility.ts","../src/module/amount.ts","../src/common/number.ts","../src/module/formatter.ts","../src/module/fraction.ts","../src/gfx/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/bignumber.ts","../node_modules/decimal.js/decimal.mjs","../src/common/fractionUtil.ts","../src/common/txTool/txTool.ts","../src/common/txTool/txType.ts","../src/common/txTool/txUtils.ts","../src/common/txTool/lookupTable.ts","../src/common/accountInfo.ts","../src/common/owner.ts","../src/common/lodash.ts","../src/common/date.ts","../src/common/programId.ts","../src/common/pda.ts","../src/common/transfer.ts","../src/api/url.ts","../src/api/utils.ts","../src/api/type.ts","../src/gfx/client.ts","../src/common/error.ts","../src/gfx/account/account.ts","../src/gfx/moduleBase.ts","../src/gfx/account/instruction.ts","../src/gfx/account/util.ts","../src/gfx/account/layout.ts","../node_modules/@noble/hashes/src/utils.ts","../node_modules/@noble/hashes/src/_md.ts","../node_modules/@noble/hashes/src/sha2.ts","../node_modules/@noble/hashes/src/sha256.ts","../src/gfx/cpmm/cpmm.ts","../src/gfx/cpmm/curve/calculator.ts","../src/gfx/cpmm/curve/fee.ts","../src/gfx/cpmm/curve/common.ts","../src/gfx/cpmm/curve/constantProduct.ts","../src/gfx/cpmm/pda.ts","../src/gfx/cpmm/instruction.ts","../src/gfx/token/utils.ts","../src/gfx/cpmm/kamino.ts","../src/gfx/token/token.ts","../src/gfx/cpmm/type.ts","../src/gfx/cpmm/curve/oracleCalculator.ts","../src/gfx/type.ts"],"sourcesContent":["import axios, { AxiosInstance } from \"axios\";\n\nimport { createLogger, sleep } from \"../common\";\nimport { Cluster } from \"../solana\";\n\nimport {\n  ConfigInfo,\n  PaginatedPoolInfos,\n  PoolKeys,\n  GammaToken,\n  FetchPoolParams,\n  JupiterListToken,\n  ApiPoolInfo,\n} from \"./type\";\nimport { API_URLS, API_URL_CONFIG } from \"./url\";\nimport { updateReqHistory } from \"./utils\";\nimport { PublicKey } from \"@solana/web3.js\";\nimport { solToWSol } from \"../common\";\n\nconst logger = createLogger(\"Gfx_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 getConfig(id: string): Promise<ConfigInfo> {\n    const res = await this.api.get((this.urlConfigs.CONFIG || API_URLS.CONFIG) + `?id=${id}`);\n    return res.data;\n  }\n\n  async getJupTokenList(): Promise<JupiterListToken[]> {\n    return this.api.get(\"\", {\n      baseURL: this.urlConfigs.JUP_TOKEN_LIST || API_URLS.JUP_TOKEN_LIST,\n    });\n  }\n\n  async getTokenInfo(mint: (string | PublicKey)[]): Promise<GammaToken[]> {\n    const res = await this.api.get(\n      (this.urlConfigs.TOKEN_LIST || API_URLS.TOKEN_LIST) + `?ids=${mint.map((m) => m.toString()).join(\",\")}`,\n    );\n    return res.data;\n  }\n\n  async getPoolList(props: FetchPoolParams = {}): Promise<PaginatedPoolInfos> {\n    const { poolType = \"all\", sortBy = \"liquidity\", sortOrder = \"desc\", page = 1, pageSize = 100, search } = props;\n    const res = await this.api.get(\n      (this.urlConfigs.POOL_LIST || API_URLS.POOL_LIST) +\n        `?poolType=${poolType}&sortOrder=${sortOrder}&sortBy=${sortBy}&page=${page}&pageSize=${pageSize}${\n          search ? `&search=${search}` : \"\"\n        }`,\n    );\n    return res.data;\n  }\n\n  async fetchPoolById(props: { idList: string[] }): Promise<ApiPoolInfo[]> {\n    const { idList } = props;\n    const res = await this.api.get((this.urlConfigs.POOL_BY_IDS || API_URLS.POOL_BY_IDS) + `?ids=${idList.join(\",\")}`);\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_KEYS_BY_IDS || API_URLS.POOL_KEYS_BY_IDS) + `?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<PaginatedPoolInfos> {\n    const {\n      mint1: propMint1,\n      mint2: propMint2,\n      poolType = \"all\",\n      sortBy = \"liquidity\",\n      sortOrder = \"desc\",\n      page = 1,\n    } = props;\n\n    const [mint1, mint2] = [\n      propMint1 ? solToWSol(propMint1).toBase58() : propMint1,\n      propMint2 && propMint2 !== \"undefined\" ? solToWSol(propMint2).toBase58() : undefined,\n    ];\n    const [baseMint, quoteMint] = mint2 && mint1 > mint2 ? [mint2, mint1] : [mint1, mint2];\n\n    // Build the query string\n    const queryParams = new URLSearchParams({\n      mint1: baseMint || \"\",\n      poolType,\n      sortBy,\n      sortOrder,\n      pageSize: \"100\",\n      page: String(page),\n    });\n\n    if (quoteMint) {\n      queryParams.append(\"mint2\", quoteMint);\n    }\n\n    const url = (this.urlConfigs.POOL_BY_MINTS || API_URLS.POOL_BY_MINTS) + `?${queryParams.toString()}`;\n\n    const res = await this.api.get(url);\n    return res.data;\n  }\n}\n","import { get, set } from \"lodash\";\n\nexport type ModuleName = \"Common.Api\";\n\nexport enum LogLevel {\n  Error,\n  Warning,\n  Info,\n  Debug,\n}\nexport class Logger {\n  private logLevel: LogLevel;\n  private name: string;\n  constructor(params: { name: string; logLevel?: LogLevel }) {\n    this.logLevel = params.logLevel !== undefined ? params.logLevel : LogLevel.Error;\n    this.name = params.name;\n  }\n\n  set level(logLevel: LogLevel) {\n    this.logLevel = logLevel;\n  }\n  get time(): string {\n    return Date.now().toString();\n  }\n  get moduleName(): string {\n    return this.name;\n  }\n\n  private isLogLevel(level: LogLevel): boolean {\n    return level <= this.logLevel;\n  }\n\n  public error(...props: unknown[]): 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: unknown[]): 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: unknown[]): 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: unknown[]): 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: unknown[]): Logger {\n    if (!this.isLogLevel(LogLevel.Debug)) return this;\n    console.debug(this.time, this.name, \"sdk logger debug\", ...props);\n    return this;\n  }\n}\n\nconst moduleLoggers: { [key in ModuleName]?: Logger } = {};\nconst moduleLevels: { [key in ModuleName]?: LogLevel } = {};\n\nexport function createLogger(moduleName: string): Logger {\n  let logger = get(moduleLoggers, moduleName);\n  if (!logger) {\n    // default level is error\n    const logLevel = get(moduleLevels, moduleName);\n\n    logger = new Logger({ name: moduleName, logLevel });\n    set(moduleLoggers, moduleName, logger);\n  }\n\n  return logger;\n}\n\nexport function setLoggerLevel(moduleName: string, level: LogLevel): void {\n  set(moduleLevels, moduleName, level);\n\n  const logger = get(moduleLoggers, moduleName);\n  if (logger) logger.level = level;\n}\n","import { PublicKey } from \"@solana/web3.js\";\nimport BN from \"bn.js\";\n\nimport { Fraction, Percent, Price, Token, TokenAmount } from \"../module\";\nimport { ReplaceType } from \"../gfx/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  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) as any as ReplaceType<T, string, PublicKey>;\n}\n","import _Big from \"big.js\";\nimport BN from \"bn.js\";\n\nimport { BigNumberish, BN_TEN, parseBigNumberish, Rounding } from \"../common/number\";\n\nimport { createLogger, Logger } from \"../common/logger\";\n\nimport toFormat, { WrappedBig } from \"./formatter\";\nimport { Fraction } from \"./fraction\";\nimport { Token } from \"./token\";\nimport { Currency } from \"./currency\";\n\nconst logger = createLogger(\"Gfx_amount\");\n\nconst Big = toFormat(_Big);\ntype Big = WrappedBig;\n\nexport function splitNumber(num: string, decimals: number): [string, string] {\n  let integral = \"0\";\n  let fractional = \"0\";\n\n  if (num.includes(\".\")) {\n    const splited = num.split(\".\");\n    if (splited.length === 2) {\n      [integral, fractional] = splited;\n      fractional = fractional.padEnd(decimals, \"0\");\n    } else {\n      logger.logWithError(`invalid number string, num: ${num}`);\n    }\n  } else {\n    integral = num;\n  }\n\n  // fix decimals is 0\n  return [integral, fractional.slice(0, decimals) || fractional];\n}\n\nexport class TokenAmount extends Fraction {\n  public readonly token: Token;\n  protected logger: Logger;\n\n  public constructor(token: Token, amount: BigNumberish, isRaw = true, name?: string) {\n    let parsedAmount = new BN(0);\n    const multiplier = BN_TEN.pow(new BN(token.decimals));\n\n    if (isRaw) {\n      parsedAmount = parseBigNumberish(amount);\n    } else {\n      let integralAmount = new BN(0);\n      let fractionalAmount = new BN(0);\n\n      // parse fractional string\n      if (typeof amount === \"string\" || typeof amount === \"number\" || typeof amount === \"bigint\") {\n        const [integral, fractional] = splitNumber(amount.toString(), token.decimals);\n        integralAmount = parseBigNumberish(integral);\n        fractionalAmount = parseBigNumberish(fractional);\n      }\n\n      integralAmount = integralAmount.mul(multiplier);\n      parsedAmount = integralAmount.add(fractionalAmount);\n    }\n\n    super(parsedAmount, multiplier);\n    this.logger = createLogger(name || \"TokenAmount\");\n    this.token = token;\n  }\n\n  public get raw(): BN {\n    return this.numerator;\n  }\n  public isZero(): boolean {\n    return this.raw.isZero();\n  }\n  public gt(other: TokenAmount): boolean {\n    if (!this.token.equals(other.token)) this.logger.logWithError(\"gt token not equals\");\n    return this.raw.gt(other.raw);\n  }\n\n  /**\n   * a less than b\n   */\n  public lt(other: TokenAmount): boolean {\n    if (!this.token.equals(other.token)) this.logger.logWithError(\"lt token not equals\");\n    return this.raw.lt(other.raw);\n  }\n\n  public add(other: TokenAmount): TokenAmount {\n    if (!this.token.equals(other.token)) this.logger.logWithError(\"add token not equals\");\n    return new TokenAmount(this.token, this.raw.add(other.raw));\n  }\n\n  public subtract(other: TokenAmount): TokenAmount {\n    if (!this.token.equals(other.token)) this.logger.logWithError(\"sub token not equals\");\n    return new TokenAmount(this.token, this.raw.sub(other.raw));\n  }\n\n  public toSignificant(\n    significantDigits = this.token.decimals,\n    format?: object,\n    rounding: Rounding = Rounding.ROUND_DOWN,\n  ): string {\n    return super.toSignificant(significantDigits, format, rounding);\n  }\n\n  /**\n   * To fixed\n   *\n   * @example\n   * ```\n   * 1 -> 1.000000000\n   * 1.234 -> 1.234000000\n   * 1.123456789876543 -> 1.123456789\n   * ```\n   */\n  public toFixed(\n    decimalPlaces = this.token.decimals,\n    format?: object,\n    rounding: Rounding = Rounding.ROUND_DOWN,\n  ): string {\n    if (decimalPlaces > this.token.decimals) this.logger.logWithError(\"decimals overflow\");\n    return super.toFixed(decimalPlaces, format, rounding);\n  }\n\n  /**\n   * To exact\n   *\n   * @example\n   * ```\n   * 1 -> 1\n   * 1.234 -> 1.234\n   * 1.123456789876543 -> 1.123456789\n   * ```\n   */\n  public toExact(format: object = { groupSeparator: \"\" }): string {\n    Big.DP = this.token.decimals;\n    return new Big(this.numerator.toString()).div(this.denominator.toString()).toFormat(format);\n  }\n}\n\nexport class CurrencyAmount extends Fraction {\n  public readonly currency: Currency;\n  protected logger: Logger;\n\n  public constructor(currency: Currency, amount: BigNumberish, isRaw = true, name?: string) {\n    let parsedAmount = new BN(0);\n    const multiplier = BN_TEN.pow(new BN(currency.decimals));\n\n    if (isRaw) {\n      parsedAmount = parseBigNumberish(amount);\n    } else {\n      let integralAmount = new BN(0);\n      let fractionalAmount = new BN(0);\n\n      // parse fractional string\n      if (typeof amount === \"string\" || typeof amount === \"number\" || typeof amount === \"bigint\") {\n        const [integral, fractional] = splitNumber(amount.toString(), currency.decimals);\n        integralAmount = parseBigNumberish(integral);\n        fractionalAmount = parseBigNumberish(fractional);\n      }\n\n      integralAmount = integralAmount.mul(multiplier);\n      parsedAmount = integralAmount.add(fractionalAmount);\n    }\n\n    super(parsedAmount, multiplier);\n    this.logger = createLogger(name || \"TokenAmount\");\n    this.currency = currency;\n  }\n\n  public get raw(): BN {\n    return this.numerator;\n  }\n\n  public isZero(): boolean {\n    return this.raw.isZero();\n  }\n\n  /**\n   * a greater than b\n   */\n  public gt(other: CurrencyAmount): boolean {\n    if (!this.currency.equals(other.currency)) this.logger.logWithError(\"gt currency not equals\");\n    return this.raw.gt(other.raw);\n  }\n\n  /**\n   * a less than b\n   */\n  public lt(other: CurrencyAmount): boolean {\n    if (!this.currency.equals(other.currency)) this.logger.logWithError(\"lt currency not equals\");\n    return this.raw.lt(other.raw);\n  }\n\n  public add(other: CurrencyAmount): CurrencyAmount {\n    if (!this.currency.equals(other.currency)) this.logger.logWithError(\"add currency not equals\");\n    return new CurrencyAmount(this.currency, this.raw.add(other.raw));\n  }\n\n  public sub(other: CurrencyAmount): CurrencyAmount {\n    if (!this.currency.equals(other.currency)) this.logger.logWithError(\"sub currency not equals\");\n    return new CurrencyAmount(this.currency, this.raw.sub(other.raw));\n  }\n\n  public toSignificant(\n    significantDigits = this.currency.decimals,\n    format?: object,\n    rounding: Rounding = Rounding.ROUND_DOWN,\n  ): string {\n    return super.toSignificant(significantDigits, format, rounding);\n  }\n\n  /**\n   * To fixed\n   *\n   * @example\n   * ```\n   * 1 -> 1.000000000\n   * 1.234 -> 1.234000000\n   * 1.123456789876543 -> 1.123456789\n   * ```\n   */\n  public toFixed(\n    decimalPlaces = this.currency.decimals,\n    format?: object,\n    rounding: Rounding = Rounding.ROUND_DOWN,\n  ): string {\n    if (decimalPlaces > this.currency.decimals) this.logger.logWithError(\"decimals overflow\");\n\n    return super.toFixed(decimalPlaces, format, rounding);\n  }\n\n  /**\n   * To exact\n   *\n   * @example\n   * ```\n   * 1 -> 1\n   * 1.234 -> 1.234\n   * 1.123456789876543 -> 1.123456789\n   * ```\n   */\n  public toExact(format: object = { groupSeparator: \"\" }): string {\n    Big.DP = this.currency.decimals;\n    return new Big(this.numerator.toString()).div(this.denominator.toString()).toFormat(format);\n  }\n}\n","import BN from \"bn.js\";\nimport { createLogger } from \"./logger\";\n\nexport enum Rounding {\n  ROUND_DOWN,\n  ROUND_HALF_UP,\n  ROUND_UP,\n}\n\nexport const BN_ZERO = new BN(0);\nexport const BN_ONE = new BN(1);\nexport const BN_TWO = new BN(2);\nexport const BN_THREE = new BN(3);\nexport const BN_FIVE = new BN(5);\nexport const BN_TEN = new BN(10);\nexport const BN_100 = new BN(100);\nexport const BN_1000 = new BN(1000);\nexport const BN_10000 = new BN(10000);\nexport type BigNumberish = BN | string | number | bigint;\n\nconst MAX_SAFE = 0x1fffffffffffff;\n\nexport function parseBigNumberish(value: BigNumberish): BN {\n  const logger = createLogger(\"Gfx_parseBigNumberish\");\n  // BN\n  if (value instanceof BN) {\n    return value;\n  }\n\n  if (typeof value === \"string\") {\n    if (value.match(/^-?[0-9]+$/)) {\n      return new BN(value);\n    }\n    logger.logWithError(`invalid BigNumberish string: ${value}`);\n  }\n\n  if (typeof value === \"number\") {\n    if (value % 1) {\n      logger.logWithError(`BigNumberish number underflow: ${value}`);\n    }\n\n    if (value >= MAX_SAFE || value <= -MAX_SAFE) {\n      logger.logWithError(`BigNumberish number overflow: ${value}`);\n    }\n\n    return new BN(String(value));\n  }\n\n  if (typeof value === \"bigint\") {\n    return new BN(value.toString());\n  }\n  logger.error(`invalid BigNumberish value: ${value}`);\n  return new BN(0); // never reach, because logWithError will throw error\n}\n\nexport function tenExponential(shift: BigNumberish): BN {\n  return BN_TEN.pow(parseBigNumberish(shift));\n}\n","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, parseBigNumberish, Rounding } from \"../common/number\";\n\nimport { createLogger } from \"../common/logger\";\n\nimport toFormat, { WrappedBig } from \"./formatter\";\n\nconst logger = createLogger(\"module/fraction\");\n\nconst Big = toFormat(_Big);\ntype Big = WrappedBig;\n\nconst Decimal = toFormat(_Decimal);\n\nconst toSignificantRounding = {\n  [Rounding.ROUND_DOWN]: Decimal.ROUND_DOWN,\n  [Rounding.ROUND_HALF_UP]: Decimal.ROUND_HALF_UP,\n  [Rounding.ROUND_UP]: Decimal.ROUND_UP,\n};\n\nconst toFixedRounding = {\n  [Rounding.ROUND_DOWN]: _Big.roundDown,\n  [Rounding.ROUND_HALF_UP]: _Big.roundHalfUp,\n  [Rounding.ROUND_UP]: _Big.roundUp,\n};\n\nexport class Fraction {\n  public readonly numerator: BN;\n  public readonly denominator: BN;\n\n  public constructor(numerator: BigNumberish, denominator: BigNumberish = new BN(1)) {\n    this.numerator = parseBigNumberish(numerator);\n    this.denominator = parseBigNumberish(denominator);\n  }\n\n  public get quotient(): BN {\n    return this.numerator.div(this.denominator);\n  }\n\n  public invert(): Fraction {\n    return new Fraction(this.denominator, this.numerator);\n  }\n\n  public add(other: Fraction | BigNumberish): Fraction {\n    const otherParsed = other instanceof Fraction ? other : new Fraction(parseBigNumberish(other));\n\n    if (this.denominator.eq(otherParsed.denominator)) {\n      return new Fraction(this.numerator.add(otherParsed.numerator), this.denominator);\n    }\n\n    return new Fraction(\n      this.numerator.mul(otherParsed.denominator).add(otherParsed.numerator.mul(this.denominator)),\n      this.denominator.mul(otherParsed.denominator),\n    );\n  }\n\n  public sub(other: Fraction | BigNumberish): Fraction {\n    const otherParsed = other instanceof Fraction ? other : new Fraction(parseBigNumberish(other));\n\n    if (this.denominator.eq(otherParsed.denominator)) {\n      return new Fraction(this.numerator.sub(otherParsed.numerator), this.denominator);\n    }\n\n    return new Fraction(\n      this.numerator.mul(otherParsed.denominator).sub(otherParsed.numerator.mul(this.denominator)),\n      this.denominator.mul(otherParsed.denominator),\n    );\n  }\n\n  public mul(other: Fraction | BigNumberish): Fraction {\n    const otherParsed = other instanceof Fraction ? other : new Fraction(parseBigNumberish(other));\n\n    return new Fraction(this.numerator.mul(otherParsed.numerator), this.denominator.mul(otherParsed.denominator));\n  }\n\n  public div(other: Fraction | BigNumberish): Fraction {\n    const otherParsed = other instanceof Fraction ? other : new Fraction(parseBigNumberish(other));\n\n    return new Fraction(this.numerator.mul(otherParsed.denominator), this.denominator.mul(otherParsed.numerator));\n  }\n\n  public toSignificant(\n    significantDigits: number,\n    format: object = { groupSeparator: \"\" },\n    rounding: Rounding = Rounding.ROUND_HALF_UP,\n  ): string {\n    if (!Number.isInteger(significantDigits)) logger.logWithError(`${significantDigits} is not an integer.`);\n    if (significantDigits <= 0) logger.logWithError(`${significantDigits} is not positive.`);\n\n    Decimal.set({ precision: significantDigits + 1, rounding: toSignificantRounding[rounding] });\n    const quotient = new Decimal(this.numerator.toString())\n      .div(this.denominator.toString())\n      .toSignificantDigits(significantDigits);\n    return quotient.toFormat(quotient.decimalPlaces(), format);\n  }\n\n  public toFixed(\n    decimalPlaces: number,\n    format: object = { groupSeparator: \"\" },\n    rounding: Rounding = Rounding.ROUND_HALF_UP,\n  ): string {\n    if (!Number.isInteger(decimalPlaces)) logger.logWithError(`${decimalPlaces} is not an integer.`);\n    if (decimalPlaces < 0) logger.logWithError(`${decimalPlaces} is negative.`);\n\n    Big.DP = decimalPlaces;\n    Big.RM = toFixedRounding[rounding] || 1;\n    return new Big(this.numerator.toString()).div(this.denominator.toString()).toFormat(decimalPlaces, format);\n  }\n\n  public isZero(): boolean {\n    return this.numerator.isZero();\n  }\n}\n","import { TOKEN_PROGRAM_ID } from \"@solana/spl-token\";\nimport { TokenInfo } from \"./type\";\n\nexport const SOL_INFO: TokenInfo = {\n  address: \"So11111111111111111111111111111111111111112\",\n  programId: TOKEN_PROGRAM_ID.toBase58(),\n  decimals: 9,\n  symbol: \"SOL\",\n  name: \"solana\",\n  logoURI: ``,\n  tags: [],\n  priority: 2,\n  type: \"goose-fx\",\n  extensions: {\n    coingeckoId: \"solana\",\n  },\n};\n\nexport const TOKEN_WSOL: TokenInfo = {\n  address: \"So11111111111111111111111111111111111111112\",\n  programId: TOKEN_PROGRAM_ID.toBase58(),\n  decimals: 9,\n  symbol: \"WSOL\",\n  name: \"Wrapped SOL\",\n  logoURI: ``,\n  tags: [],\n  priority: 2,\n  type: \"goose-fx\",\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 \"../gfx/token/constant\";\n\n/**\n * A token is any fungible financial instrument on Solana, including SOL and all SPL tokens.\n */\nexport interface TokenProps {\n  mint: PublicKeyish;\n  decimals: number;\n  symbol?: string;\n  name?: string;\n  skipMint?: boolean;\n  isToken2022?: boolean;\n}\n\nexport class Token {\n  public readonly symbol?: string;\n  public readonly name?: string;\n  public readonly decimals: number;\n  public readonly isToken2022: boolean;\n\n  public readonly mint: PublicKey;\n  public static readonly WSOL: Token = new Token({\n    ...TOKEN_WSOL,\n    mint: TOKEN_WSOL.address,\n  });\n\n  /**\n   *\n   * @param mint - pass \"sol\" as mint will auto generate wsol token config\n   */\n  public constructor({ mint, decimals, symbol, name, skipMint = false, isToken2022 = false }: TokenProps) {\n    if (mint === SOLMint.toBase58() || (mint instanceof PublicKey && SOLMint.equals(mint))) {\n      this.decimals = TOKEN_WSOL.decimals;\n      this.symbol = TOKEN_WSOL.symbol;\n      this.name = TOKEN_WSOL.name;\n      this.mint = new PublicKey(TOKEN_WSOL.address);\n      this.isToken2022 = false;\n      return;\n    }\n\n    this.decimals = decimals;\n    this.symbol = symbol || mint.toString().substring(0, 6);\n    this.name = name || mint.toString().substring(0, 6);\n    this.mint = skipMint ? PublicKey.default : validateAndParsePublicKey({ publicKey: mint });\n    this.isToken2022 = isToken2022;\n  }\n\n  public equals(other: Token): boolean {\n    // short circuit on reference equality\n    if (this === other) {\n      return true;\n    }\n    return this.mint.equals(other.mint);\n  }\n}\n","import { TOKEN_PROGRAM_ID } from \"@solana/spl-token\";\nimport { AccountMeta, PublicKey, SystemProgram, SYSVAR_RENT_PUBKEY } from \"@solana/web3.js\";\n\ninterface AccountMetaProps {\n  pubkey: PublicKey;\n  isSigner?: boolean;\n  isWritable?: boolean;\n}\n\nexport function accountMeta({ pubkey, isSigner = false, isWritable = true }: AccountMetaProps): AccountMeta {\n  return {\n    pubkey,\n    isWritable,\n    isSigner,\n  };\n}\n\nexport const commonSystemAccountMeta = [\n  accountMeta({ pubkey: TOKEN_PROGRAM_ID, isWritable: false }),\n  accountMeta({ pubkey: SystemProgram.programId, isWritable: false }),\n  accountMeta({ pubkey: SYSVAR_RENT_PUBKEY, isWritable: false }),\n];\n\nexport type PublicKeyish = PublicKey | string;\n\nexport function validateAndParsePublicKey({\n  publicKey: orgPubKey,\n  transformSol,\n}: {\n  publicKey: PublicKeyish;\n  transformSol?: boolean;\n}): PublicKey {\n  const publicKey = tryParsePublicKey(orgPubKey.toString());\n\n  if (publicKey instanceof PublicKey) {\n    if (transformSol && publicKey.equals(SOLMint)) return WSOLMint;\n    return publicKey;\n  }\n\n  if (transformSol && publicKey.toString() === SOLMint.toBase58()) return WSOLMint;\n\n  if (typeof publicKey === \"string\") {\n    if (publicKey === PublicKey.default.toBase58()) return PublicKey.default;\n    try {\n      const key = new PublicKey(publicKey);\n      return key;\n    } catch {\n      throw new Error(\"invalid public key\");\n    }\n  }\n\n  throw new Error(\"invalid public key\");\n}\n\nexport function tryParsePublicKey(v: string): PublicKey | string {\n  try {\n    return new PublicKey(v);\n  } catch (e) {\n    return v;\n  }\n}\n\nexport const MEMO_PROGRAM_ID = new PublicKey(\"MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr\");\nexport const MEMO_PROGRAM_ID2 = new PublicKey(\"MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr\");\nexport const RENT_PROGRAM_ID = new PublicKey(\"SysvarRent111111111111111111111111111111111\");\nexport const CLOCK_PROGRAM_ID = new PublicKey(\"SysvarC1ock11111111111111111111111111111111\");\nexport const METADATA_PROGRAM_ID = new PublicKey(\"metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s\");\nexport const INSTRUCTION_PROGRAM_ID = new PublicKey(\"Sysvar1nstructions1111111111111111111111111\");\nexport const SYSTEM_PROGRAM_ID = SystemProgram.programId;\n\nexport const RAYMint = new PublicKey(\"4k3Dyjzvzp8eMZWUXbBCjEvwSkkk59S5iCNLY3QrkX6R\");\nexport const PAIMint = new PublicKey(\"Ea5SjE2Y6yvCeW5dYTn7PYMuW5ikXkvbGdcmSnXeaLjS\");\nexport const SRMMint = new PublicKey(\"SRMuApVNdxXokk5GT7XD5cUUgXMBCoAz2LHeuAoKWRt\");\nexport const USDCMint = new PublicKey(\"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v\");\nexport const USDTMint = new PublicKey(\"Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB\");\nexport const mSOLMint = new PublicKey(\"mSoLzYCxHdYgdzU16g5QSh3i5K3z3KZK7ytfqcJm7So\");\nexport const stSOLMint = new PublicKey(\"7dHbWXmci3dT8UFYWYZweBLXgycu7Y3iL6trKn1Y7ARj\");\nexport const USDHMint = new PublicKey(\"USDH1SM1ojwWUga67PGrgFWUHibbjqMvuMaDkRJTgkX\");\nexport const NRVMint = new PublicKey(\"NRVwhjBQiUPYtfDT5zRBVJajzFQHaBUNtC7SNVvqRFa\");\nexport const ANAMint = new PublicKey(\"ANAxByE6G2WjFp7A4NqtWYXb3mgruyzZYg3spfxe6Lbo\");\nexport const ETHMint = new PublicKey(\"7vfCXTUXx5WJV5JADk17DUJ4ksgau7utNKj4b963voxs\");\nexport const WSOLMint = new PublicKey(\"So11111111111111111111111111111111111111112\");\nexport const SOLMint = PublicKey.default;\n\nexport function solToWSol(mint: PublicKeyish): PublicKey {\n  return validateAndParsePublicKey({ publicKey: mint, transformSol: true });\n}\n","import { SOL_INFO } from \"../gfx/token/constant\";\n\nimport { Token } from \"./token\";\n\ninterface CurrencyProps {\n  decimals: number;\n  symbol?: string;\n  name?: string;\n}\n/**\n * A currency is any fungible financial instrument on Solana, including SOL and all SPL tokens.\n * The only instance of the base class `Currency` is SOL.\n */\nexport class Currency {\n  public readonly symbol?: string;\n  public readonly name?: string;\n  public readonly decimals: number;\n\n  /**\n   * The only instance of the base class `Currency`.\n   */\n  public static readonly SOL: Currency = new Currency(SOL_INFO);\n\n  /**\n   * Constructs an instance of the base class `Currency`. The only instance of the base class `Currency` is `Currency.SOL`.\n   * @param decimals - decimals of the currency\n   * @param symbol - symbol of the currency\n   * @param name - name of the currency\n   */\n  public constructor({ decimals, symbol = \"UNKNOWN\", name = \"UNKNOWN\" }: CurrencyProps) {\n    this.decimals = decimals;\n    this.symbol = symbol;\n    this.name = name;\n  }\n\n  public equals(other: Currency): boolean {\n    return this === other;\n  }\n}\n\n/**\n * Compares two currencies for equality\n */\nexport function currencyEquals(currencyA: Currency, currencyB: Currency): boolean {\n  if (currencyA instanceof Token && currencyB instanceof Token) {\n    return currencyA.equals(currencyB);\n  } else if (currencyA instanceof Token || currencyB instanceof Token) {\n    return false;\n  } else {\n    return currencyA === currencyB;\n  }\n}\n","import { Rounding } from \"../common/number\";\nimport BN from \"bn.js\";\nimport { Fraction } from \"./fraction\";\n\nexport const _100_PERCENT = new Fraction(new BN(100));\n\nexport class Percent extends Fraction {\n  public toSignificant(significantDigits = 5, format?: object, rounding?: Rounding): string {\n    return this.mul(_100_PERCENT).toSignificant(significantDigits, format, rounding);\n  }\n\n  public toFixed(decimalPlaces = 2, format?: object, rounding?: Rounding): string {\n    return this.mul(_100_PERCENT).toFixed(decimalPlaces, format, rounding);\n  }\n}\n","import { BigNumberish, Rounding, tenExponential } from \"../common/number\";\nimport { createLogger } from \"../common/logger\";\n\nimport { Fraction } from \"./fraction\";\nimport { Token } from \"./token\";\n\nconst logger = createLogger(\"Ray_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 BN from \"bn.js\";\nimport Decimal from \"decimal.js\";\nimport { Token } from \"../module/token\";\nimport { Price } from \"../module/price\";\nimport { Currency } from \"../module/currency\";\nimport { TokenAmount, CurrencyAmount } from \"../module/amount\";\nimport { Fraction } from \"../module/fraction\";\nimport { Percent } from \"../module/percent\";\nimport { SplToken, TokenJson } from \"../gfx/token/type\";\nimport { ReplaceType } from \"../gfx/type\";\nimport { mul } from \"./fractionUtil\";\nimport { notInnerObject } from \"./utility\";\nimport { BigNumberish, BN_ZERO, BN_TEN } from \"./number\";\n\nexport type Numberish = number | string | bigint | Fraction | BN;\n\n/**\n *\n * @example\n * getIntInfo(0.34) => { numerator: '34', denominator: '100'}\n * getIntInfo('0.34') //=> { numerator: '34', denominator: '100'}\n */\nexport function parseNumberInfo(n: Numberish | undefined): {\n  denominator: string;\n  numerator: string;\n  sign?: string;\n  int?: string;\n  dec?: string;\n} {\n  if (n === undefined) return { denominator: \"1\", numerator: \"0\" };\n  if (n instanceof BN) {\n    return { numerator: n.toString(), denominator: \"1\" };\n  }\n\n  if (n instanceof Fraction) {\n    return { denominator: n.denominator.toString(), numerator: n.numerator.toString() };\n  }\n\n  const s = String(n);\n  const [, sign = \"\", int = \"\", dec = \"\"] = s.replace(\",\", \"\").match(/(-?)(\\d*)\\.?(\\d*)/) ?? [];\n  const denominator = \"1\" + \"0\".repeat(dec.length);\n  const numerator = sign + (int === \"0\" ? \"\" : int) + dec || \"0\";\n  return { denominator, numerator, sign, int, dec };\n}\n\n// round up\nexport function divCeil(a: BN, b: BN): BN {\n  // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n  // @ts-ignore\n  const dm = a.divmod(b);\n\n  // Fast case - exact division\n  if (dm.mod.isZero()) return dm.div;\n\n  // Round up\n  return dm.div.isNeg() ? dm.div.isubn(1) : dm.div.iaddn(1);\n}\n\nexport function shakeFractionDecimal(n: Fraction): string {\n  const [, sign = \"\", int = \"\"] = n.toFixed(2).match(/(-?)(\\d*)\\.?(\\d*)/) ?? [];\n  return `${sign}${int}`;\n}\n\nexport function toBN(n: Numberish, decimal: BigNumberish = 0): BN {\n  if (n instanceof BN) return n;\n  return new BN(shakeFractionDecimal(toFraction(n).mul(BN_TEN.pow(new BN(String(decimal))))));\n}\n\nexport function toFraction(value: Numberish): Fraction {\n  //  to complete math format(may have decimal), not int\n  if (value instanceof Percent) return new Fraction(value.numerator, value.denominator);\n\n  if (value instanceof Price) return value.adjusted;\n\n  // to complete math format(may have decimal), not BN\n  if (value instanceof TokenAmount)\n    try {\n      return toFraction(value.toExact());\n    } catch {\n      return new Fraction(BN_ZERO);\n    }\n\n  // do not ideal with other fraction value\n  if (value instanceof Fraction) return value;\n\n  // wrap to Fraction\n  const n = String(value);\n  const details = parseNumberInfo(n);\n  return new Fraction(details.numerator, details.denominator);\n}\n\n/**\n * @example\n * toPercent(3.14) // => Percent { 314.00% }\n * toPercent(3.14, { alreadyDecimaled: true }) // => Percent {3.14%}\n */\nexport function toPercent(\n  n: Numberish,\n  options?: { /* usually used for backend data */ alreadyDecimaled?: boolean },\n): Percent {\n  const { numerator, denominator } = parseNumberInfo(n);\n  return new Percent(new BN(numerator), new BN(denominator).mul(options?.alreadyDecimaled ? new BN(100) : new BN(1)));\n}\n\nexport function toTokenPrice(params: {\n  token: TokenJson | Token | SplToken;\n  numberPrice: Numberish;\n  decimalDone?: boolean;\n}): Price {\n  const { token, numberPrice, decimalDone } = params;\n  const usdCurrency = new Token({ mint: \"\", decimals: 6, symbol: \"usd\", name: \"usd\", skipMint: true });\n  const { numerator, denominator } = parseNumberInfo(numberPrice);\n  const parsedNumerator = decimalDone ? new BN(numerator).mul(BN_TEN.pow(new BN(token.decimals))) : numerator;\n  const parsedDenominator = new BN(denominator).mul(BN_TEN.pow(new BN(usdCurrency.decimals)));\n\n  return new Price({\n    baseToken: usdCurrency,\n    denominator: parsedDenominator.toString(),\n    quoteToken: new Token({ ...token, skipMint: true, mint: \"\" }),\n    numerator: parsedNumerator.toString(),\n  });\n}\n\nexport function toUsdCurrency(amount: Numberish): CurrencyAmount {\n  const usdCurrency = new Currency({ decimals: 6, symbol: \"usd\", name: \"usd\" });\n  const amountBigNumber = toBN(mul(amount, 10 ** usdCurrency.decimals)!);\n  return new CurrencyAmount(usdCurrency, amountBigNumber);\n}\n\nexport function toTotalPrice(amount: Numberish | undefined, price: Price | undefined): CurrencyAmount {\n  if (!price || !amount) return toUsdCurrency(0);\n  return toUsdCurrency(mul(amount, price)!);\n}\n\nexport function decimalToFraction(n: Decimal | undefined): Fraction | undefined {\n  if (n == null) return undefined;\n  const { numerator, denominator } = parseNumberInfo(n.toString());\n  return new Fraction(numerator, denominator);\n}\n\nexport function isDecimal(val: unknown): boolean {\n  return val instanceof Decimal;\n}\n\nexport function recursivelyDecimalToFraction<T>(info: T): ReplaceType<T, Decimal, Fraction> {\n  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) as any as ReplaceType<T, Decimal, Fraction>;\n}\n","/*!\r\n *  decimal.js v10.4.3\r\n *  An arbitrary-precision Decimal type for JavaScript.\r\n *  https://github.com/MikeMcl/decimal.js\r\n *  Copyright (c) 2022 Michael Mclaughlin <M8ch88l@gmail.com>\r\n *  MIT Licence\r\n */\r\n\r\n\r\n// -----------------------------------  EDITABLE DEFAULTS  ------------------------------------ //\r\n\r\n\r\n  // The maximum exponent magnitude.\r\n  // The limit on the value of `toExpNeg`, `toExpPos`, `minE` and `maxE`.\r\nvar EXP_LIMIT = 9e15,                      // 0 to 9e15\r\n\r\n  // The limit on the value of `precision`, and on the value of the first argument to\r\n  // `toDecimalPlaces`, `toExponential`, `toFixed`, `toPrecision` and `toSignificantDigits`.\r\n  MAX_DIGITS = 1e9,                        // 0 to 1e9\r\n\r\n  // Base conversion alphabet.\r\n  NUMERALS = '0123456789abcdef',\r\n\r\n  // The natural logarithm of 10 (1025 digits).\r\n  LN10 = '2.3025850929940456840179914546843642076011014886287729760333279009675726096773524802359972050895982983419677840422862486334095254650828067566662873690987816894829072083255546808437998948262331985283935053089653777326288461633662222876982198867465436674744042432743651550489343149393914796194044002221051017141748003688084012647080685567743216228355220114804663715659121373450747856947683463616792101806445070648000277502684916746550586856935673420670581136429224554405758925724208241314695689016758940256776311356919292033376587141660230105703089634572075440370847469940168269282808481184289314848524948644871927809676271275775397027668605952496716674183485704422507197965004714951050492214776567636938662976979522110718264549734772662425709429322582798502585509785265383207606726317164309505995087807523710333101197857547331541421808427543863591778117054309827482385045648019095610299291824318237525357709750539565187697510374970888692180205189339507238539205144634197265287286965110862571492198849978748873771345686209167058',\r\n\r\n  // Pi (1025 digits).\r\n  PI = '3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113305305488204665213841469519415116094330572703657595919530921861173819326117931051185480744623799627495673518857527248912279381830119491298336733624406566430860213949463952247371907021798609437027705392171762931767523846748184676694051320005681271452635608277857713427577896091736371787214684409012249534301465495853710507922796892589235420199561121290219608640344181598136297747713099605187072113499999983729780499510597317328160963185950244594553469083026425223082533446850352619311881710100031378387528865875332083814206171776691473035982534904287554687311595628638823537875937519577818577805321712268066130019278766111959092164201989380952572010654858632789',\r\n\r\n\r\n  // The initial configuration properties of the Decimal constructor.\r\n  DEFAULTS = {\r\n\r\n    // These values must be integers within the stated ranges (inclusive).\r\n    // Most of these values can be changed at run-time using the `Decimal.config` method.\r\n\r\n    // The maximum number of significant digits of the result of a calculation or base conversion.\r\n    // E.g. `Decimal.config({ precision: 20 });`\r\n    precision: 20,                         // 1 to MAX_DIGITS\r\n\r\n    // The rounding mode used when rounding to `precision`.\r\n    //\r\n    // ROUND_UP         0 Away from zero.\r\n    // ROUND_DOWN       1 Towards zero.\r\n    // ROUND_CEIL       2 Towards +Infinity.\r\n    // ROUND_FLOOR      3 Towards -Infinity.\r\n    // ROUND_HALF_UP    4 Towards nearest neighbour. If equidistant, up.\r\n    // ROUND_HALF_DOWN  5 Towards nearest neighbour. If equidistant, down.\r\n    // ROUND_HALF_EVEN  6 Towards nearest neighbour. If equidistant, towards even neighbour.\r\n    // ROUND_HALF_CEIL  7 Towards nearest neighbour. If equidistant, towards +Infinity.\r\n    // ROUND_HALF_FLOOR 8 Towards nearest neighbour. If equidistant, towards -Infinity.\r\n    //\r\n    // E.g.\r\n    // `Decimal.rounding = 4;`\r\n    // `Decimal.rounding = Decimal.ROUND_HALF_UP;`\r\n    rounding: 4,                           // 0 to 8\r\n\r\n    // The modulo mode used when calculating the modulus: a mod n.\r\n    // The quotient (q = a / n) is calculated according to the corresponding rounding mode.\r\n    // The remainder (r) is calculated as: r = a - n * q.\r\n    //\r\n    // UP         0 The remainder is positive if the dividend is negative, else is negative.\r\n    // DOWN       1 The remainder has the same sign as the dividend (JavaScript %).\r\n    // FLOOR      3 The remainder has the same sign as the divisor (Python %).\r\n    // HALF_EVEN  6 The IEEE 754 remainder function.\r\n    // EUCLID     9 Euclidian division. q = sign(n) * floor(a / abs(n)). Always positive.\r\n    //\r\n    // Truncated division (1), floored division (3), the IEEE 754 remainder (6), and Euclidian\r\n    // division (9) are commonly used for the modulus operation. The other rounding modes can also\r\n    // be used, but they may not give useful results.\r\n    modulo: 1,                             // 0 to 9\r\n\r\n    // The exponent value at and beneath which `toString` returns exponential notation.\r\n    // JavaScript numbers: -7\r\n    toExpNeg: -7,                          // 0 to -EXP_LIMIT\r\n\r\n    // The exponent value at and above which `toString` returns exponential notation.\r\n    // JavaScript numbers: 21\r\n    toExpPos:  21,                         // 0 to EXP_LIMIT\r\n\r\n    // The minimum exponent value, beneath which underflow to zero occurs.\r\n    // JavaScript numbers: -324  (5e-324)\r\n    minE: -EXP_LIMIT,                      // -1 to -EXP_LIMIT\r\n\r\n    // The maximum exponent value, above which overflow to Infinity occurs.\r\n    // JavaScript numbers: 308  (1.7976931348623157e+308)\r\n    maxE: EXP_LIMIT,                       // 1 to EXP_LIMIT\r\n\r\n    // Whether to use cryptographically-secure random number generation, if available.\r\n    crypto: false                          // true/false\r\n  },\r\n\r\n\r\n// ----------------------------------- END OF EDITABLE DEFAULTS ------------------------------- //\r\n\r\n\r\n  inexact, quadrant,\r\n  external = true,\r\n\r\n  decimalError = '[DecimalError] ',\r\n  invalidArgument = decimalError + 'Invalid argument: ',\r\n  precisionLimitExceeded = decimalError + 'Precision limit exceeded',\r\n  cryptoUnavailable = decimalError + 'crypto unavailable',\r\n  tag = '[object Decimal]',\r\n\r\n  mathfloor = Math.floor,\r\n  mathpow = Math.pow,\r\n\r\n  isBinary = /^0b([01]+(\\.[01]*)?|\\.[01]+)(p[+-]?\\d+)?$/i,\r\n  isHex = /^0x([0-9a-f]+(\\.[0-9a-f]*)?|\\.[0-9a-f]+)(p[+-]?\\d+)?$/i,\r\n  isOctal = /^0o([0-7]+(\\.[0-7]*)?|\\.[0-7]+)(p[+-]?\\d+)?$/i,\r\n  isDecimal = /^(\\d+(\\.\\d*)?|\\.\\d+)(e[+-]?\\d+)?$/i,\r\n\r\n  BASE = 1e7,\r\n  LOG_BASE = 7,\r\n  MAX_SAFE_INTEGER = 9007199254740991,\r\n\r\n  LN10_PRECISION = LN10.length - 1,\r\n  PI_PRECISION = PI.length - 1,\r\n\r\n  // Decimal.prototype object\r\n  P = { toStringTag: tag };\r\n\r\n\r\n// Decimal prototype methods\r\n\r\n\r\n/*\r\n *  absoluteValue             abs\r\n *  ceil\r\n *  clampedTo                 clamp\r\n *  comparedTo                cmp\r\n *  cosine                    cos\r\n *  cubeRoot                  cbrt\r\n *  decimalPlaces             dp\r\n *  dividedBy                 div\r\n *  dividedToIntegerBy        divToInt\r\n *  equals                    eq\r\n *  floor\r\n *  greaterThan               gt\r\n *  greaterThanOrEqualTo      gte\r\n *  hyperbolicCosine          cosh\r\n *  hyperbolicSine            sinh\r\n *  hyperbolicTangent         tanh\r\n *  inverseCosine             acos\r\n *  inverseHyperbolicCosine   acosh\r\n *  inverseHyperbolicSine     asinh\r\n *  inverseHyperbolicTangent  atanh\r\n *  inverseSine               asin\r\n *  inverseTangent            atan\r\n *  isFinite\r\n *  isInteger                 isInt\r\n *  isNaN\r\n *  isNegative                isNeg\r\n *  isPositive                isPos\r\n *  isZero\r\n *  lessThan                  lt\r\n *  lessThanOrEqualTo         lte\r\n *  logarithm                 log\r\n *  [maximum]                 [max]\r\n *  [minimum]                 [min]\r\n *  minus                     sub\r\n *  modulo                    mod\r\n *  naturalExponential        exp\r\n *  naturalLogarithm          ln\r\n *  negated                   neg\r\n *  plus                      add\r\n *  precision                 sd\r\n *  round\r\n *  sine                      sin\r\n *  squareRoot                sqrt\r\n *  tangent                   tan\r\n *  times                     mul\r\n *  toBinary\r\n *  toDecimalPlaces           toDP\r\n *  toExponential\r\n *  toFixed\r\n *  toFraction\r\n *  toHexadecimal             toHex\r\n *  toNearest\r\n *  toNumber\r\n *  toOctal\r\n *  toPower                   pow\r\n *  toPrecision\r\n *  toSignificantDigits       toSD\r\n *  toString\r\n *  truncated                 trunc\r\n *  valueOf                   toJSON\r\n */\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the absolute value of this Decimal.\r\n *\r\n */\r\nP.absoluteValue = P.abs = function () {\r\n  var x = new this.constructor(this);\r\n  if (x.s < 0) x.s = 1;\r\n  return finalise(x);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the value of this Decimal rounded to a whole number in the\r\n * direction of positive Infinity.\r\n *\r\n */\r\nP.ceil = function () {\r\n  return finalise(new this.constructor(this), this.e + 1, 2);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the value of this Decimal clamped to the range\r\n * delineated by `min` and `max`.\r\n *\r\n * min {number|string|Decimal}\r\n * max {number|string|Decimal}\r\n *\r\n */\r\nP.clampedTo = P.clamp = function (min, max) {\r\n  var k,\r\n    x = this,\r\n    Ctor = x.constructor;\r\n  min = new Ctor(min);\r\n  max = new Ctor(max);\r\n  if (!min.s || !max.s) return new Ctor(NaN);\r\n  if (min.gt(max)) throw Error(invalidArgument + max);\r\n  k = x.cmp(min);\r\n  return k < 0 ? min : x.cmp(max) > 0 ? max : new Ctor(x);\r\n};\r\n\r\n\r\n/*\r\n * Return\r\n *   1    if the value of this Decimal is greater than the value of `y`,\r\n *  -1    if the value of this Decimal is less than the value of `y`,\r\n *   0    if they have the same value,\r\n *   NaN  if the value of either Decimal is NaN.\r\n *\r\n */\r\nP.comparedTo = P.cmp = function (y) {\r\n  var i, j, xdL, ydL,\r\n    x = this,\r\n    xd = x.d,\r\n    yd = (y = new x.constructor(y)).d,\r\n    xs = x.s,\r\n    ys = y.s;\r\n\r\n  // Either NaN or ±Infinity?\r\n  if (!xd || !yd) {\r\n    return !xs || !ys ? NaN : xs !== ys ? xs : xd === yd ? 0 : !xd ^ xs < 0 ? 1 : -1;\r\n  }\r\n\r\n  // Either zero?\r\n  if (!xd[0] || !yd[0]) return xd[0] ? xs : yd[0] ? -ys : 0;\r\n\r\n  // Signs differ?\r\n  if (xs !== ys) return xs;\r\n\r\n  // Compare exponents.\r\n  if (x.e !== y.e) return x.e > y.e ^ xs < 0 ? 1 : -1;\r\n\r\n  xdL = xd.length;\r\n  ydL = yd.length;\r\n\r\n  // Compare digit by digit.\r\n  for (i = 0, j = xdL < ydL ? xdL : ydL; i < j; ++i) {\r\n    if (xd[i] !== yd[i]) return xd[i] > yd[i] ^ xs < 0 ? 1 : -1;\r\n  }\r\n\r\n  // Compare lengths.\r\n  return xdL === ydL ? 0 : xdL > ydL ^ xs < 0 ? 1 : -1;\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the cosine of the value in radians of this Decimal.\r\n *\r\n * Domain: [-Infinity, Infinity]\r\n * Range: [-1, 1]\r\n *\r\n * cos(0)         = 1\r\n * cos(-0)        = 1\r\n * cos(Infinity)  = NaN\r\n * cos(-Infinity) = NaN\r\n * cos(NaN)       = NaN\r\n *\r\n */\r\nP.cosine = P.cos = function () {\r\n  var pr, rm,\r\n    x = this,\r\n    Ctor = x.constructor;\r\n\r\n  if (!x.d) return new Ctor(NaN);\r\n\r\n  // cos(0) = cos(-0) = 1\r\n  if (!x.d[0]) return new Ctor(1);\r\n\r\n  pr = Ctor.precision;\r\n  rm = Ctor.rounding;\r\n  Ctor.precision = pr + Math.max(x.e, x.sd()) + LOG_BASE;\r\n  Ctor.rounding = 1;\r\n\r\n  x = cosine(Ctor, toLessThanHalfPi(Ctor, x));\r\n\r\n  Ctor.precision = pr;\r\n  Ctor.rounding = rm;\r\n\r\n  return finalise(quadrant == 2 || quadrant == 3 ? x.neg() : x, pr, rm, true);\r\n};\r\n\r\n\r\n/*\r\n *\r\n * Return a new Decimal whose value is the cube root of the value of this Decimal, rounded to\r\n * `precision` significant digits using rounding mode `rounding`.\r\n *\r\n *  cbrt(0)  =  0\r\n *  cbrt(-0) = -0\r\n *  cbrt(1)  =  1\r\n *  cbrt(-1) = -1\r\n *  cbrt(N)  =  N\r\n *  cbrt(-I) = -I\r\n *  cbrt(I)  =  I\r\n *\r\n * Math.cbrt(x) = (x < 0 ? -Math.pow(-x, 1/3) : Math.pow(x, 1/3))\r\n *\r\n */\r\nP.cubeRoot = P.cbrt = function () {\r\n  var e, m, n, r, rep, s, sd, t, t3, t3plusx,\r\n    x = this,\r\n    Ctor = x.constructor;\r\n\r\n  if (!x.isFinite() || x.isZero()) return new Ctor(x);\r\n  external = false;\r\n\r\n  // Initial estimate.\r\n  s = x.s * mathpow(x.s * x, 1 / 3);\r\n\r\n   // Math.cbrt underflow/overflow?\r\n   // Pass x to Math.pow as integer, then adjust the exponent of the result.\r\n  if (!s || Math.abs(s) == 1 / 0) {\r\n    n = digitsToString(x.d);\r\n    e = x.e;\r\n\r\n    // Adjust n exponent so it is a multiple of 3 away from x exponent.\r\n    if (s = (e - n.length + 1) % 3) n += (s == 1 || s == -2 ? '0' : '00');\r\n    s = mathpow(n, 1 / 3);\r\n\r\n    // Rarely, e may be one less than the result exponent value.\r\n    e = mathfloor((e + 1) / 3) - (e % 3 == (e < 0 ? -1 : 2));\r\n\r\n    if (s == 1 / 0) {\r\n      n = '5e' + e;\r\n    } else {\r\n      n = s.toExponential();\r\n      n = n.slice(0, n.indexOf('e') + 1) + e;\r\n    }\r\n\r\n    r = new Ctor(n);\r\n    r.s = x.s;\r\n  } else {\r\n    r = new Ctor(s.toString());\r\n  }\r\n\r\n  sd = (e = Ctor.precision) + 3;\r\n\r\n  // Halley's method.\r\n  // TODO? Compare Newton's method.\r\n  for (;;) {\r\n    t = r;\r\n    t3 = t.times(t).times(t);\r\n    t3plusx = t3.plus(x);\r\n    r = divide(t3plusx.plus(x).times(t), t3plusx.plus(t3), sd + 2, 1);\r\n\r\n    // TODO? Replace with for-loop and checkRoundingDigits.\r\n    if (digitsToString(t.d).slice(0, sd) === (n = digitsToString(r.d)).slice(0, sd)) {\r\n      n = n.slice(sd - 3, sd + 1);\r\n\r\n      // The 4th rounding digit may be in error by -1 so if the 4 rounding digits are 9999 or 4999\r\n      // , i.e. approaching a rounding boundary, continue the iteration.\r\n      if (n == '9999' || !rep && n == '4999') {\r\n\r\n        // On the first iteration only, check to see if rounding up gives the exact result as the\r\n        // nines may infinitely repeat.\r\n        if (!rep) {\r\n          finalise(t, e + 1, 0);\r\n\r\n          if (t.times(t).times(t).eq(x)) {\r\n            r = t;\r\n            break;\r\n          }\r\n        }\r\n\r\n        sd += 4;\r\n        rep = 1;\r\n      } else {\r\n\r\n        // If the rounding digits are null, 0{0,4} or 50{0,3}, check for an exact result.\r\n        // If not, then there are further digits and m will be truthy.\r\n        if (!+n || !+n.slice(1) && n.charAt(0) == '5') {\r\n\r\n          // Truncate to the first rounding digit.\r\n          finalise(r, e + 1, 1);\r\n          m = !r.times(r).times(r).eq(x);\r\n        }\r\n\r\n        break;\r\n      }\r\n    }\r\n  }\r\n\r\n  external = true;\r\n\r\n  return finalise(r, e, Ctor.rounding, m);\r\n};\r\n\r\n\r\n/*\r\n * Return the number of decimal places of the value of this Decimal.\r\n *\r\n */\r\nP.decimalPlaces = P.dp = function () {\r\n  var w,\r\n    d = this.d,\r\n    n = NaN;\r\n\r\n  if (d) {\r\n    w = d.length - 1;\r\n    n = (w - mathfloor(this.e / LOG_BASE)) * LOG_BASE;\r\n\r\n    // Subtract the number of trailing zeros of the last word.\r\n    w = d[w];\r\n    if (w) for (; w % 10 == 0; w /= 10) n--;\r\n    if (n < 0) n = 0;\r\n  }\r\n\r\n  return n;\r\n};\r\n\r\n\r\n/*\r\n *  n / 0 = I\r\n *  n / N = N\r\n *  n / I = 0\r\n *  0 / n = 0\r\n *  0 / 0 = N\r\n *  0 / N = N\r\n *  0 / I = 0\r\n *  N / n = N\r\n *  N / 0 = N\r\n *  N / N = N\r\n *  N / I = N\r\n *  I / n = I\r\n *  I / 0 = I\r\n *  I / N = N\r\n *  I / I = N\r\n *\r\n * Return a new Decimal whose value is the value of this Decimal divided by `y`, rounded to\r\n * `precision` significant digits using rounding mode `rounding`.\r\n *\r\n */\r\nP.dividedBy = P.div = function (y) {\r\n  return divide(this, new this.constructor(y));\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the integer part of dividing the value of this Decimal\r\n * by the value of `y`, rounded to `precision` significant digits using rounding mode `rounding`.\r\n *\r\n */\r\nP.dividedToIntegerBy = P.divToInt = function (y) {\r\n  var x = this,\r\n    Ctor = x.constructor;\r\n  return finalise(divide(x, new Ctor(y), 0, 1, 1), Ctor.precision, Ctor.rounding);\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is equal to the value of `y`, otherwise return false.\r\n *\r\n */\r\nP.equals = P.eq = function (y) {\r\n  return this.cmp(y) === 0;\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the value of this Decimal rounded to a whole number in the\r\n * direction of negative Infinity.\r\n *\r\n */\r\nP.floor = function () {\r\n  return finalise(new this.constructor(this), this.e + 1, 3);\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is greater than the value of `y`, otherwise return\r\n * false.\r\n *\r\n */\r\nP.greaterThan = P.gt = function (y) {\r\n  return this.cmp(y) > 0;\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is greater than or equal to the value of `y`,\r\n * otherwise return false.\r\n *\r\n */\r\nP.greaterThanOrEqualTo = P.gte = function (y) {\r\n  var k = this.cmp(y);\r\n  return k == 1 || k === 0;\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the hyperbolic cosine of the value in radians of this\r\n * Decimal.\r\n *\r\n * Domain: [-Infinity, Infinity]\r\n * Range: [1, Infinity]\r\n *\r\n * cosh(x) = 1 + x^2/2! + x^4/4! + x^6/6! + ...\r\n *\r\n * cosh(0)         = 1\r\n * cosh(-0)        = 1\r\n * cosh(Infinity)  = Infinity\r\n * cosh(-Infinity) = Infinity\r\n * cosh(NaN)       = NaN\r\n *\r\n *  x        time taken (ms)   result\r\n * 1000      9                 9.8503555700852349694e+433\r\n * 10000     25                4.4034091128314607936e+4342\r\n * 100000    171               1.4033316802130615897e+43429\r\n * 1000000   3817              1.5166076984010437725e+434294\r\n * 10000000  abandoned after 2 minute wait\r\n *\r\n * TODO? Compare performance of cosh(x) = 0.5 * (exp(x) + exp(-x))\r\n *\r\n */\r\nP.hyperbolicCosine = P.cosh = function () {\r\n  var k, n, pr, rm, len,\r\n    x = this,\r\n    Ctor = x.constructor,\r\n    one = new Ctor(1);\r\n\r\n  if (!x.isFinite()) return new Ctor(x.s ? 1 / 0 : NaN);\r\n  if (x.isZero()) return one;\r\n\r\n  pr = Ctor.precision;\r\n  rm = Ctor.rounding;\r\n  Ctor.precision = pr + Math.max(x.e, x.sd()) + 4;\r\n  Ctor.rounding = 1;\r\n  len = x.d.length;\r\n\r\n  // Argument reduction: cos(4x) = 1 - 8cos^2(x) + 8cos^4(x) + 1\r\n  // i.e. cos(x) = 1 - cos^2(x/4)(8 - 8cos^2(x/4))\r\n\r\n  // Estimate the optimum number of times to use the argument reduction.\r\n  // TODO? Estimation reused from cosine() and may not be optimal here.\r\n  if (len < 32) {\r\n    k = Math.ceil(len / 3);\r\n    n = (1 / tinyPow(4, k)).toString();\r\n  } else {\r\n    k = 16;\r\n    n = '2.3283064365386962890625e-10';\r\n  }\r\n\r\n  x = taylorSeries(Ctor, 1, x.times(n), new Ctor(1), true);\r\n\r\n  // Reverse argument reduction\r\n  var cosh2_x,\r\n    i = k,\r\n    d8 = new Ctor(8);\r\n  for (; i--;) {\r\n    cosh2_x = x.times(x);\r\n    x = one.minus(cosh2_x.times(d8.minus(cosh2_x.times(d8))));\r\n  }\r\n\r\n  return finalise(x, Ctor.precision = pr, Ctor.rounding = rm, true);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the hyperbolic sine of the value in radians of this\r\n * Decimal.\r\n *\r\n * Domain: [-Infinity, Infinity]\r\n * Range: [-Infinity, Infinity]\r\n *\r\n * sinh(x) = x + x^3/3! + x^5/5! + x^7/7! + ...\r\n *\r\n * sinh(0)         = 0\r\n * sinh(-0)        = -0\r\n * sinh(Infinity)  = Infinity\r\n * sinh(-Infinity) = -Infinity\r\n * sinh(NaN)       = NaN\r\n *\r\n * x        time taken (ms)\r\n * 10       2 ms\r\n * 100      5 ms\r\n * 1000     14 ms\r\n * 10000    82 ms\r\n * 100000   886 ms            1.4033316802130615897e+43429\r\n * 200000   2613 ms\r\n * 300000   5407 ms\r\n * 400000   8824 ms\r\n * 500000   13026 ms          8.7080643612718084129e+217146\r\n * 1000000  48543 ms\r\n *\r\n * TODO? Compare performance of sinh(x) = 0.5 * (exp(x) - exp(-x))\r\n *\r\n */\r\nP.hyperbolicSine = P.sinh = function () {\r\n  var k, pr, rm, len,\r\n    x = this,\r\n    Ctor = x.constructor;\r\n\r\n  if (!x.isFinite() || x.isZero()) return new Ctor(x);\r\n\r\n  pr = Ctor.precision;\r\n  rm = Ctor.rounding;\r\n  Ctor.precision = pr + Math.max(x.e, x.sd()) + 4;\r\n  Ctor.rounding = 1;\r\n  len = x.d.length;\r\n\r\n  if (len < 3) {\r\n    x = taylorSeries(Ctor, 2, x, x, true);\r\n  } else {\r\n\r\n    // Alternative argument reduction: sinh(3x) = sinh(x)(3 + 4sinh^2(x))\r\n    // i.e. sinh(x) = sinh(x/3)(3 + 4sinh^2(x/3))\r\n    // 3 multiplications and 1 addition\r\n\r\n    // Argument reduction: sinh(5x) = sinh(x)(5 + sinh^2(x)(20 + 16sinh^2(x)))\r\n    // i.e. sinh(x) = sinh(x/5)(5 + sinh^2(x/5)(20 + 16sinh^2(x/5)))\r\n    // 4 multiplications and 2 additions\r\n\r\n    // Estimate the optimum number of times to use the argument reduction.\r\n    k = 1.4 * Math.sqrt(len);\r\n    k = k > 16 ? 16 : k | 0;\r\n\r\n    x = x.times(1 / tinyPow(5, k));\r\n    x = taylorSeries(Ctor, 2, x, x, true);\r\n\r\n    // Reverse argument reduction\r\n    var sinh2_x,\r\n      d5 = new Ctor(5),\r\n      d16 = new Ctor(16),\r\n      d20 = new Ctor(20);\r\n    for (; k--;) {\r\n      sinh2_x = x.times(x);\r\n      x = x.times(d5.plus(sinh2_x.times(d16.times(sinh2_x).plus(d20))));\r\n    }\r\n  }\r\n\r\n  Ctor.precision = pr;\r\n  Ctor.rounding = rm;\r\n\r\n  return finalise(x, pr, rm, true);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the hyperbolic tangent of the value in radians of this\r\n * Decimal.\r\n *\r\n * Domain: [-Infinity, Infinity]\r\n * Range: [-1, 1]\r\n *\r\n * tanh(x) = sinh(x) / cosh(x)\r\n *\r\n * tanh(0)         = 0\r\n * tanh(-0)        = -0\r\n * tanh(Infinity)  = 1\r\n * tanh(-Infinity) = -1\r\n * tanh(NaN)       = NaN\r\n *\r\n */\r\nP.hyperbolicTangent = P.tanh = function () {\r\n  var pr, rm,\r\n    x = this,\r\n    Ctor = x.constructor;\r\n\r\n  if (!x.isFinite()) return new Ctor(x.s);\r\n  if (x.isZero()) return new Ctor(x);\r\n\r\n  pr = Ctor.precision;\r\n  rm = Ctor.rounding;\r\n  Ctor.precision = pr + 7;\r\n  Ctor.rounding = 1;\r\n\r\n  return divide(x.sinh(), x.cosh(), Ctor.precision = pr, Ctor.rounding = rm);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the arccosine (inverse cosine) in radians of the value of\r\n * this Decimal.\r\n *\r\n * Domain: [-1, 1]\r\n * Range: [0, pi]\r\n *\r\n * acos(x) = pi/2 - asin(x)\r\n *\r\n * acos(0)       = pi/2\r\n * acos(-0)      = pi/2\r\n * acos(1)       = 0\r\n * acos(-1)      = pi\r\n * acos(1/2)     = pi/3\r\n * acos(-1/2)    = 2*pi/3\r\n * acos(|x| > 1) = NaN\r\n * acos(NaN)     = NaN\r\n *\r\n */\r\nP.inverseCosine = P.acos = function () {\r\n  var halfPi,\r\n    x = this,\r\n    Ctor = x.constructor,\r\n    k = x.abs().cmp(1),\r\n    pr = Ctor.precision,\r\n    rm = Ctor.rounding;\r\n\r\n  if (k !== -1) {\r\n    return k === 0\r\n      // |x| is 1\r\n      ? x.isNeg() ? getPi(Ctor, pr, rm) : new Ctor(0)\r\n      // |x| > 1 or x is NaN\r\n      : new Ctor(NaN);\r\n  }\r\n\r\n  if (x.isZero()) return getPi(Ctor, pr + 4, rm).times(0.5);\r\n\r\n  // TODO? Special case acos(0.5) = pi/3 and acos(-0.5) = 2*pi/3\r\n\r\n  Ctor.precision = pr + 6;\r\n  Ctor.rounding = 1;\r\n\r\n  x = x.asin();\r\n  halfPi = getPi(Ctor, pr + 4, rm).times(0.5);\r\n\r\n  Ctor.precision = pr;\r\n  Ctor.rounding = rm;\r\n\r\n  return halfPi.minus(x);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the inverse of the hyperbolic cosine in radians of the\r\n * value of this Decimal.\r\n *\r\n * Domain: [1, Infinity]\r\n * Range: [0, Infinity]\r\n *\r\n * acosh(x) = ln(x + sqrt(x^2 - 1))\r\n *\r\n * acosh(x < 1)     = NaN\r\n * acosh(NaN)       = NaN\r\n * acosh(Infinity)  = Infinity\r\n * acosh(-Infinity) = NaN\r\n * acosh(0)         = NaN\r\n * acosh(-0)        = NaN\r\n * acosh(1)         = 0\r\n * acosh(-1)        = NaN\r\n *\r\n */\r\nP.inverseHyperbolicCosine = P.acosh = function () {\r\n  var pr, rm,\r\n    x = this,\r\n    Ctor = x.constructor;\r\n\r\n  if (x.lte(1)) return new Ctor(x.eq(1) ? 0 : NaN);\r\n  if (!x.isFinite()) return new Ctor(x);\r\n\r\n  pr = Ctor.precision;\r\n  rm = Ctor.rounding;\r\n  Ctor.precision = pr + Math.max(Math.abs(x.e), x.sd()) + 4;\r\n  Ctor.rounding = 1;\r\n  external = false;\r\n\r\n  x = x.times(x).minus(1).sqrt().plus(x);\r\n\r\n  external = true;\r\n  Ctor.precision = pr;\r\n  Ctor.rounding = rm;\r\n\r\n  return x.ln();\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the inverse of the hyperbolic sine in radians of the value\r\n * of this Decimal.\r\n *\r\n * Domain: [-Infinity, Infinity]\r\n * Range: [-Infinity, Infinity]\r\n *\r\n * asinh(x) = ln(x + sqrt(x^2 + 1))\r\n *\r\n * asinh(NaN)       = NaN\r\n * asinh(Infinity)  = Infinity\r\n * asinh(-Infinity) = -Infinity\r\n * asinh(0)         = 0\r\n * asinh(-0)        = -0\r\n *\r\n */\r\nP.inverseHyperbolicSine = P.asinh = function () {\r\n  var pr, rm,\r\n    x = this,\r\n    Ctor = x.constructor;\r\n\r\n  if (!x.isFinite() || x.isZero()) return new Ctor(x);\r\n\r\n  pr = Ctor.precision;\r\n  rm = Ctor.rounding;\r\n  Ctor.precision = pr + 2 * Math.max(Math.abs(x.e), x.sd()) + 6;\r\n  Ctor.rounding = 1;\r\n  external = false;\r\n\r\n  x = x.times(x).plus(1).sqrt().plus(x);\r\n\r\n  external = true;\r\n  Ctor.precision = pr;\r\n  Ctor.rounding = rm;\r\n\r\n  return x.ln();\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the inverse of the hyperbolic tangent in radians of the\r\n * value of this Decimal.\r\n *\r\n * Domain: [-1, 1]\r\n * Range: [-Infinity, Infinity]\r\n *\r\n * atanh(x) = 0.5 * ln((1 + x) / (1 - x))\r\n *\r\n * atanh(|x| > 1)   = NaN\r\n * atanh(NaN)       = NaN\r\n * atanh(Infinity)  = NaN\r\n * atanh(-Infinity) = NaN\r\n * atanh(0)         = 0\r\n * atanh(-0)        = -0\r\n * atanh(1)         = Infinity\r\n * atanh(-1)        = -Infinity\r\n *\r\n */\r\nP.inverseHyperbolicTangent = P.atanh = function () {\r\n  var pr, rm, wpr, xsd,\r\n    x = this,\r\n    Ctor = x.constructor;\r\n\r\n  if (!x.isFinite()) return new Ctor(NaN);\r\n  if (x.e >= 0) return new Ctor(x.abs().eq(1) ? x.s / 0 : x.isZero() ? x : NaN);\r\n\r\n  pr = Ctor.precision;\r\n  rm = Ctor.rounding;\r\n  xsd = x.sd();\r\n\r\n  if (Math.max(xsd, pr) < 2 * -x.e - 1) return finalise(new Ctor(x), pr, rm, true);\r\n\r\n  Ctor.precision = wpr = xsd - x.e;\r\n\r\n  x = divide(x.plus(1), new Ctor(1).minus(x), wpr + pr, 1);\r\n\r\n  Ctor.precision = pr + 4;\r\n  Ctor.rounding = 1;\r\n\r\n  x = x.ln();\r\n\r\n  Ctor.precision = pr;\r\n  Ctor.rounding = rm;\r\n\r\n  return x.times(0.5);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the arcsine (inverse sine) in radians of the value of this\r\n * Decimal.\r\n *\r\n * Domain: [-Infinity, Infinity]\r\n * Range: [-pi/2, pi/2]\r\n *\r\n * asin(x) = 2*atan(x/(1 + sqrt(1 - x^2)))\r\n *\r\n * asin(0)       = 0\r\n * asin(-0)      = -0\r\n * asin(1/2)     = pi/6\r\n * asin(-1/2)    = -pi/6\r\n * asin(1)       = pi/2\r\n * asin(-1)      = -pi/2\r\n * asin(|x| > 1) = NaN\r\n * asin(NaN)     = NaN\r\n *\r\n * TODO? Compare performance of Taylor series.\r\n *\r\n */\r\nP.inverseSine = P.asin = function () {\r\n  var halfPi, k,\r\n    pr, rm,\r\n    x = this,\r\n    Ctor = x.constructor;\r\n\r\n  if (x.isZero()) return new Ctor(x);\r\n\r\n  k = x.abs().cmp(1);\r\n  pr = Ctor.precision;\r\n  rm = Ctor.rounding;\r\n\r\n  if (k !== -1) {\r\n\r\n    // |x| is 1\r\n    if (k === 0) {\r\n      halfPi = getPi(Ctor, pr + 4, rm).times(0.5);\r\n      halfPi.s = x.s;\r\n      return halfPi;\r\n    }\r\n\r\n    // |x| > 1 or x is NaN\r\n    return new Ctor(NaN);\r\n  }\r\n\r\n  // TODO? Special case asin(1/2) = pi/6 and asin(-1/2) = -pi/6\r\n\r\n  Ctor.precision = pr + 6;\r\n  Ctor.rounding = 1;\r\n\r\n  x = x.div(new Ctor(1).minus(x.times(x)).sqrt().plus(1)).atan();\r\n\r\n  Ctor.precision = pr;\r\n  Ctor.rounding = rm;\r\n\r\n  return x.times(2);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the arctangent (inverse tangent) in radians of the value\r\n * of this Decimal.\r\n *\r\n * Domain: [-Infinity, Infinity]\r\n * Range: [-pi/2, pi/2]\r\n *\r\n * atan(x) = x - x^3/3 + x^5/5 - x^7/7 + ...\r\n *\r\n * atan(0)         = 0\r\n * atan(-0)        = -0\r\n * atan(1)         = pi/4\r\n * atan(-1)        = -pi/4\r\n * atan(Infinity)  = pi/2\r\n * atan(-Infinity) = -pi/2\r\n * atan(NaN)       = NaN\r\n *\r\n */\r\nP.inverseTangent = P.atan = function () {\r\n  var i, j, k, n, px, t, r, wpr, x2,\r\n    x = this,\r\n    Ctor = x.constructor,\r\n    pr = Ctor.precision,\r\n    rm = Ctor.rounding;\r\n\r\n  if (!x.isFinite()) {\r\n    if (!x.s) return new Ctor(NaN);\r\n    if (pr + 4 <= PI_PRECISION) {\r\n      r = getPi(Ctor, pr + 4, rm).times(0.5);\r\n      r.s = x.s;\r\n      return r;\r\n    }\r\n  } else if (x.isZero()) {\r\n    return new Ctor(x);\r\n  } else if (x.abs().eq(1) && pr + 4 <= PI_PRECISION) {\r\n    r = getPi(Ctor, pr + 4, rm).times(0.25);\r\n    r.s = x.s;\r\n    return r;\r\n  }\r\n\r\n  Ctor.precision = wpr = pr + 10;\r\n  Ctor.rounding = 1;\r\n\r\n  // TODO? if (x >= 1 && pr <= PI_PRECISION) atan(x) = halfPi * x.s - atan(1 / x);\r\n\r\n  // Argument reduction\r\n  // Ensure |x| < 0.42\r\n  // atan(x) = 2 * atan(x / (1 + sqrt(1 + x^2)))\r\n\r\n  k = Math.min(28, wpr / LOG_BASE + 2 | 0);\r\n\r\n  for (i = k; i; --i) x = x.div(x.times(x).plus(1).sqrt().plus(1));\r\n\r\n  external = false;\r\n\r\n  j = Math.ceil(wpr / LOG_BASE);\r\n  n = 1;\r\n  x2 = x.times(x);\r\n  r = new Ctor(x);\r\n  px = x;\r\n\r\n  // atan(x) = x - x^3/3 + x^5/5 - x^7/7 + ...\r\n  for (; i !== -1;) {\r\n    px = px.times(x2);\r\n    t = r.minus(px.div(n += 2));\r\n\r\n    px = px.times(x2);\r\n    r = t.plus(px.div(n += 2));\r\n\r\n    if (r.d[j] !== void 0) for (i = j; r.d[i] === t.d[i] && i--;);\r\n  }\r\n\r\n  if (k) r = r.times(2 << (k - 1));\r\n\r\n  external = true;\r\n\r\n  return finalise(r, Ctor.precision = pr, Ctor.rounding = rm, true);\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is a finite number, otherwise return false.\r\n *\r\n */\r\nP.isFinite = function () {\r\n  return !!this.d;\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is an integer, otherwise return false.\r\n *\r\n */\r\nP.isInteger = P.isInt = function () {\r\n  return !!this.d && mathfloor(this.e / LOG_BASE) > this.d.length - 2;\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is NaN, otherwise return false.\r\n *\r\n */\r\nP.isNaN = function () {\r\n  return !this.s;\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is negative, otherwise return false.\r\n *\r\n */\r\nP.isNegative = P.isNeg = function () {\r\n  return this.s < 0;\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is positive, otherwise return false.\r\n *\r\n */\r\nP.isPositive = P.isPos = function () {\r\n  return this.s > 0;\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is 0 or -0, otherwise return false.\r\n *\r\n */\r\nP.isZero = function () {\r\n  return !!this.d && this.d[0] === 0;\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is less than `y`, otherwise return false.\r\n *\r\n */\r\nP.lessThan = P.lt = function (y) {\r\n  return this.cmp(y) < 0;\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is less than or equal to `y`, otherwise return false.\r\n *\r\n */\r\nP.lessThanOrEqualTo = P.lte = function (y) {\r\n  return this.cmp(y) < 1;\r\n};\r\n\r\n\r\n/*\r\n * Return the logarithm of the value of this Decimal to the specified base, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * If no base is specified, return log[10](arg).\r\n *\r\n * log[base](arg) = ln(arg) / ln(base)\r\n *\r\n * The result will always be correctly rounded if the base of the log is 10, and 'almost always'\r\n * otherwise:\r\n *\r\n * Depending on the rounding mode, the result may be incorrectly rounded if the first fifteen\r\n * rounding digits are [49]99999999999999 or [50]00000000000000. In that case, the maximum error\r\n * between the result and the correctly rounded result will be one ulp (unit in the last place).\r\n *\r\n * log[-b](a)       = NaN\r\n * log[0](a)        = NaN\r\n * log[1](a)        = NaN\r\n * log[NaN](a)      = NaN\r\n * log[Infinity](a) = NaN\r\n * log[b](0)        = -Infinity\r\n * log[b](-0)       = -Infinity\r\n * log[b](-a)       = NaN\r\n * log[b](1)        = 0\r\n * log[b](Infinity) = Infinity\r\n * log[b](NaN)      = NaN\r\n *\r\n * [base] {number|string|Decimal} The base of the logarithm.\r\n *\r\n */\r\nP.logarithm = P.log = function (base) {\r\n  var isBase10, d, denominator, k, inf, num, sd, r,\r\n    arg = this,\r\n    Ctor = arg.constructor,\r\n    pr = Ctor.precision,\r\n    rm = Ctor.rounding,\r\n    guard = 5;\r\n\r\n  // Default base is 10.\r\n  if (base == null) {\r\n    base = new Ctor(10);\r\n    isBase10 = true;\r\n  } else {\r\n    base = new Ctor(base);\r\n    d = base.d;\r\n\r\n    // Return NaN if base is negative, or non-finite, or is 0 or 1.\r\n    if (base.s < 0 || !d || !d[0] || base.eq(1)) return new Ctor(NaN);\r\n\r\n    isBase10 = base.eq(10);\r\n  }\r\n\r\n  d = arg.d;\r\n\r\n  // Is arg negative, non-finite, 0 or 1?\r\n  if (arg.s < 0 || !d || !d[0] || arg.eq(1)) {\r\n    return new Ctor(d && !d[0] ? -1 / 0 : arg.s != 1 ? NaN : d ? 0 : 1 / 0);\r\n  }\r\n\r\n  // The result will have a non-terminating decimal expansion if base is 10 and arg is not an\r\n  // integer power of 10.\r\n  if (isBase10) {\r\n    if (d.length > 1) {\r\n      inf = true;\r\n    } else {\r\n      for (k = d[0]; k % 10 === 0;) k /= 10;\r\n      inf = k !== 1;\r\n    }\r\n  }\r\n\r\n  external = false;\r\n  sd = pr + guard;\r\n  num = naturalLogarithm(arg, sd);\r\n  denominator = isBase10 ? getLn10(Ctor, sd + 10) : naturalLogarithm(base, sd);\r\n\r\n  // The result will have 5 rounding digits.\r\n  r = divide(num, denominator, sd, 1);\r\n\r\n  // If at a rounding boundary, i.e. the result's rounding digits are [49]9999 or [50]0000,\r\n  // calculate 10 further digits.\r\n  //\r\n  // If the result is known to have an infinite decimal expansion, repeat this until it is clear\r\n  // that the result is above or below the boundary. Otherwise, if after calculating the 10\r\n  // further digits, the last 14 are nines, round up and assume the result is exact.\r\n  // Also assume the result is exact if the last 14 are zero.\r\n  //\r\n  // Example of a result that will be incorrectly rounded:\r\n  // log[1048576](4503599627370502) = 2.60000000000000009610279511444746...\r\n  // The above result correctly rounded using ROUND_CEIL to 1 decimal place should be 2.7, but it\r\n  // will be given as 2.6 as there are 15 zeros immediately after the requested decimal place, so\r\n  // the exact result would be assumed to be 2.6, which rounded using ROUND_CEIL to 1 decimal\r\n  // place is still 2.6.\r\n  if (checkRoundingDigits(r.d, k = pr, rm)) {\r\n\r\n    do {\r\n      sd += 10;\r\n      num = naturalLogarithm(arg, sd);\r\n      denominator = isBase10 ? getLn10(Ctor, sd + 10) : naturalLogarithm(base, sd);\r\n      r = divide(num, denominator, sd, 1);\r\n\r\n      if (!inf) {\r\n\r\n        // Check for 14 nines from the 2nd rounding digit, as the first may be 4.\r\n        if (+digitsToString(r.d).slice(k + 1, k + 15) + 1 == 1e14) {\r\n          r = finalise(r, pr + 1, 0);\r\n        }\r\n\r\n        break;\r\n      }\r\n    } while (checkRoundingDigits(r.d, k += 10, rm));\r\n  }\r\n\r\n  external = true;\r\n\r\n  return finalise(r, pr, rm);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the maximum of the arguments and the value of this Decimal.\r\n *\r\n * arguments {number|string|Decimal}\r\n *\r\nP.max = function () {\r\n  Array.prototype.push.call(arguments, this);\r\n  return maxOrMin(this.constructor, arguments, 'lt');\r\n};\r\n */\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the minimum of the arguments and the value of this Decimal.\r\n *\r\n * arguments {number|string|Decimal}\r\n *\r\nP.min = function () {\r\n  Array.prototype.push.call(arguments, this);\r\n  return maxOrMin(this.constructor, arguments, 'gt');\r\n};\r\n */\r\n\r\n\r\n/*\r\n *  n - 0 = n\r\n *  n - N = N\r\n *  n - I = -I\r\n *  0 - n = -n\r\n *  0 - 0 = 0\r\n *  0 - N = N\r\n *  0 - I = -I\r\n *  N - n = N\r\n *  N - 0 = N\r\n *  N - N = N\r\n *  N - I = N\r\n *  I - n = I\r\n *  I - 0 = I\r\n *  I - N = N\r\n *  I - I = N\r\n *\r\n * Return a new Decimal whose value is the value of this Decimal minus `y`, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n */\r\nP.minus = P.sub = function (y) {\r\n  var d, e, i, j, k, len, pr, rm, xd, xe, xLTy, yd,\r\n    x = this,\r\n    Ctor = x.constructor;\r\n\r\n  y = new Ctor(y);\r\n\r\n  // If either is not finite...\r\n  if (!x.d || !y.d) {\r\n\r\n    // Return NaN if either is NaN.\r\n    if (!x.s || !y.s) y = new Ctor(NaN);\r\n\r\n    // Return y negated if x is finite and y is ±Infinity.\r\n    else if (x.d) y.s = -y.s;\r\n\r\n    // Return x if y is finite and x is ±Infinity.\r\n    // Return x if both are ±Infinity with different signs.\r\n    // Return NaN if both are ±Infinity with the same sign.\r\n    else y = new Ctor(y.d || x.s !== y.s ? x : NaN);\r\n\r\n    return y;\r\n  }\r\n\r\n  // If signs differ...\r\n  if (x.s != y.s) {\r\n    y.s = -y.s;\r\n    return x.plus(y);\r\n  }\r\n\r\n  xd = x.d;\r\n  yd = y.d;\r\n  pr = Ctor.precision;\r\n  rm = Ctor.rounding;\r\n\r\n  // If either is zero...\r\n  if (!xd[0] || !yd[0]) {\r\n\r\n    // Return y negated if x is zero and y is non-zero.\r\n    if (yd[0]) y.s = -y.s;\r\n\r\n    // Return x if y is zero and x is non-zero.\r\n    else if (xd[0]) y = new Ctor(x);\r\n\r\n    // Return zero if both are zero.\r\n    // From IEEE 754 (2008) 6.3: 0 - 0 = -0 - -0 = -0 when rounding to -Infinity.\r\n    else return new Ctor(rm === 3 ? -0 : 0);\r\n\r\n    return external ? finalise(y, pr, rm) : y;\r\n  }\r\n\r\n  // x and y are finite, non-zero numbers with the same sign.\r\n\r\n  // Calculate base 1e7 exponents.\r\n  e = mathfloor(y.e / LOG_BASE);\r\n  xe = mathfloor(x.e / LOG_BASE);\r\n\r\n  xd = xd.slice();\r\n  k = xe - e;\r\n\r\n  // If base 1e7 exponents differ...\r\n  if (k) {\r\n    xLTy = k < 0;\r\n\r\n    if (xLTy) {\r\n      d = xd;\r\n      k = -k;\r\n      len = yd.length;\r\n    } else {\r\n      d = yd;\r\n      e = xe;\r\n      len = xd.length;\r\n    }\r\n\r\n    // Numbers with massively different exponents would result in a very high number of\r\n    // zeros needing to be prepended, but this can be avoided while still ensuring correct\r\n    // rounding by limiting the number of zeros to `Math.ceil(pr / LOG_BASE) + 2`.\r\n    i = Math.max(Math.ceil(pr / LOG_BASE), len) + 2;\r\n\r\n    if (k > i) {\r\n      k = i;\r\n      d.length = 1;\r\n    }\r\n\r\n    // Prepend zeros to equalise exponents.\r\n    d.reverse();\r\n    for (i = k; i--;) d.push(0);\r\n    d.reverse();\r\n\r\n  // Base 1e7 exponents equal.\r\n  } else {\r\n\r\n    // Check digits to determine which is the bigger number.\r\n\r\n    i = xd.length;\r\n    len = yd.length;\r\n    xLTy = i < len;\r\n    if (xLTy) len = i;\r\n\r\n    for (i = 0; i < len; i++) {\r\n      if (xd[i] != yd[i]) {\r\n        xLTy = xd[i] < yd[i];\r\n        break;\r\n      }\r\n    }\r\n\r\n    k = 0;\r\n  }\r\n\r\n  if (xLTy) {\r\n    d = xd;\r\n    xd = yd;\r\n    yd = d;\r\n    y.s = -y.s;\r\n  }\r\n\r\n  len = xd.length;\r\n\r\n  // Append zeros to `xd` if shorter.\r\n  // Don't add zeros to `yd` if shorter as subtraction only needs to start at `yd` length.\r\n  for (i = yd.length - len; i > 0; --i) xd[len++] = 0;\r\n\r\n  // Subtract yd from xd.\r\n  for (i = yd.length; i > k;) {\r\n\r\n    if (xd[--i] < yd[i]) {\r\n      for (j = i; j && xd[--j] === 0;) xd[j] = BASE - 1;\r\n      --xd[j];\r\n      xd[i] += BASE;\r\n    }\r\n\r\n    xd[i] -= yd[i];\r\n  }\r\n\r\n  // Remove trailing zeros.\r\n  for (; xd[--len] === 0;) xd.pop();\r\n\r\n  // Remove leading zeros and adjust exponent accordingly.\r\n  for (; xd[0] === 0; xd.shift()) --e;\r\n\r\n  // Zero?\r\n  if (!xd[0]) return new Ctor(rm === 3 ? -0 : 0);\r\n\r\n  y.d = xd;\r\n  y.e = getBase10Exponent(xd, e);\r\n\r\n  return external ? finalise(y, pr, rm) : y;\r\n};\r\n\r\n\r\n/*\r\n *   n % 0 =  N\r\n *   n % N =  N\r\n *   n % I =  n\r\n *   0 % n =  0\r\n *  -0 % n = -0\r\n *   0 % 0 =  N\r\n *   0 % N =  N\r\n *   0 % I =  0\r\n *   N % n =  N\r\n *   N % 0 =  N\r\n *   N % N =  N\r\n *   N % I =  N\r\n *   I % n =  N\r\n *   I % 0 =  N\r\n *   I % N =  N\r\n *   I % I =  N\r\n *\r\n * Return a new Decimal whose value is the value of this Decimal modulo `y`, rounded to\r\n * `precision` significant digits using rounding mode `rounding`.\r\n *\r\n * The result depends on the modulo mode.\r\n *\r\n */\r\nP.modulo = P.mod = function (y) {\r\n  var q,\r\n    x = this,\r\n    Ctor = x.constructor;\r\n\r\n  y = new Ctor(y);\r\n\r\n  // Return NaN if x is ±Infinity or NaN, or y is NaN or ±0.\r\n  if (!x.d || !y.s || y.d && !y.d[0]) return new Ctor(NaN);\r\n\r\n  // Return x if y is ±Infinity or x is ±0.\r\n  if (!y.d || x.d && !x.d[0]) {\r\n    return finalise(new Ctor(x), Ctor.precision, Ctor.rounding);\r\n  }\r\n\r\n  // Prevent rounding of intermediate calculations.\r\n  external = false;\r\n\r\n  if (Ctor.modulo == 9) {\r\n\r\n    // Euclidian division: q = sign(y) * floor(x / abs(y))\r\n    // result = x - q * y    where  0 <= result < abs(y)\r\n    q = divide(x, y.abs(), 0, 3, 1);\r\n    q.s *= y.s;\r\n  } else {\r\n    q = divide(x, y, 0, Ctor.modulo, 1);\r\n  }\r\n\r\n  q = q.times(y);\r\n\r\n  external = true;\r\n\r\n  return x.minus(q);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the natural exponential of the value of this Decimal,\r\n * i.e. the base e raised to the power the value of this Decimal, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n */\r\nP.naturalExponential = P.exp = function () {\r\n  return naturalExponential(this);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the natural logarithm of the value of this Decimal,\r\n * rounded to `precision` significant digits using rounding mode `rounding`.\r\n *\r\n */\r\nP.naturalLogarithm = P.ln = function () {\r\n  return naturalLogarithm(this);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the value of this Decimal negated, i.e. as if multiplied by\r\n * -1.\r\n *\r\n */\r\nP.negated = P.neg = function () {\r\n  var x = new this.constructor(this);\r\n  x.s = -x.s;\r\n  return finalise(x);\r\n};\r\n\r\n\r\n/*\r\n *  n + 0 = n\r\n *  n + N = N\r\n *  n + I = I\r\n *  0 + n = n\r\n *  0 + 0 = 0\r\n *  0 + N = N\r\n *  0 + I = I\r\n *  N + n = N\r\n *  N + 0 = N\r\n *  N + N = N\r\n *  N + I = N\r\n *  I + n = I\r\n *  I + 0 = I\r\n *  I + N = N\r\n *  I + I = I\r\n *\r\n * Return a new Decimal whose value is the value of this Decimal plus `y`, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n */\r\nP.plus = P.add = function (y) {\r\n  var carry, d, e, i, k, len, pr, rm, xd, yd,\r\n    x = this,\r\n    Ctor = x.constructor;\r\n\r\n  y = new Ctor(y);\r\n\r\n  // If either is not finite...\r\n  if (!x.d || !y.d) {\r\n\r\n    // Return NaN if either is NaN.\r\n    if (!x.s || !y.s) y = new Ctor(NaN);\r\n\r\n    // Return x if y is finite and x is ±Infinity.\r\n    // Return x if both are ±Infinity with the same sign.\r\n    // Return NaN if both are ±Infinity with different signs.\r\n    // Return y if x is finite and y is ±Infinity.\r\n    else if (!x.d) y = new Ctor(y.d || x.s === y.s ? x : NaN);\r\n\r\n    return y;\r\n  }\r\n\r\n   // If signs differ...\r\n  if (x.s != y.s) {\r\n    y.s = -y.s;\r\n    return x.minus(y);\r\n  }\r\n\r\n  xd = x.d;\r\n  yd = y.d;\r\n  pr = Ctor.precision;\r\n  rm = Ctor.rounding;\r\n\r\n  // If either is zero...\r\n  if (!xd[0] || !yd[0]) {\r\n\r\n    // Return x if y is zero.\r\n    // Return y if y is non-zero.\r\n    if (!yd[0]) y = new Ctor(x);\r\n\r\n    return external ? finalise(y, pr, rm) : y;\r\n  }\r\n\r\n  // x and y are finite, non-zero numbers with the same sign.\r\n\r\n  // Calculate base 1e7 exponents.\r\n  k = mathfloor(x.e / LOG_BASE);\r\n  e = mathfloor(y.e / LOG_BASE);\r\n\r\n  xd = xd.slice();\r\n  i = k - e;\r\n\r\n  // If base 1e7 exponents differ...\r\n  if (i) {\r\n\r\n    if (i < 0) {\r\n      d = xd;\r\n      i = -i;\r\n      len = yd.length;\r\n    } else {\r\n      d = yd;\r\n      e = k;\r\n      len = xd.length;\r\n    }\r\n\r\n    // Limit number of zeros prepended to max(ceil(pr / LOG_BASE), len) + 1.\r\n    k = Math.ceil(pr / LOG_BASE);\r\n    len = k > len ? k + 1 : len + 1;\r\n\r\n    if (i > len) {\r\n      i = len;\r\n      d.length = 1;\r\n    }\r\n\r\n    // Prepend zeros to equalise exponents. Note: Faster to use reverse then do unshifts.\r\n    d.reverse();\r\n    for (; i--;) d.push(0);\r\n    d.reverse();\r\n  }\r\n\r\n  len = xd.length;\r\n  i = yd.length;\r\n\r\n  // If yd is longer than xd, swap xd and yd so xd points to the longer array.\r\n  if (len - i < 0) {\r\n    i = len;\r\n    d = yd;\r\n    yd = xd;\r\n    xd = d;\r\n  }\r\n\r\n  // Only start adding at yd.length - 1 as the further digits of xd can be left as they are.\r\n  for (carry = 0; i;) {\r\n    carry = (xd[--i] = xd[i] + yd[i] + carry) / BASE | 0;\r\n    xd[i] %= BASE;\r\n  }\r\n\r\n  if (carry) {\r\n    xd.unshift(carry);\r\n    ++e;\r\n  }\r\n\r\n  // Remove trailing zeros.\r\n  // No need to check for zero, as +x + +y != 0 && -x + -y != 0\r\n  for (len = xd.length; xd[--len] == 0;) xd.pop();\r\n\r\n  y.d = xd;\r\n  y.e = getBase10Exponent(xd, e);\r\n\r\n  return external ? finalise(y, pr, rm) : y;\r\n};\r\n\r\n\r\n/*\r\n * Return the number of significant digits of the value of this Decimal.\r\n *\r\n * [z] {boolean|number} Whether to count integer-part trailing zeros: true, false, 1 or 0.\r\n *\r\n */\r\nP.precision = P.sd = function (z) {\r\n  var k,\r\n    x = this;\r\n\r\n  if (z !== void 0 && z !== !!z && z !== 1 && z !== 0) throw Error(invalidArgument + z);\r\n\r\n  if (x.d) {\r\n    k = getPrecision(x.d);\r\n    if (z && x.e + 1 > k) k = x.e + 1;\r\n  } else {\r\n    k = NaN;\r\n  }\r\n\r\n  return k;\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the value of this Decimal rounded to a whole number using\r\n * rounding mode `rounding`.\r\n *\r\n */\r\nP.round = function () {\r\n  var x = this,\r\n    Ctor = x.constructor;\r\n\r\n  return finalise(new Ctor(x), x.e + 1, Ctor.rounding);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the sine of the value in radians of this Decimal.\r\n *\r\n * Domain: [-Infinity, Infinity]\r\n * Range: [-1, 1]\r\n *\r\n * sin(x) = x - x^3/3! + x^5/5! - ...\r\n *\r\n * sin(0)         = 0\r\n * sin(-0)        = -0\r\n * sin(Infinity)  = NaN\r\n * sin(-Infinity) = NaN\r\n * sin(NaN)       = NaN\r\n *\r\n */\r\nP.sine = P.sin = function () {\r\n  var pr, rm,\r\n    x = this,\r\n    Ctor = x.constructor;\r\n\r\n  if (!x.isFinite()) return new Ctor(NaN);\r\n  if (x.isZero()) return new Ctor(x);\r\n\r\n  pr = Ctor.precision;\r\n  rm = Ctor.rounding;\r\n  Ctor.precision = pr + Math.max(x.e, x.sd()) + LOG_BASE;\r\n  Ctor.rounding = 1;\r\n\r\n  x = sine(Ctor, toLessThanHalfPi(Ctor, x));\r\n\r\n  Ctor.precision = pr;\r\n  Ctor.rounding = rm;\r\n\r\n  return finalise(quadrant > 2 ? x.neg() : x, pr, rm, true);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the square root of this Decimal, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n *  sqrt(-n) =  N\r\n *  sqrt(N)  =  N\r\n *  sqrt(-I) =  N\r\n *  sqrt(I)  =  I\r\n *  sqrt(0)  =  0\r\n *  sqrt(-0) = -0\r\n *\r\n */\r\nP.squareRoot = P.sqrt = function () {\r\n  var m, n, sd, r, rep, t,\r\n    x = this,\r\n    d = x.d,\r\n    e = x.e,\r\n    s = x.s,\r\n    Ctor = x.constructor;\r\n\r\n  // Negative/NaN/Infinity/zero?\r\n  if (s !== 1 || !d || !d[0]) {\r\n    return new Ctor(!s || s < 0 && (!d || d[0]) ? NaN : d ? x : 1 / 0);\r\n  }\r\n\r\n  external = false;\r\n\r\n  // Initial estimate.\r\n  s = Math.sqrt(+x);\r\n\r\n  // Math.sqrt underflow/overflow?\r\n  // Pass x to Math.sqrt as integer, then adjust the exponent of the result.\r\n  if (s == 0 || s == 1 / 0) {\r\n    n = digitsToString(d);\r\n\r\n    if ((n.length + e) % 2 == 0) n += '0';\r\n    s = Math.sqrt(n);\r\n    e = mathfloor((e + 1) / 2) - (e < 0 || e % 2);\r\n\r\n    if (s == 1 / 0) {\r\n      n = '5e' + e;\r\n    } else {\r\n      n = s.toExponential();\r\n      n = n.slice(0, n.indexOf('e') + 1) + e;\r\n    }\r\n\r\n    r = new Ctor(n);\r\n  } else {\r\n    r = new Ctor(s.toString());\r\n  }\r\n\r\n  sd = (e = Ctor.precision) + 3;\r\n\r\n  // Newton-Raphson iteration.\r\n  for (;;) {\r\n    t = r;\r\n    r = t.plus(divide(x, t, sd + 2, 1)).times(0.5);\r\n\r\n    // TODO? Replace with for-loop and checkRoundingDigits.\r\n    if (digitsToString(t.d).slice(0, sd) === (n = digitsToString(r.d)).slice(0, sd)) {\r\n      n = n.slice(sd - 3, sd + 1);\r\n\r\n      // The 4th rounding digit may be in error by -1 so if the 4 rounding digits are 9999 or\r\n      // 4999, i.e. approaching a rounding boundary, continue the iteration.\r\n      if (n == '9999' || !rep && n == '4999') {\r\n\r\n        // On the first iteration only, check to see if rounding up gives the exact result as the\r\n        // nines may infinitely repeat.\r\n        if (!rep) {\r\n          finalise(t, e + 1, 0);\r\n\r\n          if (t.times(t).eq(x)) {\r\n            r = t;\r\n            break;\r\n          }\r\n        }\r\n\r\n        sd += 4;\r\n        rep = 1;\r\n      } else {\r\n\r\n        // If the rounding digits are null, 0{0,4} or 50{0,3}, check for an exact result.\r\n        // If not, then there are further digits and m will be truthy.\r\n        if (!+n || !+n.slice(1) && n.charAt(0) == '5') {\r\n\r\n          // Truncate to the first rounding digit.\r\n          finalise(r, e + 1, 1);\r\n          m = !r.times(r).eq(x);\r\n        }\r\n\r\n        break;\r\n      }\r\n    }\r\n  }\r\n\r\n  external = true;\r\n\r\n  return finalise(r, e, Ctor.rounding, m);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the tangent of the value in radians of this Decimal.\r\n *\r\n * Domain: [-Infinity, Infinity]\r\n * Range: [-Infinity, Infinity]\r\n *\r\n * tan(0)         = 0\r\n * tan(-0)        = -0\r\n * tan(Infinity)  = NaN\r\n * tan(-Infinity) = NaN\r\n * tan(NaN)       = NaN\r\n *\r\n */\r\nP.tangent = P.tan = function () {\r\n  var pr, rm,\r\n    x = this,\r\n    Ctor = x.constructor;\r\n\r\n  if (!x.isFinite()) return new Ctor(NaN);\r\n  if (x.isZero()) return new Ctor(x);\r\n\r\n  pr = Ctor.precision;\r\n  rm = Ctor.rounding;\r\n  Ctor.precision = pr + 10;\r\n  Ctor.rounding = 1;\r\n\r\n  x = x.sin();\r\n  x.s = 1;\r\n  x = divide(x, new Ctor(1).minus(x.times(x)).sqrt(), pr + 10, 0);\r\n\r\n  Ctor.precision = pr;\r\n  Ctor.rounding = rm;\r\n\r\n  return finalise(quadrant == 2 || quadrant == 4 ? x.neg() : x, pr, rm, true);\r\n};\r\n\r\n\r\n/*\r\n *  n * 0 = 0\r\n *  n * N = N\r\n *  n * I = I\r\n *  0 * n = 0\r\n *  0 * 0 = 0\r\n *  0 * N = N\r\n *  0 * I = N\r\n *  N * n = N\r\n *  N * 0 = N\r\n *  N * N = N\r\n *  N * I = N\r\n *  I * n = I\r\n *  I * 0 = N\r\n *  I * N = N\r\n *  I * I = I\r\n *\r\n * Return a new Decimal whose value is this Decimal times `y`, rounded to `precision` significant\r\n * digits using rounding mode `rounding`.\r\n *\r\n */\r\nP.times = P.mul = function (y) {\r\n  var carry, e, i, k, r, rL, t, xdL, ydL,\r\n    x = this,\r\n    Ctor = x.constructor,\r\n    xd = x.d,\r\n    yd = (y = new Ctor(y)).d;\r\n\r\n  y.s *= x.s;\r\n\r\n   // If either is NaN, ±Infinity or ±0...\r\n  if (!xd || !xd[0] || !yd || !yd[0]) {\r\n\r\n    return new Ctor(!y.s || xd && !xd[0] && !yd || yd && !yd[0] && !xd\r\n\r\n      // Return NaN if either is NaN.\r\n      // Return NaN if x is ±0 and y is ±Infinity, or y is ±0 and x is ±Infinity.\r\n      ? NaN\r\n\r\n      // Return ±Infinity if either is ±Infinity.\r\n      // Return ±0 if either is ±0.\r\n      : !xd || !yd ? y.s / 0 : y.s * 0);\r\n  }\r\n\r\n  e = mathfloor(x.e / LOG_BASE) + mathfloor(y.e / LOG_BASE);\r\n  xdL = xd.length;\r\n  ydL = yd.length;\r\n\r\n  // Ensure xd points to the longer array.\r\n  if (xdL < ydL) {\r\n    r = xd;\r\n    xd = yd;\r\n    yd = r;\r\n    rL = xdL;\r\n    xdL = ydL;\r\n    ydL = rL;\r\n  }\r\n\r\n  // Initialise the result array with zeros.\r\n  r = [];\r\n  rL = xdL + ydL;\r\n  for (i = rL; i--;) r.push(0);\r\n\r\n  // Multiply!\r\n  for (i = ydL; --i >= 0;) {\r\n    carry = 0;\r\n    for (k = xdL + i; k > i;) {\r\n      t = r[k] + yd[i] * xd[k - i - 1] + carry;\r\n      r[k--] = t % BASE | 0;\r\n      carry = t / BASE | 0;\r\n    }\r\n\r\n    r[k] = (r[k] + carry) % BASE | 0;\r\n  }\r\n\r\n  // Remove trailing zeros.\r\n  for (; !r[--rL];) r.pop();\r\n\r\n  if (carry) ++e;\r\n  else r.shift();\r\n\r\n  y.d = r;\r\n  y.e = getBase10Exponent(r, e);\r\n\r\n  return external ? finalise(y, Ctor.precision, Ctor.rounding) : y;\r\n};\r\n\r\n\r\n/*\r\n * Return a string representing the value of this Decimal in base 2, round to `sd` significant\r\n * digits using rounding mode `rm`.\r\n *\r\n * If the optional `sd` argument is present then return binary exponential notation.\r\n *\r\n * [sd] {number} Significant digits. Integer, 1 to MAX_DIGITS inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n */\r\nP.toBinary = function (sd, rm) {\r\n  return toStringBinary(this, 2, sd, rm);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the value of this Decimal rounded to a maximum of `dp`\r\n * decimal places using rounding mode `rm` or `rounding` if `rm` is omitted.\r\n *\r\n * If `dp` is omitted, return a new Decimal whose value is the value of this Decimal.\r\n *\r\n * [dp] {number} Decimal places. Integer, 0 to MAX_DIGITS inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n */\r\nP.toDecimalPlaces = P.toDP = function (dp, rm) {\r\n  var x = this,\r\n    Ctor = x.constructor;\r\n\r\n  x = new Ctor(x);\r\n  if (dp === void 0) return x;\r\n\r\n  checkInt32(dp, 0, MAX_DIGITS);\r\n\r\n  if (rm === void 0) rm = Ctor.rounding;\r\n  else checkInt32(rm, 0, 8);\r\n\r\n  return finalise(x, dp + x.e + 1, rm);\r\n};\r\n\r\n\r\n/*\r\n * Return a string representing the value of this Decimal in exponential notation rounded to\r\n * `dp` fixed decimal places using rounding mode `rounding`.\r\n *\r\n * [dp] {number} Decimal places. Integer, 0 to MAX_DIGITS inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n */\r\nP.toExponential = function (dp, rm) {\r\n  var str,\r\n    x = this,\r\n    Ctor = x.constructor;\r\n\r\n  if (dp === void 0) {\r\n    str = finiteToString(x, true);\r\n  } else {\r\n    checkInt32(dp, 0, MAX_DIGITS);\r\n\r\n    if (rm === void 0) rm = Ctor.rounding;\r\n    else checkInt32(rm, 0, 8);\r\n\r\n    x = finalise(new Ctor(x), dp + 1, rm);\r\n    str = finiteToString(x, true, dp + 1);\r\n  }\r\n\r\n  return x.isNeg() && !x.isZero() ? '-' + str : str;\r\n};\r\n\r\n\r\n/*\r\n * Return a string representing the value of this Decimal in normal (fixed-point) notation to\r\n * `dp` fixed decimal places and rounded using rounding mode `rm` or `rounding` if `rm` is\r\n * omitted.\r\n *\r\n * As with JavaScript numbers, (-0).toFixed(0) is '0', but e.g. (-0.00001).toFixed(0) is '-0'.\r\n *\r\n * [dp] {number} Decimal places. Integer, 0 to MAX_DIGITS inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n * (-0).toFixed(0) is '0', but (-0.1).toFixed(0) is '-0'.\r\n * (-0).toFixed(1) is '0.0', but (-0.01).toFixed(1) is '-0.0'.\r\n * (-0).toFixed(3) is '0.000'.\r\n * (-0.5).toFixed(0) is '-0'.\r\n *\r\n */\r\nP.toFixed = function (dp, rm) {\r\n  var str, y,\r\n    x = this,\r\n    Ctor = x.constructor;\r\n\r\n  if (dp === void 0) {\r\n    str = finiteToString(x);\r\n  } else {\r\n    checkInt32(dp, 0, MAX_DIGITS);\r\n\r\n    if (rm === void 0) rm = Ctor.rounding;\r\n    else checkInt32(rm, 0, 8);\r\n\r\n    y = finalise(new Ctor(x), dp + x.e + 1, rm);\r\n    str = finiteToString(y, false, dp + y.e + 1);\r\n  }\r\n\r\n  // To determine whether to add the minus sign look at the value before it was rounded,\r\n  // i.e. look at `x` rather than `y`.\r\n  return x.isNeg() && !x.isZero() ? '-' + str : str;\r\n};\r\n\r\n\r\n/*\r\n * Return an array representing the value of this Decimal as a simple fraction with an integer\r\n * numerator and an integer denominator.\r\n *\r\n * The denominator will be a positive non-zero value less than or equal to the specified maximum\r\n * denominator. If a maximum denominator is not specified, the denominator will be the lowest\r\n * value necessary to represent the number exactly.\r\n *\r\n * [maxD] {number|string|Decimal} Maximum denominator. Integer >= 1 and < Infinity.\r\n *\r\n */\r\nP.toFraction = function (maxD) {\r\n  var d, d0, d1, d2, e, k, n, n0, n1, pr, q, r,\r\n    x = this,\r\n    xd = x.d,\r\n    Ctor = x.constructor;\r\n\r\n  if (!xd) return new Ctor(x);\r\n\r\n  n1 = d0 = new Ctor(1);\r\n  d1 = n0 = new Ctor(0);\r\n\r\n  d = new Ctor(d1);\r\n  e = d.e = getPrecision(xd) - x.e - 1;\r\n  k = e % LOG_BASE;\r\n  d.d[0] = mathpow(10, k < 0 ? LOG_BASE + k : k);\r\n\r\n  if (maxD == null) {\r\n\r\n    // d is 10**e, the minimum max-denominator needed.\r\n    maxD = e > 0 ? d : n1;\r\n  } else {\r\n    n = new Ctor(maxD);\r\n    if (!n.isInt() || n.lt(n1)) throw Error(invalidArgument + n);\r\n    maxD = n.gt(d) ? (e > 0 ? d : n1) : n;\r\n  }\r\n\r\n  external = false;\r\n  n = new Ctor(digitsToString(xd));\r\n  pr = Ctor.precision;\r\n  Ctor.precision = e = xd.length * LOG_BASE * 2;\r\n\r\n  for (;;)  {\r\n    q = divide(n, d, 0, 1, 1);\r\n    d2 = d0.plus(q.times(d1));\r\n    if (d2.cmp(maxD) == 1) break;\r\n    d0 = d1;\r\n    d1 = d2;\r\n    d2 = n1;\r\n    n1 = n0.plus(q.times(d2));\r\n    n0 = d2;\r\n    d2 = d;\r\n    d = n.minus(q.times(d2));\r\n    n = d2;\r\n  }\r\n\r\n  d2 = divide(maxD.minus(d0), d1, 0, 1, 1);\r\n  n0 = n0.plus(d2.times(n1));\r\n  d0 = d0.plus(d2.times(d1));\r\n  n0.s = n1.s = x.s;\r\n\r\n  // Determine which fraction is closer to x, n0/d0 or n1/d1?\r\n  r = divide(n1, d1, e, 1).minus(x).abs().cmp(divide(n0, d0, e, 1).minus(x).abs()) < 1\r\n      ? [n1, d1] : [n0, d0];\r\n\r\n  Ctor.precision = pr;\r\n  external = true;\r\n\r\n  return r;\r\n};\r\n\r\n\r\n/*\r\n * Return a string representing the value of this Decimal in base 16, round to `sd` significant\r\n * digits using rounding mode `rm`.\r\n *\r\n * If the optional `sd` argument is present then return binary exponential notation.\r\n *\r\n * [sd] {number} Significant digits. Integer, 1 to MAX_DIGITS inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n */\r\nP.toHexadecimal = P.toHex = function (sd, rm) {\r\n  return toStringBinary(this, 16, sd, rm);\r\n};\r\n\r\n\r\n/*\r\n * Returns a new Decimal whose value is the nearest multiple of `y` in the direction of rounding\r\n * mode `rm`, or `Decimal.rounding` if `rm` is omitted, to the value of this Decimal.\r\n *\r\n * The return value will always have the same sign as this Decimal, unless either this Decimal\r\n * or `y` is NaN, in which case the return value will be also be NaN.\r\n *\r\n * The return value is not affected by the value of `precision`.\r\n *\r\n * y {number|string|Decimal} The magnitude to round to a multiple of.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n * 'toNearest() rounding mode not an integer: {rm}'\r\n * 'toNearest() rounding mode out of range: {rm}'\r\n *\r\n */\r\nP.toNearest = function (y, rm) {\r\n  var x = this,\r\n    Ctor = x.constructor;\r\n\r\n  x = new Ctor(x);\r\n\r\n  if (y == null) {\r\n\r\n    // If x is not finite, return x.\r\n    if (!x.d) return x;\r\n\r\n    y = new Ctor(1);\r\n    rm = Ctor.rounding;\r\n  } else {\r\n    y = new Ctor(y);\r\n    if (rm === void 0) {\r\n      rm = Ctor.rounding;\r\n    } else {\r\n      checkInt32(rm, 0, 8);\r\n    }\r\n\r\n    // If x is not finite, return x if y is not NaN, else NaN.\r\n    if (!x.d) return y.s ? x : y;\r\n\r\n    // If y is not finite, return Infinity with the sign of x if y is Infinity, else NaN.\r\n    if (!y.d) {\r\n      if (y.s) y.s = x.s;\r\n      return y;\r\n    }\r\n  }\r\n\r\n  // If y is not zero, calculate the nearest multiple of y to x.\r\n  if (y.d[0]) {\r\n    external = false;\r\n    x = divide(x, y, 0, rm, 1).times(y);\r\n    external = true;\r\n    finalise(x);\r\n\r\n  // If y is zero, return zero with the sign of x.\r\n  } else {\r\n    y.s = x.s;\r\n    x = y;\r\n  }\r\n\r\n  return x;\r\n};\r\n\r\n\r\n/*\r\n * Return the value of this Decimal converted to a number primitive.\r\n * Zero keeps its sign.\r\n *\r\n */\r\nP.toNumber = function () {\r\n  return +this;\r\n};\r\n\r\n\r\n/*\r\n * Return a string representing the value of this Decimal in base 8, round to `sd` significant\r\n * digits using rounding mode `rm`.\r\n *\r\n * If the optional `sd` argument is present then return binary exponential notation.\r\n *\r\n * [sd] {number} Significant digits. Integer, 1 to MAX_DIGITS inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n */\r\nP.toOctal = function (sd, rm) {\r\n  return toStringBinary(this, 8, sd, rm);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the value of this Decimal raised to the power `y`, rounded\r\n * to `precision` significant digits using rounding mode `rounding`.\r\n *\r\n * ECMAScript compliant.\r\n *\r\n *   pow(x, NaN)                           = NaN\r\n *   pow(x, ±0)                            = 1\r\n\r\n *   pow(NaN, non-zero)                    = NaN\r\n *   pow(abs(x) > 1, +Infinity)            = +Infinity\r\n *   pow(abs(x) > 1, -Infinity)            = +0\r\n *   pow(abs(x) == 1, ±Infinity)           = NaN\r\n *   pow(abs(x) < 1, +Infinity)            = +0\r\n *   pow(abs(x) < 1, -Infinity)            = +Infinity\r\n *   pow(+Infinity, y > 0)                 = +Infinity\r\n *   pow(+Infinity, y < 0)                 = +0\r\n *   pow(-Infinity, odd integer > 0)       = -Infinity\r\n *   pow(-Infinity, even integer > 0)      = +Infinity\r\n *   pow(-Infinity, odd integer < 0)       = -0\r\n *   pow(-Infinity, even integer < 0)      = +0\r\n *   pow(+0, y > 0)                        = +0\r\n *   pow(+0, y < 0)                        = +Infinity\r\n *   pow(-0, odd integer > 0)              = -0\r\n *   pow(-0, even integer > 0)             = +0\r\n *   pow(-0, odd integer < 0)              = -Infinity\r\n *   pow(-0, even integer < 0)             = +Infinity\r\n *   pow(finite x < 0, finite non-integer) = NaN\r\n *\r\n * For non-integer or very large exponents pow(x, y) is calculated using\r\n *\r\n *   x^y = exp(y*ln(x))\r\n *\r\n * Assuming the first 15 rounding digits are each equally likely to be any digit 0-9, the\r\n * probability of an incorrectly rounded result\r\n * P([49]9{14} | [50]0{14}) = 2 * 0.2 * 10^-14 = 4e-15 = 1/2.5e+14\r\n * i.e. 1 in 250,000,000,000,000\r\n *\r\n * If a result is incorrectly rounded the maximum error will be 1 ulp (unit in last place).\r\n *\r\n * y {number|string|Decimal} The power to which to raise this Decimal.\r\n *\r\n */\r\nP.toPower = P.pow = function (y) {\r\n  var e, k, pr, r, rm, s,\r\n    x = this,\r\n    Ctor = x.constructor,\r\n    yn = +(y = new Ctor(y));\r\n\r\n  // Either ±Infinity, NaN or ±0?\r\n  if (!x.d || !y.d || !x.d[0] || !y.d[0]) return new Ctor(mathpow(+x, yn));\r\n\r\n  x = new Ctor(x);\r\n\r\n  if (x.eq(1)) return x;\r\n\r\n  pr = Ctor.precision;\r\n  rm = Ctor.rounding;\r\n\r\n  if (y.eq(1)) return finalise(x, pr, rm);\r\n\r\n  // y exponent\r\n  e = mathfloor(y.e / LOG_BASE);\r\n\r\n  // If y is a small integer use the 'exponentiation by squaring' algorithm.\r\n  if (e >= y.d.length - 1 && (k = yn < 0 ? -yn : yn) <= MAX_SAFE_INTEGER) {\r\n    r = intPow(Ctor, x, k, pr);\r\n    return y.s < 0 ? new Ctor(1).div(r) : finalise(r, pr, rm);\r\n  }\r\n\r\n  s = x.s;\r\n\r\n  // if x is negative\r\n  if (s < 0) {\r\n\r\n    // if y is not an integer\r\n    if (e < y.d.length - 1) return new Ctor(NaN);\r\n\r\n    // Result is positive if x is negative and the last digit of integer y is even.\r\n    if ((y.d[e] & 1) == 0) s = 1;\r\n\r\n    // if x.eq(-1)\r\n    if (x.e == 0 && x.d[0] == 1 && x.d.length == 1) {\r\n      x.s = s;\r\n      return x;\r\n    }\r\n  }\r\n\r\n  // Estimate result exponent.\r\n  // x^y = 10^e,  where e = y * log10(x)\r\n  // log10(x) = log10(x_significand) + x_exponent\r\n  // log10(x_significand) = ln(x_significand) / ln(10)\r\n  k = mathpow(+x, yn);\r\n  e = k == 0 || !isFinite(k)\r\n    ? mathfloor(yn * (Math.log('0.' + digitsToString(x.d)) / Math.LN10 + x.e + 1))\r\n    : new Ctor(k + '').e;\r\n\r\n  // Exponent estimate may be incorrect e.g. x: 0.999999999999999999, y: 2.29, e: 0, r.e: -1.\r\n\r\n  // Overflow/underflow?\r\n  if (e > Ctor.maxE + 1 || e < Ctor.minE - 1) return new Ctor(e > 0 ? s / 0 : 0);\r\n\r\n  external = false;\r\n  Ctor.rounding = x.s = 1;\r\n\r\n  // Estimate the extra guard digits needed to ensure five correct rounding digits from\r\n  // naturalLogarithm(x). Example of failure without these extra digits (precision: 10):\r\n  // new Decimal(2.32456).pow('2087987436534566.46411')\r\n  // should be 1.162377823e+764914905173815, but is 1.162355823e+764914905173815\r\n  k = Math.min(12, (e + '').length);\r\n\r\n  // r = x^y = exp(y*ln(x))\r\n  r = naturalExponential(y.times(naturalLogarithm(x, pr + k)), pr);\r\n\r\n  // r may be Infinity, e.g. (0.9999999999999999).pow(-1e+40)\r\n  if (r.d) {\r\n\r\n    // Truncate to the required precision plus five rounding digits.\r\n    r = finalise(r, pr + 5, 1);\r\n\r\n    // If the rounding digits are [49]9999 or [50]0000 increase the precision by 10 and recalculate\r\n    // the result.\r\n    if (checkRoundingDigits(r.d, pr, rm)) {\r\n      e = pr + 10;\r\n\r\n      // Truncate to the increased precision plus five rounding digits.\r\n      r = finalise(naturalExponential(y.times(naturalLogarithm(x, e + k)), e), e + 5, 1);\r\n\r\n      // Check for 14 nines from the 2nd rounding digit (the first rounding digit may be 4 or 9).\r\n      if (+digitsToString(r.d).slice(pr + 1, pr + 15) + 1 == 1e14) {\r\n        r = finalise(r, pr + 1, 0);\r\n      }\r\n    }\r\n  }\r\n\r\n  r.s = s;\r\n  external = true;\r\n  Ctor.rounding = rm;\r\n\r\n  return finalise(r, pr, rm);\r\n};\r\n\r\n\r\n/*\r\n * Return a string representing the value of this Decimal rounded to `sd` significant digits\r\n * using rounding mode `rounding`.\r\n *\r\n * Return exponential notation if `sd` is less than the number of digits necessary to represent\r\n * the integer part of the value in normal notation.\r\n *\r\n * [sd] {number} Significant digits. Integer, 1 to MAX_DIGITS inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n */\r\nP.toPrecision = function (sd, rm) {\r\n  var str,\r\n    x = this,\r\n    Ctor = x.constructor;\r\n\r\n  if (sd === void 0) {\r\n    str = finiteToString(x, x.e <= Ctor.toExpNeg || x.e >= Ctor.toExpPos);\r\n  } else {\r\n    checkInt32(sd, 1, MAX_DIGITS);\r\n\r\n    if (rm === void 0) rm = Ctor.rounding;\r\n    else checkInt32(rm, 0, 8);\r\n\r\n    x = finalise(new Ctor(x), sd, rm);\r\n    str = finiteToString(x, sd <= x.e || x.e <= Ctor.toExpNeg, sd);\r\n  }\r\n\r\n  return x.isNeg() && !x.isZero() ? '-' + str : str;\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the value of this Decimal rounded to a maximum of `sd`\r\n * significant digits using rounding mode `rm`, or to `precision` and `rounding` respectively if\r\n * omitted.\r\n *\r\n * [sd] {number} Significant digits. Integer, 1 to MAX_DIGITS inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n * 'toSD() digits out of range: {sd}'\r\n * 'toSD() digits not an integer: {sd}'\r\n * 'toSD() rounding mode not an integer: {rm}'\r\n * 'toSD() rounding mode out of range: {rm}'\r\n *\r\n */\r\nP.toSignificantDigits = P.toSD = function (sd, rm) {\r\n  var x = this,\r\n    Ctor = x.constructor;\r\n\r\n  if (sd === void 0) {\r\n    sd = Ctor.precision;\r\n    rm = Ctor.rounding;\r\n  } else {\r\n    checkInt32(sd, 1, MAX_DIGITS);\r\n\r\n    if (rm === void 0) rm = Ctor.rounding;\r\n    else checkInt32(rm, 0, 8);\r\n  }\r\n\r\n  return finalise(new Ctor(x), sd, rm);\r\n};\r\n\r\n\r\n/*\r\n * Return a string representing the value of this Decimal.\r\n *\r\n * Return exponential notation if this Decimal has a positive exponent equal to or greater than\r\n * `toExpPos`, or a negative exponent equal to or less than `toExpNeg`.\r\n *\r\n */\r\nP.toString = function () {\r\n  var x = this,\r\n    Ctor = x.constructor,\r\n    str = finiteToString(x, x.e <= Ctor.toExpNeg || x.e >= Ctor.toExpPos);\r\n\r\n  return x.isNeg() && !x.isZero() ? '-' + str : str;\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the value of this Decimal truncated to a whole number.\r\n *\r\n */\r\nP.truncated = P.trunc = function () {\r\n  return finalise(new this.constructor(this), this.e + 1, 1);\r\n};\r\n\r\n\r\n/*\r\n * Return a string representing the value of this Decimal.\r\n * Unlike `toString`, negative zero will include the minus sign.\r\n *\r\n */\r\nP.valueOf = P.toJSON = function () {\r\n  var x = this,\r\n    Ctor = x.constructor,\r\n    str = finiteToString(x, x.e <= Ctor.toExpNeg || x.e >= Ctor.toExpPos);\r\n\r\n  return x.isNeg() ? '-' + str : str;\r\n};\r\n\r\n\r\n// Helper functions for Decimal.prototype (P) and/or Decimal methods, and their callers.\r\n\r\n\r\n/*\r\n *  digitsToString           P.cubeRoot, P.logarithm, P.squareRoot, P.toFraction, P.toPower,\r\n *                           finiteToString, naturalExponential, naturalLogarithm\r\n *  checkInt32               P.toDecimalPlaces, P.toExponential, P.toFixed, P.toNearest,\r\n *                           P.toPrecision, P.toSignificantDigits, toStringBinary, random\r\n *  checkRoundingDigits      P.logarithm, P.toPower, naturalExponential, naturalLogarithm\r\n *  convertBase              toStringBinary, parseOther\r\n *  cos                      P.cos\r\n *  divide                   P.atanh, P.cubeRoot, P.dividedBy, P.dividedToIntegerBy,\r\n *                           P.logarithm, P.modulo, P.squareRoot, P.tan, P.tanh, P.toFraction,\r\n *                           P.toNearest, toStringBinary, naturalExponential, naturalLogarithm,\r\n *                           taylorSeries, atan2, parseOther\r\n *  finalise                 P.absoluteValue, P.atan, P.atanh, P.ceil, P.cos, P.cosh,\r\n *                           P.cubeRoot, P.dividedToIntegerBy, P.floor, P.logarithm, P.minus,\r\n *                           P.modulo, P.negated, P.plus, P.round, P.sin, P.sinh, P.squareRoot,\r\n *                           P.tan, P.times, P.toDecimalPlaces, P.toExponential, P.toFixed,\r\n *                           P.toNearest, P.toPower, P.toPrecision, P.toSignificantDigits,\r\n *                           P.truncated, divide, getLn10, getPi, naturalExponential,\r\n *                           naturalLogarithm, ceil, floor, round, trunc\r\n *  finiteToString           P.toExponential, P.toFixed, P.toPrecision, P.toString, P.valueOf,\r\n *                           toStringBinary\r\n *  getBase10Exponent        P.minus, P.plus, P.times, parseOther\r\n *  getLn10                  P.logarithm, naturalLogarithm\r\n *  getPi                    P.acos, P.asin, P.atan, toLessThanHalfPi, atan2\r\n *  getPrecision             P.precision, P.toFraction\r\n *  getZeroString            digitsToString, finiteToString\r\n *  intPow                   P.toPower, parseOther\r\n *  isOdd                    toLessThanHalfPi\r\n *  maxOrMin                 max, min\r\n *  naturalExponential       P.naturalExponential, P.toPower\r\n *  naturalLogarithm         P.acosh, P.asinh, P.atanh, P.logarithm, P.naturalLogarithm,\r\n *                           P.toPower, naturalExponential\r\n *  nonFiniteToString        finiteToString, toStringBinary\r\n *  parseDecimal             Decimal\r\n *  parseOther               Decimal\r\n *  sin                      P.sin\r\n *  taylorSeries             P.cosh, P.sinh, cos, sin\r\n *  toLessThanHalfPi         P.cos, P.sin\r\n *  toStringBinary           P.toBinary, P.toHexadecimal, P.toOctal\r\n *  truncate                 intPow\r\n *\r\n *  Throws:                  P.logarithm, P.precision, P.toFraction, checkInt32, getLn10, getPi,\r\n *                           naturalLogarithm, config, parseOther, random, Decimal\r\n */\r\n\r\n\r\nfunction digitsToString(d) {\r\n  var i, k, ws,\r\n    indexOfLastWord = d.length - 1,\r\n    str = '',\r\n    w = d[0];\r\n\r\n  if (indexOfLastWord > 0) {\r\n    str += w;\r\n    for (i = 1; i < indexOfLastWord; i++) {\r\n      ws = d[i] + '';\r\n      k = LOG_BASE - ws.length;\r\n      if (k) str += getZeroString(k);\r\n      str += ws;\r\n    }\r\n\r\n    w = d[i];\r\n    ws = w + '';\r\n    k = LOG_BASE - ws.length;\r\n    if (k) str += getZeroString(k);\r\n  } else if (w === 0) {\r\n    return '0';\r\n  }\r\n\r\n  // Remove trailing zeros of last w.\r\n  for (; w % 10 === 0;) w /= 10;\r\n\r\n  return str + w;\r\n}\r\n\r\n\r\nfunction checkInt32(i, min, max) {\r\n  if (i !== ~~i || i < min || i > max) {\r\n    throw Error(invalidArgument + i);\r\n  }\r\n}\r\n\r\n\r\n/*\r\n * Check 5 rounding digits if `repeating` is null, 4 otherwise.\r\n * `repeating == null` if caller is `log` or `pow`,\r\n * `repeating != null` if caller is `naturalLogarithm` or `naturalExponential`.\r\n */\r\nfunction checkRoundingDigits(d, i, rm, repeating) {\r\n  var di, k, r, rd;\r\n\r\n  // Get the length of the first word of the array d.\r\n  for (k = d[0]; k >= 10; k /= 10) --i;\r\n\r\n  // Is the rounding digit in the first word of d?\r\n  if (--i < 0) {\r\n    i += LOG_BASE;\r\n    di = 0;\r\n  } else {\r\n    di = Math.ceil((i + 1) / LOG_BASE);\r\n    i %= LOG_BASE;\r\n  }\r\n\r\n  // i is the index (0 - 6) of the rounding digit.\r\n  // E.g. if within the word 3487563 the first rounding digit is 5,\r\n  // then i = 4, k = 1000, rd = 3487563 % 1000 = 563\r\n  k = mathpow(10, LOG_BASE - i);\r\n  rd = d[di] % k | 0;\r\n\r\n  if (repeating == null) {\r\n    if (i < 3) {\r\n      if (i == 0) rd = rd / 100 | 0;\r\n      else if (i == 1) rd = rd / 10 | 0;\r\n      r = rm < 4 && rd == 99999 || rm > 3 && rd == 49999 || rd == 50000 || rd == 0;\r\n    } else {\r\n      r = (rm < 4 && rd + 1 == k || rm > 3 && rd + 1 == k / 2) &&\r\n        (d[di + 1] / k / 100 | 0) == mathpow(10, i - 2) - 1 ||\r\n          (rd == k / 2 || rd == 0) && (d[di + 1] / k / 100 | 0) == 0;\r\n    }\r\n  } else {\r\n    if (i < 4) {\r\n      if (i == 0) rd = rd / 1000 | 0;\r\n      else if (i == 1) rd = rd / 100 | 0;\r\n      else if (i == 2) rd = rd / 10 | 0;\r\n      r = (repeating || rm < 4) && rd == 9999 || !repeating && rm > 3 && rd == 4999;\r\n    } else {\r\n      r = ((repeating || rm < 4) && rd + 1 == k ||\r\n      (!repeating && rm > 3) && rd + 1 == k / 2) &&\r\n        (d[di + 1] / k / 1000 | 0) == mathpow(10, i - 3) - 1;\r\n    }\r\n  }\r\n\r\n  return r;\r\n}\r\n\r\n\r\n// Convert string of `baseIn` to an array of numbers of `baseOut`.\r\n// Eg. convertBase('255', 10, 16) returns [15, 15].\r\n// Eg. convertBase('ff', 16, 10) returns [2, 5, 5].\r\nfunction convertBase(str, baseIn, baseOut) {\r\n  var j,\r\n    arr = [0],\r\n    arrL,\r\n    i = 0,\r\n    strL = str.length;\r\n\r\n  for (; i < strL;) {\r\n    for (arrL = arr.length; arrL--;) arr[arrL] *= baseIn;\r\n    arr[0] += NUMERALS.indexOf(str.charAt(i++));\r\n    for (j = 0; j < arr.length; j++) {\r\n      if (arr[j] > baseOut - 1) {\r\n        if (arr[j + 1] === void 0) arr[j + 1] = 0;\r\n        arr[j + 1] += arr[j] / baseOut | 0;\r\n        arr[j] %= baseOut;\r\n      }\r\n    }\r\n  }\r\n\r\n  return arr.reverse();\r\n}\r\n\r\n\r\n/*\r\n * cos(x) = 1 - x^2/2! + x^4/4! - ...\r\n * |x| < pi/2\r\n *\r\n */\r\nfunction cosine(Ctor, x) {\r\n  var k, len, y;\r\n\r\n  if (x.isZero()) return x;\r\n\r\n  // Argument reduction: cos(4x) = 8*(cos^4(x) - cos^2(x)) + 1\r\n  // i.e. cos(x) = 8*(cos^4(x/4) - cos^2(x/4)) + 1\r\n\r\n  // Estimate the optimum number of times to use the argument reduction.\r\n  len = x.d.length;\r\n  if (len < 32) {\r\n    k = Math.ceil(len / 3);\r\n    y = (1 / tinyPow(4, k)).toString();\r\n  } else {\r\n    k = 16;\r\n    y = '2.3283064365386962890625e-10';\r\n  }\r\n\r\n  Ctor.precision += k;\r\n\r\n  x = taylorSeries(Ctor, 1, x.times(y), new Ctor(1));\r\n\r\n  // Reverse argument reduction\r\n  for (var i = k; i--;) {\r\n    var cos2x = x.times(x);\r\n    x = cos2x.times(cos2x).minus(cos2x).times(8).plus(1);\r\n  }\r\n\r\n  Ctor.precision -= k;\r\n\r\n  return x;\r\n}\r\n\r\n\r\n/*\r\n * Perform division in the specified base.\r\n */\r\nvar divide = (function () {\r\n\r\n  // Assumes non-zero x and k, and hence non-zero result.\r\n  function multiplyInteger(x, k, base) {\r\n    var temp,\r\n      carry = 0,\r\n      i = x.length;\r\n\r\n    for (x = x.slice(); i--;) {\r\n      temp = x[i] * k + carry;\r\n      x[i] = temp % base | 0;\r\n      carry = temp / base | 0;\r\n    }\r\n\r\n    if (carry) x.unshift(carry);\r\n\r\n    return x;\r\n  }\r\n\r\n  function compare(a, b, aL, bL) {\r\n    var i, r;\r\n\r\n    if (aL != bL) {\r\n      r = aL > bL ? 1 : -1;\r\n    } else {\r\n      for (i = r = 0; i < aL; i++) {\r\n        if (a[i] != b[i]) {\r\n          r = a[i] > b[i] ? 1 : -1;\r\n          break;\r\n        }\r\n      }\r\n    }\r\n\r\n    return r;\r\n  }\r\n\r\n  function subtract(a, b, aL, base) {\r\n    var i = 0;\r\n\r\n    // Subtract b from a.\r\n    for (; aL--;) {\r\n      a[aL] -= i;\r\n      i = a[aL] < b[aL] ? 1 : 0;\r\n      a[aL] = i * base + a[aL] - b[aL];\r\n    }\r\n\r\n    // Remove leading zeros.\r\n    for (; !a[0] && a.length > 1;) a.shift();\r\n  }\r\n\r\n  return function (x, y, pr, rm, dp, base) {\r\n    var cmp, e, i, k, logBase, more, prod, prodL, q, qd, rem, remL, rem0, sd, t, xi, xL, yd0,\r\n      yL, yz,\r\n      Ctor = x.constructor,\r\n      sign = x.s == y.s ? 1 : -1,\r\n      xd = x.d,\r\n      yd = y.d;\r\n\r\n    // Either NaN, Infinity or 0?\r\n    if (!xd || !xd[0] || !yd || !yd[0]) {\r\n\r\n      return new Ctor(// Return NaN if either NaN, or both Infinity or 0.\r\n        !x.s || !y.s || (xd ? yd && xd[0] == yd[0] : !yd) ? NaN :\r\n\r\n        // Return ±0 if x is 0 or y is ±Infinity, or return ±Infinity as y is 0.\r\n        xd && xd[0] == 0 || !yd ? sign * 0 : sign / 0);\r\n    }\r\n\r\n    if (base) {\r\n      logBase = 1;\r\n      e = x.e - y.e;\r\n    } else {\r\n      base = BASE;\r\n      logBase = LOG_BASE;\r\n      e = mathfloor(x.e / logBase) - mathfloor(y.e / logBase);\r\n    }\r\n\r\n    yL = yd.length;\r\n    xL = xd.length;\r\n    q = new Ctor(sign);\r\n    qd = q.d = [];\r\n\r\n    // Result exponent may be one less than e.\r\n    // The digit array of a Decimal from toStringBinary may have trailing zeros.\r\n    for (i = 0; yd[i] == (xd[i] || 0); i++);\r\n\r\n    if (yd[i] > (xd[i] || 0)) e--;\r\n\r\n    if (pr == null) {\r\n      sd = pr = Ctor.precision;\r\n      rm = Ctor.rounding;\r\n    } else if (dp) {\r\n      sd = pr + (x.e - y.e) + 1;\r\n    } else {\r\n      sd = pr;\r\n    }\r\n\r\n    if (sd < 0) {\r\n      qd.push(1);\r\n      more = true;\r\n    } else {\r\n\r\n      // Convert precision in number of base 10 digits to base 1e7 digits.\r\n      sd = sd / logBase + 2 | 0;\r\n      i = 0;\r\n\r\n      // divisor < 1e7\r\n      if (yL == 1) {\r\n        k = 0;\r\n        yd = yd[0];\r\n        sd++;\r\n\r\n        // k is the carry.\r\n        for (; (i < xL || k) && sd--; i++) {\r\n          t = k * base + (xd[i] || 0);\r\n          qd[i] = t / yd | 0;\r\n          k = t % yd | 0;\r\n        }\r\n\r\n        more = k || i < xL;\r\n\r\n      // divisor >= 1e7\r\n      } else {\r\n\r\n        // Normalise xd and yd so highest order digit of yd is >= base/2\r\n        k = base / (yd[0] + 1) | 0;\r\n\r\n        if (k > 1) {\r\n          yd = multiplyInteger(yd, k, base);\r\n          xd = multiplyInteger(xd, k, base);\r\n          yL = yd.length;\r\n          xL = xd.length;\r\n        }\r\n\r\n        xi = yL;\r\n        rem = xd.slice(0, yL);\r\n        remL = rem.length;\r\n\r\n        // Add zeros to make remainder as long as divisor.\r\n        for (; remL < yL;) rem[remL++] = 0;\r\n\r\n        yz = yd.slice();\r\n        yz.unshift(0);\r\n        yd0 = yd[0];\r\n\r\n        if (yd[1] >= base / 2) ++yd0;\r\n\r\n        do {\r\n          k = 0;\r\n\r\n          // Compare divisor and remainder.\r\n          cmp = compare(yd, rem, yL, remL);\r\n\r\n          // If divisor < remainder.\r\n          if (cmp < 0) {\r\n\r\n            // Calculate trial digit, k.\r\n            rem0 = rem[0];\r\n            if (yL != remL) rem0 = rem0 * base + (rem[1] || 0);\r\n\r\n            // k will be how many times the divisor goes into the current remainder.\r\n            k = rem0 / yd0 | 0;\r\n\r\n            //  Algorithm:\r\n            //  1. product = divisor * trial digit (k)\r\n            //  2. if product > remainder: product -= divisor, k--\r\n            //  3. remainder -= product\r\n            //  4. if product was < remainder at 2:\r\n            //    5. compare new remainder and divisor\r\n            //    6. If remainder > divisor: remainder -= divisor, k++\r\n\r\n            if (k > 1) {\r\n              if (k >= base) k = base - 1;\r\n\r\n              // product = divisor * trial digit.\r\n              prod = multiplyInteger(yd, k, base);\r\n              prodL = prod.length;\r\n              remL = rem.length;\r\n\r\n              // Compare product and remainder.\r\n              cmp = compare(prod, rem, prodL, remL);\r\n\r\n              // product > remainder.\r\n              if (cmp == 1) {\r\n                k--;\r\n\r\n                // Subtract divisor from product.\r\n                subtract(prod, yL < prodL ? yz : yd, prodL, base);\r\n              }\r\n            } else {\r\n\r\n              // cmp is -1.\r\n              // If k is 0, there is no need to compare yd and rem again below, so change cmp to 1\r\n              // to avoid it. If k is 1 there is a need to compare yd and rem again below.\r\n              if (k == 0) cmp = k = 1;\r\n              prod = yd.slice();\r\n            }\r\n\r\n            prodL = prod.length;\r\n            if (prodL < remL) prod.unshift(0);\r\n\r\n            // Subtract product from remainder.\r\n            subtract(rem, prod, remL, base);\r\n\r\n            // If product was < previous remainder.\r\n            if (cmp == -1) {\r\n              remL = rem.length;\r\n\r\n              // Compare divisor and new remainder.\r\n              cmp = compare(yd, rem, yL, remL);\r\n\r\n              // If divisor < new remainder, subtract divisor from remainder.\r\n              if (cmp < 1) {\r\n                k++;\r\n\r\n                // Subtract divisor from remainder.\r\n                subtract(rem, yL < remL ? yz : yd, remL, base);\r\n              }\r\n            }\r\n\r\n            remL = rem.length;\r\n          } else if (cmp === 0) {\r\n            k++;\r\n            rem = [0];\r\n          }    // if cmp === 1, k will be 0\r\n\r\n          // Add the next digit, k, to the result array.\r\n          qd[i++] = k;\r\n\r\n          // Update the remainder.\r\n          if (cmp && rem[0]) {\r\n            rem[remL++] = xd[xi] || 0;\r\n          } else {\r\n            rem = [xd[xi]];\r\n            remL = 1;\r\n          }\r\n\r\n        } while ((xi++ < xL || rem[0] !== void 0) && sd--);\r\n\r\n        more = rem[0] !== void 0;\r\n      }\r\n\r\n      // Leading zero?\r\n      if (!qd[0]) qd.shift();\r\n    }\r\n\r\n    // logBase is 1 when divide is being used for base conversion.\r\n    if (logBase == 1) {\r\n      q.e = e;\r\n      inexact = more;\r\n    } else {\r\n\r\n      // To calculate q.e, first get the number of digits of qd[0].\r\n      for (i = 1, k = qd[0]; k >= 10; k /= 10) i++;\r\n      q.e = i + e * logBase - 1;\r\n\r\n      finalise(q, dp ? pr + q.e + 1 : pr, rm, more);\r\n    }\r\n\r\n    return q;\r\n  };\r\n})();\r\n\r\n\r\n/*\r\n * Round `x` to `sd` significant digits using rounding mode `rm`.\r\n * Check for over/under-flow.\r\n */\r\n function finalise(x, sd, rm, isTruncated) {\r\n  var digits, i, j, k, rd, roundUp, w, xd, xdi,\r\n    Ctor = x.constructor;\r\n\r\n  // Don't round if sd is null or undefined.\r\n  out: if (sd != null) {\r\n    xd = x.d;\r\n\r\n    // Infinity/NaN.\r\n    if (!xd) return x;\r\n\r\n    // rd: the rounding digit, i.e. the digit after the digit that may be rounded up.\r\n    // w: the word of xd containing rd, a base 1e7 number.\r\n    // xdi: the index of w within xd.\r\n    // digits: the number of digits of w.\r\n    // i: what would be the index of rd within w if all the numbers were 7 digits long (i.e. if\r\n    // they had leading zeros)\r\n    // j: if > 0, the actual index of rd within w (if < 0, rd is a leading zero).\r\n\r\n    // Get the length of the first word of the digits array xd.\r\n    for (digits = 1, k = xd[0]; k >= 10; k /= 10) digits++;\r\n    i = sd - digits;\r\n\r\n    // Is the rounding digit in the first word of xd?\r\n    if (i < 0) {\r\n      i += LOG_BASE;\r\n      j = sd;\r\n      w = xd[xdi = 0];\r\n\r\n      // Get the rounding digit at index j of w.\r\n      rd = w / mathpow(10, digits - j - 1) % 10 | 0;\r\n    } else {\r\n      xdi = Math.ceil((i + 1) / LOG_BASE);\r\n      k = xd.length;\r\n      if (xdi >= k) {\r\n        if (isTruncated) {\r\n\r\n          // Needed by `naturalExponential`, `naturalLogarithm` and `squareRoot`.\r\n          for (; k++ <= xdi;) xd.push(0);\r\n          w = rd = 0;\r\n          digits = 1;\r\n          i %= LOG_BASE;\r\n          j = i - LOG_BASE + 1;\r\n        } else {\r\n          break out;\r\n        }\r\n      } else {\r\n        w = k = xd[xdi];\r\n\r\n        // Get the number of digits of w.\r\n        for (digits = 1; k >= 10; k /= 10) digits++;\r\n\r\n        // Get the index of rd within w.\r\n        i %= LOG_BASE;\r\n\r\n        // Get the index of rd within w, adjusted for leading zeros.\r\n        // The number of leading zeros of w is given by LOG_BASE - digits.\r\n        j = i - LOG_BASE + digits;\r\n\r\n        // Get the rounding digit at index j of w.\r\n        rd = j < 0 ? 0 : w / mathpow(10, digits - j - 1) % 10 | 0;\r\n      }\r\n    }\r\n\r\n    // Are there any non-zero digits after the rounding digit?\r\n    isTruncated = isTruncated || sd < 0 ||\r\n      xd[xdi + 1] !== void 0 || (j < 0 ? w : w % mathpow(10, digits - j - 1));\r\n\r\n    // The expression `w % mathpow(10, digits - j - 1)` returns all the digits of w to the right\r\n    // of the digit at (left-to-right) index j, e.g. if w is 908714 and j is 2, the expression\r\n    // will give 714.\r\n\r\n    roundUp = rm < 4\r\n      ? (rd || isTruncated) && (rm == 0 || rm == (x.s < 0 ? 3 : 2))\r\n      : rd > 5 || rd == 5 && (rm == 4 || isTruncated || rm == 6 &&\r\n\r\n        // Check whether the digit to the left of the rounding digit is odd.\r\n        ((i > 0 ? j > 0 ? w / mathpow(10, digits - j) : 0 : xd[xdi - 1]) % 10) & 1 ||\r\n          rm == (x.s < 0 ? 8 : 7));\r\n\r\n    if (sd < 1 || !xd[0]) {\r\n      xd.length = 0;\r\n      if (roundUp) {\r\n\r\n        // Convert sd to decimal places.\r\n        sd -= x.e + 1;\r\n\r\n        // 1, 0.1, 0.01, 0.001, 0.0001 etc.\r\n        xd[0] = mathpow(10, (LOG_BASE - sd % LOG_BASE) % LOG_BASE);\r\n        x.e = -sd || 0;\r\n      } else {\r\n\r\n        // Zero.\r\n        xd[0] = x.e = 0;\r\n      }\r\n\r\n      return x;\r\n    }\r\n\r\n    // Remove excess digits.\r\n    if (i == 0) {\r\n      xd.length = xdi;\r\n      k = 1;\r\n      xdi--;\r\n    } else {\r\n      xd.length = xdi + 1;\r\n      k = mathpow(10, LOG_BASE - i);\r\n\r\n      // E.g. 56700 becomes 56000 if 7 is the rounding digit.\r\n      // j > 0 means i > number of leading zeros of w.\r\n      xd[xdi] = j > 0 ? (w / mathpow(10, digits - j) % mathpow(10, j) | 0) * k : 0;\r\n    }\r\n\r\n    if (roundUp) {\r\n      for (;;) {\r\n\r\n        // Is the digit to be rounded up in the first word of xd?\r\n        if (xdi == 0) {\r\n\r\n          // i will be the length of xd[0] before k is added.\r\n          for (i = 1, j = xd[0]; j >= 10; j /= 10) i++;\r\n          j = xd[0] += k;\r\n          for (k = 1; j >= 10; j /= 10) k++;\r\n\r\n          // if i != k the length has increased.\r\n          if (i != k) {\r\n            x.e++;\r\n            if (xd[0] == BASE) xd[0] = 1;\r\n          }\r\n\r\n          break;\r\n        } else {\r\n          xd[xdi] += k;\r\n          if (xd[xdi] != BASE) break;\r\n          xd[xdi--] = 0;\r\n          k = 1;\r\n        }\r\n      }\r\n    }\r\n\r\n    // Remove trailing zeros.\r\n    for (i = xd.length; xd[--i] === 0;) xd.pop();\r\n  }\r\n\r\n  if (external) {\r\n\r\n    // Overflow?\r\n    if (x.e > Ctor.maxE) {\r\n\r\n      // Infinity.\r\n      x.d = null;\r\n      x.e = NaN;\r\n\r\n    // Underflow?\r\n    } else if (x.e < Ctor.minE) {\r\n\r\n      // Zero.\r\n      x.e = 0;\r\n      x.d = [0];\r\n      // Ctor.underflow = true;\r\n    } // else Ctor.underflow = false;\r\n  }\r\n\r\n  return x;\r\n}\r\n\r\n\r\nfunction finiteToString(x, isExp, sd) {\r\n  if (!x.isFinite()) return nonFiniteToString(x);\r\n  var k,\r\n    e = x.e,\r\n    str = digitsToString(x.d),\r\n    len = str.length;\r\n\r\n  if (isExp) {\r\n    if (sd && (k = sd - len) > 0) {\r\n      str = str.charAt(0) + '.' + str.slice(1) + getZeroString(k);\r\n    } else if (len > 1) {\r\n      str = str.charAt(0) + '.' + str.slice(1);\r\n    }\r\n\r\n    str = str + (x.e < 0 ? 'e' : 'e+') + x.e;\r\n  } else if (e < 0) {\r\n    str = '0.' + getZeroString(-e - 1) + str;\r\n    if (sd && (k = sd - len) > 0) str += getZeroString(k);\r\n  } else if (e >= len) {\r\n    str += getZeroString(e + 1 - len);\r\n    if (sd && (k = sd - e - 1) > 0) str = str + '.' + getZeroString(k);\r\n  } else {\r\n    if ((k = e + 1) < len) str = str.slice(0, k) + '.' + str.slice(k);\r\n    if (sd && (k = sd - len) > 0) {\r\n      if (e + 1 === len) str += '.';\r\n      str += getZeroString(k);\r\n    }\r\n  }\r\n\r\n  return str;\r\n}\r\n\r\n\r\n// Calculate the base 10 exponent from the base 1e7 exponent.\r\nfunction getBase10Exponent(digits, e) {\r\n  var w = digits[0];\r\n\r\n  // Add the number of digits of the first word of the digits array.\r\n  for ( e *= LOG_BASE; w >= 10; w /= 10) e++;\r\n  return e;\r\n}\r\n\r\n\r\nfunction getLn10(Ctor, sd, pr) {\r\n  if (sd > LN10_PRECISION) {\r\n\r\n    // Reset global state in case the exception is caught.\r\n    external = true;\r\n    if (pr) Ctor.precision = pr;\r\n    throw Error(precisionLimitExceeded);\r\n  }\r\n  return finalise(new Ctor(LN10), sd, 1, true);\r\n}\r\n\r\n\r\nfunction getPi(Ctor, sd, rm) {\r\n  if (sd > PI_PRECISION) throw Error(precisionLimitExceeded);\r\n  return finalise(new Ctor(PI), sd, rm, true);\r\n}\r\n\r\n\r\nfunction getPrecision(digits) {\r\n  var w = digits.length - 1,\r\n    len = w * LOG_BASE + 1;\r\n\r\n  w = digits[w];\r\n\r\n  // If non-zero...\r\n  if (w) {\r\n\r\n    // Subtract the number of trailing zeros of the last word.\r\n    for (; w % 10 == 0; w /= 10) len--;\r\n\r\n    // Add the number of digits of the first word.\r\n    for (w = digits[0]; w >= 10; w /= 10) len++;\r\n  }\r\n\r\n  return len;\r\n}\r\n\r\n\r\nfunction getZeroString(k) {\r\n  var zs = '';\r\n  for (; k--;) zs += '0';\r\n  return zs;\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the value of Decimal `x` to the power `n`, where `n` is an\r\n * integer of type number.\r\n *\r\n * Implements 'exponentiation by squaring'. Called by `pow` and `parseOther`.\r\n *\r\n */\r\nfunction intPow(Ctor, x, n, pr) {\r\n  var isTruncated,\r\n    r = new Ctor(1),\r\n\r\n    // Max n of 9007199254740991 takes 53 loop iterations.\r\n    // Maximum digits array length; leaves [28, 34] guard digits.\r\n    k = Math.ceil(pr / LOG_BASE + 4);\r\n\r\n  external = false;\r\n\r\n  for (;;) {\r\n    if (n % 2) {\r\n      r = r.times(x);\r\n      if (truncate(r.d, k)) isTruncated = true;\r\n    }\r\n\r\n    n = mathfloor(n / 2);\r\n    if (n === 0) {\r\n\r\n      // To ensure correct rounding when r.d is truncated, increment the last word if it is zero.\r\n      n = r.d.length - 1;\r\n      if (isTruncated && r.d[n] === 0) ++r.d[n];\r\n      break;\r\n    }\r\n\r\n    x = x.times(x);\r\n    truncate(x.d, k);\r\n  }\r\n\r\n  external = true;\r\n\r\n  return r;\r\n}\r\n\r\n\r\nfunction isOdd(n) {\r\n  return n.d[n.d.length - 1] & 1;\r\n}\r\n\r\n\r\n/*\r\n * Handle `max` and `min`. `ltgt` is 'lt' or 'gt'.\r\n */\r\nfunction maxOrMin(Ctor, args, ltgt) {\r\n  var y,\r\n    x = new Ctor(args[0]),\r\n    i = 0;\r\n\r\n  for (; ++i < args.length;) {\r\n    y = new Ctor(args[i]);\r\n    if (!y.s) {\r\n      x = y;\r\n      break;\r\n    } else if (x[ltgt](y)) {\r\n      x = y;\r\n    }\r\n  }\r\n\r\n  return x;\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the natural exponential of `x` rounded to `sd` significant\r\n * digits.\r\n *\r\n * Taylor/Maclaurin series.\r\n *\r\n * exp(x) = x^0/0! + x^1/1! + x^2/2! + x^3/3! + ...\r\n *\r\n * Argument reduction:\r\n *   Repeat x = x / 32, k += 5, until |x| < 0.1\r\n *   exp(x) = exp(x / 2^k)^(2^k)\r\n *\r\n * Previously, the argument was initially reduced by\r\n * exp(x) = exp(r) * 10^k  where r = x - k * ln10, k = floor(x / ln10)\r\n * to first put r in the range [0, ln10], before dividing by 32 until |x| < 0.1, but this was\r\n * found to be slower than just dividing repeatedly by 32 as above.\r\n *\r\n * Max integer argument: exp('20723265836946413') = 6.3e+9000000000000000\r\n * Min integer argument: exp('-20723265836946411') = 1.2e-9000000000000000\r\n * (Math object integer min/max: Math.exp(709) = 8.2e+307, Math.exp(-745) = 5e-324)\r\n *\r\n *  exp(Infinity)  = Infinity\r\n *  exp(-Infinity) = 0\r\n *  exp(NaN)       = NaN\r\n *  exp(±0)        = 1\r\n *\r\n *  exp(x) is non-terminating for any finite, non-zero x.\r\n *\r\n *  The result will always be correctly rounded.\r\n *\r\n */\r\nfunction naturalExponential(x, sd) {\r\n  var denominator, guard, j, pow, sum, t, wpr,\r\n    rep = 0,\r\n    i = 0,\r\n    k = 0,\r\n    Ctor = x.constructor,\r\n    rm = Ctor.rounding,\r\n    pr = Ctor.precision;\r\n\r\n  // 0/NaN/Infinity?\r\n  if (!x.d || !x.d[0] || x.e > 17) {\r\n\r\n    return new Ctor(x.d\r\n      ? !x.d[0] ? 1 : x.s < 0 ? 0 : 1 / 0\r\n      : x.s ? x.s < 0 ? 0 : x : 0 / 0);\r\n  }\r\n\r\n  if (sd == null) {\r\n    external = false;\r\n    wpr = pr;\r\n  } else {\r\n    wpr = sd;\r\n  }\r\n\r\n  t = new Ctor(0.03125);\r\n\r\n  // while abs(x) >= 0.1\r\n  while (x.e > -2) {\r\n\r\n    // x = x / 2^5\r\n    x = x.times(t);\r\n    k += 5;\r\n  }\r\n\r\n  // Use 2 * log10(2^k) + 5 (empirically derived) to estimate the increase in precision\r\n  // necessary to ensure the first 4 rounding digits are correct.\r\n  guard = Math.log(mathpow(2, k)) / Math.LN10 * 2 + 5 | 0;\r\n  wpr += guard;\r\n  denominator = pow = sum = new Ctor(1);\r\n  Ctor.precision = wpr;\r\n\r\n  for (;;) {\r\n    pow = finalise(pow.times(x), wpr, 1);\r\n    denominator = denominator.times(++i);\r\n    t = sum.plus(divide(pow, denominator, wpr, 1));\r\n\r\n    if (digitsToString(t.d).slice(0, wpr) === digitsToString(sum.d).slice(0, wpr)) {\r\n      j = k;\r\n      while (j--) sum = finalise(sum.times(sum), wpr, 1);\r\n\r\n      // Check to see if the first 4 rounding digits are [49]999.\r\n      // If so, repeat the summation with a higher precision, otherwise\r\n      // e.g. with precision: 18, rounding: 1\r\n      // exp(18.404272462595034083567793919843761) = 98372560.1229999999 (should be 98372560.123)\r\n      // `wpr - guard` is the index of first rounding digit.\r\n      if (sd == null) {\r\n\r\n        if (rep < 3 && checkRoundingDigits(sum.d, wpr - guard, rm, rep)) {\r\n          Ctor.precision = wpr += 10;\r\n          denominator = pow = t = new Ctor(1);\r\n          i = 0;\r\n          rep++;\r\n        } else {\r\n          return finalise(sum, Ctor.precision = pr, rm, external = true);\r\n        }\r\n      } else {\r\n        Ctor.precision = pr;\r\n        return sum;\r\n      }\r\n    }\r\n\r\n    sum = t;\r\n  }\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the natural logarithm of `x` rounded to `sd` significant\r\n * digits.\r\n *\r\n *  ln(-n)        = NaN\r\n *  ln(0)         = -Infinity\r\n *  ln(-0)        = -Infinity\r\n *  ln(1)         = 0\r\n *  ln(Infinity)  = Infinity\r\n *  ln(-Infinity) = NaN\r\n *  ln(NaN)       = NaN\r\n *\r\n *  ln(n) (n != 1) is non-terminating.\r\n *\r\n */\r\nfunction naturalLogarithm(y, sd) {\r\n  var c, c0, denominator, e, numerator, rep, sum, t, wpr, x1, x2,\r\n    n = 1,\r\n    guard = 10,\r\n    x = y,\r\n    xd = x.d,\r\n    Ctor = x.constructor,\r\n    rm = Ctor.rounding,\r\n    pr = Ctor.precision;\r\n\r\n  // Is x negative or Infinity, NaN, 0 or 1?\r\n  if (x.s < 0 || !xd || !xd[0] || !x.e && xd[0] == 1 && xd.length == 1) {\r\n    return new Ctor(xd && !xd[0] ? -1 / 0 : x.s != 1 ? NaN : xd ? 0 : x);\r\n  }\r\n\r\n  if (sd == null) {\r\n    external = false;\r\n    wpr = pr;\r\n  } else {\r\n    wpr = sd;\r\n  }\r\n\r\n  Ctor.precision = wpr += guard;\r\n  c = digitsToString(xd);\r\n  c0 = c.charAt(0);\r\n\r\n  if (Math.abs(e = x.e) < 1.5e15) {\r\n\r\n    // Argument reduction.\r\n    // The series converges faster the closer the argument is to 1, so using\r\n    // ln(a^b) = b * ln(a),   ln(a) = ln(a^b) / b\r\n    // multiply the argument by itself until the leading digits of the significand are 7, 8, 9,\r\n    // 10, 11, 12 or 13, recording the number of multiplications so the sum of the series can\r\n    // later be divided by this number, then separate out the power of 10 using\r\n    // ln(a*10^b) = ln(a) + b*ln(10).\r\n\r\n    // max n is 21 (gives 0.9, 1.0 or 1.1) (9e15 / 21 = 4.2e14).\r\n    //while (c0 < 9 && c0 != 1 || c0 == 1 && c.charAt(1) > 1) {\r\n    // max n is 6 (gives 0.7 - 1.3)\r\n    while (c0 < 7 && c0 != 1 || c0 == 1 && c.charAt(1) > 3) {\r\n      x = x.times(y);\r\n      c = digitsToString(x.d);\r\n      c0 = c.charAt(0);\r\n      n++;\r\n    }\r\n\r\n    e = x.e;\r\n\r\n    if (c0 > 1) {\r\n      x = new Ctor('0.' + c);\r\n      e++;\r\n    } else {\r\n      x = new Ctor(c0 + '.' + c.slice(1));\r\n    }\r\n  } else {\r\n\r\n    // The argument reduction method above may result in overflow if the argument y is a massive\r\n    // number with exponent >= 1500000000000000 (9e15 / 6 = 1.5e15), so instead recall this\r\n    // function using ln(x*10^e) = ln(x) + e*ln(10).\r\n    t = getLn10(Ctor, wpr + 2, pr).times(e + '');\r\n    x = naturalLogarithm(new Ctor(c0 + '.' + c.slice(1)), wpr - guard).plus(t);\r\n    Ctor.precision = pr;\r\n\r\n    return sd == null ? finalise(x, pr, rm, external = true) : x;\r\n  }\r\n\r\n  // x1 is x reduced to a value near 1.\r\n  x1 = x;\r\n\r\n  // Taylor series.\r\n  // ln(y) = ln((1 + x)/(1 - x)) = 2(x + x^3/3 + x^5/5 + x^7/7 + ...)\r\n  // where x = (y - 1)/(y + 1)    (|x| < 1)\r\n  sum = numerator = x = divide(x.minus(1), x.plus(1), wpr, 1);\r\n  x2 = finalise(x.times(x), wpr, 1);\r\n  denominator = 3;\r\n\r\n  for (;;) {\r\n    numerator = finalise(numerator.times(x2), wpr, 1);\r\n    t = sum.plus(divide(numerator, new Ctor(denominator), wpr, 1));\r\n\r\n    if (digitsToString(t.d).slice(0, wpr) === digitsToString(sum.d).slice(0, wpr)) {\r\n      sum = sum.times(2);\r\n\r\n      // Reverse the argument reduction. Check that e is not 0 because, besides preventing an\r\n      // unnecessary calculation, -0 + 0 = +0 and to ensure correct rounding -0 needs to stay -0.\r\n      if (e !== 0) sum = sum.plus(getLn10(Ctor, wpr + 2, pr).times(e + ''));\r\n      sum = divide(sum, new Ctor(n), wpr, 1);\r\n\r\n      // Is rm > 3 and the first 4 rounding digits 4999, or rm < 4 (or the summation has\r\n      // been repeated previously) and the first 4 rounding digits 9999?\r\n      // If so, restart the summation with a higher precision, otherwise\r\n      // e.g. with precision: 12, rounding: 1\r\n      // ln(135520028.6126091714265381533) = 18.7246299999 when it should be 18.72463.\r\n      // `wpr - guard` is the index of first rounding digit.\r\n      if (sd == null) {\r\n        if (checkRoundingDigits(sum.d, wpr - guard, rm, rep)) {\r\n          Ctor.precision = wpr += guard;\r\n          t = numerator = x = divide(x1.minus(1), x1.plus(1), wpr, 1);\r\n          x2 = finalise(x.times(x), wpr, 1);\r\n          denominator = rep = 1;\r\n        } else {\r\n          return finalise(sum, Ctor.precision = pr, rm, external = true);\r\n        }\r\n      } else {\r\n        Ctor.precision = pr;\r\n        return sum;\r\n      }\r\n    }\r\n\r\n    sum = t;\r\n    denominator += 2;\r\n  }\r\n}\r\n\r\n\r\n// ±Infinity, NaN.\r\nfunction nonFiniteToString(x) {\r\n  // Unsigned.\r\n  return String(x.s * x.s / 0);\r\n}\r\n\r\n\r\n/*\r\n * Parse the value of a new Decimal `x` from string `str`.\r\n */\r\nfunction parseDecimal(x, str) {\r\n  var e, i, len;\r\n\r\n  // Decimal point?\r\n  if ((e = str.indexOf('.')) > -1) str = str.replace('.', '');\r\n\r\n  // Exponential form?\r\n  if ((i = str.search(/e/i)) > 0) {\r\n\r\n    // Determine exponent.\r\n    if (e < 0) e = i;\r\n    e += +str.slice(i + 1);\r\n    str = str.substring(0, i);\r\n  } else if (e < 0) {\r\n\r\n    // Integer.\r\n    e = str.length;\r\n  }\r\n\r\n  // Determine leading zeros.\r\n  for (i = 0; str.charCodeAt(i) === 48; i++);\r\n\r\n  // Determine trailing zeros.\r\n  for (len = str.length; str.charCodeAt(len - 1) === 48; --len);\r\n  str = str.slice(i, len);\r\n\r\n  if (str) {\r\n    len -= i;\r\n    x.e = e = e - i - 1;\r\n    x.d = [];\r\n\r\n    // Transform base\r\n\r\n    // e is the base 10 exponent.\r\n    // i is where to slice str to get the first word of the digits array.\r\n    i = (e + 1) % LOG_BASE;\r\n    if (e < 0) i += LOG_BASE;\r\n\r\n    if (i < len) {\r\n      if (i) x.d.push(+str.slice(0, i));\r\n      for (len -= LOG_BASE; i < len;) x.d.push(+str.slice(i, i += LOG_BASE));\r\n      str = str.slice(i);\r\n      i = LOG_BASE - str.length;\r\n    } else {\r\n      i -= len;\r\n    }\r\n\r\n    for (; i--;) str += '0';\r\n    x.d.push(+str);\r\n\r\n    if (external) {\r\n\r\n      // Overflow?\r\n      if (x.e > x.constructor.maxE) {\r\n\r\n        // Infinity.\r\n        x.d = null;\r\n        x.e = NaN;\r\n\r\n      // Underflow?\r\n      } else if (x.e < x.constructor.minE) {\r\n\r\n        // Zero.\r\n        x.e = 0;\r\n        x.d = [0];\r\n        // x.constructor.underflow = true;\r\n      } // else x.constructor.underflow = false;\r\n    }\r\n  } else {\r\n\r\n    // Zero.\r\n    x.e = 0;\r\n    x.d = [0];\r\n  }\r\n\r\n  return x;\r\n}\r\n\r\n\r\n/*\r\n * Parse the value of a new Decimal `x` from a string `str`, which is not a decimal value.\r\n */\r\nfunction parseOther(x, str) {\r\n  var base, Ctor, divisor, i, isFloat, len, p, xd, xe;\r\n\r\n  if (str.indexOf('_') > -1) {\r\n    str = str.replace(/(\\d)_(?=\\d)/g, '$1');\r\n    if (isDecimal.test(str)) return parseDecimal(x, str);\r\n  } else if (str === 'Infinity' || str === 'NaN') {\r\n    if (!+str) x.s = NaN;\r\n    x.e = NaN;\r\n    x.d = null;\r\n    return x;\r\n  }\r\n\r\n  if (isHex.test(str))  {\r\n    base = 16;\r\n    str = str.toLowerCase();\r\n  } else if (isBinary.test(str))  {\r\n    base = 2;\r\n  } else if (isOctal.test(str))  {\r\n    base = 8;\r\n  } else {\r\n    throw Error(invalidArgument + str);\r\n  }\r\n\r\n  // Is there a binary exponent part?\r\n  i = str.search(/p/i);\r\n\r\n  if (i > 0) {\r\n    p = +str.slice(i + 1);\r\n    str = str.substring(2, i);\r\n  } else {\r\n    str = str.slice(2);\r\n  }\r\n\r\n  // Convert `str` as an integer then divide the result by `base` raised to a power such that the\r\n  // fraction part will be restored.\r\n  i = str.indexOf('.');\r\n  isFloat = i >= 0;\r\n  Ctor = x.constructor;\r\n\r\n  if (isFloat) {\r\n    str = str.replace('.', '');\r\n    len = str.length;\r\n    i = len - i;\r\n\r\n    // log[10](16) = 1.2041... , log[10](88) = 1.9444....\r\n    divisor = intPow(Ctor, new Ctor(base), i, i * 2);\r\n  }\r\n\r\n  xd = convertBase(str, base, BASE);\r\n  xe = xd.length - 1;\r\n\r\n  // Remove trailing zeros.\r\n  for (i = xe; xd[i] === 0; --i) xd.pop();\r\n  if (i < 0) return new Ctor(x.s * 0);\r\n  x.e = getBase10Exponent(xd, xe);\r\n  x.d = xd;\r\n  external = false;\r\n\r\n  // At what precision to perform the division to ensure exact conversion?\r\n  // maxDecimalIntegerPartDigitCount = ceil(log[10](b) * otherBaseIntegerPartDigitCount)\r\n  // log[10](2) = 0.30103, log[10](8) = 0.90309, log[10](16) = 1.20412\r\n  // E.g. ceil(1.2 * 3) = 4, so up to 4 decimal digits are needed to represent 3 hex int digits.\r\n  // maxDecimalFractionPartDigitCount = {Hex:4|Oct:3|Bin:1} * otherBaseFractionPartDigitCount\r\n  // Therefore using 4 * the number of digits of str will always be enough.\r\n  if (isFloat) x = divide(x, divisor, len * 4);\r\n\r\n  // Multiply by the binary exponent part if present.\r\n  if (p) x = x.times(Math.abs(p) < 54 ? mathpow(2, p) : Decimal.pow(2, p));\r\n  external = true;\r\n\r\n  return x;\r\n}\r\n\r\n\r\n/*\r\n * sin(x) = x - x^3/3! + x^5/5! - ...\r\n * |x| < pi/2\r\n *\r\n */\r\nfunction sine(Ctor, x) {\r\n  var k,\r\n    len = x.d.length;\r\n\r\n  if (len < 3) {\r\n    return x.isZero() ? x : taylorSeries(Ctor, 2, x, x);\r\n  }\r\n\r\n  // Argument reduction: sin(5x) = 16*sin^5(x) - 20*sin^3(x) + 5*sin(x)\r\n  // i.e. sin(x) = 16*sin^5(x/5) - 20*sin^3(x/5) + 5*sin(x/5)\r\n  // and  sin(x) = sin(x/5)(5 + sin^2(x/5)(16sin^2(x/5) - 20))\r\n\r\n  // Estimate the optimum number of times to use the argument reduction.\r\n  k = 1.4 * Math.sqrt(len);\r\n  k = k > 16 ? 16 : k | 0;\r\n\r\n  x = x.times(1 / tinyPow(5, k));\r\n  x = taylorSeries(Ctor, 2, x, x);\r\n\r\n  // Reverse argument reduction\r\n  var sin2_x,\r\n    d5 = new Ctor(5),\r\n    d16 = new Ctor(16),\r\n    d20 = new Ctor(20);\r\n  for (; k--;) {\r\n    sin2_x = x.times(x);\r\n    x = x.times(d5.plus(sin2_x.times(d16.times(sin2_x).minus(d20))));\r\n  }\r\n\r\n  return x;\r\n}\r\n\r\n\r\n// Calculate Taylor series for `cos`, `cosh`, `sin` and `sinh`.\r\nfunction taylorSeries(Ctor, n, x, y, isHyperbolic) {\r\n  var j, t, u, x2,\r\n    i = 1,\r\n    pr = Ctor.precision,\r\n    k = Math.ceil(pr / LOG_BASE);\r\n\r\n  external = false;\r\n  x2 = x.times(x);\r\n  u = new Ctor(y);\r\n\r\n  for (;;) {\r\n    t = divide(u.times(x2), new Ctor(n++ * n++), pr, 1);\r\n    u = isHyperbolic ? y.plus(t) : y.minus(t);\r\n    y = divide(t.times(x2), new Ctor(n++ * n++), pr, 1);\r\n    t = u.plus(y);\r\n\r\n    if (t.d[k] !== void 0) {\r\n      for (j = k; t.d[j] === u.d[j] && j--;);\r\n      if (j == -1) break;\r\n    }\r\n\r\n    j = u;\r\n    u = y;\r\n    y = t;\r\n    t = j;\r\n    i++;\r\n  }\r\n\r\n  external = true;\r\n  t.d.length = k + 1;\r\n\r\n  return t;\r\n}\r\n\r\n\r\n// Exponent e must be positive and non-zero.\r\nfunction tinyPow(b, e) {\r\n  var n = b;\r\n  while (--e) n *= b;\r\n  return n;\r\n}\r\n\r\n\r\n// Return the absolute value of `x` reduced to less than or equal to half pi.\r\nfunction toLessThanHalfPi(Ctor, x) {\r\n  var t,\r\n    isNeg = x.s < 0,\r\n    pi = getPi(Ctor, Ctor.precision, 1),\r\n    halfPi = pi.times(0.5);\r\n\r\n  x = x.abs();\r\n\r\n  if (x.lte(halfPi)) {\r\n    quadrant = isNeg ? 4 : 1;\r\n    return x;\r\n  }\r\n\r\n  t = x.divToInt(pi);\r\n\r\n  if (t.isZero()) {\r\n    quadrant = isNeg ? 3 : 2;\r\n  } else {\r\n    x = x.minus(t.times(pi));\r\n\r\n    // 0 <= x < pi\r\n    if (x.lte(halfPi)) {\r\n      quadrant = isOdd(t) ? (isNeg ? 2 : 3) : (isNeg ? 4 : 1);\r\n      return x;\r\n    }\r\n\r\n    quadrant = isOdd(t) ? (isNeg ? 1 : 4) : (isNeg ? 3 : 2);\r\n  }\r\n\r\n  return x.minus(pi).abs();\r\n}\r\n\r\n\r\n/*\r\n * Return the value of Decimal `x` as a string in base `baseOut`.\r\n *\r\n * If the optional `sd` argument is present include a binary exponent suffix.\r\n */\r\nfunction toStringBinary(x, baseOut, sd, rm) {\r\n  var base, e, i, k, len, roundUp, str, xd, y,\r\n    Ctor = x.constructor,\r\n    isExp = sd !== void 0;\r\n\r\n  if (isExp) {\r\n    checkInt32(sd, 1, MAX_DIGITS);\r\n    if (rm === void 0) rm = Ctor.rounding;\r\n    else checkInt32(rm, 0, 8);\r\n  } else {\r\n    sd = Ctor.precision;\r\n    rm = Ctor.rounding;\r\n  }\r\n\r\n  if (!x.isFinite()) {\r\n    str = nonFiniteToString(x);\r\n  } else {\r\n    str = finiteToString(x);\r\n    i = str.indexOf('.');\r\n\r\n    // Use exponential notation according to `toExpPos` and `toExpNeg`? No, but if required:\r\n    // maxBinaryExponent = floor((decimalExponent + 1) * log[2](10))\r\n    // minBinaryExponent = floor(decimalExponent * log[2](10))\r\n    // log[2](10) = 3.321928094887362347870319429489390175864\r\n\r\n    if (isExp) {\r\n      base = 2;\r\n      if (baseOut == 16) {\r\n        sd = sd * 4 - 3;\r\n      } else if (baseOut == 8) {\r\n        sd = sd * 3 - 2;\r\n      }\r\n    } else {\r\n      base = baseOut;\r\n    }\r\n\r\n    // Convert the number as an integer then divide the result by its base raised to a power such\r\n    // that the fraction part will be restored.\r\n\r\n    // Non-integer.\r\n    if (i >= 0) {\r\n      str = str.replace('.', '');\r\n      y = new Ctor(1);\r\n      y.e = str.length - i;\r\n      y.d = convertBase(finiteToString(y), 10, base);\r\n      y.e = y.d.length;\r\n    }\r\n\r\n    xd = convertBase(str, 10, base);\r\n    e = len = xd.length;\r\n\r\n    // Remove trailing zeros.\r\n    for (; xd[--len] == 0;) xd.pop();\r\n\r\n    if (!xd[0]) {\r\n      str = isExp ? '0p+0' : '0';\r\n    } else {\r\n      if (i < 0) {\r\n        e--;\r\n      } else {\r\n        x = new Ctor(x);\r\n        x.d = xd;\r\n        x.e = e;\r\n        x = divide(x, y, sd, rm, 0, base);\r\n        xd = x.d;\r\n        e = x.e;\r\n        roundUp = inexact;\r\n      }\r\n\r\n      // The rounding digit, i.e. the digit after the digit that may be rounded up.\r\n      i = xd[sd];\r\n      k = base / 2;\r\n      roundUp = roundUp || xd[sd + 1] !== void 0;\r\n\r\n      roundUp = rm < 4\r\n        ? (i !== void 0 || roundUp) && (rm === 0 || rm === (x.s < 0 ? 3 : 2))\r\n        : i > k || i === k && (rm === 4 || roundUp || rm === 6 && xd[sd - 1] & 1 ||\r\n          rm === (x.s < 0 ? 8 : 7));\r\n\r\n      xd.length = sd;\r\n\r\n      if (roundUp) {\r\n\r\n        // Rounding up may mean the previous digit has to be rounded up and so on.\r\n        for (; ++xd[--sd] > base - 1;) {\r\n          xd[sd] = 0;\r\n          if (!sd) {\r\n            ++e;\r\n            xd.unshift(1);\r\n          }\r\n        }\r\n      }\r\n\r\n      // Determine trailing zeros.\r\n      for (len = xd.length; !xd[len - 1]; --len);\r\n\r\n      // E.g. [4, 11, 15] becomes 4bf.\r\n      for (i = 0, str = ''; i < len; i++) str += NUMERALS.charAt(xd[i]);\r\n\r\n      // Add binary exponent suffix?\r\n      if (isExp) {\r\n        if (len > 1) {\r\n          if (baseOut == 16 || baseOut == 8) {\r\n            i = baseOut == 16 ? 4 : 3;\r\n            for (--len; len % i; len++) str += '0';\r\n            xd = convertBase(str, base, baseOut);\r\n            for (len = xd.length; !xd[len - 1]; --len);\r\n\r\n            // xd[0] will always be be 1\r\n            for (i = 1, str = '1.'; i < len; i++) str += NUMERALS.charAt(xd[i]);\r\n          } else {\r\n            str = str.charAt(0) + '.' + str.slice(1);\r\n          }\r\n        }\r\n\r\n        str =  str + (e < 0 ? 'p' : 'p+') + e;\r\n      } else if (e < 0) {\r\n        for (; ++e;) str = '0' + str;\r\n        str = '0.' + str;\r\n      } else {\r\n        if (++e > len) for (e -= len; e-- ;) str += '0';\r\n        else if (e < len) str = str.slice(0, e) + '.' + str.slice(e);\r\n      }\r\n    }\r\n\r\n    str = (baseOut == 16 ? '0x' : baseOut == 2 ? '0b' : baseOut == 8 ? '0o' : '') + str;\r\n  }\r\n\r\n  return x.s < 0 ? '-' + str : str;\r\n}\r\n\r\n\r\n// Does not strip trailing zeros.\r\nfunction truncate(arr, len) {\r\n  if (arr.length > len) {\r\n    arr.length = len;\r\n    return true;\r\n  }\r\n}\r\n\r\n\r\n// Decimal methods\r\n\r\n\r\n/*\r\n *  abs\r\n *  acos\r\n *  acosh\r\n *  add\r\n *  asin\r\n *  asinh\r\n *  atan\r\n *  atanh\r\n *  atan2\r\n *  cbrt\r\n *  ceil\r\n *  clamp\r\n *  clone\r\n *  config\r\n *  cos\r\n *  cosh\r\n *  div\r\n *  exp\r\n *  floor\r\n *  hypot\r\n *  ln\r\n *  log\r\n *  log2\r\n *  log10\r\n *  max\r\n *  min\r\n *  mod\r\n *  mul\r\n *  pow\r\n *  random\r\n *  round\r\n *  set\r\n *  sign\r\n *  sin\r\n *  sinh\r\n *  sqrt\r\n *  sub\r\n *  sum\r\n *  tan\r\n *  tanh\r\n *  trunc\r\n */\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the absolute value of `x`.\r\n *\r\n * x {number|string|Decimal}\r\n *\r\n */\r\nfunction abs(x) {\r\n  return new this(x).abs();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the arccosine in radians of `x`.\r\n *\r\n * x {number|string|Decimal}\r\n *\r\n */\r\nfunction acos(x) {\r\n  return new this(x).acos();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the inverse of the hyperbolic cosine of `x`, rounded to\r\n * `precision` significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|Decimal} A value in radians.\r\n *\r\n */\r\nfunction acosh(x) {\r\n  return new this(x).acosh();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the sum of `x` and `y`, rounded to `precision` significant\r\n * digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|Decimal}\r\n * y {number|string|Decimal}\r\n *\r\n */\r\nfunction add(x, y) {\r\n  return new this(x).plus(y);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the arcsine in radians of `x`, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|Decimal}\r\n *\r\n */\r\nfunction asin(x) {\r\n  return new this(x).asin();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the inverse of the hyperbolic sine of `x`, rounded to\r\n * `precision` significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|Decimal} A value in radians.\r\n *\r\n */\r\nfunction asinh(x) {\r\n  return new this(x).asinh();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the arctangent in radians of `x`, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|Decimal}\r\n *\r\n */\r\nfunction atan(x) {\r\n  return new this(x).atan();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the inverse of the hyperbolic tangent of `x`, rounded to\r\n * `precision` significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|Decimal} A value in radians.\r\n *\r\n */\r\nfunction atanh(x) {\r\n  return new this(x).atanh();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the arctangent in radians of `y/x` in the range -pi to pi\r\n * (inclusive), rounded to `precision` significant digits using rounding mode `rounding`.\r\n *\r\n * Domain: [-Infinity, Infinity]\r\n * Range: [-pi, pi]\r\n *\r\n * y {number|string|Decimal} The y-coordinate.\r\n * x {number|string|Decimal} The x-coordinate.\r\n *\r\n * atan2(±0, -0)               = ±pi\r\n * atan2(±0, +0)               = ±0\r\n * atan2(±0, -x)               = ±pi for x > 0\r\n * atan2(±0, x)                = ±0 for x > 0\r\n * atan2(-y, ±0)               = -pi/2 for y > 0\r\n * atan2(y, ±0)                = pi/2 for y > 0\r\n * atan2(±y, -Infinity)        = ±pi for finite y > 0\r\n * atan2(±y, +Infinity)        = ±0 for finite y > 0\r\n * atan2(±Infinity, x)         = ±pi/2 for finite x\r\n * atan2(±Infinity, -Infinity) = ±3*pi/4\r\n * atan2(±Infinity, +Infinity) = ±pi/4\r\n * atan2(NaN, x) = NaN\r\n * atan2(y, NaN) = NaN\r\n *\r\n */\r\nfunction atan2(y, x) {\r\n  y = new this(y);\r\n  x = new this(x);\r\n  var r,\r\n    pr = this.precision,\r\n    rm = this.rounding,\r\n    wpr = pr + 4;\r\n\r\n  // Either NaN\r\n  if (!y.s || !x.s) {\r\n    r = new this(NaN);\r\n\r\n  // Both ±Infinity\r\n  } else if (!y.d && !x.d) {\r\n    r = getPi(this, wpr, 1).times(x.s > 0 ? 0.25 : 0.75);\r\n    r.s = y.s;\r\n\r\n  // x is ±Infinity or y is ±0\r\n  } else if (!x.d || y.isZero()) {\r\n    r = x.s < 0 ? getPi(this, pr, rm) : new this(0);\r\n    r.s = y.s;\r\n\r\n  // y is ±Infinity or x is ±0\r\n  } else if (!y.d || x.isZero()) {\r\n    r = getPi(this, wpr, 1).times(0.5);\r\n    r.s = y.s;\r\n\r\n  // Both non-zero and finite\r\n  } else if (x.s < 0) {\r\n    this.precision = wpr;\r\n    this.rounding = 1;\r\n    r = this.atan(divide(y, x, wpr, 1));\r\n    x = getPi(this, wpr, 1);\r\n    this.precision = pr;\r\n    this.rounding = rm;\r\n    r = y.s < 0 ? r.minus(x) : r.plus(x);\r\n  } else {\r\n    r = this.atan(divide(y, x, wpr, 1));\r\n  }\r\n\r\n  return r;\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the cube root of `x`, rounded to `precision` significant\r\n * digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|Decimal}\r\n *\r\n */\r\nfunction cbrt(x) {\r\n  return new this(x).cbrt();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is `x` rounded to an integer using `ROUND_CEIL`.\r\n *\r\n * x {number|string|Decimal}\r\n *\r\n */\r\nfunction ceil(x) {\r\n  return finalise(x = new this(x), x.e + 1, 2);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is `x` clamped to the range delineated by `min` and `max`.\r\n *\r\n * x {number|string|Decimal}\r\n * min {number|string|Decimal}\r\n * max {number|string|Decimal}\r\n *\r\n */\r\nfunction clamp(x, min, max) {\r\n  return new this(x).clamp(min, max);\r\n}\r\n\r\n\r\n/*\r\n * Configure global settings for a Decimal constructor.\r\n *\r\n * `obj` is an object with one or more of the following properties,\r\n *\r\n *   precision  {number}\r\n *   rounding   {number}\r\n *   toExpNeg   {number}\r\n *   toExpPos   {number}\r\n *   maxE       {number}\r\n *   minE       {number}\r\n *   modulo     {number}\r\n *   crypto     {boolean|number}\r\n *   defaults   {true}\r\n *\r\n * E.g. Decimal.config({ precision: 20, rounding: 4 })\r\n *\r\n */\r\nfunction config(obj) {\r\n  if (!obj || typeof obj !== 'object') throw Error(decimalError + 'Object expected');\r\n  var i, p, v,\r\n    useDefaults = obj.defaults === true,\r\n    ps = [\r\n      'precision', 1, MAX_DIGITS,\r\n      'rounding', 0, 8,\r\n      'toExpNeg', -EXP_LIMIT, 0,\r\n      'toExpPos', 0, EXP_LIMIT,\r\n      'maxE', 0, EXP_LIMIT,\r\n      'minE', -EXP_LIMIT, 0,\r\n      'modulo', 0, 9\r\n    ];\r\n\r\n  for (i = 0; i < ps.length; i += 3) {\r\n    if (p = ps[i], useDefaults) this[p] = DEFAULTS[p];\r\n    if ((v = obj[p]) !== void 0) {\r\n      if (mathfloor(v) === v && v >= ps[i + 1] && v <= ps[i + 2]) this[p] = v;\r\n      else throw Error(invalidArgument + p + ': ' + v);\r\n    }\r\n  }\r\n\r\n  if (p = 'crypto', useDefaults) this[p] = DEFAULTS[p];\r\n  if ((v = obj[p]) !== void 0) {\r\n    if (v === true || v === false || v === 0 || v === 1) {\r\n      if (v) {\r\n        if (typeof crypto != 'undefined' && crypto &&\r\n          (crypto.getRandomValues || crypto.randomBytes)) {\r\n          this[p] = true;\r\n        } else {\r\n          throw Error(cryptoUnavailable);\r\n        }\r\n      } else {\r\n        this[p] = false;\r\n      }\r\n    } else {\r\n      throw Error(invalidArgument + p + ': ' + v);\r\n    }\r\n  }\r\n\r\n  return this;\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the cosine of `x`, rounded to `precision` significant\r\n * digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|Decimal} A value in radians.\r\n *\r\n */\r\nfunction cos(x) {\r\n  return new this(x).cos();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the hyperbolic cosine of `x`, rounded to precision\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|Decimal} A value in radians.\r\n *\r\n */\r\nfunction cosh(x) {\r\n  return new this(x).cosh();\r\n}\r\n\r\n\r\n/*\r\n * Create and return a Decimal constructor with the same configuration properties as this Decimal\r\n * constructor.\r\n *\r\n */\r\nfunction clone(obj) {\r\n  var i, p, ps;\r\n\r\n  /*\r\n   * The Decimal constructor and exported function.\r\n   * Return a new Decimal instance.\r\n   *\r\n   * v {number|string|Decimal} A numeric value.\r\n   *\r\n   */\r\n  function Decimal(v) {\r\n    var e, i, t,\r\n      x = this;\r\n\r\n    // Decimal called without new.\r\n    if (!(x instanceof Decimal)) return new Decimal(v);\r\n\r\n    // Retain a reference to this Decimal constructor, and shadow Decimal.prototype.constructor\r\n    // which points to Object.\r\n    x.constructor = Decimal;\r\n\r\n    // Duplicate.\r\n    if (isDecimalInstance(v)) {\r\n      x.s = v.s;\r\n\r\n      if (external) {\r\n        if (!v.d || v.e > Decimal.maxE) {\r\n\r\n          // Infinity.\r\n          x.e = NaN;\r\n          x.d = null;\r\n        } else if (v.e < Decimal.minE) {\r\n\r\n          // Zero.\r\n          x.e = 0;\r\n          x.d = [0];\r\n        } else {\r\n          x.e = v.e;\r\n          x.d = v.d.slice();\r\n        }\r\n      } else {\r\n        x.e = v.e;\r\n        x.d = v.d ? v.d.slice() : v.d;\r\n      }\r\n\r\n      return;\r\n    }\r\n\r\n    t = typeof v;\r\n\r\n    if (t === 'number') {\r\n      if (v === 0) {\r\n        x.s = 1 / v < 0 ? -1 : 1;\r\n        x.e = 0;\r\n        x.d = [0];\r\n        return;\r\n      }\r\n\r\n      if (v < 0) {\r\n        v = -v;\r\n        x.s = -1;\r\n      } else {\r\n        x.s = 1;\r\n      }\r\n\r\n      // Fast path for small integers.\r\n      if (v === ~~v && v < 1e7) {\r\n        for (e = 0, i = v; i >= 10; i /= 10) e++;\r\n\r\n        if (external) {\r\n          if (e > Decimal.maxE) {\r\n            x.e = NaN;\r\n            x.d = null;\r\n          } else if (e < Decimal.minE) {\r\n            x.e = 0;\r\n            x.d = [0];\r\n          } else {\r\n            x.e = e;\r\n            x.d = [v];\r\n          }\r\n        } else {\r\n          x.e = e;\r\n          x.d = [v];\r\n        }\r\n\r\n        return;\r\n\r\n      // Infinity, NaN.\r\n      } else if (v * 0 !== 0) {\r\n        if (!v) x.s = NaN;\r\n        x.e = NaN;\r\n        x.d = null;\r\n        return;\r\n      }\r\n\r\n      return parseDecimal(x, v.toString());\r\n\r\n    } else if (t !== 'string') {\r\n      throw Error(invalidArgument + v);\r\n    }\r\n\r\n    // Minus sign?\r\n    if ((i = v.charCodeAt(0)) === 45) {\r\n      v = v.slice(1);\r\n      x.s = -1;\r\n    } else {\r\n      // Plus sign?\r\n      if (i === 43) v = v.slice(1);\r\n      x.s = 1;\r\n    }\r\n\r\n    return isDecimal.test(v) ? parseDecimal(x, v) : parseOther(x, v);\r\n  }\r\n\r\n  Decimal.prototype = P;\r\n\r\n  Decimal.ROUND_UP = 0;\r\n  Decimal.ROUND_DOWN = 1;\r\n  Decimal.ROUND_CEIL = 2;\r\n  Decimal.ROUND_FLOOR = 3;\r\n  Decimal.ROUND_HALF_UP = 4;\r\n  Decimal.ROUND_HALF_DOWN = 5;\r\n  Decimal.ROUND_HALF_EVEN = 6;\r\n  Decimal.ROUND_HALF_CEIL = 7;\r\n  Decimal.ROUND_HALF_FLOOR = 8;\r\n  Decimal.EUCLID = 9;\r\n\r\n  Decimal.config = Decimal.set = config;\r\n  Decimal.clone = clone;\r\n  Decimal.isDecimal = isDecimalInstance;\r\n\r\n  Decimal.abs = abs;\r\n  Decimal.acos = acos;\r\n  Decimal.acosh = acosh;        // ES6\r\n  Decimal.add = add;\r\n  Decimal.asin = asin;\r\n  Decimal.asinh = asinh;        // ES6\r\n  Decimal.atan = atan;\r\n  Decimal.atanh = atanh;        // ES6\r\n  Decimal.atan2 = atan2;\r\n  Decimal.cbrt = cbrt;          // ES6\r\n  Decimal.ceil = ceil;\r\n  Decimal.clamp = clamp;\r\n  Decimal.cos = cos;\r\n  Decimal.cosh = cosh;          // ES6\r\n  Decimal.div = div;\r\n  Decimal.exp = exp;\r\n  Decimal.floor = floor;\r\n  Decimal.hypot = hypot;        // ES6\r\n  Decimal.ln = ln;\r\n  Decimal.log = log;\r\n  Decimal.log10 = log10;        // ES6\r\n  Decimal.log2 = log2;          // ES6\r\n  Decimal.max = max;\r\n  Decimal.min = min;\r\n  Decimal.mod = mod;\r\n  Decimal.mul = mul;\r\n  Decimal.pow = pow;\r\n  Decimal.random = random;\r\n  Decimal.round = round;\r\n  Decimal.sign = sign;          // ES6\r\n  Decimal.sin = sin;\r\n  Decimal.sinh = sinh;          // ES6\r\n  Decimal.sqrt = sqrt;\r\n  Decimal.sub = sub;\r\n  Decimal.sum = sum;\r\n  Decimal.tan = tan;\r\n  Decimal.tanh = tanh;          // ES6\r\n  Decimal.trunc = trunc;        // ES6\r\n\r\n  if (obj === void 0) obj = {};\r\n  if (obj) {\r\n    if (obj.defaults !== true) {\r\n      ps = ['precision', 'rounding', 'toExpNeg', 'toExpPos', 'maxE', 'minE', 'modulo', 'crypto'];\r\n      for (i = 0; i < ps.length;) if (!obj.hasOwnProperty(p = ps[i++])) obj[p] = this[p];\r\n    }\r\n  }\r\n\r\n  Decimal.config(obj);\r\n\r\n  return Decimal;\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is `x` divided by `y`, rounded to `precision` significant\r\n * digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|Decimal}\r\n * y {number|string|Decimal}\r\n *\r\n */\r\nfunction div(x, y) {\r\n  return new this(x).div(y);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the natural exponential of `x`, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|Decimal} The power to which to raise the base of the natural log.\r\n *\r\n */\r\nfunction exp(x) {\r\n  return new this(x).exp();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is `x` round to an integer using `ROUND_FLOOR`.\r\n *\r\n * x {number|string|Decimal}\r\n *\r\n */\r\nfunction floor(x) {\r\n  return finalise(x = new this(x), x.e + 1, 3);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the square root of the sum of the squares of the arguments,\r\n * rounded to `precision` significant digits using rounding mode `rounding`.\r\n *\r\n * hypot(a, b, ...) = sqrt(a^2 + b^2 + ...)\r\n *\r\n * arguments {number|string|Decimal}\r\n *\r\n */\r\nfunction hypot() {\r\n  var i, n,\r\n    t = new this(0);\r\n\r\n  external = false;\r\n\r\n  for (i = 0; i < arguments.length;) {\r\n    n = new this(arguments[i++]);\r\n    if (!n.d) {\r\n      if (n.s) {\r\n        external = true;\r\n        return new this(1 / 0);\r\n      }\r\n      t = n;\r\n    } else if (t.d) {\r\n      t = t.plus(n.times(n));\r\n    }\r\n  }\r\n\r\n  external = true;\r\n\r\n  return t.sqrt();\r\n}\r\n\r\n\r\n/*\r\n * Return true if object is a Decimal instance (where Decimal is any Decimal constructor),\r\n * otherwise return false.\r\n *\r\n */\r\nfunction isDecimalInstance(obj) {\r\n  return obj instanceof Decimal || obj && obj.toStringTag === tag || false;\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the natural logarithm of `x`, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|Decimal}\r\n *\r\n */\r\nfunction ln(x) {\r\n  return new this(x).ln();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the log of `x` to the base `y`, or to base 10 if no base\r\n * is specified, rounded to `precision` significant digits using rounding mode `rounding`.\r\n *\r\n * log[y](x)\r\n *\r\n * x {number|string|Decimal} The argument of the logarithm.\r\n * y {number|string|Decimal} The base of the logarithm.\r\n *\r\n */\r\nfunction log(x, y) {\r\n  return new this(x).log(y);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the base 2 logarithm of `x`, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|Decimal}\r\n *\r\n */\r\nfunction log2(x) {\r\n  return new this(x).log(2);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the base 10 logarithm of `x`, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|Decimal}\r\n *\r\n */\r\nfunction log10(x) {\r\n  return new this(x).log(10);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the maximum of the arguments.\r\n *\r\n * arguments {number|string|Decimal}\r\n *\r\n */\r\nfunction max() {\r\n  return maxOrMin(this, arguments, 'lt');\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the minimum of the arguments.\r\n *\r\n * arguments {number|string|Decimal}\r\n *\r\n */\r\nfunction min() {\r\n  return maxOrMin(this, arguments, 'gt');\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is `x` modulo `y`, rounded to `precision` significant digits\r\n * using rounding mode `rounding`.\r\n *\r\n * x {number|string|Decimal}\r\n * y {number|string|Decimal}\r\n *\r\n */\r\nfunction mod(x, y) {\r\n  return new this(x).mod(y);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is `x` multiplied by `y`, rounded to `precision` significant\r\n * digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|Decimal}\r\n * y {number|string|Decimal}\r\n *\r\n */\r\nfunction mul(x, y) {\r\n  return new this(x).mul(y);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is `x` raised to the power `y`, rounded to precision\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|Decimal} The base.\r\n * y {number|string|Decimal} The exponent.\r\n *\r\n */\r\nfunction pow(x, y) {\r\n  return new this(x).pow(y);\r\n}\r\n\r\n\r\n/*\r\n * Returns a new Decimal with a random value equal to or greater than 0 and less than 1, and with\r\n * `sd`, or `Decimal.precision` if `sd` is omitted, significant digits (or less if trailing zeros\r\n * are produced).\r\n *\r\n * [sd] {number} Significant digits. Integer, 0 to MAX_DIGITS inclusive.\r\n *\r\n */\r\nfunction random(sd) {\r\n  var d, e, k, n,\r\n    i = 0,\r\n    r = new this(1),\r\n    rd = [];\r\n\r\n  if (sd === void 0) sd = this.precision;\r\n  else checkInt32(sd, 1, MAX_DIGITS);\r\n\r\n  k = Math.ceil(sd / LOG_BASE);\r\n\r\n  if (!this.crypto) {\r\n    for (; i < k;) rd[i++] = Math.random() * 1e7 | 0;\r\n\r\n  // Browsers supporting crypto.getRandomValues.\r\n  } else if (crypto.getRandomValues) {\r\n    d = crypto.getRandomValues(new Uint32Array(k));\r\n\r\n    for (; i < k;) {\r\n      n = d[i];\r\n\r\n      // 0 <= n < 4294967296\r\n      // Probability n >= 4.29e9, is 4967296 / 4294967296 = 0.00116 (1 in 865).\r\n      if (n >= 4.29e9) {\r\n        d[i] = crypto.getRandomValues(new Uint32Array(1))[0];\r\n      } else {\r\n\r\n        // 0 <= n <= 4289999999\r\n        // 0 <= (n % 1e7) <= 9999999\r\n        rd[i++] = n % 1e7;\r\n      }\r\n    }\r\n\r\n  // Node.js supporting crypto.randomBytes.\r\n  } else if (crypto.randomBytes) {\r\n\r\n    // buffer\r\n    d = crypto.randomBytes(k *= 4);\r\n\r\n    for (; i < k;) {\r\n\r\n      // 0 <= n < 2147483648\r\n      n = d[i] + (d[i + 1] << 8) + (d[i + 2] << 16) + ((d[i + 3] & 0x7f) << 24);\r\n\r\n      // Probability n >= 2.14e9, is 7483648 / 2147483648 = 0.0035 (1 in 286).\r\n      if (n >= 2.14e9) {\r\n        crypto.randomBytes(4).copy(d, i);\r\n      } else {\r\n\r\n        // 0 <= n <= 2139999999\r\n        // 0 <= (n % 1e7) <= 9999999\r\n        rd.push(n % 1e7);\r\n        i += 4;\r\n      }\r\n    }\r\n\r\n    i = k / 4;\r\n  } else {\r\n    throw Error(cryptoUnavailable);\r\n  }\r\n\r\n  k = rd[--i];\r\n  sd %= LOG_BASE;\r\n\r\n  // Convert trailing digits to zeros according to sd.\r\n  if (k && sd) {\r\n    n = mathpow(10, LOG_BASE - sd);\r\n    rd[i] = (k / n | 0) * n;\r\n  }\r\n\r\n  // Remove trailing words which are zero.\r\n  for (; rd[i] === 0; i--) rd.pop();\r\n\r\n  // Zero?\r\n  if (i < 0) {\r\n    e = 0;\r\n    rd = [0];\r\n  } else {\r\n    e = -1;\r\n\r\n    // Remove leading words which are zero and adjust exponent accordingly.\r\n    for (; rd[0] === 0; e -= LOG_BASE) rd.shift();\r\n\r\n    // Count the digits of the first word of rd to determine leading zeros.\r\n    for (k = 1, n = rd[0]; n >= 10; n /= 10) k++;\r\n\r\n    // Adjust the exponent for leading zeros of the first word of rd.\r\n    if (k < LOG_BASE) e -= LOG_BASE - k;\r\n  }\r\n\r\n  r.e = e;\r\n  r.d = rd;\r\n\r\n  return r;\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is `x` rounded to an integer using rounding mode `rounding`.\r\n *\r\n * To emulate `Math.round`, set rounding to 7 (ROUND_HALF_CEIL).\r\n *\r\n * x {number|string|Decimal}\r\n *\r\n */\r\nfunction round(x) {\r\n  return finalise(x = new this(x), x.e + 1, this.rounding);\r\n}\r\n\r\n\r\n/*\r\n * Return\r\n *   1    if x > 0,\r\n *  -1    if x < 0,\r\n *   0    if x is 0,\r\n *  -0    if x is -0,\r\n *   NaN  otherwise\r\n *\r\n * x {number|string|Decimal}\r\n *\r\n */\r\nfunction sign(x) {\r\n  x = new this(x);\r\n  return x.d ? (x.d[0] ? x.s : 0 * x.s) : x.s || NaN;\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the sine of `x`, rounded to `precision` significant digits\r\n * using rounding mode `rounding`.\r\n *\r\n * x {number|string|Decimal} A value in radians.\r\n *\r\n */\r\nfunction sin(x) {\r\n  return new this(x).sin();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the hyperbolic sine of `x`, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|Decimal} A value in radians.\r\n *\r\n */\r\nfunction sinh(x) {\r\n  return new this(x).sinh();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the square root of `x`, rounded to `precision` significant\r\n * digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|Decimal}\r\n *\r\n */\r\nfunction sqrt(x) {\r\n  return new this(x).sqrt();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is `x` minus `y`, rounded to `precision` significant digits\r\n * using rounding mode `rounding`.\r\n *\r\n * x {number|string|Decimal}\r\n * y {number|string|Decimal}\r\n *\r\n */\r\nfunction sub(x, y) {\r\n  return new this(x).sub(y);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the sum of the arguments, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * Only the result is rounded, not the intermediate calculations.\r\n *\r\n * arguments {number|string|Decimal}\r\n *\r\n */\r\nfunction sum() {\r\n  var i = 0,\r\n    args = arguments,\r\n    x = new this(args[i]);\r\n\r\n  external = false;\r\n  for (; x.s && ++i < args.length;) x = x.plus(args[i]);\r\n  external = true;\r\n\r\n  return finalise(x, this.precision, this.rounding);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the tangent of `x`, rounded to `precision` significant\r\n * digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|Decimal} A value in radians.\r\n *\r\n */\r\nfunction tan(x) {\r\n  return new this(x).tan();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the hyperbolic tangent of `x`, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|Decimal} A value in radians.\r\n *\r\n */\r\nfunction tanh(x) {\r\n  return new this(x).tanh();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is `x` truncated to an integer.\r\n *\r\n * x {number|string|Decimal}\r\n *\r\n */\r\nfunction trunc(x) {\r\n  return finalise(x = new this(x), x.e + 1, 1);\r\n}\r\n\r\n\r\nP[Symbol.for('nodejs.util.inspect.custom')] = P.toString;\r\nP[Symbol.toStringTag] = 'Decimal';\r\n\r\n// Create and configure initial Decimal constructor.\r\nexport var Decimal = P.constructor = clone(DEFAULTS);\r\n\r\n// Create the internal constants from their string values.\r\nLN10 = new Decimal(LN10);\r\nPI = new Decimal(PI);\r\n\r\nexport default Decimal;\r\n","import { Fraction, Percent, Price, TokenAmount } from \"../module\";\n\nimport { Numberish, parseNumberInfo } from \"./bignumber\";\nimport { BN_ZERO } from \"./number\";\n\nexport default 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 toFractionWithDecimals(value: Numberish): { fr: Fraction; decimals?: number } {\n  //  to complete math format(may have decimal), not int\n  if (value instanceof Percent) return { fr: new Fraction(value.numerator, value.denominator) };\n\n  if (value instanceof Price) return { fr: value.adjusted };\n\n  // to complete math format(may have decimal), not BN\n  if (value instanceof TokenAmount) return { fr: toFraction(value.toExact()), decimals: value.token.decimals };\n\n  // do not ideal with other fraction value\n  if (value instanceof Fraction) return { fr: value };\n\n  // wrap to Fraction\n  const n = String(value);\n  const details = parseNumberInfo(n);\n  return { fr: new Fraction(details.numerator, details.denominator), decimals: details.dec?.length };\n}\n\nexport function lt(a: Numberish | undefined, b: Numberish | undefined): boolean {\n  if (a == null || b == null) return false;\n  const fa = toFraction(a);\n  const fb = toFraction(b);\n  fa.sub(fb).numerator;\n  return fa.sub(fb).numerator.lt(BN_ZERO);\n}\n\nexport function gt(a: Numberish | undefined, b: Numberish | undefined): boolean {\n  if (a == null || b == null) return false;\n  const fa = toFraction(a);\n  const fb = toFraction(b);\n  return fa.sub(fb).numerator.gt(BN_ZERO);\n}\n\nexport function lte(a: Numberish | undefined, b: Numberish | undefined): boolean {\n  if (a == null || b == null) return false;\n  const fa = toFraction(a);\n  const fb = toFraction(b);\n  return fa.sub(fb).numerator.lte(BN_ZERO);\n}\n\nexport function gte(a: Numberish | undefined, b: Numberish | undefined): boolean {\n  if (a == null || b == null) return false;\n  const fa = toFraction(a);\n  const fb = toFraction(b);\n  return fa.sub(fb).numerator.gte(BN_ZERO);\n}\n\nexport function eq(a: Numberish | undefined, b: Numberish | undefined): boolean {\n  if (a == null || b == null) return false;\n  const fa = toFraction(a);\n  const fb = toFraction(b);\n  return fa.sub(fb).numerator.eq(BN_ZERO);\n}\n\nexport function div(a: Numberish | undefined, b: Numberish | undefined): Fraction | undefined {\n  if (a == null || b == null) return undefined;\n  const fa = toFraction(a);\n  const fb = toFraction(b);\n  try {\n    return fa.div(fb); // if fb is zero , operation will throw error\n  } catch {\n    return fa;\n  }\n}\n\nexport function sub(a: Numberish | undefined, b: Numberish | undefined): Fraction | undefined {\n  if (a == null || b == null) return undefined;\n  const fa = toFraction(a);\n  const fb = toFraction(b);\n  return fa.sub(fb);\n}\n\nexport function isMeaningfulNumber(n: Numberish | undefined): n is Numberish {\n  if (n == null) return false;\n  return !eq(n, 0);\n}\n\nexport function getMax(a: Numberish, b: Numberish): Numberish {\n  return gt(b, a) ? b : a;\n}\n\nexport function mul(a: Numberish | undefined, b: Numberish | undefined): Fraction | undefined {\n  if (a == null || b == null) return undefined;\n  const fa = toFraction(a);\n  const fb = toFraction(b);\n  return fa.mul(fb);\n}\n\nexport function add(a: Numberish | undefined, b: Numberish | undefined): Fraction | undefined {\n  if (a == null || b == null) return undefined;\n  const fa = toFraction(a);\n  const fb = toFraction(b);\n  return fa.add(fb);\n}\n","import {\n  Connection,\n  PublicKey,\n  sendAndConfirmTransaction,\n  Signer,\n  Transaction,\n  TransactionInstruction,\n  TransactionMessage,\n  VersionedTransaction,\n  Commitment,\n} from \"@solana/web3.js\";\nimport axios from \"axios\";\n\nimport { SignAllTransactions, ComputeBudgetConfig } from \"@/gfx/type\";\nimport { Api } from \"@/api\";\nimport { Cluster } from \"@/solana\";\nimport { TxVersion } from \"./txType\";\nimport { Owner } from \"../owner\";\nimport { getRecentBlockHash, addComputeBudget, checkLegacyTxSize, checkV0TxSize, printSimulate } from \"./txUtils\";\nimport { CacheLTA, getMultipleLookupTableInfo, LOOKUP_TABLE_CACHE } from \"./lookupTable\";\n\ninterface SolanaFeeInfo {\n  min: number;\n  max: number;\n  avg: number;\n  priorityTx: number;\n  nonVotes: number;\n  priorityRatio: number;\n  avgCuPerBlock: number;\n  blockspaceUsageRatio: number;\n}\ntype SolanaFeeInfoJson = {\n  \"1\": SolanaFeeInfo;\n  \"5\": SolanaFeeInfo;\n  \"15\": SolanaFeeInfo;\n};\n\ninterface ExecuteParams {\n  skipPreflight?: boolean;\n  recentBlockHash?: string;\n  sendAndConfirm?: boolean;\n}\n\ninterface TxBuilderInit {\n  connection: Connection;\n  feePayer: PublicKey;\n  cluster: Cluster;\n  owner?: Owner;\n  blockhashCommitment?: Commitment;\n  api?: Api;\n  signAllTransactions?: SignAllTransactions;\n}\n\nexport interface AddInstructionParam {\n  addresses?: Record<string, PublicKey>;\n  instructions?: TransactionInstruction[];\n  endInstructions?: TransactionInstruction[];\n  lookupTableAddress?: string[];\n  signers?: Signer[];\n  instructionTypes?: string[];\n  endInstructionTypes?: string[];\n}\n\nexport interface TxBuildData<T = Record<string, any>> {\n  builder: TxBuilder;\n  transaction: Transaction;\n  instructionTypes: string[];\n  signers: Signer[];\n  execute: (params?: ExecuteParams) => Promise<{ txId: string; signedTx: Transaction }>;\n  extInfo: T;\n}\n\nexport interface TxV0BuildData<T = Record<string, any>> extends Omit<TxBuildData<T>, \"transaction\" | \"execute\"> {\n  builder: TxBuilder;\n  transaction: VersionedTransaction;\n  buildProps?: {\n    lookupTableCache?: CacheLTA;\n    lookupTableAddress?: string[];\n  };\n  execute: (params?: ExecuteParams) => Promise<{ txId: string; signedTx: VersionedTransaction }>;\n}\n\ntype TxUpdateParams = {\n  txId: string;\n  status: \"success\" | \"error\" | \"sent\";\n  signedTx: Transaction | VersionedTransaction;\n};\nexport interface MultiTxExecuteParam extends ExecuteParams {\n  sequentially: boolean;\n  onTxUpdate?: (completeTxs: TxUpdateParams[]) => void;\n}\nexport interface MultiTxBuildData<T = Record<string, any>> {\n  builder: TxBuilder;\n  transactions: Transaction[];\n  instructionTypes: string[];\n  signers: Signer[][];\n  execute: (executeParams?: MultiTxExecuteParam) => Promise<{ txIds: string[]; signedTxs: Transaction[] }>;\n  extInfo: T;\n}\n\nexport interface MultiTxV0BuildData<T = Record<string, any>>\n  extends Omit<MultiTxBuildData<T>, \"transactions\" | \"execute\"> {\n  builder: TxBuilder;\n  transactions: VersionedTransaction[];\n  buildProps?: {\n    lookupTableCache?: CacheLTA;\n    lookupTableAddress?: string[];\n  };\n  execute: (executeParams?: MultiTxExecuteParam) => Promise<{ txIds: string[]; signedTxs: VersionedTransaction[] }>;\n}\n\nexport type MakeMultiTxData<T = TxVersion.LEGACY, O = Record<string, any>> = T extends TxVersion.LEGACY\n  ? MultiTxBuildData<O>\n  : MultiTxV0BuildData<O>;\n\nexport type MakeTxData<T = TxVersion.LEGACY, O = Record<string, any>> = T extends TxVersion.LEGACY\n  ? TxBuildData<O>\n  : TxV0BuildData<O>;\n\nexport class TxBuilder {\n  private connection: Connection;\n  private owner?: Owner;\n  private instructions: TransactionInstruction[] = [];\n  private endInstructions: TransactionInstruction[] = [];\n  private lookupTableAddress: string[] = [];\n  private signers: Signer[] = [];\n  private instructionTypes: string[] = [];\n  private endInstructionTypes: string[] = [];\n  private feePayer: PublicKey;\n  private cluster: Cluster;\n  private signAllTransactions?: SignAllTransactions;\n  private blockhashCommitment?: Commitment;\n  private api?: Api;\n\n  constructor(params: TxBuilderInit) {\n    this.connection = params.connection;\n    this.feePayer = params.feePayer;\n    this.signAllTransactions = params.signAllTransactions;\n    this.owner = params.owner;\n    this.cluster = params.cluster;\n    this.blockhashCommitment = params.blockhashCommitment;\n    this.api = params.api;\n  }\n\n  get AllTxData(): {\n    instructions: TransactionInstruction[];\n    endInstructions: TransactionInstruction[];\n    signers: Signer[];\n    instructionTypes: string[];\n    endInstructionTypes: string[];\n    lookupTableAddress: string[];\n  } {\n    return {\n      instructions: this.instructions,\n      endInstructions: this.endInstructions,\n      signers: this.signers,\n      instructionTypes: this.instructionTypes,\n      endInstructionTypes: this.endInstructionTypes,\n      lookupTableAddress: this.lookupTableAddress,\n    };\n  }\n\n  get allInstructions(): TransactionInstruction[] {\n    return [...this.instructions, ...this.endInstructions];\n  }\n\n  public async getComputeBudgetConfig(): Promise<ComputeBudgetConfig | undefined> {\n    const json = (\n      await axios.get<SolanaFeeInfoJson>(`https://solanacompass.com/api/fees?cacheFreshTime=${5 * 60 * 1000}`)\n    ).data;\n    const { avg } = json?.[15] ?? {};\n    if (!avg) return undefined;\n    return {\n      units: 600000,\n      microLamports: Math.min(Math.ceil((avg * 1000000) / 600000), 25000),\n    };\n  }\n\n  public addCustomComputeBudget(config?: ComputeBudgetConfig): boolean {\n    if (config) {\n      const { instructions, instructionTypes } = addComputeBudget(config);\n      this.instructions.unshift(...instructions);\n      this.instructionTypes.unshift(...instructionTypes);\n      return true;\n    }\n    return false;\n  }\n\n  public async calComputeBudget({\n    config: propConfig,\n    defaultIns,\n  }: {\n    config?: ComputeBudgetConfig;\n    defaultIns?: TransactionInstruction[];\n  }): Promise<void> {\n    try {\n      const config = propConfig || (await this.getComputeBudgetConfig());\n      if (this.addCustomComputeBudget(config)) return;\n      defaultIns && this.instructions.unshift(...defaultIns);\n    } catch {\n      defaultIns && this.instructions.unshift(...defaultIns);\n    }\n  }\n\n  public addInstruction({\n    instructions = [],\n    endInstructions = [],\n    signers = [],\n    instructionTypes = [],\n    endInstructionTypes = [],\n    lookupTableAddress = [],\n  }: AddInstructionParam): TxBuilder {\n    this.instructions.push(...instructions);\n    this.endInstructions.push(...endInstructions);\n    this.signers.push(...signers);\n    this.instructionTypes.push(...instructionTypes);\n    this.endInstructionTypes.push(...endInstructionTypes);\n    this.lookupTableAddress.push(...lookupTableAddress.filter((address) => address !== PublicKey.default.toString()));\n    return this;\n  }\n\n  public async versionBuild<O = Record<string, any>>({\n    txVersion,\n    extInfo,\n  }: {\n    txVersion?: TxVersion;\n    extInfo?: O;\n  }): Promise<MakeTxData<TxVersion.LEGACY, O> | MakeTxData<TxVersion.V0, O>> {\n    if (txVersion === TxVersion.V0) return (await this.buildV0({ ...(extInfo || {}) })) as MakeTxData<TxVersion.V0, O>;\n    return this.build<O>(extInfo) as MakeTxData<TxVersion.LEGACY, O>;\n  }\n\n  public build<O = Record<string, any>>(extInfo?: O): MakeTxData<TxVersion.LEGACY, O> {\n    const transaction = new Transaction();\n    if (this.allInstructions.length) transaction.add(...this.allInstructions);\n    transaction.feePayer = this.feePayer;\n    if (this.owner?.signer && !this.signers.some((s) => s.publicKey.equals(this.owner!.publicKey)))\n      this.signers.push(this.owner.signer);\n\n    return {\n      builder: this,\n      transaction,\n      signers: this.signers,\n      instructionTypes: [...this.instructionTypes, ...this.endInstructionTypes],\n      execute: async (params) => {\n        const { recentBlockHash: propBlockHash, skipPreflight = true, sendAndConfirm } = params || {};\n        const recentBlockHash = propBlockHash ?? (await getRecentBlockHash(this.connection, this.blockhashCommitment));\n        transaction.recentBlockhash = recentBlockHash;\n        if (this.signers.length) transaction.sign(...this.signers);\n\n        printSimulate([transaction]);\n        if (this.owner?.isKeyPair) {\n          const txId = sendAndConfirm\n            ? await sendAndConfirmTransaction(\n                this.connection,\n                transaction,\n                this.signers.find((s) => s.publicKey.equals(this.owner!.publicKey))\n                  ? this.signers\n                  : [...this.signers, this.owner.signer!],\n                { skipPreflight },\n              )\n            : await this.connection.sendRawTransaction(transaction.serialize(), { skipPreflight });\n\n          return {\n            txId,\n            signedTx: transaction,\n          };\n        }\n        if (this.signAllTransactions) {\n          const txs = await this.signAllTransactions([transaction]);\n          return {\n            txId: await this.connection.sendRawTransaction(txs[0].serialize(), { skipPreflight }),\n            signedTx: txs[0],\n          };\n        }\n        throw new Error(\"please provide owner in keypair format or signAllTransactions function\");\n      },\n      extInfo: extInfo || ({} as O),\n    };\n  }\n\n  public buildMultiTx<T = Record<string, any>>(params: {\n    extraPreBuildData?: MakeTxData<TxVersion.LEGACY>[];\n    extInfo?: T;\n  }): MultiTxBuildData {\n    const { extraPreBuildData = [], extInfo } = params;\n    const { transaction } = this.build(extInfo);\n\n    const filterExtraBuildData = extraPreBuildData.filter((data) => data.transaction.instructions.length > 0);\n\n    const allTransactions: Transaction[] = [transaction, ...filterExtraBuildData.map((data) => data.transaction)];\n    const allSigners: Signer[][] = [this.signers, ...filterExtraBuildData.map((data) => data.signers)];\n    const allInstructionTypes: string[] = [\n      ...this.instructionTypes,\n      ...filterExtraBuildData.map((data) => data.instructionTypes).flat(),\n    ];\n\n    if (this.owner?.signer) {\n      allSigners.forEach((signers) => {\n        if (!signers.some((s) => s.publicKey.equals(this.owner!.publicKey))) this.signers.push(this.owner!.signer!);\n      });\n    }\n\n    return {\n      builder: this,\n      transactions: allTransactions,\n      signers: allSigners,\n      instructionTypes: allInstructionTypes,\n      execute: async (executeParams?: MultiTxExecuteParam) => {\n        const { sequentially, onTxUpdate, recentBlockHash: propBlockHash, skipPreflight = true } = executeParams || {};\n        const recentBlockHash = propBlockHash ?? (await getRecentBlockHash(this.connection, this.blockhashCommitment));\n        if (this.owner?.isKeyPair) {\n          if (sequentially) {\n            const txIds: string[] = [];\n            for (const tx of allTransactions) {\n              const txId = await sendAndConfirmTransaction(\n                this.connection,\n                tx,\n                this.signers.find((s) => s.publicKey.equals(this.owner!.publicKey))\n                  ? this.signers\n                  : [...this.signers, this.owner.signer!],\n                { skipPreflight },\n              );\n              txIds.push(txId);\n            }\n\n            return {\n              txIds,\n              signedTxs: allTransactions,\n            };\n          }\n          return {\n            txIds: await await Promise.all(\n              allTransactions.map(async (tx) => {\n                tx.recentBlockhash = recentBlockHash;\n                return await this.connection.sendRawTransaction(tx.serialize(), { skipPreflight });\n              }),\n            ),\n            signedTxs: allTransactions,\n          };\n        }\n\n        if (this.signAllTransactions) {\n          const partialSignedTxs = allTransactions.map((tx, idx) => {\n            tx.recentBlockhash = recentBlockHash;\n            if (allSigners[idx].length) tx.sign(...allSigners[idx]);\n            return tx;\n          });\n          printSimulate(partialSignedTxs);\n          const signedTxs = await this.signAllTransactions(partialSignedTxs);\n          if (sequentially) {\n            let i = 0;\n            const processedTxs: TxUpdateParams[] = [];\n            const checkSendTx = async (): Promise<void> => {\n              if (!signedTxs[i]) return;\n              const txId = await this.connection.sendRawTransaction(signedTxs[i].serialize(), { skipPreflight });\n              processedTxs.push({ txId, status: \"sent\", signedTx: signedTxs[i] });\n              onTxUpdate?.([...processedTxs]);\n              i++;\n              this.connection.onSignature(\n                txId,\n                (signatureResult) => {\n                  const targetTxIdx = processedTxs.findIndex((tx) => tx.txId === txId);\n                  if (targetTxIdx > -1) processedTxs[targetTxIdx].status = signatureResult.err ? \"error\" : \"success\";\n                  onTxUpdate?.([...processedTxs]);\n                  if (!signatureResult.err) checkSendTx();\n                },\n                \"processed\",\n              );\n              this.connection.getSignatureStatus(txId);\n            };\n            await checkSendTx();\n            return {\n              txIds: processedTxs.map((d) => d.txId),\n              signedTxs,\n            };\n          } else {\n            const txIds: string[] = [];\n            for (let i = 0; i < signedTxs.length; i += 1) {\n              const txId = await this.connection.sendRawTransaction(signedTxs[i].serialize(), { skipPreflight });\n              txIds.push(txId);\n            }\n            return {\n              txIds,\n              signedTxs,\n            };\n          }\n        }\n        throw new Error(\"please provide owner in keypair format or signAllTransactions function\");\n      },\n      extInfo: extInfo || {},\n    };\n  }\n\n  public async versionMultiBuild<T extends TxVersion, O = Record<string, any>>({\n    extraPreBuildData,\n    txVersion,\n    extInfo,\n  }: {\n    extraPreBuildData?: MakeTxData<TxVersion.V0>[] | MakeTxData<TxVersion.LEGACY>[];\n    txVersion?: T;\n    extInfo?: O;\n  }): Promise<MakeMultiTxData<T, O>> {\n    if (txVersion === TxVersion.V0)\n      return (await this.buildV0MultiTx({\n        extraPreBuildData: extraPreBuildData as MakeTxData<TxVersion.V0>[],\n        buildProps: extInfo || {},\n      })) as MakeMultiTxData<T, O>;\n    return this.buildMultiTx<O>({\n      extraPreBuildData: extraPreBuildData as MakeTxData<TxVersion.LEGACY>[],\n      extInfo,\n    }) as MakeMultiTxData<T, O>;\n  }\n\n  public async buildV0<O = Record<string, any>>(\n    props?: O & {\n      lookupTableCache?: CacheLTA;\n      lookupTableAddress?: string[];\n      forerunCreate?: boolean;\n      recentBlockhash?: string;\n    },\n  ): Promise<MakeTxData<TxVersion.V0, O>> {\n    const {\n      lookupTableCache = {},\n      lookupTableAddress = [],\n      forerunCreate,\n      recentBlockhash: propRecentBlockhash,\n      ...extInfo\n    } = props || {};\n    const lookupTableAddressAccount = {\n      ...(this.cluster === \"devnet\" ? {} : LOOKUP_TABLE_CACHE),\n      ...lookupTableCache,\n    };\n    const allLTA = Array.from(new Set<string>([...lookupTableAddress, ...this.lookupTableAddress]));\n    const needCacheLTA: PublicKey[] = [];\n    for (const item of allLTA) {\n      if (lookupTableAddressAccount[item] === undefined) needCacheLTA.push(new PublicKey(item));\n    }\n    const newCacheLTA = await getMultipleLookupTableInfo({ connection: this.connection, address: needCacheLTA });\n    for (const [key, value] of Object.entries(newCacheLTA)) lookupTableAddressAccount[key] = value;\n\n    const recentBlockhash = forerunCreate\n      ? PublicKey.default.toBase58()\n      : propRecentBlockhash ?? (await getRecentBlockHash(this.connection, this.blockhashCommitment));\n\n    const messageV0 = new TransactionMessage({\n      payerKey: this.feePayer,\n      recentBlockhash,\n      instructions: [...this.allInstructions],\n    }).compileToV0Message(Object.values(lookupTableAddressAccount));\n\n    if (this.owner?.signer && !this.signers.some((s) => s.publicKey.equals(this.owner!.publicKey)))\n      this.signers.push(this.owner.signer);\n    const transaction = new VersionedTransaction(messageV0);\n    transaction.sign(this.signers);\n    return {\n      builder: this,\n      transaction,\n      signers: this.signers,\n      instructionTypes: [...this.instructionTypes, ...this.endInstructionTypes],\n      execute: async (params) => {\n        const { skipPreflight = true, sendAndConfirm } = params || {};\n        printSimulate([transaction]);\n        if (this.owner?.isKeyPair) {\n          const txId = await this.connection.sendTransaction(transaction, { skipPreflight });\n          if (sendAndConfirm) {\n            const { lastValidBlockHeight, blockhash } = await this.connection.getLatestBlockhash({\n              commitment: this.blockhashCommitment,\n            });\n            await this.connection.confirmTransaction(\n              {\n                blockhash,\n                lastValidBlockHeight,\n                signature: txId,\n              },\n              \"confirmed\",\n            );\n          }\n\n          return {\n            txId,\n            signedTx: transaction,\n          };\n        }\n        if (this.signAllTransactions) {\n          const txs = await this.signAllTransactions<VersionedTransaction>([transaction]);\n          return {\n            txId: await this.connection.sendTransaction(txs[0], { skipPreflight }),\n            signedTx: txs[0],\n          };\n        }\n        throw new Error(\"please provide owner in keypair format or signAllTransactions function\");\n      },\n      extInfo: (extInfo || {}) as O,\n    };\n  }\n\n  public async buildV0MultiTx<T = Record<string, any>>(params: {\n    extraPreBuildData?: MakeTxData<TxVersion.V0>[];\n    buildProps?: T & {\n      lookupTableCache?: CacheLTA;\n      lookupTableAddress?: string[];\n      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              const { lastValidBlockHeight, blockhash } = await this.connection.getLatestBlockhash({\n                commitment: this.blockhashCommitment,\n              });\n              await this.connection.confirmTransaction(\n                {\n                  blockhash,\n                  lastValidBlockHeight,\n                  signature: txId,\n                },\n                \"confirmed\",\n              );\n              txIds.push(txId);\n            }\n\n            return { txIds, signedTxs: allTransactions };\n          }\n\n          return {\n            txIds: await Promise.all(\n              allTransactions.map(async (tx) => {\n                return await this.connection.sendTransaction(tx, { skipPreflight });\n              }),\n            ),\n            signedTxs: allTransactions,\n          };\n        }\n\n        if (this.signAllTransactions) {\n          const signedTxs = await this.signAllTransactions(allTransactions);\n\n          if (sequentially) {\n            let i = 0;\n            const processedTxs: TxUpdateParams[] = [];\n            const checkSendTx = async (): Promise<void> => {\n              if (!signedTxs[i]) return;\n              const txId = await this.connection.sendTransaction(signedTxs[i], { skipPreflight });\n              processedTxs.push({ txId, status: \"sent\", signedTx: signedTxs[i] });\n              onTxUpdate?.([...processedTxs]);\n              i++;\n              this.connection.onSignature(\n                txId,\n                (signatureResult) => {\n                  const targetTxIdx = processedTxs.findIndex((tx) => tx.txId === txId);\n                  if (targetTxIdx > -1) processedTxs[targetTxIdx].status = signatureResult.err ? \"error\" : \"success\";\n                  onTxUpdate?.([...processedTxs]);\n                  if (!signatureResult.err) checkSendTx();\n                },\n                \"processed\",\n              );\n              this.connection.getSignatureStatus(txId);\n            };\n            checkSendTx();\n            return {\n              txIds: [],\n              signedTxs,\n            };\n          } else {\n            const txIds: string[] = [];\n            for (let i = 0; i < signedTxs.length; i += 1) {\n              const txId = await this.connection.sendTransaction(signedTxs[i], { skipPreflight });\n              txIds.push(txId);\n            }\n            return { txIds, signedTxs };\n          }\n        }\n        throw new Error(\"please provide owner in keypair format or signAllTransactions function\");\n      },\n      extInfo: buildProps || {},\n    };\n  }\n\n  public async sizeCheckBuild(\n    props?: Record<string, any> & { computeBudgetConfig?: ComputeBudgetConfig },\n  ): Promise<MultiTxBuildData> {\n    const { computeBudgetConfig, ...extInfo } = props || {};\n    const computeBudgetData: { instructions: TransactionInstruction[]; instructionTypes: string[] } =\n      computeBudgetConfig\n        ? addComputeBudget(computeBudgetConfig)\n        : {\n            instructions: [],\n            instructionTypes: [],\n          };\n\n    const signerKey: { [key: string]: Signer } = this.signers.reduce(\n      (acc, cur) => ({ ...acc, [cur.publicKey.toBase58()]: cur }),\n      {},\n    );\n\n    const allTransactions: Transaction[] = [];\n    const allSigners: Signer[][] = [];\n\n    let instructionQueue: TransactionInstruction[] = [];\n    this.allInstructions.forEach((item) => {\n      const _itemIns = [...instructionQueue, item];\n      const _itemInsWithCompute = computeBudgetConfig ? [...computeBudgetData.instructions, ..._itemIns] : _itemIns;\n      const _signerStrs = new Set<string>(\n        _itemIns.map((i) => i.keys.filter((ii) => ii.isSigner).map((ii) => ii.pubkey.toString())).flat(),\n      );\n      const _signer = [..._signerStrs.values()].map((i) => new PublicKey(i));\n\n      if (\n        (instructionQueue.length < 12 &&\n          checkLegacyTxSize({ instructions: _itemInsWithCompute, payer: this.feePayer, signers: _signer })) ||\n        checkLegacyTxSize({ instructions: _itemIns, payer: this.feePayer, signers: _signer })\n      ) {\n        // current ins add to queue still not exceed tx size limit\n        instructionQueue.push(item);\n      } else {\n        if (instructionQueue.length === 0) throw Error(\"item ins too big\");\n\n        // if add computeBudget still not exceed tx size limit\n        if (\n          checkLegacyTxSize({\n            instructions: computeBudgetConfig\n              ? [...computeBudgetData.instructions, ...instructionQueue]\n              : [...instructionQueue],\n            payer: this.feePayer,\n            signers: _signer,\n          })\n        ) {\n          allTransactions.push(new Transaction().add(...computeBudgetData.instructions, ...instructionQueue));\n        } else {\n          allTransactions.push(new Transaction().add(...instructionQueue));\n        }\n        allSigners.push(\n          Array.from(\n            new Set<string>(\n              instructionQueue.map((i) => i.keys.filter((ii) => ii.isSigner).map((ii) => ii.pubkey.toString())).flat(),\n            ),\n          )\n            .map((i) => signerKey[i])\n            .filter((i) => i !== undefined),\n        );\n        instructionQueue = [item];\n      }\n    });\n\n    if (instructionQueue.length > 0) {\n      const _signerStrs = new Set<string>(\n        instructionQueue.map((i) => i.keys.filter((ii) => ii.isSigner).map((ii) => ii.pubkey.toString())).flat(),\n      );\n      const _signers = [..._signerStrs.values()].map((i) => signerKey[i]).filter((i) => i !== undefined);\n\n      if (\n        checkLegacyTxSize({\n          instructions: computeBudgetConfig\n            ? [...computeBudgetData.instructions, ...instructionQueue]\n            : [...instructionQueue],\n          payer: this.feePayer,\n          signers: _signers.map((s) => s.publicKey),\n        })\n      ) {\n        allTransactions.push(new Transaction().add(...computeBudgetData.instructions, ...instructionQueue));\n      } else {\n        allTransactions.push(new Transaction().add(...instructionQueue));\n      }\n      allSigners.push(_signers);\n    }\n    allTransactions.forEach((tx) => (tx.feePayer = this.feePayer));\n\n    if (this.owner?.signer) {\n      allSigners.forEach((signers) => {\n        if (!signers.some((s) => s.publicKey.equals(this.owner!.publicKey))) signers.push(this.owner!.signer!);\n      });\n    }\n\n    return {\n      builder: this,\n      transactions: allTransactions,\n      signers: allSigners,\n      instructionTypes: this.instructionTypes,\n      execute: async (executeParams?: MultiTxExecuteParam) => {\n        const { sequentially, onTxUpdate, recentBlockHash: propBlockHash, skipPreflight = true } = executeParams || {};\n        const recentBlockHash = propBlockHash ?? (await getRecentBlockHash(this.connection, this.blockhashCommitment));\n        allTransactions.forEach(async (tx, idx) => {\n          tx.recentBlockhash = recentBlockHash;\n          if (allSigners[idx].length) tx.sign(...allSigners[idx]);\n        });\n        printSimulate(allTransactions);\n        if (this.owner?.isKeyPair) {\n          if (sequentially) {\n            const txIds: string[] = [];\n            for (const tx of allTransactions) {\n              const txId = await sendAndConfirmTransaction(\n                this.connection,\n                tx,\n                this.signers.find((s) => s.publicKey.equals(this.owner!.publicKey))\n                  ? this.signers\n                  : [...this.signers, this.owner.signer!],\n                { skipPreflight },\n              );\n              txIds.push(txId);\n            }\n\n            return {\n              txIds,\n              signedTxs: allTransactions,\n            };\n          }\n          return {\n            txIds: await Promise.all(\n              allTransactions.map(async (tx) => {\n                return await this.connection.sendRawTransaction(tx.serialize(), { skipPreflight });\n              }),\n            ),\n            signedTxs: allTransactions,\n          };\n        }\n        if (this.signAllTransactions) {\n          const signedTxs = await this.signAllTransactions(allTransactions);\n          if (sequentially) {\n            let i = 0;\n            const processedTxs: TxUpdateParams[] = [];\n            const checkSendTx = async (): Promise<void> => {\n              if (!signedTxs[i]) return;\n              const txId = await this.connection.sendRawTransaction(signedTxs[i].serialize(), { skipPreflight });\n              processedTxs.push({ txId, status: \"sent\", signedTx: signedTxs[i] });\n              onTxUpdate?.([...processedTxs]);\n              i++;\n              this.connection.onSignature(\n                txId,\n                (signatureResult) => {\n                  const targetTxIdx = processedTxs.findIndex((tx) => tx.txId === txId);\n                  if (targetTxIdx > -1) processedTxs[targetTxIdx].status = signatureResult.err ? \"error\" : \"success\";\n                  onTxUpdate?.([...processedTxs]);\n                  if (!signatureResult.err) checkSendTx();\n                },\n                \"processed\",\n              );\n              this.connection.getSignatureStatus(txId);\n            };\n            await checkSendTx();\n            return {\n              txIds: processedTxs.map((d) => d.txId),\n              signedTxs,\n            };\n          } else {\n            const txIds: string[] = [];\n            for (let i = 0; i < signedTxs.length; i += 1) {\n              const txId = await this.connection.sendRawTransaction(signedTxs[i].serialize(), { skipPreflight });\n              txIds.push(txId);\n            }\n            return { txIds, signedTxs };\n          }\n        }\n        throw new Error(\"please provide owner in keypair format or signAllTransactions function\");\n      },\n      extInfo: extInfo || {},\n    };\n  }\n\n  public async sizeCheckBuildV0(\n    props?: Record<string, any> & {\n      computeBudgetConfig?: ComputeBudgetConfig;\n      lookupTableCache?: CacheLTA;\n      lookupTableAddress?: string[];\n    },\n  ): Promise<MultiTxV0BuildData> {\n    const { computeBudgetConfig, lookupTableCache = {}, lookupTableAddress = [], ...extInfo } = props || {};\n    const lookupTableAddressAccount = {\n      ...(this.cluster === \"devnet\" ? {} : LOOKUP_TABLE_CACHE),\n      ...lookupTableCache,\n    };\n    const allLTA = Array.from(new Set<string>([...this.lookupTableAddress, ...lookupTableAddress]));\n    const needCacheLTA: PublicKey[] = [];\n    for (const item of allLTA) {\n      if (lookupTableAddressAccount[item] === undefined) needCacheLTA.push(new PublicKey(item));\n    }\n    const newCacheLTA = await getMultipleLookupTableInfo({ connection: this.connection, address: needCacheLTA });\n    for (const [key, value] of Object.entries(newCacheLTA)) lookupTableAddressAccount[key] = value;\n\n    const computeBudgetData: { instructions: TransactionInstruction[]; instructionTypes: string[] } =\n      computeBudgetConfig\n        ? addComputeBudget(computeBudgetConfig)\n        : {\n            instructions: [],\n            instructionTypes: [],\n          };\n\n    const blockHash = await getRecentBlockHash(this.connection, this.blockhashCommitment);\n\n    const signerKey: { [key: string]: Signer } = this.signers.reduce(\n      (acc, cur) => ({ ...acc, [cur.publicKey.toBase58()]: cur }),\n      {},\n    );\n    const allTransactions: VersionedTransaction[] = [];\n    const allSigners: Signer[][] = [];\n\n    let instructionQueue: TransactionInstruction[] = [];\n    this.allInstructions.forEach((item) => {\n      const _itemIns = [...instructionQueue, item];\n      const _itemInsWithCompute = computeBudgetConfig ? [...computeBudgetData.instructions, ..._itemIns] : _itemIns;\n      if (\n        (instructionQueue.length < 12 &&\n          checkV0TxSize({ instructions: _itemInsWithCompute, payer: this.feePayer, lookupTableAddressAccount })) ||\n        checkV0TxSize({ instructions: _itemIns, payer: this.feePayer, lookupTableAddressAccount })\n      ) {\n        // current ins add to queue still not exceed tx size limit\n        instructionQueue.push(item);\n      } else {\n        if (instructionQueue.length === 0) throw Error(\"item ins too big\");\n\n        const lookupTableAddress: undefined | CacheLTA = {};\n        for (const item of [...new Set<string>(allLTA)]) {\n          if (lookupTableAddressAccount[item] !== undefined) lookupTableAddress[item] = lookupTableAddressAccount[item];\n        }\n        // if add computeBudget still not exceed tx size limit\n        if (\n          computeBudgetConfig &&\n          checkV0TxSize({\n            instructions: [...computeBudgetData.instructions, ...instructionQueue],\n            payer: this.feePayer,\n            lookupTableAddressAccount,\n            recentBlockhash: blockHash,\n          })\n        ) {\n          const messageV0 = new TransactionMessage({\n            payerKey: this.feePayer,\n            recentBlockhash: blockHash,\n\n            instructions: [...computeBudgetData.instructions, ...instructionQueue],\n          }).compileToV0Message(Object.values(lookupTableAddressAccount));\n          allTransactions.push(new VersionedTransaction(messageV0));\n        } else {\n          const messageV0 = new TransactionMessage({\n            payerKey: this.feePayer,\n            recentBlockhash: blockHash,\n            instructions: [...instructionQueue],\n          }).compileToV0Message(Object.values(lookupTableAddressAccount));\n          allTransactions.push(new VersionedTransaction(messageV0));\n        }\n        allSigners.push(\n          Array.from(\n            new Set<string>(\n              instructionQueue.map((i) => i.keys.filter((ii) => ii.isSigner).map((ii) => ii.pubkey.toString())).flat(),\n            ),\n          )\n            .map((i) => signerKey[i])\n            .filter((i) => i !== undefined),\n        );\n        instructionQueue = [item];\n      }\n    });\n\n    if (instructionQueue.length > 0) {\n      const _signerStrs = new Set<string>(\n        instructionQueue.map((i) => i.keys.filter((ii) => ii.isSigner).map((ii) => ii.pubkey.toString())).flat(),\n      );\n      const _signers = [..._signerStrs.values()].map((i) => signerKey[i]).filter((i) => i !== undefined);\n\n      if (\n        computeBudgetConfig &&\n        checkV0TxSize({\n          instructions: [...computeBudgetData.instructions, ...instructionQueue],\n          payer: this.feePayer,\n          lookupTableAddressAccount,\n          recentBlockhash: blockHash,\n        })\n      ) {\n        const messageV0 = new TransactionMessage({\n          payerKey: this.feePayer,\n          recentBlockhash: blockHash,\n          instructions: [...computeBudgetData.instructions, ...instructionQueue],\n        }).compileToV0Message(Object.values(lookupTableAddressAccount));\n        allTransactions.push(new VersionedTransaction(messageV0));\n      } else {\n        const messageV0 = new TransactionMessage({\n          payerKey: this.feePayer,\n          recentBlockhash: blockHash,\n          instructions: [...instructionQueue],\n        }).compileToV0Message(Object.values(lookupTableAddressAccount));\n        allTransactions.push(new VersionedTransaction(messageV0));\n      }\n      allSigners.push(_signers);\n    }\n\n    if (this.owner?.signer) {\n      allSigners.forEach((signers) => {\n        if (!signers.some((s) => s.publicKey.equals(this.owner!.publicKey))) signers.push(this.owner!.signer!);\n      });\n    }\n\n    return {\n      builder: this,\n      transactions: allTransactions,\n      buildProps: props,\n      signers: allSigners,\n      instructionTypes: this.instructionTypes,\n      execute: async (executeParams?: MultiTxExecuteParam) => {\n        const { sequentially, onTxUpdate, recentBlockHash: propBlockHash, skipPreflight = true } = executeParams || {};\n        allTransactions.map(async (tx, idx) => {\n          if (allSigners[idx].length) tx.sign(allSigners[idx]);\n          if (propBlockHash) tx.message.recentBlockhash = propBlockHash;\n        });\n        printSimulate(allTransactions);\n        if (this.owner?.isKeyPair) {\n          if (sequentially) {\n            const txIds: string[] = [];\n            for (const tx of allTransactions) {\n              const txId = await this.connection.sendTransaction(tx, { skipPreflight });\n              const { lastValidBlockHeight, blockhash } = await this.connection.getLatestBlockhash({\n                commitment: this.blockhashCommitment,\n              });\n              await this.connection.confirmTransaction(\n                {\n                  blockhash,\n                  lastValidBlockHeight,\n                  signature: txId,\n                },\n                \"confirmed\",\n              );\n              txIds.push(txId);\n            }\n\n            return { txIds, signedTxs: allTransactions };\n          }\n\n          return {\n            txIds: await Promise.all(\n              allTransactions.map(async (tx) => {\n                return await this.connection.sendTransaction(tx, { skipPreflight });\n              }),\n            ),\n            signedTxs: allTransactions,\n          };\n        }\n        if (this.signAllTransactions) {\n          const signedTxs = await this.signAllTransactions(allTransactions);\n          if (sequentially) {\n            let i = 0;\n            const processedTxs: TxUpdateParams[] = [];\n            const checkSendTx = async (): Promise<void> => {\n              if (!signedTxs[i]) return;\n              const txId = await this.connection.sendTransaction(signedTxs[i], { skipPreflight });\n              processedTxs.push({ txId, status: \"sent\", signedTx: signedTxs[i] });\n              onTxUpdate?.([...processedTxs]);\n              i++;\n              this.connection.onSignature(\n                txId,\n                (signatureResult) => {\n                  const targetTxIdx = processedTxs.findIndex((tx) => tx.txId === txId);\n                  if (targetTxIdx > -1) processedTxs[targetTxIdx].status = signatureResult.err ? \"error\" : \"success\";\n                  onTxUpdate?.([...processedTxs]);\n                  if (!signatureResult.err) checkSendTx();\n                },\n                \"processed\",\n              );\n              this.connection.getSignatureStatus(txId);\n            };\n            checkSendTx();\n            return {\n              txIds: [],\n              signedTxs,\n            };\n          } else {\n            const txIds: string[] = [];\n            for (let i = 0; i < signedTxs.length; i += 1) {\n              const txId = await this.connection.sendTransaction(signedTxs[i], { skipPreflight });\n              txIds.push(txId);\n            }\n            return { txIds, signedTxs };\n          }\n        }\n        throw new Error(\"please provide owner in keypair format or signAllTransactions function\");\n      },\n      extInfo: extInfo || {},\n    };\n  }\n}\n","export enum TxVersion {\n  \"V0\",\n  \"LEGACY\",\n}\n\nexport const InstructionType = {\n  CreateAccount: \"CreateAccount\",\n  InitAccount: \"InitAccount\",\n  CreateATA: \"CreateATA\",\n  CloseAccount: \"CloseAccount\",\n  TransferAmount: \"TransferAmount\",\n  InitMint: \"InitMint\",\n  MintTo: \"MintTo\",\n\n  SetComputeUnitPrice: \"SetComputeUnitPrice\",\n  SetComputeUnitLimit: \"SetComputeUnitLimit\",\n\n  CpmmInitUserLiquidity: \"CpmmInitUserLiquidity\",\n  CpmmCreatePool: \"CpmmCreatePool\",\n  CpmmAddLiquidity: \"CpmmAddLiquidity\",\n  CpmmWithdrawLiquidity: \"CpmmWithdrawLiquidity\",\n  CpmmSwapBaseIn: \"CpmmSwapBaseIn\",\n  CpmmSwapBaseOut: \"CpmmSwapBaseOut\",\n  CpmmOracleSwapBaseIn: \"CpmmOracleSwapBaseIn\",\n};\n","import {\n  Connection,\n  PublicKey,\n  ComputeBudgetProgram,\n  SimulatedTransactionResponse,\n  Transaction,\n  TransactionInstruction,\n  TransactionMessage,\n  Keypair,\n  EpochInfo,\n  VersionedTransaction,\n  Commitment,\n} from \"@solana/web3.js\";\nimport { TOKEN_PROGRAM_ID } from \"@solana/spl-token\";\n\nimport { createLogger } from \"../logger\";\nimport { InstructionType } from \"./txType\";\nimport { CacheLTA } from \"./lookupTable\";\n\nimport { ComputeBudgetConfig } from \"@/gfx/type\";\n\nconst logger = createLogger(\"Gfx_txUtil\");\n\nexport const MAX_BASE64_SIZE = 1644;\n\nexport function addComputeBudget(config: ComputeBudgetConfig): {\n  instructions: TransactionInstruction[];\n  instructionTypes: string[];\n} {\n  const ins: TransactionInstruction[] = [];\n  const insTypes: string[] = [];\n  if (config.microLamports) {\n    ins.push(ComputeBudgetProgram.setComputeUnitPrice({ microLamports: config.microLamports }));\n    insTypes.push(InstructionType.SetComputeUnitPrice);\n  }\n  if (config.units) {\n    ins.push(ComputeBudgetProgram.setComputeUnitLimit({ units: config.units }));\n    insTypes.push(InstructionType.SetComputeUnitLimit);\n  }\n\n  return {\n    instructions: ins,\n    instructionTypes: insTypes,\n  };\n}\n\nexport async function getRecentBlockHash(connection: Connection, propsCommitment?: Commitment): Promise<string> {\n  const commitment = propsCommitment ?? \"confirmed\";\n  try {\n    return (\n      (await connection.getLatestBlockhash?.({ commitment }))?.blockhash ||\n      (await connection.getRecentBlockhash(commitment)).blockhash\n    );\n  } catch {\n    return (await connection.getRecentBlockhash(commitment)).blockhash;\n  }\n}\n\n/**\n * Forecast transaction size\n */\nexport function forecastTransactionSize(instructions: TransactionInstruction[], signers: PublicKey[]): boolean {\n  if (instructions.length < 1) logger.logWithError(`no instructions provided: ${instructions.toString()}`);\n  if (signers.length < 1) logger.logWithError(`no signers provided:, ${signers.toString()}`);\n\n  const transaction = new Transaction();\n  transaction.recentBlockhash = \"11111111111111111111111111111111\";\n  transaction.feePayer = signers[0];\n  transaction.add(...instructions);\n\n  try {\n    return 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(\"GfxSimuLateTransaction11111111111111111\");\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 simulate transaction\", \"RPC_ERROR\", {\n          message: error.message,\n        });\n      }\n    }\n  }\n\n  return results;\n}\n\nexport function checkLegacyTxSize({\n  instructions,\n  payer,\n  signers,\n}: {\n  instructions: TransactionInstruction[];\n  payer: PublicKey;\n  signers: PublicKey[];\n}): boolean {\n  return forecastTransactionSize(instructions, [payer, ...signers]);\n}\n\nexport function checkV0TxSize({\n  instructions,\n  payer,\n  lookupTableAddressAccount,\n  recentBlockhash = Keypair.generate().publicKey.toString(),\n}: {\n  instructions: TransactionInstruction[];\n  payer: PublicKey;\n  lookupTableAddressAccount?: CacheLTA;\n  recentBlockhash?: string;\n}): boolean {\n  const transactionMessage = new TransactionMessage({\n    payerKey: payer,\n    recentBlockhash,\n    instructions,\n  });\n\n  const messageV0 = transactionMessage.compileToV0Message(Object.values(lookupTableAddressAccount ?? {}));\n  try {\n    const buildLength = Buffer.from(new VersionedTransaction(messageV0).serialize()).toString(\"base64\").length;\n    return buildLength < MAX_BASE64_SIZE;\n  } catch (error) {\n    return false;\n  }\n}\n\nlet epochInfoCache: { time: number; data?: EpochInfo } = {\n  time: 0,\n  data: undefined,\n};\n\nexport async function getEpochInfo(connection: Connection): Promise<EpochInfo> {\n  if (!epochInfoCache.data || (Date.now() - epochInfoCache.time) / 1000 > 30) {\n    const data = await connection.getEpochInfo();\n    epochInfoCache = {\n      time: Date.now(),\n      data,\n    };\n    return data;\n  } else {\n    return epochInfoCache.data;\n  }\n}\n\nexport const toBuffer = (arr: Buffer | Uint8Array | Array<number>): Buffer => {\n  if (Buffer.isBuffer(arr)) {\n    return arr;\n  } else if (arr instanceof Uint8Array) {\n    return Buffer.from(arr.buffer, arr.byteOffset, arr.byteLength);\n  } else {\n    return Buffer.from(arr);\n  }\n};\n\nexport function printSimulate(transactions: Transaction[] | VersionedTransaction[]): string[] {\n  const allBase64: string[] = [];\n  transactions.forEach((transaction) => {\n    if (transaction instanceof Transaction) {\n      if (!transaction.recentBlockhash) transaction.recentBlockhash = TOKEN_PROGRAM_ID.toBase58();\n      if (!transaction.feePayer) transaction.feePayer = Keypair.generate().publicKey;\n    }\n    let serialized = transaction.serialize({ requireAllSignatures: false, verifySignatures: false });\n    if (transaction instanceof VersionedTransaction) serialized = toBuffer(serialized);\n    const base64 = serialized.toString(\"base64\");\n    allBase64.push(base64);\n  });\n  console.log(\"simulate tx string:\", allBase64);\n\n  return allBase64;\n}\n\nexport function transformTxToBase64(tx: Transaction | VersionedTransaction): string {\n  let serialized = tx.serialize({ requireAllSignatures: false, verifySignatures: false });\n  if (tx instanceof VersionedTransaction) serialized = toBuffer(serialized);\n  return serialized.toString(\"base64\");\n}\n","import { Connection, PublicKey, AddressLookupTableAccount } from \"@solana/web3.js\";\nimport { getMultipleAccountsInfo } from \"../accountInfo\";\n\nexport interface CacheLTA {\n  [key: string]: AddressLookupTableAccount;\n}\n\nexport async function getMultipleLookupTableInfo({\n  connection,\n  address,\n}: {\n  connection: Connection;\n  address: PublicKey[];\n}): Promise<CacheLTA> {\n  const dataInfos = await getMultipleAccountsInfo(\n    connection,\n    [...new Set<string>(address.map((i) => i.toString()))].map((i) => new PublicKey(i)),\n  );\n\n  const outDict: CacheLTA = {};\n  for (let i = 0; i < address.length; i++) {\n    const info = dataInfos[i];\n    const key = address[i];\n    if (!info) continue;\n    const lookupAccount = new AddressLookupTableAccount({\n      key,\n      state: AddressLookupTableAccount.deserialize(new Uint8Array(info.data)),\n    });\n    outDict[key.toString()] = lookupAccount;\n    LOOKUP_TABLE_CACHE[key.toString()] = lookupAccount;\n  }\n\n  return outDict;\n}\n\nexport const LOOKUP_TABLE_CACHE: CacheLTA = {\n  \"2immgwYNHBbyVQKVGCEkgWpi53bLwWNRMB5G2nbgYV17\": new AddressLookupTableAccount({\n    key: new PublicKey(\"2immgwYNHBbyVQKVGCEkgWpi53bLwWNRMB5G2nbgYV17\"),\n    state: AddressLookupTableAccount.deserialize(\n      new Uint8Array(\n        Buffer.from(\n          \"AQAAAP//////////d49+DAAAAAAAAQZMWvw7GUNJdaccNBVnb57OKakxL2BHLYvhRwVILRsgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMGRm/lIRcy/+ytunLDm+e8jOW7xfcSayxDmzpAAAAABt324ddloZPZy+FGzut5rBy0he1fWzeROoz1hX7/AKkG3fbh7nWP3hhCXbzkbM3athr8TYO5DSf+vfko2KGL/AVKU1D4XciC1hSlVnJ4iilt3x6rq9CmBniISTL07vagBqfVFxksXFEhjMlMPUrxf1ja7gibof1E49vZigAAAAAGp9UXGMd0yShWY5hpHV62i164o5tLbVxzVVshAAAAAIyXJY9OJInxuz0QKRSODYMLWhOZ2v8QhASOe9jb6fhZC3BlsePRfEU4nVJ/awTDzVi4bHMaoP21SbbRvAP4KUbIScv+6Yw2LHF/6K0ZjUPibbSWXCirYPGuuVl7zT789IUPLW4CpHr4JNCatp3ELXDLKMv6JJ+37le50lbBJ2LvDQdRqCgtphMF/imcN7mY5YRx2xE1A3MQ+L4QRaYK9u4GRfZP3LsAd00a+IkCpA22UNQMKdq5BFbJuwuOLqc8zxCTDlqxBG8J0HcxtfogQHDK06ukzfaXiNDKAob1MqBHS9lJxDYCwz8gd5DtFqNSTKG5l1zxIaKpDP/sffi2is1H9aKveyXSu5StXElYRl9SD5As0DHE4N0GLnf84/siiKXVyp4Ez121kLcUui/jLLFZEz/BwZK3Ilf9B9OcsEAeDMKAy2vjGSxQODgBz0QwGA+eP4ZjIjrIAQaXENv31QfLlOdXSRCkaybRniDHF4C8YcwhcvsqrOVuTP4B2Na+9wLdtrB31uz2rtlFI5kahdsnp/d1SrASDInYCtTYtdoke4kX+hoKWcEWM4Tle8pTUkUVv4BxS6fje/EzKBE4Qu9N9LMnrw/JNO0hqMVB4rk/2ou4AB1loQ7FZoPwut2o4KZB+0p9xnbrQKw038qjpHar+PyDwvxBRcu5hpHw3dguezeWv+IwvgW5icu8EGkhGa9AkFPPJT7VMSFb8xowveU=\",\n          \"base64\",\n        ),\n      ),\n    ),\n  }),\n};\n","import { AccountInfo, Commitment, Connection, PublicKey } from \"@solana/web3.js\";\nimport { MINT_SIZE, TOKEN_PROGRAM_ID, getTransferFeeConfig, unpackMint } from \"@solana/spl-token\";\nimport { WSOLMint, chunkArray, solToWSol } from \"./\";\nimport { createLogger } from \"./logger\";\nimport { ReturnTypeFetchMultipleMintInfos } from \"../gfx/type\";\n\ninterface MultipleAccountsJsonRpcResponse {\n  jsonrpc: string;\n  id: string;\n  error?: {\n    code: number;\n    message: string;\n  };\n  result: {\n    context: { slot: number };\n    value: { data: Array<string>; executable: boolean; lamports: number; owner: string; rentEpoch: number }[];\n  };\n}\n\nexport interface GetMultipleAccountsInfoConfig {\n  batchRequest?: boolean;\n  commitment?: Commitment;\n  chunkCount?: number;\n}\n\nconst logger = createLogger(\"Gfx_accountInfo_util\");\n\nexport async function getMultipleAccountsInfo(\n  connection: Connection,\n  publicKeys: PublicKey[],\n  config?: GetMultipleAccountsInfoConfig,\n): Promise<(AccountInfo<Buffer> | null)[]> {\n  const {\n    batchRequest,\n    commitment = \"confirmed\",\n    chunkCount = 100,\n  } = {\n    batchRequest: false,\n    ...config,\n  };\n\n  const chunkedKeys = chunkArray(publicKeys, chunkCount);\n  let results: (AccountInfo<Buffer> | null)[][] = new Array(chunkedKeys.length).fill([]);\n\n  if (batchRequest) {\n    const batch = chunkedKeys.map((keys) => {\n      const args = connection._buildArgs([keys.map((key) => key.toBase58())], commitment, \"base64\");\n      return {\n        methodName: \"getMultipleAccounts\",\n        args,\n      };\n    });\n\n    const _batch = chunkArray(batch, 10);\n\n    const unsafeResponse: MultipleAccountsJsonRpcResponse[] = await (\n      await Promise.all(_batch.map(async (i) => await (connection as any)._rpcBatchRequest(i)))\n    ).flat();\n    results = unsafeResponse.map((unsafeRes: MultipleAccountsJsonRpcResponse) => {\n      if (unsafeRes.error)\n        logger.logWithError(`failed to get info for multiple accounts, RPC_ERROR, ${unsafeRes.error.message}`);\n\n      return unsafeRes.result.value.map((accountInfo) => {\n        if (accountInfo) {\n          const { data, executable, lamports, owner, rentEpoch } = accountInfo;\n\n          if (data.length !== 2 && data[1] !== \"base64\") logger.logWithError(`info must be base64 encoded, RPC_ERROR`);\n\n          return {\n            data: Buffer.from(data[0], \"base64\"),\n            executable,\n            lamports,\n            owner: new PublicKey(owner),\n            rentEpoch,\n          };\n        }\n        return null;\n      });\n    });\n  } else {\n    try {\n      results = (await Promise.all(\n        chunkedKeys.map((keys) => connection.getMultipleAccountsInfo(keys, commitment)),\n      )) as (AccountInfo<Buffer> | null)[][];\n    } catch (error) {\n      if (error instanceof Error) {\n        logger.logWithError(`failed to get info for multiple accounts, RPC_ERROR, ${error.message}`);\n      }\n    }\n  }\n\n  return results.flat();\n}\n\nexport async function getMultipleAccountsInfoWithCustomFlags<T extends { pubkey: PublicKey }>(\n  connection: Connection,\n  publicKeysWithCustomFlag: T[],\n  config?: GetMultipleAccountsInfoConfig,\n): Promise<({ accountInfo: AccountInfo<Buffer> | null } & T)[]> {\n  const multipleAccountsInfo = await getMultipleAccountsInfo(\n    connection,\n    publicKeysWithCustomFlag.map((o) => o.pubkey),\n    config,\n  );\n\n  return publicKeysWithCustomFlag.map((o, idx) => ({ ...o, accountInfo: multipleAccountsInfo[idx] }));\n}\n\nexport enum AccountType {\n  Uninitialized,\n  Mint,\n  Account,\n}\nexport const ACCOUNT_TYPE_SIZE = 1;\n\nexport async function fetchMultipleMintInfos({\n  connection,\n  mints,\n  config,\n}: {\n  connection: Connection;\n  mints: PublicKey[];\n  config?: { batchRequest?: boolean };\n}): Promise<ReturnTypeFetchMultipleMintInfos> {\n  if (mints.length === 0) return {};\n  const mintInfos = await getMultipleAccountsInfoWithCustomFlags(\n    connection,\n    mints.map((i) => ({ pubkey: solToWSol(i) })),\n    config,\n  );\n\n  const mintK: ReturnTypeFetchMultipleMintInfos = {};\n  for (const i of mintInfos) {\n    if (!i.accountInfo || i.accountInfo.data.length < MINT_SIZE) {\n      console.log(\"invalid mint account\", i.pubkey.toBase58());\n      continue;\n    }\n    const t = unpackMint(i.pubkey, i.accountInfo, i.accountInfo?.owner);\n    mintK[i.pubkey.toString()] = {\n      ...t,\n      programId: i.accountInfo?.owner || TOKEN_PROGRAM_ID,\n      feeConfig: getTransferFeeConfig(t) ?? undefined,\n    };\n  }\n  mintK[PublicKey.default.toBase58()] = mintK[WSOLMint.toBase58()];\n\n  return mintK;\n}\n","import { Keypair, PublicKey, Signer } from \"@solana/web3.js\";\n\ntype _Owner = Keypair | PublicKey;\n\nexport class Owner {\n  private readonly _owner: _Owner;\n\n  constructor(owner: _Owner) {\n    this._owner = owner;\n  }\n\n  get publicKey(): PublicKey {\n    if (Owner.isKeyPair(this._owner)) {\n      return this._owner.publicKey;\n    }\n\n    return this._owner;\n  }\n\n  get signer(): Signer | undefined {\n    return Owner.isKeyPair(this._owner) ? this._owner : undefined;\n  }\n\n  get isKeyPair(): boolean {\n    return Owner.isKeyPair(this._owner);\n  }\n\n  get isPublicKey(): boolean {\n    return Owner.isPublicKey(this._owner);\n  }\n\n  static isKeyPair(owner: _Owner): owner is Keypair {\n    return (owner as Keypair).secretKey !== undefined;\n  }\n\n  static isPublicKey(owner: _Owner): owner is PublicKey {\n    return !Owner.isKeyPair(owner);\n  }\n}\n","/**\n * https://youmightnotneed.com/lodash/\n */\n\nexport function chunkArray<T>(arr: T[], chunkSize = 1, cache: T[][] = []): T[][] {\n  const tmp = [...arr];\n  if (chunkSize <= 0) return cache;\n  while (tmp.length) cache.push(tmp.splice(0, chunkSize));\n  return cache;\n}\n\nexport function intersection<T>(arr: T[], ...args: T[][]): T[] {\n  return arr.filter((item) => args.every((arr) => arr.includes(item)));\n}\n\nexport function xor<T>(arr: T[], ...args: T[][]): T[] {\n  return arr.filter((item) => args.every((arr) => !arr.includes(item)));\n}\n\nexport function uniq<T>(arr: T[]): T[] {\n  return [...new Set(arr)];\n}\n","export type TimeStamp = string | number | Date;\n\nexport const isNumber = (val): boolean => typeof val === \"number\";\nexport type DateParam = string | number | Date | undefined;\n\nexport const getDate = (value?: DateParam): Date => (value ? new Date(value) : new Date());\nexport const getTime = (value?: DateParam): number => getDate(value).getTime();\n\n/** A must be milliseconds */\nexport function isDateBefore(timestampA: TimeStamp, timestampB: TimeStamp, options?: { unit?: \"ms\" | \"s\" }): boolean {\n  const realTimestampB = isNumber(timestampB)\n    ? (timestampB as number) * (options?.unit === \"s\" ? 1000 : 1)\n    : new Date(timestampB).getTime();\n  return new Date(timestampA).getTime() <= realTimestampB;\n}\n\n/** A must be milliseconds */\nexport function isDateAfter(timestampA: TimeStamp, timestampB: TimeStamp, options?: { unit?: \"ms\" | \"s\" }): boolean {\n  const realTimestampB = isNumber(timestampB)\n    ? (timestampB as number) * (options?.unit === \"s\" ? 1000 : 1)\n    : new Date(timestampB).getTime();\n  return new Date(timestampA).getTime() > realTimestampB;\n}\n\nexport function offsetDateTime(\n  baseDate: DateParam,\n  offset: {\n    days?: number;\n    hours?: number;\n    minutes?: number;\n    seconds?: number;\n    milliseconds?: number;\n  },\n): Date {\n  const timestamp = getTime(baseDate);\n  const offsetedTimestamp =\n    timestamp +\n    (offset.days ? offset.days * 24 * 60 * 60 * 1000 : 0) +\n    (offset.hours ? offset.hours * 60 * 60 * 1000 : 0) +\n    (offset.minutes ? offset.minutes * 60 * 1000 : 0) +\n    (offset.seconds ? offset.seconds * 1000 : 0) +\n    (offset.milliseconds ? offset.milliseconds : 0);\n  return getDate(offsetedTimestamp);\n}\n","import { PublicKey } from \"@solana/web3.js\";\n\nexport const FEE_DESTINATION_ID = new PublicKey(\"7YttLkHDoNj9wyDur5pM1ejNaAvT9X4eqaYcHQqtj2G5\");\n\nexport const CREATE_CPMM_POOL_PROGRAM = new PublicKey(\"CPMMoo8L3F4NbTegBCKVNunggL7H1ZpdTHKxQB5qKP1C\");\nexport const CREATE_CPMM_POOL_AUTH = new PublicKey(\"GpMZbSM2GgvTKHJirzeGfMFoaZ8UR2X7F4v8vHTvxFbL\");\nexport const CREATE_CPMM_POOL_FEE_ACC = new PublicKey(\"DNXgeM9EiiaAbaWvwjHj9fQQLAX5ZsfHyvmYUNRAdNC8\");\n\nexport const DEV_CREATE_CPMM_POOL_PROGRAM = new PublicKey(\"CPMDWBwJDtYax9qW7AyRuVC19Cc4L4Vcy4n2BHAbHkCW\");\nexport const DEV_CREATE_CPMM_POOL_AUTH = new PublicKey(\"7rQ1QFNosMkUCuh7Z7fPbTHvh73b68sQYdirycEzJVuw\");\nexport const DEV_CREATE_CPMM_POOL_FEE_ACC = new PublicKey(\"G11FKBRaAkHAKuLCgLM6K6NUc9rTjPAznRCjZifrTQe2\");\n\nexport const ALL_PROGRAM_ID = {\n  CREATE_CPMM_POOL_PROGRAM,\n  CREATE_CPMM_POOL_AUTH,\n  CREATE_CPMM_POOL_FEE_ACC,\n};\n\nexport type ProgramIdConfig = Partial<typeof ALL_PROGRAM_ID>;\n\nexport const DEVNET_PROGRAM_ID = {\n  CREATE_CPMM_POOL_PROGRAM: DEV_CREATE_CPMM_POOL_PROGRAM,\n  CREATE_CPMM_POOL_AUTH: DEV_CREATE_CPMM_POOL_AUTH,\n  CREATE_CPMM_POOL_FEE_ACC: DEV_CREATE_CPMM_POOL_FEE_ACC,\n\n  FEE_DESTINATION_ID: new PublicKey(\"3XMrhbv989VxAMi3DErLV9eJht1pHppW5LbKxe9fkEFR\"),\n};\n","import { PublicKey } from \"@solana/web3.js\";\n\nimport { findProgramAddress } from \"./txTool/txUtils\";\nimport { TOKEN_PROGRAM_ID } from \"@solana/spl-token\";\n\nexport function getATAAddress(\n  owner: PublicKey,\n  mint: PublicKey,\n  programId?: PublicKey,\n): {\n  publicKey: PublicKey;\n  nonce: number;\n} {\n  return findProgramAddress(\n    [owner.toBuffer(), (programId ?? TOKEN_PROGRAM_ID).toBuffer(), mint.toBuffer()],\n    new PublicKey(\"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL\"),\n  );\n}\n","import { EpochInfo } from \"@solana/web3.js\";\nimport { TransferFeeConfig, TransferFee } from \"@solana/spl-token\";\nimport BN from \"bn.js\";\n\nimport { GetTransferAmountFee } from \"../gfx/type\";\nimport { TransferFeeDataBaseType } from \"../api/type\";\n\nconst POINT = 10_000;\nexport function getTransferAmountFee(\n  amount: BN,\n  feeConfig: TransferFeeConfig | undefined,\n  epochInfo: EpochInfo,\n  addFee: boolean,\n): GetTransferAmountFee {\n  if (feeConfig === undefined) {\n    return {\n      amount,\n      fee: undefined,\n      expirationTime: undefined,\n    };\n  }\n\n  const nowFeeConfig: TransferFee =\n    epochInfo.epoch < feeConfig.newerTransferFee.epoch ? feeConfig.olderTransferFee : feeConfig.newerTransferFee;\n  const maxFee = new BN(nowFeeConfig.maximumFee.toString());\n  const expirationTime: number | undefined =\n    epochInfo.epoch < feeConfig.newerTransferFee.epoch\n      ? ((Number(feeConfig.newerTransferFee.epoch) * epochInfo.slotsInEpoch - epochInfo.absoluteSlot) * 400) / 1000\n      : undefined;\n\n  if (addFee) {\n    if (nowFeeConfig.transferFeeBasisPoints === POINT) {\n      const nowMaxFee = new BN(nowFeeConfig.maximumFee.toString());\n      return {\n        amount: amount.add(nowMaxFee),\n        fee: nowMaxFee,\n        expirationTime,\n      };\n    } else {\n      const _TAmount = BNDivCeil(amount.mul(new BN(POINT)), new BN(POINT - nowFeeConfig.transferFeeBasisPoints));\n\n      const nowMaxFee = new BN(nowFeeConfig.maximumFee.toString());\n      const TAmount = _TAmount.sub(amount).gt(nowMaxFee) ? amount.add(nowMaxFee) : _TAmount;\n\n      const _fee = BNDivCeil(TAmount.mul(new BN(nowFeeConfig.transferFeeBasisPoints)), new BN(POINT));\n      const fee = _fee.gt(maxFee) ? maxFee : _fee;\n      return {\n        amount: TAmount,\n        fee,\n        expirationTime,\n      };\n    }\n  } else {\n    const _fee = BNDivCeil(amount.mul(new BN(nowFeeConfig.transferFeeBasisPoints)), new BN(POINT));\n    const fee = _fee.gt(maxFee) ? maxFee : _fee;\n\n    return {\n      amount,\n      fee,\n      expirationTime,\n    };\n  }\n}\n\nexport function getTransferAmountFeeV2(\n  amount: BN,\n  _feeConfig: TransferFeeDataBaseType | undefined,\n  epochInfo: EpochInfo,\n  addFee: boolean,\n): GetTransferAmountFee {\n  if (_feeConfig === undefined) {\n    return {\n      amount,\n      fee: undefined,\n      expirationTime: undefined,\n    };\n  }\n  const feeConfig = {\n    ..._feeConfig,\n    olderTransferFee: {\n      epoch: BigInt(_feeConfig.olderTransferFee.epoch),\n      maximumFee: BigInt(_feeConfig.olderTransferFee.maximumFee),\n      transferFeeBasisPoints: _feeConfig.olderTransferFee.transferFeeBasisPoints,\n    },\n    newerTransferFee: {\n      epoch: BigInt(_feeConfig.newerTransferFee.epoch),\n      maximumFee: BigInt(_feeConfig.newerTransferFee.maximumFee),\n      transferFeeBasisPoints: _feeConfig.newerTransferFee.transferFeeBasisPoints,\n    },\n  };\n\n  const nowFeeConfig: TransferFee =\n    epochInfo.epoch < feeConfig.newerTransferFee.epoch ? feeConfig.olderTransferFee : feeConfig.newerTransferFee;\n  const maxFee = new BN(nowFeeConfig.maximumFee.toString());\n  const expirationTime: number | undefined =\n    epochInfo.epoch < feeConfig.newerTransferFee.epoch\n      ? ((Number(feeConfig.newerTransferFee.epoch) * epochInfo.slotsInEpoch - epochInfo.absoluteSlot) * 400) / 1000\n      : undefined;\n\n  if (addFee) {\n    if (nowFeeConfig.transferFeeBasisPoints === POINT) {\n      const nowMaxFee = new BN(nowFeeConfig.maximumFee.toString());\n      return {\n        amount: amount.add(nowMaxFee),\n        fee: nowMaxFee,\n        expirationTime,\n      };\n    } else {\n      const _TAmount = BNDivCeil(amount.mul(new BN(POINT)), new BN(POINT - nowFeeConfig.transferFeeBasisPoints));\n\n      const nowMaxFee = new BN(nowFeeConfig.maximumFee.toString());\n      const TAmount = _TAmount.sub(amount).gt(nowMaxFee) ? amount.add(nowMaxFee) : _TAmount;\n\n      const _fee = BNDivCeil(TAmount.mul(new BN(nowFeeConfig.transferFeeBasisPoints)), new BN(POINT));\n      const fee = _fee.gt(maxFee) ? maxFee : _fee;\n      return {\n        amount: TAmount,\n        fee,\n        expirationTime,\n      };\n    }\n  } else {\n    const _fee = BNDivCeil(amount.mul(new BN(nowFeeConfig.transferFeeBasisPoints)), new BN(POINT));\n    const fee = _fee.gt(maxFee) ? maxFee : _fee;\n\n    return {\n      amount,\n      fee,\n      expirationTime,\n    };\n  }\n}\n\nexport function minExpirationTime(\n  expirationTime1: number | undefined,\n  expirationTime2: number | undefined,\n): number | undefined {\n  if (expirationTime1 === undefined) return expirationTime2;\n  if (expirationTime2 === undefined) return expirationTime1;\n\n  return Math.min(expirationTime1, expirationTime2);\n}\n\nexport function BNDivCeil(bn1: BN, bn2: BN): BN {\n  const { div, mod } = bn1.divmod(bn2);\n\n  if (mod.gt(new BN(0))) {\n    return div.add(new BN(1));\n  } else {\n    return div;\n  }\n}\n","export const API_URLS = {\n  BASE_HOST: \"https://gamma-api.goosefx.io/v1\",\n  /** id: string */\n  CONFIG: \"/config\",\n  /** ids: idList.join(',') */\n  POOL_BY_IDS: \"/pool/info/ids\",\n  /**\n   * poolType?: { 'hyper' | 'primary' | 'all' }. defaults to 'all'\n   * sortOrder?: { 'asc' | 'desc' }. defaults to 'desc'\n   * sortBy?: { 'liquidity' | 'volume_24h' / 7d / 30d | 'fee_24h' / 7d / 30d | 'apr_24h' / 7d / 30d }.\n   * pageSize?. { number } defaults to 200\n   * page?: { number } defaults to 1\n   * search: { string | undefined }\n   * mint1: string\n   * mint2?: string\n   */\n  POOL_BY_MINTS: \"/pool/info/mints\",\n  /**\n   * poolType?: { 'hyper' | 'primary' | 'all' }. defaults to 'all'\n   * sortOrder?: { 'asc' | 'desc' }. defaults to 'desc'\n   * sortBy?: { 'liquidity' | 'volume_24h' / 7d / 30d | 'fee_24h' / 7d / 30d | 'apr_24h' / 7d / 30d }.\n   * pageSize?. { number } defaults to 200\n   * page?: { number } defaults to 1\n   * search: { string | undefined }\n   */\n  POOL_LIST: \"/pool/info/all\",\n  /** ids: idList.join(',') */\n  POOL_KEYS_BY_IDS: \"/pool/keys/ids\",\n  TOKEN_LIST: \"/token-list\",\n  JUP_TOKEN_LIST: \"https://tokens.jup.ag/tokens?tags=lst,community\",\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 type ConfigInfo = {\n  id: string;\n  index: number;\n  protocolFeeRate: number;\n  tradeFeeRate: number;\n  fundFeeRate: number;\n  createPoolFee: string;\n  protocolOwner: string;\n  fundOwner: string;\n};\n\nexport type FetchPoolParams = {\n  poolType?: PoolType;\n  sortOrder?: SortOrder;\n  sortBy?: SortBy;\n  pageSize?: number;\n  page?: number;\n  search?: string;\n};\n\ntype PoolType = \"all\" | \"hyper\" | \"primary\";\ntype SortOrder = \"asc\" | \"desc\";\ntype SortBy =\n  | \"liquidity\"\n  | \"volume30d\"\n  | \"volume24h\"\n  | \"volume7d\"\n  | \"fee30d\"\n  | \"fee24h\"\n  | \"fee7d\"\n  | \"apr30d\"\n  | \"apr24h\"\n  | \"apr7d\";\n\nexport type PoolKeys = {\n  programId: string;\n  id: string;\n  mintA: string;\n  mintB: string;\n  openTime: string;\n  mintAVault: string;\n  mintBVault: string;\n  authority: string;\n  config: ConfigInfo;\n  poolType: PoolType;\n  mintAProgram: string;\n  mintBProgram: string;\n};\n\nexport type PartnerInfo = {\n  address: string;\n  name: string;\n  authority: string;\n  token0TokenAccount: string;\n  token1TokenAccount: string;\n};\n\ntype BasePoolInfo<T extends GammaToken> = {\n  programId: string;\n  id: string;\n  mintA: T;\n  mintB: T;\n  openTime: string;\n  mintAVault: string;\n  mintBVault: string;\n  authority: string;\n  config: ConfigInfo;\n  poolType: PoolType;\n  price: string | null;\n  tvl: string | null;\n  poolCreator: string;\n  liquidityTokenA: string | null;\n  liquidityTokenB: string | null;\n  lpSupply: string | null;\n  stats: {\n    daily: PoolStats;\n    weekly: PoolStats;\n    monthly: PoolStats;\n  };\n  partners: PartnerInfo[];\n};\n\nexport type PoolInfo = BasePoolInfo<GammaToken>;\nexport type ApiPoolInfo = BasePoolInfo<GammaApiToken>;\n\nexport type PoolStats = {\n  range: \"24H\" | \"7D\" | \"30D\";\n  feesUsd: number;\n  volumeTokenAUsd: number;\n  volumeTokenBUsd: number;\n  feesAprUsd: number;\n  volumeAprUsd: number;\n  withdrawnKaminoProfitTokenAUsd: number;\n  withdrawnKaminoProfitTokenBUsd: number;\n  withdrawnKaminoProfitTokenAAprUsd: number;\n  withdrawnKaminoProfitTokenBAprUsd: number;\n};\n\nexport type PaginatedPoolInfos = {\n  currentPage: number;\n  pageSize: number;\n  totalPages: number;\n  totalItems: number;\n  count: number;\n  pools: ApiPoolInfo[];\n};\n\nexport enum PoolFetchTypeEnum {\n  All = \"all\",\n  Hyper = \"hyper\",\n  Primary = \"primary\",\n}\n\nexport type GammaToken = {\n  address: string;\n  name: string;\n  symbol: string;\n  decimals: number;\n  logoURI: string;\n  tags?: string[];\n  extensions?: ExtensionsItem | null;\n};\n\nexport type GammaApiToken = {\n  address: string;\n  name: string;\n  symbol: string;\n  decimals: number;\n  logoURI: string;\n  dailyVolume: number | null;\n  freezeAuthority: string | null;\n  mintAuthority: string | null;\n  extensions: ExtensionsItem | null;\n  cumulativeTradeFees: string | null;\n  withdrawnKaminoProfit: string | null;\n  protocolFees: string | null;\n  fundFees: string | null;\n};\n\nexport type JupiterListToken = {\n  address: string;\n  name: string;\n  symbol: string;\n  decimals: number;\n  logoURI: string;\n  tags: string[]; // \"hasFreeze\" | \"hasTransferFee\" | \"token-2022\" | \"community\" | \"unknown\" ..etc\n  extensions: ExtensionsItem;\n};\n\ntype ExtensionsItem = {\n  coingeckoId?: string;\n  feeConfig?: TransferFeeDataBaseType;\n};\n\nexport interface TransferFeeDataBaseType {\n  transferFeeConfigAuthority: string;\n  withdrawWithheldAuthority: string;\n  withheldAmount: string;\n  olderTransferFee: {\n    epoch: string;\n    maximumFee: string;\n    transferFeeBasisPoints: number;\n  };\n  newerTransferFee: {\n    epoch: string;\n    maximumFee: string;\n    transferFeeBasisPoints: number;\n  };\n}\n","import { Connection, Keypair, PublicKey, EpochInfo, Commitment } from \"@solana/web3.js\";\nimport { merge } from \"lodash\";\n\nimport { Api, API_URL_CONFIG, JupiterListToken } 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 Cpmm from \"./cpmm/cpmm\";\n\nimport TokenModule from \"./token/token\";\nimport { SignAllTransactions } from \"./type\";\nimport { AnchorProvider, Program, Wallet } from \"@coral-xyz/anchor\";\nimport { Gamma } from \"./idl/gamma.type\";\nimport IDL from \"./idl/gamma.json\";\n\nexport interface ClientLoadParams extends TokenAccountDataProp, Omit<ClientApiBatchRequestParams, \"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  disableFeatureCheck?: boolean;\n  disableLoadToken?: boolean;\n  blockhashCommitment?: Commitment;\n  kamino?: {\n    market?: PublicKey;\n    programId?: PublicKey;\n  };\n}\n\nexport interface ClientApiBatchRequestParams {\n  api: Api;\n  defaultChainTimeOffset?: number;\n  defaultChainTime?: number;\n}\n\nexport type ClientConstructorParams = Required<ClientLoadParams> & ClientApiBatchRequestParams;\n\ninterface DataBase<T> {\n  fetched: number;\n  data: T;\n  extInfo?: Record<string, any>;\n}\ninterface ApiData {\n  jupTokenList?: DataBase<JupiterListToken[]>;\n}\n\nexport class GfxCpmmClient {\n  public cluster: Cluster;\n  public account: Account;\n  public cpmm: Cpmm;\n  public token: TokenModule;\n  public rawBalances: Map<string, string> = new Map();\n  public apiData: ApiData;\n  public blockhashCommitment: Commitment;\n  public program: Program<Gamma>;\n  public kamino?: {\n    market?: PublicKey;\n    programId?: PublicKey;\n  };\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: ClientConstructorParams) {\n    const {\n      connection,\n      cluster,\n      owner,\n      api,\n      defaultChainTime,\n      defaultChainTimeOffset,\n      apiCacheTime,\n      blockhashCommitment = \"confirmed\",\n    } = config;\n\n    this._connection = connection;\n    this.cluster = cluster || \"mainnet\";\n    this._owner = owner ? new Owner(owner) : undefined;\n    this._signAllTransactions = config.signAllTransactions;\n    this.blockhashCommitment = blockhashCommitment;\n    this.program = new Program(\n      IDL,\n      new AnchorProvider(connection, new Wallet(owner instanceof Keypair ? owner : Keypair.generate())),\n    );\n\n    this.api = api;\n    this._apiCacheTime = apiCacheTime || 5 * 60 * 1000;\n    this.logger = createLogger(\"Gfx\");\n    this.account = new Account({\n      scope: this,\n      moduleName: \"Gfx_Account\",\n      tokenAccounts: config.tokenAccounts,\n      tokenAccountRawInfos: config.tokenAccountRawInfos,\n    });\n    this.token = new TokenModule({ scope: this, moduleName: \"Gfx_tokenV2\" });\n    this.cpmm = new Cpmm({ scope: this, moduleName: \"Gfx_cpmm\" });\n\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: ClientLoadParams): Promise<GfxCpmmClient> {\n    const custom: Required<ClientLoadParams> = 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 client = new GfxCpmmClient({\n      ...custom,\n      api,\n    });\n\n    if (!config.disableLoadToken) await client.token.load({});\n\n    return client;\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): GfxCpmmClient {\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): GfxCpmmClient {\n    this._connection = connection;\n    return this;\n  }\n  get signAllTransactions(): SignAllTransactions | undefined {\n    return this._signAllTransactions;\n  }\n  public setSignAllTransactions(signAllTransactions?: SignAllTransactions): GfxCpmmClient {\n    this._signAllTransactions = signAllTransactions;\n    return this;\n  }\n\n  public checkOwner(): void {\n    if (!this.owner) {\n      this.logger.error(EMPTY_OWNER);\n      throw new Error(EMPTY_OWNER);\n    }\n  }\n\n  private isCacheInvalidate(time: number): boolean {\n    return new Date().getTime() - time > this._apiCacheTime;\n  }\n\n  public async fetchJupTokenList(forceUpdate?: boolean): Promise<JupiterListToken[]> {\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      this.apiData.jupTokenList = {\n        fetched: Date.now(),\n        data: jupList,\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 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","export const EMPTY_OWNER =\n  \"please provide owner in load() initialization or you can set by calling GfxCpmmClient.setOwner(owner)\";\n\nexport const EMPTY_CONNECTION =\n  \"please provide connection in load() initialization or set it by GfxCpmmClient.setConnection(connection)\";\n","import {\n  createAssociatedTokenAccountInstruction,\n  TOKEN_PROGRAM_ID,\n  AccountLayout,\n  TOKEN_2022_PROGRAM_ID,\n} from \"@solana/spl-token\";\nimport { Commitment, PublicKey, SystemProgram, TransactionInstruction } from \"@solana/web3.js\";\nimport { getATAAddress, BigNumberish, InstructionType, WSOLMint } from \"@/common\";\nimport { AddInstructionParam } from \"@/common/txTool/txTool\";\n\nimport ModuleBase, { ModuleBaseProps } from \"../moduleBase\";\nimport {\n  closeAccountInstruction,\n  createWSolAccountInstructions,\n  makeTransferInstruction,\n  initTokenAccountInstruction,\n} from \"./instruction\";\nimport { HandleTokenAccountParams, TokenAccount, TokenAccountRaw, GetOrCreateTokenAccountParams } from \"./types\";\nimport { parseTokenAccountResp, generatePubKey } from \"./util\";\nimport BN from \"bn.js\";\n\nexport interface TokenAccountDataProp {\n  tokenAccounts?: TokenAccount[];\n  tokenAccountRawInfos?: TokenAccountRaw[];\n}\nexport default class Account extends ModuleBase {\n  private _tokenAccounts: TokenAccount[] = [];\n  private _tokenAccountRawInfos: TokenAccountRaw[] = [];\n  private _accountChangeListenerId?: number;\n  private _accountListener: ((data: TokenAccountDataProp) => void)[] = [];\n  private _clientOwnedToken = false;\n  private _accountFetchTime = 0;\n\n  constructor(params: TokenAccountDataProp & ModuleBaseProps) {\n    super(params);\n    const { tokenAccounts, tokenAccountRawInfos } = params;\n    this._tokenAccounts = tokenAccounts || [];\n    this._tokenAccountRawInfos = tokenAccountRawInfos || [];\n    this._clientOwnedToken = !!(tokenAccounts || tokenAccountRawInfos);\n  }\n\n  get tokenAccounts(): TokenAccount[] {\n    return this._tokenAccounts;\n  }\n  get tokenAccountRawInfos(): TokenAccountRaw[] {\n    return this._tokenAccountRawInfos;\n  }\n\n  public updateTokenAccount({ tokenAccounts, tokenAccountRawInfos }: TokenAccountDataProp): Account {\n    if (tokenAccounts) this._tokenAccounts = tokenAccounts;\n    if (tokenAccountRawInfos) this._tokenAccountRawInfos = tokenAccountRawInfos;\n    this._accountChangeListenerId && this.scope.connection.removeAccountChangeListener(this._accountChangeListenerId);\n    this._accountChangeListenerId = undefined;\n    this._clientOwnedToken = true;\n    return this;\n  }\n\n  public addAccountChangeListener(cbk: (data: TokenAccountDataProp) => void): Account {\n    this._accountListener.push(cbk);\n    return this;\n  }\n\n  public removeAccountChangeListener(cbk: (data: TokenAccountDataProp) => void): Account {\n    this._accountListener = this._accountListener.filter((listener) => listener !== cbk);\n    return this;\n  }\n\n  public getAssociatedTokenAccount(mint: PublicKey, programId?: PublicKey): PublicKey {\n    return getATAAddress(this.scope.ownerPubKey, mint, programId).publicKey;\n  }\n\n  public 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 && this._tokenAccounts.length && Date.now() - this._accountFetchTime < 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    this._accountChangeListenerId && this.scope.connection.removeAccountChangeListener(this._accountChangeListenerId);\n    this._accountChangeListenerId = this.scope.connection.onAccountChange(\n      this.scope.ownerPubKey,\n      () => this.fetchWalletTokenAccounts({ forceUpdate: true }),\n      config?.commitment,\n    );\n\n    return { tokenAccounts, tokenAccountRawInfos };\n  }\n\n  // user token account needed, old _selectTokenAccount\n  public async getCreatedTokenAccount({\n    mint,\n    programId = TOKEN_PROGRAM_ID,\n    associatedOnly = true,\n  }: {\n    mint: PublicKey;\n    programId?: PublicKey;\n    associatedOnly?: boolean;\n  }): Promise<PublicKey | undefined> {\n    await this.fetchWalletTokenAccounts();\n    const tokenAccounts = this._tokenAccounts\n      .filter(({ mint: accountMint }) => accountMint?.equals(mint))\n      // sort by balance\n      .sort((a, b) => (a.amount.lt(b.amount) ? 1 : -1));\n\n    const ata = this.getAssociatedTokenAccount(mint, programId);\n    for (const tokenAccount of tokenAccounts) {\n      const { publicKey } = tokenAccount;\n      if (publicKey) {\n        if (!associatedOnly || (associatedOnly && ata.equals(publicKey))) return publicKey;\n      }\n    }\n  }\n\n  // old _selectOrCreateTokenAccount\n  public async getOrCreateTokenAccount(params: GetOrCreateTokenAccountParams): Promise<{\n    account?: PublicKey;\n    instructionParams?: AddInstructionParam;\n  }> {\n    await this.fetchWalletTokenAccounts();\n    const {\n      mint,\n      createInfo,\n      associatedOnly,\n      owner,\n      notUseTokenAccount = false,\n      skipCloseAccount = false,\n      checkCreateATAOwner = false,\n    } = params;\n    const tokenProgram = new PublicKey(params.tokenProgram || TOKEN_PROGRAM_ID);\n    const ata = this.getAssociatedTokenAccount(mint, new PublicKey(tokenProgram));\n    const accounts = (notUseTokenAccount ? [] : this.tokenAccountRawInfos)\n      .filter((i) => i.accountInfo.mint.equals(mint) && (!associatedOnly || i.pubkey.equals(ata)))\n      .sort((a, b) => (new BN(a.accountInfo.amount.toString()).lt(new BN(b.accountInfo.amount.toString())) ? 1 : -1));\n    // find token or don't need create\n    if (createInfo === undefined || accounts.length > 0) {\n      return accounts.length > 0 ? { account: accounts[0].pubkey } : {};\n    }\n\n    const newTxInstructions: AddInstructionParam = {\n      instructions: [],\n      endInstructions: [],\n      signers: [],\n      instructionTypes: [],\n      endInstructionTypes: [],\n    };\n\n    if (associatedOnly) {\n      const _createATAIns = createAssociatedTokenAccountInstruction(owner, ata, owner, mint, tokenProgram);\n      if (checkCreateATAOwner) {\n        const ataInfo = await this.scope.connection.getAccountInfo(ata);\n        if (ataInfo === null) {\n          newTxInstructions.instructions?.push(_createATAIns);\n          newTxInstructions.instructionTypes!.push(InstructionType.CreateATA);\n        } else if (\n          ataInfo.owner.equals(tokenProgram) &&\n          AccountLayout.decode(new Uint8Array(ataInfo.data)).mint.equals(mint) &&\n          AccountLayout.decode(new Uint8Array(ataInfo.data)).owner.equals(owner)\n        ) {\n          /* empty */\n        } else {\n          throw Error(`create ata check error -> mint: ${mint.toString()}, ata: ${ata.toString()}`);\n        }\n      } else {\n        newTxInstructions.instructions!.push(_createATAIns);\n        newTxInstructions.instructionTypes!.push(InstructionType.CreateATA);\n      }\n      if (mint.equals(WSOLMint) && createInfo.amount) {\n        const txInstruction = await createWSolAccountInstructions({\n          connection: this.scope.connection,\n          owner: this.scope.ownerPubKey,\n          payer: createInfo.payer || this.scope.ownerPubKey,\n          amount: createInfo.amount ?? 0,\n          skipCloseAccount,\n        });\n        newTxInstructions.instructions!.push(...(txInstruction.instructions || []));\n        newTxInstructions.endInstructions!.push(...(txInstruction.endInstructions || []));\n        newTxInstructions.instructionTypes!.push(...(txInstruction.instructionTypes || []));\n        newTxInstructions.endInstructionTypes!.push(...(txInstruction.endInstructionTypes || []));\n\n        if (createInfo.amount) {\n          newTxInstructions.instructions!.push(\n            makeTransferInstruction({\n              source: txInstruction.addresses.newAccount,\n              destination: ata,\n              owner: this.scope.ownerPubKey,\n              amount: createInfo.amount,\n              tokenProgram: TOKEN_PROGRAM_ID,\n            }),\n          );\n          newTxInstructions.instructionTypes!.push(InstructionType.TransferAmount);\n        }\n      }\n\n      if (!skipCloseAccount) {\n        newTxInstructions.endInstructions!.push(\n          closeAccountInstruction({\n            owner,\n            payer: createInfo.payer || owner,\n            tokenAccount: ata,\n            programId: tokenProgram,\n          }),\n        );\n        newTxInstructions.endInstructionTypes!.push(InstructionType.CloseAccount);\n      }\n\n      return { account: ata, instructionParams: newTxInstructions };\n    } else {\n      // if (mint.equals(WSOLMint)) {\n      //   const txInstruction = await createWSolAccountInstructions({\n      //     connection: this.scope.connection,\n      //     owner: this.scope.ownerPubKey,\n      //     payer: createInfo.payer || this.scope.ownerPubKey,\n      //     amount: createInfo.amount ?? 0,\n      //     skipCloseAccount,\n      //   });\n      //   newTxInstructions.instructions!.push(...(txInstruction.instructions || []));\n      //   newTxInstructions.endInstructions!.push(...(txInstruction.endInstructions || []));\n      //   newTxInstructions.signers!.push(...(txInstruction.signers || []));\n      //   newTxInstructions.instructionTypes!.push(...(txInstruction.instructionTypes || []));\n      //   newTxInstructions.endInstructionTypes!.push(...(txInstruction.endInstructionTypes || []));\n\n      //   return { account: txInstruction.addresses.newAccount, instructionParams: newTxInstructions };\n      // } else {\n      const newTokenAccount = generatePubKey({ fromPublicKey: owner, programId: tokenProgram });\n      const balanceNeeded = await this.scope.connection.getMinimumBalanceForRentExemption(AccountLayout.span);\n\n      const createAccountIns = SystemProgram.createAccountWithSeed({\n        fromPubkey: owner,\n        basePubkey: owner,\n        seed: newTokenAccount.seed,\n        newAccountPubkey: newTokenAccount.publicKey,\n        lamports: balanceNeeded + Number(createInfo.amount?.toString() ?? 0),\n        space: AccountLayout.span,\n        programId: tokenProgram,\n      });\n\n      newTxInstructions.instructions!.push(\n        createAccountIns,\n        initTokenAccountInstruction({\n          mint,\n          tokenAccount: newTokenAccount.publicKey,\n          owner: this.scope.ownerPubKey,\n          programId: tokenProgram,\n        }),\n      );\n      newTxInstructions.instructionTypes!.push(InstructionType.CreateAccount);\n      newTxInstructions.instructionTypes!.push(InstructionType.InitAccount);\n      if (!skipCloseAccount) {\n        newTxInstructions.endInstructions!.push(\n          closeAccountInstruction({\n            owner,\n            payer: createInfo.payer || owner,\n            tokenAccount: newTokenAccount.publicKey,\n            programId: tokenProgram,\n          }),\n        );\n        newTxInstructions.endInstructionTypes!.push(InstructionType.CloseAccount);\n      }\n      return { account: newTokenAccount.publicKey, instructionParams: newTxInstructions };\n    }\n    // }\n  }\n\n  public async checkOrCreateAta({\n    mint,\n    programId = TOKEN_PROGRAM_ID,\n    autoUnwrapWSOLToSOL,\n  }: {\n    mint: PublicKey;\n    programId?: PublicKey;\n    autoUnwrapWSOLToSOL?: boolean;\n  }): Promise<{ pubKey: PublicKey; newInstructions: AddInstructionParam }> {\n    await this.fetchWalletTokenAccounts();\n    let tokenAccountAddress = this.scope.account.tokenAccounts.find(\n      ({ mint: accountTokenMint }) => accountTokenMint?.toBase58() === mint.toBase58(),\n    )?.publicKey;\n\n    const owner = this.scope.ownerPubKey;\n    const newTxInstructions: AddInstructionParam = {};\n\n    if (!tokenAccountAddress) {\n      const ataAddress = this.getAssociatedTokenAccount(mint, programId);\n      const instruction = await createAssociatedTokenAccountInstruction(owner, ataAddress, owner, mint, programId);\n      newTxInstructions.instructions = [instruction];\n      newTxInstructions.instructionTypes = [InstructionType.CreateATA];\n      tokenAccountAddress = ataAddress;\n    }\n    if (autoUnwrapWSOLToSOL && WSOLMint.toBase58() === mint.toBase58()) {\n      newTxInstructions.endInstructions = [\n        closeAccountInstruction({ owner, payer: owner, tokenAccount: tokenAccountAddress, programId }),\n      ];\n      newTxInstructions.endInstructionTypes = [InstructionType.CloseAccount];\n    }\n\n    return {\n      pubKey: tokenAccountAddress,\n      newInstructions: newTxInstructions,\n    };\n  }\n\n  // old _handleTokenAccount\n  public async handleTokenAccount(\n    params: HandleTokenAccountParams,\n  ): Promise<AddInstructionParam & { tokenAccount: PublicKey }> {\n    const {\n      side,\n      amount,\n      mint,\n      programId = TOKEN_PROGRAM_ID,\n      tokenAccount,\n      payer = this.scope.ownerPubKey,\n      bypassAssociatedCheck,\n      skipCloseAccount,\n      checkCreateATAOwner,\n    } = params;\n\n    const ata = this.getAssociatedTokenAccount(mint, programId);\n\n    if (new PublicKey(WSOLMint).equals(mint)) {\n      const txInstruction = await createWSolAccountInstructions({\n        connection: this.scope.connection,\n        owner: this.scope.ownerPubKey,\n        payer,\n        amount,\n        skipCloseAccount,\n      });\n      return { tokenAccount: txInstruction.addresses.newAccount, ...txInstruction };\n    } else if (!tokenAccount || (side === \"out\" && !ata.equals(tokenAccount) && !bypassAssociatedCheck)) {\n      const instructions: TransactionInstruction[] = [];\n      const _createATAIns = createAssociatedTokenAccountInstruction(\n        this.scope.ownerPubKey,\n        ata,\n        this.scope.ownerPubKey,\n        mint,\n        programId,\n      );\n\n      if (checkCreateATAOwner) {\n        const ataInfo = await this.scope.connection.getAccountInfo(ata);\n        if (ataInfo === null) {\n          instructions.push(_createATAIns);\n        } else if (\n          ataInfo.owner.equals(TOKEN_PROGRAM_ID) &&\n          AccountLayout.decode(new Uint8Array(ataInfo.data)).mint.equals(mint) &&\n          AccountLayout.decode(new Uint8Array(ataInfo.data)).owner.equals(this.scope.ownerPubKey)\n        ) {\n          /* empty */\n        } else {\n          throw Error(`create ata check error -> mint: ${mint.toString()}, ata: ${ata.toString()}`);\n        }\n      } else {\n        instructions.push(_createATAIns);\n      }\n\n      return {\n        tokenAccount: ata,\n        instructions,\n        instructionTypes: [InstructionType.CreateATA],\n      };\n    }\n\n    return { tokenAccount };\n  }\n\n  public async processTokenAccount(props: {\n    mint: PublicKey;\n    programId?: PublicKey;\n    amount?: BigNumberish;\n    useSOLBalance?: boolean;\n    handleTokenAccount?: boolean;\n  }): Promise<Promise<AddInstructionParam & { tokenAccount?: PublicKey }>> {\n    const { mint, programId = TOKEN_PROGRAM_ID, amount, useSOLBalance, handleTokenAccount } = props;\n    let tokenAccount: PublicKey | undefined;\n    const txBuilder = this.createTxBuilder();\n\n    if (mint.equals(new PublicKey(WSOLMint)) && useSOLBalance) {\n      // mintA\n      const { tokenAccount: _tokenAccount, ...instructions } = await this.handleTokenAccount({\n        side: \"in\",\n        amount: amount || 0,\n        mint,\n        bypassAssociatedCheck: true,\n        programId,\n      });\n      tokenAccount = _tokenAccount;\n      txBuilder.addInstruction(instructions);\n    } else {\n      tokenAccount = await this.getCreatedTokenAccount({\n        mint,\n        associatedOnly: false,\n        programId,\n      });\n      if (!tokenAccount && handleTokenAccount) {\n        const { tokenAccount: _tokenAccount, ...instructions } = await this.scope.account.handleTokenAccount({\n          side: \"in\",\n          amount: 0,\n          mint,\n          bypassAssociatedCheck: true,\n          programId,\n        });\n        tokenAccount = _tokenAccount;\n        txBuilder.addInstruction(instructions);\n      }\n    }\n\n    return { tokenAccount, ...txBuilder.AllTxData };\n  }\n}\n","import { PublicKey } from \"@solana/web3.js\";\n\nimport { createLogger, Logger } from \"../common/logger\";\nimport { TxBuilder } from \"../common/txTool/txTool\";\n\nimport { GfxCpmmClient } from \".\";\n\nexport interface ModuleBaseProps {\n  scope: GfxCpmmClient;\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: GfxCpmmClient;\n  private disabled = false;\n  protected logger: Logger;\n\n  constructor({ scope, moduleName }: ModuleBaseProps) {\n    this.scope = scope;\n    this.logger = createLogger(moduleName);\n  }\n\n  protected createTxBuilder(feePayer?: PublicKey): TxBuilder {\n    this.scope.checkOwner();\n    return new TxBuilder({\n      connection: this.scope.connection,\n      feePayer: feePayer || this.scope.ownerPubKey,\n      cluster: this.scope.cluster,\n      owner: this.scope.owner,\n      blockhashCommitment: this.scope.blockhashCommitment,\n      api: this.scope.api,\n      signAllTransactions: this.scope.signAllTransactions,\n    });\n  }\n\n  public logDebug(...args: (string | number | Record<string, any>)[]): void {\n    this.logger.debug(joinMsg(args));\n  }\n\n  public logInfo(...args: (string | number | Record<string, any>)[]): void {\n    this.logger.info(joinMsg(args));\n  }\n\n  public logAndCreateError(...args: (string | number | Record<string, any>)[]): void {\n    const message = joinMsg(args);\n    // this.logger.error(message);\n    throw new Error(message);\n  }\n\n  public checkDisabled(): void {\n    if (this.disabled || !this.scope) this.logAndCreateError(\"module not working\");\n  }\n}\n","import {\n  createInitializeAccountInstruction,\n  createCloseAccountInstruction,\n  createTransferInstruction,\n  TOKEN_PROGRAM_ID,\n} from \"@solana/spl-token\";\nimport { Commitment, Connection, PublicKey, Signer, SystemProgram, TransactionInstruction } from \"@solana/web3.js\";\nimport BN from \"bn.js\";\nimport { generatePubKey } from \"./util\";\nimport { BigNumberish, parseBigNumberish } from \"@/common\";\nimport { AddInstructionParam } from \"@/common/txTool/txTool\";\nimport { InstructionType } from \"@/common/txTool/txType\";\nimport { TOKEN_WSOL } from \"../token/constant\";\n\nimport { splAccountLayout } from \"./layout\";\n\nexport function initTokenAccountInstruction(params: {\n  mint: PublicKey;\n  tokenAccount: PublicKey;\n  owner: PublicKey;\n  programId?: PublicKey;\n}): TransactionInstruction {\n  const { mint, tokenAccount, owner, programId = TOKEN_PROGRAM_ID } = params;\n  return createInitializeAccountInstruction(tokenAccount, mint, owner, programId);\n}\n\nexport function closeAccountInstruction(params: {\n  tokenAccount: PublicKey;\n  payer: PublicKey;\n  multiSigners?: Signer[];\n  owner: PublicKey;\n  programId?: PublicKey;\n}): TransactionInstruction {\n  const { tokenAccount, payer, multiSigners = [], owner, programId = TOKEN_PROGRAM_ID } = params;\n  return createCloseAccountInstruction(tokenAccount, payer, owner, multiSigners, programId);\n}\n\ninterface CreateWSolTokenAccount {\n  connection: Connection;\n  payer: PublicKey;\n  owner: PublicKey;\n  amount: BigNumberish;\n  commitment?: Commitment;\n  skipCloseAccount?: boolean;\n}\n/**\n * WrappedNative account = wsol account\n */\nexport async function createWSolAccountInstructions(params: CreateWSolTokenAccount): Promise<\n  AddInstructionParam & {\n    addresses: { newAccount: PublicKey };\n  }\n> {\n  const { connection, amount, commitment, payer, owner, skipCloseAccount } = params;\n\n  const balanceNeeded = await connection.getMinimumBalanceForRentExemption(splAccountLayout.span, commitment);\n  const lamports = parseBigNumberish(amount).add(new BN(balanceNeeded));\n  const newAccount = generatePubKey({ fromPublicKey: payer, programId: TOKEN_PROGRAM_ID });\n\n  return {\n    addresses: { newAccount: newAccount.publicKey },\n    signers: [],\n    instructions: [\n      SystemProgram.createAccountWithSeed({\n        fromPubkey: payer,\n        basePubkey: payer,\n        seed: newAccount.seed,\n        newAccountPubkey: newAccount.publicKey,\n        lamports: lamports.toNumber(),\n        space: splAccountLayout.span,\n        programId: TOKEN_PROGRAM_ID,\n      }),\n      initTokenAccountInstruction({\n        mint: new PublicKey(TOKEN_WSOL.address),\n        tokenAccount: newAccount.publicKey,\n        owner,\n        programId: TOKEN_PROGRAM_ID,\n      }),\n    ],\n    instructionTypes: [InstructionType.CreateAccount, InstructionType.InitAccount],\n    endInstructionTypes: skipCloseAccount ? [] : [InstructionType.CloseAccount],\n    endInstructions: skipCloseAccount\n      ? []\n      : [\n          closeAccountInstruction({\n            tokenAccount: newAccount.publicKey,\n            payer,\n            owner,\n          }),\n        ],\n  };\n}\n\nexport function makeTransferInstruction({\n  source,\n  destination,\n  owner,\n  amount,\n  multiSigners = [],\n  tokenProgram = TOKEN_PROGRAM_ID,\n}: {\n  source: PublicKey;\n  destination: PublicKey;\n  owner: PublicKey;\n  amount: BigNumberish;\n  multiSigners?: Signer[];\n  tokenProgram?: PublicKey;\n}): TransactionInstruction {\n  return createTransferInstruction(source, destination, owner, BigInt(String(amount)), multiSigners, tokenProgram);\n}\n","import { AccountInfo, PublicKey, RpcResponseAndContext, Keypair, GetProgramAccountsResponse } from \"@solana/web3.js\";\nimport { TOKEN_PROGRAM_ID } from \"@solana/spl-token\";\nimport BN from \"bn.js\";\nimport { createLogger, getATAAddress } from \"@/common\";\n\nimport { splAccountLayout } from \"./layout\";\nimport { TokenAccount, TokenAccountRaw } from \"./types\";\nimport { sha256 } from \"@noble/hashes/sha256\";\n\nconst logger = createLogger(\"Gfx_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(new Uint8Array(account.data));\n    const { mint, amount } = accountInfo;\n    tokenAccounts.push({\n      publicKey: pubkey,\n      mint,\n      amount: new BN(amount.toString()),\n      isAssociated: getATAAddress(owner, mint, account.owner).publicKey.equals(pubkey),\n      isNative: false,\n      programId: account.owner,\n    });\n    // todo programId should get from api\n    tokenAccountRawInfos.push({ pubkey, accountInfo, programId: account.owner });\n  }\n\n  if (solAccountResp) {\n    tokenAccounts.push({\n      mint: PublicKey.default,\n      amount: new BN(solAccountResp.lamports),\n      isNative: true,\n      programId: solAccountResp.owner,\n    });\n  }\n\n  return {\n    tokenAccounts,\n    tokenAccountRawInfos,\n  };\n}\n\nexport function generatePubKey({\n  fromPublicKey,\n  programId = TOKEN_PROGRAM_ID,\n}: {\n  fromPublicKey: PublicKey;\n  programId: PublicKey;\n}): { publicKey: PublicKey; seed: string } {\n  const seed = Keypair.generate().publicKey.toBase58().slice(0, 32);\n  const publicKey = createWithSeed(fromPublicKey, seed, programId);\n  return { publicKey, seed };\n}\n\nfunction createWithSeed(fromPublicKey: PublicKey, seed: string, programId: PublicKey): PublicKey {\n  const buffer = Buffer.concat(\n    [fromPublicKey.toBuffer(), Buffer.from(seed), programId.toBuffer()].map((buf) => new Uint8Array(buf)),\n  );\n  const publicKeyBytes = sha256(new Uint8Array(buffer));\n  return new PublicKey(publicKeyBytes);\n}\n","import { AccountLayout } from \"@solana/spl-token\";\n\nexport const splAccountLayout = AccountLayout;\n",null,null,null,null,"import { PublicKey, SystemProgram } from \"@solana/web3.js\";\nimport { NATIVE_MINT, TOKEN_PROGRAM_ID, createSyncNativeInstruction } from \"@solana/spl-token\";\nimport { PoolInfo, PoolKeys, PoolStats } from \"@/api/type\";\nimport { Percent } from \"@/module\";\nimport { BN_ZERO } from \"@/common/number\";\nimport { WSOLMint } from \"@/common/pubKey\";\nimport { InstructionType, TxVersion } from \"@/common/txTool/txType\";\nimport { MakeTxData } from \"@/common/txTool/txTool\";\nimport { CurveCalculator, RoundDirection } from \"./curve/calculator\";\n\nimport ModuleBase, { ModuleBaseProps } from \"../moduleBase\";\nimport {\n  CreateCpmmPoolParam,\n  CreateCpmmPoolAddress,\n  AddCpmmLiquidityParams,\n  WithdrawCpmmLiquidityParams,\n  CpmmSwapParams,\n  ComputePairAmountParams,\n  CpmmRpcData,\n  CpmmComputeData,\n  UserLiquidityAccount,\n  CpmmObservationState,\n  CpmmPool,\n  CpmmPoolPartners,\n  CpmmConfig,\n} from \"./type\";\nimport { getCreatePoolKeys, getPdaObservationId, getPdaPoolPartners, getPdaUserLiquidity } from \"./pda\";\nimport {\n  makeCreateCpmmPoolInInstruction,\n  makeDepositCpmmInInstruction,\n  makeInitUserPoolLiquidityInstruction,\n  makeWithdrawCpmmInInstruction,\n  makeSwapCpmmBaseInInstruction,\n  makeSwapCpmmBaseOutInstruction,\n  makeSwapCpmmOracleBaseInInstruction,\n  makeInitializePartnerInstruction,\n  makeAddPartnerInstruction,\n} from \"./instruction\";\nimport BN from \"bn.js\";\nimport Decimal from \"decimal.js\";\nimport { fetchMultipleMintInfos, getTransferAmountFeeV2 } from \"@/common\";\nimport { ComputeBudgetConfig, GetTransferAmountFee, ReturnTypeFetchMultipleMintInfos } from \"@/gfx/type\";\nimport { toGammaApiToken, toFeeConfig, SOL_INFO } from \"../token\";\nimport { getPdaPoolAuthority } from \"./pda\";\nimport { ConstantProductCurve } from \"./curve/constantProduct\";\nimport { Program } from \"@coral-xyz/anchor\";\nimport { Gamma } from \"../idl/gamma.type\";\nimport { getReserveAccountsForWithdraw, getReservesForMarket, KaminoReserve } from \"./kamino\";\n\nexport default class CpmmModule extends ModuleBase {\n  private program: Program<Gamma>;\n  private kamino?: {\n    market?: PublicKey;\n    programId?: PublicKey;\n  };\n  /** map of liquidity mint to kamino reserve */\n  private reserves: Map<string, KaminoReserve>;\n\n  constructor(params: ModuleBaseProps) {\n    super(params);\n    this.program = params.scope.program;\n    this.kamino = params.scope.kamino;\n    this.reserves = new Map();\n  }\n\n  public async load(): Promise<void> {\n    this.checkDisabled();\n  }\n\n  public async getCpmmPoolKeys(poolId: string): Promise<PoolKeys> {\n    return ((await this.scope.api.fetchPoolKeysById({ idList: [poolId] })) as PoolKeys[])[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 getTotalDepositsByPartner(\n    poolIds: string[],\n    partner: PublicKey,\n  ): Promise<{\n    [poolId: string]: {\n      totalInvestedThoughPartnerToken0: BN;\n      totalInvestedThoughPartnerToken1: BN;\n      totalLpTokensLinked: BN;\n    };\n  }> {\n    const partnerIds = poolIds.map((id) => getPdaPoolPartners(this.program.programId, new PublicKey(id)).publicKey);\n    const poolInfos = await this.program.account.poolState.fetchMultiple(poolIds);\n    const partnerInfos = await this.program.account.poolPartnerInfos.fetchMultiple(partnerIds);\n\n    const returnData: {\n      [poolId: string]: {\n        totalInvestedThoughPartnerToken0: BN;\n        totalInvestedThoughPartnerToken1: BN;\n        totalLpTokensLinked: BN;\n      };\n    } = {};\n\n    for (let i = 0; i < poolIds.length; i++) {\n      const pool = poolInfos[i];\n      const partners = partnerInfos[i];\n      if (pool === null) throw Error(\"fetch pool info error: \" + poolIds[i]);\n      if (partners === null) throw Error(\"fetch poolPartners info error: \" + partnerIds[i]);\n      const { token0, token1, lp } = await this.getTokenInvestedByPartner(pool, partners, partner);\n\n      returnData[poolIds[i]] = {\n        totalInvestedThoughPartnerToken0: token0,\n        totalInvestedThoughPartnerToken1: token1,\n        totalLpTokensLinked: lp,\n      };\n    }\n\n    return returnData;\n  }\n\n  public async getTokenInvestedByPartner(\n    poolInfo: CpmmPool,\n    partnerInfo: CpmmPoolPartners,\n    partner: PublicKey,\n  ): Promise<{ token0: BN; token1: BN; lp: BN }> {\n    const lpTokensLinked =\n      partnerInfo.infos.find((info) => info.partner.toBase58() === partner.toBase58())?.lpTokenLinkedWithPartner ??\n      new BN(0);\n    if (lpTokensLinked.eqn(0)) {\n      return { token0: new BN(0), token1: new BN(0), lp: new BN(0) };\n    }\n    const lpToTradingToken = ConstantProductCurve.lpTokensToTradingTokens(\n      lpTokensLinked,\n      poolInfo.lpSupply,\n      poolInfo.token0VaultAmount,\n      poolInfo.token1VaultAmount,\n      RoundDirection.Floor,\n    );\n    return {\n      token0: lpToTradingToken.tokenAmount0,\n      token1: lpToTradingToken.tokenAmount1,\n      lp: lpTokensLinked,\n    };\n  }\n\n  public async getRpcPoolInfos(\n    poolIds: string[],\n    fetchConfigInfo?: boolean,\n  ): Promise<{\n    [poolId: string]: CpmmRpcData;\n  }> {\n    const partnerIds = poolIds.map((id) => getPdaPoolPartners(this.program.programId, new PublicKey(id)).publicKey);\n    const observationIds = poolIds.map(\n      (id) => getPdaObservationId(this.program.programId, new PublicKey(id)).publicKey,\n    );\n\n    const [accounts, partnerInfos, observations] = await Promise.all([\n      this.program.account.poolState.fetchMultiple(poolIds),\n      this.program.account.poolPartnerInfos.fetchMultiple(partnerIds),\n      this.program.account.observationState.fetchMultiple(observationIds),\n    ]);\n\n    const poolInfos: {\n      [poolId: string]: CpmmPool & {\n        observationAccount: CpmmObservationState;\n        partnerInfo: CpmmPoolPartners;\n        programId: PublicKey;\n      };\n    } = {};\n\n    const needFetchConfigId = new Set<string>();\n\n    for (let i = 0; i < poolIds.length; i++) {\n      const rpc = accounts[i];\n      const partnerInfo = partnerInfos[i];\n      const observationAccount = observations[i];\n      if (rpc === null) throw Error(\"fetch pool info error: \" + String(poolIds[i]));\n      if (partnerInfo === null) throw Error(\"failed to fetch poolPartners for pool: \" + poolIds[i]);\n      if (observationAccount === null) throw Error(\"failed to fetch observation for pool: \" + poolIds[i]);\n\n      poolInfos[String(poolIds[i])] = {\n        ...rpc,\n        partnerInfo,\n        observationAccount,\n        programId: this.program.programId,\n      };\n      needFetchConfigId.add(String(rpc.ammConfig));\n    }\n\n    const configInfo: { [configId: string]: CpmmConfig } = {};\n\n    if (fetchConfigInfo) {\n      const configIds = [...needFetchConfigId];\n      const configs = await this.program.account.ammConfig.fetchMultiple(configIds);\n\n      for (let i = 0; i < configIds.length; i++) {\n        const configItemInfo = configs[i];\n        if (configItemInfo === null) throw Error(\"fetch pool config error: \" + configIds[i]);\n        configInfo[configIds[i]] = configItemInfo;\n      }\n    }\n\n    const returnData: { [poolId: string]: CpmmRpcData } = {};\n\n    for (const [id, info] of Object.entries(poolInfos)) {\n      const baseReserve = info.token0VaultAmount;\n      const quoteReserve = info.token1VaultAmount;\n      returnData[id] = {\n        ...info,\n        baseReserve: info.token0VaultAmount,\n        quoteReserve: info.token1VaultAmount,\n        vaultAAmount: info.token0VaultAmount\n          .add(info.protocolFeesToken0)\n          .add(info.fundFeesToken0)\n          .add(info.partnerProtocolFeesToken0),\n        vaultBAmount: info.token1VaultAmount\n          .add(info.protocolFeesToken1)\n          .add(info.fundFeesToken1)\n          .add(info.partnerProtocolFeesToken1),\n        configInfo: configInfo[info.ammConfig.toString()],\n        poolPrice: new Decimal(quoteReserve.toString())\n          .div(new Decimal(10).pow(info.mint1Decimals))\n          .div(new Decimal(baseReserve.toString()).div(new Decimal(10).pow(info.mint0Decimals))),\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.token0Mint.toBase58(), pool.token1Mint.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: toGammaApiToken({\n            address: mintA,\n            decimals: pool.mint0Decimals,\n            programId: pool.token0Program.toBase58(),\n            extensions: {\n              feeConfig: mintInfos[mintA]?.feeConfig ? toFeeConfig(mintInfos[mintA]?.feeConfig) : undefined,\n            },\n          }),\n          mintB: toGammaApiToken({\n            address: mintB,\n            decimals: pool.mint1Decimals,\n            programId: pool.token1Program.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: PoolInfo;\n    poolKeys: PoolKeys;\n    rpcData: CpmmRpcData;\n  }> {\n    const rpcData = await this.getRpcPoolInfo(poolId, true);\n    const partnerKeys = rpcData\n      .partnerInfo!.infos.map((i) => i.partner.toBase58())\n      .filter((i) => i !== PublicKey.default.toBase58());\n    const partners =\n      partnerKeys.length > 0\n        ? await this.program.account.partner.fetchMultiple(partnerKeys).then((res) =>\n            res\n              .filter((r) => r !== null)\n              .map((r, index) => {\n                return {\n                  acc: r,\n                  address: partnerKeys[index],\n                };\n              }),\n          )\n        : [];\n\n    const mintInfos = await fetchMultipleMintInfos({\n      connection: this.scope.connection,\n      mints: [rpcData.token0Mint, rpcData.token1Mint],\n    });\n\n    const mintA = toGammaApiToken({\n      address: rpcData.token0Mint.toBase58(),\n      decimals: rpcData.mint0Decimals,\n      programId: rpcData.token0Program.toBase58(),\n      extensions: {\n        feeConfig: mintInfos[rpcData.token0Mint.toBase58()].feeConfig\n          ? toFeeConfig(mintInfos[rpcData.token0Mint.toBase58()].feeConfig)\n          : undefined,\n      },\n    });\n    const mintB = toGammaApiToken({\n      address: rpcData.token1Mint.toBase58(),\n      decimals: rpcData.mint1Decimals,\n      programId: rpcData.token1Program.toBase58(),\n      extensions: {\n        feeConfig: mintInfos[rpcData.token1Mint.toBase58()].feeConfig\n          ? toFeeConfig(mintInfos[rpcData.token1Mint.toBase58()].feeConfig)\n          : undefined,\n      },\n    });\n\n    const configInfo = {\n      id: rpcData.ammConfig.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      protocolOwner: rpcData.configInfo!.protocolOwner.toString(),\n      fundOwner: rpcData.configInfo!.fundOwner.toString(),\n    };\n\n    const mockPoolStats: PoolStats = {\n      range: \"24H\",\n      feesUsd: 0,\n      volumeTokenAUsd: 0,\n      volumeTokenBUsd: 0,\n      feesAprUsd: 0,\n      volumeAprUsd: 0,\n      withdrawnKaminoProfitTokenAUsd: 0,\n      withdrawnKaminoProfitTokenBUsd: 0,\n      withdrawnKaminoProfitTokenAAprUsd: 0,\n      withdrawnKaminoProfitTokenBAprUsd: 0,\n    };\n\n    return {\n      poolInfo: {\n        programId: rpcData.programId.toBase58(),\n        id: poolId,\n        config: configInfo,\n        mintA,\n        mintB,\n        price: rpcData.poolPrice.toString(),\n        liquidityTokenA: new Decimal(rpcData.vaultAAmount.toString()).div(10 ** mintA.decimals).toString(),\n        liquidityTokenB: new Decimal(rpcData.vaultBAmount.toString()).div(10 ** mintB.decimals).toString(),\n        lpSupply: rpcData.lpSupply.toString(),\n        poolCreator: rpcData.poolCreator.toBase58(),\n        poolType: \"hyper\",\n        mintAVault: rpcData.token0Vault.toBase58(),\n        mintBVault: rpcData.token1Vault.toBase58(),\n        authority: getPdaPoolAuthority(rpcData.programId).publicKey.toBase58(),\n        openTime: rpcData.openTime.toString(),\n        tvl: \"0\",\n        stats: {\n          daily: mockPoolStats,\n          weekly: mockPoolStats,\n          monthly: mockPoolStats,\n        },\n        partners: partners.map((p) => {\n          return {\n            address: p.address,\n            name: p.acc.name,\n            authority: p.acc.authority.toBase58(),\n            token0TokenAccount: p.acc.token0TokenAccount.toBase58(),\n            token1TokenAccount: p.acc.token1TokenAccount.toBase58(),\n          };\n        }),\n      },\n      poolKeys: {\n        programId: rpcData.programId.toBase58(),\n        id: poolId,\n        mintA: mintA.address,\n        mintB: mintB.address,\n        openTime: rpcData.openTime.toString(),\n        mintAVault: rpcData.token0Vault.toBase58(),\n        mintBVault: rpcData.token1Vault.toBase58(),\n        authority: getPdaPoolAuthority(rpcData.programId).publicKey.toBase58(),\n        config: configInfo,\n        mintAProgram: rpcData.token0Program.toBase58(),\n        mintBProgram: rpcData.token1Program.toBase58(),\n        poolType: \"hyper\",\n      },\n      rpcData,\n    };\n  }\n\n  public async createPool<T extends TxVersion>({\n    programId,\n    poolFeeAccount,\n    startTime,\n    maxTradeFeeRate,\n    volatilityFactor,\n    ownerInfo,\n    associatedOnly = false,\n    checkCreateATAOwner = false,\n    txVersion,\n    feeConfig,\n    computeBudgetConfig,\n    ...params\n  }: CreateCpmmPoolParam<T>): Promise<MakeTxData<T, { address: CreateCpmmPoolAddress }>> {\n    const payer = ownerInfo.feePayer || this.scope.owner?.publicKey;\n    const isFront = new BN(new PublicKey(params.mintA.address).toBuffer()).lte(\n      new BN(new PublicKey(params.mintB.address).toBuffer()),\n    );\n\n    const [mintA, mintB] = isFront ? [params.mintA, params.mintB] : [params.mintB, params.mintA];\n    const [mintAAmount, mintBAmount] = isFront\n      ? [params.mintAAmount, params.mintBAmount]\n      : [params.mintBAmount, params.mintAAmount];\n\n    const mintAUseSOLBalance = ownerInfo.useSOLBalance && mintA.address === NATIVE_MINT.toBase58();\n    const mintBUseSOLBalance = ownerInfo.useSOLBalance && mintB.address === NATIVE_MINT.toBase58();\n    const [mintAPubkey, mintBPubkey] = [new PublicKey(mintA.address), new PublicKey(mintB.address)];\n    const txBuilder = this.createTxBuilder();\n\n    const { account: userVaultA, instructionParams: userVaultAInstruction } =\n      await this.scope.account.getOrCreateTokenAccount({\n        mint: mintAPubkey,\n        tokenProgram: mintA.programId,\n        owner: this.scope.ownerPubKey,\n        createInfo: mintAUseSOLBalance\n          ? {\n              payer: payer!,\n              amount: mintAAmount,\n            }\n          : undefined,\n        notUseTokenAccount: mintAUseSOLBalance,\n        skipCloseAccount: !mintAUseSOLBalance,\n        associatedOnly: mintAUseSOLBalance ? false : associatedOnly,\n        checkCreateATAOwner,\n      });\n    txBuilder.addInstruction(userVaultAInstruction || {});\n    const { account: userVaultB, instructionParams: userVaultBInstruction } =\n      await this.scope.account.getOrCreateTokenAccount({\n        mint: new PublicKey(mintB.address),\n        tokenProgram: mintB.programId,\n        owner: this.scope.ownerPubKey,\n        createInfo: mintBUseSOLBalance\n          ? {\n              payer: payer!,\n              amount: mintBAmount,\n            }\n          : undefined,\n\n        notUseTokenAccount: mintBUseSOLBalance,\n        skipCloseAccount: !mintBUseSOLBalance,\n        associatedOnly: mintBUseSOLBalance ? false : associatedOnly,\n        checkCreateATAOwner,\n      });\n    txBuilder.addInstruction(userVaultBInstruction || {});\n\n    if (userVaultA === undefined || userVaultB === undefined)\n      throw Error(\"One or both of user's token account does not exist\");\n\n    const poolKeys = getCreatePoolKeys({\n      programId,\n      configId: new PublicKey(feeConfig.id),\n      mintA: mintAPubkey,\n      mintB: mintBPubkey,\n    });\n\n    txBuilder.addInstruction({\n      instructions: [\n        await makeCreateCpmmPoolInInstruction(\n          this.program,\n          this.scope.ownerPubKey,\n          new PublicKey(feeConfig.id),\n          mintAPubkey,\n          mintBPubkey,\n          userVaultA,\n          userVaultB,\n          new PublicKey(mintA.programId ?? TOKEN_PROGRAM_ID),\n          new PublicKey(mintB.programId ?? TOKEN_PROGRAM_ID),\n          mintAAmount,\n          mintBAmount,\n          startTime,\n          maxTradeFeeRate,\n          volatilityFactor,\n        ),\n      ],\n      instructionTypes: [InstructionType.CpmmCreatePool],\n    });\n\n    txBuilder.addCustomComputeBudget(computeBudgetConfig);\n\n    return txBuilder.versionBuild({\n      txVersion,\n      extInfo: {\n        address: { ...poolKeys, mintA, mintB, programId, poolFeeAccount, 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      baseSpecified,\n      slippage,\n      computeResult,\n      computeBudgetConfig,\n      config,\n      txVersion,\n      partner,\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      },\n      baseReserve: rpcPoolData!.baseReserve,\n      quoteReserve: rpcPoolData!.quoteReserve,\n      slippage: new Percent(0),\n      baseSpecified,\n      epochInfo: await this.scope.fetchEpochInfo(),\n      amount: new Decimal(inputAmount.toString()).div(\n        10 ** (baseSpecified? poolInfo.mintA.decimals : poolInfo.mintB.decimals),\n      ),\n    });\n\n    const anotherAmount = _anotherAmount.amount;\n    const mintAUseSOLBalance = poolInfo.mintA.address === NATIVE_MINT.toString();\n    const mintBUseSOLBalance = poolInfo.mintB.address === NATIVE_MINT.toString();\n\n    const txBuilder = this.createTxBuilder();\n    const [mintA, mintB] = [new PublicKey(poolInfo.mintA.address), new PublicKey(poolInfo.mintB.address)];\n\n    const poolKeys = propPoolKeys ?? (await this.getCpmmPoolKeys(poolInfo.id));\n    const { account: tokenAccountA, instructionParams: _tokenAccountAInstruction } =\n      await this.scope.account.getOrCreateTokenAccount({\n        tokenProgram: poolKeys.mintAProgram,\n        mint: new PublicKey(poolInfo.mintA.address),\n        owner: this.scope.ownerPubKey,\n\n        createInfo:\n          mintAUseSOLBalance || (baseSpecified ? inputAmount : anotherAmount).isZero()\n            ? {\n                payer: this.scope.ownerPubKey,\n                amount: baseSpecified ? 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: poolKeys.mintBProgram,\n        mint: new PublicKey(poolInfo.mintB.address),\n        owner: this.scope.ownerPubKey,\n\n        createInfo:\n          mintBUseSOLBalance || (baseSpecified ? anotherAmount : inputAmount).isZero()\n            ? {\n                payer: this.scope.ownerPubKey,\n                amount: baseSpecified ? 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 userLiquidityPda = getPdaUserLiquidity(\n      new PublicKey(poolInfo.programId),\n      new PublicKey(poolInfo.id),\n      this.scope.ownerPubKey,\n    );\n    const userLiquidity = await this.getRpcUserLiquidityAccounts([userLiquidityPda.publicKey]).then((a) => a[0]);\n    if (!userLiquidity) {\n      txBuilder.addInstruction({\n        instructions: [\n          await makeInitUserPoolLiquidityInstruction(\n            this.program,\n            this.scope.ownerPubKey,\n            new PublicKey(poolInfo.id),\n            partner ? partner : null,\n          ),\n        ],\n        instructionTypes: [InstructionType.CpmmInitUserLiquidity],\n        lookupTableAddress: [],\n      });\n    }\n\n    const _slippage = new Percent(new BN(1)).sub(slippage);\n\n    txBuilder.addInstruction({\n      instructions: [\n        await makeDepositCpmmInInstruction(\n          this.program,\n          this.scope.ownerPubKey,\n          new PublicKey(poolInfo.id),\n          tokenAccountA!,\n          tokenAccountB!,\n          new PublicKey(poolKeys.mintAVault),\n          new PublicKey(poolKeys.mintBVault),\n          mintA,\n          mintB,\n\n          computeResult ? computeResult?.liquidity : _slippage.mul(liquidity).quotient,\n          baseSpecified ? inputAmountFee.amount : anotherAmount,\n          baseSpecified ? anotherAmount : inputAmountFee.amount,\n        ),\n      ],\n      instructionTypes: [InstructionType.CpmmAddLiquidity],\n      lookupTableAddress: [],\n    });\n    txBuilder.addCustomComputeBudget(computeBudgetConfig);\n    const builder = txBuilder.versionBuild({ txVersion }) as Promise<MakeTxData<T>>;\n\n    return txBuilder.versionBuild({ txVersion }) as Promise<MakeTxData<T>>;\n  }\n\n  public async withdrawLiquidity<T extends TxVersion>(params: WithdrawCpmmLiquidityParams<T>): Promise<MakeTxData<T>> {\n    const { poolInfo, poolKeys: propPoolKeys, lpAmount, slippage, computeBudgetConfig, txVersion } = params;\n    let tokenAReserve: KaminoReserve | undefined = this.reserves.get(poolInfo.mintA.address);\n    let tokenBReserve: KaminoReserve | undefined = this.reserves.get(poolInfo.mintB.address);\n    if (!tokenAReserve || !tokenBReserve) {\n      this.reserves = await getReservesForMarket(this.program.provider.connection);\n      tokenAReserve = this.reserves.get(poolInfo.mintA.address);\n      tokenBReserve = this.reserves.get(poolInfo.mintB.address);\n    }\n\n    // if (this.scope.availability.addStandardPosition === false)\n    //   this.logAndCreateError(\"add liquidity feature disabled in your region\");\n\n    const rpcPoolData = await this.getRpcPoolInfo(poolInfo.id);\n    const kaminoAccounts = getReserveAccountsForWithdraw(\n      new PublicKey(poolInfo.id),\n      tokenAReserve,\n      tokenBReserve,\n      rpcPoolData.maxSharedToken0,\n      rpcPoolData.maxSharedToken1,\n      this.program.programId,\n      this.kamino?.programId,\n    );\n\n    const _slippage = new Percent(new BN(1)).sub(slippage);\n    const [amountMintA, amountMintB] = [\n      _slippage.mul(lpAmount.mul(rpcPoolData.baseReserve).div(rpcPoolData.lpSupply)).quotient,\n      _slippage.mul(lpAmount.mul(rpcPoolData.quoteReserve).div(rpcPoolData.lpSupply)).quotient,\n    ];\n\n    const epochInfo = await this.scope.fetchEpochInfo();\n    const [mintAAmountFee, mintBAmountFee] = [\n      getTransferAmountFeeV2(amountMintA, poolInfo.mintA.extensions?.feeConfig, epochInfo, false),\n      getTransferAmountFeeV2(amountMintB, poolInfo.mintB.extensions?.feeConfig, epochInfo, false),\n    ];\n\n    const { account } = this.scope;\n    const txBuilder = this.createTxBuilder();\n    const [mintA, mintB] = [new PublicKey(poolInfo.mintA.address), new PublicKey(poolInfo.mintB.address)];\n\n    const mintAUseSOLBalance = mintA.equals(WSOLMint);\n    const mintBUseSOLBalance = mintB.equals(WSOLMint);\n\n    const poolKeys = propPoolKeys ?? (await this.getCpmmPoolKeys(poolInfo.id));\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: poolKeys.mintAProgram,\n        mint: new PublicKey(poolInfo.mintA.address),\n        notUseTokenAccount: mintAUseSOLBalance,\n        owner: this.scope.ownerPubKey,\n        createInfo: {\n          payer: this.scope.ownerPubKey,\n          amount: 0,\n        },\n        skipCloseAccount: !mintAUseSOLBalance,\n        associatedOnly: mintAUseSOLBalance ? false : true,\n        checkCreateATAOwner: false,\n      });\n    tokenAccountA = _ownerTokenAccountA;\n    accountAInstructions && txBuilder.addInstruction(accountAInstructions);\n\n    const { account: _ownerTokenAccountB, instructionParams: accountBInstructions } =\n      await this.scope.account.getOrCreateTokenAccount({\n        tokenProgram: poolKeys.mintBProgram,\n        mint: new PublicKey(poolInfo.mintB.address),\n        notUseTokenAccount: mintBUseSOLBalance,\n        owner: this.scope.ownerPubKey,\n        createInfo: {\n          payer: this.scope.ownerPubKey,\n          amount: 0,\n        },\n        skipCloseAccount: !mintBUseSOLBalance,\n        associatedOnly: mintBUseSOLBalance ? false : true,\n        checkCreateATAOwner: false,\n      });\n    tokenAccountB = _ownerTokenAccountB;\n    accountBInstructions && txBuilder.addInstruction(accountBInstructions);\n\n    if (!tokenAccountA || !tokenAccountB)\n      this.logAndCreateError(\"cannot found target token accounts\", \"tokenAccounts\", account.tokenAccounts);\n\n    const userLiquidityPda = getPdaUserLiquidity(\n      new PublicKey(poolInfo.programId),\n      new PublicKey(poolInfo.id),\n      this.scope.ownerPubKey,\n    );\n    const userLiquidity = await this.getRpcUserLiquidityAccounts([userLiquidityPda.publicKey]).then((a) => a[0]);\n\n    if (!userLiquidity) this.logAndCreateError(\"cannot found userLiquidityAccount\");\n    txBuilder.addInstruction({\n      instructions: [\n        await makeWithdrawCpmmInInstruction(\n          this.program,\n          this.scope.ownerPubKey,\n          new PublicKey(poolInfo.id),\n          tokenAccountA!,\n          tokenAccountB!,\n          new PublicKey(poolKeys.mintAVault),\n          new PublicKey(poolKeys.mintBVault),\n          mintA,\n          mintB,\n\n          lpAmount,\n          amountMintA.sub(mintAAmountFee.fee ?? new BN(0)),\n          amountMintB.sub(mintBAmountFee.fee ?? new BN(0)),\n          kaminoAccounts,\n        ),\n      ],\n      instructionTypes: [InstructionType.CpmmWithdrawLiquidity],\n      lookupTableAddress: [],\n    });\n    txBuilder.addCustomComputeBudget(computeBudgetConfig);\n    return txBuilder.versionBuild({ txVersion }) as Promise<MakeTxData<T>>;\n  }\n\n  public async swap<T extends TxVersion>(params: CpmmSwapParams<T>): Promise<MakeTxData<T>> {\n    const {\n      poolInfo,\n      poolKeys: propPoolKeys,\n      zeroForOne,\n      baseIn,\n      swapResult,\n      slippage = 0,\n      config,\n      computeBudgetConfig,\n      txVersion,\n      wrapSol,\n    } = params;\n\n    const { bypassAssociatedCheck, checkCreateATAOwner, associatedOnly } = {\n      // default\n      ...{ bypassAssociatedCheck: false, checkCreateATAOwner: false, associatedOnly: true },\n      // custom\n      ...config,\n    };\n\n    const txBuilder = this.createTxBuilder();\n\n    const [mintA, mintB] = [new PublicKey(poolInfo.mintA.address), new PublicKey(poolInfo.mintB.address)];\n\n    if (baseIn) {\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 poolKeys = propPoolKeys ?? (await this.getCpmmPoolKeys(poolInfo.id));\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(poolKeys.mintAProgram),\n        owner: this.scope.ownerPubKey,\n        createInfo:\n          mintAUseSOLBalance || !zeroForOne\n            ? {\n                payer: this.scope.ownerPubKey,\n                amount: zeroForOne ? 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(poolKeys.mintBProgram),\n        owner: this.scope.ownerPubKey,\n        createInfo:\n          mintBUseSOLBalance || zeroForOne\n            ? {\n                payer: this.scope.ownerPubKey,\n                amount: zeroForOne ? 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 inputMint = zeroForOne ? poolInfo.mintA.address : poolInfo.mintB.address;\n    if (wrapSol && inputMint === SOL_INFO.address) {\n      txBuilder.addInstruction({\n        instructions: [\n          SystemProgram.transfer({\n            fromPubkey: this.scope.ownerPubKey,\n            toPubkey: zeroForOne ? mintATokenAcc! : mintBTokenAcc!,\n            lamports: BigInt(swapResult.sourceAmountSwapped.toString()),\n          }),\n          createSyncNativeInstruction(new PublicKey(zeroForOne ? mintATokenAcc! : mintBTokenAcc!)),\n        ],\n      });\n    }\n\n    txBuilder.addInstruction({\n      instructions: [\n        baseIn\n          ? await makeSwapCpmmBaseInInstruction(\n              this.program,\n              this.scope.ownerPubKey,\n              new PublicKey(poolKeys.config.id),\n              new PublicKey(poolInfo.id),\n              zeroForOne ? mintATokenAcc! : mintBTokenAcc!,\n              zeroForOne ? mintBTokenAcc! : mintATokenAcc!,\n              new PublicKey(zeroForOne ? poolKeys.mintAVault : poolKeys.mintBVault),\n              new PublicKey(zeroForOne ? poolKeys.mintBVault : poolKeys.mintAVault),\n              new PublicKey(zeroForOne ? poolKeys.mintAProgram : poolKeys.mintBProgram),\n              new PublicKey(zeroForOne ? poolKeys.mintBProgram : poolKeys.mintAProgram),\n              zeroForOne ? mintA : mintB,\n              zeroForOne ? mintB : mintA,\n              getPdaObservationId(new PublicKey(poolInfo.programId), new PublicKey(poolInfo.id)).publicKey,\n\n              swapResult.sourceAmountSwapped,\n              swapResult.destinationAmountSwapped,\n              params.dflowSegmenterOptions,\n              params.referralAccounts,\n            )\n          : await makeSwapCpmmBaseOutInstruction(\n              this.program,\n              this.scope.ownerPubKey,\n              new PublicKey(poolKeys.config.id),\n              new PublicKey(poolInfo.id),\n\n              zeroForOne ? mintATokenAcc! : mintBTokenAcc!,\n              zeroForOne ? mintBTokenAcc! : mintATokenAcc!,\n\n              new PublicKey(zeroForOne ? poolKeys.mintAVault : poolKeys.mintBVault),\n              new PublicKey(zeroForOne ? poolKeys.mintBVault : poolKeys.mintAVault),\n              new PublicKey(zeroForOne ? poolKeys.mintAProgram : poolKeys.mintBProgram),\n              new PublicKey(zeroForOne ? poolKeys.mintBProgram : poolKeys.mintAProgram),\n              zeroForOne ? mintA : mintB,\n              zeroForOne ? mintB : mintA,\n\n              getPdaObservationId(new PublicKey(poolInfo.programId), new PublicKey(poolInfo.id)).publicKey,\n\n              swapResult.sourceAmountSwapped,\n              swapResult.destinationAmountSwapped,\n              params.dflowSegmenterOptions,\n              params.referralAccounts,\n            ),\n      ],\n      instructionTypes: [baseIn ? InstructionType.CpmmSwapBaseIn : InstructionType.CpmmSwapBaseOut],\n    });\n\n    txBuilder.addCustomComputeBudget(computeBudgetConfig);\n\n    return txBuilder.versionBuild({ txVersion }) as Promise<MakeTxData<T>>;\n  }\n\n  public async swapWithOracle<T extends TxVersion>(params: CpmmSwapParams<T>): Promise<MakeTxData<T>> {\n    const {\n      poolInfo,\n      poolKeys: propPoolKeys,\n      zeroForOne,\n      swapResult,\n      slippage = 0,\n      config,\n      computeBudgetConfig,\n      txVersion,\n      wrapSol,\n    } = params;\n\n    const { bypassAssociatedCheck, checkCreateATAOwner, associatedOnly } = {\n      // default\n      ...{ bypassAssociatedCheck: false, checkCreateATAOwner: false, associatedOnly: true },\n      // custom\n      ...config,\n    };\n\n    const txBuilder = this.createTxBuilder();\n\n    const [mintA, mintB] = [new PublicKey(poolInfo.mintA.address), new PublicKey(poolInfo.mintB.address)];\n\n    swapResult.destinationAmountSwapped = swapResult.destinationAmountSwapped\n      .mul(new BN((1 - slippage) * 10000))\n      .div(new BN(10000));\n\n    const poolKeys = propPoolKeys ?? (await this.getCpmmPoolKeys(poolInfo.id));\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(poolKeys.mintAProgram),\n        owner: this.scope.ownerPubKey,\n        createInfo:\n          mintAUseSOLBalance || !zeroForOne\n            ? {\n                payer: this.scope.ownerPubKey,\n                amount: zeroForOne ? 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(poolKeys.mintBProgram),\n        owner: this.scope.ownerPubKey,\n        createInfo:\n          mintBUseSOLBalance || zeroForOne\n            ? {\n                payer: this.scope.ownerPubKey,\n                amount: zeroForOne ? 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 inputMint = zeroForOne ? poolInfo.mintA.address : poolInfo.mintB.address;\n    if (wrapSol && inputMint === SOL_INFO.address) {\n      txBuilder.addInstruction({\n        instructions: [\n          SystemProgram.transfer({\n            fromPubkey: this.scope.ownerPubKey,\n            toPubkey: zeroForOne ? mintATokenAcc! : mintBTokenAcc!,\n            lamports: BigInt(swapResult.sourceAmountSwapped.toString()),\n          }),\n          createSyncNativeInstruction(new PublicKey(zeroForOne ? mintATokenAcc! : mintBTokenAcc!)),\n        ],\n      });\n    }\n\n    txBuilder.addInstruction({\n      instructions: [\n        await makeSwapCpmmOracleBaseInInstruction(\n          this.program,\n          this.scope.ownerPubKey,\n          new PublicKey(poolKeys.config.id),\n          new PublicKey(poolInfo.id),\n          zeroForOne ? mintATokenAcc! : mintBTokenAcc!,\n          zeroForOne ? mintBTokenAcc! : mintATokenAcc!,\n          new PublicKey(zeroForOne ? poolKeys.mintAVault : poolKeys.mintBVault),\n          new PublicKey(zeroForOne ? poolKeys.mintBVault : poolKeys.mintAVault),\n          new PublicKey(zeroForOne ? poolKeys.mintAProgram : poolKeys.mintBProgram),\n          new PublicKey(zeroForOne ? poolKeys.mintBProgram : poolKeys.mintAProgram),\n          zeroForOne ? mintA : mintB,\n          zeroForOne ? mintB : mintA,\n          getPdaObservationId(new PublicKey(poolInfo.programId), new PublicKey(poolInfo.id)).publicKey,\n\n          swapResult.sourceAmountSwapped,\n          swapResult.destinationAmountSwapped,\n          params.dflowSegmenterOptions,\n          params.referralAccounts,\n        ),\n      ],\n      instructionTypes: [InstructionType.CpmmSwapBaseIn],\n    });\n\n    txBuilder.addCustomComputeBudget(computeBudgetConfig);\n\n    return txBuilder.versionBuild({ txVersion }) as Promise<MakeTxData<T>>;\n  }\n\n  public computeSwapAmount({\n    pool,\n    amount,\n    baseIn,\n    zeroForOne,\n    slippage,\n    observationState,\n  }: {\n    pool: CpmmComputeData;\n    amount: BN;\n    baseIn: boolean;\n    zeroForOne: boolean;\n    slippage: number;\n    observationState: CpmmObservationState;\n  }): {\n    allTrade: boolean;\n    amountIn: BN;\n    amountOut: BN;\n    minAmountOut: BN;\n    maxAmountIn: BN;\n    fee: BN;\n    executionPrice: Decimal;\n    priceImpact: Decimal;\n  } {\n    const [inputToken, outputToken, inputTokenReserves, outputTokenReserves] = zeroForOne\n      ? [pool.mintA, pool.mintB, pool.baseReserve, pool.quoteReserve]\n      : [pool.mintB, pool.mintA, pool.quoteReserve, pool.baseReserve];\n\n    const inputDecimals = inputToken.decimals;\n    const outputDecimals = outputToken.decimals;\n\n    const swapResult = baseIn\n      ? CurveCalculator.swapBaseIn(\n          amount,\n          new BN(inputTokenReserves),\n          new BN(outputTokenReserves),\n          new BN(pool.configInfo.tradeFeeRate),\n          observationState,\n          pool.volatilityFactor,\n        )\n      : CurveCalculator.swapBaseOut(\n          amount,\n          new BN(inputTokenReserves),\n          new BN(outputTokenReserves),\n          new BN(pool.configInfo.tradeFeeRate),\n          observationState,\n          pool.volatilityFactor,\n        );\n\n    const currentPrice = zeroForOne ? pool.poolPrice : new Decimal(1).div(pool.poolPrice);\n    const numerator = new Decimal(swapResult.destinationAmountSwapped.toString()).div(\n      new Decimal(10).pow(inputDecimals),\n    );\n    const denominator = new Decimal(swapResult.sourceAmountSwapped.toString()).div(new Decimal(10).pow(outputDecimals));\n    const executionPrice = numerator.div(denominator);\n\n    const otherAmountThreshold = baseIn\n      ? swapResult.destinationAmountSwapped.mul(new BN((1 - slippage) * 10000)).div(new BN(10000))\n      : swapResult.sourceAmountSwapped.mul(new BN((1 + slippage) * 10000)).div(new BN(10000));\n\n    return {\n      allTrade: baseIn ? swapResult.sourceAmountSwapped.eq(amount) : swapResult.destinationAmountSwapped.eq(amount),\n      amountIn: swapResult.sourceAmountSwapped,\n      amountOut: swapResult.destinationAmountSwapped,\n      maxAmountIn: baseIn ? swapResult.sourceAmountSwapped : otherAmountThreshold,\n      minAmountOut: baseIn ? otherAmountThreshold : swapResult.destinationAmountSwapped,\n      executionPrice,\n      fee: swapResult.tradeFee,\n      priceImpact: currentPrice.sub(executionPrice).div(currentPrice),\n    };\n  }\n\n  public computePairAmount({\n    poolInfo,\n    baseReserve,\n    quoteReserve,\n    amount,\n    slippage,\n    epochInfo,\n    baseSpecified\n  }: ComputePairAmountParams): {\n    inputAmountFee: GetTransferAmountFee;\n    anotherAmount: GetTransferAmountFee;\n    maxAnotherAmount: GetTransferAmountFee;\n    liquidity: BN;\n  } {\n    const coefficient = 1 - Number(slippage.toSignificant()) / 100;\n    const inputAmount = new BN(\n      new Decimal(amount)\n        .mul(10 ** poolInfo[baseSpecified ? \"mintA\" : \"mintB\"].decimals)\n        .mul(coefficient)\n        .toFixed(0),\n    );\n    const inputAmountFee = getTransferAmountFeeV2(\n      inputAmount,\n      (baseSpecified ? poolInfo.mintA : poolInfo.mintB).extensions?.feeConfig,\n      epochInfo,\n      false,\n    );\n    const _inputAmountWithoutFee = inputAmount.sub(inputAmountFee.fee ?? new BN(0));\n\n    const lpAmount = new BN(poolInfo.lpSupply ?? \"0\");\n    this.logDebug(\"baseReserve:\", baseReserve.toString(), \"quoteReserve:\", quoteReserve.toString());\n\n    this.logDebug(\n      \"tokenIn:\",\n      baseSpecified ? poolInfo.mintA.symbol : poolInfo.mintB.symbol,\n      \"amountIn:\",\n      inputAmount.toString(),\n      \"amountInFee:\",\n      inputAmountFee.fee?.toString() ?? 0,\n      \"anotherToken:\",\n      baseSpecified ? poolInfo.mintB.symbol : poolInfo.mintA.symbol,\n      \"slippage:\",\n      `${slippage.toSignificant()}%`,\n    );\n\n    // input is fixed\n    const input = baseSpecified ? \"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[baseSpecified ? \"amountB\" : \"amountA\"],\n        (baseSpecified ? poolInfo.mintB : poolInfo.mintA).extensions?.feeConfig,\n        epochInfo,\n        true,\n      );\n    }\n\n    const _slippage = new Percent(new BN(1)).add(slippage);\n    const slippageAdjustedAmount = getTransferAmountFeeV2(\n      _slippage.mul(anotherAmountFee.amount.sub(anotherAmountFee.fee ?? new BN(0))).quotient,\n      (baseSpecified ? poolInfo.mintB : poolInfo.mintA).extensions?.feeConfig,\n      epochInfo,\n      true,\n    );\n\n    this.logDebug(\n      \"anotherAmount:\",\n      anotherAmountFee.amount.toString(),\n      \"anotherAmountFee:\",\n      anotherAmountFee.fee?.toString() ?? 0,\n      \"maxAnotherAmount:\",\n      slippageAdjustedAmount.amount.toString(),\n      \"maxAnotherAmountFee:\",\n      slippageAdjustedAmount.fee?.toString() ?? 0,\n    );\n\n    return {\n      inputAmountFee,\n      anotherAmount: anotherAmountFee,\n      maxAnotherAmount: slippageAdjustedAmount,\n      liquidity,\n    };\n  }\n\n  public async initializePartner<T extends TxVersion>({\n    pool,\n    poolKeys,\n    partnerKey,\n    name,\n    token0TokenAccount,\n    token1TokenAccount,\n    computeBudgetConfig,\n    txVersion,\n  }: {\n    pool: string;\n    poolKeys: PoolKeys | undefined;\n    partnerKey: PublicKey;\n    name: string;\n    token0TokenAccount?: PublicKey;\n    token1TokenAccount?: PublicKey;\n    computeBudgetConfig?: ComputeBudgetConfig;\n    txVersion?: T;\n  }): Promise<MakeTxData<T>> {\n    const txBuilder = this.createTxBuilder();\n    const keys = poolKeys ?? (await this.getCpmmPoolKeys(pool));\n    const tokenAccount0 =\n      token0TokenAccount ??\n      this.scope.account.getAssociatedTokenAccount(new PublicKey(keys.mintA), new PublicKey(keys.mintAProgram));\n    const tokenAccount1 =\n      token1TokenAccount ??\n      this.scope.account.getAssociatedTokenAccount(new PublicKey(keys.mintB), new PublicKey(keys.mintBProgram));\n    txBuilder.addInstruction({\n      instructions: [\n        await makeInitializePartnerInstruction(\n          this.program,\n          this.scope.ownerPubKey,\n          this.scope.ownerPubKey,\n          new PublicKey(pool),\n          partnerKey,\n          name,\n          tokenAccount0,\n          tokenAccount1,\n        ),\n      ],\n    });\n\n    txBuilder.addCustomComputeBudget(computeBudgetConfig);\n\n    return txBuilder.versionBuild({ txVersion }) as Promise<MakeTxData<T>>;\n  }\n\n  public async addPartner<T extends TxVersion>({\n    pool,\n    poolKeys,\n    partnerKey,\n    computeBudgetConfig,\n    txVersion,\n  }: {\n    pool: string;\n    poolKeys: PoolKeys | undefined;\n    partnerKey: PublicKey;\n    computeBudgetConfig?: ComputeBudgetConfig;\n    txVersion?: T;\n  }): Promise<MakeTxData<T>> {\n    const txBuilder = this.createTxBuilder();\n    const keys = poolKeys ?? (await this.getCpmmPoolKeys(pool));\n    txBuilder.addInstruction({\n      instructions: [\n        await makeAddPartnerInstruction(\n          this.program,\n          new PublicKey(keys.config.id),\n          new PublicKey(pool),\n          partnerKey,\n          this.scope.ownerPubKey,\n        ),\n      ],\n    });\n\n    txBuilder.addCustomComputeBudget(computeBudgetConfig);\n\n    return txBuilder.versionBuild({ txVersion }) as Promise<MakeTxData<T>>;\n  }\n\n  public async getRpcUserLiquidityAccounts(addresses: PublicKey[]): Promise<(UserLiquidityAccount | null)[]> {\n    return await this.program.account.userPoolLiquidity.fetchMultiple(addresses);\n  }\n\n  public async getObservationStates(addresses: PublicKey[]): Promise<(CpmmObservationState | null)[]> {\n    return await this.program.account.observationState.fetchMultiple(addresses);\n  }\n}\n\nfunction lpToAmount(lp: BN, poolAmountA: BN, poolAmountB: BN, supply: BN): { amountA: BN; amountB: BN } {\n  let amountA = lp.mul(poolAmountA).div(supply);\n  if (!amountA.isZero() && !lp.mul(poolAmountA).mod(supply).isZero()) amountA = amountA.add(new BN(1));\n  let amountB = lp.mul(poolAmountB).div(supply);\n  if (!amountB.isZero() && !lp.mul(poolAmountB).mod(supply).isZero()) amountB = amountB.add(new BN(1));\n\n  return {\n    amountA,\n    amountB,\n  };\n}\n","import BN from \"bn.js\";\nimport { DynamicFee } from \"./fee\";\nimport { ConstantProductCurve } from \"./constantProduct\";\nimport { CpmmObservationState } from \"../type\";\n\nexport enum RoundDirection {\n  Floor,\n  Ceiling,\n}\n\nexport type SwapWithoutFeesResult = { sourceAmountSwapped: BN; destinationAmountSwapped: BN };\n\nexport type TradingTokenResult = { tokenAmount0: BN; tokenAmount1: BN };\n\nexport type SwapResult = {\n  newSwapSourceAmount: BN;\n  newSwapDestinationAmount: BN;\n  sourceAmountSwapped: BN;\n  destinationAmountSwapped: BN;\n  tradeFee: BN;\n};\n\nexport class CurveCalculator {\n  static validate_supply(tokenAmount0: BN, tokenAmount1: BN): void {\n    if (tokenAmount0.isZero()) throw Error(\"tokenAmount0 is zero\");\n    if (tokenAmount1.isZero()) throw Error(\"tokenAmount1 is zero\");\n  }\n\n  static swapBaseIn(\n    sourceAmount: BN,\n    swapSourceAmount: BN,\n    swapDestinationAmount: BN,\n    tradeFeeRate: BN,\n    observationState: CpmmObservationState,\n    poolVolatilityFactor: BN,\n    isInvokedWithSignedSegmenter = false,\n  ): SwapResult {\n    const tradeFee = DynamicFee.calculateDynamicFee(\n      sourceAmount,\n      new BN(new Date().getTime() / 1000),\n      observationState,\n      \"volatility\",\n      tradeFeeRate,\n      poolVolatilityFactor,\n      isInvokedWithSignedSegmenter,\n    );\n\n    const sourceAmountLessFees = sourceAmount.sub(tradeFee);\n\n    const { sourceAmountSwapped, destinationAmountSwapped } = ConstantProductCurve.swapWithoutFees(\n      sourceAmountLessFees,\n      swapSourceAmount,\n      swapDestinationAmount,\n    );\n\n    const _sourceAmountSwapped = sourceAmountSwapped.add(tradeFee);\n    return {\n      newSwapSourceAmount: swapSourceAmount.add(_sourceAmountSwapped),\n      newSwapDestinationAmount: swapDestinationAmount.sub(destinationAmountSwapped),\n      sourceAmountSwapped: _sourceAmountSwapped,\n      destinationAmountSwapped,\n      tradeFee,\n    };\n  }\n\n  static swapBaseOut(\n    destinationAmount: BN,\n    swapSourceAmount: BN,\n    swapDestinationAmount: BN,\n    tradeFeeRate: BN,\n    observationState: CpmmObservationState,\n    poolVolatilityFactor: BN,\n    isInvokedWithSignedSegmenter = false,\n  ): SwapResult {\n    // Validate inputs\n    if (destinationAmount.isZero()) throw new Error(\"destinationAmount is zero\");\n    if (destinationAmount.gt(swapDestinationAmount)) {\n      throw new Error(\"destinationAmount exceeds available destination reserve\");\n    }\n\n    // Calculate source amount without fees\n    const { sourceAmountSwapped: sourceAmountLessFees, destinationAmountSwapped } =\n      ConstantProductCurve.swapWithoutFeesBaseOut(destinationAmount, swapSourceAmount, swapDestinationAmount);\n\n    const sourceAmount = DynamicFee.calculatePreDynamicFee(\n      sourceAmountLessFees,\n      new BN(new Date().getTime() / 1000),\n      observationState,\n      \"volatility\",\n      tradeFeeRate,\n      poolVolatilityFactor,\n      isInvokedWithSignedSegmenter,\n    );\n\n    return {\n      newSwapSourceAmount: swapSourceAmount.add(sourceAmount),\n      newSwapDestinationAmount: swapDestinationAmount.sub(destinationAmountSwapped),\n      sourceAmountSwapped: sourceAmount,\n      destinationAmountSwapped,\n      tradeFee: sourceAmount.sub(sourceAmountLessFees),\n    };\n  }\n}\n","import BN from \"bn.js\";\nimport { CpmmObservationState, CpmmObservation } from \"../type\";\nimport Decimal from \"decimal.js-light\";\nimport { checkedCeilDiv, saturatingSub } from \"./common\";\n\nexport const ONE_BASIS_POINT = new BN(100);\nexport const FEE_RATE_DENOMINATOR_VALUE = new BN(1_000_000);\nconst OBSERVATION_LEN = 100;\n// Volatility-based fee constants\n// const MAX_FEE_VOLATILITY = new BN(10000); // 1% max fee\nconst VOLATILITY_WINDOW = new BN(3600); // 1 hour window for volatility calculation\n\nconst MAX_FEE = new BN(100000); // 10% max fee\nconst DEFAULT_VOLATILITY_FACTOR = new BN(300000); // Adjust based on desired sensitivity\n\ntype PriceRange = {\n  minPrice: BN;\n  maxPrice: BN;\n  twapPrice: BN;\n};\n\ntype FeeType = \"volatility\";\n\nexport class DynamicFee {\n  static calculateDynamicFee(\n    amount: BN,\n    blockTimestamp: BN,\n    observationState: CpmmObservationState,\n    feeType: FeeType,\n    baseFees: BN,\n    poolVolatilityFactor: BN,\n    isInvokedWithSignedSegmenter: boolean,\n  ): BN {\n    const feeRate = this.calculateDynamicFeeRate(\n      blockTimestamp,\n      observationState,\n      feeType,\n      baseFees,\n      poolVolatilityFactor,\n      isInvokedWithSignedSegmenter,\n    );\n\n    const [dynamicFee, _feeRateDenominator] = checkedCeilDiv(amount.mul(feeRate), FEE_RATE_DENOMINATOR_VALUE);\n    return dynamicFee;\n  }\n\n  static calculatePreDynamicFee(\n    amount: BN,\n    blockTimestamp: BN,\n    observationState: CpmmObservationState,\n    feeType: FeeType,\n    baseFees: BN,\n    poolVolatilityFactor: BN,\n    isInvokedWithSignedSegmenter: boolean,\n  ): BN {\n    const feeRate = this.calculateDynamicFeeRate(\n      blockTimestamp,\n      observationState,\n      feeType,\n      baseFees,\n      poolVolatilityFactor,\n      isInvokedWithSignedSegmenter,\n    );\n\n    if (feeRate.isZero()) {\n      return amount; // No fee, pre-fee amount = post-fee amount\n    }\n\n    const denominator = FEE_RATE_DENOMINATOR_VALUE.sub(feeRate);\n    if (denominator.isZero()) {\n      throw new Error(\"Fee rate equals denominator, causing division by zero\");\n    }\n\n    // x = (y * D + (D - r) - 1) / (D - r)\n    const numerator = amount.mul(FEE_RATE_DENOMINATOR_VALUE);\n    const result = numerator.add(denominator).sub(new BN(1)).div(denominator);\n\n    return result;\n  }\n\n  static calculateDynamicFeeRate(\n    blockTimestamp: BN,\n    observationState: CpmmObservationState,\n    feeType: FeeType,\n    baseFees: BN,\n    poolVolatilityFactor: BN,\n    isInvokedWithSignedSegmenter: boolean,\n  ): BN {\n    switch (feeType) {\n      case \"volatility\": {\n        return this.calculateVolatileFee(\n          blockTimestamp,\n          observationState,\n          baseFees,\n          poolVolatilityFactor,\n          isInvokedWithSignedSegmenter,\n        );\n      }\n    }\n  }\n\n  static calculateVolatileFee(\n    blockTimestamp: BN,\n    observationState: CpmmObservationState,\n    baseFees: BN,\n    poolSpecifiedVolatilityFactor: BN,\n    isInvokedWithSignedSegmenter: boolean,\n  ): BN {\n    const { minPrice, maxPrice, twapPrice } = this.getPriceRange(observationState, blockTimestamp, VOLATILITY_WINDOW);\n    if (minPrice.eqn(0) || maxPrice.eqn(0) || twapPrice.eqn(0) || twapPrice.eqn(1)) {\n      return baseFees;\n    }\n\n    const logMaxPrice = new Decimal(maxPrice.toString()).ln();\n    const logMinPrice = new Decimal(minPrice.toString()).ln();\n    const logTwapPrice = new Decimal(twapPrice.toString()).ln();\n\n    const numerator = logMaxPrice.sub(logMinPrice);\n    const denominator = logTwapPrice.abs();\n\n    if (denominator.eq(0)) {\n      return baseFees;\n    }\n\n    const volatility = numerator.div(denominator);\n    const volatilityFactor = poolSpecifiedVolatilityFactor.eqn(0)\n      ? DEFAULT_VOLATILITY_FACTOR\n      : poolSpecifiedVolatilityFactor;\n    const volatilityComponent = new Decimal(volatilityFactor.toString()).mul(volatility);\n\n    const dynamicFee = new Decimal(baseFees.toString()).add(volatilityComponent);\n    const finalFee = new BN(\n      dynamicFee.lessThan(new Decimal(MAX_FEE.toString())) ? dynamicFee.toString() : MAX_FEE.toString(),\n    );\n    if (isInvokedWithSignedSegmenter) {\n      const discountedFee = saturatingSub(finalFee, ONE_BASIS_POINT);\n      return baseFees.gt(discountedFee) ? baseFees : discountedFee;\n    } else {\n      return finalFee;\n    }\n  }\n\n  static getPriceRange(observationState: CpmmObservationState, currentTime: BN, window: BN): PriceRange {\n    let minPrice = new BN(1).ushln(128).subn(1);\n    let maxPrice = new BN(0);\n\n    let descendingObservations = observationState.observations\n      .map((observation, idx) => ({ observation, idx }))\n      .filter(({ observation }) => {\n        observation.blockTimestamp.eqn(0) &&\n          !observation.cumulativeToken0PriceX32.eqn(0) &&\n          !observation.cumulativeToken1PriceX32.eqn(0) &&\n          currentTime.sub(observation.blockTimestamp) <= window;\n      })\n      .map(({ observation, idx }) => {\n        return {\n          index: idx,\n          observation,\n        };\n      });\n\n    if (descendingObservations.length < 2) {\n      return {\n        minPrice: new BN(0),\n        maxPrice: new BN(0),\n        twapPrice: new BN(0),\n      };\n    }\n\n    descendingObservations.sort((a, b) => b.observation.blockTimestamp.cmp(a.observation.blockTimestamp));\n\n    const newestObs = descendingObservations[0];\n    const oldestObs = descendingObservations[descendingObservations.length - 1];\n\n    const totalTimeDelta = saturatingSub(newestObs.observation.blockTimestamp, oldestObs.observation.blockTimestamp);\n    if (totalTimeDelta.eqn(0)) {\n      return {\n        minPrice: new BN(0),\n        maxPrice: new BN(0),\n        twapPrice: new BN(0),\n      };\n    }\n\n    const twapPrice = newestObs.observation.cumulativeToken0PriceX32\n      .sub(oldestObs.observation.cumulativeToken0PriceX32)\n      .div(totalTimeDelta);\n\n    for (const indexedObservation of descendingObservations) {\n      let lastObservation: CpmmObservation;\n      if (indexedObservation.index == 0) {\n        lastObservation = observationState.observations[OBSERVATION_LEN - 1];\n      } else {\n        lastObservation = observationState.observations[indexedObservation.index - 1];\n      }\n\n      if (lastObservation.blockTimestamp.eqn(0)) {\n        continue;\n      }\n\n      if (lastObservation.blockTimestamp > indexedObservation.observation.blockTimestamp) {\n        break;\n      }\n\n      const nextObservation = indexedObservation.observation;\n      const timeDelta = saturatingSub(nextObservation.blockTimestamp, lastObservation.blockTimestamp);\n\n      if (timeDelta.eqn(0)) {\n        continue;\n      }\n\n      const price = nextObservation.cumulativeToken0PriceX32\n        .sub(lastObservation.cumulativeToken0PriceX32)\n        .div(timeDelta);\n\n      minPrice = BN.min(minPrice, price);\n      maxPrice = BN.max(maxPrice, price);\n    }\n\n    return {\n      minPrice,\n      maxPrice,\n      twapPrice,\n    };\n  }\n\n  static calculatePreFeeAmount(\n    blockTimestamp: BN,\n    postFeeAmount: BN,\n    observationState: CpmmObservationState,\n    feeType: FeeType,\n    baseFees: BN,\n    poolVolatilityFactor: BN,\n    isInvokedWithSignedSegmenter: boolean,\n  ): BN {\n    const dynamicFeeRate = this.calculateDynamicFeeRate(\n      blockTimestamp,\n      observationState,\n      feeType,\n      baseFees,\n      poolVolatilityFactor,\n      isInvokedWithSignedSegmenter,\n    );\n    if (dynamicFeeRate.eqn(0)) {\n      return postFeeAmount;\n    } else {\n      const numerator = postFeeAmount.mul(FEE_RATE_DENOMINATOR_VALUE);\n      const denominator = FEE_RATE_DENOMINATOR_VALUE.sub(dynamicFeeRate);\n\n      return numerator.add(denominator).subn(1).div(denominator);\n    }\n  }\n}\n","import BN from \"bn.js\";\n\nexport const ZERO = new BN(0);\n\nexport function 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\nexport function checkedCeilDiv(dividend: BN, rhs: BN): BN[] {\n  if (rhs.isZero()) throw Error(\"rhs is zero\");\n  const quotient = dividend.div(rhs);\n  if (quotient.isZero()) return [quotient, rhs];\n  const remainder = dividend.sub(quotient.mul(rhs));\n  if (remainder.isZero()) return [quotient, rhs];\n  return [quotient.add(new BN(1)), rhs];\n}\n\nexport function saturatingSub(a: BN, b: BN): BN {\n  return a.gt(b) ? a.sub(b) : new BN(0);\n}\n","import BN from \"bn.js\";\nimport { RoundDirection, SwapWithoutFeesResult, TradingTokenResult } from \"./calculator\";\nimport { checkedCeilDiv, checkedRem, ZERO } from \"./common\";\n\nexport class ConstantProductCurve {\n  static swapWithoutFees(sourceAmount: BN, swapSourceAmount: BN, swapDestinationAmount: BN): SwapWithoutFeesResult {\n    const invariant = swapSourceAmount.mul(swapDestinationAmount);\n\n    const newSwapSourceAmount = swapSourceAmount.add(sourceAmount);\n    const [newSwapDestinationAmount, _newSwapSourceAmount] = checkedCeilDiv(invariant, newSwapSourceAmount);\n\n    const sourceAmountSwapped = _newSwapSourceAmount.sub(swapSourceAmount);\n    const destinationAmountSwapped = swapDestinationAmount.sub(newSwapDestinationAmount);\n    if (destinationAmountSwapped.isZero()) throw Error(\"destinationAmountSwapped is zero\");\n\n    return {\n      sourceAmountSwapped,\n      destinationAmountSwapped,\n    };\n  }\n\n  static swapWithoutFeesBaseOut(\n    destinationAmount: BN,\n    swapSourceAmount: BN,\n    swapDestinationAmount: BN,\n  ): SwapWithoutFeesResult {\n    // Ensure inputs are valid\n    if (destinationAmount.isZero()) {\n      throw new Error(\"destinationAmount is zero\");\n    }\n    if (destinationAmount.gt(swapDestinationAmount)) {\n      throw new Error(\"destinationAmount exceeds available destination reserve\");\n    }\n\n    // Numerator: x * Δy\n    const numerator = swapSourceAmount.mul(destinationAmount);\n    // Denominator: y - Δy\n    const denominator = swapDestinationAmount.sub(destinationAmount);\n\n    if (denominator.isZero()) {\n      throw new Error(\"denominator is zero\");\n    }\n\n    // Ceiling division: Δx = ceil((x * Δy) / (y - Δy))\n    const [sourceAmountSwapped] = checkedCeilDiv(numerator, denominator);\n\n    return {\n      sourceAmountSwapped,\n      destinationAmountSwapped: destinationAmount,\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 { 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\");\nconst USER_POOL_LIQUIDITY_SEED = Buffer.from(\"user-pool-liquidity\", \"utf8\");\nconst PARTNER_INFOS = Buffer.from(\"partner_infos\", \"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\nexport function getPdaUserLiquidity(\n  programId: PublicKey,\n  poolId: PublicKey,\n  owner: PublicKey,\n): {\n  publicKey: PublicKey;\n  nonce: number;\n} {\n  return findProgramAddress([USER_POOL_LIQUIDITY_SEED, poolId.toBuffer(), owner.toBuffer()], programId);\n}\n\nexport function getPdaPoolPartners(\n  programId: PublicKey,\n  poolId: PublicKey,\n): {\n  publicKey: PublicKey;\n  nonce: number;\n} {\n  return findProgramAddress([PARTNER_INFOS, poolId.toBuffer()], programId);\n}\n\nfunction u16ToBytes(num: number): Uint8Array {\n  const arr = new ArrayBuffer(2);\n  const view = new DataView(arr);\n  view.setUint16(0, num, false);\n  return new Uint8Array(arr);\n}\n\nexport function getCreatePoolKeys({\n  programId,\n  configId,\n  mintA,\n  mintB,\n}: {\n  programId: PublicKey;\n  configId: PublicKey;\n  mintA: PublicKey;\n  mintB: PublicKey;\n}): {\n  poolId: PublicKey;\n  configId: PublicKey;\n  authority: PublicKey;\n  vaultA: PublicKey;\n  vaultB: PublicKey;\n  observationId: PublicKey;\n} {\n  const authority = getPdaPoolAuthority(programId).publicKey;\n  const poolId = getCpmmPdaPoolId(programId, configId, mintA, mintB).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    vaultA,\n    vaultB,\n    observationId,\n  };\n}\n","import BN from \"bn.js\";\n\nimport { Program } from \"@coral-xyz/anchor\";\nimport { AccountMeta, PublicKey, TransactionInstruction } from \"@solana/web3.js\";\nimport { createLogger } from \"@/common\";\nimport { Gamma } from \"../idl/gamma.type\";\n\nconst logger = createLogger(\"Gfx_cpmm\");\n\ntype DflowSegmenterParams = {\n  registeredSegmenter: PublicKey;\n  registeredRegistry: PublicKey;\n};\ntype ReferralParams = {\n  referralAccount: PublicKey;\n  referralTokenAccountWithInputMint: PublicKey;\n};\n\nexport async function makeInitUserPoolLiquidityInstruction(\n  program: Program<Gamma>,\n  user: PublicKey,\n  poolState: PublicKey,\n  partner: PublicKey | null,\n): Promise<TransactionInstruction> {\n  return await program.methods\n    .initUserPoolLiquidity(partner)\n    .accounts({\n      user,\n      poolState,\n    })\n    .instruction();\n}\n\nexport async function makeCreateCpmmPoolInInstruction(\n  program: Program<Gamma>,\n  creator: PublicKey,\n  ammConfig: PublicKey,\n  token0Mint: PublicKey,\n  token1Mint: PublicKey,\n  creatorToken0: PublicKey,\n  creatorToken1: PublicKey,\n  token0Program: PublicKey,\n  token1Program: PublicKey,\n  amountMaxA: BN,\n  amountMaxB: BN,\n  openTime: BN,\n  maxTradeFeeRate: BN,\n  volatilityFactor: BN,\n): Promise<TransactionInstruction> {\n  return await program.methods\n    .initialize(amountMaxA, amountMaxB, openTime, maxTradeFeeRate, volatilityFactor)\n    .accounts({\n      creator,\n      ammConfig,\n      token0Mint,\n      token1Mint,\n      creatorToken0,\n      creatorToken1,\n      token0Program,\n      token1Program,\n    })\n    .instruction();\n}\n\nexport async function makeDepositCpmmInInstruction(\n  program: Program<Gamma>,\n  owner: PublicKey,\n  poolState: PublicKey,\n  token0Account: PublicKey,\n  token1Account: PublicKey,\n  token0Vault: PublicKey,\n  token1Vault: PublicKey,\n  vault0Mint: PublicKey,\n  vault1Mint: PublicKey,\n  lpAmount: BN,\n  amountMaxA: BN,\n  amountMaxB: BN,\n): Promise<TransactionInstruction> {\n  logger.debug(\"cpmm deposit data\", {\n    lpAmount: lpAmount.toString(),\n    amountMaxA: amountMaxA.toString(),\n    amountMaxB: amountMaxB.toString(),\n  });\n\n  return await program.methods\n    .deposit(lpAmount, amountMaxA, amountMaxB)\n    .accounts({\n      owner,\n      poolState,\n      token0Account,\n      token1Account,\n      token0Vault,\n      token1Vault,\n      vault0Mint,\n      vault1Mint,\n    })\n    .instruction();\n}\n\nexport async function makeWithdrawCpmmInInstruction(\n  program: Program<Gamma>,\n  owner: PublicKey,\n  poolState: PublicKey,\n  token0Account: PublicKey,\n  token1Account: PublicKey,\n  token0Vault: PublicKey,\n  token1Vault: PublicKey,\n  vault0Mint: PublicKey,\n  vault1Mint: PublicKey,\n  lpAmount: BN,\n  amountMintA: BN,\n  amountMintB: BN,\n  kaminoAccounts?: AccountMeta[],\n): Promise<TransactionInstruction> {\n  return await program.methods\n    .withdraw(lpAmount, amountMintA, amountMintB)\n    .accounts({\n      owner,\n      poolState,\n      token0Account,\n      token1Account,\n      token0Vault,\n      token1Vault,\n      vault0Mint,\n      vault1Mint,\n    })\n    .remainingAccounts(kaminoAccounts ?? [])\n    .instruction();\n}\n\nexport async function makeSwapCpmmBaseInInstruction(\n  program: Program<Gamma>,\n  payer: PublicKey,\n  ammConfig: PublicKey,\n  poolState: PublicKey,\n  inputTokenAccount: PublicKey,\n  outputTokenAccount: PublicKey,\n  inputVault: PublicKey,\n  outputVault: PublicKey,\n  inputTokenProgram: PublicKey,\n  outputTokenProgram: PublicKey,\n  inputTokenMint: PublicKey,\n  outputTokenMint: PublicKey,\n  observationState: PublicKey,\n\n  amountIn: BN,\n  amounOutMin: BN,\n  dflowSegmenterOptions: DflowSegmenterParams | null = null,\n  referralAccounts: ReferralParams | null = null,\n): Promise<TransactionInstruction> {\n  let remainingAccounts = swapRemainingAccounts(program.programId, dflowSegmenterOptions, referralAccounts);\n  return await program.methods\n    .swapBaseInput(amountIn, amounOutMin)\n    .accounts({\n      payer,\n      ammConfig,\n      poolState,\n      inputTokenAccount,\n      outputTokenAccount,\n      inputTokenMint,\n      outputTokenMint,\n      inputTokenProgram,\n      outputTokenProgram,\n      inputVault,\n      outputVault,\n      observationState,\n    })\n    .remainingAccounts(remainingAccounts)\n    .instruction();\n}\n\nexport async function makeSwapCpmmBaseOutInstruction(\n  program: Program<Gamma>,\n  payer: PublicKey,\n  ammConfig: PublicKey,\n  poolState: PublicKey,\n  inputTokenAccount: PublicKey,\n  outputTokenAccount: PublicKey,\n  inputVault: PublicKey,\n  outputVault: PublicKey,\n  inputTokenProgram: PublicKey,\n  outputTokenProgram: PublicKey,\n  inputTokenMint: PublicKey,\n  outputTokenMint: PublicKey,\n  observationState: PublicKey,\n\n  amountInMax: BN,\n  amounOut: BN,\n  dflowSegmenterOptions: DflowSegmenterParams | null = null,\n  referralAccounts: ReferralParams | null = null,\n): Promise<TransactionInstruction> {\n  let remainingAccounts = swapRemainingAccounts(program.programId, dflowSegmenterOptions, referralAccounts);\n  return await program.methods\n    .swapBaseOutput(amountInMax, amounOut)\n    .accounts({\n      payer,\n      ammConfig,\n      poolState,\n      inputTokenAccount,\n      outputTokenAccount,\n      inputTokenMint,\n      outputTokenMint,\n      inputTokenProgram,\n      outputTokenProgram,\n      inputVault,\n      outputVault,\n      observationState,\n    })\n    .remainingAccounts(remainingAccounts)\n    .instruction();\n}\n\nexport async function makeSwapCpmmOracleBaseInInstruction(\n  program: Program<Gamma>,\n  payer: PublicKey,\n  ammConfig: PublicKey,\n  poolState: PublicKey,\n  inputTokenAccount: PublicKey,\n  outputTokenAccount: PublicKey,\n  inputVault: PublicKey,\n  outputVault: PublicKey,\n  inputTokenProgram: PublicKey,\n  outputTokenProgram: PublicKey,\n  inputTokenMint: PublicKey,\n  outputTokenMint: PublicKey,\n  observationState: PublicKey,\n\n  amountIn: BN,\n  amounOutMin: BN,\n  dflowSegmenterOptions: DflowSegmenterParams | null = null,\n  referralAccounts: ReferralParams | null = null,\n): Promise<TransactionInstruction> {\n  let remainingAccounts = swapRemainingAccounts(program.programId, dflowSegmenterOptions, referralAccounts);\n  return await program.methods\n    .oracleBasedSwapBaseInput(amountIn, amounOutMin)\n    .accounts({\n      payer,\n      ammConfig,\n      poolState,\n      inputTokenAccount,\n      outputTokenAccount,\n      inputTokenMint,\n      outputTokenMint,\n      inputTokenProgram,\n      outputTokenProgram,\n      inputVault,\n      outputVault,\n      observationState,\n    })\n    .remainingAccounts(remainingAccounts)\n    .instruction();\n}\n\nexport async function makeCreateRewardsInstruction(\n  program: Program<Gamma>,\n  rewardProvider: PublicKey,\n  poolState: PublicKey,\n  rewardProvidersTokenAccount: PublicKey,\n  rewardMint: PublicKey,\n  startTime: BN,\n  endTime: BN,\n  rewardAmount: BN,\n): Promise<TransactionInstruction> {\n  return await program.methods\n    .createRewards(startTime, endTime, rewardAmount)\n    .accounts({\n      rewardProvider,\n      poolState,\n      rewardProvidersTokenAccount,\n      rewardMint,\n    })\n    .instruction();\n}\n\nexport async function makeClaimRewardsInstruction(\n  program: Program<Gamma>,\n  user: PublicKey,\n  poolState: PublicKey,\n  userTokenAccount: PublicKey,\n  rewardMint: PublicKey,\n): Promise<TransactionInstruction> {\n  return await program.methods\n    .claimRewards()\n    .accounts({\n      user,\n      poolState,\n      userTokenAccount,\n      rewardMint,\n    })\n    .instruction();\n}\n\nexport async function makeCalculateRewardsInstruction(\n  program: Program<Gamma>,\n  signer: PublicKey,\n  user: PublicKey,\n  poolState: PublicKey,\n): Promise<TransactionInstruction> {\n  return await program.methods\n    .calculateRewards()\n    .accounts({\n      signer,\n      user,\n      poolState,\n    })\n    .instruction();\n}\n\nexport async function makeInitializePartnerInstruction(\n  program: Program<Gamma>,\n  payer: PublicKey,\n  authority: PublicKey,\n  poolState: PublicKey,\n  partner: PublicKey,\n  name: string,\n  token0TokenAccount: PublicKey,\n  token1TokenAccount: PublicKey,\n): Promise<TransactionInstruction> {\n  return await program.methods\n    .initializePartner(name, token0TokenAccount, token1TokenAccount)\n    .accounts({\n      payer,\n      authority,\n      poolState,\n      partner,\n    })\n    .instruction();\n}\n\nexport async function makeUpdatePartnerInstruction(\n  program: Program<Gamma>,\n  authority: PublicKey,\n  partner: PublicKey,\n  token0TokenAccount?: PublicKey,\n  token1TokenAccount?: PublicKey,\n): Promise<TransactionInstruction> {\n  if (!token0TokenAccount && !token1TokenAccount) {\n    throw new Error(`No params specified for partner update`);\n  }\n  return await program.methods\n    .updatePartner(token0TokenAccount ?? null, token1TokenAccount ?? null)\n    .accountsStrict({\n      authority,\n      partner,\n    })\n    .instruction();\n}\n\nexport async function makeAddPartnerInstruction(\n  program: Program<Gamma>,\n  ammConfig: PublicKey,\n  poolState: PublicKey,\n  partner: PublicKey,\n  authority?: PublicKey,\n): Promise<TransactionInstruction> {\n  return await program.methods\n    .addPartner()\n    .accountsPartial({\n      authority,\n      ammConfig,\n      poolState,\n      partner,\n    })\n    .instruction();\n}\n\nexport async function makeCalculatePartnerFeesInstruction(\n  program: Program<Gamma>,\n  poolState: PublicKey,\n): Promise<TransactionInstruction> {\n  return await program.methods\n    .updatePartnerFees()\n    .accounts({\n      poolState,\n    })\n    .instruction();\n}\n\nexport async function makeClaimPartnerFeesInstruction(\n  program: Program<Gamma>,\n  poolState: PublicKey,\n  partner: PublicKey,\n  token0Vault: PublicKey,\n  token1Vault: PublicKey,\n  vault0Mint: PublicKey,\n  vault1Mint: PublicKey,\n  token0TokenAccount?: PublicKey,\n  token1TokenAccount?: PublicKey,\n): Promise<TransactionInstruction> {\n  return await program.methods\n    .claimPartnerFees()\n    .accountsPartial({\n      poolState,\n      partner,\n      token0Vault,\n      token1Vault,\n      vault0Mint,\n      vault1Mint,\n      token0TokenAccount,\n      token1TokenAccount,\n    })\n    .instruction();\n}\n\nfunction swapRemainingAccounts(\n  gammaProgramId: PublicKey,\n  dflowSegmenterOptions: DflowSegmenterParams | null,\n  referralAccounts: ReferralParams | null,\n): AccountMeta[] {\n  const keys: Array<AccountMeta> = [];\n  if (dflowSegmenterOptions) {\n    keys.push({ pubkey: dflowSegmenterOptions.registeredSegmenter, isSigner: true, isWritable: false });\n    keys.push({ pubkey: dflowSegmenterOptions.registeredRegistry, isSigner: false, isWritable: false });\n  }\n\n  if (referralAccounts) {\n    if (!dflowSegmenterOptions) {\n      // We pass programId as then the program will interpret them as None, i.e not passed\n      // The smart contract requires the accounts to be in specific order by doing this we still follow the order but\n      // the program will interpret them as not passed\n      keys.push({ pubkey: gammaProgramId, isSigner: false, isWritable: false });\n      keys.push({ pubkey: gammaProgramId, isSigner: false, isWritable: false });\n    }\n\n    keys.push({ pubkey: referralAccounts.referralAccount, isSigner: false, isWritable: false });\n    keys.push({ pubkey: referralAccounts.referralTokenAccountWithInputMint, isSigner: false, isWritable: true });\n  }\n\n  return keys;\n}\n","import { Connection, PublicKey } from \"@solana/web3.js\";\nimport { MintLayout, RawMint, TOKEN_PROGRAM_ID, TOKEN_2022_PROGRAM_ID, TransferFeeConfig } from \"@solana/spl-token\";\nimport { Token, TokenAmount } from \"@/module\";\nimport { BigNumberish } from \"@/common/number\";\nimport { TokenInfo } from \"./type\";\nimport { SOL_INFO, TOKEN_WSOL } from \"./constant\";\n\nimport { JupiterListToken } 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(new Uint8Array(accountData.data));\n  return tokenInfo;\n};\n\nexport const toTokenInfo = ({\n  mint,\n  decimals,\n  programId = TOKEN_PROGRAM_ID,\n  logoURI = \"\",\n  priority = 3,\n}: {\n  mint: PublicKey;\n  decimals: number;\n  programId?: PublicKey | string;\n  priority?: number;\n  logoURI?: string;\n}): TokenInfo => {\n  const pubStr = mint.toBase58().substring(0, 6);\n  return {\n    address: mint.toBase58(),\n    decimals,\n    symbol: pubStr,\n    logoURI,\n    extensions: {},\n    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 JupiterListToken | 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 JupiterListToken | TokenInfo>(token: T): T {\n  if (token.address === TOKEN_WSOL.address) return SOL_INFO as T;\n  return token;\n}\n\nexport const toGammaApiToken = ({\n  address,\n  programId,\n  decimals,\n  ...props\n}: {\n  address: string;\n  programId: string;\n  decimals: number;\n} & Partial<JupiterListToken>): JupiterListToken & { programId: string } => ({\n  programId,\n  address: solToWSol(address).toBase58(),\n  logoURI: \"\",\n  symbol: \"\",\n  name: \"\",\n  decimals,\n  tags: [],\n  extensions: props.extensions || {},\n  ...props,\n});\n\nexport const toFeeConfig = (config?: TransferFeeConfig): JupiterListToken[\"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 KaminoIDL from \"../idl/kamino_lending.json\";\nimport { AccountMeta, Connection, Keypair, PublicKey } from \"@solana/web3.js\";\nimport BN from \"bn.js\";\nimport { Idl, Program, AnchorProvider, Wallet } from \"@project-serum/anchor\";\n\nconst KAMINO_PROGRAM_ID = \"KLend2g3cP87fffoy8q1mQqGKjrxjC8boSyAYavgmjD\";\nconst KAMINO_MARKET_ID = \"7u3HeHxYDLhnCoErrtycNokbQYbWGzLs6JSDqGAv5PfF\";\n\n/**\n * Lending market authority seed\n */\nexport const LENDING_MARKET_AUTH_SEED = \"lma\";\n\nexport function getLendingMarketAuthority(lendingMarket: PublicKey, programId: PublicKey) {\n  return PublicKey.findProgramAddressSync([Buffer.from(LENDING_MARKET_AUTH_SEED), lendingMarket.toBuffer()], programId);\n}\n\nexport function getGammaPoolDestinationCollateral(\n  poolAddress: PublicKey,\n  tokenMint: PublicKey,\n  gammaId: PublicKey,\n): PublicKey {\n  return PublicKey.findProgramAddressSync(\n    [Buffer.from(\"pool_kamino_deposits\"), poolAddress.toBuffer(), tokenMint.toBuffer()],\n    gammaId,\n  )[0];\n}\n\nexport interface KaminoReserve {\n  address: PublicKey;\n  state: KaminoReserveAccount;\n}\ninterface KaminoReserveAccount {\n  version: BN;\n  lendingMarket: PublicKey;\n  farmCollateral: PublicKey;\n  farmDebt: PublicKey;\n  liquidity: ReserveLiquidity;\n  collateral: ReserveCollateral;\n  /** incomplete field definitions */\n}\n\ninterface ReserveLiquidity {\n  mintPubkey: PublicKey;\n  supplyVault: PublicKey;\n  feeVault: PublicKey;\n  /** incomplete field definitions */\n}\n\ninterface ReserveCollateral {\n  mintPubkey: PublicKey;\n  supplyVault: PublicKey;\n  /** incomplete field definitions */\n}\n\nexport async function getReservesForMarket(\n  connection: Connection,\n  marketAddress?: PublicKey,\n  kaminoProgram?: PublicKey,\n): Promise<Map<string, KaminoReserve>> {\n  const provider = new AnchorProvider(connection, new Wallet(Keypair.generate()), {\n    commitment: \"confirmed\",\n  });\n  const programId = kaminoProgram ?? KAMINO_PROGRAM_ID;\n  const kamino = new Program(KaminoIDL as unknown as Idl, programId, provider);\n  const market = marketAddress ?? new PublicKey(KAMINO_MARKET_ID);\n  const reserves = await kamino.account.reserve.all([\n    {\n      memcmp: {\n        offset: 32,\n        bytes: market.toBase58(),\n      },\n    },\n  ]);\n\n  const reservesByLiquidity = new Map<string, KaminoReserve>();\n\n  reserves.forEach((reserve) => {\n    const reserveLiquidity = reserve.account.liquidity as unknown as ReserveLiquidity;\n    reservesByLiquidity.set(reserveLiquidity.mintPubkey.toBase58(), {\n      address: reserve.publicKey,\n      state: {\n        version: reserve.account.version as unknown as BN,\n        lendingMarket: reserve.account.lendingMarket as unknown as PublicKey,\n        farmCollateral: reserve.account.farmCollateral as unknown as PublicKey,\n        farmDebt: reserve.account.farmDebt as unknown as PublicKey,\n        liquidity: reserveLiquidity,\n        collateral: reserve.account.collateral as unknown as ReserveCollateral,\n      },\n    });\n  });\n  return reservesByLiquidity;\n}\n\nexport function getReserveAccountsForWithdraw(\n  pool: PublicKey,\n  reserveA: KaminoReserve | undefined,\n  reserveB: KaminoReserve | undefined,\n  maxSharedTokenA: BN,\n  maxSharedTokenB: BN,\n  gammaProgram: PublicKey,\n  kaminoProgram?: PublicKey,\n): AccountMeta[] {\n  const programIds = new Array<PublicKey>(6).fill(gammaProgram).map((pubkey) => {\n    return { pubkey, isWritable: false, isSigner: false };\n  });\n  const accounts = new Array();\n\n  if (maxSharedTokenA.gtn(0) && reserveA) {\n    accounts.push(...getAccountsForReserve(pool, reserveA, gammaProgram, kaminoProgram));\n  } else {\n    accounts.push(...programIds);\n  }\n\n  if (maxSharedTokenB.gtn(0) && reserveB) {\n    accounts.push(...getAccountsForReserve(pool, reserveB, gammaProgram, kaminoProgram));\n  } else {\n    accounts.push(...programIds);\n  }\n\n  return accounts;\n}\n\nfunction getAccountsForReserve(\n  pool: PublicKey,\n  reserve: KaminoReserve,\n  gammaProgram: PublicKey,\n  kaminoProgram?: PublicKey,\n): AccountMeta[] {\n  const lendingMarketAuthority = getLendingMarketAuthority(\n    reserve.state.lendingMarket,\n    kaminoProgram ?? new PublicKey(KAMINO_PROGRAM_ID),\n  )[0];\n  const gammaDestination = getGammaPoolDestinationCollateral(pool, reserve.state.liquidity.mintPubkey, gammaProgram);\n  return [\n    { pubkey: reserve.address, isWritable: true, isSigner: true },\n    { pubkey: reserve.state.lendingMarket, isWritable: true, isSigner: true },\n    { pubkey: lendingMarketAuthority, isWritable: false, isSigner: true },\n    { pubkey: reserve.state.liquidity.supplyVault, isWritable: true, isSigner: true },\n    { pubkey: reserve.state.collateral.mintPubkey, isWritable: true, isSigner: true },\n    { pubkey: gammaDestination, isWritable: false, isSigner: true },\n  ];\n}\n","import { PublicKey } from \"@solana/web3.js\";\nimport { MintLayout, TOKEN_2022_PROGRAM_ID, TOKEN_PROGRAM_ID } from \"@solana/spl-token\";\n\nimport { GammaToken } from \"@/api/type\";\nimport ModuleBase, { ModuleBaseProps } from \"../moduleBase\";\nimport { LoadParams } from \"../type\";\n\nimport { TokenInfo } from \"./type\";\nimport { SOL_INFO } from \"./constant\";\n\nexport default class TokenModule extends ModuleBase {\n  private _tokenList: TokenInfo[] = [];\n  private _tokenMap: Map<string, TokenInfo> = new Map();\n  private _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 _extraTokenList: TokenInfo[] = [];\n\n  constructor(params: ModuleBaseProps) {\n    super(params);\n  }\n\n  public async load(params?: LoadParams): Promise<void> {\n    this.checkDisabled();\n    const { forceUpdate = false } = params || {};\n    const jup = await this.scope.fetchJupTokenList(forceUpdate);\n    // reset all data\n    this._tokenList = [];\n    this._tokenMap = new Map();\n    this._mintGroup = { official: new Set(), jup: new Set(), extra: new Set() };\n\n    this._tokenMap.set(SOL_INFO.address, SOL_INFO);\n    this._mintGroup.official.add(SOL_INFO.address);\n\n    jup.forEach((token) => {\n      this._tokenMap.set(token.address, {\n        ...token,\n        type: \"jupiter\",\n        priority: 1,\n        programId: token.tags.includes(\"token-2022\") ? TOKEN_2022_PROGRAM_ID.toBase58() : TOKEN_PROGRAM_ID.toBase58(),\n      });\n      this._mintGroup.jup.add(token.address);\n    });\n\n    this._extraTokenList.forEach((token) => {\n      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 mintGroup(): { official: Set<string>; jup: Set<string> } {\n    return this._mintGroup;\n  }\n\n  /** === util functions === */\n\n  public async getTokenInfo(mint: string | PublicKey): Promise<GammaToken> {\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(new Uint8Array(onlineInfo.data));\n    const mintSymbol = mintStr.toString().substring(0, 6);\n    const fullInfo = {\n      chainId: 101 as 101,\n      priority: 1,\n      address: mintStr,\n      name: mintSymbol,\n      symbol: mintSymbol,\n      decimals: data.decimals,\n      logoURI: \"\",\n      tags: new Array<string>(),\n      dailyVolume: 0,\n      price: 0,\n      freezeAuthority: data.freezeAuthority.toBase58(),\n      mintAuthority: data.mintAuthority.toBase58(),\n    };\n    this._mintGroup.extra.add(mintStr);\n    this._tokenMap.set(mintStr, fullInfo);\n    return fullInfo;\n  }\n}\n","import { EpochInfo, PublicKey } from \"@solana/web3.js\";\nimport { ConfigInfo, PoolInfo, PoolKeys } from \"@/api/type\";\nimport { TxVersion } from \"@/common/txTool/txType\";\nimport BN from \"bn.js\";\nimport { ComputeBudgetConfig, GetTransferAmountFee } from \"@/gfx/type\";\nimport { SwapResult } from \"./curve/calculator\";\nimport { Percent } from \"@/module\";\nimport { Gamma } from \"../idl/gamma.type\";\nimport Decimal from \"decimal.js\";\nimport { IdlAccounts, IdlTypes } from \"@coral-xyz/anchor\";\n\ninterface MintInfo {\n  address: string;\n  decimals: number;\n  programId: string;\n}\n\nexport interface CreateCpmmPoolParam<T> {\n  programId: PublicKey;\n  poolFeeAccount: PublicKey;\n  mintA: MintInfo;\n  mintB: MintInfo;\n  mintAAmount: BN;\n  mintBAmount: BN;\n  startTime: BN;\n  maxTradeFeeRate: BN;\n  volatilityFactor: BN;\n  feeConfig: ConfigInfo;\n\n  associatedOnly: boolean;\n  checkCreateATAOwner?: boolean;\n\n  ownerInfo: {\n    feePayer?: PublicKey;\n    useSOLBalance?: boolean; // if has WSOL mint\n  };\n  computeBudgetConfig?: ComputeBudgetConfig;\n  txVersion?: T;\n}\n\nexport interface CreateCpmmPoolAddress {\n  poolId: PublicKey;\n  configId: PublicKey;\n  authority: PublicKey;\n  lpMint: PublicKey;\n  vaultA: PublicKey;\n  vaultB: PublicKey;\n  observationId: PublicKey;\n  mintA: MintInfo;\n  mintB: MintInfo;\n  programId: PublicKey;\n  poolFeeAccount: PublicKey;\n  feeConfig: ConfigInfo;\n}\n\nexport interface AddCpmmLiquidityParams<T = TxVersion.LEGACY> {\n  poolInfo: PoolInfo;\n  poolKeys?: PoolKeys;\n  payer?: PublicKey;\n  inputAmount: BN;\n  baseSpecified: boolean;\n  slippage: Percent;\n  config?: {\n    bypassAssociatedCheck?: boolean;\n    checkCreateATAOwner?: boolean;\n  };\n  computeBudgetConfig?: ComputeBudgetConfig;\n  txVersion?: T;\n  computeResult?: {\n    inputAmountFee: GetTransferAmountFee;\n    anotherAmount: GetTransferAmountFee;\n    maxAnotherAmount: GetTransferAmountFee;\n    liquidity: BN;\n  };\n  partner?: PublicKey;\n}\n\nexport interface WithdrawCpmmLiquidityParams<T = TxVersion.LEGACY> {\n  poolInfo: PoolInfo;\n  poolKeys?: PoolKeys;\n  payer?: PublicKey;\n  lpAmount: BN;\n  slippage: Percent;\n  computeBudgetConfig?: ComputeBudgetConfig;\n  txVersion?: T;\n}\n\nexport interface CpmmSwapWithOracleParams<T = TxVersion.LEGACY> {\n  poolInfo: PoolInfo;\n  poolKeys?: PoolKeys;\n  payer?: PublicKey;\n  zeroForOne: boolean;\n  slippage?: number;\n  swapResult: Pick<SwapResult, \"sourceAmountSwapped\" | \"destinationAmountSwapped\">;\n\n  config?: {\n    bypassAssociatedCheck?: boolean;\n    checkCreateATAOwner?: boolean;\n    associatedOnly?: boolean;\n  };\n  computeBudgetConfig?: ComputeBudgetConfig;\n  txVersion?: T;\n  wrapSol?: boolean;\n  dflowSegmenterOptions?: {\n    registeredSegmenter: PublicKey;\n    registeredRegistry: PublicKey;\n  } | null;\n  referralAccounts?: {\n    referralAccount: PublicKey;\n    referralTokenAccountWithInputMint: PublicKey;\n  } | null;\n}\n\nexport interface CpmmSwapParams<T = TxVersion.LEGACY> extends CpmmSwapWithOracleParams<T> {\n  baseIn?: boolean;\n}\n\nexport interface ComputePairAmountParams {\n  poolInfo: PoolInfo;\n  baseReserve: BN;\n  quoteReserve: BN;\n  amount: string | Decimal;\n  slippage: Percent;\n  epochInfo: EpochInfo;\n  baseSpecified?: boolean\n}\n\nexport type CpmmObservationState = IdlAccounts<Gamma>[\"observationState\"];\nexport type CpmmConfig = IdlAccounts<Gamma>[\"ammConfig\"];\nexport type CpmmPool = IdlAccounts<Gamma>[\"poolState\"];\nexport type CpmmPoolPartners = IdlAccounts<Gamma>[\"poolPartnerInfos\"];\nexport type CpmmRewardInfo = IdlAccounts<Gamma>[\"rewardInfo\"];\nexport type CpmmUserLiquidityAccount = IdlAccounts<Gamma>[\"userPoolLiquidity\"];\nexport type CpmmUserRewardInfo = IdlAccounts<Gamma>[\"userRewardInfo\"];\nexport type CpmmObservation = IdlTypes<Gamma>[\"observation\"];\nexport type UserLiquidityAccount = IdlAccounts<Gamma>[\"userPoolLiquidity\"];\n\nexport enum CpmmCoder {\n  CPMM_POOL = \"poolState\",\n  CPMM_POOL_PARTNERS = \"poolPartnerInfos\",\n}\n\nexport type CpmmRpcData = CpmmPool & {\n  baseReserve: BN;\n  quoteReserve: BN;\n  vaultAAmount: BN;\n  vaultBAmount: BN;\n  configInfo?: CpmmConfig;\n  partnerInfo: CpmmPoolPartners;\n  observationAccount: CpmmObservationState;\n  poolPrice: Decimal;\n  programId: PublicKey;\n};\n\nexport type CpmmComputeData = {\n  id: PublicKey;\n  version: 7;\n  configInfo: CpmmConfig;\n  mintA: MintInfo;\n  mintB: MintInfo;\n  authority: PublicKey;\n} & Omit<CpmmRpcData, \"configInfo\" | \"mintA\" | \"mintB\">;\n","import BN from \"bn.js\";\nimport { DynamicFee, FEE_RATE_DENOMINATOR_VALUE } from \"./fee\";\nimport { ConstantProductCurve } from \"./constantProduct\";\nimport { CpmmObservationState, CpmmPool } from \"../type\";\nimport { SwapResult, CurveCalculator } from \"./calculator\";\nimport { saturatingSub, checkedCeilDiv } from \"./common\";\n\n// Price scaled to 9 decimal places\nconst D9 = new BN(Math.pow(10, 9));\nconst D9_SQUARED = D9.mul(D9);\n\nexport class OracleBasedCurveCalculator {\n  static validate_supply(tokenAmount0: BN, tokenAmount1: BN): void {\n    return CurveCalculator.validate_supply(tokenAmount0, tokenAmount1);\n  }\n\n  static swap(\n    sourceAmount: BN,\n    zeroForOne: boolean,\n    baseReserve: BN,\n    quoteReserve: BN,\n    tradeFeeRate: BN,\n    observationState: CpmmObservationState,\n    poolState: CpmmPool,\n    isInvokedWithSignedSegmenter = false,\n  ): SwapResult {\n    const swapSourceAmount = zeroForOne ? baseReserve : quoteReserve;\n    const swapDestinationAmount = zeroForOne ? quoteReserve : baseReserve;\n\n    const oraclePriceUpdatedAt = poolState.oraclePriceUpdatedAt;\n    const blockTimestamp = new BN(new Date().getTime() / 1000);\n    const timeDiff = saturatingSub(blockTimestamp, oraclePriceUpdatedAt);\n    if (\n      timeDiff.gtn(poolState.maxOraclePriceUpdateTimeDiff) ||\n      blockTimestamp.lt(oraclePriceUpdatedAt) ||\n      oraclePriceUpdatedAt.eqn(0) ||\n      poolState.oraclePriceToken0ByToken1.eqn(0)\n    ) {\n      return CurveCalculator.swapBaseIn(\n        sourceAmount,\n        swapSourceAmount,\n        swapDestinationAmount,\n        tradeFeeRate,\n        observationState,\n        poolState.volatilityFactor,\n        isInvokedWithSignedSegmenter,\n      );\n    }\n\n    const spotPrice = swapDestinationAmount.mul(D9).div(swapSourceAmount);\n    const oraclePrice = zeroForOne\n      ? D9_SQUARED.div(poolState.oraclePriceToken0ByToken1)\n      : poolState.oraclePriceToken0ByToken1;\n    const rateDifference = OracleBasedCurveCalculator.getSpotPriceAndOraclePriceRateDifference(oraclePrice, spotPrice);\n    if (rateDifference.gtn(poolState.acceptablePriceDifference)) {\n      return CurveCalculator.swapBaseIn(\n        sourceAmount,\n        swapSourceAmount,\n        swapDestinationAmount,\n        tradeFeeRate,\n        observationState,\n        poolState.volatilityFactor,\n        isInvokedWithSignedSegmenter,\n      );\n    }\n\n    const amountToBeSwappedAtOraclePrice = OracleBasedCurveCalculator.getAmountToBeSwappedAtOraclePrice(\n      sourceAmount,\n      swapSourceAmount,\n      swapDestinationAmount,\n      oraclePrice,\n      poolState,\n    );\n    const amountToBeSwappedWithInvariantCurve = sourceAmount.sub(amountToBeSwappedAtOraclePrice);\n\n    if (amountToBeSwappedAtOraclePrice.eqn(0)) {\n      return CurveCalculator.swapBaseIn(\n        sourceAmount,\n        swapSourceAmount,\n        swapDestinationAmount,\n        tradeFeeRate,\n        observationState,\n        poolState.volatilityFactor,\n        isInvokedWithSignedSegmenter,\n      );\n    }\n\n    const dynamicFeeRate = DynamicFee.calculateDynamicFeeRate(\n      blockTimestamp,\n      observationState,\n      \"volatility\",\n      tradeFeeRate,\n      poolState.volatilityFactor,\n      isInvokedWithSignedSegmenter,\n    );\n\n    const oracleSwapFeeRate = dynamicFeeRate.gten(poolState.minTradeRateAtOraclePrice)\n      ? dynamicFeeRate\n      : new BN(poolState.minTradeRateAtOraclePrice);\n    const oracleSwapTradeFees = checkedCeilDiv(\n      amountToBeSwappedAtOraclePrice.mul(oracleSwapFeeRate),\n      FEE_RATE_DENOMINATOR_VALUE,\n    )[0];\n    const oracleSwapSourceAmountAfterFees = amountToBeSwappedAtOraclePrice.sub(oracleSwapTradeFees);\n    const executionOraclePrice = OracleBasedCurveCalculator.getExecutionOraclePrice(\n      oraclePrice,\n      new BN(poolState.pricePremiumForSwapAtOraclePrice),\n    );\n\n    const outputTokensFromOracleSwap = executionOraclePrice.mul(oracleSwapSourceAmountAfterFees).div(D9);\n\n    const newSwapSourceAmount = swapSourceAmount.add(amountToBeSwappedAtOraclePrice);\n    const newSwapDestinationAmount = swapDestinationAmount.sub(outputTokensFromOracleSwap);\n\n    const invariantSwapTradeFees = checkedCeilDiv(\n      amountToBeSwappedWithInvariantCurve.mul(dynamicFeeRate),\n      FEE_RATE_DENOMINATOR_VALUE,\n    )[0];\n\n    const sourceAmountAfterFees = saturatingSub(amountToBeSwappedWithInvariantCurve, invariantSwapTradeFees);\n    let outputTokensFromInvariantSwap = new BN(0);\n    if (!sourceAmountAfterFees.isZero()) {\n      outputTokensFromInvariantSwap = ConstantProductCurve.swapWithoutFees(\n        sourceAmountAfterFees,\n        newSwapSourceAmount,\n        newSwapDestinationAmount,\n      ).destinationAmountSwapped;\n    }\n\n    const destinationAmountSwapped = outputTokensFromOracleSwap.add(outputTokensFromInvariantSwap);\n    return {\n      newSwapSourceAmount: swapSourceAmount.add(sourceAmount),\n      newSwapDestinationAmount: swapDestinationAmount.sub(destinationAmountSwapped),\n      sourceAmountSwapped: sourceAmount,\n      destinationAmountSwapped,\n      tradeFee: invariantSwapTradeFees.add(oracleSwapTradeFees),\n    };\n  }\n\n  private static getAmountToBeSwappedAtOraclePrice(\n    sourceAmountToBeSwapped: BN,\n    swapSourceAmount: BN,\n    swapDestinationAmount: BN,\n    oraclePrice: BN,\n    poolState: CpmmPool,\n  ): BN {\n    const maxAmountSwappableAtOraclePrice = swapSourceAmount\n      .muln(poolState.maxAmountSwappableAtOraclePrice)\n      .div(FEE_RATE_DENOMINATOR_VALUE);\n    const priceDifferenceLimit = FEE_RATE_DENOMINATOR_VALUE.subn(poolState.acceptablePriceDifference);\n    const spotPriceAtAcceptablePriceDifferenceLimit = oraclePrice\n      .mul(priceDifferenceLimit)\n      .div(FEE_RATE_DENOMINATOR_VALUE);\n\n    // To find Max tradeable amount with price Oracle Price P before we reach spot_price_at_acceptable_price_difference_limit Z:\n    // x_delta_max = (|(Z*X) - Y)| / (Z + P)\n    const numerator = spotPriceAtAcceptablePriceDifferenceLimit\n      .mul(swapSourceAmount)\n      .sub(swapDestinationAmount.mul(D9))\n      .abs();\n    const denominator = oraclePrice.add(spotPriceAtAcceptablePriceDifferenceLimit);\n    const maxSwappableWithoutExceedingPriceDifference = numerator.div(denominator);\n\n    const min = maxSwappableWithoutExceedingPriceDifference.gt(maxAmountSwappableAtOraclePrice)\n      ? maxAmountSwappableAtOraclePrice\n      : maxSwappableWithoutExceedingPriceDifference;\n    return min.gt(sourceAmountToBeSwapped) ? sourceAmountToBeSwapped : min;\n  }\n\n  private static getSpotPriceAndOraclePriceRateDifference(oraclePrice: BN, spotPrice: BN): BN {\n    return spotPrice.sub(oraclePrice).abs().mul(FEE_RATE_DENOMINATOR_VALUE).div(oraclePrice);\n  }\n\n  private static getExecutionOraclePrice(oraclePrice: BN, pricePremiumForOracleSwaps: BN): BN {\n    const premium = oraclePrice.mul(pricePremiumForOracleSwaps).div(FEE_RATE_DENOMINATOR_VALUE);\n    return oraclePrice.add(premium);\n  }\n}\n","import { PublicKey, Signer, Transaction, TransactionInstruction, VersionedTransaction } from \"@solana/web3.js\";\nimport { Mint, TransferFeeConfig } from \"@solana/spl-token\";\nimport { MultiTxExecuteParam, TxBuilder } from \"../common/txTool/txTool\";\nimport { TokenAmount } from \"../module/amount\";\nimport BN from \"bn.js\";\n\nexport type SignAllTransactions =\n  | (<T extends Transaction | VersionedTransaction>(transaction: T[]) => Promise<T[]>)\n  | undefined;\n\nexport interface MakeTransaction<T = Record<string, any>> {\n  builder: TxBuilder;\n  signers: Signer[];\n  transaction: Transaction;\n  instructionTypes: string[];\n  execute: () => Promise<{ txId: string; signedTx: Transaction }>;\n  extInfo: T;\n}\n\nexport interface MakeV0Transaction<T = Record<string, any>> {\n  builder: TxBuilder;\n  signers: Signer[];\n  transaction: VersionedTransaction;\n  instructionTypes: string[];\n  execute: () => Promise<string>;\n  extInfo: T;\n}\n\nexport interface MakeMultiTransaction {\n  builder: TxBuilder;\n  signers: Signer[][];\n  transactions: Transaction[];\n  instructionTypes: string[];\n  execute: (params?: MultiTxExecuteParam) => Promise<{\n    txIds: string[];\n    signedTxs: Transaction[];\n  }>;\n  extInfo: Record<string, any>;\n}\n\nexport interface InstructionReturn {\n  instruction: TransactionInstruction;\n  instructionType: string;\n}\n\nexport interface ComputeBudgetConfig {\n  units?: number;\n  microLamports?: number;\n}\n\nexport interface LoadParams {\n  forceUpdate?: boolean;\n}\n\nexport interface TransferAmountFee {\n  amount: TokenAmount;\n  fee: TokenAmount | undefined;\n  expirationTime: number | undefined;\n}\nexport interface GetTransferAmountFee {\n  amount: BN;\n  fee: BN | undefined;\n  expirationTime: number | undefined;\n}\n\nexport type ReturnTypeFetchMultipleMintInfo = Mint & { feeConfig: TransferFeeConfig | undefined };\nexport interface ReturnTypeFetchMultipleMintInfos {\n  [mint: string]: ReturnTypeFetchMultipleMintInfo & { programId: PublicKey };\n}\n\ntype Primitive = boolean | number | string | null | undefined | PublicKey;\n\n/**\n *\n * @example\n * ```typescript\n * interface A {\n *   keyA: string;\n *   keyB: string;\n *   map: {\n *     hello: string;\n *     i: number;\n *   };\n *   list: (string | number)[];\n *   keyC: number;\n * }\n *\n * type WrappedA = ReplaceType<A, string, boolean> // {\n *   keyA: boolean;\n *   keyB: boolean;\n *   map: {\n *     hello: boolean;\n *     i: number;\n *   };\n *   list: (number | boolean)[];\n *   keyC: number;\n * }\n * ```\n */\nexport type ReplaceType<Old, From, To> = {\n  [T in keyof Old]: Old[T] extends From // to avoid case: Old[T] is an Object,\n    ? Exclude<Old[T], From> | To // when match,  directly replace\n    : Old[T] extends Primitive // judge whether need recursively replace\n    ? From extends Old[T] // it's an Object\n      ? Exclude<Old[T], From> | To // directly replace\n      : Old[T] // stay same\n    : ReplaceType<Old[T], From, To>; // recursively replace\n};\n\nexport type MayArray<T> = T | Array<T>;\n\nexport type MayDeepArray<T> = T | Array<MayDeepArray<T>>;\n\nexport type MayFunction<T, PS extends any[] = []> = T | ((...Params: PS) => T);\n\nexport type ArrayItem<T extends ReadonlyArray<any>> = T extends Array<infer P> ? P : never;\n\nexport type ExactPartial<T, U> = {\n  [P in Extract<keyof T, U>]?: T[P];\n} & {\n  [P in Exclude<keyof T, U>]: T[P];\n};\n\nexport type ExactRequired<T, U> = {\n  [P in Extract<keyof T, U>]-?: T[P];\n} & {\n  [P in Exclude<keyof T, U>]: T[P];\n};\n\n/**\n * extract only string and number\n */\nexport type SKeyof<O> = Extract<keyof O, string>;\n\nexport type GetValue<T, K> = K extends keyof T ? T[K] : undefined;\n/**\n * @example\n * type A = { a: number; b: string; c?: string }\n * type B = { a: string; c: string; d?: boolean }\n *\n * type D = SOR<A, B> // { a: number | string; b: string | undefined; c: string | undefined; d: boolean | undefined } // ! if use SOR, you lost union type guard feature, try NOT to use this trick\n */\nexport type SOR<T, U> = { [K in keyof T | keyof U]: GetValue<T, K> | GetValue<U, K> };\n\nexport type Fallback<T, FallbackT> = T extends undefined ? FallbackT : T;\n\n/**\n * @example\n * type A = { a: number; b: string; c?: string }\n * type B = { a: string; c: string; d?: boolean }\n *\n * type D = Cover<A, B> // { a: string; b: string; c: string; d?: boolean}\n */\nexport type Cover<O, T> = { [K in SKeyof<O> | SKeyof<T>]: Fallback<GetValue<T, K>, GetValue<O, K>> };\n\nexport type UnionCover<O, T> = T extends T ? Cover<O, T> : never;\n\ntype MergeArr<Arr> = (Arr extends (infer T)[] ? T : never)[];\n\n/**\n * typescript type helper function\n * @example\n * type A = { hello: string; version: 3 }[]\n * type B = { hello: string; version: 5 }[]\n * type OK = MergeArr<A | B> // ({ hello: string; version: 3 } | { hello: string; version: 5 })[]\n * type Wrong = A | B // { hello: string; version: 3 }[] | { hello: string; version: 5 }[] // <= this type can't have auto type intelligense of array.map\n */\nexport const unionArr = <T>(arr: T): MergeArr<T> => arr as unknown as MergeArr<T>;\n"],"mappings":"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","names":["axios","get","set","LogLevel","Logger","params","logLevel","level","props","msg","arg","moduleLoggers","moduleLevels","createLogger","moduleName","logger","setLoggerLevel","PublicKey","BN","_Big","BN","BN","Rounding","BN_ZERO","BN","BN_ONE","BN_TWO","BN_THREE","BN_FIVE","BN_TEN","BN_100","BN_1000","BN_10000","MAX_SAFE","parseBigNumberish","value","logger","createLogger","tenExponential","shift","_toFarmat","toFormat","formatter_default","_Big","BN","_Decimal","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","CurrencyAmount","currency","TOKEN_PROGRAM_ID","SOL_INFO","TOKEN_WSOL","PublicKey","TOKEN_PROGRAM_ID","PublicKey","SystemProgram","SYSVAR_RENT_PUBKEY","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","currencyEquals","currencyA","currencyB","Token","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","sleep","ms","resolve","getTimestamp","notInnerObject","v","Token","TokenAmount","PublicKey","Fraction","BN","Price","Percent","o","jsonInfo2PoolKeys","jsonInfo","tryParsePublicKey","k","BN","EXP_LIMIT","MAX_DIGITS","NUMERALS","LN10","PI","DEFAULTS","inexact","quadrant","external","decimalError","invalidArgument","precisionLimitExceeded","cryptoUnavailable","tag","mathfloor","mathpow","isBinary","isHex","isOctal","isDecimal","BASE","LOG_BASE","MAX_SAFE_INTEGER","LN10_PRECISION","PI_PRECISION","P","x","finalise","min","max","k","Ctor","y","i","j","xdL","ydL","xd","yd","xs","ys","pr","rm","cosine","toLessThanHalfPi","e","m","n","r","rep","s","sd","t","t3","t3plusx","digitsToString","divide","w","d","len","one","tinyPow","taylorSeries","cosh2_x","d8","sinh2_x","d5","d16","d20","halfPi","getPi","wpr","xsd","px","x2","base","isBase10","denominator","inf","num","arg","guard","naturalLogarithm","getLn10","checkRoundingDigits","xe","xLTy","getBase10Exponent","q","naturalExponential","carry","z","getPrecision","sine","rL","toStringBinary","dp","checkInt32","str","finiteToString","maxD","d0","d1","d2","n0","n1","yn","intPow","ws","indexOfLastWord","getZeroString","repeating","di","rd","convertBase","baseIn","baseOut","arr","arrL","strL","cos2x","multiplyInteger","temp","compare","a","b","aL","bL","subtract","cmp","logBase","more","prod","prodL","qd","rem","remL","rem0","xi","xL","yd0","yL","yz","sign","isTruncated","digits","roundUp","xdi","out","isExp","nonFiniteToString","zs","truncate","isOdd","maxOrMin","args","ltgt","pow","sum","c","c0","numerator","x1","parseDecimal","parseOther","divisor","isFloat","p","Decimal","sin2_x","isHyperbolic","u","isNeg","pi","abs","acos","acosh","add","asin","asinh","atan","atanh","atan2","cbrt","ceil","clamp","config","obj","v","useDefaults","ps","cos","cosh","clone","isDecimalInstance","div","exp","floor","hypot","ln","log","log10","log2","mod","mul","random","round","sin","sinh","sqrt","sub","tan","tanh","trunc","decimal_default","toFraction","value","Percent","Fraction","Price","TokenAmount","BN_ZERO","n","details","parseNumberInfo","toFractionWithDecimals","_a","lt","a","b","fa","fb","gt","lte","gte","eq","div","sub","isMeaningfulNumber","getMax","mul","add","parseNumberInfo","_a","BN","Fraction","s","sign","int","dec","denominator","numerator","divCeil","a","b","dm","shakeFractionDecimal","toBN","decimal","toFraction","BN_TEN","value","Percent","Price","TokenAmount","BN_ZERO","n","details","toPercent","options","toTokenPrice","params","token","numberPrice","decimalDone","usdCurrency","Token","parsedNumerator","parsedDenominator","toUsdCurrency","amount","Currency","amountBigNumber","mul","CurrencyAmount","toTotalPrice","price","decimalToFraction","isDecimal","val","decimal_default","recursivelyDecimalToFraction","info","k","notInnerObject","v","PublicKey","sendAndConfirmTransaction","Transaction","TransactionMessage","VersionedTransaction","axios","TxVersion","InstructionType","PublicKey","ComputeBudgetProgram","Transaction","TransactionMessage","Keypair","VersionedTransaction","TOKEN_PROGRAM_ID","logger","createLogger","MAX_BASE64_SIZE","addComputeBudget","config","ins","insTypes","ComputeBudgetProgram","InstructionType","getRecentBlockHash","connection","propsCommitment","_a","_b","commitment","forecastTransactionSize","instructions","signers","transaction","Transaction","simulateMultipleInstruction","keyword","batchRequest","feePayer","PublicKey","transactions","instruction","results","simulateTransaction","i","error","logs","result","filteredLog","log","parseSimulateLogToJson","parseSimulateValue","key","findProgramAddress","seeds","programId","publicKey","nonce","getLatestBlockhash","encodedTransactions","signData","encodedTransaction","batch","keys","args","reqData","itemReqIndex","ii","checkLegacyTxSize","payer","checkV0TxSize","lookupTableAddressAccount","recentBlockhash","Keypair","messageV0","TransactionMessage","VersionedTransaction","epochInfoCache","getEpochInfo","data","toBuffer","arr","printSimulate","allBase64","TOKEN_PROGRAM_ID","serialized","base64","transformTxToBase64","tx","PublicKey","AddressLookupTableAccount","PublicKey","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","o","idx","AccountType","ACCOUNT_TYPE_SIZE","fetchMultipleMintInfos","mints","_a","_b","_c","mintInfos","solToWSol","mintK","MINT_SIZE","t","unpackMint","TOKEN_PROGRAM_ID","getTransferFeeConfig","WSOLMint","getMultipleLookupTableInfo","connection","address","dataInfos","getMultipleAccountsInfo","i","PublicKey","outDict","info","key","lookupAccount","AddressLookupTableAccount","LOOKUP_TABLE_CACHE","TxBuilder","params","_a","json","axios","avg","config","instructions","instructionTypes","addComputeBudget","propConfig","defaultIns","endInstructions","signers","endInstructionTypes","lookupTableAddress","address","PublicKey","txVersion","extInfo","transaction","Transaction","s","propBlockHash","skipPreflight","sendAndConfirm","recentBlockHash","getRecentBlockHash","printSimulate","sendAndConfirmTransaction","txs","extraPreBuildData","filterExtraBuildData","data","allTransactions","allSigners","allInstructionTypes","executeParams","sequentially","onTxUpdate","txIds","tx","txId","partialSignedTxs","idx","signedTxs","i","processedTxs","checkSendTx","signatureResult","targetTxIdx","d","props","lookupTableCache","forerunCreate","propRecentBlockhash","lookupTableAddressAccount","LOOKUP_TABLE_CACHE","allLTA","needCacheLTA","item","newCacheLTA","getMultipleLookupTableInfo","key","value","recentBlockhash","messageV0","TransactionMessage","VersionedTransaction","lastValidBlockHeight","blockhash","buildProps","computeBudgetConfig","computeBudgetData","signerKey","acc","cur","instructionQueue","_itemIns","_itemInsWithCompute","_signer","ii","checkLegacyTxSize","_signers","blockHash","checkV0TxSize","Owner","owner","chunkArray","arr","chunkSize","cache","tmp","intersection","args","item","xor","uniq","isNumber","val","getDate","value","getTime","isDateBefore","timestampA","timestampB","options","realTimestampB","isDateAfter","offsetDateTime","baseDate","offset","offsetedTimestamp","PublicKey","FEE_DESTINATION_ID","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","ALL_PROGRAM_ID","DEVNET_PROGRAM_ID","PublicKey","TOKEN_PROGRAM_ID","getATAAddress","owner","mint","programId","findProgramAddress","PublicKey","BN","POINT","getTransferAmountFee","amount","feeConfig","epochInfo","addFee","nowFeeConfig","maxFee","expirationTime","nowMaxFee","_TAmount","BNDivCeil","TAmount","_fee","fee","getTransferAmountFeeV2","_feeConfig","minExpirationTime","expirationTime1","expirationTime2","bn1","bn2","div","mod","API_URLS","DEV_API_URLS","SESSION_KEY","STORAGE_KEY","getSessionKey","key","updateReqHistory","logCount","removeLastLog","resData","resolve","data","success","resStr","logger","createLogger","poolKeysCache","endlessRetry","name","call","interval","result","err","sleep","Api","cluster","timeout","logRequests","logCount","urlConfigs","axios","API_URLS","config","method","baseURL","url","error","response","data","status","updateReqHistory","id","mint","m","props","poolType","sortBy","sortOrder","page","pageSize","search","idList","cacheList","readyList","poolId","poolKey","propMint1","propMint2","mint1","mint2","solToWSol","baseMint","quoteMint","queryParams","PoolFetchTypeEnum","Keypair","merge","EMPTY_OWNER","EMPTY_CONNECTION","createAssociatedTokenAccountInstruction","TOKEN_PROGRAM_ID","AccountLayout","TOKEN_2022_PROGRAM_ID","PublicKey","SystemProgram","joinMsg","args","arg","ModuleBase","scope","moduleName","createLogger","feePayer","TxBuilder","message","createInitializeAccountInstruction","createCloseAccountInstruction","createTransferInstruction","TOKEN_PROGRAM_ID","PublicKey","SystemProgram","BN","PublicKey","Keypair","TOKEN_PROGRAM_ID","BN","AccountLayout","splAccountLayout","isBytes","a","abytes","b","lengths","isBytes","aexists","instance","checkFinished","aoutput","out","abytes","min","clean","arrays","i","createView","arr","rotr","word","shift","utf8ToBytes","str","toBytes","data","utf8ToBytes","abytes","Hash","createHasher","hashCons","hashC","msg","toBytes","tmp","setBigUint64","view","byteOffset","value","isLE","_32n","_u32_max","wh","wl","h","l","Chi","a","b","c","Maj","HashMD","Hash","blockLen","outputLen","padOffset","createView","data","aexists","toBytes","abytes","buffer","len","pos","take","dataView","out","aoutput","clean","i","oview","outLen","state","res","to","length","finished","destroyed","SHA256_IV","SHA256_K","SHA256_W","SHA256","HashMD","outputLen","SHA256_IV","A","B","C","D","E","F","G","H","view","offset","i","W15","W2","s0","rotr","s1","sigma1","T1","Chi","T2","Maj","clean","sha256","createHasher","SHA256","sha256","logger","createLogger","parseTokenAccountResp","owner","solAccountResp","tokenAccountResp","tokenAccounts","tokenAccountRawInfos","pubkey","account","accountInfo","splAccountLayout","mint","amount","BN","getATAAddress","PublicKey","generatePubKey","fromPublicKey","programId","TOKEN_PROGRAM_ID","seed","Keypair","createWithSeed","buffer","buf","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","BN","Account","ModuleBase","params","tokenAccounts","tokenAccountRawInfos","cbk","listener","mint","programId","getATAAddress","config","customConfig","solAccountResp","ownerTokenAccountResp","ownerToken2022AccountResp","TOKEN_PROGRAM_ID","TOKEN_2022_PROGRAM_ID","parseTokenAccountResp","associatedOnly","accountMint","a","b","ata","tokenAccount","publicKey","_a","_b","_c","_d","createInfo","owner","notUseTokenAccount","skipCloseAccount","checkCreateATAOwner","tokenProgram","PublicKey","accounts","i","newTxInstructions","_createATAIns","createAssociatedTokenAccountInstruction","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","txBuilder","_tokenAccount","PublicKey","SystemProgram","NATIVE_MINT","TOKEN_PROGRAM_ID","createSyncNativeInstruction","BN","BN","Decimal","BN","ZERO","checkedRem","dividend","divisor","checkedCeilDiv","rhs","quotient","saturatingSub","a","b","ONE_BASIS_POINT","BN","FEE_RATE_DENOMINATOR_VALUE","OBSERVATION_LEN","VOLATILITY_WINDOW","MAX_FEE","DEFAULT_VOLATILITY_FACTOR","DynamicFee","amount","blockTimestamp","observationState","feeType","baseFees","poolVolatilityFactor","isInvokedWithSignedSegmenter","feeRate","dynamicFee","_feeRateDenominator","checkedCeilDiv","denominator","poolSpecifiedVolatilityFactor","minPrice","maxPrice","twapPrice","logMaxPrice","Decimal","logMinPrice","logTwapPrice","numerator","volatility","volatilityFactor","volatilityComponent","finalFee","discountedFee","saturatingSub","currentTime","window","descendingObservations","observation","idx","a","b","newestObs","oldestObs","totalTimeDelta","indexedObservation","lastObservation","nextObservation","timeDelta","price","postFeeAmount","dynamicFeeRate","BN","ConstantProductCurve","sourceAmount","swapSourceAmount","swapDestinationAmount","invariant","newSwapSourceAmount","newSwapDestinationAmount","_newSwapSourceAmount","checkedCeilDiv","sourceAmountSwapped","destinationAmountSwapped","destinationAmount","numerator","denominator","lpTokenAmount","lpTokenSupply","swapTokenAmount0","swapTokenAmount1","roundDirection","tokenAmount0","tokenAmount1","checkedRem","ZERO","BN","RoundDirection","CurveCalculator","tokenAmount0","tokenAmount1","sourceAmount","swapSourceAmount","swapDestinationAmount","tradeFeeRate","observationState","poolVolatilityFactor","isInvokedWithSignedSegmenter","tradeFee","DynamicFee","BN","sourceAmountLessFees","sourceAmountSwapped","destinationAmountSwapped","ConstantProductCurve","_sourceAmountSwapped","destinationAmount","AUTH_SEED","AMM_CONFIG_SEED","POOL_SEED","POOL_LP_MINT_SEED","POOL_VAULT_SEED","OBSERVATION_SEED","USER_POOL_LIQUIDITY_SEED","PARTNER_INFOS","getPdaPoolAuthority","programId","findProgramAddress","getCpmmPdaAmmConfigId","index","u16ToBytes","getCpmmPdaPoolId","ammConfigId","mintA","mintB","getPdaLpMint","poolId","getPdaVault","mint","getPdaObservationId","getPdaUserLiquidity","owner","getPdaPoolPartners","num","arr","getCreatePoolKeys","configId","authority","vaultA","vaultB","observationId","logger","createLogger","makeInitUserPoolLiquidityInstruction","program","user","poolState","partner","makeCreateCpmmPoolInInstruction","creator","ammConfig","token0Mint","token1Mint","creatorToken0","creatorToken1","token0Program","token1Program","amountMaxA","amountMaxB","openTime","maxTradeFeeRate","volatilityFactor","makeDepositCpmmInInstruction","owner","token0Account","token1Account","token0Vault","token1Vault","vault0Mint","vault1Mint","lpAmount","makeWithdrawCpmmInInstruction","amountMintA","amountMintB","kaminoAccounts","makeSwapCpmmBaseInInstruction","payer","inputTokenAccount","outputTokenAccount","inputVault","outputVault","inputTokenProgram","outputTokenProgram","inputTokenMint","outputTokenMint","observationState","amountIn","amounOutMin","dflowSegmenterOptions","referralAccounts","remainingAccounts","swapRemainingAccounts","makeSwapCpmmBaseOutInstruction","amountInMax","amounOut","makeSwapCpmmOracleBaseInInstruction","makeCreateRewardsInstruction","rewardProvider","rewardProvidersTokenAccount","rewardMint","startTime","endTime","rewardAmount","makeClaimRewardsInstruction","userTokenAccount","makeCalculateRewardsInstruction","signer","makeInitializePartnerInstruction","authority","name","token0TokenAccount","token1TokenAccount","makeUpdatePartnerInstruction","makeAddPartnerInstruction","makeCalculatePartnerFeesInstruction","makeClaimPartnerFeesInstruction","gammaProgramId","keys","BN","PublicKey","MintLayout","TOKEN_PROGRAM_ID","parseTokenInfo","connection","mint","accountData","PublicKey","MintLayout","toTokenInfo","decimals","programId","TOKEN_PROGRAM_ID","logoURI","priority","pubStr","toToken","props","Token","toTokenAmount","amount","isRaw","name","TokenAmount","solToWSol","solToWSolToken","token","SOL_INFO","TOKEN_WSOL","wSolToSolToken","toGammaApiToken","address","toFeeConfig","config","Keypair","PublicKey","Program","AnchorProvider","Wallet","KAMINO_PROGRAM_ID","KAMINO_MARKET_ID","LENDING_MARKET_AUTH_SEED","getLendingMarketAuthority","lendingMarket","programId","getGammaPoolDestinationCollateral","poolAddress","tokenMint","gammaId","getReservesForMarket","connection","marketAddress","kaminoProgram","provider","kamino","kamino_lending_default","market","reserves","reservesByLiquidity","reserve","reserveLiquidity","getReserveAccountsForWithdraw","pool","reserveA","reserveB","maxSharedTokenA","maxSharedTokenB","gammaProgram","programIds","pubkey","accounts","getAccountsForReserve","lendingMarketAuthority","gammaDestination","CpmmModule","ModuleBase","params","poolId","fetchConfigInfo","poolIds","partner","partnerIds","id","getPdaPoolPartners","PublicKey","poolInfos","partnerInfos","returnData","i","pool","partners","token0","token1","lp","poolInfo","partnerInfo","_a","_b","lpTokensLinked","info","BN","lpToTradingToken","ConstantProductCurve","observationIds","getPdaObservationId","accounts","observations","needFetchConfigId","rpc","observationAccount","configInfo","configIds","configs","configItemInfo","baseReserve","quoteReserve","decimal_default","pools","mintInfos","acc","cur","_c","_d","mintA","mintB","getPdaPoolAuthority","toGammaApiToken","toFeeConfig","rpcData","partnerKeys","res","r","index","fetchMultipleMintInfos","mockPoolStats","p","programId","poolFeeAccount","startTime","maxTradeFeeRate","volatilityFactor","ownerInfo","associatedOnly","checkCreateATAOwner","txVersion","feeConfig","computeBudgetConfig","payer","isFront","mintAAmount","mintBAmount","mintAUseSOLBalance","NATIVE_MINT","mintBUseSOLBalance","mintAPubkey","mintBPubkey","txBuilder","userVaultA","userVaultAInstruction","userVaultB","userVaultBInstruction","poolKeys","getCreatePoolKeys","makeCreateCpmmPoolInInstruction","TOKEN_PROGRAM_ID","InstructionType","propPoolKeys","inputAmount","baseSpecified","slippage","computeResult","config","account","bypassAssociatedCheck","rpcPoolData","liquidity","inputAmountFee","_anotherAmount","Percent","anotherAmount","tokenAccountA","_tokenAccountAInstruction","tokenAccountB","_tokenAccountBInstruction","userLiquidityPda","getPdaUserLiquidity","a","makeInitUserPoolLiquidityInstruction","_slippage","makeDepositCpmmInInstruction","builder","_e","lpAmount","tokenAReserve","tokenBReserve","getReservesForMarket","kaminoAccounts","getReserveAccountsForWithdraw","amountMintA","amountMintB","epochInfo","mintAAmountFee","mintBAmountFee","getTransferAmountFeeV2","WSOLMint","_ownerTokenAccountA","accountAInstructions","_ownerTokenAccountB","accountBInstructions","makeWithdrawCpmmInInstruction","zeroForOne","baseIn","swapResult","wrapSol","mintATokenAcc","mintATokenAccInstruction","mintBTokenAcc","mintBTokenAccInstruction","inputMint","SOL_INFO","SystemProgram","createSyncNativeInstruction","makeSwapCpmmBaseInInstruction","makeSwapCpmmBaseOutInstruction","makeSwapCpmmOracleBaseInInstruction","amount","observationState","inputToken","outputToken","inputTokenReserves","outputTokenReserves","inputDecimals","outputDecimals","CurveCalculator","currentPrice","numerator","denominator","executionPrice","otherAmountThreshold","_f","_g","_h","_i","_j","_k","_l","coefficient","_inputAmountWithoutFee","input","anotherAmountFee","BN_ZERO","lpAmountData","lpToAmount","slippageAdjustedAmount","partnerKey","name","token0TokenAccount","token1TokenAccount","keys","tokenAccount0","tokenAccount1","makeInitializePartnerInstruction","makeAddPartnerInstruction","addresses","poolAmountA","poolAmountB","supply","amountA","amountB","PublicKey","MintLayout","TOKEN_2022_PROGRAM_ID","TOKEN_PROGRAM_ID","TokenModule","ModuleBase","params","forceUpdate","jup","SOL_INFO","token","TOKEN_2022_PROGRAM_ID","TOKEN_PROGRAM_ID","_a","data","mint","mintStr","info","apiTokenInfo","onlineInfo","PublicKey","MintLayout","mintSymbol","fullInfo","AnchorProvider","Program","Wallet","GfxCpmmClient","config","connection","cluster","owner","api","defaultChainTime","defaultChainTimeOffset","apiCacheTime","blockhashCommitment","Owner","Program","gamma_default","AnchorProvider","Wallet","Keypair","createLogger","Account","TokenModule","CpmmModule","now","custom","merge","apiRequestTimeout","logCount","logRequests","urlConfigs","Api","client","EMPTY_OWNER","EMPTY_CONNECTION","signAllTransactions","time","forceUpdate","prevFetched","jupList","e","_a","CpmmCoder","BN","D9","BN","D9_SQUARED","OracleBasedCurveCalculator","tokenAmount0","tokenAmount1","CurveCalculator","sourceAmount","zeroForOne","baseReserve","quoteReserve","tradeFeeRate","observationState","poolState","isInvokedWithSignedSegmenter","swapSourceAmount","swapDestinationAmount","oraclePriceUpdatedAt","blockTimestamp","saturatingSub","spotPrice","oraclePrice","amountToBeSwappedAtOraclePrice","amountToBeSwappedWithInvariantCurve","dynamicFeeRate","DynamicFee","oracleSwapFeeRate","oracleSwapTradeFees","checkedCeilDiv","FEE_RATE_DENOMINATOR_VALUE","oracleSwapSourceAmountAfterFees","outputTokensFromOracleSwap","newSwapSourceAmount","newSwapDestinationAmount","invariantSwapTradeFees","sourceAmountAfterFees","outputTokensFromInvariantSwap","ConstantProductCurve","destinationAmountSwapped","sourceAmountToBeSwapped","maxAmountSwappableAtOraclePrice","priceDifferenceLimit","spotPriceAtAcceptablePriceDifferenceLimit","numerator","denominator","maxSwappableWithoutExceedingPriceDifference","min","pricePremiumForOracleSwaps","premium","unionArr","arr"]}