@cobaltx/sdk-v2
Version:
An SDK for building applications on top of CobaltX.
1 lines • 997 kB
Source Map (JSON)
{"version":3,"sources":["../../../src/common/accountInfo.ts","../../../src/common/logger.ts","../../../src/common/bignumber.ts","../../../../../node_modules/decimal.js/decimal.mjs","../../../src/module/amount.ts","../../../src/module/formatter.ts","../../../src/module/fraction.ts","../../../src/common/constant.ts","../../../src/cobaltx/token/constant.ts","../../../src/config.ts","../../../src/module/token.ts","../../../src/common/pubKey.ts","../../../src/module/percent.ts","../../../src/module/price.ts","../../../src/common/utility.ts","../../../src/common/lodash.ts","../../../src/common/pda.ts","../../../src/common/txTool/txUtils.ts","../../../src/common/txTool/txType.ts","../../../src/common/programId.ts","../../../src/common/transfer.ts","../../../src/common/txTool/lookupTable.ts","../../../src/common/txTool/txTool.ts","../../../src/cobaltx/tradeV2/trade.ts","../../../src/marshmallow/index.ts","../../../src/marshmallow/buffer-layout.ts","../../../src/cobaltx/account/instruction.ts","../../../src/cobaltx/account/layout.ts","../../../src/cobaltx/account/util.ts","../../../src/cobaltx/clmm/clmm.ts","../../../src/cobaltx/token/layout.ts","../../../src/cobaltx/token/utils.ts","../../../src/cobaltx/clmm/instrument.ts","../../../src/cobaltx/clmm/utils/tick.ts","../../../src/cobaltx/clmm/utils/constants.ts","../../../src/cobaltx/clmm/utils/math.ts","../../../src/cobaltx/clmm/utils/util.ts","../../../src/cobaltx/clmm/utils/pda.ts","../../../src/cobaltx/clmm/utils/pool.ts","../../../src/cobaltx/clmm/utils/position.ts","../../../src/cobaltx/clmm/utils/tickQuery.ts","../../../src/cobaltx/clmm/utils/tickarrayBitmap.ts","../../../src/cobaltx/clmm/layout.ts","../../../src/cobaltx/cpmm/layout.ts","../../../src/cobaltx/cpmm/instruction.ts","../../../src/cobaltx/cpmm/pda.ts","../../../src/cobaltx/cpmm/curve/calculator.ts","../../../src/cobaltx/cpmm/curve/constantProduct.ts","../../../src/cobaltx/cpmm/curve/fee.ts","../../../src/cobaltx/liquidity/constant.ts","../../../src/cobaltx/liquidity/layout.ts","../../../src/cobaltx/liquidity/utils.ts","../../../src/cobaltx/liquidity/instruction.ts","../../../src/cobaltx/liquidity/stable.ts","../../../src/cobaltx/liquidity/serum.ts","../../../src/cobaltx/serum/id.ts","../../../src/cobaltx/serum/layout.ts","../../../src/cobaltx/serum/serum.ts","../../../src/cobaltx/tradeV2/instrument.ts"],"sourcesContent":["import { MINT_SIZE, TOKEN_PROGRAM_ID, getTransferFeeConfig, unpackMint } from \"@solana/spl-token\";\nimport { AccountInfo, Commitment, Connection, PublicKey } from \"@solana/web3.js\";\nimport { ReturnTypeFetchMultipleMintInfos } from \"../cobaltx/type\";\nimport { chunkArray, getMintAddresses, solToWSol } from \"./\";\nimport { createLogger } from \"./logger\";\nimport { NetworkName } from \"@/config\";\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(\"CobaltX_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 network,\n config,\n}: {\n connection: Connection;\n mints: PublicKey[];\n network: NetworkName;\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, network) })),\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[getMintAddresses(network).WSOLMint.toBase58()];\n\n return mintK;\n}\n","import { get, set } from \"lodash\";\n\nexport type ModuleName = \"Common.Api\";\n\nexport enum LogLevel {\n Error,\n Warning,\n Info,\n Debug,\n}\nexport class Logger {\n private logLevel: LogLevel;\n private name: string;\n constructor(params: { name: string; logLevel?: LogLevel }) {\n this.logLevel = params.logLevel !== undefined ? params.logLevel : LogLevel.Error;\n this.name = params.name;\n }\n\n set level(logLevel: LogLevel) {\n this.logLevel = logLevel;\n }\n get time(): string {\n return Date.now().toString();\n }\n get moduleName(): string {\n return this.name;\n }\n\n private isLogLevel(level: LogLevel): boolean {\n return level <= this.logLevel;\n }\n\n public error(...props): Logger {\n if (!this.isLogLevel(LogLevel.Error)) return this;\n console.error(this.time, this.name, \"sdk logger error\", ...props);\n return this;\n }\n\n public logWithError(...props): Logger {\n // this.error(...props)\n const msg = props.map((arg) => (typeof arg === \"object\" ? JSON.stringify(arg) : arg)).join(\", \");\n throw new Error(msg);\n }\n\n public warning(...props): Logger {\n if (!this.isLogLevel(LogLevel.Warning)) return this;\n console.warn(this.time, this.name, \"sdk logger warning\", ...props);\n return this;\n }\n\n public info(...props): Logger {\n if (!this.isLogLevel(LogLevel.Info)) return this;\n console.info(this.time, this.name, \"sdk logger info\", ...props);\n return this;\n }\n\n public debug(...props): Logger {\n if (!this.isLogLevel(LogLevel.Debug)) return this;\n console.debug(this.time, this.name, \"sdk logger debug\", ...props);\n return this;\n }\n}\n\nconst moduleLoggers: { [key in ModuleName]?: Logger } = {};\nconst moduleLevels: { [key in ModuleName]?: LogLevel } = {};\n\nexport function createLogger(moduleName: string): Logger {\n let logger = get(moduleLoggers, moduleName);\n if (!logger) {\n // default level is error\n const logLevel = get(moduleLevels, moduleName);\n\n logger = new Logger({ name: moduleName, logLevel });\n set(moduleLoggers, moduleName, logger);\n }\n\n return logger;\n}\n\nexport function setLoggerLevel(moduleName: string, level: LogLevel): void {\n set(moduleLevels, moduleName, level);\n\n const logger = get(moduleLoggers, moduleName);\n if (logger) logger.level = level;\n}\n","import BN from \"bn.js\";\nimport Decimal from \"decimal.js\";\nimport { SplToken, TokenJson } from \"../cobaltx/token/type\";\nimport { ReplaceType } from \"../cobaltx/type\";\nimport { CurrencyAmount, TokenAmount } from \"../module/amount\";\nimport { Currency } from \"../module/currency\";\nimport { Fraction } from \"../module/fraction\";\nimport { Percent } from \"../module/percent\";\nimport { Price } from \"../module/price\";\nimport { Token } from \"../module/token\";\nimport { parseBigNumberish } from \"./constant\";\nimport { mul } from \"./fractionUtil\";\nimport { notInnerObject } from \"./utility\";\n\nexport const BN_ZERO = new BN(0);\nexport const BN_ONE = new BN(1);\nexport const BN_TWO = new BN(2);\nexport const BN_THREE = new BN(3);\nexport const BN_FIVE = new BN(5);\nexport const BN_TEN = new BN(10);\nexport const BN_100 = new BN(100);\nexport const BN_1000 = new BN(1000);\nexport const BN_10000 = new BN(10000);\nexport type BigNumberish = BN | string | number | bigint;\nexport type Numberish = number | string | bigint | Fraction | BN;\n\nexport function tenExponential(shift: BigNumberish): BN {\n return BN_TEN.pow(parseBigNumberish(shift));\n}\n\n/**\n *\n * @example\n * getIntInfo(0.34) => { numerator: '34', denominator: '100'}\n * getIntInfo('0.34') //=> { numerator: '34', denominator: '100'}\n */\nexport function parseNumberInfo(n: Numberish | undefined): {\n denominator: string;\n numerator: string;\n sign?: string;\n int?: string;\n dec?: string;\n} {\n if (n === undefined) return { denominator: \"1\", numerator: \"0\" };\n if (n instanceof BN) {\n return { numerator: n.toString(), denominator: \"1\" };\n }\n\n if (n instanceof Fraction) {\n return { denominator: n.denominator.toString(), numerator: n.numerator.toString() };\n }\n\n const s = String(n);\n const [, sign = \"\", int = \"\", dec = \"\"] = s.replace(\",\", \"\").match(/(-?)(\\d*)\\.?(\\d*)/) ?? [];\n const denominator = \"1\" + \"0\".repeat(dec.length);\n const numerator = sign + (int === \"0\" ? \"\" : int) + dec || \"0\";\n return { denominator, numerator, sign, int, dec };\n}\n\n// round up\nexport function divCeil(a: BN, b: BN): BN {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n const dm = a.divmod(b);\n\n // Fast case - exact division\n if (dm.mod.isZero()) return dm.div;\n\n // Round up\n return dm.div.isNeg() ? dm.div.isubn(1) : dm.div.iaddn(1);\n}\n\nexport function shakeFractionDecimal(n: Fraction): string {\n const [, sign = \"\", int = \"\"] = n.toFixed(2).match(/(-?)(\\d*)\\.?(\\d*)/) ?? [];\n return `${sign}${int}`;\n}\n\nexport function toBN(n: Numberish, decimal: BigNumberish = 0): BN {\n if (n instanceof BN) return n;\n return new BN(shakeFractionDecimal(toFraction(n).mul(BN_TEN.pow(new BN(String(decimal))))));\n}\n\nexport function toFraction(value: Numberish): Fraction {\n // to complete math format(may have decimal), not int\n if (value instanceof Percent) return new Fraction(value.numerator, value.denominator);\n\n if (value instanceof Price) return value.adjusted;\n\n // to complete math format(may have decimal), not BN\n if (value instanceof TokenAmount)\n try {\n return toFraction(value.toExact());\n } catch {\n return new Fraction(BN_ZERO);\n }\n\n // do not ideal with other fraction value\n if (value instanceof Fraction) return value;\n\n // wrap to Fraction\n const n = String(value);\n const details = parseNumberInfo(n);\n return new Fraction(details.numerator, details.denominator);\n}\n\n/**\n * @example\n * toPercent(3.14) // => Percent { 314.00% }\n * toPercent(3.14, { alreadyDecimaled: true }) // => Percent {3.14%}\n */\nexport function toPercent(\n n: Numberish,\n options?: { /* usually used for backend data */ alreadyDecimaled?: boolean },\n): Percent {\n const { numerator, denominator } = parseNumberInfo(n);\n return new Percent(new BN(numerator), new BN(denominator).mul(options?.alreadyDecimaled ? new BN(100) : new BN(1)));\n}\n\nexport function toTokenPrice(params: {\n token: TokenJson | Token | SplToken;\n numberPrice: Numberish;\n decimalDone?: boolean;\n}): Price {\n const { token, numberPrice, decimalDone } = params;\n const usdCurrency = new Token({ mint: \"\", decimals: 6, symbol: \"usd\", name: \"usd\", skipMint: true });\n const { numerator, denominator } = parseNumberInfo(numberPrice);\n const parsedNumerator = decimalDone ? new BN(numerator).mul(BN_TEN.pow(new BN(token.decimals))) : numerator;\n const parsedDenominator = new BN(denominator).mul(BN_TEN.pow(new BN(usdCurrency.decimals)));\n\n return new Price({\n baseToken: usdCurrency,\n denominator: parsedDenominator.toString(),\n quoteToken: new Token({ ...token, skipMint: true, mint: \"\" }),\n numerator: parsedNumerator.toString(),\n });\n}\n\nexport function toUsdCurrency(amount: Numberish): CurrencyAmount {\n const usdCurrency = new Currency({ decimals: 6, symbol: \"usd\", name: \"usd\" });\n const amountBigNumber = toBN(mul(amount, 10 ** usdCurrency.decimals)!);\n return new CurrencyAmount(usdCurrency, amountBigNumber);\n}\n\nexport function toTotalPrice(amount: Numberish | undefined, price: Price | undefined): CurrencyAmount {\n if (!price || !amount) return toUsdCurrency(0);\n return toUsdCurrency(mul(amount, price)!);\n}\n\nexport function decimalToFraction(n: Decimal | undefined): Fraction | undefined {\n if (n == null) return undefined;\n const { numerator, denominator } = parseNumberInfo(n.toString());\n return new Fraction(numerator, denominator);\n}\n\nexport function isDecimal(val: unknown): boolean {\n return val instanceof Decimal;\n}\n\nexport function recursivelyDecimalToFraction<T>(info: T): ReplaceType<T, Decimal, Fraction> {\n // @ts-expect-error no need type for inner code\n return isDecimal(info)\n ? decimalToFraction(info as any)\n : Array.isArray(info)\n ? info.map((k) => recursivelyDecimalToFraction(k))\n : notInnerObject(info)\n ? Object.fromEntries(Object.entries(info as any).map(([k, v]) => [k, recursivelyDecimalToFraction(v)]))\n : info;\n}\n","/*!\r\n * decimal.js v10.5.0\r\n * An arbitrary-precision Decimal type for JavaScript.\r\n * https://github.com/MikeMcl/decimal.js\r\n * Copyright (c) 2025 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|bigint|Decimal}\r\n * max {number|string|bigint|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 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 // See https://github.com/MikeMcl/decimal.js/pull/217\r\n x = new Ctor(1).minus(x).div(x.plus(1)).sqrt().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 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|bigint|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|bigint|Decimal}\r\n *\r\nP.max = function () {\r\n Array.prototype.push.call(arguments, this);\r\n return maxOrMin(this.constructor, arguments, -1);\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|bigint|Decimal}\r\n *\r\nP.min = function () {\r\n Array.prototype.push.call(arguments, this);\r\n return maxOrMin(this.constructor, arguments, 1);\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|bigint|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|bigint|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|bigint|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` (`n` is -1) and `min` (`n` is 1).\r\n */\r\nfunction maxOrMin(Ctor, args, n) {\r\n var k, 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\r\n // NaN?\r\n if (!y.s) {\r\n x = y;\r\n break;\r\n }\r\n\r\n k = x.cmp(y);\r\n\r\n if (k === n || k === 0 && x.s === n) {\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 // TODO BigInt str: no need to check for decimal point, exponential form or leading zeros.\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|bigint|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|bigint|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|bigint|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|bigint|Decimal}\r\n * y {number|string|bigint|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|bigint|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|bigint|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|bigint|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|bigint|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|bigint|Decimal} The y-coordinate.\r\n * x {number|string|bigint|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|bigint|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|bigint|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|bigint|Decimal}\r\n * min {number|string|bigint|Decimal}\r\n * max {number|string|bigint|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|bigint|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|bigint|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|bigint|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 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\r\n // Infinity or NaN?\r\n 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\r\n if (t === 'string') {\r\n if ((i = v.charCodeAt(0)) === 45) { // minus sign\r\n v = v.slice(1);\r\n x.s = -1;\r\n } else {\r\n if (i === 43) v = v.slice(1); // plus sign\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 if (t === 'bigint') {\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 return parseDecimal(x, v.toString());\r\n }\r\n\r\n throw Error(invalidArgument + 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|bigint|Decimal}\r\n * y {number|string|bigint|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|bigint|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|bigint|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|bigint|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|bigint|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|bigint|Decimal} The argument of the logarithm.\r\n * y {number|string|bigint|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|bigint|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|bigint|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|bigint|Decimal}\r\n *\r\n */\r\nfunction max() {\r\n return maxOrMin(this, arguments, -1);\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|bigint|Decimal}\r\n *\r\n */\r\nfunction min() {\r\n return maxOrMin(this, arguments, 1);\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|bigint|Decimal}\r\n * y {number|string|bigint|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|bigint|Decimal}\r\n * y {number|string|bigint|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|bigint|Decimal} The base.\r\n * y {number|string|bigint|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|bigint|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|bigint|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|bigint|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|bigint|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|bigint|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|bigint|Decimal}\r\n * y {number|string|bigint|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|bigint|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|bigint|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|bigint|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|bigint|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 _Big from \"big.js\";\nimport BN from \"bn.js\";\n\nimport { BigNumberish, BN_TEN } from \"../common/bignumber\";\nimport { createLogger, Logger } from \"../common/logger\";\n\nimport { parseBigNumberish, Rounding } from \"../common\";\nimport { Currency } from \"./currency\";\nimport toFormat, { WrappedBig } from \"./formatter\";\nimport { Fraction } from \"./fraction\";\nimport { Token } from \"./token\";\nimport { NetworkName } from \"@/config\";\n\nconst logger = createLogger(\"CobaltX_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 public constructor(token: Token, amount: BigNumberish, isRaw = true, name?: string) {\n let parsedAmount = new BN(0);\n const multiplier = BN_TEN.pow(new BN(token.decimals));\n\n if (isRaw) {\n parsedAmount = parseBigNumberish(amount);\n } else {\n let integralAmount = new BN(0);\n let fractionalAmount = new BN(0);\n\n // parse fractional string\n if (typeof amount === \"string\" || typeof amount === \"number\" || typeof amount === \"bigint\") {\n const [integral, fractional] = splitNumber(amount.toString(), token.decimals);\n integralAmount = parseBigNumberish(integral);\n fractionalAmount = parseBigNumberish(fractional);\n }\n\n integralAmount = integralAmount.mul(multiplier);\n parsedAmount = integralAmount.add(fractionalAmount);\n }\n\n super(parsedAmount, multiplier);\n this.logger = createLogger(name || \"TokenAmount\");\n this.token = token;\n }\n\n public get raw(): BN {\n return this.numerator;\n }\n public isZero(): boolean {\n return this.raw.isZero();\n }\n public gt(other: TokenAmount): boolean {\n if (!this.token.equals(other.token)) this.logger.logWithError(\"gt token not equals\");\n return this.raw.gt(other.raw);\n }\n\n /**\n * a less than b\n */\n public lt(other: TokenAmount): boolean {\n if (!this.token.equals(other.token)) this.logger.logWithError(\"lt token not equals\");\n return this.raw.lt(other.raw);\n }\n\n public add(other: TokenAmount): TokenAmount {\n if (!this.token.equals(other.token)) this.logger.logWithError(\"add token not equals\");\n return new TokenAmount(this.token, this.raw.add(other.raw));\n }\n\n public subtract(other: TokenAmount): TokenAmount {\n if (!this.token.equals(other.token)) this.logger.logWithError(\"sub token not equals\");\n return new TokenAmount(this.token, this.raw.sub(other.raw));\n }\n\n public toSignificant(\n significantDigits = this.token.decimals,\n format?: object,\n rounding: Rounding = Rounding.ROUND_DOWN,\n ): string {\n return super.toSignificant(significantDigits, format, rounding);\n }\n\n /**\n * To fixed\n *\n * @example\n * ```\n * 1 -> 1.000000000\n * 1.234 -> 1.234000000\n * 1.123456789876543 -> 1.123456789\n * ```\n */\n public toFixed(\n decimalPlaces = this.token.decimals,\n format?: object,\n rounding: Rounding = Rounding.ROUND_DOWN,\n ): string {\n if (decimalPlaces > this.token.decimals) this.logger.logWithError(\"decimals overflow\");\n return super.toFixed(decimalPlaces, format, rounding);\n }\n\n /**\n * To exact\n *\n * @example\n * ```\n * 1 -> 1\n * 1.234 -> 1.234\n * 1.123456789876543 -> 1.123456789\n * ```\n */\n public toExact(format: object = { groupSeparator: \"\" }): string {\n Big.DP = this.token.decimals;\n return new Big(this.numerator.toString()).div(this.denominator.toString()).toFormat(format);\n }\n}\n\nexport class CurrencyAmount extends Fraction {\n public readonly currency: Currency;\n protected logger: Logger;\n\n public constructor(currency: Currency, amount: BigNumberish, isRaw = true, name?: string) {\n let parsedAmount = new BN(0);\n const multiplier = BN_TEN.pow(new BN(currency.decimals));\n\n if (isRaw) {\n parsedAmount = parseBigNumberish(amount);\n } else {\n let integralAmount = new BN(0);\n let fractionalAmount = new BN(0);\n\n // parse fractional string\n if (typeof amount === \"string\" || typeof amount === \"number\" || typeof amount === \"bigint\") {\n const [integral, fractional] = splitNumber(amount.toString(), currency.decimals);\n integralAmount = parseBigNumberish(integral);\n fractionalAmount = parseBigNumberish(fractional);\n }\n\n integralAmount = integralAmount.mul(multiplier);\n parsedAmount = integralAmount.add(fractionalAmount);\n }\n\n super(parsedAmount, multiplier);\n this.logger = createLogger(name || \"TokenAmount\");\n this.currency = currency;\n }\n\n public get raw(): BN {\n return this.numerator;\n }\n\n public isZero(): boolean {\n return this.raw.isZero();\n }\n\n /**\n * a greater than b\n */\n public gt(other: CurrencyAmount): boolean {\n if (!this.currency.equals(other.currency)) this.logger.logWithError(\"gt currency not equals\");\n return this.raw.gt(other.raw);\n }\n\n /**\n * a less than b\n */\n public lt(other: CurrencyAmount): boolean {\n if (!this.currency.equals(other.currency)) this.logger.logWithError(\"lt currency not equals\");\n return this.raw.lt(other.raw);\n }\n\n public add(other: CurrencyAmount): CurrencyAmount {\n if (!this.currency.equals(other.currency)) this.logger.logWithError(\"add currency not equals\");\n return new CurrencyAmount(this.currency, this.raw.add(other.raw));\n }\n\n public sub(other: CurrencyAmount): CurrencyAmount {\n if (!this.currency.equals(other.currency)) this.logger.logWithError(\"sub currency not equals\");\n return new CurrencyAmount(this.currency, this.raw.sub(other.raw));\n }\n\n public toSignificant(\n significantDigits = this.currency.decimals,\n format?: object,\n rounding: Rounding = Rounding.ROUND_DOWN,\n ): string {\n return super.toSignificant(significantDigits, format, rounding);\n }\n\n /**\n * To fixed\n *\n * @example\n * ```\n * 1 -> 1.000000000\n * 1.234 -> 1.234000000\n * 1.123456789876543 -> 1.123456789\n * ```\n */\n public toFixed(\n decimalPlaces = this.currency.decimals,\n format?: object,\n rounding: Rounding = Rounding.ROUND_DOWN,\n ): string {\n if (decimalPlaces > this.currency.decimals) this.logger.logWithError(\"decimals overflow\");\n\n return super.toFixed(decimalPlaces, format, rounding);\n }\n\n /**\n * To exact\n *\n * @example\n * ```\n * 1 -> 1\n * 1.234 -> 1.234\n * 1.123456789876543 -> 1.123456789\n * ```\n */\n public toExact(format: object = { groupSeparator: \"\" }): string {\n Big.DP = this.currency.decimals;\n return new Big(this.numerator.toString()).div(this.denominator.toString()).toFormat(format);\n }\n}\n","import Big, { BigConstructor, BigSource, RoundingMode } from \"big.js\";\nimport Decimal, { Config, Numeric } from \"decimal.js-light\";\nimport _toFarmat from \"toformat\";\n\ntype TakeStatic<T> = { [P in keyof T]: T[P] };\ninterface FormatOptions {\n decimalSeparator?: string;\n groupSeparator?: string;\n groupSize?: number;\n fractionGroupSeparator?: string;\n fractionGroupSize?: number;\n}\ninterface WrappedBigConstructor extends TakeStatic<BigConstructor> {\n new (value: BigSource): WrappedBig;\n (value: BigSource): WrappedBig;\n (): WrappedBigConstructor;\n\n format: FormatOptions;\n}\nexport interface WrappedBig extends Big {\n add(n: BigSource): WrappedBig;\n abs(): WrappedBig;\n div(n: BigSource): WrappedBig;\n minus(n: BigSource): WrappedBig;\n mod(n: BigSource): WrappedBig;\n mul(n: BigSource): WrappedBig;\n plus(n: BigSource): WrappedBig;\n pow(exp: number): WrappedBig;\n round(dp?: number, rm?: RoundingMode): WrappedBig;\n sqrt(): WrappedBig;\n sub(n: BigSource): WrappedBig;\n times(n: BigSource): WrappedBig;\n toFormat(): string;\n toFormat(options: FormatOptions): string;\n toFormat(fractionLength: number): string;\n toFormat(fractionLength: number, options: FormatOptions): string;\n toFormat(fractionLength: number, missionUnknown: number): string;\n toFormat(fractionLength: number, missionUnknown: number, options: FormatOptions): string;\n}\n\ntype DecimalConstructor = typeof Decimal;\ninterface WrappedDecimalConstructor extends TakeStatic<DecimalConstructor> {\n new (value: Numeric): WrappedDecimal;\n clone(config?: Config): WrappedDecimalConstructor;\n config(config: Config): WrappedDecimal;\n set(config: Config): WrappedDecimal;\n format: FormatOptions;\n}\nexport interface WrappedDecimal extends Decimal {\n absoluteValue(): WrappedDecimal;\n abs(): WrappedDecimal;\n dividedBy(y: Numeric): WrappedDecimal;\n div(y: Numeric): WrappedDecimal;\n dividedToIntegerBy(y: Numeric): WrappedDecimal;\n idiv(y: Numeric): WrappedDecimal;\n logarithm(base?: Numeric): WrappedDecimal;\n log(base?: Numeric): WrappedDecimal;\n minus(y: Numeric): WrappedDecimal;\n sub(y: Numeric): WrappedDecimal;\n modulo(y: Numeric): WrappedDecimal;\n mod(y: Numeric): WrappedDecimal;\n naturalExponetial(): WrappedDecimal;\n exp(): WrappedDecimal;\n naturalLogarithm(): WrappedDecimal;\n ln(): WrappedDecimal;\n negated(): WrappedDecimal;\n neg(): WrappedDecimal;\n plus(y: Numeric): WrappedDecimal;\n add(y: Numeric): WrappedDecimal;\n squareRoot(): WrappedDecimal;\n sqrt(): WrappedDecimal;\n times(y: Numeric): WrappedDecimal;\n mul(y: Numeric): WrappedDecimal;\n toWrappedDecimalPlaces(dp?: number, rm?: number): WrappedDecimal;\n todp(dp?: number, rm?: number): WrappedDecimal;\n toInteger(): WrappedDecimal;\n toint(): WrappedDecimal;\n toPower(y: Numeric): WrappedDecimal;\n pow(y: Numeric): WrappedDecimal;\n toSignificantDigits(sd?: number, rm?: number): WrappedDecimal;\n tosd(sd?: number, rm?: number): WrappedDecimal;\n toFormat(options: FormatOptions): string;\n toFormat(fractionLength: number): string;\n toFormat(fractionLength: number, options: FormatOptions): string;\n toFormat(fractionLength: number, missionUnknown: number): string;\n toFormat(fractionLength: number, missionUnknown: number, options: FormatOptions): string;\n}\n\nconst toFormat: {\n (fn: BigConstructor): WrappedBigConstructor;\n (fn: DecimalConstructor): WrappedDecimalConstructor;\n} = _toFarmat;\nexport default toFormat;\n","import _Big from \"big.js\";\nimport BN from \"bn.js\";\nimport _Decimal from \"decimal.js-light\";\n\nimport { BigNumberish } from \"../common/bignumber\";\nimport { createLogger } from \"../common/logger\";\n\nimport { parseBigNumberish, Rounding } from \"../common/constant\";\nimport toFormat, { WrappedBig } from \"./formatter\";\n\nconst logger = createLogger(\"module/fraction\");\n\nconst Big = toFormat(_Big);\ntype Big = WrappedBig;\n\nconst Decimal = toFormat(_Decimal);\n\nconst toSignificantRounding = {\n [Rounding.ROUND_DOWN]: Decimal.ROUND_DOWN,\n [Rounding.ROUND_HALF_UP]: Decimal.ROUND_HALF_UP,\n [Rounding.ROUND_UP]: Decimal.ROUND_UP,\n};\n\nconst toFixedRounding = {\n [Rounding.ROUND_DOWN]: _Big.roundDown,\n [Rounding.ROUND_HALF_UP]: _Big.roundHalfUp,\n [Rounding.ROUND_UP]: _Big.roundUp,\n};\n\nexport class Fraction {\n public readonly numerator: BN;\n public readonly denominator: BN;\n\n public constructor(numerator: BigNumberish, denominator: BigNumberish = new BN(1)) {\n this.numerator = parseBigNumberish(numerator);\n this.denominator = parseBigNumberish(denominator);\n }\n\n public get quotient(): BN {\n return this.numerator.div(this.denominator);\n }\n\n public invert(): Fraction {\n return new Fraction(this.denominator, this.numerator);\n }\n\n public add(other: Fraction | BigNumberish): Fraction {\n const otherParsed = other instanceof Fraction ? other : new Fraction(parseBigNumberish(other));\n\n if (this.denominator.eq(otherParsed.denominator)) {\n return new Fraction(this.numerator.add(otherParsed.numerator), this.denominator);\n }\n\n return new Fraction(\n this.numerator.mul(otherParsed.denominator).add(otherParsed.numerator.mul(this.denominator)),\n this.denominator.mul(otherParsed.denominator),\n );\n }\n\n public sub(other: Fraction | BigNumberish): Fraction {\n const otherParsed = other instanceof Fraction ? other : new Fraction(parseBigNumberish(other));\n\n if (this.denominator.eq(otherParsed.denominator)) {\n return new Fraction(this.numerator.sub(otherParsed.numerator), this.denominator);\n }\n\n return new Fraction(\n this.numerator.mul(otherParsed.denominator).sub(otherParsed.numerator.mul(this.denominator)),\n this.denominator.mul(otherParsed.denominator),\n );\n }\n\n public mul(other: Fraction | BigNumberish): Fraction {\n const otherParsed = other instanceof Fraction ? other : new Fraction(parseBigNumberish(other));\n\n return new Fraction(this.numerator.mul(otherParsed.numerator), this.denominator.mul(otherParsed.denominator));\n }\n\n public div(other: Fraction | BigNumberish): Fraction {\n const otherParsed = other instanceof Fraction ? other : new Fraction(parseBigNumberish(other));\n\n return new Fraction(this.numerator.mul(otherParsed.denominator), this.denominator.mul(otherParsed.numerator));\n }\n\n public toSignificant(\n significantDigits: number,\n format: object = { groupSeparator: \"\" },\n rounding: Rounding = Rounding.ROUND_HALF_UP,\n ): string {\n if (!Number.isInteger(significantDigits)) logger.logWithError(`${significantDigits} is not an integer.`);\n if (significantDigits <= 0) logger.logWithError(`${significantDigits} is not positive.`);\n\n Decimal.set({ precision: significantDigits + 1, rounding: toSignificantRounding[rounding] });\n const quotient = new Decimal(this.numerator.toString())\n .div(this.denominator.toString())\n .toSignificantDigits(significantDigits);\n return quotient.toFormat(quotient.decimalPlaces(), format);\n }\n\n public toFixed(\n decimalPlaces: number,\n format: object = { groupSeparator: \"\" },\n rounding: Rounding = Rounding.ROUND_HALF_UP,\n ): string {\n if (!Number.isInteger(decimalPlaces)) logger.logWithError(`${decimalPlaces} is not an integer.`);\n if (decimalPlaces < 0) logger.logWithError(`${decimalPlaces} is negative.`);\n\n Big.DP = decimalPlaces;\n Big.RM = toFixedRounding[rounding] || 1;\n return new Big(this.numerator.toString()).div(this.denominator.toString()).toFormat(decimalPlaces, format);\n }\n\n public isZero(): boolean {\n return this.numerator.isZero();\n }\n}\n","import BN from \"bn.js\";\nimport { BigNumberish } from \"./bignumber\";\nimport { createLogger } from \"./logger\";\n\nexport enum Rounding {\n ROUND_DOWN,\n ROUND_HALF_UP,\n ROUND_UP,\n}\n\nconst MAX_SAFE = 0x1fffffffffffff;\n\nexport function parseBigNumberish(value: BigNumberish): BN {\n const logger = createLogger(\"CobaltX_parseBigNumberish\");\n // BN\n if (value instanceof BN) {\n return value;\n }\n\n if (typeof value === \"string\") {\n if (value.match(/^-?[0-9]+$/)) {\n return new BN(value);\n }\n logger.logWithError(`invalid BigNumberish string: ${value}`);\n }\n\n if (typeof value === \"number\") {\n if (value % 1) {\n logger.logWithError(`BigNumberish number underflow: ${value}`);\n }\n\n if (value >= MAX_SAFE || value <= -MAX_SAFE) {\n logger.logWithError(`BigNumberish number overflow: ${value}`);\n }\n\n return new BN(String(value));\n }\n\n if (typeof value === \"bigint\") {\n return new BN(value.toString());\n }\n logger.error(`invalid BigNumberish value: ${value}`);\n return new BN(0); // never reach, because logWithError will throw error\n}\n","import { TOKEN_PROGRAM_ID } from \"@solana/spl-token\";\nimport { PublicKey } from \"@solana/web3.js\";\nimport { TokenInfo } from \"./type\";\nimport { NetworkName } from \"@/config\";\nimport { getNetworkConfig } from \"@/config\";\n\nexport function getSolInfo(network: NetworkName): TokenInfo {\n const config = getNetworkConfig(network);\n return {\n chainId: 101,\n address: PublicKey.default.toBase58(),\n programId: TOKEN_PROGRAM_ID.toBase58(),\n decimals: 9,\n symbol: config.NATIVE_TOKEN_SYMBOL,\n name: config.FULL_TOKEN_NAME,\n logoURI: config.GITHUB_LOGO_URL,\n tags: [],\n priority: 2,\n type: \"cobaltx\",\n extensions: {\n coingeckoId: \"solana\",\n },\n };\n}\n\nexport function getTokenWSol(network: NetworkName): TokenInfo {\n const config = getNetworkConfig(network);\n return {\n chainId: 101,\n address: config.WSOL_MINT_ADDRESS,\n programId: TOKEN_PROGRAM_ID.toBase58(),\n decimals: 9,\n symbol: config.WRAPPED_TOKEN_SYMBOL || \"\",\n name: config.FULL_TOKEN_NAME,\n logoURI: config.GITHUB_LOGO_URL,\n tags: [],\n priority: 2,\n type: \"cobaltx\",\n extensions: {\n coingeckoId: \"solana\",\n },\n};\n}\n","import { PublicKey } from \"@solana/web3.js\";\r\n\r\nexport enum NetworkName {\r\n sooneth = \"sooneth\",\r\n // sooneth_testnet = \"sooneth_testnet\",\r\n svmbnb = \"svmbnb\",\r\n svmbnb_testnet = \"svmbnb_testnet\",\r\n svmbase_testnet = \"svmbase_testnet\",\r\n soonbase_mainnet = \"soonbase_mainnet\",\r\n}\r\n\r\nexport interface NetworkConfig {\r\n SWAP_HOST: string;\r\n NATIVE_TOKEN_SYMBOL: string;\r\n BASE_HOST: string;\r\n OWNER_BASE_HOST: string;\r\n SERVICE_BASE_HOST: string;\r\n MONITOR_BASE_HOST: string;\r\n SERVICE_1_BASE_HOST: string;\r\n ANALYTICS_BASE_HOST: string;\r\n GITHUB_TOKEN_LIST_URL: string;\r\n WSOL_MINT_ADDRESS: string;\r\n GITHUB_LOGO_URL: string;\r\n LOOKUP_TABLE_CACHE: string; \r\n CLMM_PROGRAMM_ID: string;\r\n FULL_TOKEN_NAME: string;\r\n USDC_MINT_ADDRESS: string;\r\n USDT_MINT_ADDRESS: string;\r\n ETH_MINT_ADDRESS: string;\r\n BONK_MINT_ADDRESS?: string | undefined;\r\n SOL_MINT_ADDRESS?: string | undefined;\r\n WRAPPED_TOKEN_SYMBOL: string;\r\n WSOL_DECIMALS: number;\r\n INPUT_MINT_ADDRESS: string;\r\n OUTPUT_MINT_ADDRESS: string;\r\n POPULAR_TOKENS: {\r\n SOL?: string,\r\n ETH?: string,\r\n USDC?: string,\r\n USDT?: string,\r\n\r\n };\r\n}\r\n\r\nexport const NETWORK_CONFIG: Record<NetworkName, NetworkConfig> = {\r\n [NetworkName.sooneth]: {\r\n NATIVE_TOKEN_SYMBOL: \"ETH\",\r\n SWAP_HOST: \"https://trade-api.cobaltx.io\",\r\n BASE_HOST: \"https://api.cobaltx.io\",\r\n OWNER_BASE_HOST: \"https://api.cobaltx.io\",\r\n SERVICE_BASE_HOST: \"https://api.cobaltx.io\",\r\n MONITOR_BASE_HOST: \"https://api.cobaltx.io\",\r\n SERVICE_1_BASE_HOST: \"https://api.cobaltx.io\",\r\n ANALYTICS_BASE_HOST: \"https://api.cobaltx.io\",\r\n GITHUB_TOKEN_LIST_URL: \"https://raw.githubusercontent.com/cobaltx-io/tokens/main/tokens.json\",\r\n WSOL_MINT_ADDRESS: \"So11111111111111111111111111111111111111112\",\r\n GITHUB_LOGO_URL:\r\n \"https://raw.githubusercontent.com/cobaltx-io/tokens/main/logo/So11111111111111111111111111111111111111112.png\",\r\n LOOKUP_TABLE_CACHE: \"6fa5xTGwoYJPMLMXaQ4tQFKMoYvXuvsJFLigMJ9a5QeB\",\r\n CLMM_PROGRAMM_ID: \"2TnjBuwqyBB9to5jURagDT7jLmBPefGRiKL2yh1zPZ4V\",\r\n BONK_MINT_ADDRESS: \"71kRXzJMvSeArtXYNEWa8KAjpRJosdMQ7Dpgy5Jt5zfd\",\r\n SOL_MINT_ADDRESS: \"ERFzpDteGNo8LTDKW1WwVGrkRMmA2y9WZHXNHxMA6BSV\",\r\n USDC_MINT_ADDRESS: \"ExYxyorY2x3h8gLcuypnHFQV3F36rmMkQVn7HHV8mUy9\",\r\n USDT_MINT_ADDRESS: \"742wcXVzkhNuEePAot7L3GvPseh93pvYFPgyHLX8mUy9\",\r\n FULL_TOKEN_NAME: \"Wrapped Ethereum\",\r\n ETH_MINT_ADDRESS: \"71kRXzJMvSeArtXYNEWa8KAjpRJosdMQ7Dpgy5Jt5zfd\",\r\n WRAPPED_TOKEN_SYMBOL: \"WETH\",\r\n INPUT_MINT_ADDRESS: PublicKey.default.toString(),\r\n OUTPUT_MINT_ADDRESS: \"742wcXVzkhNuEePAot7L3GvPseh93pvYFPgyHLX8mUy9\",\r\n POPULAR_TOKENS: {\r\n SOL: PublicKey.default.toString(),\r\n ETH: \"71kRXzJMvSeArtXYNEWa8KAjpRJosdMQ7Dpgy5Jt5zfd\",\r\n USDC: \"ExYxyorY2x3h8gLcuypnHFQV3F36rmMkQVn7HHV8KjtA\",\r\n USDT: \"742wcXVzkhNuEePAot7L3GvPseh93pvYFPgyHLX8mUy9\",\r\n },\r\n WSOL_DECIMALS: 9,\r\n },\r\n [NetworkName.svmbnb]: {\r\n NATIVE_TOKEN_SYMBOL: \"BNB\",\r\n SWAP_HOST: \"https://trade-api.svmbnb.cobaltx.io\",\r\n BASE_HOST: \"https://api.svmbnb.cobaltx.io\",\r\n OWNER_BASE_HOST: \"https://api.svmbnb.cobaltx.io\",\r\n SERVICE_BASE_HOST: \"https://api.svmbnb.cobaltx.io\",\r\n MONITOR_BASE_HOST: \"https://api.svmbnb.cobaltx.io\",\r\n SERVICE_1_BASE_HOST: \"https://api.svmbnb.cobaltx.io\",\r\n ANALYTICS_BASE_HOST: \"https://api.svmbnb.cobaltx.io\",\r\n GITHUB_TOKEN_LIST_URL: \"https://raw.githubusercontent.com/cobaltx-io/svmbnb-tokens/main/tokens.json\",\r\n WSOL_MINT_ADDRESS: \"So11111111111111111111111111111111111111112\",\r\n GITHUB_LOGO_URL:\r\n \"https://raw.githubusercontent.com/cobaltx-io/svmbnb-tokens/main/logo/So11111111111111111111111111111111111111112.svg\",\r\n LOOKUP_TABLE_CACHE: \"GSR5XQGWhpzV9TTduBJR6qPNjYsepMQSGkpaqfrbrW9w\",\r\n CLMM_PROGRAMM_ID: \"6f1b3xyVZbnWMHXBjgW1KPwxmPAgXcRdrvKNn4Nmf1Cn\",\r\n ETH_MINT_ADDRESS: \"H3xpFH1yN5E1zFdAoBrC9Y7m7RfJUeQNLvkHi8kNf9Qu\",\r\n USDC_MINT_ADDRESS: \"5odzAHDpDETYhupMkc6kjiYen3K2nrf8oPmvqmsoNW4L\",\r\n USDT_MINT_ADDRESS: \"s8cRDxnp3VxjB6khRnGDdxv6QbCUPyY9Vn1bgSQQsnG\",\r\n SOL_MINT_ADDRESS: \"So11111111111111111111111111111111111111112\",\r\n FULL_TOKEN_NAME: \"Wrapped BNB\",\r\n WRAPPED_TOKEN_SYMBOL: \"WBNB\",\r\n INPUT_MINT_ADDRESS: PublicKey.default.toBase58(),\r\n OUTPUT_MINT_ADDRESS: \"ABoT7umUXnx8RtJTeRqKB6myebVjP2wdJGQuV23jVVH3\",\r\n POPULAR_TOKENS: {\r\n SOL: PublicKey.default.toString(),\r\n ETH: \"H3xpFH1yN5E1zFdAoBrC9Y7m7RfJUeQNLvkHi8kNf9Qu\",\r\n USDC: \"5odzAHDpDETYhupMkc6kjiYen3K2nrf8oPmvqmsoNW4L\",\r\n USDT: \"s8cRDxnp3VxjB6khRnGDdxv6QbCUPyY9Vn1bgSQQsnG\",\r\n },\r\n WSOL_DECIMALS: 9,\r\n },\r\n [NetworkName.svmbnb_testnet]: {\r\n NATIVE_TOKEN_SYMBOL: \"BNB\",\r\n SWAP_HOST: \"https://trade-api.svmbnb.cobaltx.io\",\r\n BASE_HOST: \"https://api.testnet.svmbnb.cobaltx.io\",\r\n OWNER_BASE_HOST: \"https://api.testnet.svmbnb.cobaltx.io\",\r\n SERVICE_BASE_HOST: \"https://api.testnet.svmbnb.cobaltx.io\",\r\n MONITOR_BASE_HOST: \"https://api.testnet.svmbnb.cobaltx.io\",\r\n SERVICE_1_BASE_HOST: \"https://api.testnet.svmbnb.cobaltx.io\",\r\n ANALYTICS_BASE_HOST: \"https://api.testnet.svmbnb.cobaltx.io\",\r\n GITHUB_TOKEN_LIST_URL: \"https://raw.githubusercontent.com/cobaltx-io/svmbnb-testnet-tokens/main/tokens.json\",\r\n WSOL_MINT_ADDRESS: \"So11111111111111111111111111111111111111112\",\r\n GITHUB_LOGO_URL:\r\n \"https://raw.githubusercontent.com/cobaltx-io/svmbnb-testnet-tokens/main/logo/So11111111111111111111111111111111111111112.svg\",\r\n LOOKUP_TABLE_CACHE: \"D79gSiTNV9pyLPJyscW5yZYwdPVDrtKsamL3ZfQi6JiM\",\r\n CLMM_PROGRAMM_ID: \"FgycD57kcCZsjpoTAi2u67GTPxm59bPEhycL2Lw1icm1\",\r\n ETH_MINT_ADDRESS: \"5aLr3sV4UNVcMB6CiA3PZTWbgVBRNyMdEp1s5LNfhR95\",\r\n USDC_MINT_ADDRESS: \"jrhUNRxEDpFmGV3sqaWyveS7bVtRQgtHsfBTCdjfMBw\",\r\n USDT_MINT_ADDRESS: \"Ex86C4gmdjvPRNrfyvsyejbjkP6RstNaBC5g3itZw2iv\",\r\n FULL_TOKEN_NAME: \"Wrapped BNB\",\r\n WRAPPED_TOKEN_SYMBOL: \"WBNB\",\r\n INPUT_MINT_ADDRESS: \"bnb\",\r\n OUTPUT_MINT_ADDRESS: \"jrhUNRxEDpFmGV3sqaWyveS7bVtRQgtHsfBTCdjfMBw\",\r\n POPULAR_TOKENS: {\r\n SOL: PublicKey.default.toString(),\r\n ETH: \"5aLr3sV4UNVcMB6CiA3PZTWbgVBRNyMdEp1s5LNfhR95\",\r\n USDC: \"jrhUNRxEDpFmGV3sqaWyveS7bVtRQgtHsfBTCdjfMBw\",\r\n USDT: \"Ex86C4gmdjvPRNrfyvsyejbjkP6RstNaBC5g3itZw2iv\",\r\n },\r\n WSOL_DECIMALS: 9,\r\n },\r\n [NetworkName.svmbase_testnet]: {\r\n NATIVE_TOKEN_SYMBOL: \"ETH\",\r\n SWAP_HOST: \"https://trade-api.testnet.svmbase.cobaltx.io\",\r\n BASE_HOST: \"https://api.testnet.svmbase.cobaltx.io\",\r\n OWNER_BASE_HOST: \"https://api.testnet.svmbase.cobaltx.io\",\r\n SERVICE_BASE_HOST: \"https://api.testnet.svmbase.cobaltx.io\",\r\n MONITOR_BASE_HOST: \"https://api.testnet.svmbase.cobaltx.io\",\r\n SERVICE_1_BASE_HOST: \"https://api.testnet.svmbase.cobaltx.io\",\r\n ANALYTICS_BASE_HOST: \"https://api.testnet.svmbase.cobaltx.io\",\r\n GITHUB_TOKEN_LIST_URL: \"https://raw.githubusercontent.com/cobaltx-io/svmbase-testnet-tokens/main/tokens.json\",\r\n WSOL_MINT_ADDRESS: \"So11111111111111111111111111111111111111112\",\r\n GITHUB_LOGO_URL:\r\n \"https://raw.githubusercontent.com/cobaltx-io/svmbase-testnet-tokens/main/logo/So11111111111111111111111111111111111111112.png\",\r\n LOOKUP_TABLE_CACHE: \"AyPMvNmUUY2jwZ75NxhkLYPraQGNk5DssVfP4TnMcPJF\",\r\n CLMM_PROGRAMM_ID: \"DnZnBqJKiGSYHUHYvkXAbQmkMbwrjfgo4orR7jWyMsik\",\r\n ETH_MINT_ADDRESS: \"71kRXzJMvSeArtXYNEWa8KAjpRJosdMQ7Dpgy5Jt5zfd\",\r\n USDC_MINT_ADDRESS: \"63tPXWPnYeZ9hA3dJsAY5RcQ8YbwEz8uZ5nKu3uFD1aK\",\r\n USDT_MINT_ADDRESS: \"4fyX7hSmPetQC2wRS3YVAhWeFzif7WStarKwTvCXrBtD\",\r\n FULL_TOKEN_NAME: \"Wrapped Ethereum\",\r\n WRAPPED_TOKEN_SYMBOL: \"WETH\",\r\n INPUT_MINT_ADDRESS: PublicKey.default.toString(),\r\n OUTPUT_MINT_ADDRESS: \"63tPXWPnYeZ9hA3dJsAY5RcQ8YbwEz8uZ5nKu3uFD1aK\",\r\n POPULAR_TOKENS: {\r\n SOL: PublicKey.default.toString(),\r\n ETH: \"So11111111111111111111111111111111111111112\",\r\n USDC: \"63tPXWPnYeZ9hA3dJsAY5RcQ8YbwEz8uZ5nKu3uFD1aK\",\r\n USDT: \"4fyX7hSmPetQC2wRS3YVAhWeFzif7WStarKwTvCXrBtD\",\r\n },\r\n WSOL_DECIMALS: 9,\r\n },\r\n [NetworkName.soonbase_mainnet]: {\r\n NATIVE_TOKEN_SYMBOL: \"ETH\",\r\n SWAP_HOST: \"https://trade-api.soonbase.cobaltx.io\",\r\n BASE_HOST: \"https://api.soonbase.cobaltx.io\",\r\n OWNER_BASE_HOST: \"https://api.soonbase.cobaltx.io\",\r\n SERVICE_BASE_HOST: \"https://api.soonbase.cobaltx.io\",\r\n MONITOR_BASE_HOST: \"https://api.soonbase.cobaltx.io\",\r\n SERVICE_1_BASE_HOST: \"https://api.soonbase.cobaltx.io\",\r\n ANALYTICS_BASE_HOST: \"https://api.soonbase.cobaltx.io\",\r\n GITHUB_TOKEN_LIST_URL: \"https://raw.githubusercontent.com/cobaltx-io/soonbase-tokens/main/tokens.json\",\r\n WSOL_MINT_ADDRESS: \"So11111111111111111111111111111111111111112\",\r\n GITHUB_LOGO_URL:\r\n \"https://raw.githubusercontent.com/cobaltx-io/soonbase-tokens/main/logo/So11111111111111111111111111111111111111112.png\",\r\n LOOKUP_TABLE_CACHE: \"FGRusuLycV6nhSPQc9VX55YjT6DCzJFc59mvTTarSTjK\",\r\n CLMM_PROGRAMM_ID: \"6f1b3xyVZbnWMHXBjgW1KPwxmPAgXcRdrvKNn4Nmf1Cn\",\r\n ETH_MINT_ADDRESS: \"71kRXzJMvSeArtXYNEWa8KAjpRJosdMQ7Dpgy5Jt5zfd\",\r\n USDC_MINT_ADDRESS: \"BoYN2f2gLQS4jpvMSV9dAZwfzKJiKGk4NPck5BjXfujo\",\r\n USDT_MINT_ADDRESS: \"J87bysZjwfS3n6KR21cwbdPZVJWNSFcXpWF5kiChAwQH\",\r\n FULL_TOKEN_NAME: \"Wrapped Ethereum\",\r\n WRAPPED_TOKEN_SYMBOL: \"WETH\",\r\n INPUT_MINT_ADDRESS: PublicKey.default.toString(),\r\n OUTPUT_MINT_ADDRESS: \"BoYN2f2gLQS4jpvMSV9dAZwfzKJiKGk4NPck5BjXfujo\",\r\n POPULAR_TOKENS: {\r\n SOL: PublicKey.default.toString(),\r\n ETH: \"FkvCG5DcuYCQ1BnPH4ZzTkCdk3VzutgyDAFBec4qAjhh\",\r\n USDC: \"BoYN2f2gLQS4jpvMSV9dAZwfzKJiKGk4NPck5BjXfujo\",\r\n USDT: \"J87bysZjwfS3n6KR21cwbdPZVJWNSFcXpWF5kiChAwQH\",\r\n },\r\n WSOL_DECIMALS: 9,\r\n },\r\n};\r\n\r\nexport const getNetworkConfig = (network: NetworkName): NetworkConfig => {\r\n return NETWORK_CONFIG[network];\r\n};\r\n\r\n\r\n","import { PublicKey } from \"@solana/web3.js\";\n\nimport { getNetworkConfig, NetworkName } from \"@/config\";\nimport { getTokenWSol } from \"../cobaltx/token/constant\";\nimport { PublicKeyish, SOLMint, validateAndParsePublicKey } from \"../common/pubKey\";\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 network?: NetworkName;\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 public readonly network?: NetworkName;\n public readonly mint: PublicKey;\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, network }: TokenProps) {\n if (mint === SOLMint.toBase58() || (mint instanceof PublicKey && SOLMint.equals(mint))&& network) {\n this.decimals = getTokenWSol(network as NetworkName).decimals;\n this.symbol = getTokenWSol(network as NetworkName).symbol;\n this.name = getTokenWSol(network as NetworkName).name;\n this.mint = new PublicKey(getTokenWSol(network as NetworkName).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 static getWSol(network: NetworkName): Token {\n return new Token({\n ...getTokenWSol(network),\n mint: getTokenWSol(network).address,\n });\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 { getNetworkConfig, NetworkName } from \"@/config\";\nimport { 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 network,\n}: {\n publicKey: PublicKeyish;\n transformSol?: boolean;\n network?: NetworkName;\n}): PublicKey {\n const publicKey = tryParsePublicKey(orgPubKey.toString());\n\n if (transformSol && network) {\n const { WSOLMint } = getMintAddresses(network);\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 } else if (publicKey instanceof PublicKey) {\n return publicKey;\n }\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;\nexport const SOLMint = PublicKey.default;\n\nexport function getMintAddresses(network: NetworkName) {\n const config = getNetworkConfig(network);\n return {\n USDCMint: new PublicKey(config.USDC_MINT_ADDRESS),\n USDTMint: new PublicKey(config.USDT_MINT_ADDRESS),\n WSOLMint: new PublicKey(config.WSOL_MINT_ADDRESS),\n ETHMint: new PublicKey(config.ETH_MINT_ADDRESS),\n BONK_Mint: config.BONK_MINT_ADDRESS ? new PublicKey(config.BONK_MINT_ADDRESS) : PublicKey.default,\n SOL_Mint: config.SOL_MINT_ADDRESS ? new PublicKey(config.SOL_MINT_ADDRESS) : PublicKey.default,\n INPUT_MINT: new PublicKey(config.INPUT_MINT_ADDRESS),\n OUTPUT_MINT: new PublicKey(config.OUTPUT_MINT_ADDRESS),\n };\n}\n\n\nexport function solToWSol(mint: PublicKeyish, network: NetworkName): PublicKey {\n return validateAndParsePublicKey({ publicKey: mint, transformSol: true, network });\n}\n","import BN from \"bn.js\";\nimport { Rounding } from \"../common\";\nimport { Fraction } from \"./fraction\";\n\nexport const _100_PERCENT = new Fraction(new BN(100));\n\nexport class Percent extends Fraction {\n public toSignificant(significantDigits = 5, format?: object, rounding?: Rounding): string {\n return this.mul(_100_PERCENT).toSignificant(significantDigits, format, rounding);\n }\n\n public toFixed(decimalPlaces = 2, format?: object, rounding?: Rounding): string {\n return this.mul(_100_PERCENT).toFixed(decimalPlaces, format, rounding);\n }\n}\n","import { Rounding } from \"../common\";\nimport { BigNumberish, tenExponential } from \"../common/bignumber\";\nimport { createLogger } from \"../common/logger\";\n\nimport { Fraction } from \"./fraction\";\nimport { Token } from \"./token\";\n\nconst logger = createLogger(\"CobaltX_price\");\n\ninterface PriceProps {\n baseToken: Token;\n denominator: BigNumberish;\n quoteToken: Token;\n numerator: BigNumberish;\n}\n\nexport class Price extends Fraction {\n public readonly baseToken: Token; // input i.e. denominator\n public readonly quoteToken: Token; // output i.e. numerator\n // used to adjust the raw fraction w/r/t the decimals of the {base,quote}Token\n public readonly scalar: Fraction;\n\n // denominator and numerator _must_ be raw, i.e. in the native representation\n public constructor(params: PriceProps) {\n const { baseToken, quoteToken, numerator, denominator } = params;\n super(numerator, denominator);\n\n this.baseToken = baseToken;\n this.quoteToken = quoteToken;\n this.scalar = new Fraction(tenExponential(baseToken.decimals), tenExponential(quoteToken.decimals));\n }\n\n public get raw(): Fraction {\n return new Fraction(this.numerator, this.denominator);\n }\n\n public get adjusted(): Fraction {\n return super.mul(this.scalar);\n }\n\n public invert(): Price {\n return new Price({\n baseToken: this.quoteToken,\n quoteToken: this.baseToken,\n denominator: this.numerator,\n numerator: this.denominator,\n });\n }\n\n public mul(other: Price): Price {\n if (this.quoteToken !== other.baseToken) logger.logWithError(\"mul token not equals\");\n\n const fraction = super.mul(other);\n return new Price({\n baseToken: this.baseToken,\n quoteToken: other.quoteToken,\n denominator: fraction.denominator,\n numerator: fraction.numerator,\n });\n }\n\n public toSignificant(significantDigits = this.quoteToken.decimals, format?: object, rounding?: Rounding): string {\n return this.adjusted.toSignificant(significantDigits, format, rounding);\n }\n\n public toFixed(decimalPlaces = this.quoteToken.decimals, format?: object, rounding?: Rounding): string {\n return this.adjusted.toFixed(decimalPlaces, format, rounding);\n }\n}\n","import { PublicKey } from \"@solana/web3.js\";\nimport BN from \"bn.js\";\n\nimport { ReplaceType } from \"../cobaltx/type\";\nimport { Fraction, Percent, Price, Token, TokenAmount } from \"../module\";\n\nimport { tryParsePublicKey } from \"./pubKey\";\n\nexport async function sleep(ms: number): Promise<void> {\n new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport function getTimestamp(): number {\n return new Date().getTime();\n}\n\nexport function notInnerObject(v: unknown): v is Record<string, any> {\n return (\n typeof v === \"object\" &&\n v !== null &&\n ![Token, TokenAmount, PublicKey, Fraction, BN, Price, Percent].some((o) => typeof o === \"object\" && v instanceof o)\n );\n}\n\nexport function jsonInfo2PoolKeys<T>(jsonInfo: T): ReplaceType<T, string, PublicKey> {\n // @ts-expect-error no need type for inner code\n return typeof jsonInfo === \"string\"\n ? tryParsePublicKey(jsonInfo)\n : Array.isArray(jsonInfo)\n ? jsonInfo.map((k) => jsonInfo2PoolKeys(k))\n : notInnerObject(jsonInfo)\n ? Object.fromEntries(Object.entries(jsonInfo).map(([k, v]) => [k, jsonInfo2PoolKeys(v)]))\n : jsonInfo;\n}\n","/**\n * https://youmightnotneed.com/lodash/\n */\n\nexport function chunkArray<T>(arr: T[], chunkSize = 1, cache: T[][] = []): T[][] {\n const tmp = [...arr];\n if (chunkSize <= 0) return cache;\n while (tmp.length) cache.push(tmp.splice(0, chunkSize));\n return cache;\n}\n\nexport function intersection<T>(arr: T[], ...args: T[][]): T[] {\n return arr.filter((item) => args.every((arr) => arr.includes(item)));\n}\n\nexport function xor<T>(arr: T[], ...args: T[][]): T[] {\n return arr.filter((item) => args.every((arr) => !arr.includes(item)));\n}\n\nexport function uniq<T>(arr: T[]): T[] {\n return [...new Set(arr)];\n}\n","import { PublicKey } from \"@solana/web3.js\";\n\nimport { TOKEN_PROGRAM_ID } from \"@solana/spl-token\";\nimport { findProgramAddress } from \"./txTool/txUtils\";\n\nexport function getATAAddress(\n owner: PublicKey,\n mint: PublicKey,\n programId?: PublicKey,\n): {\n publicKey: PublicKey;\n nonce: number;\n} {\n return findProgramAddress(\n [owner.toBuffer(), (programId ?? TOKEN_PROGRAM_ID).toBuffer(), mint.toBuffer()],\n new PublicKey(\"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL\"),\n );\n}\n","import {\n Commitment,\n ComputeBudgetProgram,\n Connection,\n EpochInfo,\n Keypair,\n PublicKey,\n SimulatedTransactionResponse,\n Transaction,\n TransactionInstruction,\n TransactionMessage,\n VersionedTransaction,\n} from \"@solana/web3.js\";\n\nimport { createLogger } from \"../logger\";\nimport { CacheLTA } from \"./lookupTable\";\nimport { InstructionType } from \"./txType\";\n\nimport { TOKEN_PROGRAM_ID } from \"@solana/spl-token\";\nimport { ComputeBudgetConfig } from \"../../cobaltx/type\";\n\nconst logger = createLogger(\"CobaltX_txUtil\");\n\nexport const MAX_BASE64_SIZE = 1644;\n\nexport function addComputeBudget(config: ComputeBudgetConfig): {\n instructions: TransactionInstruction[];\n instructionTypes: string[];\n} {\n const ins: TransactionInstruction[] = [];\n const insTypes: string[] = [];\n if (config.microLamports) {\n ins.push(ComputeBudgetProgram.setComputeUnitPrice({ microLamports: config.microLamports }));\n insTypes.push(InstructionType.SetComputeUnitPrice);\n }\n if (config.units) {\n ins.push(ComputeBudgetProgram.setComputeUnitLimit({ units: config.units }));\n insTypes.push(InstructionType.SetComputeUnitLimit);\n }\n\n return {\n instructions: ins,\n instructionTypes: insTypes,\n };\n}\n\nexport async function getRecentBlockHash(connection: Connection, propsCommitment?: Commitment): Promise<string> {\n const commitment = propsCommitment ?? \"confirmed\";\n return (await connection.getLatestBlockhash?.({ commitment }))?.blockhash;\n}\n\nexport async function confirmTransaction(connection: Connection, txId: string): Promise<string> {\n connection.getSignatureStatuses([txId]);\n return new Promise((resolve, reject) => {\n const id = setTimeout(reject, 60 * 1000);\n connection.onSignature(\n txId,\n (signatureResult) => {\n clearTimeout(id);\n if (!signatureResult.err) {\n resolve(\"\");\n return;\n }\n reject(signatureResult.err.toString());\n },\n \"confirmed\",\n );\n });\n}\n\n/**\n * Forecast transaction size\n */\nexport function forecastTransactionSize(instructions: TransactionInstruction[], signers: PublicKey[]): boolean {\n if (instructions.length < 1) logger.logWithError(`no instructions provided: ${instructions.toString()}`);\n if (signers.length < 1) logger.logWithError(`no signers provided:, ${signers.toString()}`);\n\n const transaction = new Transaction();\n transaction.recentBlockhash = \"11111111111111111111111111111111\";\n transaction.feePayer = signers[0];\n transaction.add(...instructions);\n\n try {\n return Buffer.from(transaction.serialize({ verifySignatures: false })).toString(\"base64\").length < MAX_BASE64_SIZE;\n } catch (error) {\n return false;\n }\n}\n\n/**\n * Simulates multiple instruction\n */\n/**\n * Simulates multiple instruction\n */\nexport async function simulateMultipleInstruction(\n connection: Connection,\n instructions: TransactionInstruction[],\n keyword: string,\n batchRequest = true,\n): Promise<string[]> {\n const feePayer = new PublicKey(\"CobaltXSimuLateTransaction11111111111111111\");\n\n const transactions: Transaction[] = [];\n\n let transaction = new Transaction();\n transaction.feePayer = feePayer;\n\n for (const instruction of instructions) {\n if (!forecastTransactionSize([...transaction.instructions, instruction], [feePayer])) {\n transactions.push(transaction);\n transaction = new Transaction();\n transaction.feePayer = feePayer;\n }\n transaction.add(instruction);\n }\n if (transaction.instructions.length > 0) {\n transactions.push(transaction);\n }\n\n let results: SimulatedTransactionResponse[] = [];\n\n try {\n results = await simulateTransaction(connection, transactions, batchRequest);\n if (results.find((i) => i.err !== null)) throw Error(\"rpc simulateTransaction error\");\n } catch (error) {\n if (error instanceof Error) {\n logger.logWithError(\"failed to simulate for instructions\", \"RPC_ERROR\", {\n message: error.message,\n });\n }\n }\n\n const logs: string[] = [];\n for (const result of results) {\n logger.debug(\"simulate result:\", result);\n\n if (result.logs) {\n const filteredLog = result.logs.filter((log) => log && log.includes(keyword));\n logger.debug(\"filteredLog:\", logs);\n if (!filteredLog.length) logger.logWithError(\"simulate log not match keyword\", \"keyword\", keyword);\n logs.push(...filteredLog);\n }\n }\n\n return logs;\n}\n\nexport function parseSimulateLogToJson(log: string, keyword: string): any {\n const results = log.match(/{[\"\\w:,]+}/g);\n if (!results || results.length !== 1) {\n return logger.logWithError(`simulate log fail to match json, keyword: ${keyword}`);\n }\n\n return results[0];\n}\n\nexport function parseSimulateValue(log: string, key: string): any {\n const reg = new RegExp(`\"${key}\":(\\\\d+)`, \"g\");\n\n const results = reg.exec(log);\n if (!results || results.length !== 2) {\n return logger.logWithError(`simulate log fail to match key\", key: ${key}`);\n }\n\n return results[1];\n}\n\nexport interface ProgramAddress {\n publicKey: PublicKey;\n nonce: number;\n}\nexport function findProgramAddress(\n seeds: Array<Buffer | Uint8Array>,\n programId: PublicKey,\n): {\n publicKey: PublicKey;\n nonce: number;\n} {\n const [publicKey, nonce] = PublicKey.findProgramAddressSync(seeds, programId);\n return { publicKey, nonce };\n}\n\nexport async function simulateTransaction(\n connection: Connection,\n transactions: Transaction[],\n batchRequest?: boolean,\n): Promise<any[]> {\n let results: any[] = [];\n if (batchRequest) {\n const getLatestBlockhash = await connection.getLatestBlockhash();\n\n const encodedTransactions: string[] = [];\n for (const transaction of transactions) {\n transaction.recentBlockhash = getLatestBlockhash.blockhash;\n transaction.lastValidBlockHeight = getLatestBlockhash.lastValidBlockHeight;\n\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n const message = transaction._compile();\n const signData = message.serialize();\n\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n const wireTransaction = transaction._serialize(signData);\n const encodedTransaction = wireTransaction.toString(\"base64\");\n\n encodedTransactions.push(encodedTransaction);\n }\n\n const batch = encodedTransactions.map((keys) => {\n const args = connection._buildArgs([keys], undefined, \"base64\");\n return {\n methodName: \"simulateTransaction\",\n args,\n };\n });\n\n const reqData: { methodName: string; args: any[] }[][] = [];\n const itemReqIndex = 20;\n for (let i = 0; i < Math.ceil(batch.length / itemReqIndex); i++) {\n reqData.push(batch.slice(i * itemReqIndex, (i + 1) * itemReqIndex));\n }\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n results = await (\n await Promise.all(\n reqData.map(async (i) => (await (connection as any)._rpcBatchRequest(i)).map((ii) => ii.result.value)),\n )\n ).flat();\n } else {\n try {\n results = await Promise.all(\n transactions.map(async (transaction) => await (await connection.simulateTransaction(transaction)).value),\n );\n } catch (error) {\n if (error instanceof Error) {\n logger.logWithError(\"failed to get info for multiple accounts\", \"RPC_ERROR\", {\n message: error.message,\n });\n }\n }\n }\n\n return results;\n}\n\nexport function checkLegacyTxSize({\n instructions,\n payer,\n signers,\n}: {\n instructions: TransactionInstruction[];\n payer: PublicKey;\n signers: PublicKey[];\n}): boolean {\n return forecastTransactionSize(instructions, [payer, ...signers]);\n}\n\nexport function checkV0TxSize({\n instructions,\n payer,\n lookupTableAddressAccount,\n recentBlockhash = Keypair.generate().publicKey.toString(),\n}: {\n instructions: TransactionInstruction[];\n payer: PublicKey;\n lookupTableAddressAccount?: CacheLTA;\n recentBlockhash?: string;\n}): boolean {\n const transactionMessage = new TransactionMessage({\n payerKey: payer,\n recentBlockhash,\n instructions,\n });\n\n const messageV0 = transactionMessage.compileToV0Message(Object.values(lookupTableAddressAccount ?? {}));\n try {\n const buildLength = Buffer.from(new VersionedTransaction(messageV0).serialize()).toString(\"base64\").length;\n return buildLength < MAX_BASE64_SIZE;\n } catch (error) {\n return false;\n }\n}\n\nlet epochInfoCache: { time: number; data?: EpochInfo } = {\n time: 0,\n data: undefined,\n};\n\nexport async function getEpochInfo(connection: Connection): Promise<EpochInfo> {\n if (!epochInfoCache.data || (Date.now() - epochInfoCache.time) / 1000 > 30) {\n const data = await connection.getEpochInfo();\n epochInfoCache = {\n time: Date.now(),\n data,\n };\n return data;\n } else {\n return epochInfoCache.data;\n }\n}\n\nexport const toBuffer = (arr: Buffer | Uint8Array | Array<number>): Buffer => {\n if (Buffer.isBuffer(arr)) {\n return arr;\n } else if (arr instanceof Uint8Array) {\n return Buffer.from(arr.buffer, arr.byteOffset, arr.byteLength);\n } else {\n return Buffer.from(arr);\n }\n};\n\nexport const txToBase64 = (transaction: Transaction | VersionedTransaction): string => {\n let serialized = transaction.serialize({ requireAllSignatures: false, verifySignatures: false });\n if (transaction instanceof VersionedTransaction) serialized = toBuffer(serialized);\n try {\n return serialized instanceof Buffer ? serialized.toString(\"base64\") : Buffer.from(serialized).toString(\"base64\");\n } catch {\n return serialized.toString(\"base64\");\n }\n};\n\nexport function printSimulate(transactions: Transaction[] | VersionedTransaction[]): string[] {\n const allBase64: string[] = [];\n transactions.forEach((transaction) => {\n if (transaction instanceof Transaction) {\n if (!transaction.recentBlockhash) transaction.recentBlockhash = TOKEN_PROGRAM_ID.toBase58();\n if (!transaction.feePayer) transaction.feePayer = Keypair.generate().publicKey;\n }\n allBase64.push(txToBase64(transaction));\n });\n console.log(\"simulate tx string:\", allBase64);\n\n return allBase64;\n}\n\nexport function transformTxToBase64(tx: Transaction | VersionedTransaction): string {\n let serialized = tx.serialize({ requireAllSignatures: false, verifySignatures: false });\n if (tx instanceof VersionedTransaction) serialized = toBuffer(serialized);\n return serialized.toString(\"base64\");\n}\n","export enum TxVersion {\n \"V0\",\n \"LEGACY\",\n}\n\nexport const InstructionType = {\n CreateAccount: \"CreateAccount\",\n InitAccount: \"InitAccount\",\n CreateATA: \"CreateATA\",\n CloseAccount: \"CloseAccount\",\n TransferAmount: \"TransferAmount\",\n InitMint: \"InitMint\",\n MintTo: \"MintTo\",\n\n InitMarket: \"InitMarket\", // create market main ins\n Util1216OwnerClaim: \"Util1216OwnerClaim\", // owner claim token ins\n\n SetComputeUnitPrice: \"SetComputeUnitPrice\",\n SetComputeUnitLimit: \"SetComputeUnitLimit\",\n\n // CLMM\n ClmmCreatePool: \"ClmmCreatePool\",\n ClmmOpenPosition: \"ClmmOpenPosition\",\n ClmmIncreasePosition: \"ClmmIncreasePosition\",\n ClmmDecreasePosition: \"ClmmDecreasePosition\",\n ClmmClosePosition: \"ClmmClosePosition\",\n ClmmSwapBaseIn: \"ClmmSwapBaseIn\",\n ClmmSwapBaseOut: \"ClmmSwapBaseOut\",\n ClmmInitReward: \"ClmmInitReward\",\n ClmmSetReward: \"ClmmSetReward\",\n ClmmCollectReward: \"ClmmCollectReward\",\n ClmmLockPosition: \"ClmmLockPosition\",\n ClmmHarvestLockPosition: \"ClmmHarvestLockPosition\",\n\n AmmV4Swap: \"AmmV4Swap\",\n AmmV4AddLiquidity: \"AmmV4AddLiquidity\",\n AmmV4RemoveLiquidity: \"AmmV4RemoveLiquidity\",\n AmmV4SimulatePoolInfo: \"AmmV4SimulatePoolInfo\",\n AmmV4SwapBaseIn: \"AmmV4SwapBaseIn\",\n AmmV4SwapBaseOut: \"AmmV4SwapBaseOut\",\n AmmV4CreatePool: \"AmmV4CreatePool\",\n AmmV4InitPool: \"AmmV4InitPool\",\n\n AmmV5AddLiquidity: \"AmmV5AddLiquidity\",\n AmmV5RemoveLiquidity: \"AmmV5RemoveLiquidity\",\n AmmV5SimulatePoolInfo: \"AmmV5SimulatePoolInfo\",\n AmmV5SwapBaseIn: \"AmmV5SwapBaseIn\",\n AmmV5SwapBaseOut: \"AmmV5SwapBaseOut\",\n\n RouteSwap: \"RouteSwap\",\n RouteSwap1: \"RouteSwap1\",\n RouteSwap2: \"RouteSwap2\",\n\n FarmV3Deposit: \"FarmV3Deposit\",\n FarmV3Withdraw: \"FarmV3Withdraw\",\n FarmV3CreateLedger: \"FarmV3CreateLedger\",\n\n FarmV4Withdraw: \"FarmV4Withdraw\",\n\n FarmV5Deposit: \"FarmV5Deposit\",\n FarmV5Withdraw: \"FarmV5Withdraw\",\n FarmV5CreateLedger: \"FarmV5CreateLedger\",\n\n FarmV6Deposit: \"FarmV6Deposit\",\n FarmV6Withdraw: \"FarmV6Withdraw\",\n FarmV6Create: \"FarmV6Create\",\n FarmV6Restart: \"FarmV6Restart\",\n FarmV6CreatorAddReward: \"FarmV6CreatorAddReward\",\n FarmV6CreatorWithdraw: \"FarmV6CreatorWithdraw\",\n\n CpmmCreatePool: \"CpmmCreatePool\",\n CpmmAddLiquidity: \"CpmmAddLiquidity\",\n CpmmWithdrawLiquidity: \"CpmmWithdrawLiquidity\",\n CpmmSwapBaseIn: \"CpmmSwapBaseIn\",\n CpmmSwapBaseOut: \"CpmmSwapBaseOut\",\n\n CpmmLockLp: \"CpmmLockLp\",\n CpmmCollectLockFee: \"CpmmCollectLockFee\",\n};\n","import { NetworkName } from \"@/config\";\nimport { getNetworkConfig } from \"@/config\";\nimport { PublicKey } from \"@solana/web3.js\";\n\n// cobaltx\nexport const FARM_PROGRAM_ID_V3 = new PublicKey(\"EhhTKczWMGQt46ynNeRX1WfeagwwJd7ufHvCDjRxjo5Q\");\n// temp fusion\nexport const FARM_PROGRAM_ID_V4 = new PublicKey(\"CBuCnLe26faBpcBP2fktp4rp8abpcAnTWft6ZrP5Q4T\");\n// \"fusion\"\nexport const FARM_PROGRAM_ID_V5 = new PublicKey(\"9KEPoZmtHUrBbhWN1v1KWLMkkvwY6WLtAVUCPRtRjP4z\");\n// echosystem\nexport const FARM_PROGRAM_ID_V6 = new PublicKey(\"FarmqiPv5eAj3j1GMdMCMUGXqPUvmquZtMy86QH6rzhG\");\n\nexport const UTIL1216 = new PublicKey(\"CLaimxFqjHzgTJtAGHU47NPhg6qrc5sCnpC4tBLyABQS\");\n\nexport const OPEN_BOOK_PROGRAM = new PublicKey(\"srmqPvymJeFKQ4zGQed1GFppgkRHL9kaELCbyksJtPX\");\nexport const SERUM_PROGRAM_ID_V3 = new PublicKey(\"9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin\");\n\nexport const AMM_V4 = new PublicKey(\"675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8\");\nexport const AMM_STABLE = new PublicKey(\"5quBtoiQqxF9Jv6KYKctB59NT3gtJD2Y65kdnB1Uev3h\");\nexport const LIQUIDITY_POOL_PROGRAM_ID_V5_MODEL = new PublicKey(\"CDSr3ssLcRB6XYPJwAfFt18MZvEZp4LjHcvzBVZ45duo\");\n\nexport function getCLMMProgramId(network: NetworkName): PublicKey {\n const config = getNetworkConfig(network);\n return new PublicKey(config.CLMM_PROGRAMM_ID);\n}\n\nexport const CLMM_LOCK_PROGRAM_ID = new PublicKey(\"LockrWmn6K5twhz3y9w1dQERbmgSaRkfnTeTKbpofwE\");\nexport const CLMM_LOCK_AUTH_ID = new PublicKey(\"kN1kEznaF5Xbd8LYuqtEFcxzWSBk5Fv6ygX6SqEGJVy\");\n\nexport const Router = new PublicKey(\"routeUGWgWzqBWFcrCfv8tritsqukccJPu3q5GPP3xS\");\nexport const FEE_DESTINATION_ID = new PublicKey(\"7YttLkHDoNj9wyDur5pM1ejNaAvT9X4eqaYcHQqtj2G5\");\n\nexport const IDO_PROGRAM_ID_V1 = new PublicKey(\"6FJon3QE27qgPVggARueB22hLvoh22VzJpXv4rBEoSLF\");\nexport const IDO_PROGRAM_ID_V2 = new PublicKey(\"CC12se5To1CdEuw7fDS27B7Geo5jJyL7t5UK2B44NgiH\");\nexport const IDO_PROGRAM_ID_V3 = new PublicKey(\"9HzJyW1qZsEiSfMUf6L2jo3CcTKAyBmSyKdwQeYisHrC\");\nexport const IDO_PROGRAM_ID_V4 = new PublicKey(\"DropEU8AvevN3UrXWXTMuz3rqnMczQVNjq3kcSdW2SQi\");\n\nexport const CREATE_CPMM_POOL_PROGRAM = new PublicKey(\"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 LOCK_CPMM_PROGRAM = new PublicKey(\"LockrWmn6K5twhz3y9w1dQERbmgSaRkfnTeTKbpofwE\");\nexport const DEV_LOCK_CPMM_PROGRAM = new PublicKey(\"DLockwT7X7sxtLmGH9g5kmfcjaBtncdbUmi738m5bvQC\");\n\nexport const LOCK_CPMM_AUTH = new PublicKey(\"3f7GcQFG397GAaEnv51zR6tsTVihYRydnydDD1cXekxH\");\nexport const DEV_LOCK_CPMM_AUTH = new PublicKey(\"7AFUeLVRjBfzqK3tTGw8hN48KLQWSk6DTE8xprWdPqix\");\n\nexport const IDO_ALL_PROGRAM = {\n IDO_PROGRAM_ID_V1,\n IDO_PROGRAM_ID_V2,\n IDO_PROGRAM_ID_V3,\n IDO_PROGRAM_ID_V4,\n};\n\nexport const ALL_PROGRAM_ID = {\n AMM_V4,\n AMM_STABLE,\n getCLMMProgramId,\n CLMM_LOCK_PROGRAM_ID,\n CLMM_LOCK_AUTH_ID,\n\n FARM_PROGRAM_ID_V3,\n FARM_PROGRAM_ID_V5,\n FARM_PROGRAM_ID_V6,\n\n OPEN_BOOK_PROGRAM,\n SERUM_PROGRAM_ID_V3,\n\n UTIL1216,\n\n Router,\n\n CREATE_CPMM_POOL_PROGRAM,\n CREATE_CPMM_POOL_AUTH,\n CREATE_CPMM_POOL_FEE_ACC,\n\n LOCK_CPMM_PROGRAM,\n LOCK_CPMM_AUTH,\n};\n\nexport type ProgramIdConfig = Partial<typeof ALL_PROGRAM_ID>;\n\nexport const DEVNET_PROGRAM_ID = {\n SERUM_MARKET: PublicKey.default,\n OPENBOOK_MARKET: new PublicKey(\"EoTcMgcDRTJVZDMZWBoU6rhYHZfkNTVEAfz3uUJRcYGj\"),\n\n UTIL1216: PublicKey.default,\n\n FarmV3: new PublicKey(\"85BFyr98MbCUU9MVTEgzx1nbhWACbJqLzho6zd6DZcWL\"),\n FarmV5: new PublicKey(\"EcLzTrNg9V7qhcdyXDe2qjtPkiGzDM2UbdRaeaadU5r2\"),\n FarmV6: new PublicKey(\"Farm2hJLcqPtPg8M4rR6DMrsRNc5TPm5Cs4bVQrMe2T7\"),\n\n AmmV4: new PublicKey(\"HWy1jotHpo6UqeQxx49dpYYdQB8wj9Qk9MdxwjLvDHB8\"),\n AmmStable: new PublicKey(\"DDg4VmQaJV9ogWce7LpcjBA9bv22wRp5uaTPa5pGjijF\"),\n\n CLMM: new PublicKey(\"devi51mZmdwUJGU9hjN27vEz64Gps7uUefqxg27EAtH\"),\n CLMM_LOCK_PROGRAM_ID: new PublicKey(\"DLockwT7X7sxtLmGH9g5kmfcjaBtncdbUmi738m5bvQC\"),\n CLMM_LOCK_AUTH_ID: new PublicKey(\"8qmHNvu2Kr2C7U8mJL4Vz1vTDxMhVuXKREwU7TNoaVEo\"),\n\n Router: new PublicKey(\"BVChZ3XFEwTMUk1o9i3HAf91H6mFxSwa5X2wFAWhYPhU\"),\n\n CREATE_CPMM_POOL_PROGRAM: DEV_CREATE_CPMM_POOL_PROGRAM,\n CREATE_CPMM_POOL_AUTH: DEV_CREATE_CPMM_POOL_AUTH,\n CREATE_CPMM_POOL_FEE_ACC: DEV_CREATE_CPMM_POOL_FEE_ACC,\n\n FEE_DESTINATION_ID: new PublicKey(\"3XMrhbv989VxAMi3DErLV9eJht1pHppW5LbKxe9fkEFR\"),\n\n LOCK_CPMM_PROGRAM: DEV_LOCK_CPMM_PROGRAM,\n LCOK_CPMM_AUTH: DEV_LOCK_CPMM_AUTH,\n};\n","import { TransferFee, TransferFeeConfig } from \"@solana/spl-token\";\nimport { EpochInfo } from \"@solana/web3.js\";\nimport BN from \"bn.js\";\n\nimport { TransferFeeDataBaseType } from \"../api/type\";\nimport { GetTransferAmountFee } from \"../cobaltx/type\";\n\nconst POINT = 10_000;\nexport function getTransferAmountFee(\n amount: BN,\n feeConfig: TransferFeeConfig | undefined,\n epochInfo: EpochInfo,\n addFee: boolean,\n): GetTransferAmountFee {\n if (feeConfig === undefined) {\n return {\n amount,\n fee: undefined,\n expirationTime: undefined,\n };\n }\n\n const nowFeeConfig: TransferFee =\n epochInfo.epoch < feeConfig.newerTransferFee.epoch ? feeConfig.olderTransferFee : feeConfig.newerTransferFee;\n const maxFee = new BN(nowFeeConfig.maximumFee.toString());\n const expirationTime: number | undefined =\n epochInfo.epoch < feeConfig.newerTransferFee.epoch\n ? ((Number(feeConfig.newerTransferFee.epoch) * epochInfo.slotsInEpoch - epochInfo.absoluteSlot) * 400) / 1000\n : undefined;\n\n if (addFee) {\n if (nowFeeConfig.transferFeeBasisPoints === POINT) {\n const nowMaxFee = new BN(nowFeeConfig.maximumFee.toString());\n return {\n amount: amount.add(nowMaxFee),\n fee: nowMaxFee,\n expirationTime,\n };\n } else {\n const _TAmount = BNDivCeil(amount.mul(new BN(POINT)), new BN(POINT - nowFeeConfig.transferFeeBasisPoints));\n\n const nowMaxFee = new BN(nowFeeConfig.maximumFee.toString());\n const TAmount = _TAmount.sub(amount).gt(nowMaxFee) ? amount.add(nowMaxFee) : _TAmount;\n\n const _fee = BNDivCeil(TAmount.mul(new BN(nowFeeConfig.transferFeeBasisPoints)), new BN(POINT));\n const fee = _fee.gt(maxFee) ? maxFee : _fee;\n return {\n amount: TAmount,\n fee,\n expirationTime,\n };\n }\n } else {\n const _fee = BNDivCeil(amount.mul(new BN(nowFeeConfig.transferFeeBasisPoints)), new BN(POINT));\n const fee = _fee.gt(maxFee) ? maxFee : _fee;\n\n return {\n amount,\n fee,\n expirationTime,\n };\n }\n}\n\nexport function getTransferAmountFeeV2(\n amount: BN,\n _feeConfig: TransferFeeDataBaseType | undefined,\n epochInfo: EpochInfo,\n addFee: boolean,\n): GetTransferAmountFee {\n if (_feeConfig === undefined) {\n return {\n amount,\n fee: undefined,\n expirationTime: undefined,\n };\n }\n const feeConfig = {\n ..._feeConfig,\n olderTransferFee: {\n epoch: BigInt(_feeConfig.olderTransferFee.epoch),\n maximumFee: BigInt(_feeConfig.olderTransferFee.maximumFee),\n transferFeeBasisPoints: _feeConfig.olderTransferFee.transferFeeBasisPoints,\n },\n newerTransferFee: {\n epoch: BigInt(_feeConfig.newerTransferFee.epoch),\n maximumFee: BigInt(_feeConfig.newerTransferFee.maximumFee),\n transferFeeBasisPoints: _feeConfig.newerTransferFee.transferFeeBasisPoints,\n },\n };\n\n const nowFeeConfig: TransferFee =\n epochInfo.epoch < feeConfig.newerTransferFee.epoch ? feeConfig.olderTransferFee : feeConfig.newerTransferFee;\n const maxFee = new BN(nowFeeConfig.maximumFee.toString());\n const expirationTime: number | undefined =\n epochInfo.epoch < feeConfig.newerTransferFee.epoch\n ? ((Number(feeConfig.newerTransferFee.epoch) * epochInfo.slotsInEpoch - epochInfo.absoluteSlot) * 400) / 1000\n : undefined;\n\n if (addFee) {\n if (nowFeeConfig.transferFeeBasisPoints === POINT) {\n const nowMaxFee = new BN(nowFeeConfig.maximumFee.toString());\n return {\n amount: amount.add(nowMaxFee),\n fee: nowMaxFee,\n expirationTime,\n };\n } else {\n const _TAmount = BNDivCeil(amount.mul(new BN(POINT)), new BN(POINT - nowFeeConfig.transferFeeBasisPoints));\n\n const nowMaxFee = new BN(nowFeeConfig.maximumFee.toString());\n const TAmount = _TAmount.sub(amount).gt(nowMaxFee) ? amount.add(nowMaxFee) : _TAmount;\n\n const _fee = BNDivCeil(TAmount.mul(new BN(nowFeeConfig.transferFeeBasisPoints)), new BN(POINT));\n const fee = _fee.gt(maxFee) ? maxFee : _fee;\n return {\n amount: TAmount,\n fee,\n expirationTime,\n };\n }\n } else {\n const _fee = BNDivCeil(amount.mul(new BN(nowFeeConfig.transferFeeBasisPoints)), new BN(POINT));\n const fee = _fee.gt(maxFee) ? maxFee : _fee;\n\n return {\n amount,\n fee,\n expirationTime,\n };\n }\n}\n\nexport function minExpirationTime(\n expirationTime1: number | undefined,\n expirationTime2: number | undefined,\n): number | undefined {\n if (expirationTime1 === undefined) return expirationTime2;\n if (expirationTime2 === undefined) return expirationTime1;\n\n return Math.min(expirationTime1, expirationTime2);\n}\n\nexport function BNDivCeil(bn1: BN, bn2: BN): BN {\n const { div, mod } = bn1.divmod(bn2);\n\n if (mod.gt(new BN(0))) {\n return div.add(new BN(1));\n } else {\n return div;\n }\n}\n","import { Connection, PublicKey, AddressLookupTableAccount } from \"@solana/web3.js\";\nimport { getMultipleAccountsInfo } from \"../accountInfo\";\nimport { getNetworkConfig, NetworkName } from \"@/config\";\n\nexport interface CacheLTA {\n [key: string]: AddressLookupTableAccount;\n}\n\nexport async function getMultipleLookupTableInfo({\n connection,\n address,\n network,\n}: {\n connection: Connection;\n address: PublicKey[];\n network: NetworkName;\n}): Promise<CacheLTA> {\n const dataInfos = await getMultipleAccountsInfo(\n connection,\n [...new Set<string>(address.map((i) => i.toString()))].map((i) => new PublicKey(i)),\n );\n\n const outDict: CacheLTA = {};\n for (let i = 0; i < address.length; i++) {\n const info = dataInfos[i];\n const key = address[i];\n if (!info) continue;\n const lookupAccount = new AddressLookupTableAccount({\n key,\n state: AddressLookupTableAccount.deserialize(info.data),\n });\n outDict[key.toString()] = lookupAccount;\n getLookupTableCache(network)[key.toString()] = lookupAccount;\n }\n\n return outDict;\n}\n\nexport function getLookupTableCache(network: NetworkName): CacheLTA {\n const config = getNetworkConfig(network);\n return {\n [config.LOOKUP_TABLE_CACHE]: new AddressLookupTableAccount({\n key: new PublicKey(config.LOOKUP_TABLE_CACHE),\n state: AddressLookupTableAccount.deserialize(\n Buffer.from(\n \"AQAAAP//////////d49+DAAAAAAAAQZMWvw7GUNJdaccNBVnb57OKakxL2BHLYvhRwVILRsgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMGRm/lIRcy/+ytunLDm+e8jOW7xfcSayxDmzpAAAAABt324ddloZPZy+FGzut5rBy0he1fWzeROoz1hX7/AKkG3fbh7nWP3hhCXbzkbM3athr8TYO5DSf+vfko2KGL/AVKU1D4XciC1hSlVnJ4iilt3x6rq9CmBniISTL07vagBqfVFxksXFEhjMlMPUrxf1ja7gibof1E49vZigAAAAAGp9UXGMd0yShWY5hpHV62i164o5tLbVxzVVshAAAAAIyXJY9OJInxuz0QKRSODYMLWhOZ2v8QhASOe9jb6fhZC3BlsePRfEU4nVJ/awTDzVi4bHMaoP21SbbRvAP4KUbIScv+6Yw2LHF/6K0ZjUPibbSWXCirYPGuuVl7zT789IUPLW4CpHr4JNCatp3ELXDLKMv6JJ+37le50lbBJ2LvDQdRqCgtphMF/imcN7mY5YRx2xE1A3MQ+L4QRaYK9u4GRfZP3LsAd00a+IkCpA22UNQMKdq5BFbJuwuOLqc8zxCTDlqxBG8J0HcxtfogQHDK06ukzfaXiNDKAob1MqBHS9lJxDYCwz8gd5DtFqNSTKG5l1zxIaKpDP/sffi2is1H9aKveyXSu5StXElYRl9SD5As0DHE4N0GLnf84/siiKXVyp4Ez121kLcUui/jLLFZEz/BwZK3Ilf9B9OcsEAeDMKAy2vjGSxQODgBz0QwGA+eP4ZjIjrIAQaXENv31QfLlOdXSRCkaybRniDHF4C8YcwhcvsqrOVuTP4B2Na+9wLdtrB31uz2rtlFI5kahdsnp/d1SrASDInYCtTYtdoke4kX+hoKWcEWM4Tle8pTUkUVv4BxS6fje/EzKBE4Qu9N9LMnrw/JNO0hqMVB4rk/2ou4AB1loQ7FZoPwut2o4KZB+0p9xnbrQKw038qjpHar+PyDwvxBRcu5hpHw3dguezeWv+IwvgW5icu8EGkhGa9AkFPPJT7VMSFb8xowveU=\",\n \"base64\",\n ),\n ),\n }),\n };\n}\n\n\n","import {\n Commitment,\n Connection,\n PublicKey,\n sendAndConfirmTransaction,\n Signer,\n Transaction,\n TransactionInstruction,\n TransactionMessage,\n VersionedTransaction,\n} from \"@solana/web3.js\";\nimport axios from \"axios\";\n\nimport { NetworkName } from \"@/config\";\nimport { Api } from \"../../api\";\nimport { ComputeBudgetConfig, SignAllTransactions } from \"../../cobaltx/type\";\nimport { Cluster } from \"../../solana\";\nimport { Owner } from \"../owner\";\nimport { CacheLTA, getLookupTableCache, getMultipleLookupTableInfo } from \"./lookupTable\";\nimport { TxVersion } from \"./txType\";\nimport {\n addComputeBudget,\n checkLegacyTxSize,\n checkV0TxSize,\n confirmTransaction,\n getRecentBlockHash,\n printSimulate,\n} from \"./txUtils\";\n\ninterface SolanaFeeInfo {\n min: number;\n max: number;\n avg: number;\n priorityTx: number;\n nonVotes: number;\n priorityRatio: number;\n avgCuPerBlock: number;\n blockspaceUsageRatio: number;\n}\ntype SolanaFeeInfoJson = {\n \"1\": SolanaFeeInfo;\n \"5\": SolanaFeeInfo;\n \"15\": SolanaFeeInfo;\n};\n\ninterface ExecuteParams {\n skipPreflight?: boolean;\n recentBlockHash?: string;\n sendAndConfirm?: boolean;\n}\n\ninterface TxBuilderInit {\n connection: Connection;\n feePayer: PublicKey;\n cluster: Cluster;\n owner?: Owner;\n blockhashCommitment?: Commitment;\n api?: Api;\n signAllTransactions?: SignAllTransactions;\n network: NetworkName;\n}\n\nexport interface AddInstructionParam {\n addresses?: Record<string, PublicKey>;\n instructions?: TransactionInstruction[];\n endInstructions?: TransactionInstruction[];\n lookupTableAddress?: string[];\n signers?: Signer[];\n instructionTypes?: string[];\n endInstructionTypes?: string[];\n}\n\nexport interface TxBuildData<T = Record<string, any>> {\n builder: TxBuilder;\n transaction: Transaction;\n instructionTypes: string[];\n signers: Signer[];\n execute: (params?: ExecuteParams) => Promise<{ txId: string; signedTx: Transaction }>;\n extInfo: T;\n}\n\nexport interface TxV0BuildData<T = Record<string, any>> extends Omit<TxBuildData<T>, \"transaction\" | \"execute\"> {\n builder: TxBuilder;\n transaction: VersionedTransaction;\n buildProps?: {\n lookupTableCache?: CacheLTA;\n lookupTableAddress?: string[];\n };\n execute: (params?: ExecuteParams) => Promise<{ txId: string; signedTx: VersionedTransaction }>;\n}\n\ntype TxUpdateParams = {\n txId: string;\n status: \"success\" | \"error\" | \"sent\";\n signedTx: Transaction | VersionedTransaction;\n};\nexport interface MultiTxExecuteParam extends ExecuteParams {\n sequentially: boolean;\n skipTxCount?: number;\n onTxUpdate?: (completeTxs: TxUpdateParams[]) => void;\n}\nexport interface MultiTxBuildData<T = Record<string, any>> {\n builder: TxBuilder;\n transactions: Transaction[];\n instructionTypes: string[];\n signers: Signer[][];\n execute: (executeParams?: MultiTxExecuteParam) => Promise<{ txIds: string[]; signedTxs: Transaction[] }>;\n extInfo: T;\n}\n\nexport interface MultiTxV0BuildData<T = Record<string, any>>\n extends Omit<MultiTxBuildData<T>, \"transactions\" | \"execute\"> {\n builder: TxBuilder;\n transactions: VersionedTransaction[];\n buildProps?: {\n lookupTableCache?: CacheLTA;\n lookupTableAddress?: string[];\n };\n execute: (executeParams?: MultiTxExecuteParam) => Promise<{ txIds: string[]; signedTxs: VersionedTransaction[] }>;\n}\n\nexport type MakeMultiTxData<T = TxVersion.LEGACY, O = Record<string, any>> = T extends TxVersion.LEGACY\n ? MultiTxBuildData<O>\n : MultiTxV0BuildData<O>;\n\nexport type MakeTxData<T = TxVersion.LEGACY, O = Record<string, any>> = T extends TxVersion.LEGACY\n ? TxBuildData<O>\n : TxV0BuildData<O>;\n\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 private network: NetworkName;\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 this.network = params.network;\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 {\n sequentially,\n onTxUpdate,\n skipTxCount = 0,\n recentBlockHash: propBlockHash,\n skipPreflight = true,\n } = executeParams || {};\n const recentBlockHash = propBlockHash ?? (await getRecentBlockHash(this.connection, this.blockhashCommitment));\n if (this.owner?.isKeyPair) {\n if (sequentially) {\n const txIds: string[] = [];\n let i = 0;\n for (const tx of allTransactions) {\n ++i;\n if (i <= skipTxCount) continue;\n const txId = await sendAndConfirmTransaction(\n this.connection,\n tx,\n this.signers.find((s) => s.publicKey.equals(this.owner!.publicKey))\n ? this.signers\n : [...this.signers, this.owner.signer!],\n { skipPreflight },\n );\n txIds.push(txId);\n }\n\n return {\n txIds,\n signedTxs: allTransactions,\n };\n }\n return {\n txIds: await await Promise.all(\n allTransactions.map(async (tx) => {\n tx.recentBlockhash = recentBlockHash;\n return await this.connection.sendRawTransaction(tx.serialize(), { skipPreflight });\n }),\n ),\n signedTxs: allTransactions,\n };\n }\n\n if (this.signAllTransactions) {\n const partialSignedTxs = allTransactions.map((tx, idx) => {\n tx.recentBlockhash = recentBlockHash;\n if (allSigners[idx].length) tx.sign(...allSigners[idx]);\n return tx;\n });\n printSimulate(partialSignedTxs);\n const signedTxs = await this.signAllTransactions(partialSignedTxs);\n if (sequentially) {\n let i = 0;\n const processedTxs: TxUpdateParams[] = [];\n const checkSendTx = async (): Promise<void> => {\n if (!signedTxs[i]) return;\n const txId = await this.connection.sendRawTransaction(signedTxs[i].serialize(), { skipPreflight });\n processedTxs.push({ txId, status: \"sent\", signedTx: signedTxs[i] });\n onTxUpdate?.([...processedTxs]);\n i++;\n 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 network?: NetworkName;\n },\n ): Promise<MakeTxData<TxVersion.V0, O>> {\n const {\n lookupTableCache = {},\n lookupTableAddress = [],\n forerunCreate,\n recentBlockhash: propRecentBlockhash,\n network = this.network,\n ...extInfo \n } = props || {};\n const lookupTableAddressAccount = {\n ...(this.cluster === \"devnet\" ? {} : getLookupTableCache(network)),\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, network });\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();\n\n if (this.owner?.signer && !this.signers.some((s) => s.publicKey.equals(this.owner!.publicKey)))\n this.signers.push(this.owner.signer);\n const transaction = new VersionedTransaction(messageV0);\n transaction.sign(this.signers);\n return {\n builder: this,\n transaction,\n signers: this.signers,\n instructionTypes: [...this.instructionTypes, ...this.endInstructionTypes],\n execute: async (params) => {\n const { skipPreflight = true, sendAndConfirm } = params || {};\n printSimulate([transaction]);\n if (this.owner?.isKeyPair) {\n const txId = await this.connection.sendTransaction(transaction, { skipPreflight });\n if (sendAndConfirm) {\n await confirmTransaction(this.connection, txId);\n }\n\n return {\n txId,\n signedTx: transaction,\n };\n }\n if (this.signAllTransactions) {\n const txs = await this.signAllTransactions<VersionedTransaction>([transaction]);\n return {\n txId: await this.connection.sendTransaction(txs[0], { skipPreflight }),\n signedTx: txs[0],\n };\n }\n throw new Error(\"please provide owner in keypair format or signAllTransactions function\");\n },\n extInfo: (extInfo || {}) as O,\n };\n }\n\n public async buildV0MultiTx<T = Record<string, any>>(params: {\n extraPreBuildData?: MakeTxData<TxVersion.V0>[];\n buildProps?: T & {\n lookupTableCache?: CacheLTA;\n lookupTableAddress?: string[];\n forerunCreate?: boolean;\n recentBlockhash?: string;\n };\n }): Promise<MultiTxV0BuildData> {\n const { extraPreBuildData = [], buildProps } = params;\n const { transaction } = await this.buildV0(buildProps);\n\n const filterExtraBuildData = extraPreBuildData.filter((data) => data.builder.instructions.length > 0);\n\n const allTransactions: VersionedTransaction[] = [\n transaction,\n ...filterExtraBuildData.map((data) => data.transaction),\n ];\n const allSigners: Signer[][] = [this.signers, ...filterExtraBuildData.map((data) => data.signers)];\n const allInstructionTypes: string[] = [\n ...this.instructionTypes,\n ...filterExtraBuildData.map((data) => data.instructionTypes).flat(),\n ];\n\n if (this.owner?.signer) {\n allSigners.forEach((signers) => {\n if (!signers.some((s) => s.publicKey.equals(this.owner!.publicKey))) this.signers.push(this.owner!.signer!);\n });\n }\n\n allTransactions.forEach(async (tx, idx) => {\n tx.sign(allSigners[idx]);\n });\n\n return {\n builder: this,\n transactions: allTransactions,\n signers: allSigners,\n instructionTypes: allInstructionTypes,\n buildProps,\n execute: async (executeParams?: MultiTxExecuteParam) => {\n const { sequentially, onTxUpdate, recentBlockHash: propBlockHash, skipPreflight = true } = executeParams || {};\n if (propBlockHash) allTransactions.forEach((tx) => (tx.message.recentBlockhash = propBlockHash));\n printSimulate(allTransactions);\n if (this.owner?.isKeyPair) {\n if (sequentially) {\n const txIds: string[] = [];\n for (const tx of allTransactions) {\n const txId = await this.connection.sendTransaction(tx, { skipPreflight });\n await confirmTransaction(this.connection, txId);\n txIds.push(txId);\n }\n\n return { txIds, signedTxs: allTransactions };\n }\n\n return {\n txIds: await Promise.all(\n allTransactions.map(async (tx) => {\n return await this.connection.sendTransaction(tx, { skipPreflight });\n }),\n ),\n signedTxs: allTransactions,\n };\n }\n\n if (this.signAllTransactions) {\n const signedTxs = await this.signAllTransactions(allTransactions);\n\n if (sequentially) {\n let i = 0;\n const processedTxs: TxUpdateParams[] = [];\n const checkSendTx = async (): Promise<void> => {\n if (!signedTxs[i]) return;\n const txId = await this.connection.sendTransaction(signedTxs[i], { skipPreflight });\n processedTxs.push({ txId, status: \"sent\", signedTx: signedTxs[i] });\n onTxUpdate?.([...processedTxs]);\n i++;\n 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; splitIns?: TransactionInstruction[] },\n ): Promise<MultiTxBuildData> {\n const { splitIns = [], computeBudgetConfig, ...extInfo } = props || {};\n const computeBudgetData: { instructions: TransactionInstruction[]; instructionTypes: string[] } =\n computeBudgetConfig\n ? addComputeBudget(computeBudgetConfig)\n : {\n instructions: [],\n instructionTypes: [],\n };\n\n const signerKey: { [key: string]: Signer } = this.signers.reduce(\n (acc, cur) => ({ ...acc, [cur.publicKey.toBase58()]: cur }),\n {},\n );\n\n const allTransactions: Transaction[] = [];\n const allSigners: Signer[][] = [];\n\n let instructionQueue: TransactionInstruction[] = [];\n let splitInsIdx = 0;\n this.allInstructions.forEach((item) => {\n const _itemIns = [...instructionQueue, item];\n const _itemInsWithCompute = computeBudgetConfig ? [...computeBudgetData.instructions, ..._itemIns] : _itemIns;\n const _signerStrs = new Set<string>(\n _itemIns.map((i) => i.keys.filter((ii) => ii.isSigner).map((ii) => ii.pubkey.toString())).flat(),\n );\n const _signer = [..._signerStrs.values()].map((i) => new PublicKey(i));\n\n if (\n item !== splitIns[splitInsIdx] &&\n instructionQueue.length < 12 &&\n (checkLegacyTxSize({ instructions: _itemInsWithCompute, payer: this.feePayer, signers: _signer }) ||\n checkLegacyTxSize({ instructions: _itemIns, payer: this.feePayer, signers: _signer }))\n ) {\n // current ins add to queue still not exceed tx size limit\n instructionQueue.push(item);\n } else {\n if (instructionQueue.length === 0) throw Error(\"item ins too big\");\n splitInsIdx += item === splitIns[splitInsIdx] ? 1 : 0;\n // if add computeBudget still not exceed tx size limit\n if (\n checkLegacyTxSize({\n instructions: computeBudgetConfig\n ? [...computeBudgetData.instructions, ...instructionQueue]\n : [...instructionQueue],\n payer: this.feePayer,\n signers: _signer,\n })\n ) {\n allTransactions.push(new Transaction().add(...computeBudgetData.instructions, ...instructionQueue));\n } else {\n allTransactions.push(new Transaction().add(...instructionQueue));\n }\n allSigners.push(\n Array.from(\n new Set<string>(\n instructionQueue.map((i) => i.keys.filter((ii) => ii.isSigner).map((ii) => ii.pubkey.toString())).flat(),\n ),\n )\n .map((i) => signerKey[i])\n .filter((i) => i !== undefined),\n );\n instructionQueue = [item];\n }\n });\n\n if (instructionQueue.length > 0) {\n const _signerStrs = new Set<string>(\n instructionQueue.map((i) => i.keys.filter((ii) => ii.isSigner).map((ii) => ii.pubkey.toString())).flat(),\n );\n const _signers = [..._signerStrs.values()].map((i) => signerKey[i]).filter((i) => i !== undefined);\n\n if (\n checkLegacyTxSize({\n instructions: computeBudgetConfig\n ? [...computeBudgetData.instructions, ...instructionQueue]\n : [...instructionQueue],\n payer: this.feePayer,\n signers: _signers.map((s) => s.publicKey),\n })\n ) {\n allTransactions.push(new Transaction().add(...computeBudgetData.instructions, ...instructionQueue));\n } else {\n allTransactions.push(new Transaction().add(...instructionQueue));\n }\n allSigners.push(_signers);\n }\n allTransactions.forEach((tx) => (tx.feePayer = this.feePayer));\n\n if (this.owner?.signer) {\n allSigners.forEach((signers) => {\n if (!signers.some((s) => s.publicKey.equals(this.owner!.publicKey))) signers.push(this.owner!.signer!);\n });\n }\n\n return {\n builder: this,\n transactions: allTransactions,\n signers: allSigners,\n instructionTypes: this.instructionTypes,\n execute: async (executeParams?: MultiTxExecuteParam) => {\n const {\n sequentially,\n onTxUpdate,\n skipTxCount = 0,\n recentBlockHash: propBlockHash,\n skipPreflight = true,\n } = executeParams || {};\n const recentBlockHash = propBlockHash ?? (await getRecentBlockHash(this.connection, this.blockhashCommitment));\n allTransactions.forEach(async (tx, idx) => {\n tx.recentBlockhash = recentBlockHash;\n if (allSigners[idx].length) tx.sign(...allSigners[idx]);\n });\n printSimulate(allTransactions);\n if (this.owner?.isKeyPair) {\n if (sequentially) {\n let i = 0;\n const txIds: string[] = [];\n for (const tx of allTransactions) {\n ++i;\n if (i <= skipTxCount) {\n txIds.push(\"tx skipped\");\n continue;\n }\n const txId = await sendAndConfirmTransaction(\n this.connection,\n tx,\n this.signers.find((s) => s.publicKey.equals(this.owner!.publicKey))\n ? this.signers\n : [...this.signers, this.owner.signer!],\n { skipPreflight },\n );\n txIds.push(txId);\n }\n\n return {\n txIds,\n signedTxs: allTransactions,\n };\n }\n return {\n txIds: await Promise.all(\n allTransactions.map(async (tx) => {\n return await this.connection.sendRawTransaction(tx.serialize(), { skipPreflight });\n }),\n ),\n signedTxs: allTransactions,\n };\n }\n if (this.signAllTransactions) {\n const needSignedTx = await this.signAllTransactions(\n allTransactions.slice(skipTxCount, allTransactions.length),\n );\n const signedTxs = [...allTransactions.slice(0, skipTxCount), ...needSignedTx];\n if (sequentially) {\n let i = 0;\n const processedTxs: TxUpdateParams[] = [];\n const checkSendTx = async (): Promise<void> => {\n if (!signedTxs[i]) return;\n if (i < skipTxCount) {\n // success before, do not send again\n processedTxs.push({ txId: \"\", status: \"success\", signedTx: signedTxs[i] });\n onTxUpdate?.([...processedTxs]);\n i++;\n checkSendTx();\n }\n const txId = await this.connection.sendRawTransaction(signedTxs[i].serialize(), { skipPreflight });\n processedTxs.push({ txId, status: \"sent\", signedTx: signedTxs[i] });\n onTxUpdate?.([...processedTxs]);\n i++;\n 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 splitIns?: TransactionInstruction[];\n network?: NetworkName;\n },\n ): Promise<MultiTxV0BuildData> {\n const {\n computeBudgetConfig,\n splitIns = [],\n lookupTableCache = {},\n lookupTableAddress = [],\n network = this.network,\n ...extInfo\n } = props || {};\n const lookupTableAddressAccount = {\n ...(this.cluster === \"devnet\" ? {} : getLookupTableCache(network)),\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, network });\n for (const [key, value] of Object.entries(newCacheLTA)) lookupTableAddressAccount[key] = value;\n\n const computeBudgetData: { instructions: TransactionInstruction[]; instructionTypes: string[] } =\n computeBudgetConfig\n ? addComputeBudget(computeBudgetConfig)\n : {\n instructions: [],\n instructionTypes: [],\n };\n\n const blockHash = await getRecentBlockHash(this.connection, this.blockhashCommitment);\n\n const signerKey: { [key: string]: Signer } = this.signers.reduce(\n (acc, cur) => ({ ...acc, [cur.publicKey.toBase58()]: cur }),\n {},\n );\n const allTransactions: VersionedTransaction[] = [];\n const allSigners: Signer[][] = [];\n\n let instructionQueue: TransactionInstruction[] = [];\n let splitInsIdx = 0;\n this.allInstructions.forEach((item) => {\n const _itemIns = [...instructionQueue, item];\n const _itemInsWithCompute = computeBudgetConfig ? [...computeBudgetData.instructions, ..._itemIns] : _itemIns;\n if (\n item !== splitIns[splitInsIdx] &&\n instructionQueue.length < 12 &&\n (checkV0TxSize({ instructions: _itemInsWithCompute, payer: this.feePayer, lookupTableAddressAccount }) ||\n checkV0TxSize({ instructions: _itemIns, payer: this.feePayer, lookupTableAddressAccount }))\n ) {\n // current ins add to queue still not exceed tx size limit\n instructionQueue.push(item);\n } else {\n if (instructionQueue.length === 0) throw Error(\"item ins too big\");\n splitInsIdx += item === splitIns[splitInsIdx] ? 1 : 0;\n const lookupTableAddress: undefined | CacheLTA = {};\n for (const item of [...new Set<string>(allLTA)]) {\n if (lookupTableAddressAccount[item] !== undefined) lookupTableAddress[item] = lookupTableAddressAccount[item];\n }\n // if add computeBudget still not exceed tx size limit\n if (\n computeBudgetConfig &&\n checkV0TxSize({\n instructions: [...computeBudgetData.instructions, ...instructionQueue],\n payer: this.feePayer,\n lookupTableAddressAccount,\n recentBlockhash: blockHash,\n })\n ) {\n const messageV0 = new TransactionMessage({\n payerKey: this.feePayer,\n recentBlockhash: blockHash,\n\n instructions: [...computeBudgetData.instructions, ...instructionQueue],\n }).compileToV0Message(Object.values(lookupTableAddressAccount));\n allTransactions.push(new VersionedTransaction(messageV0));\n } else {\n const messageV0 = new TransactionMessage({\n payerKey: this.feePayer,\n recentBlockhash: blockHash,\n instructions: [...instructionQueue],\n }).compileToV0Message(Object.values(lookupTableAddressAccount));\n allTransactions.push(new VersionedTransaction(messageV0));\n }\n allSigners.push(\n Array.from(\n new Set<string>(\n instructionQueue.map((i) => i.keys.filter((ii) => ii.isSigner).map((ii) => ii.pubkey.toString())).flat(),\n ),\n )\n .map((i) => signerKey[i])\n .filter((i) => i !== undefined),\n );\n instructionQueue = [item];\n }\n });\n\n if (instructionQueue.length > 0) {\n const _signerStrs = new Set<string>(\n instructionQueue.map((i) => i.keys.filter((ii) => ii.isSigner).map((ii) => ii.pubkey.toString())).flat(),\n );\n const _signers = [..._signerStrs.values()].map((i) => signerKey[i]).filter((i) => i !== undefined);\n\n if (\n computeBudgetConfig &&\n checkV0TxSize({\n instructions: [...computeBudgetData.instructions, ...instructionQueue],\n payer: this.feePayer,\n lookupTableAddressAccount,\n recentBlockhash: blockHash,\n })\n ) {\n const messageV0 = new TransactionMessage({\n payerKey: this.feePayer,\n recentBlockhash: blockHash,\n instructions: [...computeBudgetData.instructions, ...instructionQueue],\n }).compileToV0Message(Object.values(lookupTableAddressAccount));\n allTransactions.push(new VersionedTransaction(messageV0));\n } else {\n const messageV0 = new TransactionMessage({\n payerKey: this.feePayer,\n recentBlockhash: blockHash,\n instructions: [...instructionQueue],\n }).compileToV0Message(Object.values(lookupTableAddressAccount));\n allTransactions.push(new VersionedTransaction(messageV0));\n }\n allSigners.push(_signers);\n }\n\n if (this.owner?.signer) {\n allSigners.forEach((signers) => {\n if (!signers.some((s) => s.publicKey.equals(this.owner!.publicKey))) signers.push(this.owner!.signer!);\n });\n }\n\n return {\n builder: this,\n transactions: allTransactions,\n buildProps: props,\n signers: allSigners,\n instructionTypes: this.instructionTypes,\n execute: async (executeParams?: MultiTxExecuteParam) => {\n const {\n sequentially,\n onTxUpdate,\n skipTxCount = 0,\n recentBlockHash: propBlockHash,\n skipPreflight = true,\n } = executeParams || {};\n allTransactions.map(async (tx, idx) => {\n if (allSigners[idx].length) tx.sign(allSigners[idx]);\n if (propBlockHash) tx.message.recentBlockhash = propBlockHash;\n });\n printSimulate(allTransactions);\n if (this.owner?.isKeyPair) {\n if (sequentially) {\n let i = 0;\n const txIds: string[] = [];\n for (const tx of allTransactions) {\n ++i;\n if (i <= skipTxCount) {\n console.log(\"skip tx: \", i);\n txIds.push(\"tx skipped\");\n continue;\n }\n const txId = await this.connection.sendTransaction(tx, { skipPreflight });\n await confirmTransaction(this.connection, txId);\n\n txIds.push(txId);\n }\n\n return { txIds, signedTxs: allTransactions };\n }\n\n return {\n txIds: await Promise.all(\n allTransactions.map(async (tx) => {\n return await this.connection.sendTransaction(tx, { skipPreflight });\n }),\n ),\n signedTxs: allTransactions,\n };\n }\n if (this.signAllTransactions) {\n const needSignedTx = await this.signAllTransactions(\n allTransactions.slice(skipTxCount, allTransactions.length),\n );\n const signedTxs = [...allTransactions.slice(0, skipTxCount), ...needSignedTx];\n if (sequentially) {\n let i = 0;\n const processedTxs: TxUpdateParams[] = [];\n const checkSendTx = async (): Promise<void> => {\n if (!signedTxs[i]) return;\n if (i < skipTxCount) {\n // success before, do not send again\n processedTxs.push({ txId: \"\", status: \"success\", signedTx: signedTxs[i] });\n onTxUpdate?.([...processedTxs]);\n i++;\n checkSendTx();\n return;\n }\n const txId = await this.connection.sendTransaction(signedTxs[i], { skipPreflight });\n processedTxs.push({ txId, status: \"sent\", signedTx: signedTxs[i] });\n onTxUpdate?.([...processedTxs]);\n i++;\n 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","import { AmmV4Keys, ApiV3Token, ClmmKeys, PoolKeys } from \"@/api\";\nimport {\n AMM_V4,\n BigNumberish,\n CREATE_CPMM_POOL_PROGRAM,\n fetchMultipleMintInfos,\n getCLMMProgramId,\n getMintAddresses,\n getMultipleAccountsInfoWithCustomFlags,\n minExpirationTime,\n parseBigNumberish,\n solToWSol,\n} from \"@/common\";\nimport { MakeMultiTxData, MakeTxData } from \"@/common/txTool/txTool\";\nimport { InstructionType, TxVersion } from \"@/common/txTool/txType\";\nimport { createTransferInstruction, TOKEN_2022_PROGRAM_ID, TOKEN_PROGRAM_ID } from \"@solana/spl-token\";\nimport { EpochInfo, PublicKey } from \"@solana/web3.js\";\nimport BN from \"bn.js\";\nimport Decimal from \"decimal.js\";\nimport { publicKey, struct } from \"../../marshmallow\";\nimport { Price, TokenAmount } from \"../../module\";\nimport { closeAccountInstruction, createWSolAccountInstructions } from \"../account/instruction\";\nimport { TokenAccount } from \"../account/types\";\nimport { ClmmRpcData, ComputeClmmPoolInfo, PoolUtils, ReturnTypeFetchMultiplePoolTickArrays } from \"../clmm\";\nimport { PoolInfoLayout } from \"../clmm/layout\";\nimport { CpmmComputeData, CpmmPoolInfoLayout, getPdaPoolAuthority } from \"../cpmm\";\nimport {\n AmmRpcData,\n ComputeAmountOutParam,\n getLiquidityAssociatedAuthority,\n liquidityStateV4Layout,\n toAmmComputePoolInfo,\n} from \"../liquidity\";\nimport ModuleBase, { ModuleBaseProps } from \"../moduleBase\";\nimport { Market, MARKET_STATE_LAYOUT_V3 } from \"../serum\";\nimport { toApiV3Token, toToken, toTokenAmount } from \"../token\";\nimport { ComputeBudgetConfig, ReturnTypeFetchMultipleMintInfos } from \"../type\";\nimport { makeSwapInstruction } from \"./instrument\";\nimport {\n BasicPoolInfo,\n ComputeAmountOutAmmLayout,\n ComputeAmountOutLayout,\n ComputePoolType,\n ComputeRoutePathType,\n ReturnTypeFetchMultipleInfo,\n ReturnTypeGetAllRoute,\n RoutePathType,\n} from \"./type\";\nimport { NetworkName } from \"@/config\";\n\nconst ZERO = new BN(0);\nexport default class TradeV2 extends ModuleBase {\n constructor(params: ModuleBaseProps) {\n super(params);\n }\n private async getWSolAccounts(): Promise<TokenAccount[]> {\n this.scope.checkOwner();\n await this.scope.account.fetchWalletTokenAccounts();\n const tokenAccounts = this.scope.account.tokenAccounts.filter((acc) => acc.mint.equals(getMintAddresses(this.network).WSOLMint));\n tokenAccounts.sort((a, b) => {\n if (a.isAssociated) return 1;\n if (b.isAssociated) return -1;\n return a.amount.lt(b.amount) ? -1 : 1;\n });\n return tokenAccounts;\n }\n\n public async unWrapWSol<T extends TxVersion>(props: {\n amount: BigNumberish;\n computeBudgetConfig?: ComputeBudgetConfig;\n tokenProgram?: PublicKey;\n txVersion?: T;\n }): Promise<MakeTxData<T>> {\n const { amount, tokenProgram, txVersion = TxVersion.LEGACY } = props;\n const tokenAccounts = await this.getWSolAccounts();\n const txBuilder = this.createTxBuilder();\n txBuilder.addCustomComputeBudget(props.computeBudgetConfig);\n const ins = await createWSolAccountInstructions({\n connection: this.scope.connection,\n owner: this.scope.ownerPubKey,\n payer: this.scope.ownerPubKey,\n amount: 0,\n network: this.network,\n });\n txBuilder.addInstruction(ins);\n\n const amountBN = parseBigNumberish(amount);\n for (let i = 0; i < tokenAccounts.length; i++) {\n if (amountBN.gte(tokenAccounts[i].amount)) {\n txBuilder.addInstruction({\n instructions: [\n closeAccountInstruction({\n tokenAccount: tokenAccounts[i].publicKey!,\n payer: this.scope.ownerPubKey,\n owner: this.scope.ownerPubKey,\n programId: tokenProgram,\n }),\n ],\n });\n amountBN.sub(tokenAccounts[i].amount);\n } else {\n txBuilder.addInstruction({\n instructions: [\n closeAccountInstruction({\n tokenAccount: tokenAccounts[i].publicKey!,\n payer: this.scope.ownerPubKey,\n owner: this.scope.ownerPubKey,\n programId: tokenProgram,\n }),\n ],\n });\n }\n }\n\n return txBuilder.versionBuild({ txVersion }) as Promise<MakeTxData<T>>;\n }\n\n public async wrapWSol<T extends TxVersion>(\n amount: BigNumberish,\n tokenProgram?: PublicKey,\n txVersion?: T,\n ): Promise<MakeTxData<T>> {\n // const tokenAccounts = await this.getWSolAccounts();\n\n const txBuilder = this.createTxBuilder();\n\n const ins = await createWSolAccountInstructions({\n connection: this.scope.connection,\n owner: this.scope.ownerPubKey,\n payer: this.scope.ownerPubKey,\n amount,\n skipCloseAccount: true,\n network: this.network,\n });\n txBuilder.addInstruction(ins);\n\n // if (tokenAccounts.length) {\n // // already have wsol account\n // txBuilder.addInstruction({\n // instructions: [\n // makeTransferInstruction({\n // destination: tokenAccounts[0].publicKey!,\n // source: ins.addresses.newAccount,\n // amount,\n // owner: this.scope.ownerPubKey,\n // tokenProgram,\n // }),\n // ],\n // endInstructions: [\n // closeAccountInstruction({\n // tokenAccount: ins.addresses.newAccount,\n // payer: this.scope.ownerPubKey,\n // owner: this.scope.ownerPubKey,\n // programId: tokenProgram,\n // }),\n // ],\n // });\n // }\n return txBuilder.versionBuild({ txVersion: txVersion ?? TxVersion.LEGACY }) as Promise<MakeTxData<T>>;\n }\n\n public async swap<T extends TxVersion>({\n swapInfo,\n swapPoolKeys,\n ownerInfo,\n computeBudgetConfig,\n routeProgram,\n txVersion,\n }: {\n txVersion: T;\n swapInfo: ComputeAmountOutLayout;\n swapPoolKeys?: PoolKeys[];\n ownerInfo: {\n associatedOnly: boolean;\n checkCreateATAOwner: boolean;\n };\n routeProgram: PublicKey;\n computeBudgetConfig?: ComputeBudgetConfig;\n }): Promise<MakeMultiTxData<T>> {\n const txBuilder = this.createTxBuilder();\n\n const amountIn = swapInfo.amountIn;\n const amountOut = swapInfo.amountOut;\n const useSolBalance = amountIn.amount.token.mint.equals(getMintAddresses(this.network).WSOLMint);\n const isOutputSol = amountOut.amount.token.mint.equals(getMintAddresses(this.network).WSOLMint);\n const inputMint = amountIn.amount.token.mint;\n const outputMint = amountOut.amount.token.mint;\n\n const { account: sourceAcc, instructionParams: sourceAccInsParams } =\n await this.scope.account.getOrCreateTokenAccount({\n tokenProgram: amountIn.amount.token.isToken2022 ? TOKEN_2022_PROGRAM_ID : TOKEN_PROGRAM_ID,\n mint: inputMint,\n notUseTokenAccount: useSolBalance,\n owner: this.scope.ownerPubKey,\n skipCloseAccount: !useSolBalance,\n createInfo: useSolBalance\n ? {\n payer: this.scope.ownerPubKey,\n amount: amountIn.amount.raw,\n }\n : undefined,\n associatedOnly: useSolBalance ? false : ownerInfo.associatedOnly,\n checkCreateATAOwner: ownerInfo.checkCreateATAOwner,\n });\n\n sourceAccInsParams && txBuilder.addInstruction(sourceAccInsParams);\n\n if (sourceAcc === undefined) {\n throw Error(\"input account check error\");\n }\n\n let destinationAcc: PublicKey;\n if (swapInfo.routeType === \"route\" && !isOutputSol) {\n destinationAcc = this.scope.account.getAssociatedTokenAccount(\n outputMint,\n amountOut.amount.token.isToken2022 ? TOKEN_2022_PROGRAM_ID : TOKEN_PROGRAM_ID,\n );\n } else {\n const { account, instructionParams } = await this.scope.account.getOrCreateTokenAccount({\n tokenProgram: amountOut.amount.token.isToken2022 ? TOKEN_2022_PROGRAM_ID : TOKEN_PROGRAM_ID,\n mint: outputMint,\n notUseTokenAccount: isOutputSol,\n owner: this.scope.ownerPubKey,\n skipCloseAccount: true,\n createInfo: {\n payer: this.scope.ownerPubKey,\n amount: 0,\n },\n associatedOnly: isOutputSol ? false : ownerInfo.associatedOnly,\n checkCreateATAOwner: ownerInfo.checkCreateATAOwner,\n });\n destinationAcc = account!;\n instructionParams && txBuilder.addInstruction(instructionParams);\n }\n\n if (isOutputSol) {\n txBuilder.addInstruction({\n endInstructions: [\n closeAccountInstruction({\n owner: this.scope.ownerPubKey,\n payer: this.scope.ownerPubKey,\n tokenAccount: destinationAcc,\n programId: TOKEN_PROGRAM_ID,\n }),\n ],\n endInstructionTypes: [InstructionType.CloseAccount],\n });\n }\n\n let routeTokenAcc: PublicKey | undefined = undefined;\n if (swapInfo.routeType === \"route\") {\n const middleMint = swapInfo.middleToken;\n routeTokenAcc = this.scope.account.getAssociatedTokenAccount(\n middleMint.mint,\n middleMint.isToken2022 ? TOKEN_2022_PROGRAM_ID : TOKEN_PROGRAM_ID,\n );\n }\n\n const poolKeys = swapPoolKeys ? swapPoolKeys : await this.computePoolToPoolKeys({ pools: swapInfo.poolInfoList });\n const swapIns = makeSwapInstruction({\n routeProgram,\n inputMint,\n swapInfo: {\n ...swapInfo,\n poolInfo: [...swapInfo.poolInfoList],\n poolKey: poolKeys,\n outputMint,\n },\n ownerInfo: {\n wallet: this.scope.ownerPubKey,\n sourceToken: sourceAcc,\n routeToken: routeTokenAcc,\n destinationToken: destinationAcc!,\n },\n });\n\n if (swapInfo.feeConfig !== undefined) {\n const checkTxBuilder = this.createTxBuilder();\n checkTxBuilder.addInstruction({\n instructions: [\n createTransferInstruction(\n sourceAcc,\n swapInfo.feeConfig.feeAccount,\n this.scope.ownerPubKey,\n swapInfo.feeConfig.feeAmount.toNumber(),\n ),\n ],\n instructionTypes: [InstructionType.TransferAmount],\n });\n checkTxBuilder.addInstruction(swapIns);\n\n const { transactions } =\n txVersion === TxVersion.V0 ? await checkTxBuilder.sizeCheckBuildV0() : await checkTxBuilder.sizeCheckBuild();\n if (transactions.length < 2) {\n txBuilder.addInstruction({\n instructions: [\n createTransferInstruction(\n sourceAcc,\n swapInfo.feeConfig.feeAccount,\n this.scope.ownerPubKey,\n swapInfo.feeConfig.feeAmount.toNumber(),\n ),\n ],\n instructionTypes: [InstructionType.TransferAmount],\n });\n }\n }\n txBuilder.addInstruction(swapIns);\n\n if (txVersion === TxVersion.V0)\n return txBuilder.sizeCheckBuildV0({ computeBudgetConfig, address: swapIns.address }) as Promise<\n MakeMultiTxData<T>\n >;\n return txBuilder.sizeCheckBuild({ computeBudgetConfig, address: swapIns.address }) as Promise<MakeMultiTxData<T>>;\n }\n\n // get all amm/clmm/cpmm pools data only with id and mint\n public async fetchRoutePoolBasicInfo(programIds?: { amm: PublicKey; clmm: PublicKey; cpmm: PublicKey }): Promise<{\n ammPools: BasicPoolInfo[];\n clmmPools: BasicPoolInfo[];\n cpmmPools: BasicPoolInfo[];\n network: NetworkName;\n }> {\n const { amm = AMM_V4, clmm = getCLMMProgramId(this.network), cpmm = CREATE_CPMM_POOL_PROGRAM } = programIds || {};\n const ammPoolsData = await this.scope.connection.getProgramAccounts(amm, {\n dataSlice: { offset: liquidityStateV4Layout.offsetOf(\"baseMint\"), length: 64 },\n });\n\n const layoutAmm = struct([publicKey(\"baseMint\"), publicKey(\"quoteMint\")]);\n const ammData = ammPoolsData.map((data) => ({\n id: data.pubkey,\n version: 4,\n mintA: layoutAmm.decode(data.account.data).baseMint,\n mintB: layoutAmm.decode(data.account.data).quoteMint,\n }));\n\n const layout = struct([publicKey(\"mintA\"), publicKey(\"mintB\")]);\n const clmmPoolsData = await this.scope.connection.getProgramAccounts(clmm, {\n filters: [{ dataSize: PoolInfoLayout.span }],\n dataSlice: { offset: PoolInfoLayout.offsetOf(\"mintA\"), length: 64 },\n });\n\n const clmmData = clmmPoolsData.map((data) => {\n const clmm = layout.decode(data.account.data);\n return {\n id: data.pubkey,\n version: 6,\n mintA: clmm.mintA,\n mintB: clmm.mintB,\n };\n });\n\n const cpmmPools = await this.scope.connection.getProgramAccounts(cpmm, {\n dataSlice: { offset: CpmmPoolInfoLayout.offsetOf(\"mintA\"), length: 64 },\n });\n\n const cpmmData = cpmmPools.map((data) => {\n const clmm = layout.decode(data.account.data);\n return {\n id: data.pubkey,\n version: 7,\n mintA: clmm.mintA,\n mintB: clmm.mintB,\n };\n });\n\n return {\n network: this.network,\n clmmPools: clmmData,\n ammPools: ammData,\n cpmmPools: cpmmData,\n };\n }\n\n // get pools with in routes\n public getAllRoute({\n inputMint,\n outputMint,\n clmmPools,\n ammPools,\n cpmmPools,\n }: {\n inputMint: PublicKey;\n outputMint: PublicKey;\n clmmPools: BasicPoolInfo[];\n ammPools: BasicPoolInfo[];\n cpmmPools: BasicPoolInfo[];\n }): ReturnTypeGetAllRoute {\n inputMint = inputMint.toString() === PublicKey.default.toString() ? getMintAddresses(this.network).WSOLMint : inputMint;\n outputMint = outputMint.toString() === PublicKey.default.toString() ? getMintAddresses(this.network).WSOLMint : outputMint;\n\n const needSimulate: { [poolKey: string]: BasicPoolInfo } = {};\n const needTickArray: { [poolKey: string]: BasicPoolInfo } = {};\n const cpmmPoolList: { [poolKey: string]: BasicPoolInfo } = {};\n\n const directPath: BasicPoolInfo[] = [];\n\n const routePathDict: RoutePathType = {}; // {[route mint: string]: {in: [] , out: []}}\n\n for (const itemClmmPool of clmmPools ?? []) {\n if (\n (itemClmmPool.mintA.equals(inputMint) && itemClmmPool.mintB.equals(outputMint)) ||\n (itemClmmPool.mintA.equals(outputMint) && itemClmmPool.mintB.equals(inputMint))\n ) {\n directPath.push(itemClmmPool);\n needTickArray[itemClmmPool.id.toString()] = itemClmmPool;\n }\n\n if (itemClmmPool.mintA.equals(inputMint)) {\n const t = itemClmmPool.mintB.toString();\n if (routePathDict[t] === undefined)\n routePathDict[t] = {\n mintProgram: TOKEN_PROGRAM_ID, // to fetch later\n in: [],\n out: [],\n mDecimals: 0, // to fetch later\n };\n routePathDict[t].in.push(itemClmmPool);\n }\n if (itemClmmPool.mintB.equals(inputMint)) {\n const t = itemClmmPool.mintA.toString();\n if (routePathDict[t] === undefined)\n routePathDict[t] = {\n mintProgram: TOKEN_PROGRAM_ID, // to fetch later\n in: [],\n out: [],\n mDecimals: 0, // to fetch later\n };\n routePathDict[t].in.push(itemClmmPool);\n }\n if (itemClmmPool.mintA.equals(outputMint)) {\n const t = itemClmmPool.mintB.toString();\n if (routePathDict[t] === undefined)\n routePathDict[t] = {\n mintProgram: TOKEN_PROGRAM_ID, // to fetch later\n in: [],\n out: [],\n mDecimals: 0, // to fetch later\n };\n routePathDict[t].out.push(itemClmmPool);\n }\n if (itemClmmPool.mintB.equals(outputMint)) {\n const t = itemClmmPool.mintA.toString();\n if (routePathDict[t] === undefined)\n routePathDict[t] = {\n mintProgram: TOKEN_PROGRAM_ID, // to fetch later\n in: [],\n out: [],\n mDecimals: 0, // to fetch later\n };\n routePathDict[t].out.push(itemClmmPool);\n }\n }\n\n const addLiquidityPools: BasicPoolInfo[] = [];\n\n for (const itemAmmPool of ammPools) {\n if (\n (itemAmmPool.mintA.equals(inputMint) && itemAmmPool.mintB.equals(outputMint)) ||\n (itemAmmPool.mintA.equals(outputMint) && itemAmmPool.mintB.equals(inputMint))\n ) {\n directPath.push(itemAmmPool);\n needSimulate[itemAmmPool.id.toBase58()] = itemAmmPool;\n addLiquidityPools.push(itemAmmPool);\n }\n if (itemAmmPool.mintA.equals(inputMint)) {\n if (routePathDict[itemAmmPool.mintB.toBase58()] === undefined)\n routePathDict[itemAmmPool.mintB.toBase58()] = {\n mintProgram: TOKEN_PROGRAM_ID,\n in: [],\n out: [],\n mDecimals: 0, // to fetch later\n };\n routePathDict[itemAmmPool.mintB.toBase58()].in.push(itemAmmPool);\n }\n if (itemAmmPool.mintB.equals(inputMint)) {\n if (routePathDict[itemAmmPool.mintA.toBase58()] === undefined)\n routePathDict[itemAmmPool.mintA.toBase58()] = {\n mintProgram: TOKEN_PROGRAM_ID,\n in: [],\n out: [],\n mDecimals: 0, // to fetch later\n };\n routePathDict[itemAmmPool.mintA.toBase58()].in.push(itemAmmPool);\n }\n if (itemAmmPool.mintA.equals(outputMint)) {\n if (routePathDict[itemAmmPool.mintB.toBase58()] === undefined)\n routePathDict[itemAmmPool.mintB.toBase58()] = {\n mintProgram: TOKEN_PROGRAM_ID,\n in: [],\n out: [],\n mDecimals: 0, // to fetch later\n };\n routePathDict[itemAmmPool.mintB.toBase58()].out.push(itemAmmPool);\n }\n if (itemAmmPool.mintB.equals(outputMint)) {\n if (routePathDict[itemAmmPool.mintA.toBase58()] === undefined)\n routePathDict[itemAmmPool.mintA.toBase58()] = {\n mintProgram: TOKEN_PROGRAM_ID,\n in: [],\n out: [],\n mDecimals: 0, // to fetch later\n };\n routePathDict[itemAmmPool.mintA.toBase58()].out.push(itemAmmPool);\n }\n }\n\n for (const itemCpmmPool of cpmmPools) {\n if (\n (itemCpmmPool.mintA.equals(inputMint) && itemCpmmPool.mintB.equals(outputMint)) ||\n (itemCpmmPool.mintA.equals(outputMint) && itemCpmmPool.mintB.equals(inputMint))\n ) {\n directPath.push(itemCpmmPool);\n cpmmPoolList[itemCpmmPool.id.toBase58()] = itemCpmmPool;\n }\n if (itemCpmmPool.mintA.equals(inputMint)) {\n if (routePathDict[itemCpmmPool.mintB.toBase58()] === undefined)\n routePathDict[itemCpmmPool.mintB.toBase58()] = {\n mintProgram: TOKEN_PROGRAM_ID,\n in: [],\n out: [],\n mDecimals: 0, // to fetch later\n };\n routePathDict[itemCpmmPool.mintB.toBase58()].in.push(itemCpmmPool);\n }\n if (itemCpmmPool.mintB.equals(inputMint)) {\n if (routePathDict[itemCpmmPool.mintA.toBase58()] === undefined)\n routePathDict[itemCpmmPool.mintA.toBase58()] = {\n mintProgram: TOKEN_PROGRAM_ID,\n in: [],\n out: [],\n mDecimals: 0, // to fetch later\n };\n routePathDict[itemCpmmPool.mintA.toBase58()].in.push(itemCpmmPool);\n }\n if (itemCpmmPool.mintA.equals(outputMint)) {\n if (routePathDict[itemCpmmPool.mintB.toBase58()] === undefined)\n routePathDict[itemCpmmPool.mintB.toBase58()] = {\n mintProgram: TOKEN_PROGRAM_ID,\n in: [],\n out: [],\n mDecimals: 0, // to fetch later\n };\n routePathDict[itemCpmmPool.mintB.toBase58()].out.push(itemCpmmPool);\n }\n if (itemCpmmPool.mintB.equals(outputMint)) {\n if (routePathDict[itemCpmmPool.mintA.toBase58()] === undefined)\n routePathDict[itemCpmmPool.mintA.toBase58()] = {\n mintProgram: TOKEN_PROGRAM_ID,\n in: [],\n out: [],\n mDecimals: 0, // to fetch later\n };\n routePathDict[itemCpmmPool.mintA.toBase58()].out.push(itemCpmmPool);\n }\n }\n\n for (const t of Object.keys(routePathDict)) {\n if (\n routePathDict[t].in.length === 1 &&\n routePathDict[t].out.length === 1 &&\n routePathDict[t].in[0].id.equals(routePathDict[t].out[0].id)\n ) {\n delete routePathDict[t];\n continue;\n }\n if (routePathDict[t].in.length === 0 || routePathDict[t].out.length === 0) {\n delete routePathDict[t];\n continue;\n }\n\n const info = routePathDict[t];\n\n for (const infoIn of info.in) {\n for (const infoOut of info.out) {\n if (infoIn.version === 6 && needTickArray[infoIn.id.toString()] === undefined) {\n needTickArray[infoIn.id.toString()] = infoIn;\n } else if (infoIn.version === 7 && cpmmPoolList[infoIn.id.toString()] === undefined) {\n cpmmPoolList[infoIn.id.toString()] = infoIn;\n } else if (\n (infoIn.version === 4 || infoIn.version === 5) &&\n needSimulate[infoIn.id.toString()] === undefined\n ) {\n needSimulate[infoIn.id.toString()] = infoIn;\n }\n if (infoOut.version === 6 && needTickArray[infoOut.id.toString()] === undefined) {\n needTickArray[infoOut.id.toString()] = infoOut;\n } else if (infoOut.version === 7 && cpmmPoolList[infoOut.id.toString()] === undefined) {\n cpmmPoolList[infoOut.id.toString()] = infoOut;\n } else if (\n (infoOut.version === 4 || infoOut.version === 5) &&\n needSimulate[infoOut.id.toString()] === undefined\n ) {\n needSimulate[infoOut.id.toString()] = infoOut;\n }\n }\n }\n }\n\n return {\n directPath,\n addLiquidityPools,\n routePathDict,\n needSimulate: Object.values(needSimulate),\n needTickArray: Object.values(needTickArray),\n cpmmPoolList: Object.values(cpmmPoolList),\n };\n }\n\n // fetch pools detail info in route\n public async fetchSwapRoutesData({\n routes,\n inputMint,\n outputMint,\n }: {\n inputMint: string | PublicKey;\n outputMint: string | PublicKey;\n routes: ReturnTypeGetAllRoute;\n }): Promise<{\n mintInfos: ReturnTypeFetchMultipleMintInfos;\n ammPoolsRpcInfo: Record<string, AmmRpcData>;\n ammSimulateCache: Record<string, ComputeAmountOutParam[\"poolInfo\"]>;\n clmmPoolsRpcInfo: Record<string, ClmmRpcData>;\n computeClmmPoolInfo: Record<string, ComputeClmmPoolInfo>;\n computePoolTickData: ReturnTypeFetchMultiplePoolTickArrays;\n computeCpmmData: Record<string, CpmmComputeData>;\n routePathDict: ComputeRoutePathType;\n }> {\n const mintSet = new Set([\n ...routes.needTickArray.map((p) => [p.mintA.toBase58(), p.mintB.toBase58()]).flat(),\n inputMint.toString(),\n outputMint.toString(),\n ]);\n\n console.log(\"fetching amm pools info, total: \", routes.needSimulate.length);\n const ammPoolsRpcInfo = await this.scope.liquidity.getRpcPoolInfos(routes.needSimulate.map((p) => p.id));\n const ammSimulateCache = toAmmComputePoolInfo(ammPoolsRpcInfo, this.network);\n\n let mintInfos: ReturnTypeFetchMultipleMintInfos = {};\n // amm doesn't support token2022 yet, so don't need to fetch mint info\n Object.values(ammSimulateCache).forEach((p) => {\n mintSet.delete(p.mintA.address);\n mintInfos[p.mintA.address] = {\n address: new PublicKey(p.mintA.address),\n programId: TOKEN_PROGRAM_ID,\n mintAuthority: null,\n supply: BigInt(0),\n decimals: p.mintA.decimals,\n isInitialized: true,\n freezeAuthority: null,\n tlvData: Buffer.from(\"0\", \"hex\"),\n feeConfig: undefined,\n };\n\n mintSet.delete(p.mintB.address);\n mintInfos[p.mintB.address] = {\n address: new PublicKey(p.mintB.address),\n programId: TOKEN_PROGRAM_ID,\n mintAuthority: null,\n supply: BigInt(0),\n decimals: p.mintB.decimals,\n isInitialized: true,\n freezeAuthority: null,\n tlvData: Buffer.from(\"0\", \"hex\"),\n feeConfig: undefined,\n };\n });\n\n console.log(\"fetching cpmm pools info, total: \", routes.cpmmPoolList.length);\n const cpmmPoolsRpcInfo = await this.scope.cpmm.getRpcPoolInfos(\n routes.cpmmPoolList.map((p) => p.id.toBase58()),\n true,\n );\n\n Object.values(cpmmPoolsRpcInfo).forEach((p) => {\n const [mintA, mintB] = [p.mintA.toBase58(), p.mintB.toBase58()];\n if (p.mintProgramA.equals(TOKEN_PROGRAM_ID)) {\n mintSet.delete(mintA);\n mintInfos[mintA] = {\n address: p.mintA,\n programId: p.mintProgramA,\n mintAuthority: null,\n supply: BigInt(0),\n decimals: p.mintDecimalA,\n isInitialized: true,\n freezeAuthority: null,\n tlvData: Buffer.from(\"0\", \"hex\"),\n feeConfig: undefined,\n };\n } else mintSet.add(mintA); // 2022, need to fetch fee config\n if (p.mintProgramB.equals(TOKEN_PROGRAM_ID)) {\n mintSet.delete(mintB);\n mintInfos[mintB] = {\n address: p.mintB,\n programId: p.mintProgramB,\n mintAuthority: null,\n supply: BigInt(0),\n decimals: p.mintDecimalB,\n isInitialized: true,\n freezeAuthority: null,\n tlvData: Buffer.from(\"0\", \"hex\"),\n feeConfig: undefined,\n };\n } else mintSet.add(mintB); // 2022, need to fetch fee config\n });\n\n console.log(\"fetching mints info, total: \", mintSet.size);\n const fetchMintInfoRes = await fetchMultipleMintInfos({\n connection: this.scope.connection,\n mints: Array.from(mintSet).map((m) => new PublicKey(m)),\n network: this.network,\n });\n\n mintInfos = {\n ...mintInfos,\n ...fetchMintInfoRes,\n };\n\n const computeCpmmData = this.scope.cpmm.toComputePoolInfos({\n pools: cpmmPoolsRpcInfo,\n mintInfos,\n });\n\n console.log(\"fetching clmm pools info, total:\", routes.needTickArray.length);\n const clmmPoolsRpcInfo = await this.scope.clmm.getRpcClmmPoolInfos({\n poolIds: routes.needTickArray.map((p) => p.id),\n });\n const { computeClmmPoolInfo, computePoolTickData } = await this.scope.clmm.getComputeClmmPoolInfos({\n clmmPoolsRpcInfo,\n mintInfos,\n });\n\n // update route pool mint info\n const routePathDict = Object.keys(routes.routePathDict).reduce((acc, cur) => {\n return {\n ...acc,\n [cur]: {\n ...routes.routePathDict[cur],\n mintProgram: mintInfos[cur].programId,\n mDecimals: mintInfos[cur].decimals,\n in: routes.routePathDict[cur].in.map(\n (p) =>\n ammSimulateCache[p.id.toBase58()] ||\n computeClmmPoolInfo[p.id.toBase58()] ||\n computeCpmmData[p.id.toBase58()],\n ),\n out: routes.routePathDict[cur].out.map(\n (p) =>\n ammSimulateCache[p.id.toBase58()] ||\n computeClmmPoolInfo[p.id.toBase58()] ||\n computeCpmmData[p.id.toBase58()],\n ),\n },\n };\n }, {} as ComputeRoutePathType);\n\n return {\n mintInfos,\n\n ammPoolsRpcInfo,\n ammSimulateCache,\n\n clmmPoolsRpcInfo,\n computeClmmPoolInfo,\n computePoolTickData,\n\n computeCpmmData,\n\n routePathDict,\n };\n }\n\n // compute amount from routes\n public getAllRouteComputeAmountOut({\n inputTokenAmount,\n outputToken: propOutputToken,\n directPath,\n routePathDict,\n simulateCache,\n tickCache,\n slippage,\n chainTime,\n epochInfo,\n feeConfig,\n }: {\n directPath: ComputePoolType[];\n routePathDict: ComputeRoutePathType;\n simulateCache: ReturnTypeFetchMultipleInfo;\n tickCache: ReturnTypeFetchMultiplePoolTickArrays;\n\n mintInfos: ReturnTypeFetchMultipleMintInfos;\n\n inputTokenAmount: TokenAmount;\n outputToken: ApiV3Token;\n slippage: number;\n chainTime: number;\n epochInfo: EpochInfo;\n\n feeConfig?: {\n feeBps: BN;\n feeAccount: PublicKey;\n };\n }): ComputeAmountOutLayout[] {\n const _amountInFee =\n feeConfig === undefined\n ? new BN(0)\n : inputTokenAmount.raw.mul(new BN(feeConfig.feeBps.toNumber())).div(new BN(10000));\n const _amoutIn = inputTokenAmount.raw.sub(_amountInFee);\n const amountIn = new TokenAmount(inputTokenAmount.token, _amoutIn);\n const _inFeeConfig =\n feeConfig === undefined\n ? undefined\n : {\n feeAmount: _amountInFee,\n feeAccount: feeConfig.feeAccount,\n };\n const outputToken = {\n ...propOutputToken,\n address: solToWSol(propOutputToken.address, this.network).toString(),\n };\n const outRoute: ComputeAmountOutLayout[] = [];\n for (const itemPool of directPath) {\n try {\n outRoute.push({\n ...this.computeAmountOut({\n itemPool,\n tickCache,\n simulateCache,\n chainTime,\n epochInfo,\n slippage,\n outputToken,\n amountIn,\n }),\n feeConfig: _inFeeConfig,\n });\n } catch (e: any) {\n this.logDebug(\"direct error\", itemPool.version, itemPool.id.toString(), e.message);\n /* empty */\n }\n }\n this.logDebug(\"direct done\");\n for (const [routeMint, info] of Object.entries(routePathDict)) {\n // const routeToken = new Token(info.mintProgram, routeMint, info.mDecimals);\n const routeToken = {\n chainId: 101,\n address: routeMint,\n programId: info.mintProgram.toBase58(),\n logoURI: \"\",\n symbol: \"\",\n name: \"\",\n decimals: info.mDecimals,\n tags: [],\n extensions: {},\n };\n const maxFirstIn = info.in\n .map((i) => {\n try {\n return {\n pool: i,\n data: this.computeAmountOut({\n itemPool: i,\n tickCache,\n simulateCache,\n chainTime,\n epochInfo,\n slippage,\n outputToken: routeToken,\n amountIn,\n }),\n };\n } catch (e: any) {\n this.logDebug(\"route in error\", i.version, i.id.toString(), e.message);\n return undefined;\n }\n })\n .sort((_a, _b) => {\n const a = _a === undefined ? ZERO : _a.data.amountOut.amount.raw.sub(_a.data.amountOut.fee?.raw ?? ZERO);\n const b = _b === undefined ? ZERO : _b.data.amountOut.amount.raw.sub(_b.data.amountOut.fee?.raw ?? ZERO);\n return a.lt(b) ? 1 : -1;\n })[0];\n if (maxFirstIn === undefined) continue;\n const routeAmountIn = new TokenAmount(\n toToken(routeToken),\n maxFirstIn.data.amountOut.amount.raw.sub(maxFirstIn.data.amountOut.fee?.raw ?? ZERO),\n );\n for (const iOutPool of info.out) {\n try {\n const outC = this.computeAmountOut({\n itemPool: iOutPool,\n tickCache,\n simulateCache,\n chainTime,\n epochInfo,\n slippage,\n outputToken,\n amountIn: routeAmountIn,\n });\n outRoute.push({\n ...outC,\n allTrade: maxFirstIn.data.allTrade && outC.allTrade ? true : false,\n amountIn: maxFirstIn.data.amountIn,\n amountOut: outC.amountOut,\n minAmountOut: outC.minAmountOut,\n currentPrice: undefined,\n executionPrice: new Decimal(\n new Price({\n baseToken: maxFirstIn.data.amountIn.amount.token,\n denominator: maxFirstIn.data.amountIn.amount.raw,\n quoteToken: outC.amountOut.amount.token,\n numerator: outC.amountOut.amount.raw.sub(outC.amountOut.fee?.raw ?? ZERO),\n }).toFixed(),\n ),\n priceImpact: new Decimal(maxFirstIn.data.priceImpact.add(outC.priceImpact).toFixed()),\n fee: [maxFirstIn.data.fee[0], outC.fee[0]],\n routeType: \"route\",\n poolInfoList: [maxFirstIn.pool, iOutPool],\n remainingAccounts: [maxFirstIn.data.remainingAccounts[0], outC.remainingAccounts[0]],\n minMiddleAmountFee: outC.amountOut.fee?.raw\n ? new TokenAmount(\n (maxFirstIn.data.amountOut.amount as TokenAmount).token,\n (maxFirstIn.data.amountOut.fee?.raw ?? ZERO).add(outC.amountOut.fee?.raw ?? ZERO),\n )\n : undefined,\n middleToken: (maxFirstIn.data.amountOut.amount as TokenAmount).token,\n poolReady: maxFirstIn.data.poolReady && outC.poolReady,\n poolType: [maxFirstIn.data.poolType, outC.poolType],\n feeConfig: _inFeeConfig,\n expirationTime: minExpirationTime(maxFirstIn.data.expirationTime, outC.expirationTime),\n });\n } catch (e: any) {\n this.logDebug(\"route out error\", iOutPool.version, iOutPool.id.toString(), e.message);\n /* empty */\n }\n }\n }\n\n return outRoute\n .filter((i) => {\n if (!i.allTrade)\n this.logDebug(`pool ${i.poolInfoList.map((p) => p.id.toString()).join(\",\")} filter out since not all trade`);\n return i.allTrade;\n })\n .sort((a, b) => (a.amountOut.amount.raw.sub(b.amountOut.amount.raw).gt(ZERO) ? -1 : 1));\n }\n\n /** trade related utils */\n\n private computeAmountOut({\n itemPool,\n tickCache,\n simulateCache,\n chainTime,\n epochInfo,\n slippage,\n outputToken,\n amountIn,\n }: {\n itemPool: ComputePoolType;\n tickCache: ReturnTypeFetchMultiplePoolTickArrays;\n simulateCache: ReturnTypeFetchMultipleInfo;\n chainTime: number;\n epochInfo: EpochInfo;\n amountIn: TokenAmount;\n outputToken: ApiV3Token;\n slippage: number;\n }): ComputeAmountOutAmmLayout {\n if (itemPool.version === 6) {\n const {\n allTrade,\n realAmountIn,\n amountOut,\n minAmountOut,\n expirationTime,\n currentPrice,\n executionPrice,\n priceImpact,\n fee,\n remainingAccounts,\n executionPriceX64,\n } = PoolUtils.computeAmountOutFormat({\n poolInfo: itemPool,\n tickArrayCache: tickCache[itemPool.id.toString()],\n amountIn: amountIn.raw,\n tokenOut: outputToken,\n slippage,\n epochInfo,\n catchLiquidityInsufficient: true,\n });\n return {\n allTrade,\n amountIn: realAmountIn,\n amountOut,\n minAmountOut,\n currentPrice: new Decimal(currentPrice.toFixed()),\n executionPrice: new Decimal(executionPrice.toFixed()),\n priceImpact: new Decimal(priceImpact.toFixed()),\n fee: [fee],\n remainingAccounts: [remainingAccounts],\n routeType: \"amm\",\n poolInfoList: [itemPool],\n poolReady: itemPool.startTime < chainTime,\n poolType: \"CLMM\",\n slippage,\n clmmExPriceX64: [executionPriceX64],\n expirationTime: minExpirationTime(realAmountIn.expirationTime, expirationTime),\n };\n } else if (itemPool.version === 7) {\n const { allTrade, executionPrice, amountOut, minAmountOut, priceImpact, fee } = this.scope.cpmm.computeSwapAmount(\n {\n pool: itemPool,\n outputMint: outputToken.address,\n amountIn: amountIn.raw,\n slippage,\n },\n );\n\n return {\n allTrade,\n amountIn: { amount: amountIn, fee: undefined, expirationTime: undefined },\n amountOut: {\n amount: toTokenAmount({\n ...outputToken,\n amount: amountOut,\n network: this.network,\n }),\n fee: undefined,\n expirationTime: undefined,\n },\n minAmountOut: {\n amount: toTokenAmount({\n ...outputToken,\n amount: minAmountOut,\n network: this.network,\n }),\n fee: undefined,\n expirationTime: undefined,\n },\n currentPrice: itemPool.poolPrice,\n executionPrice,\n priceImpact,\n fee: [new TokenAmount(amountIn.token, fee)],\n remainingAccounts: [],\n routeType: \"amm\",\n poolInfoList: [itemPool],\n poolReady: itemPool.openTime.toNumber() < chainTime,\n poolType: \"CPMM\",\n slippage,\n clmmExPriceX64: [undefined],\n expirationTime: undefined,\n };\n } else {\n if (![1, 6, 7].includes(simulateCache[itemPool.id.toString()].status)) throw Error(\"swap error\");\n const { amountOut, minAmountOut, currentPrice, executionPrice, priceImpact, fee } =\n this.scope.liquidity.computeAmountOut({\n poolInfo: simulateCache[itemPool.id.toString()],\n amountIn: amountIn.raw,\n mintIn: amountIn.token.mint,\n mintOut: outputToken.address,\n slippage,\n });\n return {\n amountIn: { amount: amountIn, fee: undefined, expirationTime: undefined },\n amountOut: {\n amount: toTokenAmount({\n ...outputToken,\n amount: amountOut,\n network: this.network,\n }),\n fee: undefined,\n expirationTime: undefined,\n },\n minAmountOut: {\n amount: toTokenAmount({\n ...outputToken,\n amount: minAmountOut, \n network: this.network,\n }),\n fee: undefined,\n expirationTime: undefined,\n },\n currentPrice,\n executionPrice,\n priceImpact,\n fee: [new TokenAmount(amountIn.token, fee)],\n routeType: \"amm\",\n poolInfoList: [itemPool],\n remainingAccounts: [],\n poolReady: Number(simulateCache[itemPool.id as string].openTime) < chainTime,\n poolType: itemPool.version === 5 ? \"STABLE\" : undefined,\n expirationTime: undefined,\n allTrade: true,\n slippage,\n clmmExPriceX64: [undefined],\n };\n }\n }\n\n public async computePoolToPoolKeys({\n pools,\n clmmRpcData = {},\n ammRpcData = {},\n }: {\n pools: ComputePoolType[];\n clmmRpcData?: Record<string, ClmmRpcData>;\n ammRpcData?: Record<string, AmmRpcData>;\n }): Promise<PoolKeys[]> {\n const clmmFetchKeys = new Set(\n pools.filter((p) => p.version === 6 && !clmmRpcData[p.id.toString()]).map((p) => p.id.toString()),\n );\n if (clmmFetchKeys.size > 0) {\n const clmmData = await this.scope.clmm.getRpcClmmPoolInfos({ poolIds: Array.from(clmmFetchKeys) });\n Object.keys(clmmData).forEach((poolId) => {\n clmmRpcData[poolId] = clmmData[poolId];\n });\n }\n\n const ammFetchKeys = new Set(\n pools.filter((p) => p.version === 4 && !ammRpcData[p.id.toString()]).map((p) => p.id.toString()),\n );\n if (ammFetchKeys.size > 0) {\n const ammData = await this.scope.liquidity.getRpcPoolInfos(Array.from(clmmFetchKeys));\n Object.keys(ammData).forEach((poolId) => {\n ammRpcData[poolId] = ammData[poolId];\n });\n }\n\n const ammMarketFetchKeys = new Set(\n pools.filter((p) => p.version === 4).map((p) => (p as ComputeAmountOutParam[\"poolInfo\"]).marketId),\n );\n const marketData: Record<\n string,\n {\n marketProgramId: string;\n marketId: string;\n marketAuthority: string;\n marketBaseVault: string;\n marketQuoteVault: string;\n marketBids: string;\n marketAsks: string;\n marketEventQueue: string;\n }\n > = {};\n if (ammMarketFetchKeys.size > 0) {\n const marketAccount = await getMultipleAccountsInfoWithCustomFlags(\n this.scope.connection,\n Array.from(ammMarketFetchKeys).map((p) => ({ pubkey: new PublicKey(p) })),\n );\n marketAccount.forEach((m) => {\n if (!m.accountInfo) return;\n const itemMarketInfo = MARKET_STATE_LAYOUT_V3.decode(m.accountInfo.data);\n marketData[m.pubkey.toBase58()] = {\n marketId: m.pubkey.toString(),\n marketProgramId: m.accountInfo.owner.toString(),\n marketAuthority: Market.getAssociatedAuthority({\n programId: m.accountInfo.owner,\n marketId: m.pubkey,\n }).publicKey.toString(),\n marketBaseVault: itemMarketInfo.baseVault.toString(),\n marketQuoteVault: itemMarketInfo.quoteVault.toString(),\n marketBids: itemMarketInfo.bids.toString(),\n marketAsks: itemMarketInfo.asks.toString(),\n marketEventQueue: itemMarketInfo.eventQueue.toString(),\n };\n });\n }\n\n const poolKeys: PoolKeys[] = [];\n pools.forEach((pool) => {\n if (pool.version === 6) {\n const rpcInfo = clmmRpcData[pool.id.toString()];\n const clmmKeys: ClmmKeys = {\n programId: pool.programId.toBase58(),\n id: pool.id.toBase58(),\n mintA: pool.mintA,\n mintB: pool.mintB,\n openTime: String(pool.startTime),\n vault: {\n A: rpcInfo.vaultA.toBase58(),\n B: rpcInfo.vaultB.toBase58(),\n },\n config: {\n ...pool.ammConfig,\n id: pool.ammConfig.id.toString(),\n defaultRange: 0,\n defaultRangePoint: [],\n },\n rewardInfos: [],\n observationId: pool.observationId.toBase58(),\n exBitmapAccount: pool.exBitmapAccount.toBase58(),\n };\n poolKeys.push(clmmKeys);\n } else if (pool.version === 4) {\n const rpcInfo = ammRpcData[pool.id.toString()];\n const ammKeys: AmmV4Keys = {\n programId: pool.programId,\n id: pool.id,\n mintA: pool.mintA,\n mintB: pool.mintB,\n openTime: String(pool.openTime),\n vault: {\n A: rpcInfo.baseVault.toBase58(),\n B: rpcInfo.quoteVault.toBase58(),\n },\n authority: getLiquidityAssociatedAuthority({ programId: new PublicKey(pool.programId) }).publicKey.toString(),\n openOrders: rpcInfo.openOrders.toBase58(),\n targetOrders: rpcInfo.targetOrders.toBase58(),\n mintLp: pool.lpMint,\n ...marketData[pool.marketId],\n };\n poolKeys.push(ammKeys);\n } else if (pool.version === 7) {\n poolKeys.push({\n observationId: pool.observationId.toBase58(),\n programId: pool.programId.toBase58(),\n id: pool.id.toBase58(),\n mintA: pool.mintA,\n mintB: pool.mintB,\n openTime: String(pool.openTime),\n authority: getPdaPoolAuthority(pool.programId).publicKey.toBase58(),\n vault: {\n A: pool.vaultA.toBase58(),\n B: pool.vaultB.toBase58(),\n },\n mintLp: toApiV3Token({\n address: pool.mintLp.toBase58(),\n programId: TOKEN_PROGRAM_ID.toBase58(),\n decimals: pool.lpDecimals,\n network: this.network,\n }),\n config: {\n id: pool.configId.toBase58(),\n ...pool.configInfo,\n protocolFeeRate: pool.configInfo.protocolFeeRate.toNumber(),\n tradeFeeRate: pool.configInfo.tradeFeeRate.toNumber(),\n fundFeeRate: pool.configInfo.fundFeeRate.toNumber(),\n createPoolFee: pool.configInfo.createPoolFee.toString(),\n },\n });\n }\n });\n return poolKeys;\n }\n}\n","import { PublicKey } from \"@solana/web3.js\";\nimport BN, { isBN } from \"bn.js\";\n\nimport {\n bits,\n blob,\n Blob,\n Layout,\n offset as _offset,\n seq as _seq,\n Structure as _Structure,\n u32 as _u32,\n u8 as _u8,\n UInt,\n union as _union,\n Union as _Union,\n} from \"./buffer-layout\";\n\nexport * from \"./buffer-layout\";\nexport { blob };\n\nexport class BNLayout<P extends string = \"\"> extends Layout<BN, P> {\n blob: Layout<Buffer>;\n signed: boolean;\n\n constructor(span: number, signed: boolean, property?: P) {\n //@ts-expect-error type wrong for super()'s type different from extends, but it desn't matter\n super(span, property);\n this.blob = blob(span);\n this.signed = signed;\n }\n\n /** @override */\n decode(b: Buffer, offset = 0): BN {\n const num = new BN(this.blob.decode(b, offset), 10, \"le\");\n if (this.signed) {\n return num.fromTwos(this.span * 8).clone();\n }\n return num;\n }\n\n /** @override */\n encode(src: BN, b: Buffer, offset = 0): number {\n if (typeof src === \"number\") src = new BN(src); // src will pass a number accidently in union\n if (this.signed) {\n src = src.toTwos(this.span * 8);\n }\n return this.blob.encode(src.toArrayLike(Buffer, \"le\", this.span), b, offset);\n }\n}\n\nexport class WideBits<P extends string = \"\"> extends Layout<Record<string, boolean>, P> {\n _lower: any;\n _upper: any;\n // TODO: unknown\n constructor(property?: P) {\n //@ts-expect-error type wrong for super()'s type different from extends , but it desn't matter\n super(8, property);\n this._lower = bits(_u32(), false);\n this._upper = bits(_u32(), false);\n }\n\n addBoolean(property: string): void {\n if (this._lower.fields.length < 32) {\n this._lower.addBoolean(property);\n } else {\n this._upper.addBoolean(property);\n }\n }\n\n decode(b: Buffer, offset = 0): Record<string, boolean> {\n const lowerDecoded = this._lower.decode(b, offset);\n const upperDecoded = this._upper.decode(b, offset + this._lower.span);\n return { ...lowerDecoded, ...upperDecoded };\n }\n\n encode(src: any /* TEMP */, b: Buffer, offset = 0): any {\n return this._lower.encode(src, b, offset) + this._upper.encode(src, b, offset + this._lower.span);\n }\n}\n\nexport function u8<P extends string = \"\">(property?: P): UInt<number, P> {\n return new UInt(1, property);\n}\n\nexport function u32<P extends string = \"\">(property?: P): UInt<number, P> {\n return new UInt(4, property);\n}\n\nexport function u64<P extends string = \"\">(property?: P): BNLayout<P> {\n return new BNLayout(8, false, property);\n}\n\nexport function u128<P extends string = \"\">(property?: P): BNLayout<P> {\n return new BNLayout(16, false, property);\n}\n\nexport function i8<P extends string = \"\">(property?: P): BNLayout<P> {\n return new BNLayout(1, true, property);\n}\n\nexport function i64<P extends string = \"\">(property?: P): BNLayout<P> {\n return new BNLayout(8, true, property);\n}\n\nexport function i128<P extends string = \"\">(property?: P): BNLayout<P> {\n return new BNLayout(16, true, property);\n}\n\nexport class WrappedLayout<T, U, P extends string = \"\"> extends Layout<U, P> {\n layout: Layout<T>;\n decoder: (data: T) => U;\n encoder: (src: U) => T;\n\n constructor(layout: Layout<T>, decoder: (data: T) => U, encoder: (src: U) => T, property?: P) {\n //@ts-expect-error type wrong for super()'s type different from extends , but it desn't matter\n super(layout.span, property);\n this.layout = layout;\n this.decoder = decoder;\n this.encoder = encoder;\n }\n\n decode(b: Buffer, offset?: number): U {\n return this.decoder(this.layout.decode(b, offset));\n }\n\n encode(src: U, b: Buffer, offset?: number): number {\n return this.layout.encode(this.encoder(src), b, offset);\n }\n\n getSpan(b: Buffer, offset?: number): number {\n return this.layout.getSpan(b, offset);\n }\n}\n\nexport function publicKey<P extends string = \"\">(property?: P): Layout<PublicKey, P> {\n return new WrappedLayout(\n blob(32),\n (b: Buffer) => new PublicKey(b),\n (key: PublicKey) => key.toBuffer(),\n property,\n );\n}\n\nexport class OptionLayout<T, P> extends Layout<T | null, P> {\n layout: Layout<T>;\n discriminator: Layout<number>;\n\n constructor(layout: Layout<T>, property?: P) {\n //@ts-expect-error type wrong for super()'s type different from extends , but it desn't matter\n super(-1, property);\n this.layout = layout;\n this.discriminator = _u8();\n }\n\n encode(src: T | null, b: Buffer, offset = 0): number {\n if (src === null || src === undefined) {\n return this.discriminator.encode(0, b, offset);\n }\n this.discriminator.encode(1, b, offset);\n return this.layout.encode(src, b, offset + 1) + 1;\n }\n\n decode(b: Buffer, offset = 0): T | null {\n const discriminator = this.discriminator.decode(b, offset);\n if (discriminator === 0) {\n return null;\n } else if (discriminator === 1) {\n return this.layout.decode(b, offset + 1);\n }\n throw new Error(\"Invalid option \" + this.property);\n }\n\n getSpan(b: Buffer, offset = 0): number {\n const discriminator = this.discriminator.decode(b, offset);\n if (discriminator === 0) {\n return 1;\n } else if (discriminator === 1) {\n return this.layout.getSpan(b, offset + 1) + 1;\n }\n throw new Error(\"Invalid option \" + this.property);\n }\n}\n\nexport function option<T, P extends string = \"\">(layout: Layout<T>, property?: P): Layout<T | null, P> {\n return new OptionLayout<T, P>(layout, property);\n}\n\nexport function bool<P extends string = \"\">(property?: P): Layout<boolean, P> {\n return new WrappedLayout(_u8(), decodeBool, encodeBool, property);\n}\n\nexport function decodeBool(value: number): boolean {\n if (value === 0) {\n return false;\n } else if (value === 1) {\n return true;\n }\n throw new Error(\"Invalid bool: \" + value);\n}\n\nexport function encodeBool(value: boolean): number {\n return value ? 1 : 0;\n}\n\nexport function vec<T, P extends string = \"\">(elementLayout: Layout<T>, property?: P): Layout<T[], P> {\n const length = _u32(\"length\");\n const layout: Layout<{ values: T[] }> = struct([\n length,\n seq(elementLayout, _offset(length, -length.span), \"values\"),\n ]) as any; // Something I don't know\n return new WrappedLayout(\n layout,\n ({ values }) => values,\n (values) => ({ values }),\n property,\n );\n}\n\nexport function tagged<T, P extends string = \"\">(tag: BN, layout: Layout<T>, property?: P): Layout<T, P> {\n const wrappedLayout: Layout<{ tag: BN; data: T }> = struct([u64(\"tag\"), layout.replicate(\"data\")]) as any; // Something I don't know\n\n function decodeTag({ tag: receivedTag, data }: { tag: BN; data: T }): T {\n if (!receivedTag.eq(tag)) {\n throw new Error(\"Invalid tag, expected: \" + tag.toString(\"hex\") + \", got: \" + receivedTag.toString(\"hex\"));\n }\n return data;\n }\n\n return new WrappedLayout(wrappedLayout, decodeTag, (data) => ({ tag, data }), property);\n}\n\nexport function vecU8<P extends string = \"\">(property?: P): Layout<Buffer, P> {\n const length = _u32(\"length\");\n const layout: Layout<{ data: Buffer }> = struct([length, blob(_offset(length, -length.span), \"data\")]) as any; // Something I don't know\n return new WrappedLayout(\n layout,\n ({ data }) => data,\n (data) => ({ data }),\n property,\n );\n}\n\nexport function str<P extends string = \"\">(property?: P): Layout<string, P> {\n return new WrappedLayout(\n vecU8(),\n (data) => data.toString(\"utf-8\"),\n (s) => Buffer.from(s, \"utf-8\"),\n property,\n );\n}\n\nexport interface EnumLayout<T, P extends string = \"\"> extends Layout<T, P> {\n registry: Record<string, Layout<any>>;\n}\n\nexport function rustEnum<T, P extends string = \"\">(variants: Layout<any>[], property?: P): EnumLayout<T, P> {\n const unionLayout = _union(_u8(), property);\n variants.forEach((variant, index) => unionLayout.addVariant(index, variant, variant.property));\n return unionLayout as any; // ?why use UnionLayout? This must be a fault\n}\n\nexport function array<T, P extends string = \"\">(\n elementLayout: Layout<T>,\n length: number,\n property?: P,\n): Layout<T[], P> {\n const layout = struct([seq(elementLayout, length, \"values\")]) as any as Layout<{ values: T[] }>; // Something I don't know\n return new WrappedLayout(\n layout,\n ({ values }) => values,\n (values) => ({ values }),\n property,\n );\n}\n\nexport class Structure<T, P, D extends { [key: string]: any; }> extends _Structure<T, P, D> {\n /** @override */\n decode(b: Buffer, offset?: number): D {\n return super.decode(b, offset);\n }\n}\n\nexport function struct<T, P extends string = \"\">(\n fields: T,\n property?: P,\n decodePrefixes?: boolean,\n): T extends Layout<infer Value, infer Property>[]\n ? Structure<\n Value,\n P,\n {\n [K in Exclude<Extract<Property, string>, \"\">]: Extract<T[number], Layout<any, K>> extends Layout<infer V, any>\n ? V\n : any;\n }\n >\n : any {\n //@ts-expect-error this type is not quite satisfied the define, but, never no need to worry about.\n return new Structure(fields, property, decodePrefixes);\n}\n\nexport type GetLayoutSchemaFromStructure<T extends Structure<any, any, any>> = T extends Structure<any, any, infer S>\n ? S\n : any;\nexport type GetStructureFromLayoutSchema<S extends { [key: string]: any; }> = Structure<any, any, S>;\n\nexport class Union<Schema extends { [key: string]: any; }> extends _Union<Schema> {\n encodeInstruction(instruction: any): Buffer {\n const instructionMaxSpan = Math.max(...Object.values(this.registry).map((r) => r.span));\n const b = Buffer.alloc(instructionMaxSpan);\n return b.slice(0, this.encode(instruction, b));\n }\n\n decodeInstruction(instruction: any): Partial<Schema> {\n return this.decode(instruction);\n }\n}\nexport function union<UnionSchema extends { [key: string]: any } = any>(\n discr: any,\n defaultLayout?: any,\n property?: string,\n): Union<UnionSchema> {\n return new Union(discr, defaultLayout, property);\n}\n\nclass Zeros extends Blob {\n decode(b: Buffer, offset: number): Buffer {\n const slice = super.decode(b, offset);\n if (!slice.every((v) => v === 0)) {\n throw new Error(\"nonzero padding bytes\");\n }\n return slice;\n }\n}\n\nexport function zeros(length: number): Zeros {\n return new Zeros(length);\n}\n\nexport function seq<T, P extends string = \"\", AnotherP extends string = \"\">(\n elementLayout: Layout<T, P>,\n count: number | BN | Layout<BN | number, P>,\n property?: AnotherP,\n): Layout<T[], AnotherP> {\n let parsedCount: number;\n const superCount =\n typeof count === \"number\"\n ? count\n : isBN(count)\n ? count.toNumber()\n : new Proxy(count as unknown as Layout<number> /* pretend to be Layout<number> */, {\n get(target, property): any {\n if (!parsedCount) {\n // get count in targetLayout. note that count may be BN\n const countProperty = Reflect.get(target, \"count\");\n\n // let targetLayout's property:count be a number\n parsedCount = isBN(countProperty) ? countProperty.toNumber() : countProperty;\n\n // record the count\n Reflect.set(target, \"count\", parsedCount);\n }\n return Reflect.get(target, property);\n },\n set(target, property, value): any {\n if (property === \"count\") {\n parsedCount = value;\n }\n return Reflect.set(target, property, value);\n },\n });\n\n // @ts-expect-error force type\n return _seq(elementLayout, superCount, property);\n}\n","import {\n bits as _bits,\n BitStructure as _BitStructure,\n blob as _blob,\n Blob as _Blob,\n cstr as _cstr,\n f32 as _f32,\n f32be as _f32be,\n f64 as _f64,\n f64be as _f64be,\n greedy as _greedy,\n Layout as _Layout,\n ns64 as _ns64,\n ns64be as _ns64be,\n nu64 as _nu64,\n nu64be as _nu64be,\n offset as _offset,\n s16 as _s16,\n s16be as _s16be,\n s24 as _s24,\n s24be as _s24be,\n s32 as _s32,\n s32be as _s32be,\n s40 as _s40,\n s40be as _s40be,\n s48 as _s48,\n s48be as _s48be,\n s8 as _s8,\n seq as _seq,\n struct as _struct,\n Structure as _Structure,\n u16 as _u16,\n u16be as _u16be,\n u24 as _u24,\n u24be as _u24be,\n u32 as _u32,\n u32be as _u32be,\n u40 as _u40,\n u40be as _u40be,\n u48 as _u48,\n u48be as _u48be,\n u8 as _u8,\n UInt as _UInt,\n union as _union,\n Union as _Union,\n unionLayoutDiscriminator as _unionLayoutDiscriminator,\n utf8 as _utf8,\n} from \"@solana/buffer-layout\";\n\n//#region ------------------- Layout -------------------\nexport interface Layout<T = any, P = \"\"> {\n span: number;\n property?: P;\n decode(b: Buffer, offset?: number): T;\n encode(src: T, b: Buffer, offset?: number): number;\n getSpan(b: Buffer, offset?: number): number;\n replicate<AP extends string>(name: AP): Layout<T, AP>;\n}\nexport interface LayoutConstructor {\n new <T, P>(): Layout<T, P>; // for class extends syntex\n new <T, P>(span?: T, property?: P): Layout<T, P>;\n readonly prototype: Layout;\n}\nexport const Layout = _Layout as unknown as LayoutConstructor;\n//#endregion\n\n//#region ------------------- Structure -------------------\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport interface Structure<T = any, P = \"\", DecodeSchema extends { [key: string]: any } = any>\n extends Layout<DecodeSchema, P> {\n span: number;\n decode(b: Buffer, offset?: number): DecodeSchema;\n layoutFor<AP extends string>(property: AP): Layout<DecodeSchema[AP]>;\n offsetOf<AP extends string>(property: AP): number;\n}\ninterface StructureConstructor {\n new <T = any, P = \"\", DecodeSchema extends { [key: string]: any } = any>(): Structure<T, P, DecodeSchema>;\n new <T = any, P = \"\", DecodeSchema extends { [key: string]: any } = any>(\n fields: T,\n property?: P,\n decodePrefixes?: boolean,\n ): Structure<T, P, DecodeSchema>;\n}\nexport const Structure = _Structure as unknown as StructureConstructor;\n//#endregion\n\n//#region ------------------- Union -------------------\nexport interface Union<UnionSchema extends { [key: string]: any } = any> extends Layout {\n registry: object;\n decode(b: Buffer, offset?: number): Partial<UnionSchema>;\n addVariant(\n variant: number,\n layout: Structure<any, any, Partial<UnionSchema>> | Layout<any, keyof UnionSchema>,\n property?: string,\n ): any /* TEMP: code in Layout.js 1809 */;\n}\ninterface UnionConstructor {\n new <UnionSchema extends { [key: string]: any } = any>(): Union<UnionSchema>;\n new <UnionSchema extends { [key: string]: any } = any>(\n discr: Layout<any, any>,\n defaultLayout: Layout<any, any>,\n property?: string,\n ): Union<UnionSchema>;\n}\nexport const Union = _Union as unknown as UnionConstructor;\n//#endregion\n\n//#region ------------------- BitStructure -------------------\nexport type BitStructure<T = unknown /* TEMP */, P = \"\"> = Layout<T, P>;\ninterface BitStructureConstructor {\n new (...params: any[]): BitStructure;\n}\nexport const BitStructure = _BitStructure as BitStructureConstructor;\n//#endregion\n\n//#region ------------------- UInt -------------------\nexport type UInt<T = any, P = \"\"> = Layout<T, P>;\ninterface UIntConstructor {\n new <T, P>(span?: T, property?: P): UInt<T, P>;\n}\nexport const UInt = _UInt as UIntConstructor;\n//#endregion\n\n//#region ------------------- Blob -------------------\nexport type Blob<P extends string = \"\"> = Layout<Buffer, P>;\ninterface BlobConstructor {\n new (...params: ConstructorParameters<LayoutConstructor>): Blob;\n}\nexport const Blob = _Blob as unknown as BlobConstructor;\n//#endregion\n\nexport const greedy = _greedy as <P extends string = \"\">(elementSpan?: number, property?: P) => Layout<number, P>;\nexport const u8 = _u8 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const u16 = _u16 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const u24 = _u24 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const u32 = _u32 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const u40 = _u40 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const u48 = _u48 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const nu64 = _nu64 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const u16be = _u16be as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const u24be = _u24be as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const u32be = _u32be as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const u40be = _u40be as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const u48be = _u48be as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const nu64be = _nu64be as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const s8 = _s8 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const s16 = _s16 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const s24 = _s24 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const s32 = _s32 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const s40 = _s40 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const s48 = _s48 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const ns64 = _ns64 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const s16be = _s16be as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const s24be = _s24be as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const s32be = _s32be as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const s40be = _s40be as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const s48be = _s48be as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const ns64be = _ns64be as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const f32 = _f32 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const f32be = _f32be as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const f64 = _f64 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const f64be = _f64be as <P extends string = \"\">(property?: P) => Layout<number, P>;\n\nexport const struct = _struct as <T, P extends string = \"\">(\n fields: T,\n property?: P,\n decodePrefixes?: boolean,\n) => T extends Layout<infer Value, infer Property>[]\n ? Structure<\n Value,\n P,\n {\n [K in Exclude<Extract<Property, string>, \"\">]: Extract<T[number], Layout<any, K>> extends Layout<infer V, any>\n ? V\n : any;\n }\n >\n : any;\n\nexport const seq = _seq as unknown as <T, P>(\n elementLayout: Layout<T, string>,\n count: number | Layout<number, string>,\n property?: P,\n) => Layout<T[]>;\nexport const union = _union as <UnionSchema extends { [key: string]: any } = any>(\n discr: Layout<any, any>,\n defaultLayout?: any,\n property?: string,\n) => Union<UnionSchema>;\nexport const unionLayoutDiscriminator = _unionLayoutDiscriminator as <P extends string = \"\">(\n layout: Layout<any, P>,\n property?: P,\n) => any;\nexport const blob = _blob as unknown as <P extends string = \"\">(\n length: number | Layout<number, P>,\n property?: P,\n) => Blob<P>;\nexport const cstr = _cstr as <P extends string = \"\">(property?: P) => Layout<string, P>;\nexport const utf8 = _utf8 as <P extends string = \"\">(maxSpan: number, property?: P) => Layout<string, P>;\nexport const bits = _bits as unknown as <T, P extends string = \"\">(\n word: Layout<T>,\n msb?: boolean,\n property?: P,\n) => BitStructure<T, P>; // TODO: not quite sure\nexport const offset = _offset as unknown as <T, P extends string = \"\">(\n layout: Layout<T, P>,\n offset?: number,\n property?: P,\n) => Layout<T, P>;\n\nexport type GetStructureSchema<T extends Structure> = T extends Structure<any, any, infer S> ? S : unknown;\n","import { BigNumberish, parseBigNumberish } from \"@/common\";\nimport { AddInstructionParam } from \"@/common/txTool/txTool\";\nimport { InstructionType } from \"@/common/txTool/txType\";\nimport { NetworkName } from \"@/config\";\nimport {\n createCloseAccountInstruction,\n createInitializeAccountInstruction,\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 { getTokenWSol } from \"../token/constant\";\nimport { splAccountLayout } from \"./layout\";\nimport { generatePubKey } from \"./util\";\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 network: NetworkName;\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, network } = 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(getTokenWSol(network).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 { publicKey, struct, u32, u64, u8 } from \"../../marshmallow\";\n\nexport const splAccountLayout = struct([\n publicKey(\"mint\"),\n publicKey(\"owner\"),\n u64(\"amount\"),\n u32(\"delegateOption\"),\n publicKey(\"delegate\"),\n u8(\"state\"),\n u32(\"isNativeOption\"),\n u64(\"isNative\"),\n u64(\"delegatedAmount\"),\n u32(\"closeAuthorityOption\"),\n publicKey(\"closeAuthority\"),\n]);\n","import { sha256 } from \"@noble/hashes/sha256\";\nimport { TOKEN_PROGRAM_ID } from \"@solana/spl-token\";\nimport { AccountInfo, GetProgramAccountsResponse, Keypair, PublicKey, RpcResponseAndContext } from \"@solana/web3.js\";\nimport BN from \"bn.js\";\nimport { createLogger, getATAAddress } from \"../../common\";\nimport { splAccountLayout } from \"./layout\";\nimport { TokenAccount, TokenAccountRaw } from \"./types\";\n\nconst logger = createLogger(\"CobaltX_Util\");\n\nexport interface ParseTokenAccount {\n owner: PublicKey;\n solAccountResp?: AccountInfo<Buffer> | null;\n tokenAccountResp: RpcResponseAndContext<GetProgramAccountsResponse>;\n}\n\nexport function parseTokenAccountResp({ owner, solAccountResp, tokenAccountResp }: ParseTokenAccount): {\n tokenAccounts: TokenAccount[];\n tokenAccountRawInfos: TokenAccountRaw[];\n} {\n const tokenAccounts: TokenAccount[] = [];\n const tokenAccountRawInfos: TokenAccountRaw[] = [];\n\n for (const { pubkey, account } of tokenAccountResp.value) {\n const accountInfo = splAccountLayout.decode(account.data);\n const { mint, amount } = accountInfo;\n tokenAccounts.push({\n publicKey: pubkey,\n mint,\n amount,\n isAssociated: getATAAddress(owner, mint, account.owner).publicKey.equals(pubkey),\n isNative: false,\n programId: account.owner,\n });\n // todo programId should get from api\n tokenAccountRawInfos.push({ pubkey, accountInfo, programId: account.owner });\n }\n\n if (solAccountResp) {\n tokenAccounts.push({\n mint: PublicKey.default,\n amount: new BN(String(solAccountResp.lamports)),\n isNative: true,\n programId: solAccountResp.owner,\n });\n }\n\n return {\n tokenAccounts,\n tokenAccountRawInfos,\n };\n}\n\nexport function generatePubKey({\n fromPublicKey,\n programId = TOKEN_PROGRAM_ID,\n assignSeed,\n}: {\n fromPublicKey: PublicKey;\n programId: PublicKey;\n assignSeed?: string;\n}): { publicKey: PublicKey; seed: string } {\n const seed = assignSeed ? btoa(assignSeed).slice(0, 32) : Keypair.generate().publicKey.toBase58().slice(0, 32);\n const publicKey = createWithSeed(fromPublicKey, seed, programId);\n return { publicKey, seed };\n}\n\nfunction createWithSeed(fromPublicKey: PublicKey, seed: string, programId: PublicKey): PublicKey {\n const buffer = Buffer.concat([fromPublicKey.toBuffer(), Buffer.from(seed), programId.toBuffer()]);\n const publicKeyBytes = sha256(buffer);\n return new PublicKey(publicKeyBytes);\n}\n","import {\n CLMM_LOCK_AUTH_ID,\n CLMM_LOCK_PROGRAM_ID,\n InstructionType,\n fetchMultipleMintInfos,\n getATAAddress,\n getCLMMProgramId,\n getMintAddresses,\n getMultipleAccountsInfoWithCustomFlags\n} from \"@/common\";\nimport { MakeMultiTxData, MakeTxData } from \"@/common/txTool/txTool\";\nimport { TxVersion } from \"@/common/txTool/txType\";\nimport { NetworkName } from \"@/config\";\nimport { AccountLayout, TOKEN_2022_PROGRAM_ID, TOKEN_PROGRAM_ID } from \"@solana/spl-token\";\nimport { PublicKey } from \"@solana/web3.js\";\nimport BN from \"bn.js\";\nimport Decimal from \"decimal.js\";\nimport { ApiV3PoolInfoConcentratedItem, ClmmKeys } from \"../../api/type\";\nimport ModuleBase, { ModuleBaseProps } from \"../moduleBase\";\nimport { getTokenWSol } from \"../token\";\nimport { toApiV3Token, toFeeConfig } from \"../token/utils\";\nimport { ComputeBudgetConfig, MakeTransaction, ReturnTypeFetchMultipleMintInfos } from \"../type\";\nimport { ClmmInstrument } from \"./instrument\";\nimport { ClmmConfigLayout, ClmmPositionLayout, OperationLayout, PoolInfoLayout, PositionInfoLayout } from \"./layout\";\nimport {\n ClmmLockAddress,\n ClmmRpcData,\n ClosePositionExtInfo,\n CollectRewardParams,\n CollectRewardsParams,\n ComputeClmmPoolInfo,\n CreateConcentratedPool,\n DecreaseLiquidity,\n HarvestAllRewardsParams,\n HarvestLockPosition,\n IncreasePositionFromBase,\n IncreasePositionFromLiquidity,\n InitRewardExtInfo,\n InitRewardParams,\n InitRewardsParams,\n LockPosition,\n ManipulateLiquidityExtInfo,\n OpenPositionFromBase,\n OpenPositionFromBaseExtInfo,\n OpenPositionFromLiquidity,\n OpenPositionFromLiquidityExtInfo,\n ReturnTypeFetchMultiplePoolTickArrays,\n SetRewardParams,\n SetRewardsParams,\n} from \"./type\";\nimport { MAX_SQRT_PRICE_X64, MIN_SQRT_PRICE_X64, mockV3CreatePoolInfo } from \"./utils/constants\";\nimport { MathUtil, SqrtPriceMath } from \"./utils/math\";\nimport {\n getPdaExBitmapAccount,\n getPdaLockClPositionIdV2,\n getPdaOperationAccount,\n getPdaPersonalPositionAddress,\n getPdaProtocolPositionAddress,\n getPdaTickArrayAddress,\n} from \"./utils/pda\";\nimport { PoolUtils, clmmComputeInfoToApiInfo } from \"./utils/pool\";\nimport { TickUtils } from \"./utils/tick\";\n\nexport class Clmm extends ModuleBase {\n public network: NetworkName;\n constructor(params: ModuleBaseProps) {\n super(params);\n this.network = params.network;\n }\n\n public async getClmmPoolKeys(poolId: string): Promise<ClmmKeys> {\n return ((await this.scope.api.fetchPoolKeysById({ idList: [poolId] })) as ClmmKeys[])[0];\n }\n\n public async createPool<T extends TxVersion>(\n props: CreateConcentratedPool<T>,\n ): Promise<MakeTxData<T, { mockPoolInfo: ApiV3PoolInfoConcentratedItem; address: ClmmKeys }>> {\n const {\n programId,\n owner = this.scope.owner?.publicKey || PublicKey.default,\n mint1,\n mint2,\n ammConfig,\n initialPrice,\n startTime,\n computeBudgetConfig,\n forerunCreate,\n getObserveState,\n txVersion,\n } = props;\n const txBuilder = this.createTxBuilder();\n const [mintA, mintB, initPrice] = new BN(new PublicKey(mint1.address).toBuffer()).gt(\n new BN(new PublicKey(mint2.address).toBuffer()),\n )\n ? [mint2, mint1, new Decimal(1).div(initialPrice)]\n : [mint1, mint2, initialPrice];\n\n const initialPriceX64 = SqrtPriceMath.priceToSqrtPriceX64(initPrice, mintA.decimals, mintB.decimals);\n\n const insInfo = await ClmmInstrument.createPoolInstructions({\n connection: this.scope.connection,\n programId,\n owner,\n mintA,\n mintB,\n ammConfigId: ammConfig.id,\n initialPriceX64,\n startTime,\n forerunCreate: !getObserveState && forerunCreate,\n });\n\n txBuilder.addInstruction(insInfo);\n txBuilder.addCustomComputeBudget(computeBudgetConfig);\n\n return txBuilder.versionBuild<{\n mockPoolInfo: ApiV3PoolInfoConcentratedItem;\n address: ClmmKeys;\n forerunCreate?: boolean;\n }>({\n txVersion,\n extInfo: {\n address: {\n ...insInfo.address,\n observationId: insInfo.address.observationId.toBase58(),\n exBitmapAccount: insInfo.address.exBitmapAccount.toBase58(),\n programId: programId.toString(),\n id: insInfo.address.poolId.toString(),\n mintA,\n mintB,\n openTime: startTime.toString(),\n vault: { A: insInfo.address.mintAVault.toString(), B: insInfo.address.mintBVault.toString() },\n rewardInfos: [],\n config: {\n id: ammConfig.id.toString(),\n index: ammConfig.index,\n protocolFeeRate: ammConfig.protocolFeeRate,\n tradeFeeRate: ammConfig.tradeFeeRate,\n tickSpacing: ammConfig.tickSpacing,\n fundFeeRate: ammConfig.fundFeeRate,\n description: ammConfig.description,\n defaultRange: 0,\n defaultRangePoint: [],\n },\n },\n mockPoolInfo: {\n type: \"Concentrated\",\n rewardDefaultPoolInfos: \"Clmm\",\n id: insInfo.address.poolId.toString(),\n mintA,\n mintB,\n feeRate: ammConfig.tradeFeeRate,\n openTime: startTime.toString(),\n programId: programId.toString(),\n price: initPrice.toNumber(),\n config: {\n id: ammConfig.id.toString(),\n index: ammConfig.index,\n protocolFeeRate: ammConfig.protocolFeeRate,\n tradeFeeRate: ammConfig.tradeFeeRate,\n tickSpacing: ammConfig.tickSpacing,\n fundFeeRate: ammConfig.fundFeeRate,\n description: ammConfig.description,\n defaultRange: 0,\n defaultRangePoint: [],\n },\n burnPercent: 0,\n ...mockV3CreatePoolInfo,\n },\n forerunCreate,\n },\n }) as Promise<MakeTxData<T, { mockPoolInfo: ApiV3PoolInfoConcentratedItem; address: ClmmKeys }>>;\n }\n\n public async openPositionFromBase<T extends TxVersion>({\n poolInfo,\n poolKeys: propPoolKeys,\n ownerInfo,\n tickLower,\n tickUpper,\n base,\n baseAmount,\n otherAmountMax,\n nft2022,\n associatedOnly = true,\n checkCreateATAOwner = false,\n withMetadata = \"create\",\n getEphemeralSigners,\n computeBudgetConfig,\n txVersion,\n }: OpenPositionFromBase<T>): Promise<MakeTxData<T, OpenPositionFromBaseExtInfo>> {\n if (this.scope.availability.addConcentratedPosition === false)\n this.logAndCreateError(\"add position feature disabled in your region\");\n\n this.scope.checkOwner();\n const txBuilder = this.createTxBuilder();\n\n let ownerTokenAccountA: PublicKey | null = null;\n let ownerTokenAccountB: PublicKey | null = null;\n const mintAUseSOLBalance = ownerInfo.useSOLBalance && poolInfo.mintA.address === getMintAddresses(this.network).WSOLMint.toBase58();\n const mintBUseSOLBalance = ownerInfo.useSOLBalance && poolInfo.mintB.address === getMintAddresses(this.network).WSOLMint.toBase58();\n const [amountA, amountB] = base === \"MintA\" ? [baseAmount, otherAmountMax] : [otherAmountMax, baseAmount];\n\n const { account: _ownerTokenAccountA, instructionParams: _tokenAccountAInstruction } =\n await this.scope.account.getOrCreateTokenAccount({\n tokenProgram: poolInfo.mintA.programId,\n mint: new PublicKey(poolInfo.mintA.address),\n owner: this.scope.ownerPubKey,\n\n createInfo:\n mintAUseSOLBalance || amountA.isZero()\n ? {\n payer: this.scope.ownerPubKey,\n amount: amountA,\n }\n : undefined,\n skipCloseAccount: !mintAUseSOLBalance,\n notUseTokenAccount: mintAUseSOLBalance,\n associatedOnly: mintAUseSOLBalance ? false : associatedOnly,\n checkCreateATAOwner,\n });\n if (_ownerTokenAccountA) ownerTokenAccountA = _ownerTokenAccountA;\n txBuilder.addInstruction(_tokenAccountAInstruction || {});\n\n const { account: _ownerTokenAccountB, instructionParams: _tokenAccountBInstruction } =\n await this.scope.account.getOrCreateTokenAccount({\n tokenProgram: poolInfo.mintB.programId,\n mint: new PublicKey(poolInfo.mintB.address),\n owner: this.scope.ownerPubKey,\n\n createInfo:\n mintBUseSOLBalance || amountB.isZero()\n ? {\n payer: this.scope.ownerPubKey!,\n amount: amountB,\n }\n : undefined,\n skipCloseAccount: !mintBUseSOLBalance,\n notUseTokenAccount: mintBUseSOLBalance,\n associatedOnly: mintBUseSOLBalance ? false : associatedOnly,\n checkCreateATAOwner,\n });\n if (_ownerTokenAccountB) ownerTokenAccountB = _ownerTokenAccountB;\n txBuilder.addInstruction(_tokenAccountBInstruction || {});\n\n if (!ownerTokenAccountA || !ownerTokenAccountB)\n this.logAndCreateError(\"cannot found target token accounts\", \"tokenAccounts\", {\n ownerTokenAccountA: ownerTokenAccountA?.toBase58(),\n ownerTokenAccountB: ownerTokenAccountB?.toBase58(),\n });\n\n const poolKeys = propPoolKeys || (await this.getClmmPoolKeys(poolInfo.id));\n\n const insInfo = await ClmmInstrument.openPositionFromBaseInstructions({\n poolInfo,\n poolKeys,\n ownerInfo: {\n ...ownerInfo,\n feePayer: this.scope.ownerPubKey,\n wallet: this.scope.ownerPubKey,\n tokenAccountA: ownerTokenAccountA!,\n tokenAccountB: ownerTokenAccountB!,\n },\n tickLower,\n tickUpper,\n base,\n baseAmount,\n otherAmountMax,\n withMetadata,\n getEphemeralSigners,\n nft2022,\n });\n\n console.log(\"insInfo\", insInfo);\n\n txBuilder.addInstruction(insInfo);\n txBuilder.addCustomComputeBudget(computeBudgetConfig);\n return txBuilder.versionBuild<OpenPositionFromBaseExtInfo>({\n txVersion,\n extInfo: { ...insInfo.address },\n }) as Promise<MakeTxData<T, OpenPositionFromBaseExtInfo>>;\n }\n\n public async openPositionFromLiquidity<T extends TxVersion>({\n poolInfo,\n poolKeys: propPoolKeys,\n ownerInfo,\n amountMaxA,\n amountMaxB,\n tickLower,\n tickUpper,\n liquidity,\n associatedOnly = true,\n checkCreateATAOwner = false,\n withMetadata = \"create\",\n txVersion,\n computeBudgetConfig,\n getEphemeralSigners,\n nft2022,\n }: OpenPositionFromLiquidity<T>): Promise<MakeTxData<T, OpenPositionFromLiquidityExtInfo>> {\n if (this.scope.availability.createConcentratedPosition === false)\n this.logAndCreateError(\"open position feature disabled in your region\");\n const txBuilder = this.createTxBuilder();\n\n let ownerTokenAccountA: PublicKey | null = null;\n let ownerTokenAccountB: PublicKey | null = null;\n const mintAUseSOLBalance = ownerInfo.useSOLBalance && poolInfo.mintA.address === getMintAddresses(this.network).WSOLMint.toBase58();\n const mintBUseSOLBalance = ownerInfo.useSOLBalance && poolInfo.mintB.address === getMintAddresses(this.network).WSOLMint.toBase58();\n\n const { account: _ownerTokenAccountA, instructionParams: _tokenAccountAInstruction } =\n await this.scope.account.getOrCreateTokenAccount({\n tokenProgram: poolInfo.mintA.programId,\n mint: new PublicKey(poolInfo.mintA.address),\n owner: this.scope.ownerPubKey,\n\n createInfo:\n mintAUseSOLBalance || amountMaxA.isZero()\n ? {\n payer: this.scope.ownerPubKey,\n amount: amountMaxA,\n }\n : undefined,\n\n skipCloseAccount: !mintAUseSOLBalance,\n notUseTokenAccount: mintAUseSOLBalance,\n associatedOnly: mintAUseSOLBalance ? false : associatedOnly,\n checkCreateATAOwner,\n });\n if (_ownerTokenAccountA) ownerTokenAccountA = _ownerTokenAccountA;\n txBuilder.addInstruction(_tokenAccountAInstruction || {});\n\n const { account: _ownerTokenAccountB, instructionParams: _tokenAccountBInstruction } =\n await this.scope.account.getOrCreateTokenAccount({\n tokenProgram: poolInfo.mintB.programId,\n mint: new PublicKey(poolInfo.mintB.address),\n owner: this.scope.ownerPubKey,\n\n createInfo:\n mintBUseSOLBalance || amountMaxB.isZero()\n ? {\n payer: this.scope.ownerPubKey!,\n amount: amountMaxB,\n }\n : undefined,\n skipCloseAccount: !mintBUseSOLBalance,\n notUseTokenAccount: mintBUseSOLBalance,\n associatedOnly: mintBUseSOLBalance ? false : associatedOnly,\n checkCreateATAOwner,\n });\n if (_ownerTokenAccountB) ownerTokenAccountB = _ownerTokenAccountB;\n txBuilder.addInstruction(_tokenAccountBInstruction || {});\n\n if (ownerTokenAccountA === undefined || ownerTokenAccountB === undefined)\n this.logAndCreateError(\"cannot found target token accounts\", \"tokenAccounts\", this.scope.account.tokenAccounts);\n\n const poolKeys = propPoolKeys || (await this.getClmmPoolKeys(poolInfo.id));\n\n const makeOpenPositionInstructions = await ClmmInstrument.openPositionFromLiquidityInstructions({\n poolInfo,\n poolKeys,\n ownerInfo: {\n wallet: this.scope.ownerPubKey,\n tokenAccountA: ownerTokenAccountA!,\n tokenAccountB: ownerTokenAccountB!,\n },\n tickLower,\n tickUpper,\n liquidity,\n amountMaxA,\n amountMaxB,\n withMetadata,\n getEphemeralSigners,\n nft2022,\n });\n txBuilder.addInstruction(makeOpenPositionInstructions);\n txBuilder.addCustomComputeBudget(computeBudgetConfig);\n\n return txBuilder.versionBuild<OpenPositionFromLiquidityExtInfo>({\n txVersion,\n extInfo: { address: makeOpenPositionInstructions.address },\n }) as Promise<MakeTxData<T, OpenPositionFromLiquidityExtInfo>>;\n }\n\n public async increasePositionFromLiquidity<T extends TxVersion>(\n props: IncreasePositionFromLiquidity<T>,\n ): Promise<MakeTxData<T, ManipulateLiquidityExtInfo>> {\n const {\n poolInfo,\n poolKeys: propPoolKeys,\n ownerPosition,\n amountMaxA,\n amountMaxB,\n liquidity,\n ownerInfo,\n associatedOnly = true,\n checkCreateATAOwner = false,\n computeBudgetConfig,\n txVersion,\n } = props;\n const txBuilder = this.createTxBuilder();\n\n let ownerTokenAccountA: PublicKey | undefined = undefined;\n let ownerTokenAccountB: PublicKey | undefined = undefined;\n\n const mintAUseSOLBalance = ownerInfo.useSOLBalance && poolInfo.mintA.address === getMintAddresses(this.network).WSOLMint.toBase58();\n const mintBUseSOLBalance = ownerInfo.useSOLBalance && poolInfo.mintB.address === getMintAddresses(this.network).WSOLMint.toBase58();\n const { account: _ownerTokenAccountA, instructionParams: _tokenAccountAInstruction } =\n await this.scope.account.getOrCreateTokenAccount({\n tokenProgram: poolInfo.mintA.programId,\n mint: new PublicKey(poolInfo.mintA.address),\n notUseTokenAccount: mintAUseSOLBalance,\n owner: this.scope.ownerPubKey,\n\n createInfo:\n mintAUseSOLBalance || amountMaxA.isZero()\n ? {\n payer: this.scope.ownerPubKey,\n amount: amountMaxA,\n }\n : undefined,\n skipCloseAccount: !mintAUseSOLBalance,\n associatedOnly: mintAUseSOLBalance ? false : associatedOnly,\n checkCreateATAOwner,\n });\n if (_ownerTokenAccountA) ownerTokenAccountA = _ownerTokenAccountA;\n txBuilder.addInstruction(_tokenAccountAInstruction || {});\n const { account: _ownerTokenAccountB, instructionParams: _tokenAccountBInstruction } =\n await this.scope.account.getOrCreateTokenAccount({\n tokenProgram: poolInfo.mintB.programId,\n mint: new PublicKey(poolInfo.mintB.address),\n owner: this.scope.ownerPubKey,\n\n createInfo:\n mintBUseSOLBalance || amountMaxB.isZero()\n ? {\n payer: this.scope.ownerPubKey!,\n amount: amountMaxB,\n }\n : undefined,\n notUseTokenAccount: mintBUseSOLBalance,\n skipCloseAccount: !mintBUseSOLBalance,\n associatedOnly: mintBUseSOLBalance ? false : associatedOnly,\n checkCreateATAOwner,\n });\n if (_ownerTokenAccountB) ownerTokenAccountB = _ownerTokenAccountB;\n txBuilder.addInstruction(_tokenAccountBInstruction || {});\n\n if (!ownerTokenAccountA && !ownerTokenAccountB)\n this.logAndCreateError(\"cannot found target token accounts\", \"tokenAccounts\", this.scope.account.tokenAccounts);\n const poolKeys = propPoolKeys ?? (await this.getClmmPoolKeys(poolInfo.id));\n const ins = ClmmInstrument.increasePositionFromLiquidityInstructions({\n poolInfo,\n poolKeys,\n ownerPosition,\n ownerInfo: {\n wallet: this.scope.ownerPubKey,\n tokenAccountA: ownerTokenAccountA!,\n tokenAccountB: ownerTokenAccountB!,\n },\n liquidity,\n amountMaxA,\n amountMaxB,\n nft2022: (await this.scope.connection.getAccountInfo(ownerPosition.nftMint))?.owner.equals(TOKEN_2022_PROGRAM_ID),\n });\n txBuilder.addInstruction(ins);\n txBuilder.addCustomComputeBudget(computeBudgetConfig);\n return txBuilder.versionBuild<ManipulateLiquidityExtInfo>({\n txVersion,\n extInfo: { address: ins.address },\n }) as Promise<MakeTxData<T, ManipulateLiquidityExtInfo>>;\n }\n\n public async increasePositionFromBase<T extends TxVersion>(\n props: IncreasePositionFromBase<T>,\n ): Promise<MakeTxData<T, ManipulateLiquidityExtInfo>> {\n const {\n poolInfo,\n ownerPosition,\n base,\n baseAmount,\n otherAmountMax,\n ownerInfo,\n associatedOnly = true,\n checkCreateATAOwner = false,\n computeBudgetConfig,\n txVersion,\n } = props;\n const txBuilder = this.createTxBuilder();\n\n let ownerTokenAccountA: PublicKey | undefined = undefined;\n let ownerTokenAccountB: PublicKey | undefined = undefined;\n const mintAUseSOLBalance = ownerInfo.useSOLBalance && poolInfo.mintA.address === getMintAddresses(this.network).WSOLMint.toBase58();\n const mintBUseSOLBalance = ownerInfo.useSOLBalance && poolInfo.mintB.address === getMintAddresses(this.network).WSOLMint.toBase58();\n\n const { account: _ownerTokenAccountA, instructionParams: _tokenAccountAInstruction } =\n await this.scope.account.getOrCreateTokenAccount({\n tokenProgram: poolInfo.mintA.programId,\n mint: new PublicKey(poolInfo.mintA.address),\n notUseTokenAccount: mintAUseSOLBalance,\n owner: this.scope.ownerPubKey,\n\n createInfo:\n mintAUseSOLBalance || (base === \"MintA\" ? baseAmount : otherAmountMax).isZero()\n ? {\n payer: this.scope.ownerPubKey,\n amount: base === \"MintA\" ? baseAmount : otherAmountMax,\n }\n : undefined,\n skipCloseAccount: !mintAUseSOLBalance,\n associatedOnly: mintAUseSOLBalance ? false : associatedOnly,\n checkCreateATAOwner,\n });\n if (_ownerTokenAccountA) ownerTokenAccountA = _ownerTokenAccountA;\n txBuilder.addInstruction(_tokenAccountAInstruction || {});\n\n const { account: _ownerTokenAccountB, instructionParams: _tokenAccountBInstruction } =\n await this.scope.account.getOrCreateTokenAccount({\n tokenProgram: poolInfo.mintB.programId,\n mint: new PublicKey(poolInfo.mintB.address),\n owner: this.scope.ownerPubKey,\n\n createInfo:\n mintBUseSOLBalance || (base === \"MintA\" ? otherAmountMax : baseAmount).isZero()\n ? {\n payer: this.scope.ownerPubKey!,\n amount: base === \"MintA\" ? otherAmountMax : baseAmount,\n }\n : undefined,\n notUseTokenAccount: mintBUseSOLBalance,\n skipCloseAccount: !mintBUseSOLBalance,\n associatedOnly: mintBUseSOLBalance ? false : associatedOnly,\n checkCreateATAOwner,\n });\n if (_ownerTokenAccountB) ownerTokenAccountB = _ownerTokenAccountB;\n txBuilder.addInstruction(_tokenAccountBInstruction || {});\n if (!ownerTokenAccountA && !ownerTokenAccountB)\n this.logAndCreateError(\"cannot found target token accounts\", \"tokenAccounts\", this.scope.account.tokenAccounts);\n\n const poolKeys = await this.getClmmPoolKeys(poolInfo.id);\n const ins = ClmmInstrument.increasePositionFromBaseInstructions({\n poolInfo,\n poolKeys,\n ownerPosition,\n ownerInfo: {\n wallet: this.scope.ownerPubKey,\n tokenAccountA: ownerTokenAccountA!,\n tokenAccountB: ownerTokenAccountB!,\n },\n base,\n baseAmount,\n otherAmountMax,\n nft2022: (await this.scope.connection.getAccountInfo(ownerPosition.nftMint))?.owner.equals(TOKEN_2022_PROGRAM_ID),\n });\n txBuilder.addInstruction(ins);\n txBuilder.addCustomComputeBudget(computeBudgetConfig);\n\n return txBuilder.versionBuild<ManipulateLiquidityExtInfo>({\n txVersion,\n extInfo: { address: ins.address },\n }) as Promise<MakeTxData<T, ManipulateLiquidityExtInfo>>;\n }\n\n public async decreaseLiquidity<T extends TxVersion>(\n props: DecreaseLiquidity<T>,\n ): Promise<MakeTxData<T, ManipulateLiquidityExtInfo & Partial<ClosePositionExtInfo>>> {\n const {\n poolInfo,\n poolKeys: propPoolKeys,\n ownerPosition,\n ownerInfo,\n amountMinA,\n amountMinB,\n liquidity,\n associatedOnly = true,\n checkCreateATAOwner = false,\n computeBudgetConfig,\n txVersion,\n nftAccount,\n } = props;\n if (this.scope.availability.removeConcentratedPosition === false)\n this.logAndCreateError(\"remove position feature disabled in your region\");\n const txBuilder = this.createTxBuilder();\n\n const mintAUseSOLBalance = ownerInfo.useSOLBalance && poolInfo.mintA.address === getMintAddresses(this.network).WSOLMint.toBase58();\n const mintBUseSOLBalance = ownerInfo.useSOLBalance && poolInfo.mintB.address === getMintAddresses(this.network).WSOLMint.toBase58();\n\n let ownerTokenAccountA: PublicKey | undefined = undefined;\n let ownerTokenAccountB: PublicKey | undefined = undefined;\n const { account: _ownerTokenAccountA, instructionParams: accountAInstructions } =\n await this.scope.account.getOrCreateTokenAccount({\n tokenProgram: poolInfo.mintA.programId,\n mint: new PublicKey(poolInfo.mintA.address),\n notUseTokenAccount: mintAUseSOLBalance,\n owner: this.scope.ownerPubKey,\n createInfo: {\n payer: this.scope.ownerPubKey,\n amount: 0,\n },\n skipCloseAccount: !mintAUseSOLBalance,\n associatedOnly: mintAUseSOLBalance ? false : associatedOnly,\n checkCreateATAOwner,\n });\n ownerTokenAccountA = _ownerTokenAccountA;\n accountAInstructions && txBuilder.addInstruction(accountAInstructions);\n\n const { account: _ownerTokenAccountB, instructionParams: accountBInstructions } =\n await this.scope.account.getOrCreateTokenAccount({\n tokenProgram: poolInfo.mintB.programId,\n mint: new PublicKey(poolInfo.mintB.address),\n notUseTokenAccount: mintBUseSOLBalance,\n owner: this.scope.ownerPubKey,\n createInfo: {\n payer: this.scope.ownerPubKey,\n amount: 0,\n },\n skipCloseAccount: !mintBUseSOLBalance,\n associatedOnly: mintBUseSOLBalance ? false : associatedOnly,\n checkCreateATAOwner,\n });\n ownerTokenAccountB = _ownerTokenAccountB;\n accountBInstructions && txBuilder.addInstruction(accountBInstructions);\n\n const rewardAccounts: PublicKey[] = [];\n for (const itemReward of poolInfo.rewardDefaultInfos) {\n const rewardUseSOLBalance = ownerInfo.useSOLBalance && itemReward.mint.address === getTokenWSol(this.network).address.toString();\n\n let ownerRewardAccount: PublicKey | undefined;\n\n if (itemReward.mint.address === poolInfo.mintA.address) ownerRewardAccount = ownerTokenAccountA;\n else if (itemReward.mint.address === poolInfo.mintB.address) ownerRewardAccount = ownerTokenAccountB;\n else {\n const { account: _ownerRewardAccount, instructionParams: ownerRewardAccountInstructions } =\n await this.scope.account.getOrCreateTokenAccount({\n tokenProgram: new PublicKey(itemReward.mint.programId),\n mint: new PublicKey(itemReward.mint.address),\n notUseTokenAccount: rewardUseSOLBalance,\n owner: this.scope.ownerPubKey,\n createInfo: {\n payer: this.scope.ownerPubKey,\n amount: 0,\n },\n skipCloseAccount: !rewardUseSOLBalance,\n associatedOnly: rewardUseSOLBalance ? false : associatedOnly,\n checkCreateATAOwner,\n });\n ownerRewardAccount = _ownerRewardAccount;\n ownerRewardAccountInstructions && txBuilder.addInstruction(ownerRewardAccountInstructions);\n }\n\n rewardAccounts.push(ownerRewardAccount!);\n }\n\n if (!ownerTokenAccountA && !ownerTokenAccountB)\n this.logAndCreateError(\n \"cannot found target token accounts\",\n \"tokenAccounts\",\n this.scope.account.tokenAccountRawInfos,\n );\n\n const poolKeys = propPoolKeys ?? (await this.getClmmPoolKeys(poolInfo.id));\n const nft2022 = (await this.scope.connection.getAccountInfo(ownerPosition.nftMint))?.owner.equals(\n TOKEN_2022_PROGRAM_ID,\n );\n const decreaseInsInfo = await ClmmInstrument.decreaseLiquidityInstructions({\n poolInfo,\n poolKeys,\n ownerPosition,\n ownerInfo: {\n wallet: this.scope.ownerPubKey,\n tokenAccountA: ownerTokenAccountA!,\n tokenAccountB: ownerTokenAccountB!,\n rewardAccounts,\n },\n liquidity,\n amountMinA,\n amountMinB,\n nft2022,\n });\n\n txBuilder.addInstruction({\n instructions: decreaseInsInfo.instructions,\n instructionTypes: [InstructionType.ClmmDecreasePosition],\n });\n\n let extInfo = { ...decreaseInsInfo.address };\n if (ownerInfo.closePosition) {\n const closeInsInfo = await ClmmInstrument.closePositionInstructions({\n poolInfo,\n poolKeys,\n ownerInfo: { wallet: this.scope.ownerPubKey },\n ownerPosition,\n nft2022,\n });\n txBuilder.addInstruction({\n endInstructions: closeInsInfo.instructions,\n endInstructionTypes: closeInsInfo.instructionTypes,\n });\n extInfo = { ...extInfo, ...closeInsInfo.address };\n }\n txBuilder.addCustomComputeBudget(computeBudgetConfig);\n\n return txBuilder.versionBuild<ManipulateLiquidityExtInfo>({\n txVersion,\n extInfo: { address: extInfo },\n }) as Promise<MakeTxData<T, ManipulateLiquidityExtInfo>>;\n }\n\n public async lockPosition<T extends TxVersion>(props: LockPosition<T>): Promise<MakeTxData<ClmmLockAddress>> {\n const {\n programId = CLMM_LOCK_PROGRAM_ID,\n authProgramId = CLMM_LOCK_AUTH_ID,\n poolProgramId = getCLMMProgramId(this.network),\n ownerPosition,\n payer,\n computeBudgetConfig,\n txVersion,\n getEphemeralSigners,\n } = props;\n const txBuilder = this.createTxBuilder();\n const lockIns = await ClmmInstrument.makeLockPositions({\n programId,\n authProgramId,\n poolProgramId,\n wallet: this.scope.ownerPubKey,\n payer: payer ?? this.scope.ownerPubKey,\n nftMint: ownerPosition.nftMint,\n getEphemeralSigners,\n nft2022: (await this.scope.connection.getAccountInfo(ownerPosition.nftMint))?.owner.equals(TOKEN_2022_PROGRAM_ID),\n });\n\n txBuilder.addInstruction(lockIns);\n\n txBuilder.addCustomComputeBudget(computeBudgetConfig);\n\n return txBuilder.versionBuild({\n txVersion,\n extInfo: lockIns.address,\n }) as Promise<MakeTxData<ClmmLockAddress>>;\n }\n\n public async harvestLockPosition<T extends TxVersion>(props: HarvestLockPosition<T>): Promise<MakeTxData<T>> {\n const {\n programId = CLMM_LOCK_PROGRAM_ID,\n authProgramId = CLMM_LOCK_AUTH_ID,\n clmmProgram = getCLMMProgramId(this.network),\n poolKeys: propPoolKeys,\n lockData,\n ownerInfo = { useSOLBalance: true },\n associatedOnly = true,\n checkCreateATAOwner = false,\n computeBudgetConfig,\n txVersion,\n } = props;\n\n const poolKeys = propPoolKeys || (await this.getClmmPoolKeys(lockData.poolId.toString()));\n const txBuilder = this.createTxBuilder();\n\n const positionData = await this.scope.connection.getAccountInfo(lockData.positionId);\n if (!positionData) this.logger.logWithError(\"position not found\", lockData.positionId);\n const position = PositionInfoLayout.decode(positionData!.data);\n\n const mintAUseSOLBalance = ownerInfo.useSOLBalance && poolKeys.mintA.address === getMintAddresses(this.network).WSOLMint.toBase58();\n const mintBUseSOLBalance = ownerInfo.useSOLBalance && poolKeys.mintB.address === getMintAddresses(this.network).WSOLMint.toBase58();\n\n let ownerTokenAccountA: PublicKey | undefined = undefined;\n let ownerTokenAccountB: PublicKey | undefined = undefined;\n const { account: _ownerTokenAccountA, instructionParams: accountAInstructions } =\n await this.scope.account.getOrCreateTokenAccount({\n tokenProgram: poolKeys.mintA.programId,\n mint: new PublicKey(poolKeys.mintA.address),\n notUseTokenAccount: mintAUseSOLBalance,\n owner: this.scope.ownerPubKey,\n createInfo: {\n payer: this.scope.ownerPubKey,\n amount: 0,\n },\n skipCloseAccount: !mintAUseSOLBalance,\n associatedOnly: mintAUseSOLBalance ? false : associatedOnly,\n checkCreateATAOwner,\n });\n ownerTokenAccountA = _ownerTokenAccountA;\n accountAInstructions && txBuilder.addInstruction(accountAInstructions);\n\n const { account: _ownerTokenAccountB, instructionParams: accountBInstructions } =\n await this.scope.account.getOrCreateTokenAccount({\n tokenProgram: poolKeys.mintB.programId,\n mint: new PublicKey(poolKeys.mintB.address),\n notUseTokenAccount: mintBUseSOLBalance,\n owner: this.scope.ownerPubKey,\n createInfo: {\n payer: this.scope.ownerPubKey,\n amount: 0,\n },\n skipCloseAccount: !mintBUseSOLBalance,\n associatedOnly: mintBUseSOLBalance ? false : associatedOnly,\n checkCreateATAOwner,\n });\n ownerTokenAccountB = _ownerTokenAccountB;\n accountBInstructions && txBuilder.addInstruction(accountBInstructions);\n\n const ownerMintToAccount: { [mint: string]: PublicKey } = {};\n const rewardAccounts: PublicKey[] = [];\n for (const itemReward of poolKeys.rewardInfos) {\n const rewardUseSOLBalance = ownerInfo.useSOLBalance && itemReward.mint.address === getTokenWSol(this.network).address.toString();\n let ownerRewardAccount = ownerMintToAccount[itemReward.mint.address];\n if (!ownerRewardAccount) {\n const { account, instructionParams } = await this.scope.account.getOrCreateTokenAccount({\n tokenProgram: new PublicKey(itemReward.mint.programId),\n mint: new PublicKey(itemReward.mint.address),\n notUseTokenAccount: rewardUseSOLBalance,\n owner: this.scope.ownerPubKey,\n skipCloseAccount: !rewardUseSOLBalance,\n createInfo: {\n payer: this.scope.ownerPubKey,\n amount: 0,\n },\n associatedOnly: rewardUseSOLBalance ? false : associatedOnly,\n });\n ownerRewardAccount = account!;\n instructionParams && txBuilder.addInstruction(instructionParams);\n }\n\n ownerMintToAccount[itemReward.mint.address] = ownerRewardAccount;\n rewardAccounts.push(ownerRewardAccount!);\n }\n const lockPositionId = getPdaLockClPositionIdV2(programId, lockData.lockNftMint).publicKey;\n const lockNftAccount = getATAAddress(this.scope.ownerPubKey, lockData.lockNftMint, TOKEN_PROGRAM_ID).publicKey;\n\n const tickArrayLowerStartIndex = TickUtils.getTickArrayStartIndexByTick(\n position.tickLower,\n poolKeys.config.tickSpacing,\n );\n const tickArrayUpperStartIndex = TickUtils.getTickArrayStartIndexByTick(\n position.tickUpper,\n poolKeys.config.tickSpacing,\n );\n const { publicKey: tickArrayLower } = getPdaTickArrayAddress(\n new PublicKey(poolKeys.programId),\n lockData.poolId,\n tickArrayLowerStartIndex,\n );\n const { publicKey: tickArrayUpper } = getPdaTickArrayAddress(\n new PublicKey(poolKeys.programId),\n lockData.poolId,\n tickArrayUpperStartIndex,\n );\n const { publicKey: protocolPosition } = getPdaProtocolPositionAddress(\n new PublicKey(poolKeys.programId),\n lockData.poolId,\n position.tickLower,\n position.tickUpper,\n );\n\n const rewardAccountsFullInfo: {\n poolRewardVault: PublicKey;\n ownerRewardVault: PublicKey;\n rewardMint: PublicKey;\n }[] = [];\n for (let i = 0; i < poolKeys.rewardInfos.length; i++) {\n rewardAccountsFullInfo.push({\n poolRewardVault: new PublicKey(poolKeys.rewardInfos[i].vault),\n ownerRewardVault: rewardAccounts[i],\n rewardMint: new PublicKey(poolKeys.rewardInfos[i].mint.address),\n });\n }\n\n const harvestLockIns = await ClmmInstrument.harvestLockPositionInstructionV2({\n programId,\n auth: authProgramId,\n lockPositionId,\n clmmProgram,\n lockOwner: this.scope.ownerPubKey,\n lockNftMint: lockData.lockNftMint,\n lockNftAccount,\n positionNftAccount: lockData.nftAccount,\n positionId: lockData.positionId,\n poolId: lockData.poolId,\n protocolPosition,\n vaultA: new PublicKey(poolKeys.vault.A),\n vaultB: new PublicKey(poolKeys.vault.B),\n tickArrayLower,\n tickArrayUpper,\n userVaultA: ownerTokenAccountA!,\n userVaultB: ownerTokenAccountB!,\n mintA: new PublicKey(poolKeys.mintA.address),\n mintB: new PublicKey(poolKeys.mintB.address),\n rewardAccounts: rewardAccountsFullInfo,\n exTickArrayBitmap: getPdaExBitmapAccount(clmmProgram, lockData.poolId).publicKey,\n });\n\n txBuilder.addInstruction({\n instructions: [harvestLockIns],\n instructionTypes: [InstructionType.ClmmHarvestLockPosition],\n });\n\n txBuilder.addCustomComputeBudget(computeBudgetConfig);\n\n return txBuilder.versionBuild({\n txVersion,\n }) as Promise<MakeTxData<T>>;\n }\n\n public async closePosition<T extends TxVersion>({\n poolInfo,\n poolKeys: propPoolKeys,\n ownerPosition,\n txVersion,\n }: {\n poolInfo: ApiV3PoolInfoConcentratedItem;\n poolKeys?: ClmmKeys;\n ownerPosition: ClmmPositionLayout;\n txVersion: T;\n }): Promise<MakeTxData<T, ClosePositionExtInfo>> {\n if (this.scope.availability.removeConcentratedPosition === false)\n this.logAndCreateError(\"remove position feature disabled in your region\");\n const txBuilder = this.createTxBuilder();\n const poolKeys = propPoolKeys ?? (await this.getClmmPoolKeys(poolInfo.id));\n const ins = ClmmInstrument.closePositionInstructions({\n poolInfo,\n poolKeys,\n ownerInfo: { wallet: this.scope.ownerPubKey },\n ownerPosition,\n nft2022: (await this.scope.connection.getAccountInfo(ownerPosition.nftMint))?.owner.equals(TOKEN_2022_PROGRAM_ID),\n });\n\n return txBuilder.addInstruction(ins).versionBuild<ClosePositionExtInfo>({\n txVersion,\n extInfo: { address: ins.address },\n }) as Promise<MakeTxData<T, ClosePositionExtInfo>>;\n }\n\n public async initReward<T extends TxVersion>({\n poolInfo,\n ownerInfo,\n rewardInfo,\n associatedOnly = true,\n checkCreateATAOwner = false,\n computeBudgetConfig,\n txVersion,\n }: InitRewardParams<T>): Promise<MakeTxData<T, InitRewardExtInfo>> {\n if (rewardInfo.endTime <= rewardInfo.openTime)\n this.logAndCreateError(\"reward time error\", \"rewardInfo\", rewardInfo);\n\n const txBuilder = this.createTxBuilder();\n\n const rewardMintUseSOLBalance =\n ownerInfo.useSOLBalance && rewardInfo.mint.address.toString() === getTokenWSol(this.network).address.toString();\n const _baseRewardAmount = rewardInfo.perSecond.mul(rewardInfo.endTime - rewardInfo.openTime);\n\n const { account: ownerRewardAccount, instructionParams: ownerRewardAccountIns } =\n await this.scope.account.getOrCreateTokenAccount({\n tokenProgram: new PublicKey(rewardInfo.mint.address),\n mint: new PublicKey(rewardInfo.mint.address),\n notUseTokenAccount: !!rewardMintUseSOLBalance,\n skipCloseAccount: !rewardMintUseSOLBalance,\n owner: this.scope.ownerPubKey,\n createInfo: rewardMintUseSOLBalance\n ? {\n payer: ownerInfo.feePayer || this.scope.ownerPubKey,\n amount: new BN(\n new Decimal(_baseRewardAmount.toFixed(0)).gte(_baseRewardAmount)\n ? _baseRewardAmount.toFixed(0)\n : _baseRewardAmount.add(1).toFixed(0),\n ),\n }\n : undefined,\n associatedOnly: rewardMintUseSOLBalance ? false : associatedOnly,\n checkCreateATAOwner,\n });\n ownerRewardAccountIns && txBuilder.addInstruction(ownerRewardAccountIns);\n\n if (!ownerRewardAccount)\n this.logAndCreateError(\"no money\", \"ownerRewardAccount\", this.scope.account.tokenAccountRawInfos);\n const poolKeys = await this.getClmmPoolKeys(poolInfo.id);\n const insInfo = ClmmInstrument.initRewardInstructions({\n poolInfo,\n poolKeys,\n ownerInfo: {\n wallet: this.scope.ownerPubKey,\n tokenAccount: ownerRewardAccount!,\n },\n rewardInfo: {\n programId: new PublicKey(rewardInfo.mint.programId),\n mint: new PublicKey(rewardInfo.mint.address),\n openTime: rewardInfo.openTime,\n endTime: rewardInfo.endTime,\n emissionsPerSecondX64: MathUtil.decimalToX64(rewardInfo.perSecond),\n },\n });\n txBuilder.addInstruction(insInfo);\n txBuilder.addCustomComputeBudget(computeBudgetConfig);\n return txBuilder.versionBuild<InitRewardExtInfo>({\n txVersion,\n extInfo: { address: insInfo.address },\n }) as Promise<MakeTxData<T, InitRewardExtInfo>>;\n }\n\n public async initRewards<T extends TxVersion>({\n poolInfo,\n poolKeys: propPoolKeys,\n ownerInfo,\n rewardInfos,\n associatedOnly = true,\n checkCreateATAOwner = false,\n computeBudgetConfig,\n txVersion,\n }: InitRewardsParams<T>): Promise<MakeTxData<T, { address: Record<string, PublicKey> }>> {\n for (const rewardInfo of rewardInfos) {\n if (rewardInfo.endTime <= rewardInfo.openTime)\n this.logAndCreateError(\"reward time error\", \"rewardInfo\", rewardInfo);\n }\n\n const txBuilder = this.createTxBuilder();\n let address: Record<string, PublicKey> = {};\n\n for (const rewardInfo of rewardInfos) {\n const rewardMintUseSOLBalance = ownerInfo.useSOLBalance && rewardInfo.mint.address === getTokenWSol(this.network).address.toString();\n const _baseRewardAmount = rewardInfo.perSecond.mul(rewardInfo.endTime - rewardInfo.openTime);\n\n const { account: ownerRewardAccount, instructionParams: ownerRewardAccountIns } =\n await this.scope.account.getOrCreateTokenAccount({\n tokenProgram: new PublicKey(rewardInfo.mint.programId),\n mint: new PublicKey(rewardInfo.mint.address),\n notUseTokenAccount: !!rewardMintUseSOLBalance,\n skipCloseAccount: !rewardMintUseSOLBalance,\n owner: this.scope.ownerPubKey,\n createInfo: rewardMintUseSOLBalance\n ? {\n payer: ownerInfo.feePayer || this.scope.ownerPubKey,\n amount: new BN(\n new Decimal(_baseRewardAmount.toFixed(0)).gte(_baseRewardAmount)\n ? _baseRewardAmount.toFixed(0)\n : _baseRewardAmount.add(1).toFixed(0),\n ),\n }\n : undefined,\n associatedOnly: rewardMintUseSOLBalance ? false : associatedOnly,\n checkCreateATAOwner,\n });\n ownerRewardAccountIns && txBuilder.addInstruction(ownerRewardAccountIns);\n\n if (!ownerRewardAccount)\n this.logAndCreateError(\"no money\", \"ownerRewardAccount\", this.scope.account.tokenAccountRawInfos);\n\n const poolKeys = propPoolKeys ?? (await this.getClmmPoolKeys(poolInfo.id));\n const insInfo = ClmmInstrument.initRewardInstructions({\n poolInfo,\n poolKeys,\n ownerInfo: {\n wallet: this.scope.ownerPubKey,\n tokenAccount: ownerRewardAccount!,\n },\n rewardInfo: {\n programId: new PublicKey(rewardInfo.mint.programId),\n mint: new PublicKey(rewardInfo.mint.address),\n openTime: rewardInfo.openTime,\n endTime: rewardInfo.endTime,\n emissionsPerSecondX64: MathUtil.decimalToX64(rewardInfo.perSecond),\n },\n });\n address = {\n ...address,\n ...insInfo.address,\n };\n txBuilder.addInstruction(insInfo);\n }\n txBuilder.addCustomComputeBudget(computeBudgetConfig);\n return txBuilder.versionBuild({\n txVersion,\n extInfo: { address },\n }) as Promise<MakeTxData<T, { address: Record<string, PublicKey> }>>;\n }\n\n public async setReward<T extends TxVersion>({\n poolInfo,\n ownerInfo,\n rewardInfo,\n associatedOnly = true,\n checkCreateATAOwner = false,\n computeBudgetConfig,\n txVersion,\n }: SetRewardParams<T>): Promise<MakeTxData<T, { address: Record<string, PublicKey> }>> {\n if (rewardInfo.endTime <= rewardInfo.openTime)\n this.logAndCreateError(\"reward time error\", \"rewardInfo\", rewardInfo);\n\n const txBuilder = this.createTxBuilder();\n const rewardMintUseSOLBalance = ownerInfo.useSOLBalance && rewardInfo.mint.equals(getMintAddresses(this.network).WSOLMint);\n const { account: ownerRewardAccount, instructionParams: ownerRewardIns } =\n await this.scope.account.getOrCreateTokenAccount({\n tokenProgram: rewardInfo.programId,\n mint: rewardInfo.mint,\n notUseTokenAccount: rewardMintUseSOLBalance,\n owner: this.scope.ownerPubKey,\n createInfo: rewardMintUseSOLBalance\n ? {\n payer: ownerInfo.feePayer || this.scope.ownerPubKey,\n amount: new BN(\n new Decimal(rewardInfo.perSecond.sub(rewardInfo.endTime - rewardInfo.openTime).toFixed(0)).gte(\n rewardInfo.perSecond.sub(rewardInfo.endTime - rewardInfo.openTime),\n )\n ? rewardInfo.perSecond.sub(rewardInfo.endTime - rewardInfo.openTime).toFixed(0)\n : rewardInfo.perSecond\n .sub(rewardInfo.endTime - rewardInfo.openTime)\n .add(1)\n .toFixed(0),\n ),\n }\n : undefined,\n\n associatedOnly: rewardMintUseSOLBalance ? false : associatedOnly,\n checkCreateATAOwner,\n });\n ownerRewardIns && txBuilder.addInstruction(ownerRewardIns);\n if (!ownerRewardAccount)\n this.logAndCreateError(\"no money\", \"ownerRewardAccount\", this.scope.account.tokenAccountRawInfos);\n const poolKeys = await this.getClmmPoolKeys(poolInfo.id);\n const insInfo = ClmmInstrument.setRewardInstructions({\n poolInfo,\n poolKeys,\n ownerInfo: {\n wallet: this.scope.ownerPubKey,\n tokenAccount: ownerRewardAccount!,\n },\n rewardInfo: {\n mint: rewardInfo.mint,\n openTime: rewardInfo.openTime,\n endTime: rewardInfo.endTime,\n emissionsPerSecondX64: MathUtil.decimalToX64(rewardInfo.perSecond),\n },\n });\n\n txBuilder.addInstruction(insInfo);\n txBuilder.addCustomComputeBudget(computeBudgetConfig);\n return txBuilder.versionBuild<{ address: Record<string, PublicKey> }>({\n txVersion,\n extInfo: { address: insInfo.address },\n }) as Promise<MakeTxData<T, { address: Record<string, PublicKey> }>>;\n }\n\n public async setRewards<T extends TxVersion>({\n poolInfo,\n poolKeys: propPoolKeys,\n ownerInfo,\n rewardInfos,\n associatedOnly = true,\n checkCreateATAOwner = false,\n computeBudgetConfig,\n txVersion,\n }: SetRewardsParams<T>): Promise<MakeTxData<T, { address: Record<string, PublicKey> }>> {\n const txBuilder = this.createTxBuilder();\n let address: Record<string, PublicKey> = {};\n for (const rewardInfo of rewardInfos) {\n if (rewardInfo.endTime <= rewardInfo.openTime)\n this.logAndCreateError(\"reward time error\", \"rewardInfo\", rewardInfo);\n\n const rewardMintUseSOLBalance = ownerInfo.useSOLBalance && rewardInfo.mint.address === getTokenWSol(this.network).address.toString();\n const { account: ownerRewardAccount, instructionParams: ownerRewardIns } =\n await this.scope.account.getOrCreateTokenAccount({\n tokenProgram: new PublicKey(rewardInfo.mint.programId),\n mint: new PublicKey(rewardInfo.mint.address),\n notUseTokenAccount: rewardMintUseSOLBalance,\n owner: this.scope.ownerPubKey,\n createInfo: rewardMintUseSOLBalance\n ? {\n payer: ownerInfo.feePayer || this.scope.ownerPubKey,\n amount: new BN(\n new Decimal(rewardInfo.perSecond.sub(rewardInfo.endTime - rewardInfo.openTime).toFixed(0)).gte(\n rewardInfo.perSecond.sub(rewardInfo.endTime - rewardInfo.openTime),\n )\n ? rewardInfo.perSecond.sub(rewardInfo.endTime - rewardInfo.openTime).toFixed(0)\n : rewardInfo.perSecond\n .sub(rewardInfo.endTime - rewardInfo.openTime)\n .add(1)\n .toFixed(0),\n ),\n }\n : undefined,\n associatedOnly: rewardMintUseSOLBalance ? false : associatedOnly,\n checkCreateATAOwner,\n });\n ownerRewardIns && txBuilder.addInstruction(ownerRewardIns);\n if (!ownerRewardAccount)\n this.logAndCreateError(\"no money\", \"ownerRewardAccount\", this.scope.account.tokenAccountRawInfos);\n const poolKeys = propPoolKeys ?? (await this.getClmmPoolKeys(poolInfo.id));\n const insInfo = ClmmInstrument.setRewardInstructions({\n poolInfo,\n poolKeys,\n ownerInfo: {\n wallet: this.scope.ownerPubKey,\n tokenAccount: ownerRewardAccount!,\n },\n rewardInfo: {\n mint: new PublicKey(rewardInfo.mint.address),\n openTime: rewardInfo.openTime,\n endTime: rewardInfo.endTime,\n emissionsPerSecondX64: MathUtil.decimalToX64(rewardInfo.perSecond),\n },\n });\n txBuilder.addInstruction(insInfo);\n address = {\n ...address,\n ...insInfo.address,\n };\n }\n txBuilder.addCustomComputeBudget(computeBudgetConfig);\n return txBuilder.versionBuild<{ address: Record<string, PublicKey> }>({\n txVersion,\n extInfo: { address },\n }) as Promise<MakeTxData<T, { address: Record<string, PublicKey> }>>;\n }\n\n public async collectReward<T extends TxVersion>({\n poolInfo,\n ownerInfo,\n rewardMint,\n associatedOnly = true,\n checkCreateATAOwner = false,\n computeBudgetConfig,\n txVersion,\n }: CollectRewardParams<T>): Promise<MakeTxData<{ address: Record<string, PublicKey> }>> {\n const rewardInfo = poolInfo!.rewardDefaultInfos.find((i) => i.mint.address === rewardMint.toString());\n if (!rewardInfo) this.logAndCreateError(\"reward mint error\", \"not found reward mint\", rewardMint);\n\n const txBuilder = this.createTxBuilder();\n const rewardMintUseSOLBalance = ownerInfo.useSOLBalance && rewardMint.equals(getMintAddresses(this.network).WSOLMint);\n const { account: ownerRewardAccount, instructionParams: ownerRewardIns } =\n await this.scope.account.getOrCreateTokenAccount({\n tokenProgram: new PublicKey(rewardInfo!.mint.programId),\n mint: rewardMint,\n notUseTokenAccount: rewardMintUseSOLBalance,\n owner: this.scope.ownerPubKey,\n skipCloseAccount: !rewardMintUseSOLBalance,\n createInfo: {\n payer: ownerInfo.feePayer || this.scope.ownerPubKey,\n amount: 0,\n },\n associatedOnly: rewardMintUseSOLBalance ? false : associatedOnly,\n checkCreateATAOwner,\n });\n ownerRewardIns && txBuilder.addInstruction(ownerRewardIns);\n\n if (!ownerRewardAccount)\n this.logAndCreateError(\"no money\", \"ownerRewardAccount\", this.scope.account.tokenAccountRawInfos);\n const poolKeys = await this.getClmmPoolKeys(poolInfo.id);\n const insInfo = ClmmInstrument.collectRewardInstructions({\n poolInfo,\n poolKeys,\n ownerInfo: {\n wallet: this.scope.ownerPubKey,\n tokenAccount: ownerRewardAccount!,\n },\n rewardMint,\n });\n txBuilder.addInstruction(insInfo);\n txBuilder.addCustomComputeBudget(computeBudgetConfig);\n return txBuilder.versionBuild<{ address: Record<string, PublicKey> }>({\n txVersion,\n extInfo: { address: insInfo.address },\n }) as Promise<MakeTxData<{ address: Record<string, PublicKey> }>>;\n }\n\n public async collectRewards({\n poolInfo,\n ownerInfo,\n rewardMints,\n associatedOnly = true,\n checkCreateATAOwner = false,\n }: CollectRewardsParams): Promise<MakeTransaction> {\n const txBuilder = this.createTxBuilder();\n let address: Record<string, PublicKey> = {};\n\n for (const rewardMint of rewardMints) {\n const rewardInfo = poolInfo!.rewardDefaultInfos.find((i) => i.mint.address === rewardMint.toString());\n if (!rewardInfo) {\n this.logAndCreateError(\"reward mint error\", \"not found reward mint\", rewardMint);\n continue;\n }\n\n const rewardMintUseSOLBalance = ownerInfo.useSOLBalance && rewardMint.equals(getMintAddresses(this.network).WSOLMint);\n const { account: ownerRewardAccount, instructionParams: ownerRewardIns } =\n await this.scope.account.getOrCreateTokenAccount({\n tokenProgram: new PublicKey(rewardInfo.mint.programId),\n mint: rewardMint,\n notUseTokenAccount: rewardMintUseSOLBalance,\n owner: this.scope.ownerPubKey,\n skipCloseAccount: !rewardMintUseSOLBalance,\n createInfo: {\n payer: ownerInfo.feePayer || this.scope.ownerPubKey,\n amount: 0,\n },\n associatedOnly: rewardMintUseSOLBalance ? false : associatedOnly,\n checkCreateATAOwner,\n });\n if (!ownerRewardAccount)\n this.logAndCreateError(\"no money\", \"ownerRewardAccount\", this.scope.account.tokenAccountRawInfos);\n ownerRewardIns && txBuilder.addInstruction(ownerRewardIns);\n const poolKeys = await this.getClmmPoolKeys(poolInfo.id);\n const insInfo = ClmmInstrument.collectRewardInstructions({\n poolInfo,\n poolKeys,\n ownerInfo: {\n wallet: this.scope.ownerPubKey,\n tokenAccount: ownerRewardAccount!,\n },\n\n rewardMint,\n });\n txBuilder.addInstruction(insInfo);\n address = { ...address, ...insInfo.address };\n }\n\n return txBuilder.build<{ address: Record<string, PublicKey> }>({ address });\n }\n\n public async swap<T extends TxVersion>({\n poolInfo,\n poolKeys: propPoolKeys,\n inputMint,\n amountIn,\n amountOutMin,\n priceLimit,\n observationId,\n ownerInfo,\n remainingAccounts,\n associatedOnly = true,\n checkCreateATAOwner = false,\n txVersion,\n computeBudgetConfig,\n }: {\n poolInfo: ApiV3PoolInfoConcentratedItem;\n poolKeys?: ClmmKeys;\n inputMint: string | PublicKey;\n amountIn: BN;\n amountOutMin: BN;\n priceLimit?: Decimal;\n observationId: PublicKey;\n ownerInfo: {\n useSOLBalance?: boolean;\n feePayer?: PublicKey;\n };\n remainingAccounts: PublicKey[];\n associatedOnly?: boolean;\n checkCreateATAOwner?: boolean;\n txVersion?: T;\n computeBudgetConfig?: ComputeBudgetConfig;\n }): Promise<MakeTxData<T>> {\n const txBuilder = this.createTxBuilder();\n const baseIn = inputMint.toString() === poolInfo.mintA.address;\n const mintAUseSOLBalance = ownerInfo.useSOLBalance && poolInfo.mintA.address === getMintAddresses(this.network).WSOLMint.toBase58();\n const mintBUseSOLBalance = ownerInfo.useSOLBalance && poolInfo.mintB.address === getMintAddresses(this.network).WSOLMint.toBase58();\n\n let sqrtPriceLimitX64: BN;\n if (!priceLimit || priceLimit.equals(new Decimal(0))) {\n sqrtPriceLimitX64 = baseIn ? MIN_SQRT_PRICE_X64.add(new BN(1)) : MAX_SQRT_PRICE_X64.sub(new BN(1));\n } else {\n sqrtPriceLimitX64 = SqrtPriceMath.priceToSqrtPriceX64(\n priceLimit,\n poolInfo.mintA.decimals,\n poolInfo.mintB.decimals,\n );\n }\n\n let ownerTokenAccountA: PublicKey | undefined;\n if (!ownerTokenAccountA) {\n const { account, instructionParams } = await this.scope.account.getOrCreateTokenAccount({\n tokenProgram: poolInfo.mintA.programId,\n mint: new PublicKey(poolInfo.mintA.address),\n notUseTokenAccount: mintAUseSOLBalance,\n owner: this.scope.ownerPubKey,\n skipCloseAccount: !mintAUseSOLBalance,\n createInfo:\n mintAUseSOLBalance || !baseIn\n ? {\n payer: ownerInfo.feePayer || this.scope.ownerPubKey,\n amount: baseIn ? amountIn : 0,\n }\n : undefined,\n associatedOnly: mintAUseSOLBalance ? false : associatedOnly,\n checkCreateATAOwner,\n });\n ownerTokenAccountA = account!;\n instructionParams && txBuilder.addInstruction(instructionParams);\n }\n\n let ownerTokenAccountB: PublicKey | undefined;\n if (!ownerTokenAccountB) {\n const { account, instructionParams } = await this.scope.account.getOrCreateTokenAccount({\n tokenProgram: poolInfo.mintB.programId,\n mint: new PublicKey(poolInfo.mintB.address),\n notUseTokenAccount: mintBUseSOLBalance,\n owner: this.scope.ownerPubKey,\n skipCloseAccount: !mintBUseSOLBalance,\n createInfo:\n mintBUseSOLBalance || baseIn\n ? {\n payer: ownerInfo.feePayer || this.scope.ownerPubKey,\n amount: baseIn ? 0 : amountIn,\n }\n : undefined,\n associatedOnly: mintBUseSOLBalance ? false : associatedOnly,\n checkCreateATAOwner,\n });\n ownerTokenAccountB = account!;\n instructionParams && txBuilder.addInstruction(instructionParams);\n }\n\n if (!ownerTokenAccountA || !ownerTokenAccountB)\n this.logAndCreateError(\"user do not have token account\", {\n tokenA: poolInfo.mintA.symbol || poolInfo.mintA.address,\n tokenB: poolInfo.mintB.symbol || poolInfo.mintB.address,\n ownerTokenAccountA,\n ownerTokenAccountB,\n mintAUseSOLBalance,\n mintBUseSOLBalance,\n associatedOnly,\n });\n\n const poolKeys = propPoolKeys ?? (await this.getClmmPoolKeys(poolInfo.id));\n txBuilder.addInstruction(\n ClmmInstrument.makeSwapBaseInInstructions({\n poolInfo,\n poolKeys,\n observationId,\n ownerInfo: {\n wallet: this.scope.ownerPubKey,\n tokenAccountA: ownerTokenAccountA!,\n tokenAccountB: ownerTokenAccountB!,\n },\n inputMint: new PublicKey(inputMint),\n amountIn,\n amountOutMin,\n sqrtPriceLimitX64,\n remainingAccounts,\n }),\n );\n\n txBuilder.addCustomComputeBudget(computeBudgetConfig);\n\n return txBuilder.versionBuild({ txVersion }) as Promise<MakeTxData<T>>;\n }\n\n public async swapBaseOut<T extends TxVersion>({\n poolInfo,\n poolKeys: propPoolKeys,\n outputMint,\n amountOut,\n amountInMax,\n priceLimit,\n observationId,\n ownerInfo,\n remainingAccounts,\n associatedOnly = true,\n checkCreateATAOwner = false,\n txVersion,\n computeBudgetConfig,\n }: {\n poolInfo: ApiV3PoolInfoConcentratedItem;\n poolKeys?: ClmmKeys;\n outputMint: string | PublicKey;\n amountOut: BN;\n amountInMax: BN;\n priceLimit?: Decimal;\n observationId: PublicKey;\n ownerInfo: {\n useSOLBalance?: boolean;\n feePayer?: PublicKey;\n };\n remainingAccounts: PublicKey[];\n associatedOnly?: boolean;\n checkCreateATAOwner?: boolean;\n txVersion?: T;\n computeBudgetConfig?: ComputeBudgetConfig;\n }): Promise<MakeTxData<T>> {\n const txBuilder = this.createTxBuilder();\n const baseIn = outputMint.toString() === poolInfo.mintB.address;\n const mintAUseSOLBalance = ownerInfo.useSOLBalance && poolInfo.mintA.address === getMintAddresses(this.network).WSOLMint.toBase58();\n const mintBUseSOLBalance = ownerInfo.useSOLBalance && poolInfo.mintB.address === getMintAddresses(this.network).WSOLMint.toBase58();\n\n let sqrtPriceLimitX64: BN;\n if (!priceLimit || priceLimit.equals(new Decimal(0))) {\n sqrtPriceLimitX64 =\n outputMint.toString() === poolInfo.mintB.address\n ? MIN_SQRT_PRICE_X64.add(new BN(1))\n : MAX_SQRT_PRICE_X64.sub(new BN(1));\n } else {\n sqrtPriceLimitX64 = SqrtPriceMath.priceToSqrtPriceX64(\n priceLimit,\n poolInfo.mintA.decimals,\n poolInfo.mintB.decimals,\n );\n }\n\n let ownerTokenAccountA: PublicKey | undefined;\n if (!ownerTokenAccountA) {\n const { account, instructionParams } = await this.scope.account.getOrCreateTokenAccount({\n tokenProgram: poolInfo.mintA.programId,\n mint: new PublicKey(poolInfo.mintA.address),\n notUseTokenAccount: mintAUseSOLBalance,\n owner: this.scope.ownerPubKey,\n skipCloseAccount: !mintAUseSOLBalance,\n createInfo:\n mintAUseSOLBalance || !baseIn\n ? {\n payer: ownerInfo.feePayer || this.scope.ownerPubKey,\n amount: baseIn ? amountInMax : 0,\n }\n : undefined,\n associatedOnly: mintAUseSOLBalance ? false : associatedOnly,\n checkCreateATAOwner,\n });\n ownerTokenAccountA = account!;\n instructionParams && txBuilder.addInstruction(instructionParams);\n }\n\n let ownerTokenAccountB: PublicKey | undefined;\n if (!ownerTokenAccountB) {\n const { account, instructionParams } = await this.scope.account.getOrCreateTokenAccount({\n tokenProgram: poolInfo.mintB.programId,\n mint: new PublicKey(poolInfo.mintB.address),\n notUseTokenAccount: mintBUseSOLBalance,\n owner: this.scope.ownerPubKey,\n skipCloseAccount: !mintBUseSOLBalance,\n createInfo:\n mintBUseSOLBalance || baseIn\n ? {\n payer: ownerInfo.feePayer || this.scope.ownerPubKey,\n amount: baseIn ? 0 : amountInMax,\n }\n : undefined,\n associatedOnly: mintBUseSOLBalance ? false : associatedOnly,\n checkCreateATAOwner,\n });\n ownerTokenAccountB = account!;\n instructionParams && txBuilder.addInstruction(instructionParams);\n }\n\n if (!ownerTokenAccountA || !ownerTokenAccountB)\n this.logAndCreateError(\"user do not have token account\", {\n tokenA: poolInfo.mintA.symbol || poolInfo.mintA.address,\n tokenB: poolInfo.mintB.symbol || poolInfo.mintB.address,\n ownerTokenAccountA,\n ownerTokenAccountB,\n mintAUseSOLBalance,\n mintBUseSOLBalance,\n associatedOnly,\n });\n\n const poolKeys = propPoolKeys ?? (await this.getClmmPoolKeys(poolInfo.id));\n txBuilder.addInstruction(\n ClmmInstrument.makeSwapBaseOutInstructions({\n poolInfo,\n poolKeys,\n observationId,\n ownerInfo: {\n wallet: this.scope.ownerPubKey,\n tokenAccountA: ownerTokenAccountA!,\n tokenAccountB: ownerTokenAccountB!,\n },\n outputMint: new PublicKey(outputMint),\n amountOut,\n amountInMax,\n sqrtPriceLimitX64,\n remainingAccounts,\n }),\n );\n\n txBuilder.addCustomComputeBudget(computeBudgetConfig);\n\n return txBuilder.versionBuild({ txVersion }) as Promise<MakeTxData<T>>;\n }\n\n public async harvestAllRewards<T extends TxVersion = TxVersion.LEGACY>({\n allPoolInfo,\n allPositions,\n lockInfo,\n ownerInfo,\n associatedOnly = true,\n checkCreateATAOwner = false,\n programId,\n txVersion,\n computeBudgetConfig,\n }: HarvestAllRewardsParams<T>): Promise<MakeMultiTxData<T>> {\n const ownerMintToAccount: { [mint: string]: PublicKey } = {};\n for (const item of this.scope.account.tokenAccountRawInfos) {\n if (associatedOnly) {\n const ata = getATAAddress(this.scope.ownerPubKey, item.accountInfo.mint, programId).publicKey;\n if (ata.equals(item.pubkey)) ownerMintToAccount[item.accountInfo.mint.toString()] = item.pubkey;\n } else {\n ownerMintToAccount[item.accountInfo.mint.toString()] = item.pubkey;\n }\n }\n const allNftMints = Object.values(allPositions)\n .flat()\n .map((p) => p.nftMint);\n\n const mintData = await getMultipleAccountsInfoWithCustomFlags(\n this.scope.connection,\n allNftMints.map((n) => ({ pubkey: n })),\n );\n const record: Record<string, PublicKey | null> = {};\n mintData.forEach((data) => {\n record[data.pubkey.toBase58()] = data?.accountInfo?.owner ?? null;\n });\n\n const txBuilder = this.createTxBuilder();\n for (const itemInfo of Object.values(allPoolInfo)) {\n if (allPositions[itemInfo.id] === undefined) continue;\n if (\n !allPositions[itemInfo.id].find(\n (i) => !i.liquidity.isZero() || i.rewardInfos.find((ii) => !ii.rewardAmountOwed.isZero()),\n )\n )\n continue;\n\n const poolInfo = itemInfo;\n const mintAUseSOLBalance = ownerInfo.useSOLBalance && poolInfo.mintA.address === getMintAddresses(this.network).WSOLMint.toBase58();\n const mintBUseSOLBalance = ownerInfo.useSOLBalance && poolInfo.mintB.address === getMintAddresses(this.network).WSOLMint.toBase58();\n\n let ownerTokenAccountA = ownerMintToAccount[poolInfo.mintA.address];\n if (!ownerTokenAccountA) {\n const { account, instructionParams } = await this.scope.account.getOrCreateTokenAccount({\n tokenProgram: poolInfo.mintA.programId,\n mint: new PublicKey(poolInfo.mintA.address),\n notUseTokenAccount: mintAUseSOLBalance,\n owner: this.scope.ownerPubKey,\n skipCloseAccount: !mintAUseSOLBalance,\n createInfo: {\n payer: ownerInfo.feePayer || this.scope.ownerPubKey,\n amount: 0,\n },\n associatedOnly: mintAUseSOLBalance ? false : associatedOnly,\n checkCreateATAOwner,\n });\n ownerTokenAccountA = account!;\n instructionParams && txBuilder.addInstruction(instructionParams);\n }\n\n let ownerTokenAccountB = ownerMintToAccount[poolInfo.mintB.address];\n if (!ownerTokenAccountB) {\n const { account, instructionParams } = await this.scope.account.getOrCreateTokenAccount({\n tokenProgram: poolInfo.mintB.programId,\n mint: new PublicKey(poolInfo.mintB.address),\n notUseTokenAccount: mintBUseSOLBalance,\n owner: this.scope.ownerPubKey,\n skipCloseAccount: !mintBUseSOLBalance,\n createInfo: {\n payer: ownerInfo.feePayer || this.scope.ownerPubKey,\n amount: 0,\n },\n associatedOnly: mintBUseSOLBalance ? false : associatedOnly,\n checkCreateATAOwner,\n });\n ownerTokenAccountB = account!;\n instructionParams && txBuilder.addInstruction(instructionParams);\n }\n\n ownerMintToAccount[poolInfo.mintA.address] = ownerTokenAccountA;\n ownerMintToAccount[poolInfo.mintB.address] = ownerTokenAccountB;\n\n const rewardAccounts: PublicKey[] = [];\n\n for (const itemReward of poolInfo.rewardDefaultInfos) {\n const rewardUseSOLBalance = ownerInfo.useSOLBalance && itemReward.mint.address === getTokenWSol(this.network).address.toString();\n let ownerRewardAccount = ownerMintToAccount[itemReward.mint.address];\n if (!ownerRewardAccount) {\n const { account, instructionParams } = await this.scope.account.getOrCreateTokenAccount({\n tokenProgram: new PublicKey(itemReward.mint.programId),\n mint: new PublicKey(itemReward.mint.address),\n notUseTokenAccount: rewardUseSOLBalance,\n owner: this.scope.ownerPubKey,\n skipCloseAccount: !rewardUseSOLBalance,\n createInfo: {\n payer: ownerInfo.feePayer || this.scope.ownerPubKey,\n amount: 0,\n },\n associatedOnly: rewardUseSOLBalance ? false : associatedOnly,\n });\n ownerRewardAccount = account!;\n instructionParams && txBuilder.addInstruction(instructionParams);\n }\n\n ownerMintToAccount[itemReward.mint.address] = ownerRewardAccount;\n rewardAccounts.push(ownerRewardAccount!);\n }\n\n const poolKeys = await this.getClmmPoolKeys(poolInfo.id);\n\n const rewardAccountsFullInfo: {\n poolRewardVault: PublicKey;\n ownerRewardVault: PublicKey;\n rewardMint: PublicKey;\n }[] = [];\n for (let i = 0; i < poolKeys.rewardInfos.length; i++) {\n rewardAccountsFullInfo.push({\n poolRewardVault: new PublicKey(poolKeys.rewardInfos[i].vault),\n ownerRewardVault: rewardAccounts[i],\n rewardMint: new PublicKey(poolKeys.rewardInfos[i].mint.address),\n });\n }\n\n for (const itemPosition of allPositions[itemInfo.id]) {\n const lockData = lockInfo?.[itemInfo.id]?.[itemPosition.nftMint.toBase58()];\n if (lockData) {\n const lockNftAccount = getATAAddress(\n this.scope.ownerPubKey,\n lockData.lockNftMint,\n TOKEN_PROGRAM_ID,\n ).publicKey;\n\n const tickArrayLowerStartIndex = TickUtils.getTickArrayStartIndexByTick(\n itemPosition.tickLower,\n poolKeys.config.tickSpacing,\n );\n const tickArrayUpperStartIndex = TickUtils.getTickArrayStartIndexByTick(\n itemPosition.tickUpper,\n poolKeys.config.tickSpacing,\n );\n const { publicKey: tickArrayLower } = getPdaTickArrayAddress(\n new PublicKey(poolKeys.programId),\n lockData.poolId,\n tickArrayLowerStartIndex,\n );\n const { publicKey: tickArrayUpper } = getPdaTickArrayAddress(\n new PublicKey(poolKeys.programId),\n lockData.poolId,\n tickArrayUpperStartIndex,\n );\n const { publicKey: protocolPosition } = getPdaProtocolPositionAddress(\n new PublicKey(poolKeys.programId),\n lockData.poolId,\n itemPosition.tickLower,\n itemPosition.tickUpper,\n );\n const lockPositionId = getPdaLockClPositionIdV2(CLMM_LOCK_PROGRAM_ID, lockData.lockNftMint).publicKey;\n const harvestLockIns = ClmmInstrument.harvestLockPositionInstructionV2({\n programId: CLMM_LOCK_PROGRAM_ID,\n auth: CLMM_LOCK_AUTH_ID,\n lockPositionId,\n clmmProgram: getCLMMProgramId(this.network),\n lockOwner: this.scope.ownerPubKey,\n lockNftMint: lockData.lockNftMint,\n lockNftAccount,\n positionNftAccount: lockData.nftAccount,\n positionId: lockData.positionId,\n poolId: lockData.poolId,\n protocolPosition,\n vaultA: new PublicKey(poolKeys.vault.A),\n vaultB: new PublicKey(poolKeys.vault.B),\n tickArrayLower,\n tickArrayUpper,\n userVaultA: ownerTokenAccountA!,\n userVaultB: ownerTokenAccountB!,\n mintA: new PublicKey(poolKeys.mintA.address),\n mintB: new PublicKey(poolKeys.mintB.address),\n rewardAccounts: rewardAccountsFullInfo,\n exTickArrayBitmap: getPdaExBitmapAccount(getCLMMProgramId(this.network), lockData.poolId).publicKey,\n });\n txBuilder.addInstruction({\n instructions: [harvestLockIns],\n instructionTypes: [InstructionType.ClmmHarvestLockPosition],\n lookupTableAddress: poolKeys.lookupTableAccount ? [poolKeys.lookupTableAccount] : [],\n });\n } else {\n const insData = ClmmInstrument.decreaseLiquidityInstructions({\n poolInfo,\n poolKeys,\n ownerPosition: itemPosition,\n ownerInfo: {\n wallet: this.scope.ownerPubKey,\n tokenAccountA: ownerTokenAccountA,\n tokenAccountB: ownerTokenAccountB,\n rewardAccounts,\n },\n liquidity: new BN(0),\n amountMinA: new BN(0),\n amountMinB: new BN(0),\n nft2022: record[itemPosition.nftMint.toBase58()]?.equals(TOKEN_2022_PROGRAM_ID),\n });\n txBuilder.addInstruction(insData);\n }\n }\n }\n\n if (txVersion === TxVersion.V0)\n return txBuilder.sizeCheckBuildV0({ computeBudgetConfig }) as Promise<MakeMultiTxData<T>>;\n return txBuilder.sizeCheckBuild({ computeBudgetConfig }) as Promise<MakeMultiTxData<T>>;\n }\n\n public async getWhiteListMint({ programId }: { programId: PublicKey }): Promise<PublicKey[]> {\n const accountInfo = await this.scope.connection.getAccountInfo(getPdaOperationAccount(programId).publicKey);\n if (!accountInfo) return [];\n const whitelistMintsInfo = OperationLayout.decode(accountInfo.data);\n return whitelistMintsInfo.whitelistMints.filter((i) => !i.equals(PublicKey.default));\n }\n\n public async getOwnerPositionInfo({\n programId,\n }: {\n programId: string | PublicKey;\n }): Promise<ReturnType<typeof PositionInfoLayout.decode>[]> {\n await this.scope.account.fetchWalletTokenAccounts();\n const balanceMints = this.scope.account.tokenAccountRawInfos.filter((acc) => acc.accountInfo.amount.eq(new BN(1)));\n const allPositionKey = balanceMints.map(\n (acc) => getPdaPersonalPositionAddress(new PublicKey(programId), acc.accountInfo.mint).publicKey,\n );\n\n const accountInfo = await this.scope.connection.getMultipleAccountsInfo(allPositionKey);\n const allPosition: ReturnType<typeof PositionInfoLayout.decode>[] = [];\n accountInfo.forEach((positionRes) => {\n if (!positionRes) return;\n const position = PositionInfoLayout.decode(positionRes.data);\n allPosition.push(position);\n });\n\n return allPosition;\n }\n\n public async getRpcClmmPoolInfo({ poolId }: { poolId: string | PublicKey }): Promise<ClmmRpcData> {\n return (await this.getRpcClmmPoolInfos({ poolIds: [poolId] }))[String(poolId)];\n }\n\n public async getRpcClmmPoolInfos({\n poolIds,\n config,\n }: {\n poolIds: (string | PublicKey)[];\n config?: { batchRequest?: boolean; chunkCount?: number };\n }): Promise<{\n [poolId: string]: ClmmRpcData;\n }> {\n const accounts = await getMultipleAccountsInfoWithCustomFlags(\n this.scope.connection,\n poolIds.map((i) => ({ pubkey: new PublicKey(i) })),\n config,\n );\n const returnData: {\n [poolId: string]: ClmmRpcData;\n } = {};\n for (let i = 0; i < poolIds.length; i++) {\n const item = accounts[i];\n if (item === null || !item.accountInfo) throw Error(\"fetch pool info error: \" + String(poolIds[i]));\n const rpc = PoolInfoLayout.decode(item.accountInfo.data);\n const currentPrice = SqrtPriceMath.sqrtPriceX64ToPrice(\n rpc.sqrtPriceX64,\n rpc.mintDecimalsA,\n rpc.mintDecimalsB,\n ).toNumber();\n\n returnData[String(poolIds[i])] = {\n ...rpc,\n currentPrice,\n programId: item.accountInfo.owner,\n };\n }\n return returnData;\n }\n\n public async getComputeClmmPoolInfos({\n clmmPoolsRpcInfo,\n mintInfos,\n }: {\n clmmPoolsRpcInfo: Record<\n string,\n ReturnType<typeof PoolInfoLayout.decode> & { currentPrice: number; programId: PublicKey }\n >;\n mintInfos: ReturnTypeFetchMultipleMintInfos;\n }): Promise<{\n computeClmmPoolInfo: Record<string, ComputeClmmPoolInfo>;\n computePoolTickData: ReturnTypeFetchMultiplePoolTickArrays;\n }> {\n const configSet = new Set(Object.keys(clmmPoolsRpcInfo).map((p) => clmmPoolsRpcInfo[p].ammConfig.toBase58()));\n const res = await getMultipleAccountsInfoWithCustomFlags(\n this.scope.connection,\n Array.from(configSet).map((s) => ({ pubkey: new PublicKey(s) })),\n );\n const clmmConfigs: Record<string, ReturnType<typeof ClmmConfigLayout.decode>> = {};\n res.forEach((acc) => {\n if (!acc.accountInfo) return;\n clmmConfigs[acc.pubkey.toBase58()] = ClmmConfigLayout.decode(acc.accountInfo.data);\n });\n const computeClmmPoolInfo = await PoolUtils.fetchComputeMultipleClmmInfo({\n connection: this.scope.connection,\n rpcDataMap: clmmPoolsRpcInfo,\n poolList: Object.keys(clmmPoolsRpcInfo).map((poolId) => {\n const [mintA, mintB] = [clmmPoolsRpcInfo[poolId].mintA.toBase58(), clmmPoolsRpcInfo[poolId].mintB.toBase58()];\n return {\n id: poolId,\n programId: clmmPoolsRpcInfo[poolId].programId.toBase58(),\n mintA: toApiV3Token({\n address: mintA,\n decimals: clmmPoolsRpcInfo[poolId].mintDecimalsA,\n programId: mintInfos[mintA].programId.toBase58() || TOKEN_PROGRAM_ID.toBase58(),\n extensions: {\n feeConfig: mintInfos[mintA]?.feeConfig ? toFeeConfig(mintInfos[mintA]?.feeConfig) : undefined,\n },\n network: this.network,\n }),\n mintB: toApiV3Token({\n address: mintB,\n decimals: clmmPoolsRpcInfo[poolId].mintDecimalsB,\n programId: mintInfos[mintB].programId.toBase58() || TOKEN_PROGRAM_ID.toBase58(),\n extensions: {\n feeConfig: mintInfos[mintB]?.feeConfig ? toFeeConfig(mintInfos[mintB]?.feeConfig) : undefined,\n },\n network: this.network,\n }),\n price: clmmPoolsRpcInfo[poolId].currentPrice,\n config: {\n ...clmmConfigs[clmmPoolsRpcInfo[poolId].ammConfig.toBase58()],\n id: clmmPoolsRpcInfo[poolId].ammConfig.toBase58(),\n\n fundFeeRate: 0,\n description: \"\",\n defaultRange: 0,\n defaultRangePoint: [],\n },\n };\n }),\n });\n\n const computePoolTickData = await PoolUtils.fetchMultiplePoolTickArrays({\n connection: this.scope.connection,\n poolKeys: Object.values(computeClmmPoolInfo),\n });\n\n return {\n computeClmmPoolInfo,\n computePoolTickData,\n };\n }\n\n public async getPoolInfoFromRpc(poolId: string): Promise<{\n poolInfo: ApiV3PoolInfoConcentratedItem;\n poolKeys: ClmmKeys;\n computePoolInfo: ComputeClmmPoolInfo;\n tickData: ReturnTypeFetchMultiplePoolTickArrays;\n }> {\n const rpcData = await this.getRpcClmmPoolInfo({ poolId });\n\n const mintSet = new Set([rpcData.mintA.toBase58(), rpcData.mintB.toBase58()]);\n\n const mintInfos = await fetchMultipleMintInfos({\n connection: this.scope.connection,\n mints: Array.from(mintSet).map((m) => new PublicKey(m)),\n network: this.network,\n });\n\n const { computeClmmPoolInfo, computePoolTickData } = await this.scope.clmm.getComputeClmmPoolInfos({\n clmmPoolsRpcInfo: { [poolId]: rpcData },\n mintInfos,\n });\n const vaultData = await getMultipleAccountsInfoWithCustomFlags(this.scope.connection, [\n { pubkey: rpcData.vaultA },\n { pubkey: rpcData.vaultB },\n ]);\n\n const poolInfo = clmmComputeInfoToApiInfo(computeClmmPoolInfo[poolId]);\n\n if (!vaultData[0].accountInfo || !vaultData[1].accountInfo) throw new Error(\"pool vault data not found\");\n poolInfo.mintAmountA = Number(AccountLayout.decode(vaultData[0].accountInfo.data).amount.toString());\n poolInfo.mintAmountB = Number(AccountLayout.decode(vaultData[1].accountInfo?.data).amount.toString());\n\n const poolKeys: ClmmKeys = {\n ...computeClmmPoolInfo[poolId],\n exBitmapAccount: computeClmmPoolInfo[poolId].exBitmapAccount.toBase58(),\n observationId: computeClmmPoolInfo[poolId].observationId.toBase58(),\n id: poolId,\n programId: rpcData.programId.toBase58(),\n openTime: rpcData.startTime.toString(),\n vault: {\n A: rpcData.vaultA.toBase58(),\n B: rpcData.vaultB.toBase58(),\n },\n config: poolInfo.config,\n rewardInfos: computeClmmPoolInfo[poolId].rewardInfos\n .filter((r) => !r.tokenVault.equals(PublicKey.default))\n .map((r) => ({\n mint: toApiV3Token({ address: r.tokenMint.toBase58(), programId: TOKEN_PROGRAM_ID.toBase58(), decimals: 10, network: this.network }),\n vault: r.tokenVault.toBase58(),\n })),\n };\n return { poolInfo, poolKeys, computePoolInfo: computeClmmPoolInfo[poolId], tickData: computePoolTickData };\n }\n}\n","import { publicKey, struct, u32, u64, u8 } from \"../../marshmallow\";\n\nexport const SPL_MINT_LAYOUT = struct([\n u32(\"mintAuthorityOption\"),\n publicKey(\"mintAuthority\"),\n u64(\"supply\"),\n u8(\"decimals\"),\n u8(\"isInitialized\"),\n u32(\"freezeAuthorityOption\"),\n publicKey(\"freezeAuthority\"),\n]);\n\nexport type SplMintLayout = typeof SPL_MINT_LAYOUT;\n","import { Connection, PublicKey } from \"@solana/web3.js\";\nimport { MintLayout, RawMint, TOKEN_PROGRAM_ID, TransferFeeConfigLayout } from \"@solana/spl-token\";\nimport { BigNumberish } from \"@/common/bignumber\";\nimport { Token, TokenAmount } from \"../../module\";\nimport { getSolInfo, getTokenWSol } from \"./constant\";\nimport { TokenInfo } from \"./type\";\nimport { NetworkName } from \"@/config\";\nimport { ApiV3Token } from \"../../api\";\nimport { solToWSol } from \"@/common\";\n\nexport const parseTokenInfo = async ({\n connection,\n mint,\n}: {\n connection: Connection;\n mint: PublicKey | string;\n}): Promise<RawMint | undefined> => {\n const accountData = await connection.getAccountInfo(new PublicKey(mint));\n if (!accountData || accountData.data.length !== MintLayout.span) return;\n const tokenInfo = MintLayout.decode(accountData.data);\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n //@ts-ignore\n return tokenInfo;\n};\n\nexport const toTokenInfo = ({\n mint,\n decimals,\n programId = TOKEN_PROGRAM_ID,\n logoURI = \"\",\n priority = 3,\n}: {\n mint: PublicKey;\n decimals: number;\n programId?: PublicKey | string;\n priority?: number;\n logoURI?: string;\n}): TokenInfo => {\n const pubStr = mint.toBase58().substring(0, 6);\n return {\n address: mint.toBase58(),\n decimals,\n symbol: pubStr,\n logoURI,\n extensions: {},\n chainId: 101,\n programId: programId.toString(),\n name: pubStr,\n tags: [],\n priority,\n };\n};\n\nexport const toToken = (props: Omit<TokenInfo, \"priority\">): Token =>\n new Token({\n mint: props.address,\n decimals: props.decimals,\n symbol: props.symbol,\n name: props.name,\n });\n\nexport const toTokenAmount = ({\n amount,\n isRaw,\n name,\n network,\n ...props\n}: Omit<TokenInfo, \"priority\"> & {\n amount: BigNumberish;\n isRaw?: boolean;\n name?: string;\n network: NetworkName;\n}): TokenAmount =>\n new TokenAmount(\n new Token({\n mint: solToWSol(props.address,network).toBase58(),\n decimals: props.decimals,\n symbol: props.symbol,\n name,\n }),\n amount,\n isRaw,\n name,\n );\n\nexport function solToWSolToken<T extends ApiV3Token | TokenInfo>(token: T, network: NetworkName): T {\n if (token.address === getSolInfo(network).address) return getTokenWSol(network) as T;\n return token;\n}\n\nexport function wSolToSolToken<T extends ApiV3Token | TokenInfo>(token: T, network: NetworkName): T {\n if (token.address === getTokenWSol(network).address) return getSolInfo(network) as T;\n return token;\n}\n\nexport const toApiV3Token = ({\n address,\n programId,\n decimals,\n network,\n ...props\n}: {\n address: string;\n programId: string;\n decimals: number;\n network: NetworkName;\n} & Partial<ApiV3Token>): ApiV3Token => ({\n chainId: 101,\n address: solToWSol(address, network).toBase58(),\n programId,\n logoURI: \"\",\n symbol: \"\",\n name: \"\",\n decimals,\n tags: [],\n extensions: props.extensions || {},\n ...props,\n});\n\nexport const toFeeConfig = (\n config?: ReturnType<typeof TransferFeeConfigLayout.decode> | undefined | null,\n): ApiV3Token[\"extensions\"][\"feeConfig\"] | undefined =>\n config\n ? {\n ...config,\n transferFeeConfigAuthority: config.transferFeeConfigAuthority.toBase58(),\n withdrawWithheldAuthority: config.withdrawWithheldAuthority.toBase58(),\n withheldAmount: config.withheldAmount.toString(),\n olderTransferFee: {\n ...config.olderTransferFee,\n epoch: config.olderTransferFee.epoch.toString(),\n maximumFee: config.olderTransferFee.maximumFee.toString(),\n },\n newerTransferFee: {\n ...config.newerTransferFee,\n epoch: config.newerTransferFee.epoch.toString(),\n maximumFee: config.newerTransferFee.maximumFee.toString(),\n },\n }\n : undefined;\n","import { ApiV3PoolInfoConcentratedItem, ApiV3Token, ClmmKeys } from \"@/api/type\";\nimport { ReturnTypeMakeInstructions } from \"@/cobaltx/type\";\nimport {\n InstructionType,\n MEMO_PROGRAM_ID,\n MEMO_PROGRAM_ID2,\n METADATA_PROGRAM_ID,\n RENT_PROGRAM_ID,\n createLogger,\n getATAAddress,\n parseBigNumberish,\n} from \"@/common\";\nimport { bool, s32, struct, u128, u64, u8 } from \"@/marshmallow\";\nimport { ASSOCIATED_TOKEN_PROGRAM_ID, TOKEN_2022_PROGRAM_ID, TOKEN_PROGRAM_ID } from \"@solana/spl-token\";\nimport { Connection, Keypair, PublicKey, Signer, SystemProgram, TransactionInstruction } from \"@solana/web3.js\";\nimport BN from \"bn.js\";\nimport { ClmmPositionLayout, ObservationInfoLayout } from \"./layout\";\nimport {\n ClmmLockAddress,\n ClmmPoolPersonalPosition,\n ClosePositionExtInfo,\n InitRewardExtInfo,\n ManipulateLiquidityExtInfo,\n OpenPositionFromBaseExtInfo,\n OpenPositionFromLiquidityExtInfo,\n} from \"./type\";\nimport {\n getPdaExBitmapAccount,\n getPdaLockClPositionIdV2,\n getPdaLockPositionId,\n getPdaMetadataKey,\n getPdaObservationAccount,\n getPdaOperationAccount,\n getPdaPersonalPositionAddress,\n getPdaPoolId,\n getPdaPoolRewardVaulId,\n getPdaPoolVaultId,\n getPdaProtocolPositionAddress,\n getPdaTickArrayAddress,\n} from \"./utils/pda\";\nimport { PoolUtils } from \"./utils/pool\";\nimport { TickUtils } from \"./utils/tick\";\nObservationInfoLayout.span; // do not delete this line\n\nconst logger = createLogger(\"CobaltX_Clmm\");\n\nconst anchorDataBuf = {\n createPool: [233, 146, 209, 142, 207, 104, 64, 188],\n initReward: [95, 135, 192, 196, 242, 129, 230, 68],\n setRewardEmissions: [112, 52, 167, 75, 32, 201, 211, 137],\n openPosition: [77, 184, 74, 214, 112, 86, 241, 199],\n openPositionWithTokenEx: [77, 255, 174, 82, 125, 29, 201, 46],\n closePosition: [123, 134, 81, 0, 49, 68, 98, 98],\n increaseLiquidity: [133, 29, 89, 223, 69, 238, 176, 10],\n decreaseLiquidity: [58, 127, 188, 62, 79, 82, 196, 96],\n swap: [43, 4, 237, 11, 26, 201, 30, 98], // [248, 198, 158, 145, 225, 117, 135, 200],\n collectReward: [18, 237, 166, 197, 34, 16, 213, 144],\n};\n\nconst lockInsDataBuf = [188, 37, 179, 131, 82, 150, 84, 73];\nconst lockHarvestInsDataBuf = [16, 72, 250, 198, 14, 162, 212, 19];\n\ninterface CreatePoolInstruction {\n connection: Connection;\n programId: PublicKey;\n owner: PublicKey;\n mintA: ApiV3Token;\n mintB: ApiV3Token;\n ammConfigId: PublicKey;\n initialPriceX64: BN;\n startTime: BN;\n forerunCreate?: boolean;\n}\n\nexport class ClmmInstrument {\n static createPoolInstruction(\n programId: PublicKey,\n poolId: PublicKey,\n poolCreator: PublicKey,\n ammConfigId: PublicKey,\n observationId: PublicKey,\n mintA: PublicKey,\n mintVaultA: PublicKey,\n mintProgramIdA: PublicKey,\n mintB: PublicKey,\n mintVaultB: PublicKey,\n mintProgramIdB: PublicKey,\n exTickArrayBitmap: PublicKey,\n sqrtPriceX64: BN,\n startTime: BN,\n ): TransactionInstruction {\n const dataLayout = struct([u128(\"sqrtPriceX64\"), u64(\"startTime\")]);\n\n const keys = [\n { pubkey: poolCreator, isSigner: true, isWritable: true },\n { pubkey: ammConfigId, isSigner: false, isWritable: false },\n { pubkey: poolId, isSigner: false, isWritable: true },\n { pubkey: mintA, isSigner: false, isWritable: false },\n { pubkey: mintB, isSigner: false, isWritable: false },\n { pubkey: mintVaultA, isSigner: false, isWritable: true },\n { pubkey: mintVaultB, isSigner: false, isWritable: true },\n { pubkey: observationId, isSigner: false, isWritable: true },\n { pubkey: exTickArrayBitmap, isSigner: false, isWritable: true },\n { pubkey: mintProgramIdA, isSigner: false, isWritable: false },\n { pubkey: mintProgramIdB, isSigner: false, isWritable: false },\n { pubkey: SystemProgram.programId, isSigner: false, isWritable: false },\n { pubkey: RENT_PROGRAM_ID, isSigner: false, isWritable: false },\n ];\n\n const data = Buffer.alloc(dataLayout.span);\n dataLayout.encode(\n {\n sqrtPriceX64,\n startTime,\n },\n data,\n );\n const aData = Buffer.from([...anchorDataBuf.createPool, ...data]);\n\n return new TransactionInstruction({\n keys,\n programId,\n data: aData,\n });\n }\n\n static async createPoolInstructions(props: CreatePoolInstruction): Promise<\n ReturnTypeMakeInstructions<{\n poolId: PublicKey;\n observationId: PublicKey;\n exBitmapAccount: PublicKey;\n mintAVault: PublicKey;\n mintBVault: PublicKey;\n }>\n > {\n const { programId, owner, mintA, mintB, ammConfigId, initialPriceX64, startTime } = props;\n const [mintAAddress, mintBAddress] = [new PublicKey(mintA.address), new PublicKey(mintB.address)];\n\n const { publicKey: poolId } = getPdaPoolId(programId, ammConfigId, mintAAddress, mintBAddress);\n const { publicKey: observationId } = getPdaObservationAccount(programId, poolId);\n const { publicKey: mintAVault } = getPdaPoolVaultId(programId, poolId, mintAAddress);\n const { publicKey: mintBVault } = getPdaPoolVaultId(programId, poolId, mintBAddress);\n const exBitmapAccount = getPdaExBitmapAccount(programId, poolId).publicKey;\n\n const ins = [\n this.createPoolInstruction(\n programId,\n poolId,\n owner,\n ammConfigId,\n observationId,\n mintAAddress,\n mintAVault,\n new PublicKey(mintA.programId || TOKEN_PROGRAM_ID),\n mintBAddress,\n mintBVault,\n new PublicKey(mintB.programId || TOKEN_PROGRAM_ID),\n exBitmapAccount,\n initialPriceX64,\n startTime,\n ),\n ];\n\n return {\n signers: [],\n instructions: ins,\n instructionTypes: [InstructionType.CreateAccount, InstructionType.ClmmCreatePool],\n address: { poolId, observationId, exBitmapAccount, mintAVault, mintBVault },\n lookupTableAddress: [],\n };\n }\n\n static openPositionFromLiquidityInstruction(\n programId: PublicKey,\n payer: PublicKey,\n poolId: PublicKey,\n positionNftOwner: PublicKey,\n positionNftMint: PublicKey,\n positionNftAccount: PublicKey,\n metadataAccount: PublicKey,\n protocolPosition: PublicKey,\n tickArrayLower: PublicKey,\n tickArrayUpper: PublicKey,\n personalPosition: PublicKey,\n ownerTokenAccountA: PublicKey,\n ownerTokenAccountB: PublicKey,\n tokenVaultA: PublicKey,\n tokenVaultB: PublicKey,\n tokenMintA: PublicKey,\n tokenMintB: PublicKey,\n\n tickLowerIndex: number,\n tickUpperIndex: number,\n tickArrayLowerStartIndex: number,\n tickArrayUpperStartIndex: number,\n liquidity: BN,\n amountMaxA: BN,\n amountMaxB: BN,\n withMetadata: \"create\" | \"no-create\",\n\n exTickArrayBitmap?: PublicKey,\n ): TransactionInstruction {\n const dataLayout = struct([\n s32(\"tickLowerIndex\"),\n s32(\"tickUpperIndex\"),\n s32(\"tickArrayLowerStartIndex\"),\n s32(\"tickArrayUpperStartIndex\"),\n u128(\"liquidity\"),\n u64(\"amountMaxA\"),\n u64(\"amountMaxB\"),\n bool(\"withMetadata\"),\n u8(\"optionBaseFlag\"),\n bool(\"baseFlag\"),\n ]);\n\n const remainingAccounts = [\n ...(exTickArrayBitmap ? [{ pubkey: exTickArrayBitmap, isSigner: false, isWritable: true }] : []),\n ];\n\n const keys = [\n { pubkey: payer, isSigner: true, isWritable: true },\n { pubkey: positionNftOwner, isSigner: false, isWritable: false },\n { pubkey: positionNftMint, isSigner: true, isWritable: true },\n { pubkey: positionNftAccount, isSigner: false, isWritable: true },\n { pubkey: metadataAccount, isSigner: false, isWritable: true },\n { pubkey: poolId, isSigner: false, isWritable: true },\n { pubkey: protocolPosition, isSigner: false, isWritable: true },\n { pubkey: tickArrayLower, isSigner: false, isWritable: true },\n { pubkey: tickArrayUpper, isSigner: false, isWritable: true },\n { pubkey: personalPosition, isSigner: false, isWritable: true },\n { pubkey: ownerTokenAccountA, isSigner: false, isWritable: true },\n { pubkey: ownerTokenAccountB, isSigner: false, isWritable: true },\n { pubkey: tokenVaultA, isSigner: false, isWritable: true },\n { pubkey: tokenVaultB, isSigner: false, isWritable: true },\n\n { pubkey: RENT_PROGRAM_ID, isSigner: false, isWritable: false },\n { pubkey: SystemProgram.programId, isSigner: false, isWritable: false },\n { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },\n { pubkey: ASSOCIATED_TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },\n { pubkey: METADATA_PROGRAM_ID, isSigner: false, isWritable: false },\n { pubkey: TOKEN_2022_PROGRAM_ID, isSigner: false, isWritable: false },\n\n { pubkey: tokenMintA, isSigner: false, isWritable: false },\n { pubkey: tokenMintB, isSigner: false, isWritable: false },\n\n ...remainingAccounts,\n ];\n\n const data = Buffer.alloc(dataLayout.span);\n dataLayout.encode(\n {\n tickLowerIndex,\n tickUpperIndex,\n tickArrayLowerStartIndex,\n tickArrayUpperStartIndex,\n liquidity,\n amountMaxA,\n amountMaxB,\n withMetadata: withMetadata === \"create\",\n baseFlag: false,\n optionBaseFlag: 0,\n },\n data,\n );\n\n const aData = Buffer.from([...anchorDataBuf.openPosition, ...data]);\n\n return new TransactionInstruction({\n keys,\n programId,\n data: aData,\n });\n }\n\n static openPositionFromLiquidityInstruction22(\n programId: PublicKey,\n payer: PublicKey,\n poolId: PublicKey,\n positionNftOwner: PublicKey,\n positionNftMint: PublicKey,\n positionNftAccount: PublicKey,\n protocolPosition: PublicKey,\n tickArrayLower: PublicKey,\n tickArrayUpper: PublicKey,\n personalPosition: PublicKey,\n ownerTokenAccountA: PublicKey,\n ownerTokenAccountB: PublicKey,\n tokenVaultA: PublicKey,\n tokenVaultB: PublicKey,\n tokenMintA: PublicKey,\n tokenMintB: PublicKey,\n\n tickLowerIndex: number,\n tickUpperIndex: number,\n tickArrayLowerStartIndex: number,\n tickArrayUpperStartIndex: number,\n liquidity: BN,\n amountMaxA: BN,\n amountMaxB: BN,\n withMetadata: \"create\" | \"no-create\",\n\n exTickArrayBitmap?: PublicKey,\n ): TransactionInstruction {\n const dataLayout = struct([\n s32(\"tickLowerIndex\"),\n s32(\"tickUpperIndex\"),\n s32(\"tickArrayLowerStartIndex\"),\n s32(\"tickArrayUpperStartIndex\"),\n u128(\"liquidity\"),\n u64(\"amountMaxA\"),\n u64(\"amountMaxB\"),\n bool(\"withMetadata\"),\n u8(\"optionBaseFlag\"),\n bool(\"baseFlag\"),\n ]);\n\n const remainingAccounts = [\n ...(exTickArrayBitmap ? [{ pubkey: exTickArrayBitmap, isSigner: false, isWritable: true }] : []),\n ];\n\n const keys = [\n { pubkey: payer, isSigner: true, isWritable: true },\n { pubkey: positionNftOwner, isSigner: false, isWritable: false },\n { pubkey: positionNftMint, isSigner: true, isWritable: true },\n { pubkey: positionNftAccount, isSigner: false, isWritable: true },\n { pubkey: poolId, isSigner: false, isWritable: true },\n { pubkey: protocolPosition, isSigner: false, isWritable: true },\n { pubkey: tickArrayLower, isSigner: false, isWritable: true },\n { pubkey: tickArrayUpper, isSigner: false, isWritable: true },\n { pubkey: personalPosition, isSigner: false, isWritable: true },\n { pubkey: ownerTokenAccountA, isSigner: false, isWritable: true },\n { pubkey: ownerTokenAccountB, isSigner: false, isWritable: true },\n { pubkey: tokenVaultA, isSigner: false, isWritable: true },\n { pubkey: tokenVaultB, isSigner: false, isWritable: true },\n\n { pubkey: RENT_PROGRAM_ID, isSigner: false, isWritable: false },\n { pubkey: SystemProgram.programId, isSigner: false, isWritable: false },\n { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },\n { pubkey: ASSOCIATED_TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },\n { pubkey: TOKEN_2022_PROGRAM_ID, isSigner: false, isWritable: false },\n\n { pubkey: tokenMintA, isSigner: false, isWritable: false },\n { pubkey: tokenMintB, isSigner: false, isWritable: false },\n\n ...remainingAccounts,\n ];\n\n const data = Buffer.alloc(dataLayout.span);\n dataLayout.encode(\n {\n tickLowerIndex,\n tickUpperIndex,\n tickArrayLowerStartIndex,\n tickArrayUpperStartIndex,\n liquidity,\n amountMaxA,\n amountMaxB,\n withMetadata: withMetadata === \"create\",\n baseFlag: false,\n optionBaseFlag: 0,\n },\n data,\n );\n\n const aData = Buffer.from([...anchorDataBuf.openPositionWithTokenEx, ...data]);\n\n return new TransactionInstruction({\n keys,\n programId,\n data: aData,\n });\n }\n\n static async openPositionInstructions({\n poolInfo,\n poolKeys,\n ownerInfo,\n tickLower,\n tickUpper,\n liquidity,\n amountMaxA,\n amountMaxB,\n withMetadata,\n getEphemeralSigners,\n nft2022,\n }: {\n poolInfo: ApiV3PoolInfoConcentratedItem;\n poolKeys: ClmmKeys;\n ownerInfo: {\n feePayer: PublicKey;\n wallet: PublicKey;\n tokenAccountA: PublicKey;\n tokenAccountB: PublicKey;\n };\n\n tickLower: number;\n tickUpper: number;\n liquidity: BN;\n amountMaxA: BN;\n amountMaxB: BN;\n withMetadata: \"create\" | \"no-create\";\n getEphemeralSigners?: (k: number) => any;\n nft2022?: boolean;\n }): Promise<ReturnTypeMakeInstructions> {\n const signers: Signer[] = [];\n const [programId, id] = [new PublicKey(poolInfo.programId), new PublicKey(poolInfo.id)];\n\n let nftMintAccount;\n if (getEphemeralSigners) {\n nftMintAccount = new PublicKey((await getEphemeralSigners(1))[0]);\n } else {\n const _k = Keypair.generate();\n signers.push(_k);\n nftMintAccount = _k.publicKey;\n }\n\n const tickArrayLowerStartIndex = TickUtils.getTickArrayStartIndexByTick(tickLower, poolInfo.config.tickSpacing);\n const tickArrayUpperStartIndex = TickUtils.getTickArrayStartIndexByTick(tickUpper, poolInfo.config.tickSpacing);\n\n const { publicKey: tickArrayLower } = getPdaTickArrayAddress(programId, id, tickArrayLowerStartIndex);\n const { publicKey: tickArrayUpper } = getPdaTickArrayAddress(programId, id, tickArrayUpperStartIndex);\n\n const { publicKey: positionNftAccount } = nft2022\n ? getATAAddress(ownerInfo.wallet, nftMintAccount, TOKEN_2022_PROGRAM_ID)\n : getATAAddress(ownerInfo.wallet, nftMintAccount, TOKEN_PROGRAM_ID);\n const { publicKey: metadataAccount } = getPdaMetadataKey(nftMintAccount);\n const { publicKey: personalPosition } = getPdaPersonalPositionAddress(programId, nftMintAccount);\n const { publicKey: protocolPosition } = getPdaProtocolPositionAddress(programId, id, tickLower, tickUpper);\n\n const ins = nft2022\n ? this.openPositionFromLiquidityInstruction22(\n programId,\n ownerInfo.feePayer,\n id,\n ownerInfo.wallet,\n nftMintAccount,\n positionNftAccount,\n protocolPosition,\n tickArrayLower,\n tickArrayUpper,\n personalPosition,\n ownerInfo.tokenAccountA,\n ownerInfo.tokenAccountB,\n new PublicKey(poolKeys.vault.A),\n new PublicKey(poolKeys.vault.B),\n new PublicKey(poolInfo.mintA.address),\n new PublicKey(poolInfo.mintB.address),\n\n tickLower,\n tickUpper,\n tickArrayLowerStartIndex,\n tickArrayUpperStartIndex,\n liquidity,\n amountMaxA,\n amountMaxB,\n withMetadata,\n PoolUtils.isOverflowDefaultTickarrayBitmap(poolInfo.config.tickSpacing, [\n tickArrayLowerStartIndex,\n tickArrayUpperStartIndex,\n ])\n ? getPdaExBitmapAccount(programId, id).publicKey\n : undefined,\n )\n : this.openPositionFromLiquidityInstruction(\n programId,\n ownerInfo.feePayer,\n id,\n ownerInfo.wallet,\n nftMintAccount,\n positionNftAccount,\n metadataAccount,\n protocolPosition,\n tickArrayLower,\n tickArrayUpper,\n personalPosition,\n ownerInfo.tokenAccountA,\n ownerInfo.tokenAccountB,\n new PublicKey(poolKeys.vault.A),\n new PublicKey(poolKeys.vault.B),\n new PublicKey(poolInfo.mintA.address),\n new PublicKey(poolInfo.mintB.address),\n\n tickLower,\n tickUpper,\n tickArrayLowerStartIndex,\n tickArrayUpperStartIndex,\n liquidity,\n amountMaxA,\n amountMaxB,\n withMetadata,\n PoolUtils.isOverflowDefaultTickarrayBitmap(poolInfo.config.tickSpacing, [\n tickArrayLowerStartIndex,\n tickArrayUpperStartIndex,\n ])\n ? getPdaExBitmapAccount(programId, id).publicKey\n : undefined,\n );\n\n return {\n signers,\n instructions: [ins],\n instructionTypes: [InstructionType.ClmmOpenPosition],\n lookupTableAddress: poolKeys.lookupTableAccount ? [poolKeys.lookupTableAccount] : [],\n address: {\n nftMint: nftMintAccount,\n tickArrayLower,\n tickArrayUpper,\n positionNftAccount,\n metadataAccount,\n personalPosition,\n protocolPosition,\n },\n };\n }\n\n static async openPositionFromBaseInstructions({\n poolInfo,\n poolKeys,\n ownerInfo,\n tickLower,\n tickUpper,\n base,\n baseAmount,\n otherAmountMax,\n withMetadata,\n getEphemeralSigners,\n nft2022,\n }: {\n poolInfo: ApiV3PoolInfoConcentratedItem;\n poolKeys: ClmmKeys;\n ownerInfo: {\n feePayer: PublicKey;\n wallet: PublicKey;\n tokenAccountA: PublicKey;\n tokenAccountB: PublicKey;\n };\n\n tickLower: number;\n tickUpper: number;\n\n base: \"MintA\" | \"MintB\";\n baseAmount: BN;\n\n otherAmountMax: BN;\n withMetadata: \"create\" | \"no-create\";\n getEphemeralSigners?: (k: number) => any;\n nft2022?: boolean;\n }): Promise<ReturnTypeMakeInstructions<OpenPositionFromBaseExtInfo>> {\n const signers: Signer[] = [];\n const [programId, id] = [new PublicKey(poolInfo.programId), new PublicKey(poolInfo.id)];\n\n let nftMintAccount: PublicKey;\n if (getEphemeralSigners) {\n nftMintAccount = new PublicKey((await getEphemeralSigners(1))[0]);\n } else {\n const _k = Keypair.generate();\n signers.push(_k);\n nftMintAccount = _k.publicKey;\n }\n\n const tickArrayLowerStartIndex = TickUtils.getTickArrayStartIndexByTick(tickLower, poolInfo.config.tickSpacing);\n const tickArrayUpperStartIndex = TickUtils.getTickArrayStartIndexByTick(tickUpper, poolInfo.config.tickSpacing);\n\n const { publicKey: tickArrayLower } = getPdaTickArrayAddress(programId, id, tickArrayLowerStartIndex);\n const { publicKey: tickArrayUpper } = getPdaTickArrayAddress(programId, id, tickArrayUpperStartIndex);\n\n const { publicKey: positionNftAccount } = nft2022\n ? getATAAddress(ownerInfo.wallet, nftMintAccount, TOKEN_2022_PROGRAM_ID)\n : getATAAddress(ownerInfo.wallet, nftMintAccount, TOKEN_PROGRAM_ID);\n const { publicKey: metadataAccount } = getPdaMetadataKey(nftMintAccount);\n const { publicKey: personalPosition } = getPdaPersonalPositionAddress(programId, nftMintAccount);\n const { publicKey: protocolPosition } = getPdaProtocolPositionAddress(programId, id, tickLower, tickUpper);\n\n const ins = nft2022\n ? this.openPositionFromBaseInstruction22(\n programId,\n ownerInfo.feePayer,\n id,\n ownerInfo.wallet,\n nftMintAccount,\n positionNftAccount,\n protocolPosition,\n tickArrayLower,\n tickArrayUpper,\n personalPosition,\n ownerInfo.tokenAccountA,\n ownerInfo.tokenAccountB,\n new PublicKey(poolKeys.vault.A),\n new PublicKey(poolKeys.vault.B),\n new PublicKey(poolInfo.mintA.address),\n new PublicKey(poolInfo.mintB.address),\n\n tickLower,\n tickUpper,\n tickArrayLowerStartIndex,\n tickArrayUpperStartIndex,\n\n withMetadata,\n\n base,\n baseAmount,\n\n otherAmountMax,\n PoolUtils.isOverflowDefaultTickarrayBitmap(poolInfo.config.tickSpacing, [\n tickArrayLowerStartIndex,\n tickArrayUpperStartIndex,\n ])\n ? getPdaExBitmapAccount(programId, id).publicKey\n : undefined,\n )\n : this.openPositionFromBaseInstruction(\n programId,\n ownerInfo.feePayer,\n id,\n ownerInfo.wallet,\n nftMintAccount,\n positionNftAccount,\n metadataAccount,\n protocolPosition,\n tickArrayLower,\n tickArrayUpper,\n personalPosition,\n ownerInfo.tokenAccountA,\n ownerInfo.tokenAccountB,\n new PublicKey(poolKeys.vault.A),\n new PublicKey(poolKeys.vault.B),\n new PublicKey(poolInfo.mintA.address),\n new PublicKey(poolInfo.mintB.address),\n\n tickLower,\n tickUpper,\n tickArrayLowerStartIndex,\n tickArrayUpperStartIndex,\n\n withMetadata,\n\n base,\n baseAmount,\n\n otherAmountMax,\n PoolUtils.isOverflowDefaultTickarrayBitmap(poolInfo.config.tickSpacing, [\n tickArrayLowerStartIndex,\n tickArrayUpperStartIndex,\n ])\n ? getPdaExBitmapAccount(programId, id).publicKey\n : undefined,\n );\n\n return {\n address: {\n nftMint: nftMintAccount,\n tickArrayLower,\n tickArrayUpper,\n positionNftAccount,\n metadataAccount,\n personalPosition,\n protocolPosition,\n },\n instructions: [ins],\n signers,\n instructionTypes: [InstructionType.ClmmOpenPosition],\n lookupTableAddress:\n poolKeys.lookupTableAccount && poolKeys.lookupTableAccount != \"\" ? [poolKeys.lookupTableAccount] : [],\n };\n }\n\n static openPositionFromBaseInstruction(\n programId: PublicKey,\n payer: PublicKey,\n poolId: PublicKey,\n positionNftOwner: PublicKey,\n positionNftMint: PublicKey,\n positionNftAccount: PublicKey,\n metadataAccount: PublicKey,\n protocolPosition: PublicKey,\n tickArrayLower: PublicKey,\n tickArrayUpper: PublicKey,\n personalPosition: PublicKey,\n ownerTokenAccountA: PublicKey,\n ownerTokenAccountB: PublicKey,\n tokenVaultA: PublicKey,\n tokenVaultB: PublicKey,\n tokenMintA: PublicKey,\n tokenMintB: PublicKey,\n\n tickLowerIndex: number,\n tickUpperIndex: number,\n tickArrayLowerStartIndex: number,\n tickArrayUpperStartIndex: number,\n\n withMetadata: \"create\" | \"no-create\",\n base: \"MintA\" | \"MintB\",\n baseAmount: BN,\n\n otherAmountMax: BN,\n\n exTickArrayBitmap?: PublicKey,\n ): TransactionInstruction {\n const dataLayout = struct([\n s32(\"tickLowerIndex\"),\n s32(\"tickUpperIndex\"),\n s32(\"tickArrayLowerStartIndex\"),\n s32(\"tickArrayUpperStartIndex\"),\n u128(\"liquidity\"),\n u64(\"amountMaxA\"),\n u64(\"amountMaxB\"),\n bool(\"withMetadata\"),\n u8(\"optionBaseFlag\"),\n bool(\"baseFlag\"),\n ]);\n\n const remainingAccounts = [\n ...(exTickArrayBitmap ? [{ pubkey: exTickArrayBitmap, isSigner: false, isWritable: true }] : []),\n ];\n\n const keys = [\n { pubkey: payer, isSigner: true, isWritable: true },\n { pubkey: positionNftOwner, isSigner: false, isWritable: false },\n { pubkey: positionNftMint, isSigner: true, isWritable: true },\n { pubkey: positionNftAccount, isSigner: false, isWritable: true },\n { pubkey: metadataAccount, isSigner: false, isWritable: true },\n { pubkey: poolId, isSigner: false, isWritable: true },\n { pubkey: protocolPosition, isSigner: false, isWritable: true },\n { pubkey: tickArrayLower, isSigner: false, isWritable: true },\n { pubkey: tickArrayUpper, isSigner: false, isWritable: true },\n { pubkey: personalPosition, isSigner: false, isWritable: true },\n { pubkey: ownerTokenAccountA, isSigner: false, isWritable: true },\n { pubkey: ownerTokenAccountB, isSigner: false, isWritable: true },\n { pubkey: tokenVaultA, isSigner: false, isWritable: true },\n { pubkey: tokenVaultB, isSigner: false, isWritable: true },\n\n { pubkey: RENT_PROGRAM_ID, isSigner: false, isWritable: false },\n { pubkey: SystemProgram.programId, isSigner: false, isWritable: false },\n { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },\n { pubkey: ASSOCIATED_TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },\n { pubkey: METADATA_PROGRAM_ID, isSigner: false, isWritable: false },\n { pubkey: TOKEN_2022_PROGRAM_ID, isSigner: false, isWritable: false },\n\n { pubkey: tokenMintA, isSigner: false, isWritable: false },\n { pubkey: tokenMintB, isSigner: false, isWritable: false },\n\n ...remainingAccounts,\n ];\n\n const data = Buffer.alloc(dataLayout.span);\n dataLayout.encode(\n {\n tickLowerIndex,\n tickUpperIndex,\n tickArrayLowerStartIndex,\n tickArrayUpperStartIndex,\n liquidity: new BN(0),\n amountMaxA: base === \"MintA\" ? baseAmount : otherAmountMax,\n amountMaxB: base === \"MintA\" ? otherAmountMax : baseAmount,\n withMetadata: withMetadata === \"create\",\n baseFlag: base === \"MintA\",\n optionBaseFlag: 1,\n },\n data,\n );\n\n const aData = Buffer.from([...anchorDataBuf.openPosition, ...data]);\n\n return new TransactionInstruction({\n keys,\n programId,\n data: aData,\n });\n }\n\n static openPositionFromBaseInstruction22(\n programId: PublicKey,\n payer: PublicKey,\n poolId: PublicKey,\n positionNftOwner: PublicKey,\n positionNftMint: PublicKey,\n positionNftAccount: PublicKey,\n protocolPosition: PublicKey,\n tickArrayLower: PublicKey,\n tickArrayUpper: PublicKey,\n personalPosition: PublicKey,\n ownerTokenAccountA: PublicKey,\n ownerTokenAccountB: PublicKey,\n tokenVaultA: PublicKey,\n tokenVaultB: PublicKey,\n tokenMintA: PublicKey,\n tokenMintB: PublicKey,\n\n tickLowerIndex: number,\n tickUpperIndex: number,\n tickArrayLowerStartIndex: number,\n tickArrayUpperStartIndex: number,\n\n withMetadata: \"create\" | \"no-create\",\n base: \"MintA\" | \"MintB\",\n baseAmount: BN,\n\n otherAmountMax: BN,\n\n exTickArrayBitmap?: PublicKey,\n ): TransactionInstruction {\n const dataLayout = struct([\n s32(\"tickLowerIndex\"),\n s32(\"tickUpperIndex\"),\n s32(\"tickArrayLowerStartIndex\"),\n s32(\"tickArrayUpperStartIndex\"),\n u128(\"liquidity\"),\n u64(\"amountMaxA\"),\n u64(\"amountMaxB\"),\n bool(\"withMetadata\"),\n u8(\"optionBaseFlag\"),\n bool(\"baseFlag\"),\n ]);\n\n const remainingAccounts = [\n ...(exTickArrayBitmap ? [{ pubkey: exTickArrayBitmap, isSigner: false, isWritable: true }] : []),\n ];\n\n const keys = [\n { pubkey: payer, isSigner: true, isWritable: true },\n { pubkey: positionNftOwner, isSigner: false, isWritable: false },\n { pubkey: positionNftMint, isSigner: true, isWritable: true },\n { pubkey: positionNftAccount, isSigner: false, isWritable: true },\n { pubkey: poolId, isSigner: false, isWritable: true },\n { pubkey: protocolPosition, isSigner: false, isWritable: true },\n { pubkey: tickArrayLower, isSigner: false, isWritable: true },\n { pubkey: tickArrayUpper, isSigner: false, isWritable: true },\n { pubkey: personalPosition, isSigner: false, isWritable: true },\n { pubkey: ownerTokenAccountA, isSigner: false, isWritable: true },\n { pubkey: ownerTokenAccountB, isSigner: false, isWritable: true },\n { pubkey: tokenVaultA, isSigner: false, isWritable: true },\n { pubkey: tokenVaultB, isSigner: false, isWritable: true },\n\n { pubkey: RENT_PROGRAM_ID, isSigner: false, isWritable: false },\n { pubkey: SystemProgram.programId, isSigner: false, isWritable: false },\n { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },\n { pubkey: ASSOCIATED_TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },\n { pubkey: TOKEN_2022_PROGRAM_ID, isSigner: false, isWritable: false },\n\n { pubkey: tokenMintA, isSigner: false, isWritable: false },\n { pubkey: tokenMintB, isSigner: false, isWritable: false },\n\n ...remainingAccounts,\n ];\n\n const data = Buffer.alloc(dataLayout.span);\n dataLayout.encode(\n {\n tickLowerIndex,\n tickUpperIndex,\n tickArrayLowerStartIndex,\n tickArrayUpperStartIndex,\n liquidity: new BN(0),\n amountMaxA: base === \"MintA\" ? baseAmount : otherAmountMax,\n amountMaxB: base === \"MintA\" ? otherAmountMax : baseAmount,\n withMetadata: withMetadata === \"create\",\n baseFlag: base === \"MintA\",\n optionBaseFlag: 1,\n },\n data,\n );\n\n const aData = Buffer.from([...anchorDataBuf.openPositionWithTokenEx, ...data]);\n\n return new TransactionInstruction({\n keys,\n programId,\n data: aData,\n });\n }\n\n static async openPositionFromLiquidityInstructions({\n poolInfo,\n poolKeys,\n ownerInfo,\n tickLower,\n tickUpper,\n liquidity,\n amountMaxA,\n amountMaxB,\n withMetadata,\n getEphemeralSigners,\n nft2022,\n }: {\n poolInfo: ApiV3PoolInfoConcentratedItem;\n poolKeys: ClmmKeys;\n ownerInfo: {\n wallet: PublicKey;\n tokenAccountA: PublicKey;\n tokenAccountB: PublicKey;\n };\n\n tickLower: number;\n tickUpper: number;\n liquidity: BN;\n amountMaxA: BN;\n amountMaxB: BN;\n withMetadata: \"create\" | \"no-create\";\n getEphemeralSigners?: (k: number) => any;\n nft2022?: boolean;\n }): Promise<ReturnTypeMakeInstructions<OpenPositionFromLiquidityExtInfo[\"address\"]>> {\n let nftMintAccount: PublicKey;\n const signers: Keypair[] = [];\n if (getEphemeralSigners) {\n nftMintAccount = new PublicKey((await getEphemeralSigners(1))[0]);\n } else {\n const _k = Keypair.generate();\n signers.push(_k);\n nftMintAccount = _k.publicKey;\n }\n\n const [programId, id] = [new PublicKey(poolInfo.programId), new PublicKey(poolInfo.id)];\n\n const tickArrayLowerStartIndex = TickUtils.getTickArrayStartIndexByTick(tickLower, poolInfo.config.tickSpacing);\n const tickArrayUpperStartIndex = TickUtils.getTickArrayStartIndexByTick(tickUpper, poolInfo.config.tickSpacing);\n\n const { publicKey: tickArrayLower } = getPdaTickArrayAddress(programId, id, tickArrayLowerStartIndex);\n const { publicKey: tickArrayUpper } = getPdaTickArrayAddress(programId, id, tickArrayUpperStartIndex);\n\n const { publicKey: positionNftAccount } = nft2022\n ? getATAAddress(ownerInfo.wallet, nftMintAccount, TOKEN_2022_PROGRAM_ID)\n : getATAAddress(ownerInfo.wallet, nftMintAccount, TOKEN_PROGRAM_ID);\n const { publicKey: metadataAccount } = getPdaMetadataKey(nftMintAccount);\n const { publicKey: personalPosition } = getPdaPersonalPositionAddress(programId, nftMintAccount);\n const { publicKey: protocolPosition } = getPdaProtocolPositionAddress(programId, id, tickLower, tickUpper);\n\n const ins = nft2022\n ? this.openPositionFromLiquidityInstruction22(\n programId,\n ownerInfo.wallet,\n id,\n ownerInfo.wallet,\n nftMintAccount,\n positionNftAccount,\n protocolPosition,\n tickArrayLower,\n tickArrayUpper,\n personalPosition,\n ownerInfo.tokenAccountA,\n ownerInfo.tokenAccountB,\n new PublicKey(poolKeys.vault.A),\n new PublicKey(poolKeys.vault.B),\n new PublicKey(poolKeys.mintA.address),\n new PublicKey(poolKeys.mintB.address),\n\n tickLower,\n tickUpper,\n tickArrayLowerStartIndex,\n tickArrayUpperStartIndex,\n liquidity,\n amountMaxA,\n amountMaxB,\n withMetadata,\n PoolUtils.isOverflowDefaultTickarrayBitmap(poolInfo.config.tickSpacing, [\n tickArrayLowerStartIndex,\n tickArrayUpperStartIndex,\n ])\n ? getPdaExBitmapAccount(programId, id).publicKey\n : undefined,\n )\n : this.openPositionFromLiquidityInstruction(\n programId,\n ownerInfo.wallet,\n id,\n ownerInfo.wallet,\n nftMintAccount,\n positionNftAccount,\n metadataAccount,\n protocolPosition,\n tickArrayLower,\n tickArrayUpper,\n personalPosition,\n ownerInfo.tokenAccountA,\n ownerInfo.tokenAccountB,\n new PublicKey(poolKeys.vault.A),\n new PublicKey(poolKeys.vault.B),\n new PublicKey(poolKeys.mintA.address),\n new PublicKey(poolKeys.mintB.address),\n\n tickLower,\n tickUpper,\n tickArrayLowerStartIndex,\n tickArrayUpperStartIndex,\n liquidity,\n amountMaxA,\n amountMaxB,\n withMetadata,\n PoolUtils.isOverflowDefaultTickarrayBitmap(poolInfo.config.tickSpacing, [\n tickArrayLowerStartIndex,\n tickArrayUpperStartIndex,\n ])\n ? getPdaExBitmapAccount(programId, id).publicKey\n : undefined,\n );\n\n return {\n address: {\n nftMint: nftMintAccount,\n tickArrayLower,\n tickArrayUpper,\n positionNftAccount,\n metadataAccount,\n personalPosition,\n protocolPosition,\n },\n instructions: [ins],\n signers,\n instructionTypes: [InstructionType.ClmmOpenPosition],\n lookupTableAddress: poolKeys.lookupTableAccount ? [poolKeys.lookupTableAccount] : [],\n };\n }\n\n static closePositionInstruction(\n programId: PublicKey,\n positionNftOwner: PublicKey,\n positionNftMint: PublicKey,\n positionNftAccount: PublicKey,\n personalPosition: PublicKey,\n nft2022?: boolean,\n ): TransactionInstruction {\n const dataLayout = struct([]);\n\n const keys = [\n { pubkey: positionNftOwner, isSigner: true, isWritable: true },\n { pubkey: positionNftMint, isSigner: false, isWritable: true },\n { pubkey: positionNftAccount, isSigner: false, isWritable: true },\n { pubkey: personalPosition, isSigner: false, isWritable: true },\n\n { pubkey: SystemProgram.programId, isSigner: false, isWritable: false },\n { pubkey: nft2022 ? TOKEN_2022_PROGRAM_ID : TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },\n ];\n\n const data = Buffer.alloc(dataLayout.span);\n dataLayout.encode({}, data);\n\n const aData = Buffer.from([...anchorDataBuf.closePosition, ...data]);\n\n return new TransactionInstruction({\n keys,\n programId,\n data: aData,\n });\n }\n\n static closePositionInstructions({\n poolInfo,\n poolKeys,\n ownerInfo,\n ownerPosition,\n nft2022,\n }: {\n poolInfo: ApiV3PoolInfoConcentratedItem;\n poolKeys: ClmmKeys;\n ownerPosition: ClmmPositionLayout;\n ownerInfo: {\n wallet: PublicKey;\n };\n nft2022?: boolean;\n }): ReturnTypeMakeInstructions<ClosePositionExtInfo[\"address\"]> {\n const programId = new PublicKey(poolInfo.programId);\n // const { publicKey: positionNftAccount } = getATAAddress(ownerInfo.wallet, ownerPosition.nftMint, TOKEN_PROGRAM_ID);\n const positionNftAccount = nft2022\n ? getATAAddress(ownerInfo.wallet, ownerPosition.nftMint, TOKEN_2022_PROGRAM_ID).publicKey\n : getATAAddress(ownerInfo.wallet, ownerPosition.nftMint, TOKEN_PROGRAM_ID).publicKey;\n const { publicKey: personalPosition } = getPdaPersonalPositionAddress(programId, ownerPosition.nftMint);\n\n const ins: TransactionInstruction[] = [];\n ins.push(\n this.closePositionInstruction(\n programId,\n ownerInfo.wallet,\n ownerPosition.nftMint,\n positionNftAccount,\n personalPosition,\n nft2022,\n ),\n );\n\n return {\n address: {\n positionNftAccount,\n personalPosition,\n },\n signers: [],\n instructions: ins,\n instructionTypes: [InstructionType.ClmmClosePosition],\n lookupTableAddress: poolKeys.lookupTableAccount ? [poolKeys.lookupTableAccount] : [],\n };\n }\n\n static increasePositionFromLiquidityInstruction(\n programId: PublicKey,\n positionNftOwner: PublicKey,\n positionNftAccount: PublicKey,\n personalPosition: PublicKey,\n\n poolId: PublicKey,\n protocolPosition: PublicKey,\n tickArrayLower: PublicKey,\n tickArrayUpper: PublicKey,\n ownerTokenAccountA: PublicKey,\n ownerTokenAccountB: PublicKey,\n mintVaultA: PublicKey,\n mintVaultB: PublicKey,\n mintMintA: PublicKey,\n mintMintB: PublicKey,\n\n liquidity: BN,\n amountMaxA: BN,\n amountMaxB: BN,\n\n exTickArrayBitmap?: PublicKey,\n ): TransactionInstruction {\n const dataLayout = struct([\n u128(\"liquidity\"),\n u64(\"amountMaxA\"),\n u64(\"amountMaxB\"),\n u8(\"optionBaseFlag\"),\n bool(\"baseFlag\"),\n ]);\n\n const remainingAccounts = [\n ...(exTickArrayBitmap ? [{ pubkey: exTickArrayBitmap, isSigner: false, isWritable: true }] : []),\n ];\n\n const keys = [\n { pubkey: positionNftOwner, isSigner: true, isWritable: false },\n { pubkey: positionNftAccount, isSigner: false, isWritable: false },\n { pubkey: poolId, isSigner: false, isWritable: true },\n { pubkey: protocolPosition, isSigner: false, isWritable: true },\n { pubkey: personalPosition, isSigner: false, isWritable: true },\n { pubkey: tickArrayLower, isSigner: false, isWritable: true },\n { pubkey: tickArrayUpper, isSigner: false, isWritable: true },\n { pubkey: ownerTokenAccountA, isSigner: false, isWritable: true },\n { pubkey: ownerTokenAccountB, isSigner: false, isWritable: true },\n { pubkey: mintVaultA, isSigner: false, isWritable: true },\n { pubkey: mintVaultB, isSigner: false, isWritable: true },\n\n { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },\n { pubkey: TOKEN_2022_PROGRAM_ID, isSigner: false, isWritable: false },\n\n { pubkey: mintMintA, isSigner: false, isWritable: false },\n { pubkey: mintMintB, isSigner: false, isWritable: false },\n\n ...remainingAccounts,\n ];\n\n const data = Buffer.alloc(dataLayout.span);\n dataLayout.encode(\n {\n liquidity,\n amountMaxA,\n amountMaxB,\n optionBaseFlag: 0,\n baseFlag: false,\n },\n data,\n );\n\n const aData = Buffer.from([...anchorDataBuf.increaseLiquidity, ...data]);\n\n return new TransactionInstruction({\n keys,\n programId,\n data: aData,\n });\n }\n\n static increasePositionFromLiquidityInstructions({\n poolInfo,\n poolKeys,\n ownerPosition,\n ownerInfo,\n liquidity,\n amountMaxA,\n amountMaxB,\n nft2022,\n }: {\n poolInfo: ApiV3PoolInfoConcentratedItem;\n poolKeys: ClmmKeys;\n ownerPosition: ClmmPositionLayout;\n\n ownerInfo: {\n wallet: PublicKey;\n tokenAccountA: PublicKey;\n tokenAccountB: PublicKey;\n };\n\n liquidity: BN;\n amountMaxA: BN;\n amountMaxB: BN;\n nft2022?: boolean;\n }): ReturnTypeMakeInstructions<ManipulateLiquidityExtInfo[\"address\"]> {\n const [programId, id] = [new PublicKey(poolInfo.programId), new PublicKey(poolInfo.id)];\n const tickArrayLowerStartIndex = TickUtils.getTickArrayStartIndexByTick(\n ownerPosition.tickLower,\n poolInfo.config.tickSpacing,\n );\n const tickArrayUpperStartIndex = TickUtils.getTickArrayStartIndexByTick(\n ownerPosition.tickUpper,\n poolInfo.config.tickSpacing,\n );\n\n const { publicKey: tickArrayLower } = getPdaTickArrayAddress(programId, id, tickArrayLowerStartIndex);\n const { publicKey: tickArrayUpper } = getPdaTickArrayAddress(programId, id, tickArrayUpperStartIndex);\n\n const { publicKey: positionNftAccount } = nft2022\n ? getATAAddress(ownerInfo.wallet, ownerPosition.nftMint, TOKEN_2022_PROGRAM_ID)\n : getATAAddress(ownerInfo.wallet, ownerPosition.nftMint, TOKEN_PROGRAM_ID);\n\n const { publicKey: personalPosition } = getPdaPersonalPositionAddress(programId, ownerPosition.nftMint);\n const { publicKey: protocolPosition } = getPdaProtocolPositionAddress(\n programId,\n id,\n ownerPosition.tickLower,\n ownerPosition.tickUpper,\n );\n\n const ins = this.increasePositionFromLiquidityInstruction(\n programId,\n ownerInfo.wallet,\n positionNftAccount,\n personalPosition,\n id,\n protocolPosition,\n tickArrayLower,\n tickArrayUpper,\n ownerInfo.tokenAccountA,\n ownerInfo.tokenAccountB,\n new PublicKey(poolKeys.vault.A),\n new PublicKey(poolKeys.vault.B),\n new PublicKey(poolInfo.mintA.address),\n new PublicKey(poolInfo.mintB.address),\n\n liquidity,\n amountMaxA,\n amountMaxB,\n PoolUtils.isOverflowDefaultTickarrayBitmap(poolInfo.config.tickSpacing, [\n tickArrayLowerStartIndex,\n tickArrayUpperStartIndex,\n ])\n ? getPdaExBitmapAccount(programId, id).publicKey\n : undefined,\n );\n\n return {\n address: {\n tickArrayLower,\n tickArrayUpper,\n positionNftAccount,\n personalPosition,\n protocolPosition,\n },\n signers: [],\n instructions: [ins],\n instructionTypes: [InstructionType.ClmmIncreasePosition],\n lookupTableAddress: poolKeys.lookupTableAccount ? [poolKeys.lookupTableAccount] : [],\n };\n }\n\n static increasePositionFromBaseInstructions({\n poolInfo,\n poolKeys,\n ownerPosition,\n ownerInfo,\n base,\n baseAmount,\n otherAmountMax,\n nft2022,\n }: {\n poolInfo: ApiV3PoolInfoConcentratedItem;\n poolKeys: ClmmKeys;\n ownerPosition: ClmmPoolPersonalPosition;\n\n ownerInfo: {\n wallet: PublicKey;\n tokenAccountA: PublicKey;\n tokenAccountB: PublicKey;\n };\n\n base: \"MintA\" | \"MintB\";\n baseAmount: BN;\n\n otherAmountMax: BN;\n nft2022?: boolean;\n }): ReturnTypeMakeInstructions<ManipulateLiquidityExtInfo[\"address\"]> {\n const [programId, id] = [new PublicKey(poolInfo.programId), new PublicKey(poolInfo.id)];\n const tickArrayLowerStartIndex = TickUtils.getTickArrayStartIndexByTick(\n ownerPosition.tickLower,\n poolInfo.config.tickSpacing,\n );\n const tickArrayUpperStartIndex = TickUtils.getTickArrayStartIndexByTick(\n ownerPosition.tickUpper,\n poolInfo.config.tickSpacing,\n );\n\n const { publicKey: tickArrayLower } = getPdaTickArrayAddress(programId, id, tickArrayLowerStartIndex);\n const { publicKey: tickArrayUpper } = getPdaTickArrayAddress(programId, id, tickArrayUpperStartIndex);\n\n const { publicKey: positionNftAccount } = nft2022\n ? getATAAddress(ownerInfo.wallet, ownerPosition.nftMint, TOKEN_2022_PROGRAM_ID)\n : getATAAddress(ownerInfo.wallet, ownerPosition.nftMint, TOKEN_PROGRAM_ID);\n\n const { publicKey: personalPosition } = getPdaPersonalPositionAddress(programId, ownerPosition.nftMint);\n const { publicKey: protocolPosition } = getPdaProtocolPositionAddress(\n programId,\n id,\n ownerPosition.tickLower,\n ownerPosition.tickUpper,\n );\n\n return {\n address: {\n tickArrayLower,\n tickArrayUpper,\n positionNftAccount,\n personalPosition,\n protocolPosition,\n },\n instructions: [\n this.increasePositionFromBaseInstruction(\n programId,\n ownerInfo.wallet,\n positionNftAccount,\n personalPosition,\n id,\n protocolPosition,\n tickArrayLower,\n tickArrayUpper,\n ownerInfo.tokenAccountA,\n ownerInfo.tokenAccountB,\n new PublicKey(poolKeys.vault.A),\n new PublicKey(poolKeys.vault.B),\n new PublicKey(poolInfo.mintA.address),\n new PublicKey(poolInfo.mintB.address),\n\n base,\n baseAmount,\n\n otherAmountMax,\n PoolUtils.isOverflowDefaultTickarrayBitmap(poolInfo.config.tickSpacing, [\n tickArrayLowerStartIndex,\n tickArrayUpperStartIndex,\n ])\n ? getPdaExBitmapAccount(programId, id).publicKey\n : undefined,\n ),\n ],\n signers: [],\n instructionTypes: [InstructionType.ClmmIncreasePosition],\n lookupTableAddress: poolKeys.lookupTableAccount ? [poolKeys.lookupTableAccount] : [],\n };\n }\n\n static increasePositionFromBaseInstruction(\n programId: PublicKey,\n positionNftOwner: PublicKey,\n positionNftAccount: PublicKey,\n personalPosition: PublicKey,\n\n poolId: PublicKey,\n protocolPosition: PublicKey,\n tickArrayLower: PublicKey,\n tickArrayUpper: PublicKey,\n ownerTokenAccountA: PublicKey,\n ownerTokenAccountB: PublicKey,\n mintVaultA: PublicKey,\n mintVaultB: PublicKey,\n mintMintA: PublicKey,\n mintMintB: PublicKey,\n\n base: \"MintA\" | \"MintB\",\n baseAmount: BN,\n\n otherAmountMax: BN,\n\n exTickArrayBitmap?: PublicKey,\n ): TransactionInstruction {\n const dataLayout = struct([\n u128(\"liquidity\"),\n u64(\"amountMaxA\"),\n u64(\"amountMaxB\"),\n u8(\"optionBaseFlag\"),\n bool(\"baseFlag\"),\n ]);\n\n const remainingAccounts = [\n ...(exTickArrayBitmap ? [{ pubkey: exTickArrayBitmap, isSigner: false, isWritable: true }] : []),\n ];\n\n const keys = [\n { pubkey: positionNftOwner, isSigner: true, isWritable: false },\n { pubkey: positionNftAccount, isSigner: false, isWritable: false },\n { pubkey: poolId, isSigner: false, isWritable: true },\n { pubkey: protocolPosition, isSigner: false, isWritable: true },\n { pubkey: personalPosition, isSigner: false, isWritable: true },\n { pubkey: tickArrayLower, isSigner: false, isWritable: true },\n { pubkey: tickArrayUpper, isSigner: false, isWritable: true },\n { pubkey: ownerTokenAccountA, isSigner: false, isWritable: true },\n { pubkey: ownerTokenAccountB, isSigner: false, isWritable: true },\n { pubkey: mintVaultA, isSigner: false, isWritable: true },\n { pubkey: mintVaultB, isSigner: false, isWritable: true },\n\n { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },\n { pubkey: TOKEN_2022_PROGRAM_ID, isSigner: false, isWritable: false },\n\n { pubkey: mintMintA, isSigner: false, isWritable: false },\n { pubkey: mintMintB, isSigner: false, isWritable: false },\n\n ...remainingAccounts,\n ];\n\n const data = Buffer.alloc(dataLayout.span);\n dataLayout.encode(\n {\n liquidity: new BN(0),\n amountMaxA: base === \"MintA\" ? baseAmount : otherAmountMax,\n amountMaxB: base === \"MintA\" ? otherAmountMax : baseAmount,\n baseFlag: base === \"MintA\",\n optionBaseFlag: 1,\n },\n data,\n );\n\n const aData = Buffer.from([...anchorDataBuf.increaseLiquidity, ...data]);\n\n return new TransactionInstruction({\n keys,\n programId,\n data: aData,\n });\n }\n\n static decreaseLiquidityInstruction(\n programId: PublicKey,\n positionNftOwner: PublicKey,\n positionNftAccount: PublicKey,\n personalPosition: PublicKey,\n\n poolId: PublicKey,\n protocolPosition: PublicKey,\n tickArrayLower: PublicKey,\n tickArrayUpper: PublicKey,\n ownerTokenAccountA: PublicKey,\n ownerTokenAccountB: PublicKey,\n mintVaultA: PublicKey,\n mintVaultB: PublicKey,\n mintMintA: PublicKey,\n mintMintB: PublicKey,\n rewardAccounts: {\n poolRewardVault: PublicKey;\n ownerRewardVault: PublicKey;\n rewardMint: PublicKey;\n }[],\n\n liquidity: BN,\n amountMinA: BN,\n amountMinB: BN,\n\n exTickArrayBitmap?: PublicKey,\n ): TransactionInstruction {\n const dataLayout = struct([u128(\"liquidity\"), u64(\"amountMinA\"), u64(\"amountMinB\")]);\n\n const remainingAccounts = [\n ...(exTickArrayBitmap ? [{ pubkey: exTickArrayBitmap, isSigner: false, isWritable: true }] : []),\n ...rewardAccounts\n .map((i) => [\n { pubkey: i.poolRewardVault, isSigner: false, isWritable: true },\n { pubkey: i.ownerRewardVault, isSigner: false, isWritable: true },\n { pubkey: i.rewardMint, isSigner: false, isWritable: false },\n ])\n .flat(),\n ];\n\n const keys = [\n { pubkey: positionNftOwner, isSigner: true, isWritable: false },\n { pubkey: positionNftAccount, isSigner: false, isWritable: false },\n { pubkey: personalPosition, isSigner: false, isWritable: true },\n { pubkey: poolId, isSigner: false, isWritable: true },\n { pubkey: protocolPosition, isSigner: false, isWritable: true },\n { pubkey: mintVaultA, isSigner: false, isWritable: true },\n { pubkey: mintVaultB, isSigner: false, isWritable: true },\n { pubkey: tickArrayLower, isSigner: false, isWritable: true },\n { pubkey: tickArrayUpper, isSigner: false, isWritable: true },\n\n { pubkey: ownerTokenAccountA, isSigner: false, isWritable: true },\n { pubkey: ownerTokenAccountB, isSigner: false, isWritable: true },\n\n { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },\n { pubkey: TOKEN_2022_PROGRAM_ID, isSigner: false, isWritable: false },\n { pubkey: MEMO_PROGRAM_ID, isSigner: false, isWritable: false },\n\n { pubkey: mintMintA, isSigner: false, isWritable: false },\n { pubkey: mintMintB, isSigner: false, isWritable: false },\n\n ...remainingAccounts,\n ];\n\n const data = Buffer.alloc(dataLayout.span);\n dataLayout.encode(\n {\n liquidity,\n amountMinA,\n amountMinB,\n },\n data,\n );\n\n const aData = Buffer.from([...anchorDataBuf.decreaseLiquidity, ...data]);\n\n return new TransactionInstruction({\n keys,\n programId,\n data: aData,\n });\n }\n\n static decreaseLiquidityInstructions({\n poolInfo,\n poolKeys,\n ownerPosition,\n ownerInfo,\n liquidity,\n amountMinA,\n amountMinB,\n programId,\n nft2022,\n }: {\n poolInfo: ApiV3PoolInfoConcentratedItem;\n poolKeys: ClmmKeys;\n ownerPosition: ClmmPositionLayout;\n ownerInfo: {\n wallet: PublicKey;\n tokenAccountA: PublicKey;\n tokenAccountB: PublicKey;\n rewardAccounts: PublicKey[];\n };\n\n liquidity: BN;\n amountMinA: BN;\n amountMinB: BN;\n programId?: PublicKey;\n nft2022?: boolean;\n }): ReturnTypeMakeInstructions<ManipulateLiquidityExtInfo[\"address\"]> {\n const [poolProgramId, id] = [new PublicKey(poolInfo.programId), new PublicKey(poolInfo.id)];\n const tickArrayLowerStartIndex = TickUtils.getTickArrayStartIndexByTick(\n ownerPosition.tickLower,\n poolInfo.config.tickSpacing,\n );\n const tickArrayUpperStartIndex = TickUtils.getTickArrayStartIndexByTick(\n ownerPosition.tickUpper,\n poolInfo.config.tickSpacing,\n );\n\n const { publicKey: tickArrayLower } = getPdaTickArrayAddress(poolProgramId, id, tickArrayLowerStartIndex);\n const { publicKey: tickArrayUpper } = getPdaTickArrayAddress(poolProgramId, id, tickArrayUpperStartIndex);\n const { publicKey: positionNftAccount } = nft2022\n ? getATAAddress(ownerInfo.wallet, ownerPosition.nftMint, TOKEN_2022_PROGRAM_ID)\n : getATAAddress(ownerInfo.wallet, ownerPosition.nftMint, programId);\n const { publicKey: personalPosition } = getPdaPersonalPositionAddress(poolProgramId, ownerPosition.nftMint);\n const { publicKey: protocolPosition } = getPdaProtocolPositionAddress(\n poolProgramId,\n id,\n ownerPosition.tickLower,\n ownerPosition.tickUpper,\n );\n\n const rewardAccounts: {\n poolRewardVault: PublicKey;\n ownerRewardVault: PublicKey;\n rewardMint: PublicKey;\n }[] = [];\n for (let i = 0; i < poolInfo.rewardDefaultInfos.length; i++) {\n rewardAccounts.push({\n poolRewardVault: new PublicKey(poolKeys.rewardInfos[i].vault),\n ownerRewardVault: ownerInfo.rewardAccounts[i],\n rewardMint: new PublicKey(poolInfo.rewardDefaultInfos[i].mint.address),\n });\n }\n\n const ins: TransactionInstruction[] = [];\n const decreaseIns = this.decreaseLiquidityInstruction(\n poolProgramId,\n ownerInfo.wallet,\n positionNftAccount,\n personalPosition,\n id,\n protocolPosition,\n tickArrayLower,\n tickArrayUpper,\n ownerInfo.tokenAccountA,\n ownerInfo.tokenAccountB,\n new PublicKey(poolKeys.vault.A),\n new PublicKey(poolKeys.vault.B),\n new PublicKey(poolInfo.mintA.address),\n new PublicKey(poolInfo.mintB.address),\n rewardAccounts,\n\n liquidity,\n amountMinA,\n amountMinB,\n PoolUtils.isOverflowDefaultTickarrayBitmap(poolInfo.config.tickSpacing, [\n tickArrayLowerStartIndex,\n tickArrayUpperStartIndex,\n ])\n ? getPdaExBitmapAccount(poolProgramId, id).publicKey\n : undefined,\n );\n ins.push(decreaseIns);\n\n return {\n address: {\n tickArrayLower,\n tickArrayUpper,\n positionNftAccount,\n personalPosition,\n protocolPosition,\n },\n signers: [],\n instructions: ins,\n instructionTypes: [InstructionType.ClmmDecreasePosition],\n lookupTableAddress: poolKeys.lookupTableAccount ? [poolKeys.lookupTableAccount] : [],\n };\n }\n\n static swapInstruction(\n programId: PublicKey,\n payer: PublicKey,\n poolId: PublicKey,\n ammConfigId: PublicKey,\n inputTokenAccount: PublicKey,\n outputTokenAccount: PublicKey,\n inputVault: PublicKey,\n outputVault: PublicKey,\n inputMint: PublicKey,\n outputMint: PublicKey,\n tickArray: PublicKey[],\n observationId: PublicKey,\n\n amount: BN,\n otherAmountThreshold: BN,\n sqrtPriceLimitX64: BN,\n isBaseInput: boolean,\n\n exTickArrayBitmap?: PublicKey,\n ): TransactionInstruction {\n const dataLayout = struct([\n u64(\"amount\"),\n u64(\"otherAmountThreshold\"),\n u128(\"sqrtPriceLimitX64\"),\n bool(\"isBaseInput\"),\n ]);\n\n const remainingAccounts = [\n ...(exTickArrayBitmap ? [{ pubkey: exTickArrayBitmap, isSigner: false, isWritable: true }] : []),\n ...tickArray.map((i) => ({ pubkey: i, isSigner: false, isWritable: true })),\n ];\n\n const keys = [\n { pubkey: payer, isSigner: true, isWritable: false },\n { pubkey: ammConfigId, isSigner: false, isWritable: false },\n\n { pubkey: poolId, isSigner: false, isWritable: true },\n { pubkey: inputTokenAccount, isSigner: false, isWritable: true },\n { pubkey: outputTokenAccount, isSigner: false, isWritable: true },\n { pubkey: inputVault, isSigner: false, isWritable: true },\n { pubkey: outputVault, isSigner: false, isWritable: true },\n\n { pubkey: observationId, isSigner: false, isWritable: true },\n\n { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },\n { pubkey: TOKEN_2022_PROGRAM_ID, isSigner: false, isWritable: false },\n { pubkey: MEMO_PROGRAM_ID, isSigner: false, isWritable: false },\n\n { pubkey: inputMint, isSigner: false, isWritable: false },\n { pubkey: outputMint, isSigner: false, isWritable: false },\n\n ...remainingAccounts,\n ];\n\n const data = Buffer.alloc(dataLayout.span);\n dataLayout.encode(\n {\n amount,\n otherAmountThreshold,\n sqrtPriceLimitX64,\n isBaseInput,\n },\n data,\n );\n\n const aData = Buffer.from([...anchorDataBuf.swap, ...data]);\n\n return new TransactionInstruction({\n keys,\n programId,\n data: aData,\n });\n }\n\n static makeSwapBaseInInstructions({\n poolInfo,\n poolKeys,\n observationId,\n ownerInfo,\n inputMint,\n amountIn,\n amountOutMin,\n sqrtPriceLimitX64,\n remainingAccounts,\n }: {\n poolInfo: Pick<ApiV3PoolInfoConcentratedItem, \"id\" | \"programId\" | \"mintA\" | \"mintB\" | \"config\">;\n poolKeys: ClmmKeys;\n observationId: PublicKey;\n ownerInfo: {\n wallet: PublicKey;\n tokenAccountA: PublicKey;\n tokenAccountB: PublicKey;\n };\n\n inputMint: PublicKey;\n\n amountIn: BN;\n amountOutMin: BN;\n sqrtPriceLimitX64: BN;\n\n remainingAccounts: PublicKey[];\n }): ReturnTypeMakeInstructions {\n const [programId, id] = [new PublicKey(poolInfo.programId), new PublicKey(poolInfo.id)];\n const [mintAVault, mintBVault] = [new PublicKey(poolKeys.vault.A), new PublicKey(poolKeys.vault.B)];\n const [mintA, mintB] = [new PublicKey(poolInfo.mintA.address), new PublicKey(poolInfo.mintB.address)];\n\n const isInputMintA = poolInfo.mintA.address === inputMint.toString();\n\n const ins = [\n this.swapInstruction(\n programId,\n ownerInfo.wallet,\n\n id,\n new PublicKey(poolInfo.config.id),\n\n isInputMintA ? ownerInfo.tokenAccountA : ownerInfo.tokenAccountB,\n isInputMintA ? ownerInfo.tokenAccountB : ownerInfo.tokenAccountA,\n\n isInputMintA ? mintAVault : mintBVault,\n isInputMintA ? mintBVault : mintAVault,\n\n isInputMintA ? mintA : mintB,\n isInputMintA ? mintB : mintA,\n\n remainingAccounts,\n observationId,\n amountIn,\n amountOutMin,\n sqrtPriceLimitX64,\n true,\n getPdaExBitmapAccount(programId, id).publicKey,\n ),\n ];\n return {\n signers: [],\n instructions: ins,\n instructionTypes: [InstructionType.ClmmSwapBaseIn],\n lookupTableAddress: poolKeys.lookupTableAccount ? [poolKeys.lookupTableAccount] : [],\n address: {},\n };\n }\n\n static makeSwapBaseOutInstructions({\n poolInfo,\n poolKeys,\n observationId,\n ownerInfo,\n outputMint,\n amountOut,\n amountInMax,\n sqrtPriceLimitX64,\n remainingAccounts,\n }: {\n poolInfo: Pick<ApiV3PoolInfoConcentratedItem, \"id\" | \"programId\" | \"mintA\" | \"mintB\" | \"config\">;\n poolKeys: ClmmKeys;\n observationId: PublicKey;\n\n ownerInfo: {\n wallet: PublicKey;\n tokenAccountA: PublicKey;\n tokenAccountB: PublicKey;\n };\n\n outputMint: PublicKey;\n\n amountOut: BN;\n amountInMax: BN;\n sqrtPriceLimitX64: BN;\n\n remainingAccounts: PublicKey[];\n }): ReturnTypeMakeInstructions {\n const [programId, id] = [new PublicKey(poolInfo.programId), new PublicKey(poolInfo.id)];\n const [mintAVault, mintBVault] = [new PublicKey(poolKeys.vault.A), new PublicKey(poolKeys.vault.B)];\n const [mintA, mintB] = [new PublicKey(poolInfo.mintA.address), new PublicKey(poolInfo.mintB.address)];\n const isInputMintA = poolInfo.mintA.address === outputMint.toBase58();\n const ins = [\n this.swapInstruction(\n programId,\n ownerInfo.wallet,\n\n id,\n new PublicKey(poolInfo.config.id),\n\n isInputMintA ? ownerInfo.tokenAccountB : ownerInfo.tokenAccountA,\n isInputMintA ? ownerInfo.tokenAccountA : ownerInfo.tokenAccountB,\n\n isInputMintA ? mintBVault : mintAVault,\n isInputMintA ? mintAVault : mintBVault,\n\n isInputMintA ? mintB : mintA,\n isInputMintA ? mintA : mintB,\n\n remainingAccounts,\n observationId,\n amountOut,\n amountInMax,\n sqrtPriceLimitX64,\n false,\n getPdaExBitmapAccount(programId, id).publicKey,\n ),\n ];\n return {\n signers: [],\n instructions: ins,\n instructionTypes: [InstructionType.ClmmSwapBaseOut],\n lookupTableAddress: poolKeys.lookupTableAccount ? [poolKeys.lookupTableAccount] : [],\n address: {},\n };\n }\n\n static initRewardInstruction(\n programId: PublicKey,\n payer: PublicKey,\n poolId: PublicKey,\n operationId: PublicKey,\n ammConfigId: PublicKey,\n\n ownerTokenAccount: PublicKey,\n rewardProgramId: PublicKey,\n rewardMint: PublicKey,\n rewardVault: PublicKey,\n\n openTime: number,\n endTime: number,\n emissionsPerSecondX64: BN,\n ): TransactionInstruction {\n const dataLayout = struct([u64(\"openTime\"), u64(\"endTime\"), u128(\"emissionsPerSecondX64\")]);\n\n const keys = [\n { pubkey: payer, isSigner: true, isWritable: true },\n { pubkey: ownerTokenAccount, isSigner: false, isWritable: true },\n { pubkey: ammConfigId, isSigner: false, isWritable: false },\n\n { pubkey: poolId, isSigner: false, isWritable: true },\n { pubkey: operationId, isSigner: false, isWritable: true },\n { pubkey: rewardMint, isSigner: false, isWritable: false },\n { pubkey: rewardVault, isSigner: false, isWritable: true },\n\n { pubkey: rewardProgramId, isSigner: false, isWritable: false },\n { pubkey: SystemProgram.programId, isSigner: false, isWritable: false },\n { pubkey: RENT_PROGRAM_ID, isSigner: false, isWritable: false },\n ];\n\n const data = Buffer.alloc(dataLayout.span);\n dataLayout.encode(\n {\n openTime: parseBigNumberish(openTime),\n endTime: parseBigNumberish(endTime),\n emissionsPerSecondX64,\n },\n data,\n );\n\n const aData = Buffer.from([...anchorDataBuf.initReward, ...data]);\n\n return new TransactionInstruction({\n keys,\n programId,\n data: aData,\n });\n }\n\n static initRewardInstructions({\n poolInfo,\n poolKeys,\n ownerInfo,\n rewardInfo,\n }: {\n poolInfo: ApiV3PoolInfoConcentratedItem;\n poolKeys: ClmmKeys;\n ownerInfo: {\n wallet: PublicKey;\n tokenAccount: PublicKey;\n };\n rewardInfo: {\n programId: PublicKey;\n mint: PublicKey;\n openTime: number;\n endTime: number;\n emissionsPerSecondX64: BN;\n };\n }): ReturnTypeMakeInstructions<InitRewardExtInfo[\"address\"]> {\n const [programId, id] = [new PublicKey(poolInfo.programId), new PublicKey(poolInfo.id)];\n const poolRewardVault = getPdaPoolRewardVaulId(programId, id, rewardInfo.mint).publicKey;\n const operationId = getPdaOperationAccount(programId).publicKey;\n const ins = [\n this.initRewardInstruction(\n programId,\n ownerInfo.wallet,\n id,\n operationId,\n new PublicKey(poolInfo.config.id),\n\n ownerInfo.tokenAccount,\n rewardInfo.programId,\n rewardInfo.mint,\n poolRewardVault,\n\n rewardInfo.openTime,\n rewardInfo.endTime,\n rewardInfo.emissionsPerSecondX64,\n ),\n ];\n return {\n address: { poolRewardVault, operationId },\n signers: [],\n instructions: ins,\n instructionTypes: [InstructionType.ClmmInitReward],\n lookupTableAddress: poolKeys.lookupTableAccount ? [poolKeys.lookupTableAccount] : [],\n };\n }\n\n static setRewardInstruction(\n programId: PublicKey,\n payer: PublicKey,\n poolId: PublicKey,\n operationId: PublicKey,\n ammConfigId: PublicKey,\n\n ownerTokenAccount: PublicKey,\n rewardVault: PublicKey,\n rewardMint: PublicKey,\n\n rewardIndex: number,\n openTime: number,\n endTime: number,\n emissionsPerSecondX64: BN,\n ): TransactionInstruction {\n const dataLayout = struct([u8(\"rewardIndex\"), u128(\"emissionsPerSecondX64\"), u64(\"openTime\"), u64(\"endTime\")]);\n\n const keys = [\n { pubkey: payer, isSigner: true, isWritable: true },\n { pubkey: ammConfigId, isSigner: false, isWritable: false },\n { pubkey: poolId, isSigner: false, isWritable: true },\n { pubkey: operationId, isSigner: false, isWritable: true },\n\n { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },\n { pubkey: TOKEN_2022_PROGRAM_ID, isSigner: false, isWritable: false },\n\n { pubkey: rewardVault, isSigner: false, isWritable: true },\n { pubkey: ownerTokenAccount, isSigner: false, isWritable: true },\n { pubkey: rewardMint, isSigner: false, isWritable: true },\n ];\n\n const data = Buffer.alloc(dataLayout.span);\n dataLayout.encode(\n {\n rewardIndex,\n emissionsPerSecondX64,\n openTime: parseBigNumberish(openTime),\n endTime: parseBigNumberish(endTime),\n },\n data,\n );\n\n const aData = Buffer.from([...anchorDataBuf.setRewardEmissions, ...data]);\n\n return new TransactionInstruction({\n keys,\n programId,\n data: aData,\n });\n }\n\n static setRewardInstructions({\n poolInfo,\n poolKeys,\n ownerInfo,\n rewardInfo,\n }: {\n poolInfo: ApiV3PoolInfoConcentratedItem;\n poolKeys: ClmmKeys;\n ownerInfo: {\n wallet: PublicKey;\n tokenAccount: PublicKey;\n };\n rewardInfo: {\n mint: PublicKey;\n openTime: number;\n endTime: number;\n emissionsPerSecondX64: BN;\n };\n }): ReturnTypeMakeInstructions {\n const [programId, id] = [new PublicKey(poolInfo.programId), new PublicKey(poolInfo.id)];\n\n let rewardIndex: number | undefined;\n let rewardVault: PublicKey | undefined;\n let rewardMint: PublicKey | undefined;\n for (let index = 0; index < poolInfo.rewardDefaultInfos.length; index++)\n if (poolInfo.rewardDefaultInfos[index].mint.address === rewardInfo.mint.toString()) {\n rewardIndex = index;\n rewardVault = new PublicKey(poolKeys.rewardInfos[index].vault);\n rewardMint = new PublicKey(poolKeys.rewardInfos[index].mint.address);\n }\n\n if (rewardIndex === undefined || rewardVault === undefined)\n logger.logWithError(\"reward mint check error\", \"no reward mint\", poolInfo.rewardDefaultInfos);\n\n const operationId = getPdaOperationAccount(programId).publicKey;\n\n const ins = [\n this.setRewardInstruction(\n programId,\n ownerInfo.wallet,\n id,\n operationId,\n new PublicKey(poolInfo.config.id),\n\n ownerInfo.tokenAccount,\n rewardVault!,\n rewardMint!,\n\n rewardIndex!,\n rewardInfo.openTime,\n rewardInfo.endTime,\n rewardInfo.emissionsPerSecondX64,\n ),\n ];\n return {\n address: { rewardVault: rewardVault!, operationId },\n signers: [],\n instructions: ins,\n instructionTypes: [InstructionType.ClmmSetReward],\n lookupTableAddress: poolKeys.lookupTableAccount ? [poolKeys.lookupTableAccount] : [],\n };\n }\n\n static collectRewardInstruction(\n programId: PublicKey,\n payer: PublicKey,\n poolId: PublicKey,\n\n ownerTokenAccount: PublicKey,\n rewardVault: PublicKey,\n rewardMint: PublicKey,\n\n rewardIndex: number,\n ): TransactionInstruction {\n const dataLayout = struct([u8(\"rewardIndex\")]);\n\n const keys = [\n { pubkey: payer, isSigner: true, isWritable: true },\n { pubkey: ownerTokenAccount, isSigner: false, isWritable: true },\n { pubkey: poolId, isSigner: false, isWritable: true },\n { pubkey: rewardVault, isSigner: false, isWritable: true },\n { pubkey: rewardMint, isSigner: false, isWritable: false },\n { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },\n { pubkey: TOKEN_2022_PROGRAM_ID, isSigner: false, isWritable: false },\n { pubkey: MEMO_PROGRAM_ID, isSigner: false, isWritable: false },\n ];\n\n const data = Buffer.alloc(dataLayout.span);\n dataLayout.encode(\n {\n rewardIndex,\n },\n data,\n );\n\n const aData = Buffer.from([...anchorDataBuf.collectReward, ...data]);\n\n return new TransactionInstruction({\n keys,\n programId,\n data: aData,\n });\n }\n\n static collectRewardInstructions({\n poolInfo,\n poolKeys,\n ownerInfo,\n rewardMint,\n }: {\n poolInfo: ApiV3PoolInfoConcentratedItem;\n poolKeys: ClmmKeys;\n ownerInfo: {\n wallet: PublicKey;\n tokenAccount: PublicKey;\n };\n rewardMint: PublicKey;\n }): ReturnTypeMakeInstructions {\n const [programId, id] = [new PublicKey(poolInfo.programId), new PublicKey(poolInfo.id)];\n let rewardIndex: number | undefined;\n let rewardVault: PublicKey | undefined;\n for (let index = 0; index < poolInfo.rewardDefaultInfos.length; index++)\n if (poolInfo.rewardDefaultInfos[index].mint.address === rewardMint.toString()) {\n rewardIndex = index;\n rewardVault = new PublicKey(poolKeys.rewardInfos[index].vault);\n }\n\n if (rewardIndex === undefined || rewardVault === undefined)\n logger.logWithError(\"reward mint check error\", \"no reward mint\", poolInfo.rewardDefaultInfos);\n\n const ins = [\n this.collectRewardInstruction(\n programId,\n ownerInfo.wallet,\n id,\n\n ownerInfo.tokenAccount,\n rewardVault!,\n rewardMint,\n\n rewardIndex!,\n ),\n ];\n return {\n address: { rewardVault: rewardVault! },\n signers: [],\n instructions: ins,\n instructionTypes: [InstructionType.ClmmCollectReward],\n lookupTableAddress: poolKeys.lookupTableAccount ? [poolKeys.lookupTableAccount] : [],\n };\n }\n\n static async makeLockPositions({\n programId,\n authProgramId,\n poolProgramId,\n payer,\n wallet,\n nftMint,\n nft2022,\n getEphemeralSigners,\n }: {\n programId: PublicKey;\n authProgramId: PublicKey;\n poolProgramId: PublicKey;\n wallet: PublicKey;\n payer: PublicKey;\n nftMint: PublicKey;\n nft2022?: boolean;\n getEphemeralSigners?: (k: number) => any;\n }): Promise<ReturnTypeMakeInstructions<ClmmLockAddress>> {\n const signers: Signer[] = [];\n let lockNftMint: PublicKey;\n if (getEphemeralSigners) {\n lockNftMint = new PublicKey((await getEphemeralSigners(1))[0]);\n } else {\n const _k = Keypair.generate();\n signers.push(_k);\n lockNftMint = _k.publicKey;\n }\n\n const positionNftAccount = nft2022\n ? getATAAddress(wallet, nftMint, TOKEN_2022_PROGRAM_ID).publicKey\n : getATAAddress(wallet, nftMint, TOKEN_PROGRAM_ID).publicKey;\n const { publicKey: positionId } = getPdaPersonalPositionAddress(poolProgramId, nftMint);\n const lockPositionId = getPdaLockClPositionIdV2(programId, lockNftMint).publicKey;\n const lockNftAccount = getATAAddress(wallet, lockNftMint, TOKEN_PROGRAM_ID).publicKey;\n const metadataAccount = getPdaMetadataKey(lockNftMint).publicKey;\n\n const ins = ClmmInstrument.lockPositionInstructionV2({\n programId,\n auth: authProgramId,\n payer,\n positionOwner: wallet,\n lockOwner: wallet,\n positionNftAccount,\n positionId,\n lockPositionId,\n lockNftMint,\n lockNftAccount,\n metadataAccount,\n withMetadata: true,\n nft2022,\n\n positionNftMint: nftMint,\n authPositionNftAccount: getATAAddress(authProgramId, nftMint, nft2022 ? TOKEN_2022_PROGRAM_ID : TOKEN_PROGRAM_ID)\n .publicKey,\n positionNftProgram: nft2022 ? TOKEN_2022_PROGRAM_ID : TOKEN_PROGRAM_ID,\n });\n\n return {\n address: {\n positionId,\n lockPositionId,\n lockNftAccount,\n lockNftMint,\n positionNftAccount,\n metadataAccount,\n },\n instructions: [ins],\n signers,\n instructionTypes: [InstructionType.ClmmLockPosition],\n lookupTableAddress: [],\n };\n }\n\n static lockPositionInstructionV2({\n programId,\n auth,\n payer,\n positionOwner,\n lockOwner,\n positionNftAccount,\n positionId,\n positionNftMint,\n authPositionNftAccount,\n positionNftProgram,\n lockPositionId,\n lockNftMint,\n lockNftAccount,\n metadataAccount,\n withMetadata,\n }: {\n programId: PublicKey;\n auth: PublicKey;\n payer: PublicKey;\n positionOwner: PublicKey;\n lockOwner: PublicKey;\n positionNftAccount: PublicKey;\n positionId: PublicKey;\n positionNftMint: PublicKey;\n authPositionNftAccount: PublicKey;\n positionNftProgram: PublicKey;\n lockPositionId: PublicKey;\n lockNftMint: PublicKey;\n lockNftAccount: PublicKey;\n metadataAccount: PublicKey;\n withMetadata: boolean;\n nft2022?: boolean;\n }): TransactionInstruction {\n const keys = [\n { pubkey: auth, isSigner: false, isWritable: false },\n { pubkey: payer, isSigner: true, isWritable: true },\n { pubkey: positionOwner, isSigner: true, isWritable: true },\n { pubkey: lockOwner, isSigner: false, isWritable: false },\n { pubkey: positionNftAccount, isSigner: false, isWritable: true },\n { pubkey: positionId, isSigner: false, isWritable: false },\n { pubkey: positionNftMint, isSigner: false, isWritable: true },\n { pubkey: authPositionNftAccount, isSigner: false, isWritable: true },\n { pubkey: lockPositionId, isSigner: false, isWritable: true },\n { pubkey: lockNftMint, isSigner: true, isWritable: true },\n { pubkey: lockNftAccount, isSigner: false, isWritable: true },\n { pubkey: metadataAccount, isSigner: false, isWritable: true },\n { pubkey: METADATA_PROGRAM_ID, isSigner: false, isWritable: false },\n { pubkey: ASSOCIATED_TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },\n { pubkey: RENT_PROGRAM_ID, isSigner: false, isWritable: false },\n { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },\n { pubkey: positionNftProgram, isSigner: false, isWritable: false },\n { pubkey: SystemProgram.programId, isSigner: false, isWritable: false },\n ];\n const dataLayout = struct([bool(\"withMetadata\")]);\n const data = Buffer.alloc(dataLayout.span);\n dataLayout.encode(\n {\n withMetadata,\n },\n data,\n );\n const aData = Buffer.from([...lockInsDataBuf, ...data]);\n return new TransactionInstruction({\n keys,\n programId,\n data: aData,\n });\n }\n\n static lockPositionInstruction({\n programId,\n authProgramId,\n poolProgramId,\n owner,\n positionNft,\n }: {\n programId: PublicKey;\n authProgramId: PublicKey;\n poolProgramId: PublicKey;\n owner: PublicKey;\n positionNft: PublicKey;\n }): TransactionInstruction {\n const { publicKey: nftAccount } = getATAAddress(owner, positionNft, TOKEN_PROGRAM_ID);\n const { publicKey: positionId } = getPdaPersonalPositionAddress(poolProgramId, positionNft);\n\n const keys = [\n { pubkey: authProgramId, isSigner: false, isWritable: false },\n { pubkey: owner, isSigner: true, isWritable: false },\n { pubkey: nftAccount, isSigner: false, isWritable: true },\n { pubkey: positionId, isSigner: false, isWritable: false },\n { pubkey: getPdaLockPositionId(programId, positionId).publicKey, isSigner: false, isWritable: true },\n { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },\n { pubkey: SystemProgram.programId, isSigner: false, isWritable: false },\n ];\n return new TransactionInstruction({\n keys,\n programId,\n data: Buffer.from(lockInsDataBuf),\n });\n }\n\n static harvestLockPositionInstruction(props: {\n poolKeys: ClmmKeys;\n programId: PublicKey;\n authProgramId: PublicKey;\n ownerPosition: ClmmPositionLayout;\n owner: PublicKey;\n ownerRewardAccounts: PublicKey[];\n userVaultA: PublicKey;\n userVaultB: PublicKey;\n }): TransactionInstruction {\n const [poolProgramId, poolId] = [new PublicKey(props.poolKeys.programId), new PublicKey(props.poolKeys.id)];\n\n const tickArrayLowerStartIndex = TickUtils.getTickArrayStartIndexByTick(\n props.ownerPosition.tickLower,\n props.poolKeys.config.tickSpacing,\n );\n const tickArrayUpperStartIndex = TickUtils.getTickArrayStartIndexByTick(\n props.ownerPosition.tickUpper,\n props.poolKeys.config.tickSpacing,\n );\n const { publicKey: tickArrayLower } = getPdaTickArrayAddress(poolProgramId, poolId, tickArrayLowerStartIndex);\n const { publicKey: tickArrayUpper } = getPdaTickArrayAddress(poolProgramId, poolId, tickArrayUpperStartIndex);\n const { publicKey: nftAccount } = getATAAddress(props.owner, props.ownerPosition.nftMint, TOKEN_PROGRAM_ID);\n const { publicKey: positionId } = getPdaPersonalPositionAddress(poolProgramId, props.ownerPosition.nftMint);\n const { publicKey: protocolPosition } = getPdaProtocolPositionAddress(\n poolProgramId,\n poolId,\n props.ownerPosition.tickLower,\n props.ownerPosition.tickUpper,\n );\n\n const rewardAccounts: {\n poolRewardVault: PublicKey;\n ownerRewardVault: PublicKey;\n rewardMint: PublicKey;\n }[] = [];\n\n for (let i = 0; i < props.poolKeys.rewardInfos.length; i++) {\n rewardAccounts.push({\n poolRewardVault: new PublicKey(props.poolKeys.rewardInfos[i].vault),\n ownerRewardVault: props.ownerRewardAccounts[i],\n rewardMint: new PublicKey(props.poolKeys.rewardInfos[i].mint.address),\n });\n }\n\n const remainingAccounts = [\n ...rewardAccounts\n .map((i) => [\n { pubkey: i.poolRewardVault, isSigner: false, isWritable: true },\n { pubkey: i.ownerRewardVault, isSigner: false, isWritable: true },\n { pubkey: i.rewardMint, isSigner: false, isWritable: false },\n ])\n .flat(),\n ];\n\n const keys = [\n { pubkey: props.authProgramId, isSigner: false, isWritable: false },\n { pubkey: getPdaLockPositionId(props.programId, positionId).publicKey, isSigner: false, isWritable: false },\n { pubkey: poolProgramId, isSigner: false, isWritable: false },\n { pubkey: props.owner, isSigner: true, isWritable: false },\n { pubkey: nftAccount, isSigner: false, isWritable: true },\n { pubkey: positionId, isSigner: false, isWritable: true },\n { pubkey: poolId, isSigner: false, isWritable: true },\n { pubkey: protocolPosition, isSigner: false, isWritable: true },\n { pubkey: new PublicKey(props.poolKeys.vault.A), isSigner: false, isWritable: true },\n { pubkey: new PublicKey(props.poolKeys.vault.B), isSigner: false, isWritable: true },\n { pubkey: tickArrayLower, isSigner: false, isWritable: true },\n { pubkey: tickArrayUpper, isSigner: false, isWritable: true },\n { pubkey: props.userVaultA, isSigner: false, isWritable: true },\n { pubkey: props.userVaultB, isSigner: false, isWritable: true },\n { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },\n { pubkey: TOKEN_2022_PROGRAM_ID, isSigner: false, isWritable: false },\n { pubkey: MEMO_PROGRAM_ID2, isSigner: false, isWritable: false },\n { pubkey: new PublicKey(props.poolKeys.mintA.address), isSigner: false, isWritable: false },\n { pubkey: new PublicKey(props.poolKeys.mintB.address), isSigner: false, isWritable: false },\n ...remainingAccounts,\n ];\n\n return new TransactionInstruction({\n keys,\n programId: props.programId,\n data: Buffer.from(lockHarvestInsDataBuf),\n });\n }\n\n static harvestLockPositionInstructionV2({\n programId,\n auth,\n lockPositionId,\n clmmProgram,\n lockOwner,\n lockNftMint,\n lockNftAccount,\n positionNftAccount,\n positionId,\n poolId,\n protocolPosition,\n vaultA,\n vaultB,\n tickArrayLower,\n tickArrayUpper,\n userVaultA,\n userVaultB,\n mintA,\n mintB,\n rewardAccounts,\n exTickArrayBitmap,\n }: {\n programId: PublicKey;\n auth: PublicKey;\n lockPositionId: PublicKey;\n clmmProgram: PublicKey;\n lockOwner: PublicKey;\n lockNftMint: PublicKey;\n lockNftAccount: PublicKey;\n positionNftAccount: PublicKey;\n positionId: PublicKey;\n poolId: PublicKey;\n protocolPosition: PublicKey;\n vaultA: PublicKey;\n vaultB: PublicKey;\n tickArrayLower: PublicKey;\n tickArrayUpper: PublicKey;\n userVaultA: PublicKey;\n userVaultB: PublicKey;\n mintA: PublicKey;\n mintB: PublicKey;\n rewardAccounts: {\n poolRewardVault: PublicKey;\n ownerRewardVault: PublicKey;\n rewardMint: PublicKey;\n }[];\n\n exTickArrayBitmap?: PublicKey;\n }): TransactionInstruction {\n const remainingAccounts = [\n ...(exTickArrayBitmap ? [{ pubkey: exTickArrayBitmap, isSigner: false, isWritable: true }] : []),\n ...rewardAccounts\n .map((i) => [\n { pubkey: i.poolRewardVault, isSigner: false, isWritable: true },\n { pubkey: i.ownerRewardVault, isSigner: false, isWritable: true },\n { pubkey: i.rewardMint, isSigner: false, isWritable: false },\n ])\n .flat(),\n ];\n\n const keys = [\n { pubkey: auth, isSigner: false, isWritable: false },\n { pubkey: lockOwner, isSigner: true, isWritable: false },\n // { pubkey: lockNftMint, isSigner: false, isWritable: false },\n { pubkey: lockNftAccount, isSigner: false, isWritable: true },\n { pubkey: lockPositionId, isSigner: false, isWritable: false },\n { pubkey: clmmProgram, isSigner: false, isWritable: false },\n { pubkey: positionNftAccount, isSigner: false, isWritable: true },\n { pubkey: positionId, isSigner: false, isWritable: true },\n { pubkey: poolId, isSigner: false, isWritable: true },\n { pubkey: protocolPosition, isSigner: false, isWritable: true },\n { pubkey: vaultA, isSigner: false, isWritable: true },\n { pubkey: vaultB, isSigner: false, isWritable: true },\n { pubkey: tickArrayLower, isSigner: false, isWritable: true },\n { pubkey: tickArrayUpper, isSigner: false, isWritable: true },\n { pubkey: userVaultA, isSigner: false, isWritable: true },\n { pubkey: userVaultB, isSigner: false, isWritable: true },\n { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },\n { pubkey: TOKEN_2022_PROGRAM_ID, isSigner: false, isWritable: false },\n { pubkey: MEMO_PROGRAM_ID2, isSigner: false, isWritable: false },\n { pubkey: mintA, isSigner: false, isWritable: false },\n { pubkey: mintB, isSigner: false, isWritable: false },\n ...remainingAccounts,\n ];\n\n return new TransactionInstruction({\n keys,\n programId,\n data: Buffer.from(lockHarvestInsDataBuf),\n });\n }\n}\n","import { PublicKey } from \"@solana/web3.js\";\nimport BN from \"bn.js\";\nimport Decimal from \"decimal.js\";\n\nimport { ApiV3PoolInfoConcentratedItem } from \"../../../api/type\";\nimport { ClmmPoolInfo, TickArrayBitmapExtensionType } from \"../type\";\nimport { MAX_TICK, MIN_TICK } from \"./constants\";\nimport { SqrtPriceMath, TickMath } from \"./math\";\nimport { getPdaTickArrayAddress } from \"./pda\";\nimport { TickQuery } from \"./tickQuery\";\n\nexport const TICK_ARRAY_SIZE = 60;\nexport const TICK_ARRAY_BITMAP_SIZE = 512;\n\nexport interface ReturnTypeGetTickPrice {\n tick: number;\n price: Decimal;\n tickSqrtPriceX64: BN;\n}\n\nexport interface ReturnTypeGetPriceAndTick {\n tick: number;\n price: Decimal;\n}\n\nexport type Tick = {\n tick: number;\n liquidityNet: BN;\n liquidityGross: BN;\n feeGrowthOutsideX64A: BN;\n feeGrowthOutsideX64B: BN;\n rewardGrowthsOutsideX64: BN[];\n};\n\nexport type TickArray = {\n address: PublicKey;\n poolId: PublicKey;\n startTickIndex: number;\n ticks: Tick[];\n initializedTickCount: number;\n};\n\nexport type TickState = {\n tick: number;\n liquidityNet: BN;\n liquidityGross: BN;\n feeGrowthOutsideX64A: BN;\n feeGrowthOutsideX64B: BN;\n tickCumulativeOutside: BN;\n secondsPerLiquidityOutsideX64: BN;\n secondsOutside: number;\n rewardGrowthsOutside: BN[];\n};\n\nexport type TickArrayState = {\n ammPool: PublicKey;\n startTickIndex: number;\n ticks: TickState[];\n initializedTickCount: number;\n};\n\nexport class TickUtils {\n public static getTickArrayAddressByTick(\n programId: PublicKey,\n poolId: PublicKey,\n tickIndex: number,\n tickSpacing: number,\n ): PublicKey {\n const startIndex = TickUtils.getTickArrayStartIndexByTick(tickIndex, tickSpacing);\n const { publicKey: tickArrayAddress } = getPdaTickArrayAddress(programId, poolId, startIndex);\n return tickArrayAddress;\n }\n\n public static getTickOffsetInArray(tickIndex: number, tickSpacing: number): number {\n if (tickIndex % tickSpacing != 0) {\n throw new Error(\"tickIndex % tickSpacing not equal 0\");\n }\n const startTickIndex = TickUtils.getTickArrayStartIndexByTick(tickIndex, tickSpacing);\n const offsetInArray = Math.floor((tickIndex - startTickIndex) / tickSpacing);\n if (offsetInArray < 0 || offsetInArray >= TICK_ARRAY_SIZE) {\n throw new Error(\"tick offset in array overflow\");\n }\n return offsetInArray;\n }\n\n public static getTickArrayBitIndex(tickIndex: number, tickSpacing: number): number {\n const ticksInArray = TickQuery.tickCount(tickSpacing);\n\n let startIndex: number = tickIndex / ticksInArray;\n if (tickIndex < 0 && tickIndex % ticksInArray != 0) {\n startIndex = Math.ceil(startIndex) - 1;\n } else {\n startIndex = Math.floor(startIndex);\n }\n return startIndex;\n }\n\n public static getTickArrayStartIndexByTick(tickIndex: number, tickSpacing: number): number {\n return this.getTickArrayBitIndex(tickIndex, tickSpacing) * TickQuery.tickCount(tickSpacing);\n }\n\n public static getTickArrayOffsetInBitmapByTick(tick: number, tickSpacing: number): number {\n const multiplier = tickSpacing * TICK_ARRAY_SIZE;\n const compressed = Math.floor(tick / multiplier) + 512;\n return Math.abs(compressed);\n }\n\n public static checkTickArrayIsInitialized(\n bitmap: BN,\n tick: number,\n tickSpacing: number,\n ): {\n isInitialized: boolean;\n startIndex: number;\n } {\n const multiplier = tickSpacing * TICK_ARRAY_SIZE;\n const compressed = Math.floor(tick / multiplier) + 512;\n const bitPos = Math.abs(compressed);\n return {\n isInitialized: bitmap.testn(bitPos),\n startIndex: (bitPos - 512) * multiplier,\n };\n }\n\n public static getNextTickArrayStartIndex(\n lastTickArrayStartIndex: number,\n tickSpacing: number,\n zeroForOne: boolean,\n ): number {\n return zeroForOne\n ? lastTickArrayStartIndex - tickSpacing * TICK_ARRAY_SIZE\n : lastTickArrayStartIndex + tickSpacing * TICK_ARRAY_SIZE;\n }\n\n public static mergeTickArrayBitmap(bns: BN[]): BN {\n let b = new BN(0);\n for (let i = 0; i < bns.length; i++) {\n b = b.add(bns[i].shln(64 * i));\n }\n return b;\n }\n\n public static getInitializedTickArrayInRange(\n tickArrayBitmap: BN[],\n exTickArrayBitmap: TickArrayBitmapExtensionType,\n tickSpacing: number,\n tickArrayStartIndex: number,\n expectedCount: number,\n ): number[] {\n const tickArrayOffset = Math.floor(tickArrayStartIndex / (tickSpacing * TICK_ARRAY_SIZE));\n return [\n // find right of currenct offset\n ...TickUtils.searchLowBitFromStart(\n tickArrayBitmap,\n exTickArrayBitmap,\n tickArrayOffset - 1,\n expectedCount,\n tickSpacing,\n ),\n\n // find left of current offset\n ...TickUtils.searchHightBitFromStart(\n tickArrayBitmap,\n exTickArrayBitmap,\n tickArrayOffset,\n expectedCount,\n tickSpacing,\n ),\n ];\n }\n\n public static getAllInitializedTickArrayStartIndex(\n tickArrayBitmap: BN[],\n exTickArrayBitmap: TickArrayBitmapExtensionType,\n tickSpacing: number,\n ): number[] {\n // find from offset 0 to 1024\n return TickUtils.searchHightBitFromStart(\n tickArrayBitmap,\n exTickArrayBitmap,\n 0,\n TICK_ARRAY_BITMAP_SIZE,\n tickSpacing,\n );\n }\n\n public static getAllInitializedTickArrayInfo(\n programId: PublicKey,\n poolId: PublicKey,\n tickArrayBitmap: BN[],\n exTickArrayBitmap: TickArrayBitmapExtensionType,\n tickSpacing: number,\n ): {\n tickArrayStartIndex: number;\n tickArrayAddress: PublicKey;\n }[] {\n const result: {\n tickArrayStartIndex: number;\n tickArrayAddress: PublicKey;\n }[] = [];\n const allInitializedTickArrayIndex: number[] = TickUtils.getAllInitializedTickArrayStartIndex(\n tickArrayBitmap,\n exTickArrayBitmap,\n tickSpacing,\n );\n for (const startIndex of allInitializedTickArrayIndex) {\n const { publicKey: address } = getPdaTickArrayAddress(programId, poolId, startIndex);\n result.push({\n tickArrayStartIndex: startIndex,\n tickArrayAddress: address,\n });\n }\n return result;\n }\n\n public static getAllInitializedTickInTickArray(tickArray: TickArrayState): TickState[] {\n return tickArray.ticks.filter((i) => i.liquidityGross.gtn(0));\n }\n\n public static searchLowBitFromStart(\n tickArrayBitmap: BN[],\n exTickArrayBitmap: TickArrayBitmapExtensionType,\n currentTickArrayBitStartIndex: number,\n expectedCount: number,\n tickSpacing: number,\n ): number[] {\n const tickArrayBitmaps = [\n ...[...exTickArrayBitmap.negativeTickArrayBitmap].reverse(),\n tickArrayBitmap.slice(0, 8),\n tickArrayBitmap.slice(8, 16),\n ...exTickArrayBitmap.positiveTickArrayBitmap,\n ].map((i) => TickUtils.mergeTickArrayBitmap(i));\n const result: number[] = [];\n while (currentTickArrayBitStartIndex >= -7680) {\n const arrayIndex = Math.floor((currentTickArrayBitStartIndex + 7680) / 512);\n const searchIndex = (currentTickArrayBitStartIndex + 7680) % 512;\n\n if (tickArrayBitmaps[arrayIndex].testn(searchIndex)) result.push(currentTickArrayBitStartIndex);\n\n currentTickArrayBitStartIndex--;\n if (result.length === expectedCount) break;\n }\n\n const tickCount = TickQuery.tickCount(tickSpacing);\n return result.map((i) => i * tickCount);\n }\n\n public static searchHightBitFromStart(\n tickArrayBitmap: BN[],\n exTickArrayBitmap: TickArrayBitmapExtensionType,\n currentTickArrayBitStartIndex: number,\n expectedCount: number,\n tickSpacing: number,\n ): number[] {\n const tickArrayBitmaps = [\n ...[...exTickArrayBitmap.negativeTickArrayBitmap].reverse(),\n tickArrayBitmap.slice(0, 8),\n tickArrayBitmap.slice(8, 16),\n ...exTickArrayBitmap.positiveTickArrayBitmap,\n ].map((i) => TickUtils.mergeTickArrayBitmap(i));\n const result: number[] = [];\n while (currentTickArrayBitStartIndex < 7680) {\n const arrayIndex = Math.floor((currentTickArrayBitStartIndex + 7680) / 512);\n const searchIndex = (currentTickArrayBitStartIndex + 7680) % 512;\n\n if (tickArrayBitmaps[arrayIndex].testn(searchIndex)) result.push(currentTickArrayBitStartIndex);\n\n currentTickArrayBitStartIndex++;\n if (result.length === expectedCount) break;\n }\n\n const tickCount = TickQuery.tickCount(tickSpacing);\n return result.map((i) => i * tickCount);\n }\n\n public static checkIsOutOfBoundary(tick: number): boolean {\n return tick < MIN_TICK || tick > MAX_TICK;\n }\n\n public static nextInitTick(\n tickArrayCurrent: TickArray,\n currentTickIndex: number,\n tickSpacing: number,\n zeroForOne: boolean,\n t: boolean,\n ): Tick | null {\n const currentTickArrayStartIndex = TickQuery.getArrayStartIndex(currentTickIndex, tickSpacing);\n if (currentTickArrayStartIndex != tickArrayCurrent.startTickIndex) {\n return null;\n }\n let offsetInArray = Math.floor((currentTickIndex - tickArrayCurrent.startTickIndex) / tickSpacing);\n\n if (zeroForOne) {\n while (offsetInArray >= 0) {\n if (tickArrayCurrent.ticks[offsetInArray].liquidityGross.gtn(0)) {\n return tickArrayCurrent.ticks[offsetInArray];\n }\n offsetInArray = offsetInArray - 1;\n }\n } else {\n if (!t) offsetInArray = offsetInArray + 1;\n while (offsetInArray < TICK_ARRAY_SIZE) {\n if (tickArrayCurrent.ticks[offsetInArray].liquidityGross.gtn(0)) {\n return tickArrayCurrent.ticks[offsetInArray];\n }\n offsetInArray = offsetInArray + 1;\n }\n }\n return null;\n }\n\n public static firstInitializedTick(tickArrayCurrent: TickArray, zeroForOne: boolean): Tick {\n if (zeroForOne) {\n let i = TICK_ARRAY_SIZE - 1;\n while (i >= 0) {\n if (tickArrayCurrent.ticks[i].liquidityGross.gtn(0)) {\n return tickArrayCurrent.ticks[i];\n }\n i = i - 1;\n }\n } else {\n let i = 0;\n while (i < TICK_ARRAY_SIZE) {\n if (tickArrayCurrent.ticks[i].liquidityGross.gtn(0)) {\n return tickArrayCurrent.ticks[i];\n }\n i = i + 1;\n }\n }\n\n throw Error(`firstInitializedTick check error: ${tickArrayCurrent} - ${zeroForOne}`);\n }\n\n public static _getTickPriceLegacy({\n poolInfo,\n tick,\n baseIn,\n }: {\n poolInfo: ClmmPoolInfo;\n tick: number;\n baseIn: boolean;\n }): ReturnTypeGetTickPrice {\n const tickSqrtPriceX64 = SqrtPriceMath.getSqrtPriceX64FromTick(tick);\n const tickPrice = SqrtPriceMath.sqrtPriceX64ToPrice(\n tickSqrtPriceX64,\n poolInfo.mintA.decimals,\n poolInfo.mintB.decimals,\n );\n\n return baseIn\n ? { tick, price: tickPrice, tickSqrtPriceX64 }\n : { tick, price: new Decimal(1).div(tickPrice), tickSqrtPriceX64 };\n }\n\n public static _getPriceAndTickLegacy({\n poolInfo,\n price,\n baseIn,\n }: {\n poolInfo: ClmmPoolInfo;\n price: Decimal;\n baseIn: boolean;\n }): ReturnTypeGetPriceAndTick {\n const _price = baseIn ? price : new Decimal(1).div(price);\n\n const tick = TickMath.getTickWithPriceAndTickspacing(\n _price,\n poolInfo.ammConfig.tickSpacing,\n poolInfo.mintA.decimals,\n poolInfo.mintB.decimals,\n );\n const tickSqrtPriceX64 = SqrtPriceMath.getSqrtPriceX64FromTick(tick);\n const tickPrice = SqrtPriceMath.sqrtPriceX64ToPrice(\n tickSqrtPriceX64,\n poolInfo.mintA.decimals,\n poolInfo.mintB.decimals,\n );\n\n return baseIn ? { tick, price: tickPrice } : { tick, price: new Decimal(1).div(tickPrice) };\n }\n\n public static getTickPrice({\n poolInfo,\n tick,\n baseIn,\n }: {\n poolInfo: ApiV3PoolInfoConcentratedItem;\n tick: number;\n baseIn: boolean;\n }): ReturnTypeGetTickPrice {\n const tickSqrtPriceX64 = SqrtPriceMath.getSqrtPriceX64FromTick(tick);\n const tickPrice = SqrtPriceMath.sqrtPriceX64ToPrice(\n tickSqrtPriceX64,\n poolInfo.mintA.decimals,\n poolInfo.mintB.decimals,\n );\n\n return baseIn\n ? { tick, price: tickPrice, tickSqrtPriceX64 }\n : { tick, price: new Decimal(1).div(tickPrice), tickSqrtPriceX64 };\n }\n\n public static getPriceAndTick({\n poolInfo,\n price,\n baseIn,\n }: {\n poolInfo: ApiV3PoolInfoConcentratedItem;\n price: Decimal;\n baseIn: boolean;\n }): ReturnTypeGetPriceAndTick {\n const _price = baseIn ? price : new Decimal(1).div(price);\n\n const tick = TickMath.getTickWithPriceAndTickspacing(\n _price,\n poolInfo.config.tickSpacing,\n poolInfo.mintA.decimals,\n poolInfo.mintB.decimals,\n );\n const tickSqrtPriceX64 = SqrtPriceMath.getSqrtPriceX64FromTick(tick);\n const tickPrice = SqrtPriceMath.sqrtPriceX64ToPrice(\n tickSqrtPriceX64,\n poolInfo.mintA.decimals,\n poolInfo.mintB.decimals,\n );\n\n return baseIn ? { tick, price: tickPrice } : { tick, price: new Decimal(1).div(tickPrice) };\n }\n}\n","import BN from \"bn.js\";\n\nexport const ZERO = new BN(0);\nexport const ONE = new BN(1);\nexport const NEGATIVE_ONE = new BN(-1);\n\nexport const Q64 = new BN(1).shln(64);\nexport const Q128 = new BN(1).shln(128);\n\nexport const MaxU64 = Q64.sub(ONE);\n\nexport const U64Resolution = 64;\n\nexport const MaxUint128 = Q128.subn(1);\n\nexport const MIN_TICK = -443636;\nexport const MAX_TICK = -MIN_TICK;\n\nexport const MIN_SQRT_PRICE_X64: BN = new BN(\"4295048016\");\nexport const MAX_SQRT_PRICE_X64: BN = new BN(\"79226673521066979257578248091\");\n\nexport const MIN_SQRT_PRICE_X64_ADD_ONE: BN = new BN(\"4295048017\");\nexport const MAX_SQRT_PRICE_X64_SUB_ONE: BN = new BN(\"79226673521066979257578248090\");\n\n// export const MIN_TICK_ARRAY_START_INDEX = -307200;\n// export const MAX_TICK_ARRAY_START_INDEX = 306600;\n\nexport const BIT_PRECISION = 16;\nexport const LOG_B_2_X32 = \"59543866431248\";\nexport const LOG_B_P_ERR_MARGIN_LOWER_X64 = \"184467440737095516\";\nexport const LOG_B_P_ERR_MARGIN_UPPER_X64 = \"15793534762490258745\";\n\nexport const FEE_RATE_DENOMINATOR = new BN(10).pow(new BN(6));\n\nexport enum Fee {\n rate_500 = 500, // 500 / 10e6 = 0.0005\n rate_3000 = 3000, // 3000/ 10e6 = 0.003\n rate_10000 = 10000, // 10000 /10e6 = 0.01\n}\nexport const TICK_SPACINGS: { [amount in Fee]: number } = {\n [Fee.rate_500]: 10,\n [Fee.rate_3000]: 60,\n [Fee.rate_10000]: 200,\n};\n\nexport const mockCreatePoolInfo = {\n version: 6,\n liquidity: ZERO,\n tickCurrent: 0,\n feeGrowthGlobalX64A: ZERO,\n feeGrowthGlobalX64B: ZERO,\n protocolFeesTokenA: ZERO,\n protocolFeesTokenB: ZERO,\n swapInAmountTokenA: ZERO,\n swapOutAmountTokenB: ZERO,\n swapInAmountTokenB: ZERO,\n swapOutAmountTokenA: ZERO,\n tickArrayBitmap: [],\n\n rewardInfos: [],\n\n day: {\n volume: 0,\n volumeFee: 0,\n feeA: 0,\n feeB: 0,\n feeApr: 0,\n rewardApr: { A: 0, B: 0, C: 0 },\n apr: 0,\n priceMax: 0,\n priceMin: 0,\n },\n week: {\n volume: 0,\n volumeFee: 0,\n feeA: 0,\n feeB: 0,\n feeApr: 0,\n rewardApr: { A: 0, B: 0, C: 0 },\n apr: 0,\n priceMax: 0,\n priceMin: 0,\n },\n month: {\n volume: 0,\n volumeFee: 0,\n feeA: 0,\n feeB: 0,\n feeApr: 0,\n rewardApr: { A: 0, B: 0, C: 0 },\n apr: 0,\n priceMax: 0,\n priceMin: 0,\n },\n tvl: 0,\n};\n\nexport const mockV3CreatePoolInfo = {\n tvl: 0,\n volumeQuote: 0,\n mintAmountA: 0,\n mintAmountB: 0,\n rewardDefaultInfos: [],\n farmUpcomingCount: 0,\n farmOngoingCount: 0,\n farmFinishedCount: 0,\n\n day: {\n volume: 0,\n volumeQuote: 0,\n volumeFee: 0,\n apr: 0,\n feeApr: 0,\n priceMin: 0,\n priceMax: 0,\n rewardApr: [0],\n },\n week: {\n volume: 0,\n volumeQuote: 0,\n volumeFee: 0,\n apr: 0,\n feeApr: 0,\n priceMin: 0,\n priceMax: 0,\n rewardApr: [0],\n },\n month: {\n volume: 0,\n volumeQuote: 0,\n volumeFee: 0,\n apr: 0,\n feeApr: 0,\n priceMin: 0,\n priceMax: 0,\n rewardApr: [0],\n },\n pooltype: [],\n};\n\nexport const U64_IGNORE_RANGE = new BN(\"18446744073700000000\");\n","import { EpochInfo, PublicKey } from \"@solana/web3.js\";\nimport BN from \"bn.js\";\nimport Decimal from \"decimal.js\";\n\nimport { ApiV3PoolInfoConcentratedItem } from \"../../../api/type\";\nimport { getTransferAmountFeeV2, minExpirationTime } from \"../../../common/transfer\";\nimport { ReturnTypeGetLiquidityAmountOut, TickArrayBitmapExtensionType } from \"../type\";\nimport {\n BIT_PRECISION,\n Fee,\n FEE_RATE_DENOMINATOR,\n LOG_B_2_X32,\n LOG_B_P_ERR_MARGIN_LOWER_X64,\n LOG_B_P_ERR_MARGIN_UPPER_X64,\n MAX_SQRT_PRICE_X64,\n MAX_TICK,\n MaxU64,\n MaxUint128,\n MIN_SQRT_PRICE_X64,\n MIN_TICK,\n NEGATIVE_ONE,\n ONE,\n Q128,\n Q64,\n U64Resolution,\n ZERO,\n} from \"./constants\";\nimport { getPdaTickArrayAddress } from \"./pda\";\nimport { PoolUtils } from \"./pool\";\nimport { Tick, TickArray, TickUtils } from \"./tick\";\nimport { TickQuery } from \"./tickQuery\";\n\nexport class MathUtil {\n public static mulDivRoundingUp(a: BN, b: BN, denominator: BN): BN {\n const numerator = a.mul(b);\n let result = numerator.div(denominator);\n if (!numerator.mod(denominator).eq(ZERO)) {\n result = result.add(ONE);\n }\n return result;\n }\n\n public static mulDivFloor(a: BN, b: BN, denominator: BN): BN {\n if (denominator.eq(ZERO)) {\n throw new Error(\"division by 0\");\n }\n return a.mul(b).div(denominator);\n }\n\n public static mulDivCeil(a: BN, b: BN, denominator: BN): BN {\n if (denominator.eq(ZERO)) {\n throw new Error(\"division by 0\");\n }\n const numerator = a.mul(b).add(denominator.sub(ONE));\n return numerator.div(denominator);\n }\n\n public static x64ToDecimal(num: BN, decimalPlaces?: number): Decimal {\n return new Decimal(num.toString()).div(Decimal.pow(2, 64)).toDecimalPlaces(decimalPlaces);\n }\n\n public static decimalToX64(num: Decimal): BN {\n return new BN(num.mul(Decimal.pow(2, 64)).floor().toFixed());\n }\n\n public static wrappingSubU128(n0: BN, n1: BN): BN {\n return n0.add(Q128).sub(n1).mod(Q128);\n }\n}\n\n// sqrt price math\nfunction mulRightShift(val: BN, mulBy: BN): BN {\n return signedRightShift(val.mul(mulBy), 64, 256);\n}\n\nfunction signedLeftShift(n0: BN, shiftBy: number, bitWidth: number): BN {\n const twosN0 = n0.toTwos(bitWidth).shln(shiftBy);\n twosN0.imaskn(bitWidth + 1);\n return twosN0.fromTwos(bitWidth);\n}\n\nfunction signedRightShift(n0: BN, shiftBy: number, bitWidth: number): BN {\n const twoN0 = n0.toTwos(bitWidth).shrn(shiftBy);\n twoN0.imaskn(bitWidth - shiftBy + 1);\n return twoN0.fromTwos(bitWidth - shiftBy);\n}\n\nexport class SqrtPriceMath {\n public static sqrtPriceX64ToPrice(sqrtPriceX64: BN, decimalsA: number, decimalsB: number): Decimal {\n return MathUtil.x64ToDecimal(sqrtPriceX64)\n .pow(2)\n .mul(Decimal.pow(10, decimalsA - decimalsB));\n }\n\n public static priceToSqrtPriceX64(price: Decimal, decimalsA: number, decimalsB: number): BN {\n return MathUtil.decimalToX64(price.mul(Decimal.pow(10, decimalsB - decimalsA)).sqrt());\n }\n\n public static getNextSqrtPriceX64FromInput(sqrtPriceX64: BN, liquidity: BN, amountIn: BN, zeroForOne: boolean): BN {\n if (!sqrtPriceX64.gt(ZERO)) {\n throw new Error(\"sqrtPriceX64 must greater than 0\");\n }\n if (!liquidity.gt(ZERO)) {\n throw new Error(\"liquidity must greater than 0\");\n }\n\n return zeroForOne\n ? this.getNextSqrtPriceFromTokenAmountARoundingUp(sqrtPriceX64, liquidity, amountIn, true)\n : this.getNextSqrtPriceFromTokenAmountBRoundingDown(sqrtPriceX64, liquidity, amountIn, true);\n }\n\n public static getNextSqrtPriceX64FromOutput(sqrtPriceX64: BN, liquidity: BN, amountOut: BN, zeroForOne: boolean): BN {\n if (!sqrtPriceX64.gt(ZERO)) {\n throw new Error(\"sqrtPriceX64 must greater than 0\");\n }\n if (!liquidity.gt(ZERO)) {\n throw new Error(\"liquidity must greater than 0\");\n }\n\n return zeroForOne\n ? this.getNextSqrtPriceFromTokenAmountBRoundingDown(sqrtPriceX64, liquidity, amountOut, false)\n : this.getNextSqrtPriceFromTokenAmountARoundingUp(sqrtPriceX64, liquidity, amountOut, false);\n }\n\n private static getNextSqrtPriceFromTokenAmountARoundingUp(\n sqrtPriceX64: BN,\n liquidity: BN,\n amount: BN,\n add: boolean,\n ): BN {\n if (amount.eq(ZERO)) return sqrtPriceX64;\n const liquidityLeftShift = liquidity.shln(U64Resolution);\n\n if (add) {\n const numerator1 = liquidityLeftShift;\n const denominator = liquidityLeftShift.add(amount.mul(sqrtPriceX64));\n if (denominator.gte(numerator1)) {\n return MathUtil.mulDivCeil(numerator1, sqrtPriceX64, denominator);\n }\n return MathUtil.mulDivRoundingUp(numerator1, ONE, numerator1.div(sqrtPriceX64).add(amount));\n } else {\n const amountMulSqrtPrice = amount.mul(sqrtPriceX64);\n if (!liquidityLeftShift.gt(amountMulSqrtPrice)) {\n throw new Error(\"getNextSqrtPriceFromTokenAmountARoundingUp,liquidityLeftShift must gt amountMulSqrtPrice\");\n }\n const denominator = liquidityLeftShift.sub(amountMulSqrtPrice);\n return MathUtil.mulDivCeil(liquidityLeftShift, sqrtPriceX64, denominator);\n }\n }\n\n private static getNextSqrtPriceFromTokenAmountBRoundingDown(\n sqrtPriceX64: BN,\n liquidity: BN,\n amount: BN,\n add: boolean,\n ): BN {\n const deltaY = amount.shln(U64Resolution);\n if (add) {\n return sqrtPriceX64.add(deltaY.div(liquidity));\n } else {\n const amountDivLiquidity = MathUtil.mulDivRoundingUp(deltaY, ONE, liquidity);\n if (!sqrtPriceX64.gt(amountDivLiquidity)) {\n throw new Error(\"getNextSqrtPriceFromTokenAmountBRoundingDown sqrtPriceX64 must gt amountDivLiquidity\");\n }\n return sqrtPriceX64.sub(amountDivLiquidity);\n }\n }\n\n public static getSqrtPriceX64FromTick(tick: number): BN {\n if (!Number.isInteger(tick)) {\n throw new Error(\"tick must be integer\");\n }\n if (tick < MIN_TICK || tick > MAX_TICK) {\n throw new Error(\"tick must be in MIN_TICK and MAX_TICK\");\n }\n const tickAbs: number = tick < 0 ? tick * -1 : tick;\n\n let ratio: BN = (tickAbs & 0x1) != 0 ? new BN(\"18445821805675395072\") : new BN(\"18446744073709551616\");\n if ((tickAbs & 0x2) != 0) ratio = mulRightShift(ratio, new BN(\"18444899583751176192\"));\n if ((tickAbs & 0x4) != 0) ratio = mulRightShift(ratio, new BN(\"18443055278223355904\"));\n if ((tickAbs & 0x8) != 0) ratio = mulRightShift(ratio, new BN(\"18439367220385607680\"));\n if ((tickAbs & 0x10) != 0) ratio = mulRightShift(ratio, new BN(\"18431993317065453568\"));\n if ((tickAbs & 0x20) != 0) ratio = mulRightShift(ratio, new BN(\"18417254355718170624\"));\n if ((tickAbs & 0x40) != 0) ratio = mulRightShift(ratio, new BN(\"18387811781193609216\"));\n if ((tickAbs & 0x80) != 0) ratio = mulRightShift(ratio, new BN(\"18329067761203558400\"));\n if ((tickAbs & 0x100) != 0) ratio = mulRightShift(ratio, new BN(\"18212142134806163456\"));\n if ((tickAbs & 0x200) != 0) ratio = mulRightShift(ratio, new BN(\"17980523815641700352\"));\n if ((tickAbs & 0x400) != 0) ratio = mulRightShift(ratio, new BN(\"17526086738831433728\"));\n if ((tickAbs & 0x800) != 0) ratio = mulRightShift(ratio, new BN(\"16651378430235570176\"));\n if ((tickAbs & 0x1000) != 0) ratio = mulRightShift(ratio, new BN(\"15030750278694412288\"));\n if ((tickAbs & 0x2000) != 0) ratio = mulRightShift(ratio, new BN(\"12247334978884435968\"));\n if ((tickAbs & 0x4000) != 0) ratio = mulRightShift(ratio, new BN(\"8131365268886854656\"));\n if ((tickAbs & 0x8000) != 0) ratio = mulRightShift(ratio, new BN(\"3584323654725218816\"));\n if ((tickAbs & 0x10000) != 0) ratio = mulRightShift(ratio, new BN(\"696457651848324352\"));\n if ((tickAbs & 0x20000) != 0) ratio = mulRightShift(ratio, new BN(\"26294789957507116\"));\n if ((tickAbs & 0x40000) != 0) ratio = mulRightShift(ratio, new BN(\"37481735321082\"));\n\n if (tick > 0) ratio = MaxUint128.div(ratio);\n return ratio;\n }\n\n public static getTickFromPrice(price: Decimal, decimalsA: number, decimalsB: number): number {\n return SqrtPriceMath.getTickFromSqrtPriceX64(SqrtPriceMath.priceToSqrtPriceX64(price, decimalsA, decimalsB));\n }\n\n public static getTickFromSqrtPriceX64(sqrtPriceX64: BN): number {\n if (sqrtPriceX64.gt(MAX_SQRT_PRICE_X64) || sqrtPriceX64.lt(MIN_SQRT_PRICE_X64)) {\n throw new Error(\"Provided sqrtPrice is not within the supported sqrtPrice range.\");\n }\n\n const msb = sqrtPriceX64.bitLength() - 1;\n const adjustedMsb = new BN(msb - 64);\n const log2pIntegerX32 = signedLeftShift(adjustedMsb, 32, 128);\n\n let bit = new BN(\"8000000000000000\", \"hex\");\n let precision = 0;\n let log2pFractionX64 = new BN(0);\n\n let r = msb >= 64 ? sqrtPriceX64.shrn(msb - 63) : sqrtPriceX64.shln(63 - msb);\n\n while (bit.gt(new BN(0)) && precision < BIT_PRECISION) {\n r = r.mul(r);\n const rMoreThanTwo = r.shrn(127);\n r = r.shrn(63 + rMoreThanTwo.toNumber());\n log2pFractionX64 = log2pFractionX64.add(bit.mul(rMoreThanTwo));\n bit = bit.shrn(1);\n precision += 1;\n }\n\n const log2pFractionX32 = log2pFractionX64.shrn(32);\n\n const log2pX32 = log2pIntegerX32.add(log2pFractionX32);\n const logbpX64 = log2pX32.mul(new BN(LOG_B_2_X32));\n\n const tickLow = signedRightShift(logbpX64.sub(new BN(LOG_B_P_ERR_MARGIN_LOWER_X64)), 64, 128).toNumber();\n const tickHigh = signedRightShift(logbpX64.add(new BN(LOG_B_P_ERR_MARGIN_UPPER_X64)), 64, 128).toNumber();\n\n if (tickLow == tickHigh) {\n return tickLow;\n } else {\n const derivedTickHighSqrtPriceX64 = SqrtPriceMath.getSqrtPriceX64FromTick(tickHigh);\n return derivedTickHighSqrtPriceX64.lte(sqrtPriceX64) ? tickHigh : tickLow;\n }\n }\n}\n\n// tick math\nexport class TickMath {\n public static getTickWithPriceAndTickspacing(\n price: Decimal,\n tickSpacing: number,\n mintDecimalsA: number,\n mintDecimalsB: number,\n ): number {\n const tick = SqrtPriceMath.getTickFromSqrtPriceX64(\n SqrtPriceMath.priceToSqrtPriceX64(price, mintDecimalsA, mintDecimalsB),\n );\n let result = tick / tickSpacing;\n if (result < 0) {\n result = Math.floor(result);\n } else {\n result = Math.ceil(result);\n }\n return result * tickSpacing;\n }\n\n public static roundPriceWithTickspacing(\n price: Decimal,\n tickSpacing: number,\n mintDecimalsA: number,\n mintDecimalsB: number,\n ): Decimal {\n const tick = TickMath.getTickWithPriceAndTickspacing(price, tickSpacing, mintDecimalsA, mintDecimalsB);\n const sqrtPriceX64 = SqrtPriceMath.getSqrtPriceX64FromTick(tick);\n return SqrtPriceMath.sqrtPriceX64ToPrice(sqrtPriceX64, mintDecimalsA, mintDecimalsB);\n }\n}\n\nexport class LiquidityMath {\n public static addDelta(x: BN, y: BN): BN {\n return x.add(y);\n }\n\n public static getTokenAmountAFromLiquidity(\n sqrtPriceX64A: BN,\n sqrtPriceX64B: BN,\n liquidity: BN,\n roundUp: boolean,\n ): BN {\n if (sqrtPriceX64A.gt(sqrtPriceX64B)) {\n [sqrtPriceX64A, sqrtPriceX64B] = [sqrtPriceX64B, sqrtPriceX64A];\n }\n\n if (!sqrtPriceX64A.gt(ZERO)) {\n throw new Error(\"sqrtPriceX64A must greater than 0\");\n }\n\n const numerator1 = liquidity.ushln(U64Resolution);\n const numerator2 = sqrtPriceX64B.sub(sqrtPriceX64A);\n\n return roundUp\n ? MathUtil.mulDivRoundingUp(MathUtil.mulDivCeil(numerator1, numerator2, sqrtPriceX64B), ONE, sqrtPriceX64A)\n : MathUtil.mulDivFloor(numerator1, numerator2, sqrtPriceX64B).div(sqrtPriceX64A);\n }\n\n public static getTokenAmountBFromLiquidity(\n sqrtPriceX64A: BN,\n sqrtPriceX64B: BN,\n liquidity: BN,\n roundUp: boolean,\n ): BN {\n if (sqrtPriceX64A.gt(sqrtPriceX64B)) {\n [sqrtPriceX64A, sqrtPriceX64B] = [sqrtPriceX64B, sqrtPriceX64A];\n }\n if (!sqrtPriceX64A.gt(ZERO)) {\n throw new Error(\"sqrtPriceX64A must greater than 0\");\n }\n\n return roundUp\n ? MathUtil.mulDivCeil(liquidity, sqrtPriceX64B.sub(sqrtPriceX64A), Q64)\n : MathUtil.mulDivFloor(liquidity, sqrtPriceX64B.sub(sqrtPriceX64A), Q64);\n }\n\n public static getLiquidityFromTokenAmountA(sqrtPriceX64A: BN, sqrtPriceX64B: BN, amountA: BN, roundUp: boolean): BN {\n if (sqrtPriceX64A.gt(sqrtPriceX64B)) {\n [sqrtPriceX64A, sqrtPriceX64B] = [sqrtPriceX64B, sqrtPriceX64A];\n }\n\n const numerator = amountA.mul(sqrtPriceX64A).mul(sqrtPriceX64B);\n const denominator = sqrtPriceX64B.sub(sqrtPriceX64A);\n const result = numerator.div(denominator);\n\n if (roundUp) {\n return MathUtil.mulDivRoundingUp(result, ONE, MaxU64);\n } else {\n return result.shrn(U64Resolution);\n }\n }\n\n public static getLiquidityFromTokenAmountB(sqrtPriceX64A: BN, sqrtPriceX64B: BN, amountB: BN): BN {\n if (sqrtPriceX64A.gt(sqrtPriceX64B)) {\n [sqrtPriceX64A, sqrtPriceX64B] = [sqrtPriceX64B, sqrtPriceX64A];\n }\n return MathUtil.mulDivFloor(amountB, MaxU64, sqrtPriceX64B.sub(sqrtPriceX64A));\n }\n\n public static getLiquidityFromTokenAmounts(\n sqrtPriceCurrentX64: BN,\n sqrtPriceX64A: BN,\n sqrtPriceX64B: BN,\n amountA: BN,\n amountB: BN,\n ): BN {\n if (sqrtPriceX64A.gt(sqrtPriceX64B)) {\n [sqrtPriceX64A, sqrtPriceX64B] = [sqrtPriceX64B, sqrtPriceX64A];\n }\n\n if (sqrtPriceCurrentX64.lte(sqrtPriceX64A)) {\n return LiquidityMath.getLiquidityFromTokenAmountA(sqrtPriceX64A, sqrtPriceX64B, amountA, false);\n } else if (sqrtPriceCurrentX64.lt(sqrtPriceX64B)) {\n const liquidity0 = LiquidityMath.getLiquidityFromTokenAmountA(sqrtPriceCurrentX64, sqrtPriceX64B, amountA, false);\n const liquidity1 = LiquidityMath.getLiquidityFromTokenAmountB(sqrtPriceX64A, sqrtPriceCurrentX64, amountB);\n return liquidity0.lt(liquidity1) ? liquidity0 : liquidity1;\n } else {\n return LiquidityMath.getLiquidityFromTokenAmountB(sqrtPriceX64A, sqrtPriceX64B, amountB);\n }\n }\n\n public static getAmountsFromLiquidity(\n sqrtPriceCurrentX64: BN,\n sqrtPriceX64A: BN,\n sqrtPriceX64B: BN,\n liquidity: BN,\n roundUp: boolean,\n ): { amountA: BN; amountB: BN } {\n if (sqrtPriceX64A.gt(sqrtPriceX64B)) {\n [sqrtPriceX64A, sqrtPriceX64B] = [sqrtPriceX64B, sqrtPriceX64A];\n }\n\n if (sqrtPriceCurrentX64.lte(sqrtPriceX64A)) {\n return {\n amountA: LiquidityMath.getTokenAmountAFromLiquidity(sqrtPriceX64A, sqrtPriceX64B, liquidity, roundUp),\n amountB: new BN(0),\n };\n } else if (sqrtPriceCurrentX64.lt(sqrtPriceX64B)) {\n const amountA = LiquidityMath.getTokenAmountAFromLiquidity(\n sqrtPriceCurrentX64,\n sqrtPriceX64B,\n liquidity,\n roundUp,\n );\n const amountB = LiquidityMath.getTokenAmountBFromLiquidity(\n sqrtPriceX64A,\n sqrtPriceCurrentX64,\n liquidity,\n roundUp,\n );\n return { amountA, amountB };\n } else {\n return {\n amountA: new BN(0),\n amountB: LiquidityMath.getTokenAmountBFromLiquidity(sqrtPriceX64A, sqrtPriceX64B, liquidity, roundUp),\n };\n }\n }\n\n public static getAmountsFromLiquidityWithSlippage(\n sqrtPriceCurrentX64: BN,\n sqrtPriceX64A: BN,\n sqrtPriceX64B: BN,\n liquidity: BN,\n amountMax: boolean,\n roundUp: boolean,\n amountSlippage: number,\n ): { amountSlippageA: BN; amountSlippageB: BN } {\n const { amountA, amountB } = LiquidityMath.getAmountsFromLiquidity(\n sqrtPriceCurrentX64,\n sqrtPriceX64A,\n sqrtPriceX64B,\n liquidity,\n roundUp,\n );\n const coefficient = amountMax ? 1 + amountSlippage : 1 - amountSlippage;\n\n const amount0Slippage = new BN(new Decimal(amountA.toString()).mul(coefficient).toFixed(0));\n const amount1Slippage = new BN(new Decimal(amountB.toString()).mul(coefficient).toFixed(0));\n return {\n amountSlippageA: amount0Slippage,\n amountSlippageB: amount1Slippage,\n };\n }\n\n public static getAmountsOutFromLiquidity({\n poolInfo,\n tickLower,\n tickUpper,\n liquidity,\n slippage,\n add,\n epochInfo,\n amountAddFee,\n }: {\n poolInfo: ApiV3PoolInfoConcentratedItem;\n tickLower: number;\n tickUpper: number;\n liquidity: BN;\n slippage: number;\n add: boolean;\n\n epochInfo: EpochInfo;\n amountAddFee: boolean;\n }): ReturnTypeGetLiquidityAmountOut {\n const sqrtPriceX64 = SqrtPriceMath.priceToSqrtPriceX64(\n new Decimal(poolInfo.price),\n poolInfo.mintA.decimals,\n poolInfo.mintB.decimals,\n );\n const sqrtPriceX64A = SqrtPriceMath.getSqrtPriceX64FromTick(tickLower);\n const sqrtPriceX64B = SqrtPriceMath.getSqrtPriceX64FromTick(tickUpper);\n\n const coefficientRe = add ? 1 + slippage : 1 - slippage;\n\n const amounts = LiquidityMath.getAmountsFromLiquidity(sqrtPriceX64, sqrtPriceX64A, sqrtPriceX64B, liquidity, add);\n\n const [amountA, amountB] = [\n getTransferAmountFeeV2(amounts.amountA, poolInfo.mintA.extensions?.feeConfig, epochInfo, amountAddFee),\n getTransferAmountFeeV2(amounts.amountB, poolInfo.mintB.extensions?.feeConfig, epochInfo, amountAddFee),\n ];\n const [amountSlippageA, amountSlippageB] = [\n getTransferAmountFeeV2(\n new BN(new Decimal(amounts.amountA.toString()).mul(coefficientRe).toFixed(0)),\n poolInfo.mintA.extensions?.feeConfig,\n epochInfo,\n amountAddFee,\n ),\n getTransferAmountFeeV2(\n new BN(new Decimal(amounts.amountB.toString()).mul(coefficientRe).toFixed(0)),\n poolInfo.mintB.extensions?.feeConfig,\n epochInfo,\n amountAddFee,\n ),\n ];\n\n return {\n liquidity,\n amountA,\n amountB,\n amountSlippageA,\n amountSlippageB,\n expirationTime: minExpirationTime(amountA.expirationTime, amountB.expirationTime),\n };\n }\n}\n\n// swap math\n\ntype SwapStep = {\n sqrtPriceX64Next: BN;\n amountIn: BN;\n amountOut: BN;\n feeAmount: BN;\n};\n\nexport interface StepComputations {\n sqrtPriceStartX64: BN;\n tickNext: number;\n initialized: boolean;\n sqrtPriceNextX64: BN;\n amountIn: BN;\n amountOut: BN;\n feeAmount: BN;\n}\n\nexport abstract class SwapMath {\n public static swapCompute(\n programId: PublicKey,\n poolId: PublicKey,\n tickArrayCache: { [key: string]: TickArray },\n tickArrayBitmap: BN[],\n tickarrayBitmapExtension: TickArrayBitmapExtensionType,\n zeroForOne: boolean,\n fee: number,\n liquidity: BN,\n currentTick: number,\n tickSpacing: number,\n currentSqrtPriceX64: BN,\n amountSpecified: BN,\n lastSavedTickArrayStartIndex: number,\n sqrtPriceLimitX64?: BN,\n catchLiquidityInsufficient = false,\n ): {\n allTrade: boolean;\n amountSpecifiedRemaining: BN;\n amountCalculated: BN;\n feeAmount: BN;\n sqrtPriceX64: BN;\n liquidity: BN;\n tickCurrent: number;\n accounts: PublicKey[];\n } {\n if (amountSpecified.eq(ZERO)) {\n throw new Error(\"amountSpecified must not be 0\");\n }\n if (!sqrtPriceLimitX64) sqrtPriceLimitX64 = zeroForOne ? MIN_SQRT_PRICE_X64.add(ONE) : MAX_SQRT_PRICE_X64.sub(ONE);\n\n if (zeroForOne) {\n if (sqrtPriceLimitX64.lt(MIN_SQRT_PRICE_X64)) {\n throw new Error(\"sqrtPriceX64 must greater than MIN_SQRT_PRICE_X64\");\n }\n\n if (sqrtPriceLimitX64.gte(currentSqrtPriceX64)) {\n throw new Error(\"sqrtPriceX64 must smaller than current\");\n }\n } else {\n if (sqrtPriceLimitX64.gt(MAX_SQRT_PRICE_X64)) {\n throw new Error(\"sqrtPriceX64 must smaller than MAX_SQRT_PRICE_X64\");\n }\n\n if (sqrtPriceLimitX64.lte(currentSqrtPriceX64)) {\n throw new Error(\"sqrtPriceX64 must greater than current\");\n }\n }\n const baseInput = amountSpecified.gt(ZERO);\n\n const state = {\n amountSpecifiedRemaining: amountSpecified,\n amountCalculated: ZERO,\n sqrtPriceX64: currentSqrtPriceX64,\n tick:\n currentTick > lastSavedTickArrayStartIndex\n ? Math.min(lastSavedTickArrayStartIndex + TickQuery.tickCount(tickSpacing) - 1, currentTick)\n : lastSavedTickArrayStartIndex,\n accounts: [] as PublicKey[],\n liquidity,\n feeAmount: new BN(0),\n };\n let tickAarrayStartIndex = lastSavedTickArrayStartIndex;\n let tickArrayCurrent = tickArrayCache[lastSavedTickArrayStartIndex];\n let loopCount = 0;\n let t = !zeroForOne && tickArrayCurrent.startTickIndex === state.tick;\n while (\n !state.amountSpecifiedRemaining.eq(ZERO) &&\n !state.sqrtPriceX64.eq(sqrtPriceLimitX64)\n // state.tick < MAX_TICK &&\n // state.tick > MIN_TICK\n ) {\n if (loopCount > 10) {\n // throw Error('liquidity limit')\n }\n const step: Partial<StepComputations> = {};\n step.sqrtPriceStartX64 = state.sqrtPriceX64;\n\n const tickState: Tick | null = TickUtils.nextInitTick(tickArrayCurrent, state.tick, tickSpacing, zeroForOne, t);\n\n let nextInitTick: Tick | null = tickState ? tickState : null; // TickUtils.firstInitializedTick(tickArrayCurrent, zeroForOne)\n let tickArrayAddress: null | PublicKey = null;\n\n if (!nextInitTick?.liquidityGross.gtn(0)) {\n const nextInitTickArrayIndex = PoolUtils.nextInitializedTickArrayStartIndex(\n {\n tickCurrent: state.tick,\n tickSpacing,\n tickArrayBitmap,\n exBitmapInfo: tickarrayBitmapExtension,\n },\n tickAarrayStartIndex,\n zeroForOne,\n );\n if (!nextInitTickArrayIndex.isExist) {\n if (catchLiquidityInsufficient) {\n return {\n allTrade: false,\n amountSpecifiedRemaining: state.amountSpecifiedRemaining,\n amountCalculated: state.amountCalculated,\n feeAmount: state.feeAmount,\n sqrtPriceX64: state.sqrtPriceX64,\n liquidity: state.liquidity,\n tickCurrent: state.tick,\n accounts: state.accounts,\n };\n }\n throw Error(\"swapCompute LiquidityInsufficient\");\n }\n tickAarrayStartIndex = nextInitTickArrayIndex.nextStartIndex;\n\n const { publicKey: expectedNextTickArrayAddress } = getPdaTickArrayAddress(\n programId,\n poolId,\n tickAarrayStartIndex,\n );\n tickArrayAddress = expectedNextTickArrayAddress;\n tickArrayCurrent = tickArrayCache[tickAarrayStartIndex];\n\n try {\n nextInitTick = TickUtils.firstInitializedTick(tickArrayCurrent, zeroForOne);\n } catch (e) {\n throw Error(\"not found next tick info\");\n }\n }\n\n step.tickNext = nextInitTick.tick;\n step.initialized = nextInitTick.liquidityGross.gtn(0);\n if (lastSavedTickArrayStartIndex !== tickAarrayStartIndex && tickArrayAddress) {\n state.accounts.push(tickArrayAddress);\n lastSavedTickArrayStartIndex = tickAarrayStartIndex;\n }\n if (step.tickNext < MIN_TICK) {\n step.tickNext = MIN_TICK;\n } else if (step.tickNext > MAX_TICK) {\n step.tickNext = MAX_TICK;\n }\n\n step.sqrtPriceNextX64 = SqrtPriceMath.getSqrtPriceX64FromTick(step.tickNext);\n let targetPrice: BN;\n if (\n (zeroForOne && step.sqrtPriceNextX64.lt(sqrtPriceLimitX64)) ||\n (!zeroForOne && step.sqrtPriceNextX64.gt(sqrtPriceLimitX64))\n ) {\n targetPrice = sqrtPriceLimitX64;\n } else {\n targetPrice = step.sqrtPriceNextX64;\n }\n [state.sqrtPriceX64, step.amountIn, step.amountOut, step.feeAmount] = SwapMath.swapStepCompute(\n state.sqrtPriceX64,\n targetPrice,\n state.liquidity,\n state.amountSpecifiedRemaining,\n fee,\n );\n\n state.feeAmount = state.feeAmount.add(step.feeAmount);\n\n if (baseInput) {\n state.amountSpecifiedRemaining = state.amountSpecifiedRemaining.sub(step.amountIn.add(step.feeAmount));\n state.amountCalculated = state.amountCalculated.sub(step.amountOut);\n } else {\n state.amountSpecifiedRemaining = state.amountSpecifiedRemaining.add(step.amountOut);\n state.amountCalculated = state.amountCalculated.add(step.amountIn.add(step.feeAmount));\n }\n if (state.sqrtPriceX64.eq(step.sqrtPriceNextX64)) {\n if (step.initialized) {\n let liquidityNet = nextInitTick.liquidityNet;\n if (zeroForOne) liquidityNet = liquidityNet.mul(NEGATIVE_ONE);\n state.liquidity = LiquidityMath.addDelta(state.liquidity, liquidityNet);\n }\n\n t = step.tickNext != state.tick && !zeroForOne && tickArrayCurrent.startTickIndex === step.tickNext;\n state.tick = zeroForOne ? step.tickNext - 1 : step.tickNext; //\n } else if (state.sqrtPriceX64 != step.sqrtPriceStartX64) {\n const _T = SqrtPriceMath.getTickFromSqrtPriceX64(state.sqrtPriceX64);\n t = _T != state.tick && !zeroForOne && tickArrayCurrent.startTickIndex === _T;\n state.tick = _T;\n }\n ++loopCount;\n }\n\n try {\n const { nextStartIndex: tickAarrayStartIndex, isExist } = TickQuery.nextInitializedTickArray(\n state.tick,\n tickSpacing,\n zeroForOne,\n tickArrayBitmap,\n tickarrayBitmapExtension,\n );\n if (isExist && lastSavedTickArrayStartIndex !== tickAarrayStartIndex) {\n state.accounts.push(getPdaTickArrayAddress(programId, poolId, tickAarrayStartIndex).publicKey);\n lastSavedTickArrayStartIndex = tickAarrayStartIndex;\n }\n } catch (e) {\n /* empty */\n }\n\n return {\n allTrade: true,\n amountSpecifiedRemaining: ZERO,\n amountCalculated: state.amountCalculated,\n feeAmount: state.feeAmount,\n sqrtPriceX64: state.sqrtPriceX64,\n liquidity: state.liquidity,\n tickCurrent: state.tick,\n accounts: state.accounts,\n };\n }\n // public static swapCompute(\n // programId: PublicKey,\n // poolId: PublicKey,\n // tickArrayCache: { [key: string]: TickArray },\n // tickArrayBitmap: BN[],\n // tickarrayBitmapExtension: TickArrayBitmapExtensionType,\n // zeroForOne: boolean,\n // fee: number,\n // liquidity: BN,\n // currentTick: number,\n // tickSpacing: number,\n // currentSqrtPriceX64: BN,\n // amountSpecified: BN,\n // lastSavedTickArrayStartIndex: number,\n // sqrtPriceLimitX64?: BN,\n // ): {\n // amountCalculated: BN;\n // feeAmount: BN;\n // sqrtPriceX64: BN;\n // liquidity: BN;\n // tickCurrent: number;\n // accounts: PublicKey[];\n // } {\n // if (amountSpecified.eq(ZERO)) {\n // throw new Error(\"amountSpecified must not be 0\");\n // }\n // if (!sqrtPriceLimitX64) sqrtPriceLimitX64 = zeroForOne ? MIN_SQRT_PRICE_X64.add(ONE) : MAX_SQRT_PRICE_X64.sub(ONE);\n\n // if (zeroForOne) {\n // if (sqrtPriceLimitX64.lt(MIN_SQRT_PRICE_X64)) {\n // throw new Error(\"sqrtPriceX64 must greater than MIN_SQRT_PRICE_X64\");\n // }\n\n // if (sqrtPriceLimitX64.gte(currentSqrtPriceX64)) {\n // throw new Error(\"sqrtPriceX64 must smaller than current\");\n // }\n // } else {\n // if (sqrtPriceLimitX64.gt(MAX_SQRT_PRICE_X64)) {\n // throw new Error(\"sqrtPriceX64 must smaller than MAX_SQRT_PRICE_X64\");\n // }\n\n // if (sqrtPriceLimitX64.lte(currentSqrtPriceX64)) {\n // throw new Error(\"sqrtPriceX64 must greater than current\");\n // }\n // }\n // const baseInput = amountSpecified.gt(ZERO);\n\n // const state = {\n // amountSpecifiedRemaining: amountSpecified,\n // amountCalculated: ZERO,\n // sqrtPriceX64: currentSqrtPriceX64,\n // tick:\n // currentTick > lastSavedTickArrayStartIndex\n // ? Math.min(lastSavedTickArrayStartIndex + TickQuery.tickCount(tickSpacing) - 1, currentTick)\n // : lastSavedTickArrayStartIndex,\n // accounts: [] as PublicKey[],\n // liquidity,\n // feeAmount: new BN(0),\n // };\n // let tickAarrayStartIndex = lastSavedTickArrayStartIndex;\n // let tickArrayCurrent = tickArrayCache[lastSavedTickArrayStartIndex];\n // let loopCount = 0;\n // while (\n // !state.amountSpecifiedRemaining.eq(ZERO) &&\n // !state.sqrtPriceX64.eq(sqrtPriceLimitX64)\n // // state.tick < MAX_TICK &&\n // // state.tick > MIN_TICK\n // ) {\n // if (loopCount > 10) {\n // throw Error(\"liquidity limit\");\n // }\n // const step: Partial<StepComputations> = {};\n // step.sqrtPriceStartX64 = state.sqrtPriceX64;\n\n // const tickState: Tick | null = TickUtils.nextInitTick(tickArrayCurrent, state.tick, tickSpacing, zeroForOne);\n\n // let nextInitTick: Tick | null = tickState ? tickState : null; // TickUtils.firstInitializedTick(tickArrayCurrent, zeroForOne)\n // let tickArrayAddress: PublicKey | null = null;\n\n // if (!nextInitTick?.liquidityGross.gtn(0)) {\n // const nextInitTickArrayIndex = PoolUtils.nextInitializedTickArrayStartIndex(\n // {\n // tickCurrent: state.tick,\n // tickSpacing,\n // tickArrayBitmap,\n // exBitmapInfo: tickarrayBitmapExtension,\n // },\n // tickAarrayStartIndex,\n // zeroForOne,\n // );\n // if (!nextInitTickArrayIndex.isExist) {\n // throw Error(\"swapCompute LiquidityInsufficient\");\n // }\n // tickAarrayStartIndex = nextInitTickArrayIndex.nextStartIndex;\n\n // const { publicKey: expectedNextTickArrayAddress } = getPdaTickArrayAddress(\n // programId,\n // poolId,\n // tickAarrayStartIndex,\n // );\n // tickArrayAddress = expectedNextTickArrayAddress;\n // tickArrayCurrent = tickArrayCache[tickAarrayStartIndex];\n\n // nextInitTick = TickUtils.firstInitializedTick(tickArrayCurrent, zeroForOne);\n // }\n\n // step.tickNext = nextInitTick.tick;\n // step.initialized = nextInitTick.liquidityGross.gtn(0);\n // if (lastSavedTickArrayStartIndex !== tickAarrayStartIndex && tickArrayAddress) {\n // state.accounts.push(tickArrayAddress);\n // lastSavedTickArrayStartIndex = tickAarrayStartIndex;\n // }\n // if (step.tickNext < MIN_TICK) {\n // step.tickNext = MIN_TICK;\n // } else if (step.tickNext > MAX_TICK) {\n // step.tickNext = MAX_TICK;\n // }\n\n // step.sqrtPriceNextX64 = SqrtPriceMath.getSqrtPriceX64FromTick(step.tickNext);\n // let targetPrice: BN;\n // if (\n // (zeroForOne && step.sqrtPriceNextX64.lt(sqrtPriceLimitX64)) ||\n // (!zeroForOne && step.sqrtPriceNextX64.gt(sqrtPriceLimitX64))\n // ) {\n // targetPrice = sqrtPriceLimitX64;\n // } else {\n // targetPrice = step.sqrtPriceNextX64;\n // }\n // [state.sqrtPriceX64, step.amountIn, step.amountOut, step.feeAmount] = SwapMath.swapStepCompute(\n // state.sqrtPriceX64,\n // targetPrice,\n // state.liquidity,\n // state.amountSpecifiedRemaining,\n // fee,\n // );\n\n // state.feeAmount = state.feeAmount.add(step.feeAmount);\n\n // if (baseInput) {\n // state.amountSpecifiedRemaining = state.amountSpecifiedRemaining.sub(step.amountIn.add(step.feeAmount));\n // state.amountCalculated = state.amountCalculated.sub(step.amountOut);\n // } else {\n // state.amountSpecifiedRemaining = state.amountSpecifiedRemaining.add(step.amountOut);\n // state.amountCalculated = state.amountCalculated.add(step.amountIn.add(step.feeAmount));\n // }\n // if (state.sqrtPriceX64.eq(step.sqrtPriceNextX64)) {\n // if (step.initialized) {\n // let liquidityNet = nextInitTick.liquidityNet;\n // if (zeroForOne) liquidityNet = liquidityNet.mul(NEGATIVE_ONE);\n // state.liquidity = LiquidityMath.addDelta(state.liquidity, liquidityNet);\n // }\n // state.tick = zeroForOne ? step.tickNext - 1 : step.tickNext;\n // } else if (state.sqrtPriceX64 != step.sqrtPriceStartX64) {\n // state.tick = SqrtPriceMath.getTickFromSqrtPriceX64(state.sqrtPriceX64);\n // }\n // ++loopCount;\n // }\n\n // // try {\n // // console.log('state.tick', state.tick)\n // // const { nextStartIndex: tickAarrayStartIndex } = TickQuery.nextInitializedTickArray(\n // // state.tick,\n // // tickSpacing,\n // // zeroForOne,\n // // tickArrayBitmap,\n // // tickarrayBitmapExtension,\n // // );\n // // if (\n // // lastSavedTickArrayStartIndex !== tickAarrayStartIndex\n // // ) {\n // // state.accounts.push(getPdaTickArrayAddress(\n // // programId,\n // // poolId,\n // // tickAarrayStartIndex,\n // // ).publicKey)\n // // lastSavedTickArrayStartIndex = tickAarrayStartIndex;\n // // }\n // // } catch (e) { /* empty */ }\n\n // return {\n // amountCalculated: state.amountCalculated,\n // feeAmount: state.feeAmount,\n // sqrtPriceX64: state.sqrtPriceX64,\n // liquidity: state.liquidity,\n // tickCurrent: state.tick,\n // accounts: state.accounts,\n // };\n // }\n\n private static swapStepCompute(\n sqrtPriceX64Current: BN,\n sqrtPriceX64Target: BN,\n liquidity: BN,\n amountRemaining: BN,\n feeRate: Fee,\n ): [BN, BN, BN, BN] {\n const swapStep: SwapStep = {\n sqrtPriceX64Next: new BN(0),\n amountIn: new BN(0),\n amountOut: new BN(0),\n feeAmount: new BN(0),\n };\n\n const zeroForOne = sqrtPriceX64Current.gte(sqrtPriceX64Target);\n const baseInput = amountRemaining.gte(ZERO);\n\n if (baseInput) {\n const amountRemainingSubtractFee = MathUtil.mulDivFloor(\n amountRemaining,\n FEE_RATE_DENOMINATOR.sub(new BN(feeRate.toString())),\n FEE_RATE_DENOMINATOR,\n );\n swapStep.amountIn = zeroForOne\n ? LiquidityMath.getTokenAmountAFromLiquidity(sqrtPriceX64Target, sqrtPriceX64Current, liquidity, true)\n : LiquidityMath.getTokenAmountBFromLiquidity(sqrtPriceX64Current, sqrtPriceX64Target, liquidity, true);\n if (amountRemainingSubtractFee.gte(swapStep.amountIn)) {\n swapStep.sqrtPriceX64Next = sqrtPriceX64Target;\n } else {\n swapStep.sqrtPriceX64Next = SqrtPriceMath.getNextSqrtPriceX64FromInput(\n sqrtPriceX64Current,\n liquidity,\n amountRemainingSubtractFee,\n zeroForOne,\n );\n }\n } else {\n swapStep.amountOut = zeroForOne\n ? LiquidityMath.getTokenAmountBFromLiquidity(sqrtPriceX64Target, sqrtPriceX64Current, liquidity, false)\n : LiquidityMath.getTokenAmountAFromLiquidity(sqrtPriceX64Current, sqrtPriceX64Target, liquidity, false);\n if (amountRemaining.mul(NEGATIVE_ONE).gte(swapStep.amountOut)) {\n swapStep.sqrtPriceX64Next = sqrtPriceX64Target;\n } else {\n swapStep.sqrtPriceX64Next = SqrtPriceMath.getNextSqrtPriceX64FromOutput(\n sqrtPriceX64Current,\n liquidity,\n amountRemaining.mul(NEGATIVE_ONE),\n zeroForOne,\n );\n }\n }\n\n const reachTargetPrice = sqrtPriceX64Target.eq(swapStep.sqrtPriceX64Next);\n\n if (zeroForOne) {\n if (!(reachTargetPrice && baseInput)) {\n swapStep.amountIn = LiquidityMath.getTokenAmountAFromLiquidity(\n swapStep.sqrtPriceX64Next,\n sqrtPriceX64Current,\n liquidity,\n true,\n );\n }\n\n if (!(reachTargetPrice && !baseInput)) {\n swapStep.amountOut = LiquidityMath.getTokenAmountBFromLiquidity(\n swapStep.sqrtPriceX64Next,\n sqrtPriceX64Current,\n liquidity,\n false,\n );\n }\n } else {\n swapStep.amountIn =\n reachTargetPrice && baseInput\n ? swapStep.amountIn\n : LiquidityMath.getTokenAmountBFromLiquidity(sqrtPriceX64Current, swapStep.sqrtPriceX64Next, liquidity, true);\n swapStep.amountOut =\n reachTargetPrice && !baseInput\n ? swapStep.amountOut\n : LiquidityMath.getTokenAmountAFromLiquidity(\n sqrtPriceX64Current,\n swapStep.sqrtPriceX64Next,\n liquidity,\n false,\n );\n }\n\n if (!baseInput && swapStep.amountOut.gt(amountRemaining.mul(NEGATIVE_ONE))) {\n swapStep.amountOut = amountRemaining.mul(NEGATIVE_ONE);\n }\n if (baseInput && !swapStep.sqrtPriceX64Next.eq(sqrtPriceX64Target)) {\n swapStep.feeAmount = amountRemaining.sub(swapStep.amountIn);\n } else {\n swapStep.feeAmount = MathUtil.mulDivCeil(\n swapStep.amountIn,\n new BN(feeRate),\n FEE_RATE_DENOMINATOR.sub(new BN(feeRate)),\n );\n }\n return [swapStep.sqrtPriceX64Next, swapStep.amountIn, swapStep.amountOut, swapStep.feeAmount];\n }\n}\n","import BN from \"bn.js\";\nexport function u16ToBytes(num: number): Uint8Array {\n const arr = new ArrayBuffer(2);\n const view = new DataView(arr);\n view.setUint16(0, num, false);\n return new Uint8Array(arr);\n}\n\nexport function i16ToBytes(num: number): Uint8Array {\n const arr = new ArrayBuffer(2);\n const view = new DataView(arr);\n view.setInt16(0, num, false);\n return new Uint8Array(arr);\n}\n\nexport function u32ToBytes(num: number): Uint8Array {\n const arr = new ArrayBuffer(4);\n const view = new DataView(arr);\n view.setUint32(0, num, false);\n return new Uint8Array(arr);\n}\n\nexport function i32ToBytes(num: number): Uint8Array {\n const arr = new ArrayBuffer(4);\n const view = new DataView(arr);\n view.setInt32(0, num, false);\n return new Uint8Array(arr);\n}\n\nexport function leadingZeros(bitNum: number, data: BN): number {\n let i = 0;\n for (let j = bitNum - 1; j >= 0; j--) {\n if (!data.testn(j)) {\n i++;\n } else {\n break;\n }\n }\n return i;\n}\n\nexport function trailingZeros(bitNum: number, data: BN) {\n let i = 0;\n for (let j = 0; j < bitNum; j++) {\n if (!data.testn(j)) {\n i++;\n } else {\n break;\n }\n }\n return i;\n}\n\nexport function isZero(bitNum: number, data: BN): boolean {\n for (let i = 0; i < bitNum; i++) {\n if (data.testn(i)) return false;\n }\n return true;\n}\n\nexport function mostSignificantBit(bitNum: number, data: BN): number | null {\n if (isZero(bitNum, data)) return null;\n else return leadingZeros(bitNum, data);\n}\n\nexport function leastSignificantBit(bitNum: number, data: BN): number | null {\n if (isZero(bitNum, data)) return null;\n else return trailingZeros(bitNum, data);\n}\n","import { PublicKey } from \"@solana/web3.js\";\n\nimport { findProgramAddress, METADATA_PROGRAM_ID } from \"../../../common\";\n\nimport { i32ToBytes, u16ToBytes } from \"./util\";\n\nexport const AMM_CONFIG_SEED = Buffer.from(\"amm_config\", \"utf8\");\nexport const POOL_SEED = Buffer.from(\"pool\", \"utf8\");\nexport const POOL_VAULT_SEED = Buffer.from(\"pool_vault\", \"utf8\");\nexport const POOL_REWARD_VAULT_SEED = Buffer.from(\"pool_reward_vault\", \"utf8\");\nexport const POSITION_SEED = Buffer.from(\"position\", \"utf8\");\nexport const TICK_ARRAY_SEED = Buffer.from(\"tick_array\", \"utf8\");\nexport const OPERATION_SEED = Buffer.from(\"operation\", \"utf8\");\nexport const POOL_TICK_ARRAY_BITMAP_SEED = Buffer.from(\"pool_tick_array_bitmap_extension\", \"utf8\");\nexport const OBSERVATION_SEED = Buffer.from(\"observation\", \"utf8\");\n\nexport function getPdaAmmConfigId(\n programId: PublicKey,\n index: number,\n): {\n publicKey: PublicKey;\n nonce: number;\n} {\n return findProgramAddress([AMM_CONFIG_SEED, u16ToBytes(index)], programId);\n}\n\nexport function getPdaPoolId(\n programId: PublicKey,\n ammConfigId: PublicKey,\n mintA: PublicKey,\n mintB: PublicKey,\n): {\n publicKey: PublicKey;\n nonce: number;\n} {\n return findProgramAddress([POOL_SEED, ammConfigId.toBuffer(), mintA.toBuffer(), mintB.toBuffer()], programId);\n}\n\nexport function getPdaPoolVaultId(\n programId: PublicKey,\n poolId: PublicKey,\n vaultMint: PublicKey,\n): {\n publicKey: PublicKey;\n nonce: number;\n} {\n return findProgramAddress([POOL_VAULT_SEED, poolId.toBuffer(), vaultMint.toBuffer()], programId);\n}\n\nexport function getPdaPoolRewardVaulId(\n programId: PublicKey,\n poolId: PublicKey,\n rewardMint: PublicKey,\n): {\n publicKey: PublicKey;\n nonce: number;\n} {\n return findProgramAddress([POOL_REWARD_VAULT_SEED, poolId.toBuffer(), rewardMint.toBuffer()], programId);\n}\n\nexport function getPdaTickArrayAddress(\n programId: PublicKey,\n poolId: PublicKey,\n startIndex: number,\n): {\n publicKey: PublicKey;\n nonce: number;\n} {\n return findProgramAddress([TICK_ARRAY_SEED, poolId.toBuffer(), i32ToBytes(startIndex)], programId);\n}\n\nexport function getPdaProtocolPositionAddress(\n programId: PublicKey,\n poolId: PublicKey,\n tickLower: number,\n tickUpper: number,\n): {\n publicKey: PublicKey;\n nonce: number;\n} {\n return findProgramAddress(\n [POSITION_SEED, poolId.toBuffer(), i32ToBytes(tickLower), i32ToBytes(tickUpper)],\n programId,\n );\n}\n\nexport function getPdaPersonalPositionAddress(\n programId: PublicKey,\n nftMint: PublicKey,\n): {\n publicKey: PublicKey;\n nonce: number;\n} {\n return findProgramAddress([POSITION_SEED, nftMint.toBuffer()], programId);\n}\n\nexport function getPdaMetadataKey(mint: PublicKey): {\n publicKey: PublicKey;\n nonce: number;\n} {\n return findProgramAddress(\n [Buffer.from(\"metadata\", \"utf8\"), METADATA_PROGRAM_ID.toBuffer(), mint.toBuffer()],\n METADATA_PROGRAM_ID,\n );\n}\n\nexport function getPdaOperationAccount(programId: PublicKey): {\n publicKey: PublicKey;\n nonce: number;\n} {\n return findProgramAddress([OPERATION_SEED], programId);\n}\n\nexport function getPdaExBitmapAccount(\n programId: PublicKey,\n poolId: PublicKey,\n): {\n publicKey: PublicKey;\n nonce: number;\n} {\n return findProgramAddress([POOL_TICK_ARRAY_BITMAP_SEED, poolId.toBuffer()], programId);\n}\n\nexport function getPdaObservationAccount(\n programId: PublicKey,\n poolId: PublicKey,\n): {\n publicKey: PublicKey;\n nonce: number;\n} {\n return findProgramAddress([OBSERVATION_SEED, poolId.toBuffer()], programId);\n}\n\nexport const POOL_LOCK_ID_SEED = Buffer.from(\"locked_position\", \"utf8\");\nexport function getPdaLockPositionId(\n programId: PublicKey,\n positionId: PublicKey,\n): {\n publicKey: PublicKey;\n nonce: number;\n} {\n return findProgramAddress([POOL_LOCK_ID_SEED, positionId.toBuffer()], programId);\n}\n\nexport function getPdaLockClPositionIdV2(\n programId: PublicKey,\n lockNftMint: PublicKey,\n): {\n publicKey: PublicKey;\n nonce: number;\n} {\n return findProgramAddress([POOL_LOCK_ID_SEED, lockNftMint.toBuffer()], programId);\n}\n","import { TOKEN_2022_PROGRAM_ID } from \"@solana/spl-token\";\nimport { Connection, EpochInfo, PublicKey } from \"@solana/web3.js\";\nimport BN from \"bn.js\";\n\nimport {\n ClmmPoolInfo,\n ClmmPoolRewardInfo,\n ClmmPoolRewardLayoutInfo,\n ComputeClmmPoolInfo,\n ReturnTypeComputeAmountOut,\n ReturnTypeComputeAmountOutBaseOut,\n ReturnTypeComputeAmountOutFormat,\n ReturnTypeFetchExBitmaps,\n ReturnTypeFetchMultiplePoolTickArrays,\n ReturnTypeGetLiquidityAmountOut,\n SDKParsedConcentratedInfo,\n TickArrayBitmapExtensionType,\n} from \"../type\";\n\nimport { ApiV3PoolInfoConcentratedItem, ApiV3Token } from \"@/api/type\";\n\nimport { TokenAccountRaw } from \"@/cobaltx/account/types\";\nimport {\n getMultipleAccountsInfo,\n getMultipleAccountsInfoWithCustomFlags,\n getTransferAmountFeeV2,\n minExpirationTime,\n solToWSol,\n} from \"@/common\";\nimport { Percent, Price, Token, TokenAmount } from \"@/module\";\nimport Decimal from \"decimal.js\";\nimport { PoolInfoLayout, PositionInfoLayout, TickArrayBitmapExtensionLayout, TickArrayLayout } from \"../layout\";\nimport { MAX_SQRT_PRICE_X64, MAX_TICK, MIN_SQRT_PRICE_X64, MIN_TICK, NEGATIVE_ONE, Q64, ZERO } from \"./constants\";\nimport { LiquidityMath, MathUtil, SqrtPriceMath, SwapMath } from \"./math\";\nimport { getPdaExBitmapAccount, getPdaPersonalPositionAddress, getPdaTickArrayAddress } from \"./pda\";\nimport { PositionUtils } from \"./position\";\nimport { TICK_ARRAY_BITMAP_SIZE, Tick, TickArray, TickUtils } from \"./tick\";\nimport { TickArrayBitmap, TickArrayBitmapExtensionUtils } from \"./tickarrayBitmap\";\nimport { TickQuery } from \"./tickQuery\";\nimport { NetworkName } from \"@/config\";\n\nexport class PoolUtils {\n public network: NetworkName;\n\n constructor(network: NetworkName) {\n this.network = network;\n }\n\n public static getOutputAmountAndRemainAccounts(\n poolInfo: ComputeClmmPoolInfo,\n tickArrayCache: { [key: string]: TickArray },\n inputTokenMint: PublicKey,\n inputAmount: BN,\n sqrtPriceLimitX64?: BN,\n catchLiquidityInsufficient = false,\n ): {\n allTrade: boolean;\n expectedAmountOut: BN;\n remainingAccounts: PublicKey[];\n executionPrice: BN;\n feeAmount: BN;\n } {\n const zeroForOne = inputTokenMint.toBase58() === poolInfo.mintA.address;\n\n const allNeededAccounts: PublicKey[] = [];\n const {\n isExist,\n startIndex: firstTickArrayStartIndex,\n nextAccountMeta,\n } = this.getFirstInitializedTickArray(poolInfo, zeroForOne);\n if (!isExist || firstTickArrayStartIndex === undefined || !nextAccountMeta) throw new Error(\"Invalid tick array\");\n\n // try {\n // const preTick = this.preInitializedTickArrayStartIndex(poolInfo, !zeroForOne)\n // if (preTick.isExist) {\n // const { publicKey: address } = getPdaTickArrayAddress(\n // poolInfo.programId,\n // poolInfo.id,\n // preTick.nextStartIndex\n // );\n // allNeededAccounts.push(address)\n // }\n // } catch (e) { /* empty */ }\n\n allNeededAccounts.push(nextAccountMeta);\n const {\n allTrade,\n amountCalculated: outputAmount,\n accounts: reaminAccounts,\n sqrtPriceX64: executionPrice,\n feeAmount,\n } = SwapMath.swapCompute(\n poolInfo.programId,\n poolInfo.id,\n tickArrayCache,\n poolInfo.tickArrayBitmap,\n poolInfo.exBitmapInfo,\n zeroForOne,\n poolInfo.ammConfig.tradeFeeRate,\n poolInfo.liquidity,\n poolInfo.tickCurrent,\n poolInfo.tickSpacing,\n poolInfo.sqrtPriceX64,\n inputAmount,\n firstTickArrayStartIndex,\n sqrtPriceLimitX64,\n catchLiquidityInsufficient,\n );\n allNeededAccounts.push(...reaminAccounts);\n return {\n allTrade,\n expectedAmountOut: outputAmount.mul(NEGATIVE_ONE),\n remainingAccounts: allNeededAccounts,\n executionPrice,\n feeAmount,\n };\n }\n\n public static getInputAmountAndRemainAccounts(\n poolInfo: ComputeClmmPoolInfo,\n tickArrayCache: { [key: string]: TickArray },\n outputTokenMint: PublicKey,\n outputAmount: BN,\n sqrtPriceLimitX64?: BN,\n ): { expectedAmountIn: BN; remainingAccounts: PublicKey[]; executionPrice: BN; feeAmount: BN } {\n const zeroForOne = outputTokenMint.toBase58() === poolInfo.mintB.address;\n\n const allNeededAccounts: PublicKey[] = [];\n const {\n isExist,\n startIndex: firstTickArrayStartIndex,\n nextAccountMeta,\n } = this.getFirstInitializedTickArray(poolInfo, zeroForOne);\n if (!isExist || firstTickArrayStartIndex === undefined || !nextAccountMeta) throw new Error(\"Invalid tick array\");\n\n try {\n const preTick = this.preInitializedTickArrayStartIndex(poolInfo, zeroForOne);\n if (preTick.isExist) {\n const { publicKey: address } = getPdaTickArrayAddress(poolInfo.programId, poolInfo.id, preTick.nextStartIndex);\n allNeededAccounts.push(address);\n }\n } catch (e) {\n /* empty */\n }\n\n allNeededAccounts.push(nextAccountMeta);\n const {\n amountCalculated: inputAmount,\n accounts: reaminAccounts,\n sqrtPriceX64: executionPrice,\n feeAmount,\n } = SwapMath.swapCompute(\n poolInfo.programId,\n poolInfo.id,\n tickArrayCache,\n poolInfo.tickArrayBitmap,\n poolInfo.exBitmapInfo,\n zeroForOne,\n poolInfo.ammConfig.tradeFeeRate,\n poolInfo.liquidity,\n poolInfo.tickCurrent,\n poolInfo.tickSpacing,\n poolInfo.sqrtPriceX64,\n outputAmount.mul(NEGATIVE_ONE),\n firstTickArrayStartIndex,\n sqrtPriceLimitX64,\n );\n allNeededAccounts.push(...reaminAccounts);\n return { expectedAmountIn: inputAmount, remainingAccounts: allNeededAccounts, executionPrice, feeAmount };\n }\n\n public static getFirstInitializedTickArray(\n poolInfo: ComputeClmmPoolInfo,\n zeroForOne: boolean,\n ):\n | { isExist: true; startIndex: number; nextAccountMeta: PublicKey }\n | { isExist: false; startIndex: undefined; nextAccountMeta: undefined } {\n const { isInitialized, startIndex } = PoolUtils.isOverflowDefaultTickarrayBitmap(poolInfo.tickSpacing, [\n poolInfo.tickCurrent,\n ])\n ? TickArrayBitmapExtensionUtils.checkTickArrayIsInit(\n TickQuery.getArrayStartIndex(poolInfo.tickCurrent, poolInfo.tickSpacing),\n poolInfo.tickSpacing,\n poolInfo.exBitmapInfo,\n )\n : TickUtils.checkTickArrayIsInitialized(\n TickUtils.mergeTickArrayBitmap(poolInfo.tickArrayBitmap),\n poolInfo.tickCurrent,\n poolInfo.tickSpacing,\n );\n\n if (isInitialized) {\n const { publicKey: address } = getPdaTickArrayAddress(poolInfo.programId, poolInfo.id, startIndex);\n return {\n isExist: true,\n startIndex,\n nextAccountMeta: address,\n };\n }\n const { isExist, nextStartIndex } = this.nextInitializedTickArrayStartIndex(\n poolInfo,\n TickQuery.getArrayStartIndex(poolInfo.tickCurrent, poolInfo.tickSpacing),\n zeroForOne,\n );\n if (isExist) {\n const { publicKey: address } = getPdaTickArrayAddress(poolInfo.programId, poolInfo.id, nextStartIndex);\n return {\n isExist: true,\n startIndex: nextStartIndex,\n nextAccountMeta: address,\n };\n }\n return { isExist: false, nextAccountMeta: undefined, startIndex: undefined };\n }\n\n public static preInitializedTickArrayStartIndex(\n poolInfo: ComputeClmmPoolInfo,\n zeroForOne: boolean,\n ): { isExist: boolean; nextStartIndex: number } {\n const currentOffset = Math.floor(poolInfo.tickCurrent / TickQuery.tickCount(poolInfo.tickSpacing));\n\n const result: number[] = !zeroForOne\n ? TickUtils.searchLowBitFromStart(\n poolInfo.tickArrayBitmap,\n poolInfo.exBitmapInfo,\n currentOffset - 1,\n 1,\n poolInfo.tickSpacing,\n )\n : TickUtils.searchHightBitFromStart(\n poolInfo.tickArrayBitmap,\n poolInfo.exBitmapInfo,\n currentOffset + 1,\n 1,\n poolInfo.tickSpacing,\n );\n\n return result.length > 0 ? { isExist: true, nextStartIndex: result[0] } : { isExist: false, nextStartIndex: 0 };\n }\n\n public static nextInitializedTickArrayStartIndex(\n poolInfo:\n | {\n tickCurrent: number;\n tickSpacing: number;\n tickArrayBitmap: BN[];\n exBitmapInfo: TickArrayBitmapExtensionType;\n }\n | ClmmPoolInfo,\n lastTickArrayStartIndex: number,\n zeroForOne: boolean,\n ): { isExist: boolean; nextStartIndex: number } {\n lastTickArrayStartIndex = TickQuery.getArrayStartIndex(poolInfo.tickCurrent, poolInfo.tickSpacing);\n\n // eslint-disable-next-line no-constant-condition\n while (true) {\n const { isInit: startIsInit, tickIndex: startIndex } = TickArrayBitmap.nextInitializedTickArrayStartIndex(\n TickUtils.mergeTickArrayBitmap(poolInfo.tickArrayBitmap),\n lastTickArrayStartIndex,\n poolInfo.tickSpacing,\n zeroForOne,\n );\n if (startIsInit) {\n return { isExist: true, nextStartIndex: startIndex };\n }\n lastTickArrayStartIndex = startIndex;\n\n const { isInit, tickIndex } = TickArrayBitmapExtensionUtils.nextInitializedTickArrayFromOneBitmap(\n lastTickArrayStartIndex,\n poolInfo.tickSpacing,\n zeroForOne,\n poolInfo.exBitmapInfo,\n );\n if (isInit) return { isExist: true, nextStartIndex: tickIndex };\n\n lastTickArrayStartIndex = tickIndex;\n\n if (lastTickArrayStartIndex < MIN_TICK || lastTickArrayStartIndex > MAX_TICK)\n return { isExist: false, nextStartIndex: 0 };\n }\n\n // const tickArrayBitmap = TickUtils.mergeTickArrayBitmap(\n // poolInfo.tickArrayBitmap\n // );\n // const currentOffset = TickUtils.getTickArrayOffsetInBitmapByTick(\n // poolInfo.tickCurrent,\n // poolInfo.tickSpacing\n // );\n // const result: number[] = zeroForOne ? TickUtils.searchLowBitFromStart(\n // tickArrayBitmap,\n // currentOffset - 1,\n // 0,\n // 1,\n // poolInfo.tickSpacing\n // ) : TickUtils.searchHightBitFromStart(\n // tickArrayBitmap,\n // currentOffset,\n // 1024,\n // 1,\n // poolInfo.tickSpacing\n // );\n\n // return result.length > 0 ? { isExist: true, nextStartIndex: result[0] } : { isExist: false, nextStartIndex: 0 }\n }\n\n public static async updatePoolRewardInfos({\n connection,\n apiPoolInfo,\n chainTime,\n poolLiquidity,\n rewardInfos,\n }: {\n connection: Connection;\n apiPoolInfo: ApiV3PoolInfoConcentratedItem;\n chainTime: number;\n poolLiquidity: BN;\n rewardInfos: ClmmPoolRewardLayoutInfo[];\n }): Promise<ClmmPoolRewardInfo[]> {\n const nRewardInfo: ClmmPoolRewardInfo[] = [];\n for (let i = 0; i < rewardInfos.length; i++) {\n const _itemReward = rewardInfos[i];\n const apiRewardProgram =\n apiPoolInfo.rewardDefaultInfos[i]?.mint.programId ??\n (await connection.getAccountInfo(_itemReward.tokenMint))?.owner;\n if (apiRewardProgram === undefined) throw Error(\"get new reward mint info error\");\n\n const itemReward: ClmmPoolRewardInfo = {\n ..._itemReward,\n perSecond: MathUtil.x64ToDecimal(_itemReward.emissionsPerSecondX64),\n remainingRewards: undefined,\n tokenProgramId: new PublicKey(apiRewardProgram),\n };\n\n if (itemReward.tokenMint.equals(PublicKey.default)) continue;\n if (chainTime <= itemReward.openTime.toNumber() || poolLiquidity.eq(ZERO)) {\n nRewardInfo.push(itemReward);\n continue;\n }\n\n const latestUpdateTime = new BN(Math.min(itemReward.endTime.toNumber(), chainTime));\n const timeDelta = latestUpdateTime.sub(itemReward.lastUpdateTime);\n const rewardGrowthDeltaX64 = MathUtil.mulDivFloor(timeDelta, itemReward.emissionsPerSecondX64, poolLiquidity);\n const rewardGrowthGlobalX64 = itemReward.rewardGrowthGlobalX64.add(rewardGrowthDeltaX64);\n const rewardEmissionedDelta = MathUtil.mulDivFloor(timeDelta, itemReward.emissionsPerSecondX64, Q64);\n const rewardTotalEmissioned = itemReward.rewardTotalEmissioned.add(rewardEmissionedDelta);\n nRewardInfo.push({\n ...itemReward,\n rewardGrowthGlobalX64,\n rewardTotalEmissioned,\n lastUpdateTime: latestUpdateTime,\n });\n }\n return nRewardInfo;\n }\n\n public static isOverflowDefaultTickarrayBitmap(tickSpacing: number, tickarrayStartIndexs: number[]): boolean {\n const { maxTickBoundary, minTickBoundary } = this.tickRange(tickSpacing);\n\n for (const tickIndex of tickarrayStartIndexs) {\n const tickarrayStartIndex = TickUtils.getTickArrayStartIndexByTick(tickIndex, tickSpacing);\n\n if (tickarrayStartIndex >= maxTickBoundary || tickarrayStartIndex < minTickBoundary) {\n return true;\n }\n }\n\n return false;\n }\n\n public static tickRange(tickSpacing: number): {\n maxTickBoundary: number;\n minTickBoundary: number;\n } {\n let maxTickBoundary = TickArrayBitmap.maxTickInTickarrayBitmap(tickSpacing);\n let minTickBoundary = -maxTickBoundary;\n\n if (maxTickBoundary > MAX_TICK) {\n maxTickBoundary = TickQuery.getArrayStartIndex(MAX_TICK, tickSpacing) + TickQuery.tickCount(tickSpacing);\n }\n if (minTickBoundary < MIN_TICK) {\n minTickBoundary = TickQuery.getArrayStartIndex(MIN_TICK, tickSpacing);\n }\n return { maxTickBoundary, minTickBoundary };\n }\n\n public static get_tick_array_offset(tickarrayStartIndex: number, tickSpacing: number): number {\n if (!TickQuery.checkIsValidStartIndex(tickarrayStartIndex, tickSpacing)) {\n throw new Error(\"No enough initialized tickArray\");\n }\n\n return (tickarrayStartIndex / TickQuery.tickCount(tickSpacing)) * TICK_ARRAY_BITMAP_SIZE;\n }\n\n static async fetchExBitmaps({\n connection,\n exBitmapAddress,\n batchRequest,\n }: {\n connection: Connection;\n exBitmapAddress: PublicKey[];\n batchRequest: boolean;\n }): Promise<ReturnTypeFetchExBitmaps> {\n const fetchedBitmapAccount = await getMultipleAccountsInfoWithCustomFlags(\n connection,\n exBitmapAddress.map((i) => ({ pubkey: i })),\n { batchRequest },\n );\n\n const returnTypeFetchExBitmaps: ReturnTypeFetchExBitmaps = {};\n for (const item of fetchedBitmapAccount) {\n if (item.accountInfo === null) continue;\n\n returnTypeFetchExBitmaps[item.pubkey.toString()] = TickArrayBitmapExtensionLayout.decode(item.accountInfo.data);\n }\n return returnTypeFetchExBitmaps;\n }\n\n static async fetchMultiplePoolTickArrays({\n connection,\n poolKeys,\n batchRequest,\n }: {\n connection: Connection;\n poolKeys: Omit<ComputeClmmPoolInfo, \"ammConfig\">[];\n batchRequest?: boolean;\n }): Promise<ReturnTypeFetchMultiplePoolTickArrays> {\n const tickArraysToPoolId: { [key: string]: PublicKey } = {};\n const tickArrays: { pubkey: PublicKey }[] = [];\n for (const itemPoolInfo of poolKeys) {\n const currentTickArrayStartIndex = TickUtils.getTickArrayStartIndexByTick(\n itemPoolInfo.tickCurrent,\n itemPoolInfo.tickSpacing,\n );\n const startIndexArray = TickUtils.getInitializedTickArrayInRange(\n itemPoolInfo.tickArrayBitmap,\n itemPoolInfo.exBitmapInfo,\n itemPoolInfo.tickSpacing,\n currentTickArrayStartIndex,\n 7,\n );\n for (const itemIndex of startIndexArray) {\n const { publicKey: tickArrayAddress } = getPdaTickArrayAddress(\n itemPoolInfo.programId,\n itemPoolInfo.id,\n itemIndex,\n );\n tickArrays.push({ pubkey: tickArrayAddress });\n tickArraysToPoolId[tickArrayAddress.toString()] = itemPoolInfo.id;\n }\n }\n\n const fetchedTickArrays = await getMultipleAccountsInfoWithCustomFlags(connection, tickArrays, { batchRequest });\n\n const tickArrayCache: ReturnTypeFetchMultiplePoolTickArrays = {};\n\n for (const itemAccountInfo of fetchedTickArrays) {\n if (!itemAccountInfo.accountInfo) continue;\n const poolId = tickArraysToPoolId[itemAccountInfo.pubkey.toString()];\n if (!poolId) continue;\n if (tickArrayCache[poolId.toString()] === undefined) tickArrayCache[poolId.toString()] = {};\n\n const accountLayoutData = TickArrayLayout.decode(itemAccountInfo.accountInfo.data);\n\n tickArrayCache[poolId.toString()][accountLayoutData.startTickIndex] = {\n ...accountLayoutData,\n address: itemAccountInfo.pubkey,\n };\n }\n return tickArrayCache;\n }\n\n // deprecated, new api doesn't need\n static async fetchPoolsAccountPosition({\n pools,\n connection,\n ownerInfo,\n batchRequest = false,\n updateOwnerRewardAndFee = true,\n }: {\n pools: SDKParsedConcentratedInfo[];\n connection: Connection;\n ownerInfo: { wallet: PublicKey; tokenAccounts: TokenAccountRaw[] };\n batchRequest?: boolean;\n updateOwnerRewardAndFee?: boolean;\n }): Promise<SDKParsedConcentratedInfo[]> {\n const programIds: PublicKey[] = [];\n\n for (let index = 0; index < pools.length; index++) {\n const accountInfo = pools[index];\n\n if (accountInfo === null) continue;\n\n if (!programIds.find((i) => i.equals(accountInfo.state.programId))) programIds.push(accountInfo.state.programId);\n }\n\n if (ownerInfo) {\n const allMint = ownerInfo.tokenAccounts.map((i) => i.accountInfo.mint);\n const allPositionKey: PublicKey[] = [];\n for (const itemMint of allMint) {\n for (const itemProgramId of programIds) {\n allPositionKey.push(getPdaPersonalPositionAddress(itemProgramId, itemMint).publicKey);\n }\n }\n const positionAccountInfos = await getMultipleAccountsInfo(connection, allPositionKey, { batchRequest });\n const keyToTickArrayAddress: { [key: string]: PublicKey } = {};\n for (const itemAccountInfo of positionAccountInfos) {\n if (itemAccountInfo === null) continue;\n // TODO: add check\n\n const position = PositionInfoLayout.decode(itemAccountInfo.data);\n const itemPoolId = position.poolId.toString();\n const poolInfoA = pools.find((pool) => pool.state.id.toBase58() === itemPoolId);\n if (poolInfoA === undefined) continue;\n\n const poolInfo = poolInfoA.state;\n\n const priceLower = TickUtils._getTickPriceLegacy({\n poolInfo,\n tick: position.tickLower,\n baseIn: true,\n });\n const priceUpper = TickUtils._getTickPriceLegacy({\n poolInfo,\n tick: position.tickUpper,\n baseIn: true,\n });\n const { amountA, amountB } = LiquidityMath.getAmountsFromLiquidity(\n poolInfo.sqrtPriceX64,\n priceLower.tickSqrtPriceX64,\n priceUpper.tickSqrtPriceX64,\n position.liquidity,\n false,\n );\n\n const leverage = 1 / (1 - Math.sqrt(Math.sqrt(priceLower.price.div(priceUpper.price).toNumber())));\n\n poolInfoA.positionAccount = [\n ...(poolInfoA.positionAccount ?? []),\n {\n poolId: position.poolId,\n nftMint: position.nftMint,\n\n priceLower: priceLower.price,\n priceUpper: priceUpper.price,\n amountA,\n amountB,\n tickLower: position.tickLower,\n tickUpper: position.tickUpper,\n liquidity: position.liquidity,\n feeGrowthInsideLastX64A: position.feeGrowthInsideLastX64A,\n feeGrowthInsideLastX64B: position.feeGrowthInsideLastX64B,\n tokenFeesOwedA: position.tokenFeesOwedA,\n tokenFeesOwedB: position.tokenFeesOwedB,\n rewardInfos: position.rewardInfos.map((i) => ({\n ...i,\n pendingReward: new BN(0),\n })),\n\n leverage,\n tokenFeeAmountA: new BN(0),\n tokenFeeAmountB: new BN(0),\n },\n ];\n\n const tickArrayLowerAddress = await TickUtils.getTickArrayAddressByTick(\n poolInfoA.state.programId,\n position.poolId,\n position.tickLower,\n poolInfoA.state.tickSpacing,\n );\n const tickArrayUpperAddress = await TickUtils.getTickArrayAddressByTick(\n poolInfoA.state.programId,\n position.poolId,\n position.tickUpper,\n poolInfoA.state.tickSpacing,\n );\n keyToTickArrayAddress[\n `${poolInfoA.state.programId.toString()}-${position.poolId.toString()}-${position.tickLower}`\n ] = tickArrayLowerAddress;\n keyToTickArrayAddress[\n `${poolInfoA.state.programId.toString()}-${position.poolId.toString()}-${position.tickUpper}`\n ] = tickArrayUpperAddress;\n }\n\n if (updateOwnerRewardAndFee) {\n const tickArrayKeys = Object.values(keyToTickArrayAddress);\n const tickArrayDatas = await getMultipleAccountsInfo(connection, tickArrayKeys, { batchRequest });\n const tickArrayLayout = {};\n for (let index = 0; index < tickArrayKeys.length; index++) {\n const tickArrayData = tickArrayDatas[index];\n if (tickArrayData === null) continue;\n const key = tickArrayKeys[index].toString();\n tickArrayLayout[key] = TickArrayLayout.decode(tickArrayData.data);\n }\n\n for (const { state, positionAccount } of pools) {\n if (!positionAccount) continue;\n for (const itemPA of positionAccount) {\n const keyLower = `${state.programId.toString()}-${state.id.toString()}-${itemPA.tickLower}`;\n const keyUpper = `${state.programId.toString()}-${state.id.toString()}-${itemPA.tickUpper}`;\n const tickArrayLower = tickArrayLayout[keyToTickArrayAddress[keyLower].toString()];\n const tickArrayUpper = tickArrayLayout[keyToTickArrayAddress[keyUpper].toString()];\n const tickLowerState: Tick =\n tickArrayLower.ticks[TickUtils.getTickOffsetInArray(itemPA.tickLower, state.tickSpacing)];\n const tickUpperState: Tick =\n tickArrayUpper.ticks[TickUtils.getTickOffsetInArray(itemPA.tickUpper, state.tickSpacing)];\n const { tokenFeeAmountA, tokenFeeAmountB } = await PositionUtils.GetPositionFees(\n state,\n itemPA,\n tickLowerState,\n tickUpperState,\n );\n const rewardInfos = await PositionUtils.GetPositionRewards(state, itemPA, tickLowerState, tickUpperState);\n itemPA.tokenFeeAmountA = tokenFeeAmountA.gte(new BN(0)) ? tokenFeeAmountA : new BN(0);\n itemPA.tokenFeeAmountB = tokenFeeAmountB.gte(new BN(0)) ? tokenFeeAmountB : new BN(0);\n for (let i = 0; i < rewardInfos.length; i++) {\n itemPA.rewardInfos[i].pendingReward = rewardInfos[i].gte(new BN(0)) ? rewardInfos[i] : new BN(0);\n }\n }\n }\n }\n }\n return pools;\n }\n\n static computeAmountOut({\n poolInfo,\n tickArrayCache,\n baseMint,\n epochInfo,\n amountIn,\n slippage,\n priceLimit = new Decimal(0),\n catchLiquidityInsufficient = false,\n }: {\n poolInfo: ComputeClmmPoolInfo;\n tickArrayCache: { [key: string]: TickArray };\n baseMint: PublicKey;\n\n epochInfo: EpochInfo;\n\n amountIn: BN;\n slippage: number;\n priceLimit?: Decimal;\n catchLiquidityInsufficient: boolean;\n }): ReturnTypeComputeAmountOut {\n let sqrtPriceLimitX64: BN;\n const isBaseIn = baseMint.toBase58() === poolInfo.mintA.address;\n const [baseFeeConfig, outFeeConfig] = isBaseIn\n ? [poolInfo.mintA.extensions.feeConfig, poolInfo.mintB.extensions.feeConfig]\n : [poolInfo.mintB.extensions.feeConfig, poolInfo.mintA.extensions.feeConfig];\n\n if (priceLimit.equals(new Decimal(0))) {\n sqrtPriceLimitX64 = isBaseIn ? MIN_SQRT_PRICE_X64.add(new BN(1)) : MAX_SQRT_PRICE_X64.sub(new BN(1));\n } else {\n sqrtPriceLimitX64 = SqrtPriceMath.priceToSqrtPriceX64(\n priceLimit,\n poolInfo.mintA.decimals,\n poolInfo.mintB.decimals,\n );\n }\n\n const realAmountIn = getTransferAmountFeeV2(amountIn, baseFeeConfig, epochInfo, false);\n\n const {\n allTrade,\n expectedAmountOut: _expectedAmountOut,\n remainingAccounts,\n executionPrice: _executionPriceX64,\n feeAmount,\n } = PoolUtils.getOutputAmountAndRemainAccounts(\n poolInfo,\n tickArrayCache,\n baseMint,\n realAmountIn.amount.sub(realAmountIn.fee ?? ZERO),\n sqrtPriceLimitX64,\n catchLiquidityInsufficient,\n );\n\n const amountOut = getTransferAmountFeeV2(_expectedAmountOut, outFeeConfig, epochInfo, false);\n\n const _executionPrice = SqrtPriceMath.sqrtPriceX64ToPrice(\n _executionPriceX64,\n poolInfo.mintA.decimals,\n poolInfo.mintB.decimals,\n );\n const executionPrice = isBaseIn ? _executionPrice : new Decimal(1).div(_executionPrice);\n\n const _minAmountOut = _expectedAmountOut\n .mul(new BN(Math.floor((1 - slippage) * 10000000000)))\n .div(new BN(10000000000));\n const minAmountOut = getTransferAmountFeeV2(_minAmountOut, outFeeConfig, epochInfo, false);\n\n const poolPrice = isBaseIn ? poolInfo.currentPrice : new Decimal(1).div(poolInfo.currentPrice);\n\n const _numerator = new Decimal(executionPrice).sub(poolPrice).abs();\n const _denominator = poolPrice;\n const priceImpact = new Percent(\n new Decimal(_numerator).mul(10 ** 15).toFixed(0),\n new Decimal(_denominator).mul(10 ** 15).toFixed(0),\n );\n\n return {\n allTrade,\n realAmountIn,\n amountOut,\n minAmountOut,\n expirationTime: minExpirationTime(realAmountIn.expirationTime, amountOut.expirationTime),\n currentPrice: poolInfo.currentPrice,\n executionPrice,\n priceImpact,\n fee: feeAmount,\n remainingAccounts,\n executionPriceX64: _executionPriceX64,\n };\n }\n\n static computeAmountOutFormat({\n poolInfo,\n tickArrayCache,\n amountIn,\n tokenOut: _tokenOut,\n slippage,\n epochInfo,\n catchLiquidityInsufficient = false,\n }: {\n poolInfo: ComputeClmmPoolInfo;\n tickArrayCache: { [key: string]: TickArray };\n amountIn: BN;\n tokenOut: ApiV3Token;\n slippage: number;\n epochInfo: EpochInfo;\n catchLiquidityInsufficient?: boolean;\n }): ReturnTypeComputeAmountOutFormat {\n const baseIn = _tokenOut.address === poolInfo.mintB.address;\n const [inputMint, outMint] = baseIn ? [poolInfo.mintA, poolInfo.mintB] : [poolInfo.mintB, poolInfo.mintA];\n const [baseToken, outToken] = [\n new Token({\n ...inputMint,\n mint: inputMint.address,\n isToken2022: inputMint.programId === TOKEN_2022_PROGRAM_ID.toBase58(),\n }),\n new Token({\n ...outMint,\n mint: outMint.address,\n isToken2022: outMint.programId === TOKEN_2022_PROGRAM_ID.toBase58(),\n }),\n ];\n\n const {\n allTrade,\n realAmountIn: _realAmountIn,\n amountOut: _amountOut,\n minAmountOut: _minAmountOut,\n expirationTime,\n currentPrice,\n executionPrice,\n priceImpact,\n fee,\n remainingAccounts,\n executionPriceX64,\n } = PoolUtils.computeAmountOut({\n poolInfo,\n tickArrayCache,\n baseMint: new PublicKey(inputMint.address),\n amountIn,\n slippage,\n epochInfo,\n catchLiquidityInsufficient,\n });\n\n const realAmountIn = {\n ..._realAmountIn,\n amount: new TokenAmount(baseToken, _realAmountIn.amount),\n fee: _realAmountIn.fee === undefined ? undefined : new TokenAmount(baseToken, _realAmountIn.fee),\n };\n\n const amountOut = {\n ..._amountOut,\n amount: new TokenAmount(outToken, _amountOut.amount),\n fee: _amountOut.fee === undefined ? undefined : new TokenAmount(outToken, _amountOut.fee),\n };\n const minAmountOut = {\n ..._minAmountOut,\n amount: new TokenAmount(outToken, _minAmountOut.amount),\n fee: _minAmountOut.fee === undefined ? undefined : new TokenAmount(outToken, _minAmountOut.fee),\n };\n\n const _currentPrice = new Price({\n baseToken,\n denominator: new BN(10).pow(new BN(20 + baseToken.decimals)),\n quoteToken: outToken,\n numerator: currentPrice.mul(new Decimal(10 ** (20 + outToken.decimals))).toFixed(0),\n });\n const _executionPrice = new Price({\n baseToken,\n denominator: new BN(10).pow(new BN(20 + baseToken.decimals)),\n quoteToken: outToken,\n numerator: executionPrice.mul(new Decimal(10 ** (20 + outToken.decimals))).toFixed(0),\n });\n const _fee = new TokenAmount(baseToken, fee);\n\n return {\n allTrade,\n realAmountIn,\n amountOut,\n minAmountOut,\n expirationTime,\n currentPrice: _currentPrice,\n executionPrice: _executionPrice,\n priceImpact,\n fee: _fee,\n remainingAccounts,\n executionPriceX64,\n };\n }\n\n static computeAmountIn({\n poolInfo,\n tickArrayCache,\n baseMint,\n epochInfo,\n amountOut,\n slippage,\n priceLimit = new Decimal(0),\n }: {\n poolInfo: ComputeClmmPoolInfo;\n tickArrayCache: { [key: string]: TickArray };\n baseMint: PublicKey;\n\n epochInfo: EpochInfo;\n\n amountOut: BN;\n slippage: number;\n priceLimit?: Decimal;\n }): ReturnTypeComputeAmountOutBaseOut {\n const isBaseIn = baseMint.toBase58() === poolInfo.mintA.address;\n const feeConfigs = {\n [poolInfo.mintA.address]: poolInfo.mintA.extensions.feeConfig,\n [poolInfo.mintB.address]: poolInfo.mintB.extensions.feeConfig,\n };\n\n let sqrtPriceLimitX64: BN;\n if (priceLimit.equals(new Decimal(0))) {\n sqrtPriceLimitX64 = !isBaseIn ? MIN_SQRT_PRICE_X64.add(new BN(1)) : MAX_SQRT_PRICE_X64.sub(new BN(1));\n } else {\n sqrtPriceLimitX64 = SqrtPriceMath.priceToSqrtPriceX64(\n priceLimit,\n poolInfo.mintA.decimals,\n poolInfo.mintB.decimals,\n );\n }\n\n const realAmountOut = getTransferAmountFeeV2(amountOut, feeConfigs[baseMint.toString()], epochInfo, true);\n\n const {\n expectedAmountIn: _expectedAmountIn,\n remainingAccounts,\n executionPrice: _executionPriceX64,\n feeAmount,\n } = PoolUtils.getInputAmountAndRemainAccounts(\n poolInfo,\n tickArrayCache,\n baseMint,\n realAmountOut.amount.sub(realAmountOut.fee ?? ZERO),\n sqrtPriceLimitX64,\n );\n\n const inMint = isBaseIn ? poolInfo.mintB.address : poolInfo.mintA.address;\n\n const amountIn = getTransferAmountFeeV2(_expectedAmountIn, feeConfigs[inMint], epochInfo, false);\n // const amountIn = getTransferAmountFee(\n // _expectedAmountIn,\n // token2022Infos[inMint.toString()]?.feeConfig,\n // epochInfo,\n // true,\n // );\n\n const _executionPrice = SqrtPriceMath.sqrtPriceX64ToPrice(\n _executionPriceX64,\n poolInfo.mintA.decimals,\n poolInfo.mintB.decimals,\n );\n const executionPrice = isBaseIn ? _executionPrice : new Decimal(1).div(_executionPrice);\n\n const _maxAmountIn = _expectedAmountIn\n .mul(new BN(Math.floor((1 + slippage) * 10000000000)))\n .div(new BN(10000000000));\n // const maxAmountIn = getTransferAmountFee(\n // _maxAmountIn,\n // token2022Infos[inMint.toString()]?.feeConfig,\n // epochInfo,\n // true,\n // );\n const maxAmountIn = getTransferAmountFeeV2(_maxAmountIn, feeConfigs[inMint], epochInfo, true);\n\n const poolPrice = isBaseIn ? poolInfo.currentPrice : new Decimal(1).div(poolInfo.currentPrice);\n\n const _numerator = new Decimal(executionPrice).sub(poolPrice).abs();\n const _denominator = poolPrice;\n const priceImpact = new Percent(\n new Decimal(_numerator).mul(10 ** 15).toFixed(0),\n new Decimal(_denominator).mul(10 ** 15).toFixed(0),\n );\n\n return {\n amountIn,\n maxAmountIn,\n realAmountOut,\n expirationTime: minExpirationTime(amountIn.expirationTime, realAmountOut.expirationTime),\n currentPrice: poolInfo.currentPrice,\n executionPrice,\n priceImpact,\n fee: feeAmount,\n\n remainingAccounts,\n };\n }\n\n static estimateAprsForPriceRangeMultiplier({\n poolInfo,\n aprType,\n positionTickLowerIndex,\n positionTickUpperIndex,\n }: {\n poolInfo: ApiV3PoolInfoConcentratedItem;\n aprType: \"day\" | \"week\" | \"month\";\n\n positionTickLowerIndex: number;\n positionTickUpperIndex: number;\n }): {\n feeApr: number;\n rewardsApr: number[];\n apr: number;\n } {\n const aprInfo = poolInfo[aprType];\n\n const priceLower = TickUtils.getTickPrice({\n poolInfo,\n tick: positionTickLowerIndex,\n baseIn: true,\n }).price.toNumber();\n const priceUpper = TickUtils.getTickPrice({\n poolInfo,\n tick: positionTickUpperIndex,\n baseIn: true,\n }).price.toNumber();\n\n const _minPrice = Math.max(priceLower, aprInfo.priceMin);\n const _maxPrice = Math.min(priceUpper, aprInfo.priceMax);\n\n const sub = _maxPrice - _minPrice;\n\n const userRange = priceUpper - priceLower;\n const tradeRange = aprInfo.priceMax - aprInfo.priceMin;\n\n let p: number;\n\n if (sub <= 0) p = 0;\n else if (userRange === sub) p = tradeRange / sub;\n else if (tradeRange === sub) p = sub / userRange;\n else p = (sub / tradeRange) * (sub / userRange);\n\n return {\n feeApr: aprInfo.feeApr * p,\n rewardsApr: [(aprInfo.rewardApr[0] ?? 0) * p, (aprInfo.rewardApr[1] ?? 0) * p, (aprInfo.rewardApr[2] ?? 0) * p],\n apr: aprInfo.apr * p,\n };\n }\n\n static estimateAprsForPriceRangeDelta({\n poolInfo,\n poolLiquidity,\n aprType,\n mintPrice,\n liquidity,\n positionTickLowerIndex,\n positionTickUpperIndex,\n chainTime,\n network,\n }: {\n poolInfo: ApiV3PoolInfoConcentratedItem;\n poolLiquidity: BN;\n aprType: \"day\" | \"week\" | \"month\";\n\n mintPrice: { [mint: string]: { value: number } };\n\n liquidity: BN;\n positionTickLowerIndex: number;\n positionTickUpperIndex: number;\n\n chainTime: number;\n network: NetworkName;\n }): {\n feeApr: number;\n rewardsApr: number[];\n apr: number;\n } {\n const aprTypeDay = aprType === \"day\" ? 1 : aprType === \"week\" ? 7 : aprType === \"month\" ? 30 : 0;\n const aprInfo = poolInfo[aprType];\n const mintPriceA = mintPrice[solToWSol(poolInfo.mintA.address, network).toString()];\n const mintPriceB = mintPrice[solToWSol(poolInfo.mintB.address, network).toString()];\n const mintDecimalsA = poolInfo.mintA.decimals;\n const mintDecimalsB = poolInfo.mintB.decimals;\n\n if (!aprInfo || !mintPriceA || !mintPriceB) return { feeApr: 0, rewardsApr: [0, 0, 0], apr: 0 };\n\n const sqrtPriceX64 = SqrtPriceMath.priceToSqrtPriceX64(\n new Decimal(poolInfo.price),\n poolInfo.mintA.decimals,\n poolInfo.mintB.decimals,\n );\n\n const sqrtPriceX64A = SqrtPriceMath.getSqrtPriceX64FromTick(positionTickLowerIndex);\n const sqrtPriceX64B = SqrtPriceMath.getSqrtPriceX64FromTick(positionTickUpperIndex);\n\n const { amountSlippageA: poolLiquidityA, amountSlippageB: poolLiquidityB } =\n LiquidityMath.getAmountsFromLiquidityWithSlippage(\n sqrtPriceX64,\n sqrtPriceX64A,\n sqrtPriceX64B,\n poolLiquidity,\n false,\n false,\n 0,\n );\n\n const { amountSlippageA: userLiquidityA, amountSlippageB: userLiquidityB } =\n LiquidityMath.getAmountsFromLiquidityWithSlippage(\n sqrtPriceX64,\n sqrtPriceX64A,\n sqrtPriceX64B,\n liquidity,\n false,\n false,\n 0,\n );\n\n const poolTvl = new Decimal(poolLiquidityA.toString())\n .div(new Decimal(10).pow(mintDecimalsA))\n .mul(mintPriceA.value)\n .add(new Decimal(poolLiquidityB.toString()).div(new Decimal(10).pow(mintDecimalsB)).mul(mintPriceB.value));\n const userTvl = new Decimal(userLiquidityA.toString())\n .div(new Decimal(10).pow(mintDecimalsA))\n .mul(mintPriceA.value)\n .add(new Decimal(userLiquidityB.toString()).div(new Decimal(10).pow(mintDecimalsB)).mul(mintPriceB.value));\n\n const p = new Decimal(1).div(poolTvl.add(userTvl));\n\n const feesPerYear = new Decimal(aprInfo.volumeFee).mul(365).div(aprTypeDay);\n const feeApr = feesPerYear.mul(p).mul(100).toNumber();\n\n const SECONDS_PER_YEAR = 3600 * 24 * 365;\n\n const rewardsApr = poolInfo.rewardDefaultInfos.map((i) => {\n const iDecimal = i.mint.decimals;\n const iPrice = mintPrice[i.mint.address];\n\n if (\n chainTime < ((i as any).startTime ?? 0) ||\n chainTime > ((i as any).endTime ?? 0) ||\n !i.perSecond ||\n !iPrice ||\n iDecimal === undefined\n )\n return 0;\n\n return new Decimal(iPrice.value)\n .mul(new Decimal(i.perSecond).mul(SECONDS_PER_YEAR))\n .div(new Decimal(10).pow(iDecimal))\n .mul(p)\n .mul(100)\n .toNumber();\n });\n\n return {\n feeApr,\n rewardsApr,\n apr: feeApr + rewardsApr.reduce((a, b) => a + b, 0),\n };\n }\n\n static getLiquidityAmountOutFromAmountIn({\n poolInfo,\n inputA,\n tickLower,\n tickUpper,\n amount,\n slippage,\n add,\n epochInfo,\n amountHasFee,\n }: {\n poolInfo: ApiV3PoolInfoConcentratedItem;\n inputA: boolean;\n tickLower: number;\n tickUpper: number;\n amount: BN;\n slippage: number;\n add: boolean;\n epochInfo: EpochInfo;\n amountHasFee: boolean;\n }): Promise<ReturnTypeGetLiquidityAmountOut> {\n const sqrtPriceX64 = SqrtPriceMath.priceToSqrtPriceX64(\n new Decimal(poolInfo.price),\n poolInfo.mintA.decimals,\n poolInfo.mintB.decimals,\n );\n const sqrtPriceX64A = SqrtPriceMath.getSqrtPriceX64FromTick(tickLower);\n const sqrtPriceX64B = SqrtPriceMath.getSqrtPriceX64FromTick(tickUpper);\n\n const coefficient = add ? 1 - slippage : 1 + slippage;\n const addFeeAmount = getTransferAmountFeeV2(\n amount,\n poolInfo[inputA ? \"mintA\" : \"mintB\"].extensions?.feeConfig,\n epochInfo,\n !amountHasFee,\n );\n const _amount = new BN(\n new Decimal(addFeeAmount.amount.sub(addFeeAmount.fee ?? ZERO).toString()).mul(coefficient).toFixed(0),\n );\n\n let liquidity: BN;\n if (sqrtPriceX64.lte(sqrtPriceX64A)) {\n liquidity = inputA\n ? LiquidityMath.getLiquidityFromTokenAmountA(sqrtPriceX64A, sqrtPriceX64B, _amount, !add)\n : new BN(0);\n } else if (sqrtPriceX64.lte(sqrtPriceX64B)) {\n const liquidity0 = LiquidityMath.getLiquidityFromTokenAmountA(sqrtPriceX64, sqrtPriceX64B, _amount, !add);\n const liquidity1 = LiquidityMath.getLiquidityFromTokenAmountB(sqrtPriceX64A, sqrtPriceX64, _amount);\n liquidity = inputA ? liquidity0 : liquidity1;\n } else {\n liquidity = inputA\n ? new BN(0)\n : LiquidityMath.getLiquidityFromTokenAmountB(sqrtPriceX64A, sqrtPriceX64B, _amount);\n }\n\n return PoolUtils.getAmountsFromLiquidity({\n epochInfo,\n poolInfo,\n tickLower,\n tickUpper,\n liquidity,\n slippage,\n add,\n });\n }\n\n static async getAmountsFromLiquidity({\n epochInfo,\n poolInfo,\n tickLower,\n tickUpper,\n liquidity,\n slippage,\n add,\n }: {\n epochInfo: EpochInfo;\n poolInfo: ApiV3PoolInfoConcentratedItem;\n tickLower: number;\n tickUpper: number;\n liquidity: BN;\n slippage: number;\n add: boolean;\n }): Promise<ReturnTypeGetLiquidityAmountOut> {\n const sqrtPriceX64A = SqrtPriceMath.getSqrtPriceX64FromTick(tickLower);\n const sqrtPriceX64B = SqrtPriceMath.getSqrtPriceX64FromTick(tickUpper);\n\n const coefficientRe = add ? 1 + slippage : 1 - slippage;\n\n const amounts = LiquidityMath.getAmountsFromLiquidity(\n SqrtPriceMath.priceToSqrtPriceX64(new Decimal(poolInfo.price), poolInfo.mintA.decimals, poolInfo.mintB.decimals),\n sqrtPriceX64A,\n sqrtPriceX64B,\n liquidity,\n add,\n );\n const [amountA, amountB] = [\n getTransferAmountFeeV2(amounts.amountA, poolInfo.mintA.extensions?.feeConfig, epochInfo, true),\n getTransferAmountFeeV2(amounts.amountB, poolInfo.mintB.extensions?.feeConfig, epochInfo, true),\n ];\n const [amountSlippageA, amountSlippageB] = [\n getTransferAmountFeeV2(\n amounts.amountA.muln(coefficientRe),\n poolInfo.mintA.extensions?.feeConfig,\n epochInfo,\n true,\n ),\n getTransferAmountFeeV2(\n amounts.amountB.muln(coefficientRe),\n poolInfo.mintB.extensions?.feeConfig,\n epochInfo,\n true,\n ),\n ];\n\n return {\n liquidity,\n amountA,\n amountB,\n amountSlippageA,\n amountSlippageB,\n expirationTime: minExpirationTime(amountA.expirationTime, amountB.expirationTime),\n };\n }\n\n static async fetchComputeMultipleClmmInfo({\n connection,\n poolList,\n rpcDataMap = {},\n }: {\n rpcDataMap?: Record<string, ReturnType<typeof PoolInfoLayout.decode>>;\n connection: Connection;\n poolList: Pick<ApiV3PoolInfoConcentratedItem, \"id\" | \"programId\" | \"mintA\" | \"mintB\" | \"config\" | \"price\">[];\n }): Promise<Record<string, ComputeClmmPoolInfo>> {\n const fetchRpcList = poolList.filter((p) => !rpcDataMap[p.id]).map((p) => new PublicKey(p.id));\n const rpcRes = await getMultipleAccountsInfo(connection, fetchRpcList);\n rpcRes.forEach((r, idx) => {\n if (!r) return;\n rpcDataMap[fetchRpcList[idx].toBase58()] = PoolInfoLayout.decode(r.data);\n });\n\n const pdaList = poolList.map(\n (poolInfo) => getPdaExBitmapAccount(new PublicKey(poolInfo.programId), new PublicKey(poolInfo.id)).publicKey,\n );\n\n const exBitData = await PoolUtils.fetchExBitmaps({\n connection,\n exBitmapAddress: pdaList,\n batchRequest: false,\n });\n\n return poolList.reduce(\n (acc, cur) => ({\n ...acc,\n [cur.id]: {\n ...rpcDataMap[cur.id],\n id: new PublicKey(cur.id),\n version: 6,\n programId: new PublicKey(cur.programId),\n mintA: cur.mintA,\n mintB: cur.mintB,\n ammConfig: {\n ...cur.config,\n id: new PublicKey(cur.config.id),\n fundOwner: \"\",\n },\n currentPrice: new Decimal(cur.price),\n exBitmapAccount: getPdaExBitmapAccount(new PublicKey(cur.programId), new PublicKey(cur.id)).publicKey,\n exBitmapInfo:\n exBitData[getPdaExBitmapAccount(new PublicKey(cur.programId), new PublicKey(cur.id)).publicKey.toBase58()],\n startTime: rpcDataMap[cur.id].startTime.toNumber(),\n rewardInfos: rpcDataMap[cur.id].rewardInfos,\n },\n }),\n {} as Record<string, ComputeClmmPoolInfo>,\n );\n }\n\n static async fetchComputeClmmInfo({\n connection,\n poolInfo,\n rpcData,\n }: {\n connection: Connection;\n poolInfo: Pick<ApiV3PoolInfoConcentratedItem, \"id\" | \"programId\" | \"mintA\" | \"mintB\" | \"config\" | \"price\">;\n rpcData?: ReturnType<typeof PoolInfoLayout.decode>;\n }): Promise<ComputeClmmPoolInfo> {\n return (\n await this.fetchComputeMultipleClmmInfo({\n connection,\n rpcDataMap: rpcData ? { [poolInfo.id]: rpcData } : undefined,\n poolList: [poolInfo],\n })\n )[poolInfo.id];\n }\n}\n\nexport function getLiquidityFromAmounts({\n poolInfo,\n tickLower,\n tickUpper,\n amountA,\n amountB,\n slippage,\n add,\n epochInfo,\n amountHasFee,\n}: {\n poolInfo: ApiV3PoolInfoConcentratedItem;\n tickLower: number;\n tickUpper: number;\n amountA: BN;\n amountB: BN;\n slippage: number;\n add: boolean;\n epochInfo: EpochInfo;\n amountHasFee: boolean;\n}): ReturnTypeGetLiquidityAmountOut {\n const [_tickLower, _tickUpper, _amountA, _amountB] =\n tickLower < tickUpper ? [tickLower, tickUpper, amountA, amountB] : [tickUpper, tickLower, amountB, amountA];\n const sqrtPriceX64 = SqrtPriceMath.priceToSqrtPriceX64(\n new Decimal(poolInfo.price),\n poolInfo.mintA.decimals,\n poolInfo.mintB.decimals,\n );\n const sqrtPriceX64A = SqrtPriceMath.getSqrtPriceX64FromTick(_tickLower);\n const sqrtPriceX64B = SqrtPriceMath.getSqrtPriceX64FromTick(_tickUpper);\n\n const [amountFeeA, amountFeeB] = [\n getTransferAmountFeeV2(_amountA, poolInfo.mintA.extensions?.feeConfig, epochInfo, !amountHasFee),\n getTransferAmountFeeV2(_amountB, poolInfo.mintB.extensions?.feeConfig, epochInfo, !amountHasFee),\n ];\n\n const liquidity = LiquidityMath.getLiquidityFromTokenAmounts(\n sqrtPriceX64,\n sqrtPriceX64A,\n sqrtPriceX64B,\n amountFeeA.amount.sub(amountFeeA.fee ?? ZERO),\n amountFeeB.amount.sub(amountFeeB.fee ?? ZERO),\n );\n\n return LiquidityMath.getAmountsOutFromLiquidity({\n poolInfo,\n tickLower,\n tickUpper,\n liquidity,\n slippage,\n add,\n epochInfo,\n amountAddFee: !amountHasFee,\n });\n}\n\nconst mockRewardData = {\n volume: 0,\n volumeQuote: 0,\n volumeFee: 0,\n apr: 0,\n feeApr: 0,\n priceMin: 0,\n priceMax: 0,\n rewardApr: [],\n};\n\nexport function clmmComputeInfoToApiInfo(pool: ComputeClmmPoolInfo): ApiV3PoolInfoConcentratedItem {\n return {\n ...pool,\n type: \"Concentrated\",\n programId: pool.programId.toString(),\n id: pool.id.toString(),\n rewardDefaultInfos: [],\n rewardDefaultPoolInfos: \"Clmm\",\n price: pool.currentPrice.toNumber(),\n mintAmountA: 0,\n mintAmountB: 0,\n feeRate: pool.ammConfig.tradeFeeRate,\n openTime: pool.startTime.toString(),\n tvl: 0,\n\n day: mockRewardData,\n week: mockRewardData,\n month: mockRewardData,\n pooltype: [],\n\n farmUpcomingCount: 0,\n farmOngoingCount: 0,\n farmFinishedCount: 0,\n burnPercent: 0,\n config: {\n ...pool.ammConfig,\n id: pool.ammConfig.id.toString(),\n defaultRange: 0,\n defaultRangePoint: [],\n },\n };\n}\n","import BN from \"bn.js\";\n\nimport Decimal from \"decimal.js\";\nimport { getTransferAmountFeeV2, minExpirationTime } from \"../../../common\";\nimport { ClmmPositionLayout } from \"../layout\";\nimport { ClmmPoolInfo, ClmmPoolPersonalPosition, ClmmPoolRewardInfo, GetAmountParams, ReturnTypeGetLiquidityAmountOut } from \"../type\";\nimport { Q64 } from \"./constants\";\nimport { LiquidityMath, MathUtil, SqrtPriceMath } from \"./math\";\nimport { Tick } from \"./tick\";\n\nexport class PositionUtils {\n static getfeeGrowthInside(\n poolState: Pick<ClmmPoolInfo, \"tickCurrent\" | \"feeGrowthGlobalX64A\" | \"feeGrowthGlobalX64B\">,\n tickLowerState: Tick,\n tickUpperState: Tick,\n ): { feeGrowthInsideX64A: BN; feeGrowthInsideBX64: BN } {\n let feeGrowthBelowX64A = new BN(0);\n let feeGrowthBelowX64B = new BN(0);\n if (poolState.tickCurrent >= tickLowerState.tick) {\n feeGrowthBelowX64A = tickLowerState.feeGrowthOutsideX64A;\n feeGrowthBelowX64B = tickLowerState.feeGrowthOutsideX64B;\n } else {\n feeGrowthBelowX64A = poolState.feeGrowthGlobalX64A.sub(tickLowerState.feeGrowthOutsideX64A);\n feeGrowthBelowX64B = poolState.feeGrowthGlobalX64B.sub(tickLowerState.feeGrowthOutsideX64B);\n }\n\n let feeGrowthAboveX64A = new BN(0);\n let feeGrowthAboveX64B = new BN(0);\n if (poolState.tickCurrent < tickUpperState.tick) {\n feeGrowthAboveX64A = tickUpperState.feeGrowthOutsideX64A;\n feeGrowthAboveX64B = tickUpperState.feeGrowthOutsideX64B;\n } else {\n feeGrowthAboveX64A = poolState.feeGrowthGlobalX64A.sub(tickUpperState.feeGrowthOutsideX64A);\n feeGrowthAboveX64B = poolState.feeGrowthGlobalX64B.sub(tickUpperState.feeGrowthOutsideX64B);\n }\n\n const feeGrowthInsideX64A = MathUtil.wrappingSubU128(\n MathUtil.wrappingSubU128(poolState.feeGrowthGlobalX64A, feeGrowthBelowX64A),\n feeGrowthAboveX64A,\n );\n const feeGrowthInsideBX64 = MathUtil.wrappingSubU128(\n MathUtil.wrappingSubU128(poolState.feeGrowthGlobalX64B, feeGrowthBelowX64B),\n feeGrowthAboveX64B,\n );\n return { feeGrowthInsideX64A, feeGrowthInsideBX64 };\n }\n\n static GetPositionFees(\n ammPool: ClmmPoolInfo,\n positionState: ClmmPoolPersonalPosition,\n tickLowerState: Tick,\n tickUpperState: Tick,\n ): { tokenFeeAmountA: BN; tokenFeeAmountB: BN } {\n const { feeGrowthInsideX64A, feeGrowthInsideBX64 } = this.getfeeGrowthInside(\n ammPool,\n tickLowerState,\n tickUpperState,\n );\n\n const feeGrowthdeltaA = MathUtil.mulDivFloor(\n MathUtil.wrappingSubU128(feeGrowthInsideX64A, positionState.feeGrowthInsideLastX64A),\n positionState.liquidity,\n Q64,\n );\n const tokenFeeAmountA = positionState.tokenFeesOwedA.add(feeGrowthdeltaA);\n\n const feeGrowthdelta1 = MathUtil.mulDivFloor(\n MathUtil.wrappingSubU128(feeGrowthInsideBX64, positionState.feeGrowthInsideLastX64B),\n positionState.liquidity,\n Q64,\n );\n const tokenFeeAmountB = positionState.tokenFeesOwedB.add(feeGrowthdelta1);\n\n return { tokenFeeAmountA, tokenFeeAmountB };\n }\n\n static GetPositionFeesV2(\n ammPool: Pick<ClmmPoolInfo, \"tickCurrent\" | \"feeGrowthGlobalX64A\" | \"feeGrowthGlobalX64B\">,\n positionState: ClmmPositionLayout,\n tickLowerState: Tick,\n tickUpperState: Tick,\n ): { tokenFeeAmountA: BN; tokenFeeAmountB: BN } {\n const { feeGrowthInsideX64A, feeGrowthInsideBX64 } = this.getfeeGrowthInside(\n ammPool,\n tickLowerState,\n tickUpperState,\n );\n\n const feeGrowthdeltaA = MathUtil.mulDivFloor(\n MathUtil.wrappingSubU128(feeGrowthInsideX64A, positionState.feeGrowthInsideLastX64A),\n positionState.liquidity,\n Q64,\n );\n const tokenFeeAmountA = positionState.tokenFeesOwedA.add(feeGrowthdeltaA);\n\n const feeGrowthdelta1 = MathUtil.mulDivFloor(\n MathUtil.wrappingSubU128(feeGrowthInsideBX64, positionState.feeGrowthInsideLastX64B),\n positionState.liquidity,\n Q64,\n );\n const tokenFeeAmountB = positionState.tokenFeesOwedB.add(feeGrowthdelta1);\n\n return { tokenFeeAmountA, tokenFeeAmountB };\n }\n\n static GetPositionRewardsV2(\n ammPool: Pick<ClmmPoolInfo, \"tickCurrent\" | \"feeGrowthGlobalX64B\"> & {\n rewardInfos: { rewardGrowthGlobalX64: BN }[];\n },\n positionState: ClmmPositionLayout,\n tickLowerState: Tick,\n tickUpperState: Tick,\n ): BN[] {\n const rewards: BN[] = [];\n\n const rewardGrowthsInside = this.getRewardGrowthInsideV2(\n ammPool.tickCurrent,\n tickLowerState,\n tickUpperState,\n ammPool.rewardInfos,\n );\n for (let i = 0; i < rewardGrowthsInside.length; i++) {\n const rewardGrowthInside = rewardGrowthsInside[i];\n const currRewardInfo = positionState.rewardInfos[i];\n\n const rewardGrowthDelta = MathUtil.wrappingSubU128(rewardGrowthInside, currRewardInfo.growthInsideLastX64);\n const amountOwedDelta = MathUtil.mulDivFloor(rewardGrowthDelta, positionState.liquidity, Q64);\n const rewardAmountOwed = currRewardInfo.rewardAmountOwed.add(amountOwedDelta);\n rewards.push(rewardAmountOwed);\n }\n return rewards;\n }\n\n static GetPositionRewards(\n ammPool: ClmmPoolInfo,\n positionState: ClmmPoolPersonalPosition,\n tickLowerState: Tick,\n tickUpperState: Tick,\n ): BN[] {\n const rewards: BN[] = [];\n\n const rewardGrowthsInside = this.getRewardGrowthInside(\n ammPool.tickCurrent,\n tickLowerState,\n tickUpperState,\n ammPool.rewardInfos,\n );\n for (let i = 0; i < rewardGrowthsInside.length; i++) {\n const rewardGrowthInside = rewardGrowthsInside[i];\n const currRewardInfo = positionState.rewardInfos[i];\n\n const rewardGrowthDelta = MathUtil.wrappingSubU128(rewardGrowthInside, currRewardInfo.growthInsideLastX64);\n const amountOwedDelta = MathUtil.mulDivFloor(rewardGrowthDelta, positionState.liquidity, Q64);\n const rewardAmountOwed = currRewardInfo.rewardAmountOwed.add(amountOwedDelta);\n rewards.push(rewardAmountOwed);\n }\n return rewards;\n }\n\n static getRewardGrowthInside(\n tickCurrentIndex: number,\n tickLowerState: Tick,\n tickUpperState: Tick,\n rewardInfos: ClmmPoolRewardInfo[],\n ): BN[] {\n const rewardGrowthsInside: BN[] = [];\n for (let i = 0; i < rewardInfos.length; i++) {\n let rewardGrowthsBelow = new BN(0);\n if (tickLowerState.liquidityGross.eqn(0)) {\n rewardGrowthsBelow = rewardInfos[i].rewardGrowthGlobalX64;\n } else if (tickCurrentIndex < tickLowerState.tick) {\n rewardGrowthsBelow = rewardInfos[i].rewardGrowthGlobalX64.sub(tickLowerState.rewardGrowthsOutsideX64[i]);\n } else {\n rewardGrowthsBelow = tickLowerState.rewardGrowthsOutsideX64[i];\n }\n\n let rewardGrowthsAbove = new BN(0);\n if (tickUpperState.liquidityGross.eqn(0)) {\n //\n } else if (tickCurrentIndex < tickUpperState.tick) {\n rewardGrowthsAbove = tickUpperState.rewardGrowthsOutsideX64[i];\n } else {\n rewardGrowthsAbove = rewardInfos[i].rewardGrowthGlobalX64.sub(tickUpperState.rewardGrowthsOutsideX64[i]);\n }\n\n rewardGrowthsInside.push(\n MathUtil.wrappingSubU128(\n MathUtil.wrappingSubU128(rewardInfos[i].rewardGrowthGlobalX64, rewardGrowthsBelow),\n rewardGrowthsAbove,\n ),\n );\n }\n\n return rewardGrowthsInside;\n }\n\n static getRewardGrowthInsideV2(\n tickCurrentIndex: number,\n tickLowerState: Tick,\n tickUpperState: Tick,\n rewardInfos: Pick<ClmmPoolRewardInfo, \"rewardGrowthGlobalX64\">[],\n ): BN[] {\n const rewardGrowthsInside: BN[] = [];\n for (let i = 0; i < rewardInfos.length; i++) {\n let rewardGrowthsBelow = new BN(0);\n if (tickLowerState.liquidityGross.eqn(0)) {\n rewardGrowthsBelow = rewardInfos[i].rewardGrowthGlobalX64;\n } else if (tickCurrentIndex < tickLowerState.tick) {\n rewardGrowthsBelow = rewardInfos[i].rewardGrowthGlobalX64.sub(tickLowerState.rewardGrowthsOutsideX64[i]);\n } else {\n rewardGrowthsBelow = tickLowerState.rewardGrowthsOutsideX64[i];\n }\n\n let rewardGrowthsAbove = new BN(0);\n if (tickUpperState.liquidityGross.eqn(0)) {\n //\n } else if (tickCurrentIndex < tickUpperState.tick) {\n rewardGrowthsAbove = tickUpperState.rewardGrowthsOutsideX64[i];\n } else {\n rewardGrowthsAbove = rewardInfos[i].rewardGrowthGlobalX64.sub(tickUpperState.rewardGrowthsOutsideX64[i]);\n }\n\n rewardGrowthsInside.push(\n MathUtil.wrappingSubU128(\n MathUtil.wrappingSubU128(rewardInfos[i].rewardGrowthGlobalX64, rewardGrowthsBelow),\n rewardGrowthsAbove,\n ),\n );\n }\n\n return rewardGrowthsInside;\n }\n\n static getAmountsFromLiquidity({\n poolInfo,\n ownerPosition,\n liquidity,\n slippage,\n add,\n epochInfo,\n }: GetAmountParams): ReturnTypeGetLiquidityAmountOut {\n const sqrtPriceX64 = SqrtPriceMath.priceToSqrtPriceX64(\n new Decimal(poolInfo.price),\n poolInfo.mintA.decimals,\n poolInfo.mintB.decimals,\n );\n const sqrtPriceX64A = SqrtPriceMath.getSqrtPriceX64FromTick(ownerPosition.tickLower);\n const sqrtPriceX64B = SqrtPriceMath.getSqrtPriceX64FromTick(ownerPosition.tickUpper);\n\n const coefficientRe = add ? 1 + slippage : 1 - slippage;\n\n const amounts = LiquidityMath.getAmountsFromLiquidity(sqrtPriceX64, sqrtPriceX64A, sqrtPriceX64B, liquidity, add);\n\n const [amountA, amountB] = [\n getTransferAmountFeeV2(amounts.amountA, poolInfo.mintA.extensions?.feeConfig, epochInfo, true),\n getTransferAmountFeeV2(amounts.amountB, poolInfo.mintB.extensions?.feeConfig, epochInfo, true),\n ];\n const [amountSlippageA, amountSlippageB] = [\n getTransferAmountFeeV2(\n new BN(new Decimal(amounts.amountA.toString()).mul(coefficientRe).toFixed(0)),\n poolInfo.mintA.extensions?.feeConfig,\n epochInfo,\n true,\n ),\n getTransferAmountFeeV2(\n new BN(new Decimal(amounts.amountB.toString()).mul(coefficientRe).toFixed(0)),\n poolInfo.mintB.extensions?.feeConfig,\n epochInfo,\n true,\n ),\n ];\n\n return {\n liquidity,\n amountA,\n amountB,\n amountSlippageA,\n amountSlippageB,\n expirationTime: minExpirationTime(amountA.expirationTime, amountB.expirationTime),\n };\n }\n}\n","import { Connection, PublicKey } from \"@solana/web3.js\";\nimport BN from \"bn.js\";\n\nimport { getMultipleAccountsInfo } from \"../../../common\";\nimport { TickArrayLayout } from \"../layout\";\n\nimport { TickArrayBitmapExtensionType } from \"../type\";\nimport { MAX_TICK, MIN_TICK } from \"./constants\";\nimport { getPdaTickArrayAddress } from \"./pda\";\nimport { Tick, TICK_ARRAY_SIZE, TickArray, TickUtils } from \"./tick\";\n\nexport const FETCH_TICKARRAY_COUNT = 15;\n\nexport declare type PoolVars = {\n key: PublicKey;\n tokenA: PublicKey;\n tokenB: PublicKey;\n fee: number;\n};\n\nexport class TickQuery {\n public static async getTickArrays(\n connection: Connection,\n programId: PublicKey,\n poolId: PublicKey,\n tickCurrent: number,\n tickSpacing: number,\n tickArrayBitmapArray: BN[],\n exTickArrayBitmap: TickArrayBitmapExtensionType,\n ): Promise<{ [key: string]: TickArray }> {\n const tickArraysToFetch: PublicKey[] = [];\n const currentTickArrayStartIndex = TickUtils.getTickArrayStartIndexByTick(tickCurrent, tickSpacing);\n\n const startIndexArray = TickUtils.getInitializedTickArrayInRange(\n tickArrayBitmapArray,\n exTickArrayBitmap,\n tickSpacing,\n currentTickArrayStartIndex,\n Math.floor(FETCH_TICKARRAY_COUNT / 2),\n );\n for (let i = 0; i < startIndexArray.length; i++) {\n const { publicKey: tickArrayAddress } = getPdaTickArrayAddress(programId, poolId, startIndexArray[i]);\n tickArraysToFetch.push(tickArrayAddress);\n }\n\n const fetchedTickArrays = (await getMultipleAccountsInfo(connection, tickArraysToFetch)).map((i) =>\n i !== null ? TickArrayLayout.decode(i.data) : null,\n );\n\n const tickArrayCache: { [key: string]: TickArray } = {};\n for (let i = 0; i < tickArraysToFetch.length; i++) {\n const _info = fetchedTickArrays[i];\n if (_info === null) continue;\n\n tickArrayCache[_info.startTickIndex] = {\n ..._info,\n address: tickArraysToFetch[i],\n };\n }\n return tickArrayCache;\n }\n\n public static nextInitializedTick(\n programId: PublicKey,\n poolId: PublicKey,\n tickArrayCache: { [key: string]: TickArray },\n tickIndex: number,\n tickSpacing: number,\n zeroForOne: boolean,\n ): {\n nextTick: Tick;\n tickArrayAddress: PublicKey | undefined;\n tickArrayStartTickIndex: number;\n } {\n let {\n initializedTick: nextTick,\n tickArrayAddress,\n tickArrayStartTickIndex,\n } = this.nextInitializedTickInOneArray(programId, poolId, tickArrayCache, tickIndex, tickSpacing, zeroForOne);\n while (nextTick == undefined || nextTick.liquidityGross.lten(0)) {\n tickArrayStartTickIndex = TickUtils.getNextTickArrayStartIndex(tickArrayStartTickIndex, tickSpacing, zeroForOne);\n if (this.checkIsValidStartIndex(tickArrayStartTickIndex, tickSpacing)) {\n throw new Error(\"No enough initialized tickArray\");\n }\n const cachedTickArray = tickArrayCache[tickArrayStartTickIndex];\n\n if (cachedTickArray === undefined) continue;\n\n const {\n nextTick: _nextTick,\n tickArrayAddress: _tickArrayAddress,\n tickArrayStartTickIndex: _tickArrayStartTickIndex,\n } = this.firstInitializedTickInOneArray(programId, poolId, cachedTickArray, zeroForOne);\n [nextTick, tickArrayAddress, tickArrayStartTickIndex] = [_nextTick, _tickArrayAddress, _tickArrayStartTickIndex];\n }\n if (nextTick == undefined) {\n throw new Error(\"No invaild tickArray cache\");\n }\n return { nextTick, tickArrayAddress, tickArrayStartTickIndex };\n }\n\n public static nextInitializedTickArray(\n tickIndex: number,\n tickSpacing: number,\n zeroForOne: boolean,\n tickArrayBitmap: BN[],\n exBitmapInfo: TickArrayBitmapExtensionType,\n ): {\n isExist: boolean;\n nextStartIndex: number;\n } {\n const currentOffset = Math.floor(tickIndex / TickQuery.tickCount(tickSpacing));\n const result: number[] = zeroForOne\n ? TickUtils.searchLowBitFromStart(tickArrayBitmap, exBitmapInfo, currentOffset - 1, 1, tickSpacing)\n : TickUtils.searchHightBitFromStart(tickArrayBitmap, exBitmapInfo, currentOffset + 1, 1, tickSpacing);\n\n return result.length > 0 ? { isExist: true, nextStartIndex: result[0] } : { isExist: false, nextStartIndex: 0 };\n }\n\n public static firstInitializedTickInOneArray(\n programId: PublicKey,\n poolId: PublicKey,\n tickArray: TickArray,\n zeroForOne: boolean,\n ): {\n nextTick: Tick | undefined;\n tickArrayAddress: PublicKey;\n tickArrayStartTickIndex: number;\n } {\n let nextInitializedTick: Tick | undefined = undefined;\n if (zeroForOne) {\n let i = TICK_ARRAY_SIZE - 1;\n while (i >= 0) {\n const tickInArray = tickArray.ticks[i];\n if (tickInArray.liquidityGross.gtn(0)) {\n nextInitializedTick = tickInArray;\n break;\n }\n i = i - 1;\n }\n } else {\n let i = 0;\n while (i < TICK_ARRAY_SIZE) {\n const tickInArray = tickArray.ticks[i];\n if (tickInArray.liquidityGross.gtn(0)) {\n nextInitializedTick = tickInArray;\n break;\n }\n i = i + 1;\n }\n }\n const { publicKey: tickArrayAddress } = getPdaTickArrayAddress(programId, poolId, tickArray.startTickIndex);\n return { nextTick: nextInitializedTick, tickArrayAddress, tickArrayStartTickIndex: tickArray.startTickIndex };\n }\n\n public static nextInitializedTickInOneArray(\n programId: PublicKey,\n poolId: PublicKey,\n tickArrayCache: { [key: string]: TickArray },\n tickIndex: number,\n tickSpacing: number,\n zeroForOne: boolean,\n ): {\n initializedTick: Tick | undefined;\n tickArrayAddress: PublicKey | undefined;\n tickArrayStartTickIndex: number;\n } {\n const startIndex = TickUtils.getTickArrayStartIndexByTick(tickIndex, tickSpacing);\n let tickPositionInArray = Math.floor((tickIndex - startIndex) / tickSpacing);\n const cachedTickArray = tickArrayCache[startIndex];\n if (cachedTickArray == undefined) {\n return {\n initializedTick: undefined,\n tickArrayAddress: undefined,\n tickArrayStartTickIndex: startIndex,\n };\n }\n let nextInitializedTick: Tick | undefined = undefined;\n if (zeroForOne) {\n while (tickPositionInArray >= 0) {\n const tickInArray = cachedTickArray.ticks[tickPositionInArray];\n if (tickInArray.liquidityGross.gtn(0)) {\n nextInitializedTick = tickInArray;\n break;\n }\n tickPositionInArray = tickPositionInArray - 1;\n }\n } else {\n tickPositionInArray = tickPositionInArray + 1;\n while (tickPositionInArray < TICK_ARRAY_SIZE) {\n const tickInArray = cachedTickArray.ticks[tickPositionInArray];\n if (tickInArray.liquidityGross.gtn(0)) {\n nextInitializedTick = tickInArray;\n break;\n }\n tickPositionInArray = tickPositionInArray + 1;\n }\n }\n const { publicKey: tickArrayAddress } = getPdaTickArrayAddress(programId, poolId, startIndex);\n return {\n initializedTick: nextInitializedTick,\n tickArrayAddress,\n tickArrayStartTickIndex: cachedTickArray.startTickIndex,\n };\n }\n\n public static getArrayStartIndex(tickIndex: number, tickSpacing: number): number {\n const ticksInArray = this.tickCount(tickSpacing);\n const start = Math.floor(tickIndex / ticksInArray);\n\n return start * ticksInArray;\n }\n\n public static checkIsValidStartIndex(tickIndex: number, tickSpacing: number): boolean {\n if (TickUtils.checkIsOutOfBoundary(tickIndex)) {\n if (tickIndex > MAX_TICK) {\n return false;\n }\n const minStartIndex = TickUtils.getTickArrayStartIndexByTick(MIN_TICK, tickSpacing);\n return tickIndex == minStartIndex;\n }\n return tickIndex % this.tickCount(tickSpacing) == 0;\n }\n\n public static tickCount(tickSpacing: number): number {\n return TICK_ARRAY_SIZE * tickSpacing;\n }\n}\n","import BN from \"bn.js\";\n\nimport { TickArrayBitmapExtensionType } from \"../type\";\n\nimport { MAX_TICK, MIN_TICK } from \"./constants\";\nimport { TICK_ARRAY_BITMAP_SIZE, TICK_ARRAY_SIZE, TickUtils } from \"./tick\";\nimport { TickQuery } from \"./tickQuery\";\nimport { isZero, leadingZeros, leastSignificantBit, mostSignificantBit, trailingZeros } from \"./util\";\n\nexport const EXTENSION_TICKARRAY_BITMAP_SIZE = 14;\n\nexport class TickArrayBitmap {\n public static maxTickInTickarrayBitmap(tickSpacing: number): number {\n return tickSpacing * TICK_ARRAY_SIZE * TICK_ARRAY_BITMAP_SIZE;\n }\n\n public static getBitmapTickBoundary(\n tickarrayStartIndex: number,\n tickSpacing: number,\n ): {\n minValue: number;\n maxValue: number;\n } {\n const ticksInOneBitmap = this.maxTickInTickarrayBitmap(tickSpacing);\n let m = Math.floor(Math.abs(tickarrayStartIndex) / ticksInOneBitmap);\n if (tickarrayStartIndex < 0 && Math.abs(tickarrayStartIndex) % ticksInOneBitmap != 0) m += 1;\n\n const minValue = ticksInOneBitmap * m;\n\n return tickarrayStartIndex < 0\n ? { minValue: -minValue, maxValue: -minValue + ticksInOneBitmap }\n : { minValue, maxValue: minValue + ticksInOneBitmap };\n }\n\n public static nextInitializedTickArrayStartIndex(\n bitMap: BN,\n lastTickArrayStartIndex: number,\n tickSpacing: number,\n zeroForOne: boolean,\n ): { isInit: boolean; tickIndex: number } {\n if (!TickQuery.checkIsValidStartIndex(lastTickArrayStartIndex, tickSpacing))\n throw Error(\"nextInitializedTickArrayStartIndex check error\");\n\n const tickBoundary = this.maxTickInTickarrayBitmap(tickSpacing);\n const nextTickArrayStartIndex = zeroForOne\n ? lastTickArrayStartIndex - TickQuery.tickCount(tickSpacing)\n : lastTickArrayStartIndex + TickQuery.tickCount(tickSpacing);\n\n if (nextTickArrayStartIndex < -tickBoundary || nextTickArrayStartIndex >= tickBoundary) {\n return { isInit: false, tickIndex: lastTickArrayStartIndex };\n }\n\n const multiplier = tickSpacing * TICK_ARRAY_SIZE;\n let compressed = nextTickArrayStartIndex / multiplier + 512;\n\n if (nextTickArrayStartIndex < 0 && nextTickArrayStartIndex % multiplier != 0) {\n compressed--;\n }\n\n const bitPos = Math.abs(compressed);\n\n if (zeroForOne) {\n const offsetBitMap = bitMap.shln(1024 - bitPos - 1);\n const nextBit = mostSignificantBit(1024, offsetBitMap);\n if (nextBit !== null) {\n const nextArrayStartIndex = (bitPos - nextBit - 512) * multiplier;\n return { isInit: true, tickIndex: nextArrayStartIndex };\n } else {\n return { isInit: false, tickIndex: -tickBoundary };\n }\n } else {\n const offsetBitMap = bitMap.shrn(bitPos);\n const nextBit = leastSignificantBit(1024, offsetBitMap);\n if (nextBit !== null) {\n const nextArrayStartIndex = (bitPos + nextBit - 512) * multiplier;\n return { isInit: true, tickIndex: nextArrayStartIndex };\n } else {\n return { isInit: false, tickIndex: tickBoundary - TickQuery.tickCount(tickSpacing) };\n }\n }\n }\n}\n\nexport class TickArrayBitmapExtensionUtils {\n public static getBitmapOffset(tickIndex: number, tickSpacing: number): number {\n if (!TickQuery.checkIsValidStartIndex(tickIndex, tickSpacing)) {\n throw new Error(\"No enough initialized tickArray\");\n }\n this.checkExtensionBoundary(tickIndex, tickSpacing);\n\n const ticksInOneBitmap = TickArrayBitmap.maxTickInTickarrayBitmap(tickSpacing);\n let offset = Math.floor(Math.abs(tickIndex) / ticksInOneBitmap) - 1;\n\n if (tickIndex < 0 && Math.abs(tickIndex) % ticksInOneBitmap === 0) offset--;\n return offset;\n }\n\n public static getBitmap(\n tickIndex: number,\n tickSpacing: number,\n tickArrayBitmapExtension: TickArrayBitmapExtensionType,\n ): { offset: number; tickarrayBitmap: BN[] } {\n const offset = this.getBitmapOffset(tickIndex, tickSpacing);\n if (tickIndex < 0) {\n return { offset, tickarrayBitmap: tickArrayBitmapExtension.negativeTickArrayBitmap[offset] };\n } else {\n return { offset, tickarrayBitmap: tickArrayBitmapExtension.positiveTickArrayBitmap[offset] };\n }\n }\n\n public static checkExtensionBoundary(tickIndex: number, tickSpacing: number) {\n const { positiveTickBoundary, negativeTickBoundary } = this.extensionTickBoundary(tickSpacing);\n\n if (tickIndex >= negativeTickBoundary && tickIndex < positiveTickBoundary) {\n throw Error(\"checkExtensionBoundary -> InvalidTickArrayBoundary\");\n }\n }\n\n public static extensionTickBoundary(tickSpacing: number): {\n positiveTickBoundary: number;\n negativeTickBoundary: number;\n } {\n const positiveTickBoundary = TickArrayBitmap.maxTickInTickarrayBitmap(tickSpacing);\n\n const negativeTickBoundary = -positiveTickBoundary;\n\n if (MAX_TICK <= positiveTickBoundary)\n throw Error(`extensionTickBoundary check error: ${MAX_TICK}, ${positiveTickBoundary}`);\n if (negativeTickBoundary <= MIN_TICK)\n throw Error(`extensionTickBoundary check error: ${negativeTickBoundary}, ${MIN_TICK}`);\n\n return { positiveTickBoundary, negativeTickBoundary };\n }\n\n public static checkTickArrayIsInit(\n tickArrayStartIndex: number,\n tickSpacing: number,\n tickArrayBitmapExtension: TickArrayBitmapExtensionType,\n ): { isInitialized: boolean; startIndex: number } {\n const { tickarrayBitmap } = this.getBitmap(tickArrayStartIndex, tickSpacing, tickArrayBitmapExtension);\n\n const tickArrayOffsetInBitmap = this.tickArrayOffsetInBitmap(tickArrayStartIndex, tickSpacing);\n\n return {\n isInitialized: TickUtils.mergeTickArrayBitmap(tickarrayBitmap).testn(tickArrayOffsetInBitmap),\n startIndex: tickArrayStartIndex,\n };\n }\n\n public static nextInitializedTickArrayFromOneBitmap(\n lastTickArrayStartIndex: number,\n tickSpacing: number,\n zeroForOne: boolean,\n tickArrayBitmapExtension: TickArrayBitmapExtensionType,\n ): {\n isInit: boolean;\n tickIndex: number;\n } {\n const multiplier = TickQuery.tickCount(tickSpacing);\n const nextTickArrayStartIndex = zeroForOne\n ? lastTickArrayStartIndex - multiplier\n : lastTickArrayStartIndex + multiplier;\n const { tickarrayBitmap } = this.getBitmap(nextTickArrayStartIndex, tickSpacing, tickArrayBitmapExtension);\n\n return this.nextInitializedTickArrayInBitmap(tickarrayBitmap, nextTickArrayStartIndex, tickSpacing, zeroForOne);\n }\n\n public static nextInitializedTickArrayInBitmap(\n tickarrayBitmap: BN[],\n nextTickArrayStartIndex: number,\n tickSpacing: number,\n zeroForOne: boolean,\n ): {\n isInit: boolean;\n tickIndex: number;\n } {\n const { minValue: bitmapMinTickBoundary, maxValue: bitmapMaxTickBoundary } = TickArrayBitmap.getBitmapTickBoundary(\n nextTickArrayStartIndex,\n tickSpacing,\n );\n\n const tickArrayOffsetInBitmap = this.tickArrayOffsetInBitmap(nextTickArrayStartIndex, tickSpacing);\n if (zeroForOne) {\n // tick from upper to lower\n // find from highter bits to lower bits\n const offsetBitMap = TickUtils.mergeTickArrayBitmap(tickarrayBitmap).shln(\n TICK_ARRAY_BITMAP_SIZE - 1 - tickArrayOffsetInBitmap,\n );\n\n const nextBit = isZero(512, offsetBitMap) ? null : leadingZeros(512, offsetBitMap);\n\n if (nextBit !== null) {\n const nextArrayStartIndex = nextTickArrayStartIndex - nextBit * TickQuery.tickCount(tickSpacing);\n return { isInit: true, tickIndex: nextArrayStartIndex };\n } else {\n // not found til to the end\n return { isInit: false, tickIndex: bitmapMinTickBoundary };\n }\n } else {\n // tick from lower to upper\n // find from lower bits to highter bits\n const offsetBitMap = TickUtils.mergeTickArrayBitmap(tickarrayBitmap).shrn(tickArrayOffsetInBitmap);\n\n const nextBit = isZero(512, offsetBitMap) ? null : trailingZeros(512, offsetBitMap);\n\n if (nextBit !== null) {\n const nextArrayStartIndex = nextTickArrayStartIndex + nextBit * TickQuery.tickCount(tickSpacing);\n return { isInit: true, tickIndex: nextArrayStartIndex };\n } else {\n // not found til to the end\n return { isInit: false, tickIndex: bitmapMaxTickBoundary - TickQuery.tickCount(tickSpacing) };\n }\n }\n }\n\n public static tickArrayOffsetInBitmap(tickArrayStartIndex: number, tickSpacing: number): number {\n const m = Math.abs(tickArrayStartIndex) % TickArrayBitmap.maxTickInTickarrayBitmap(tickSpacing);\n let tickArrayOffsetInBitmap = Math.floor(m / TickQuery.tickCount(tickSpacing));\n if (tickArrayStartIndex < 0 && m != 0) {\n tickArrayOffsetInBitmap = TICK_ARRAY_BITMAP_SIZE - tickArrayOffsetInBitmap;\n }\n return tickArrayOffsetInBitmap;\n }\n}\n","import { blob, bool, i128, i64, publicKey, s32, seq, struct, u128, u16, u32, u64, u8 } from \"../../marshmallow\";\n\nimport { TICK_ARRAY_SIZE } from \"./utils/tick\";\nimport { EXTENSION_TICKARRAY_BITMAP_SIZE } from \"./utils/tickarrayBitmap\";\n\nexport const ClmmConfigLayout = struct([\n blob(8),\n u8(\"bump\"),\n u16(\"index\"),\n publicKey(\"\"),\n u32(\"protocolFeeRate\"),\n u32(\"tradeFeeRate\"),\n u16(\"tickSpacing\"),\n seq(u64(), 8, \"\"),\n]);\n\nexport const ObservationLayout = struct([u32(\"blockTimestamp\"), i64(\"tickCumulative\"), seq(u64(), 4)]);\nexport const ObservationInfoLayout = struct([\n blob(8),\n bool(\"initialized\"),\n u64(\"recentEpoch\"),\n u16(\"observationIndex\"),\n publicKey(\"poolId\"),\n seq(ObservationLayout, 100, \"observations\"),\n seq(u64(), 4),\n]);\n\nexport const RewardInfo = struct([\n u8(\"rewardState\"),\n u64(\"openTime\"),\n u64(\"endTime\"),\n u64(\"lastUpdateTime\"),\n u128(\"emissionsPerSecondX64\"),\n u64(\"rewardTotalEmissioned\"),\n u64(\"rewardClaimed\"),\n publicKey(\"tokenMint\"),\n publicKey(\"tokenVault\"),\n publicKey(\"creator\"),\n u128(\"rewardGrowthGlobalX64\"),\n]);\nexport const PoolInfoLayout = struct([\n blob(8),\n u8(\"bump\"),\n publicKey(\"ammConfig\"),\n publicKey(\"creator\"),\n publicKey(\"mintA\"),\n publicKey(\"mintB\"),\n publicKey(\"vaultA\"),\n publicKey(\"vaultB\"),\n publicKey(\"observationId\"),\n u8(\"mintDecimalsA\"),\n u8(\"mintDecimalsB\"),\n u16(\"tickSpacing\"),\n u128(\"liquidity\"),\n u128(\"sqrtPriceX64\"),\n s32(\"tickCurrent\"),\n u32(),\n u128(\"feeGrowthGlobalX64A\"),\n u128(\"feeGrowthGlobalX64B\"),\n u64(\"protocolFeesTokenA\"),\n u64(\"protocolFeesTokenB\"),\n\n u128(\"swapInAmountTokenA\"),\n u128(\"swapOutAmountTokenB\"),\n u128(\"swapInAmountTokenB\"),\n u128(\"swapOutAmountTokenA\"),\n\n u8(\"status\"),\n\n seq(u8(), 7, \"\"),\n\n seq(RewardInfo, 3, \"rewardInfos\"),\n seq(u64(), 16, \"tickArrayBitmap\"),\n\n u64(\"totalFeesTokenA\"),\n u64(\"totalFeesClaimedTokenA\"),\n u64(\"totalFeesTokenB\"),\n u64(\"totalFeesClaimedTokenB\"),\n\n u64(\"fundFeesTokenA\"),\n u64(\"fundFeesTokenB\"),\n\n u64(\"startTime\"),\n\n seq(u64(), 15 * 4 - 3, \"padding\"),\n]);\n\nexport const PositionRewardInfoLayout = struct([u128(\"growthInsideLastX64\"), u64(\"rewardAmountOwed\")]);\nexport const PositionInfoLayout = struct([\n blob(8),\n u8(\"bump\"),\n publicKey(\"nftMint\"),\n publicKey(\"poolId\"),\n\n s32(\"tickLower\"),\n s32(\"tickUpper\"),\n u128(\"liquidity\"),\n u128(\"feeGrowthInsideLastX64A\"),\n u128(\"feeGrowthInsideLastX64B\"),\n u64(\"tokenFeesOwedA\"),\n u64(\"tokenFeesOwedB\"),\n\n seq(PositionRewardInfoLayout, 3, \"rewardInfos\"),\n\n seq(u64(), 8, \"\"),\n]);\n\nexport type ClmmPositionLayout = ReturnType<typeof PositionInfoLayout.decode>;\n\nexport const ProtocolPositionLayout = struct([\n blob(8),\n u8(\"bump\"),\n publicKey(\"poolId\"),\n s32(\"tickLowerIndex\"),\n s32(\"tickUpperIndex\"),\n u128(\"liquidity\"),\n u128(\"feeGrowthInsideLastX64A\"),\n u128(\"feeGrowthInsideLastX64B\"),\n u64(\"tokenFeesOwedA\"),\n u64(\"tokenFeesOwedB\"),\n seq(u128(), 3, \"rewardGrowthInside\"),\n\n seq(u64(), 8, \"\"),\n]);\n\nexport const TickLayout = struct([\n s32(\"tick\"),\n i128(\"liquidityNet\"),\n u128(\"liquidityGross\"),\n u128(\"feeGrowthOutsideX64A\"),\n u128(\"feeGrowthOutsideX64B\"),\n seq(u128(), 3, \"rewardGrowthsOutsideX64\"),\n\n seq(u32(), 13, \"\"),\n]);\n\nexport const TickArrayLayout = struct([\n blob(8),\n publicKey(\"poolId\"),\n s32(\"startTickIndex\"),\n seq(TickLayout, TICK_ARRAY_SIZE, \"ticks\"),\n u8(\"initializedTickCount\"),\n\n seq(u8(), 115, \"\"),\n]);\n\nexport const OperationLayout = struct([blob(329), seq(publicKey(), 100, \"whitelistMints\")]);\n\nexport const TickArrayBitmapExtensionLayout = struct([\n blob(8),\n publicKey(\"poolId\"),\n seq(seq(u64(), 8), EXTENSION_TICKARRAY_BITMAP_SIZE, \"positiveTickArrayBitmap\"),\n seq(seq(u64(), 8), EXTENSION_TICKARRAY_BITMAP_SIZE, \"negativeTickArrayBitmap\"),\n]);\n\nexport const LockPositionLayout = struct([\n u64(),\n u8(\"bump\"),\n publicKey(\"owner\"),\n publicKey(\"poolId\"),\n publicKey(\"positionId\"),\n publicKey(\"nftAccount\"),\n seq(u64(), 8),\n]);\n\nexport const LockClPositionLayoutV2 = struct([\n blob(8),\n u8(\"bump\"),\n publicKey(\"lockOwner\"),\n publicKey(\"poolId\"),\n publicKey(\"positionId\"),\n publicKey(\"nftAccount\"),\n publicKey(\"lockNftMint\"),\n u64(\"recentEpoch\"),\n seq(u64(), 8),\n]);\n","import { blob, bool, publicKey, seq, struct, u16, u64, u8, u128 } from \"../../marshmallow\";\n\nexport const CpmmConfigInfoLayout = struct([\n blob(8),\n u8(\"bump\"),\n bool(\"disableCreatePool\"),\n u16(\"index\"),\n u64(\"tradeFeeRate\"),\n u64(\"protocolFeeRate\"),\n u64(\"fundFeeRate\"),\n u64(\"createPoolFee\"),\n\n publicKey(\"protocolOwner\"),\n publicKey(\"fundOwner\"),\n seq(u64(), 16),\n]);\n\nexport const CpmmPoolInfoLayout = struct([\n blob(8),\n\n publicKey(\"configId\"),\n publicKey(\"poolCreator\"),\n publicKey(\"vaultA\"),\n publicKey(\"vaultB\"),\n\n publicKey(\"mintLp\"),\n publicKey(\"mintA\"),\n publicKey(\"mintB\"),\n\n publicKey(\"mintProgramA\"),\n publicKey(\"mintProgramB\"),\n\n publicKey(\"observationId\"),\n\n u8(\"bump\"),\n u8(\"status\"),\n\n u8(\"lpDecimals\"),\n u8(\"mintDecimalA\"),\n u8(\"mintDecimalB\"),\n\n u64(\"lpAmount\"),\n u64(\"protocolFeesMintA\"),\n u64(\"protocolFeesMintB\"),\n u64(\"fundFeesMintA\"),\n u64(\"fundFeesMintB\"),\n u64(\"openTime\"),\n\n seq(u64(), 32),\n]);\n","import BN from \"bn.js\";\n\nimport {\n CREATE_CPMM_POOL_AUTH,\n CREATE_CPMM_POOL_PROGRAM,\n InstructionType,\n MEMO_PROGRAM_ID2,\n METADATA_PROGRAM_ID,\n RENT_PROGRAM_ID,\n SYSTEM_PROGRAM_ID,\n createLogger,\n} from \"@/common\";\nimport { ASSOCIATED_TOKEN_PROGRAM_ID, TOKEN_2022_PROGRAM_ID, TOKEN_PROGRAM_ID } from \"@solana/spl-token\";\nimport { AccountMeta, Keypair, PublicKey, Signer, SystemProgram, TransactionInstruction } from \"@solana/web3.js\";\nimport { getCpLockPda, getCpmmPdaPoolId } from \"./pda\";\n\nimport { ApiV3PoolInfoStandardItemCpmm, CpmmKeys } from \"@/api\";\nimport { ReturnTypeMakeInstructions } from \"@/cobaltx/type\";\nimport { getATAAddress } from \"@/common\";\nimport { bool, struct, u64 } from \"@/marshmallow\";\nimport { getPdaMetadataKey } from \"../clmm\";\nimport { CpmmLockExtInfo } from \"./type\";\n\nconst logger = createLogger(\"CobaltX_cpmm\");\nconst anchorDataBuf = {\n initialize: [175, 175, 109, 31, 13, 152, 155, 237],\n deposit: [242, 35, 198, 137, 82, 225, 242, 182],\n withdraw: [183, 18, 70, 156, 148, 109, 161, 34],\n swapBaseInput: [143, 190, 90, 218, 196, 30, 51, 222],\n swapBaseOutput: [55, 217, 98, 86, 163, 74, 180, 173],\n lockCpLiquidity: [216, 157, 29, 78, 38, 51, 31, 26],\n collectCpFee: [8, 30, 51, 199, 209, 184, 247, 133],\n};\n\nexport function makeCreateCpmmPoolInInstruction(\n programId: PublicKey,\n creator: PublicKey,\n configId: PublicKey,\n authority: PublicKey,\n poolId: PublicKey,\n mintA: PublicKey,\n mintB: PublicKey,\n lpMint: PublicKey,\n userVaultA: PublicKey,\n userVaultB: PublicKey,\n userLpAccount: PublicKey,\n vaultA: PublicKey,\n vaultB: PublicKey,\n createPoolFeeAccount: PublicKey,\n mintProgramA: PublicKey,\n mintProgramB: PublicKey,\n observationId: PublicKey,\n\n amountMaxA: BN,\n amountMaxB: BN,\n openTime: BN,\n): TransactionInstruction {\n const dataLayout = struct([u64(\"amountMaxA\"), u64(\"amountMaxB\"), u64(\"openTime\")]);\n\n const pdaPoolId = getCpmmPdaPoolId(programId, configId, mintA, mintB).publicKey;\n\n const keys: Array<AccountMeta> = [\n { pubkey: creator, isSigner: true, isWritable: false },\n { pubkey: configId, isSigner: false, isWritable: false },\n { pubkey: authority, isSigner: false, isWritable: false },\n { pubkey: poolId, isSigner: !poolId.equals(pdaPoolId), isWritable: true },\n { pubkey: mintA, isSigner: false, isWritable: false },\n { pubkey: mintB, isSigner: false, isWritable: false },\n { pubkey: lpMint, isSigner: false, isWritable: true },\n { pubkey: userVaultA, isSigner: false, isWritable: true },\n { pubkey: userVaultB, isSigner: false, isWritable: true },\n { pubkey: userLpAccount, isSigner: false, isWritable: true },\n { pubkey: vaultA, isSigner: false, isWritable: true },\n { pubkey: vaultB, isSigner: false, isWritable: true },\n { pubkey: createPoolFeeAccount, isSigner: false, isWritable: true },\n { pubkey: observationId, isSigner: false, isWritable: true },\n\n { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },\n { pubkey: mintProgramA, isSigner: false, isWritable: false },\n { pubkey: mintProgramB, isSigner: false, isWritable: false },\n { pubkey: ASSOCIATED_TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },\n { pubkey: SYSTEM_PROGRAM_ID, isSigner: false, isWritable: false },\n { pubkey: RENT_PROGRAM_ID, isSigner: false, isWritable: false },\n ];\n\n const data = Buffer.alloc(dataLayout.span);\n dataLayout.encode(\n {\n amountMaxA,\n amountMaxB,\n openTime,\n },\n data,\n );\n\n return new TransactionInstruction({\n keys,\n programId,\n data: Buffer.from([...anchorDataBuf.initialize, ...data]),\n });\n}\n\nexport function makeDepositCpmmInInstruction(\n programId: PublicKey,\n owner: PublicKey,\n authority: PublicKey,\n poolId: PublicKey,\n userLpAccount: PublicKey,\n userVaultA: PublicKey,\n userVaultB: PublicKey,\n vaultA: PublicKey,\n vaultB: PublicKey,\n mintA: PublicKey,\n mintB: PublicKey,\n lpMint: PublicKey,\n\n lpAmount: BN,\n amountMaxA: BN,\n amountMaxB: BN,\n): TransactionInstruction {\n const dataLayout = struct([u64(\"lpAmount\"), u64(\"amountMaxA\"), u64(\"amountMaxB\")]);\n\n const keys: Array<AccountMeta> = [\n { pubkey: owner, isSigner: true, isWritable: false },\n { pubkey: authority, isSigner: false, isWritable: false },\n { pubkey: poolId, isSigner: false, isWritable: true },\n { pubkey: userLpAccount, isSigner: false, isWritable: true },\n { pubkey: userVaultA, isSigner: false, isWritable: true },\n { pubkey: userVaultB, isSigner: false, isWritable: true },\n { pubkey: vaultA, isSigner: false, isWritable: true },\n { pubkey: vaultB, isSigner: false, isWritable: true },\n { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },\n { pubkey: TOKEN_2022_PROGRAM_ID, isSigner: false, isWritable: false },\n { pubkey: mintA, isSigner: false, isWritable: false },\n { pubkey: mintB, isSigner: false, isWritable: false },\n { pubkey: lpMint, isSigner: false, isWritable: true },\n ];\n\n const data = Buffer.alloc(dataLayout.span);\n logger.debug(\"cpmm deposit data\", {\n lpAmount: lpAmount.toString(),\n amountMaxA: amountMaxA.toString(),\n amountMaxB: amountMaxB.toString(),\n });\n dataLayout.encode(\n {\n lpAmount,\n amountMaxA,\n amountMaxB,\n },\n data,\n );\n\n return new TransactionInstruction({\n keys,\n programId,\n data: Buffer.from([...anchorDataBuf.deposit, ...data]),\n });\n}\n\nexport function makeWithdrawCpmmInInstruction(\n programId: PublicKey,\n owner: PublicKey,\n authority: PublicKey,\n poolId: PublicKey,\n userLpAccount: PublicKey,\n userVaultA: PublicKey,\n userVaultB: PublicKey,\n vaultA: PublicKey,\n vaultB: PublicKey,\n mintA: PublicKey,\n mintB: PublicKey,\n lpMint: PublicKey,\n\n lpAmount: BN,\n amountMinA: BN,\n amountMinB: BN,\n): TransactionInstruction {\n const dataLayout = struct([u64(\"lpAmount\"), u64(\"amountMinA\"), u64(\"amountMinB\")]);\n\n const keys: Array<AccountMeta> = [\n { pubkey: owner, isSigner: true, isWritable: false },\n { pubkey: authority, isSigner: false, isWritable: false },\n { pubkey: poolId, isSigner: false, isWritable: true },\n { pubkey: userLpAccount, isSigner: false, isWritable: true },\n { pubkey: userVaultA, isSigner: false, isWritable: true },\n { pubkey: userVaultB, isSigner: false, isWritable: true },\n { pubkey: vaultA, isSigner: false, isWritable: true },\n { pubkey: vaultB, isSigner: false, isWritable: true },\n { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },\n { pubkey: TOKEN_2022_PROGRAM_ID, isSigner: false, isWritable: false },\n { pubkey: mintA, isSigner: false, isWritable: false },\n { pubkey: mintB, isSigner: false, isWritable: false },\n { pubkey: lpMint, isSigner: false, isWritable: true },\n { pubkey: MEMO_PROGRAM_ID2, isSigner: false, isWritable: false },\n ];\n\n const data = Buffer.alloc(dataLayout.span);\n dataLayout.encode(\n {\n lpAmount,\n amountMinA,\n amountMinB,\n },\n data,\n );\n\n return new TransactionInstruction({\n keys,\n programId,\n data: Buffer.from([...anchorDataBuf.withdraw, ...data]),\n });\n}\n\nexport function makeSwapCpmmBaseInInInstruction(\n programId: PublicKey,\n payer: PublicKey,\n authority: PublicKey,\n configId: PublicKey,\n poolId: PublicKey,\n userInputAccount: PublicKey,\n userOutputAccount: PublicKey,\n inputVault: PublicKey,\n outputVault: PublicKey,\n inputTokenProgram: PublicKey,\n outputTokenProgram: PublicKey,\n inputMint: PublicKey,\n outputMint: PublicKey,\n observationId: PublicKey,\n\n amountIn: BN,\n amounOutMin: BN,\n): TransactionInstruction {\n const dataLayout = struct([u64(\"amountIn\"), u64(\"amounOutMin\")]);\n\n const keys: Array<AccountMeta> = [\n { pubkey: payer, isSigner: true, isWritable: false },\n { pubkey: authority, isSigner: false, isWritable: false },\n { pubkey: configId, isSigner: false, isWritable: false },\n { pubkey: poolId, isSigner: false, isWritable: true },\n { pubkey: userInputAccount, isSigner: false, isWritable: true },\n { pubkey: userOutputAccount, isSigner: false, isWritable: true },\n { pubkey: inputVault, isSigner: false, isWritable: true },\n { pubkey: outputVault, isSigner: false, isWritable: true },\n { pubkey: inputTokenProgram, isSigner: false, isWritable: false },\n { pubkey: outputTokenProgram, isSigner: false, isWritable: false },\n { pubkey: inputMint, isSigner: false, isWritable: false },\n { pubkey: outputMint, isSigner: false, isWritable: false },\n { pubkey: observationId, isSigner: false, isWritable: true },\n ];\n\n const data = Buffer.alloc(dataLayout.span);\n dataLayout.encode(\n {\n amountIn,\n amounOutMin,\n },\n data,\n );\n\n return new TransactionInstruction({\n keys,\n programId,\n data: Buffer.from([...anchorDataBuf.swapBaseInput, ...data]),\n });\n}\nexport function makeSwapCpmmBaseOutInInstruction(\n programId: PublicKey,\n payer: PublicKey,\n authority: PublicKey,\n configId: PublicKey,\n poolId: PublicKey,\n userInputAccount: PublicKey,\n userOutputAccount: PublicKey,\n inputVault: PublicKey,\n outputVault: PublicKey,\n inputTokenProgram: PublicKey,\n outputTokenProgram: PublicKey,\n inputMint: PublicKey,\n outputMint: PublicKey,\n observationId: PublicKey,\n\n amountInMax: BN,\n amountOut: BN,\n): TransactionInstruction {\n const dataLayout = struct([u64(\"amountInMax\"), u64(\"amountOut\")]);\n\n const keys: Array<AccountMeta> = [\n { pubkey: payer, isSigner: true, isWritable: false },\n { pubkey: authority, isSigner: false, isWritable: false },\n { pubkey: configId, isSigner: false, isWritable: false },\n { pubkey: poolId, isSigner: false, isWritable: true },\n { pubkey: userInputAccount, isSigner: false, isWritable: true },\n { pubkey: userOutputAccount, isSigner: false, isWritable: true },\n { pubkey: inputVault, isSigner: false, isWritable: true },\n { pubkey: outputVault, isSigner: false, isWritable: true },\n { pubkey: inputTokenProgram, isSigner: false, isWritable: false },\n { pubkey: outputTokenProgram, isSigner: false, isWritable: false },\n { pubkey: inputMint, isSigner: false, isWritable: false },\n { pubkey: outputMint, isSigner: false, isWritable: false },\n { pubkey: observationId, isSigner: false, isWritable: true },\n ];\n\n const data = Buffer.alloc(dataLayout.span);\n dataLayout.encode(\n {\n amountInMax,\n amountOut,\n },\n data,\n );\n\n return new TransactionInstruction({\n keys,\n programId,\n data: Buffer.from([...anchorDataBuf.swapBaseOutput, ...data]),\n });\n}\n\nexport async function makeCpmmLockInstruction(props: {\n poolInfo: ApiV3PoolInfoStandardItemCpmm;\n poolKeys: CpmmKeys;\n ownerInfo: {\n feePayer: PublicKey;\n wallet: PublicKey;\n };\n\n lockProgram: PublicKey;\n lockAuthProgram: PublicKey;\n lpAmount: BN;\n withMetadata?: boolean;\n getEphemeralSigners?: (k: number) => any;\n}): Promise<ReturnTypeMakeInstructions<CpmmLockExtInfo>> {\n const { ownerInfo, poolInfo, poolKeys, getEphemeralSigners } = props;\n\n const signers: Signer[] = [];\n const [poolId, lpMint] = [new PublicKey(poolInfo.id), new PublicKey(poolInfo.lpMint.address)];\n\n let nftMintAccount: PublicKey;\n if (getEphemeralSigners) {\n nftMintAccount = new PublicKey((await getEphemeralSigners(1))[0]);\n } else {\n const _k = Keypair.generate();\n signers.push(_k);\n nftMintAccount = _k.publicKey;\n }\n\n const { publicKey: nftAccount } = getATAAddress(ownerInfo.feePayer, nftMintAccount, TOKEN_PROGRAM_ID);\n const { publicKey: metadataAccount } = getPdaMetadataKey(nftMintAccount);\n const { publicKey: lockPda } = getCpLockPda(props.lockProgram, nftMintAccount);\n\n const { publicKey: userLpVault } = getATAAddress(ownerInfo.feePayer, lpMint, TOKEN_PROGRAM_ID);\n const { publicKey: lockLpVault } = getATAAddress(props.lockAuthProgram, lpMint, TOKEN_PROGRAM_ID);\n\n const ins = cpmmLockPositionInstruction({\n programId: props.lockProgram,\n auth: props.lockAuthProgram,\n payer: ownerInfo.feePayer,\n nftOwner: ownerInfo.feePayer,\n liquidityOwner: ownerInfo.feePayer,\n nftMint: nftMintAccount,\n nftAccount,\n poolId,\n lockPda,\n mintLp: lpMint,\n userLpVault,\n lockLpVault,\n poolVaultA: new PublicKey(poolKeys.vault.A),\n poolVaultB: new PublicKey(poolKeys.vault.B),\n metadataAccount,\n lpAmount: props.lpAmount,\n withMetadata: props.withMetadata ?? true,\n });\n\n return {\n address: {\n nftMint: nftMintAccount,\n nftAccount,\n metadataAccount,\n lockPda,\n userLpVault,\n lockLpVault,\n },\n instructions: [ins],\n signers,\n instructionTypes: [InstructionType.CpmmLockLp],\n lookupTableAddress: [],\n };\n}\n\nexport function cpmmLockPositionInstruction({\n programId,\n auth,\n payer,\n liquidityOwner,\n nftOwner,\n nftMint,\n nftAccount,\n poolId,\n lockPda,\n mintLp,\n userLpVault,\n lockLpVault,\n poolVaultA,\n poolVaultB,\n metadataAccount,\n lpAmount,\n withMetadata,\n}: {\n programId: PublicKey;\n auth: PublicKey;\n payer: PublicKey;\n liquidityOwner: PublicKey;\n nftOwner: PublicKey;\n nftMint: PublicKey;\n nftAccount: PublicKey;\n poolId: PublicKey;\n lockPda: PublicKey;\n mintLp: PublicKey;\n userLpVault: PublicKey;\n lockLpVault: PublicKey;\n poolVaultA: PublicKey;\n poolVaultB: PublicKey;\n metadataAccount: PublicKey;\n lpAmount: BN;\n withMetadata: boolean;\n}): TransactionInstruction {\n const keys = [\n { pubkey: auth, isSigner: false, isWritable: false },\n { pubkey: payer, isSigner: true, isWritable: true },\n { pubkey: liquidityOwner, isSigner: true, isWritable: false },\n { pubkey: nftOwner, isSigner: false, isWritable: false },\n { pubkey: nftMint, isSigner: true, isWritable: true },\n { pubkey: nftAccount, isSigner: false, isWritable: true },\n { pubkey: poolId, isSigner: false, isWritable: false },\n { pubkey: lockPda, isSigner: false, isWritable: true },\n { pubkey: mintLp, isSigner: false, isWritable: false },\n { pubkey: userLpVault, isSigner: false, isWritable: true },\n { pubkey: lockLpVault, isSigner: false, isWritable: true },\n { pubkey: poolVaultA, isSigner: false, isWritable: true },\n { pubkey: poolVaultB, isSigner: false, isWritable: true },\n { pubkey: metadataAccount, isSigner: false, isWritable: true },\n { pubkey: RENT_PROGRAM_ID, isSigner: false, isWritable: false },\n { pubkey: SystemProgram.programId, isSigner: false, isWritable: false },\n { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },\n { pubkey: ASSOCIATED_TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },\n { pubkey: METADATA_PROGRAM_ID, isSigner: false, isWritable: false },\n ];\n const dataLayout = struct([u64(\"lpAmount\"), bool(\"withMetadata\")]);\n const data = Buffer.alloc(dataLayout.span);\n dataLayout.encode(\n {\n lpAmount,\n withMetadata,\n },\n data,\n );\n const aData = Buffer.from([...anchorDataBuf.lockCpLiquidity, ...data]);\n return new TransactionInstruction({\n keys,\n programId,\n data: aData,\n });\n}\n\nexport function collectCpFeeInstruction({\n programId,\n nftOwner,\n auth,\n nftAccount,\n lockPda,\n poolId,\n mintLp,\n userVaultA,\n userVaultB,\n poolVaultA,\n poolVaultB,\n mintA,\n mintB,\n lockLpVault,\n lpFeeAmount,\n cpmmProgram,\n cpmmAuthProgram,\n}: {\n programId: PublicKey;\n nftOwner: PublicKey;\n auth: PublicKey;\n nftMint: PublicKey;\n nftAccount: PublicKey;\n lockPda: PublicKey;\n poolId: PublicKey;\n mintLp: PublicKey;\n userVaultA: PublicKey;\n userVaultB: PublicKey;\n poolVaultA: PublicKey;\n poolVaultB: PublicKey;\n mintA: PublicKey;\n mintB: PublicKey;\n lockLpVault: PublicKey;\n lpFeeAmount: BN;\n cpmmProgram?: PublicKey;\n cpmmAuthProgram?: PublicKey;\n}): TransactionInstruction {\n const keys = [\n { pubkey: auth, isSigner: false, isWritable: false },\n { pubkey: nftOwner, isSigner: true, isWritable: false },\n // { pubkey: nftMint, isSigner: false, isWritable: true },\n { pubkey: nftAccount, isSigner: false, isWritable: true },\n { pubkey: lockPda, isSigner: false, isWritable: true },\n { pubkey: cpmmProgram ?? CREATE_CPMM_POOL_PROGRAM, isSigner: false, isWritable: false },\n { pubkey: cpmmAuthProgram ?? CREATE_CPMM_POOL_AUTH, isSigner: false, isWritable: false },\n { pubkey: poolId, isSigner: false, isWritable: true },\n { pubkey: mintLp, isSigner: false, isWritable: true },\n { pubkey: userVaultA, isSigner: false, isWritable: true },\n { pubkey: userVaultB, isSigner: false, isWritable: true },\n { pubkey: poolVaultA, isSigner: false, isWritable: true },\n { pubkey: poolVaultB, isSigner: false, isWritable: true },\n { pubkey: mintA, isSigner: false, isWritable: false },\n { pubkey: mintB, isSigner: false, isWritable: false },\n { pubkey: lockLpVault, isSigner: false, isWritable: true },\n // { pubkey: ASSOCIATED_TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },\n { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },\n { pubkey: TOKEN_2022_PROGRAM_ID, isSigner: false, isWritable: false },\n { pubkey: MEMO_PROGRAM_ID2, isSigner: false, isWritable: false },\n ];\n const dataLayout = struct([u64(\"lpFeeAmount\")]);\n const data = Buffer.alloc(dataLayout.span);\n dataLayout.encode(\n {\n lpFeeAmount,\n },\n data,\n );\n const aData = Buffer.from([...anchorDataBuf.collectCpFee, ...data]);\n return new TransactionInstruction({\n keys,\n programId,\n data: aData,\n });\n}\n","import { PublicKey } from \"@solana/web3.js\";\nimport { findProgramAddress } from \"../../common/txTool/txUtils\";\n\nconst AUTH_SEED = Buffer.from(\"vault_and_lp_mint_auth_seed\", \"utf8\");\nconst AMM_CONFIG_SEED = Buffer.from(\"amm_config\", \"utf8\");\nconst POOL_SEED = Buffer.from(\"pool\", \"utf8\");\nconst POOL_LP_MINT_SEED = Buffer.from(\"pool_lp_mint\", \"utf8\");\nconst POOL_VAULT_SEED = Buffer.from(\"pool_vault\", \"utf8\");\nconst OBSERVATION_SEED = Buffer.from(\"observation\", \"utf8\");\n\nexport function getPdaPoolAuthority(programId: PublicKey): {\n publicKey: PublicKey;\n nonce: number;\n} {\n return findProgramAddress([AUTH_SEED], programId);\n}\n\nexport function getCpmmPdaAmmConfigId(\n programId: PublicKey,\n index: number,\n): {\n publicKey: PublicKey;\n nonce: number;\n} {\n return findProgramAddress([AMM_CONFIG_SEED, u16ToBytes(index)], programId);\n}\n\nexport function getCpmmPdaPoolId(\n programId: PublicKey,\n ammConfigId: PublicKey,\n mintA: PublicKey,\n mintB: PublicKey,\n): {\n publicKey: PublicKey;\n nonce: number;\n} {\n return findProgramAddress([POOL_SEED, ammConfigId.toBuffer(), mintA.toBuffer(), mintB.toBuffer()], programId);\n}\n\nexport function getPdaLpMint(\n programId: PublicKey,\n poolId: PublicKey,\n): {\n publicKey: PublicKey;\n nonce: number;\n} {\n return findProgramAddress([POOL_LP_MINT_SEED, poolId.toBuffer()], programId);\n}\n\nexport function getPdaVault(\n programId: PublicKey,\n poolId: PublicKey,\n mint: PublicKey,\n): {\n publicKey: PublicKey;\n nonce: number;\n} {\n return findProgramAddress([POOL_VAULT_SEED, poolId.toBuffer(), mint.toBuffer()], programId);\n}\n\nexport function getPdaObservationId(\n programId: PublicKey,\n poolId: PublicKey,\n): {\n publicKey: PublicKey;\n nonce: number;\n} {\n return findProgramAddress([OBSERVATION_SEED, poolId.toBuffer()], programId);\n}\n\nfunction u16ToBytes(num: number): Uint8Array {\n const arr = new ArrayBuffer(2);\n const view = new DataView(arr);\n view.setUint16(0, num, false);\n return new Uint8Array(arr);\n}\n\nexport function getCreatePoolKeys({\n poolId: propPoolId,\n programId,\n configId,\n mintA,\n mintB,\n}: {\n poolId?: PublicKey;\n programId: PublicKey;\n configId: PublicKey;\n mintA: PublicKey;\n mintB: PublicKey;\n}): {\n poolId: PublicKey;\n configId: PublicKey;\n authority: PublicKey;\n lpMint: PublicKey;\n vaultA: PublicKey;\n vaultB: PublicKey;\n observationId: PublicKey;\n} {\n // const configId = getCpmmPdaAmmConfigId(programId, 0).publicKey;\n const authority = getPdaPoolAuthority(programId).publicKey;\n const poolId = propPoolId || getCpmmPdaPoolId(programId, configId, mintA, mintB).publicKey;\n const lpMint = getPdaLpMint(programId, poolId).publicKey;\n const vaultA = getPdaVault(programId, poolId, mintA).publicKey;\n const vaultB = getPdaVault(programId, poolId, mintB).publicKey;\n const observationId = getPdaObservationId(programId, poolId).publicKey;\n\n return {\n poolId,\n configId,\n authority,\n lpMint,\n vaultA,\n vaultB,\n observationId,\n };\n}\n\nexport const LOCK_LIQUIDITY_SEED = Buffer.from(\"locked_liquidity\", \"utf8\");\n\nexport function getCpLockPda(\n programId: PublicKey,\n mint: PublicKey,\n): {\n publicKey: PublicKey;\n nonce: number;\n} {\n return findProgramAddress([LOCK_LIQUIDITY_SEED, mint.toBuffer()], programId);\n}\n","import { PublicKey } from \"@solana/web3.js\";\nimport BN from \"bn.js\";\nimport Decimal from \"decimal.js-light\";\nimport { ApiV3Token } from \"../../../api/type\";\nimport { BNDivCeil } from \"../../../common\";\nimport { ConstantProductCurve } from \"./constantProduct\";\nimport { CpmmFee } from \"./fee\";\n\nexport enum RoundDirection {\n Floor,\n Ceiling,\n}\n\nexport type SwapWithoutFeesResult = { sourceAmountSwapped: BN; destinationAmountSwapped: BN };\n\nexport type TradingTokenResult = { tokenAmount0: BN; tokenAmount1: BN };\n\nexport type SwapResult = {\n newSwapSourceAmount: BN;\n newSwapDestinationAmount: BN;\n sourceAmountSwapped: BN;\n destinationAmountSwapped: BN;\n tradeFee: BN;\n};\n\nexport class CurveCalculator {\n static validate_supply(tokenAmount0: BN, tokenAmount1: BN): void {\n if (tokenAmount0.isZero()) throw Error(\"tokenAmount0 is zero\");\n if (tokenAmount1.isZero()) throw Error(\"tokenAmount1 is zero\");\n }\n\n static swap(sourceAmount: BN, swapSourceAmount: BN, swapDestinationAmount: BN, tradeFeeRate: BN): SwapResult {\n const tradeFee = CpmmFee.tradingFee(sourceAmount, tradeFeeRate);\n\n const sourceAmountLessFees = sourceAmount.sub(tradeFee);\n\n const { sourceAmountSwapped, destinationAmountSwapped } = ConstantProductCurve.swapWithoutFees(\n sourceAmountLessFees,\n swapSourceAmount,\n swapDestinationAmount,\n );\n\n const _sourceAmountSwapped = sourceAmountSwapped.add(tradeFee);\n return {\n newSwapSourceAmount: swapSourceAmount.add(_sourceAmountSwapped),\n newSwapDestinationAmount: swapDestinationAmount.sub(destinationAmountSwapped),\n sourceAmountSwapped: _sourceAmountSwapped,\n destinationAmountSwapped,\n tradeFee,\n };\n }\n\n static swapBaseOut({\n poolMintA,\n poolMintB,\n tradeFeeRate,\n baseReserve,\n quoteReserve,\n outputMint,\n outputAmount,\n }: {\n poolMintA: ApiV3Token;\n poolMintB: ApiV3Token;\n tradeFeeRate: BN;\n baseReserve: BN;\n quoteReserve: BN;\n outputMint: string | PublicKey;\n outputAmount: BN;\n }): {\n amountRealOut: BN;\n\n amountIn: BN;\n amountInWithoutFee: BN;\n\n tradeFee: BN;\n priceImpact: number;\n } {\n const [reserveInAmount, reserveOutAmount, reserveInDecimals, reserveOutDecimals, inputMint] =\n poolMintB.address === outputMint.toString()\n ? [baseReserve, quoteReserve, poolMintA.decimals, poolMintB.decimals, poolMintA.address]\n : [quoteReserve, baseReserve, poolMintB.decimals, poolMintA.decimals, poolMintB.address];\n const currentPrice = new Decimal(reserveOutAmount.toString())\n .div(10 ** reserveOutDecimals)\n .div(new Decimal(reserveInAmount.toString()).div(10 ** reserveInDecimals));\n const amountRealOut = outputAmount.gte(reserveOutAmount) ? reserveOutAmount.sub(new BN(1)) : outputAmount;\n\n const denominator = reserveOutAmount.sub(amountRealOut);\n const amountInWithoutFee = BNDivCeil(reserveInAmount.mul(amountRealOut), denominator);\n const amountIn = BNDivCeil(amountInWithoutFee.mul(new BN(1_000_000)), new BN(1_000_000).sub(tradeFeeRate));\n const fee = amountIn.sub(amountInWithoutFee);\n const executionPrice = new Decimal(amountRealOut.toString())\n .div(10 ** reserveOutDecimals)\n .div(new Decimal(amountIn.toString()).div(10 ** reserveInDecimals));\n const priceImpact = currentPrice.isZero() ? 0 : executionPrice.sub(currentPrice).div(currentPrice).abs().toNumber();\n\n return {\n amountRealOut,\n\n amountIn,\n amountInWithoutFee,\n\n tradeFee: fee,\n priceImpact,\n };\n }\n}\n","import BN from \"bn.js\";\nimport { RoundDirection, SwapWithoutFeesResult, TradingTokenResult } from \"./calculator\";\n\nfunction checkedRem(dividend: BN, divisor: BN): BN {\n if (divisor.isZero()) throw Error(\"divisor is zero\");\n\n const result = dividend.mod(divisor);\n return result;\n}\n\nfunction checkedCeilDiv(dividend: BN, rhs: BN): BN[] {\n if (rhs.isZero()) throw Error(\"rhs is zero\");\n\n let quotient = dividend.div(rhs);\n\n if (quotient.isZero()) throw Error(\"quotient is zero\");\n\n let remainder = checkedRem(dividend, rhs);\n\n if (remainder.gt(ZERO)) {\n quotient = quotient.add(new BN(1));\n\n rhs = dividend.div(quotient);\n remainder = checkedRem(dividend, quotient);\n if (remainder.gt(ZERO)) {\n rhs = rhs.add(new BN(1));\n }\n }\n return [quotient, rhs];\n}\n\nconst ZERO = new BN(0);\n\nexport class ConstantProductCurve {\n static swapWithoutFees(sourceAmount: BN, swapSourceAmount: BN, swapDestinationAmount: BN): SwapWithoutFeesResult {\n const invariant = swapSourceAmount.mul(swapDestinationAmount);\n\n const newSwapSourceAmount = swapSourceAmount.add(sourceAmount);\n const [newSwapDestinationAmount, _newSwapSourceAmount] = checkedCeilDiv(invariant, newSwapSourceAmount);\n\n const sourceAmountSwapped = _newSwapSourceAmount.sub(swapSourceAmount);\n const destinationAmountSwapped = swapDestinationAmount.sub(newSwapDestinationAmount);\n if (destinationAmountSwapped.isZero()) throw Error(\"destinationAmountSwapped is zero\");\n\n return {\n sourceAmountSwapped,\n destinationAmountSwapped,\n };\n }\n\n static lpTokensToTradingTokens(\n lpTokenAmount: BN,\n lpTokenSupply: BN,\n swapTokenAmount0: BN,\n swapTokenAmount1: BN,\n roundDirection: RoundDirection,\n ): TradingTokenResult {\n let tokenAmount0 = lpTokenAmount.mul(swapTokenAmount0).div(lpTokenSupply);\n let tokenAmount1 = lpTokenAmount.mul(swapTokenAmount1).div(lpTokenSupply);\n\n if (roundDirection === RoundDirection.Floor) {\n return { tokenAmount0, tokenAmount1 };\n } else if (roundDirection === RoundDirection.Ceiling) {\n const tokenRemainder0 = checkedRem(lpTokenAmount.mul(swapTokenAmount0), lpTokenSupply);\n\n if (tokenRemainder0.gt(ZERO) && tokenAmount0.gt(ZERO)) {\n tokenAmount0 = tokenAmount0.add(new BN(1));\n }\n\n const token1Remainder = checkedRem(lpTokenAmount.mul(swapTokenAmount1), lpTokenSupply);\n\n if (token1Remainder.gt(ZERO) && tokenAmount1.gt(ZERO)) {\n tokenAmount1 = tokenAmount1.add(new BN(1));\n }\n\n return { tokenAmount0, tokenAmount1 };\n }\n throw Error(\"roundDirection value error\");\n }\n}\n","import BN from \"bn.js\";\n\nexport const FEE_RATE_DENOMINATOR_VALUE = new BN(1_000_000);\n\nexport function ceilDiv(tokenAmount: BN, feeNumerator: BN, feeDenominator: BN): BN {\n return tokenAmount.mul(feeNumerator).add(feeDenominator).sub(new BN(1)).div(feeDenominator);\n}\n\nexport function floorDiv(tokenAmount: BN, feeNumerator: BN, feeDenominator: BN): BN {\n return tokenAmount.mul(feeNumerator).div(feeDenominator);\n}\n\nexport class CpmmFee {\n static tradingFee(amount: BN, tradeFeeRate: BN): BN {\n return ceilDiv(amount, tradeFeeRate, FEE_RATE_DENOMINATOR_VALUE);\n }\n static protocolFee(amount: BN, protocolFeeRate: BN): BN {\n return floorDiv(amount, protocolFeeRate, FEE_RATE_DENOMINATOR_VALUE);\n }\n static fundFee(amount: BN, fundFeeRate: BN): BN {\n return floorDiv(amount, fundFeeRate, FEE_RATE_DENOMINATOR_VALUE);\n }\n}\n","import BN from \"bn.js\";\nimport { SerumVersion } from \"../serum\";\n\nexport const LIQUIDITY_FEES_NUMERATOR = new BN(25);\nexport const LIQUIDITY_FEES_DENOMINATOR = new BN(10000);\n\n// liquidity version => serum version\nexport const LIQUIDITY_VERSION_TO_SERUM_VERSION: {\n [key in 4 | 5]?: SerumVersion;\n} = {\n 4: 3,\n 5: 3,\n};\n","import { GetStructureSchema, publicKey, seq, struct, u128, u64, u8 } from \"../../marshmallow\";\n\nexport const fixedSwapInLayout = struct([u8(\"instruction\"), u64(\"amountIn\"), u64(\"minAmountOut\")]);\nexport const fixedSwapOutLayout = struct([u8(\"instruction\"), u64(\"maxAmountIn\"), u64(\"amountOut\")]);\n\nexport const createPoolV4Layout = struct([u8(\"instruction\"), u8(\"nonce\")]);\nexport const initPoolLayout = struct([u8(\"instruction\"), u8(\"nonce\"), u64(\"startTime\")]);\n/* ================= state layouts ================= */\nexport const liquidityStateV4Layout = struct([\n u64(\"status\"),\n u64(\"nonce\"),\n u64(\"maxOrder\"),\n u64(\"depth\"),\n u64(\"baseDecimal\"),\n u64(\"quoteDecimal\"),\n u64(\"state\"),\n u64(\"resetFlag\"),\n u64(\"minSize\"),\n u64(\"volMaxCutRatio\"),\n u64(\"amountWaveRatio\"),\n u64(\"baseLotSize\"),\n u64(\"quoteLotSize\"),\n u64(\"minPriceMultiplier\"),\n u64(\"maxPriceMultiplier\"),\n u64(\"systemDecimalValue\"),\n u64(\"minSeparateNumerator\"),\n u64(\"minSeparateDenominator\"),\n u64(\"tradeFeeNumerator\"),\n u64(\"tradeFeeDenominator\"),\n u64(\"pnlNumerator\"),\n u64(\"pnlDenominator\"),\n u64(\"swapFeeNumerator\"),\n u64(\"swapFeeDenominator\"),\n u64(\"baseNeedTakePnl\"),\n u64(\"quoteNeedTakePnl\"),\n u64(\"quoteTotalPnl\"),\n u64(\"baseTotalPnl\"),\n u64(\"poolOpenTime\"),\n u64(\"punishPcAmount\"),\n u64(\"punishCoinAmount\"),\n u64(\"orderbookToInitTime\"),\n // u128('poolTotalDepositPc'),\n // u128('poolTotalDepositCoin'),\n u128(\"swapBaseInAmount\"),\n u128(\"swapQuoteOutAmount\"),\n u64(\"swapBase2QuoteFee\"),\n u128(\"swapQuoteInAmount\"),\n u128(\"swapBaseOutAmount\"),\n u64(\"swapQuote2BaseFee\"),\n // amm vault\n publicKey(\"baseVault\"),\n publicKey(\"quoteVault\"),\n // mint\n publicKey(\"baseMint\"),\n publicKey(\"quoteMint\"),\n publicKey(\"lpMint\"),\n // market\n publicKey(\"openOrders\"),\n publicKey(\"marketId\"),\n publicKey(\"marketProgramId\"),\n publicKey(\"targetOrders\"),\n publicKey(\"withdrawQueue\"),\n publicKey(\"lpVault\"),\n publicKey(\"owner\"),\n // true circulating supply without lock up\n u64(\"lpReserve\"),\n seq(u64(), 3, \"padding\"),\n]);\n\nexport type LiquidityStateLayoutV4 = typeof liquidityStateV4Layout;\nexport type LiquidityStateV4 = GetStructureSchema<LiquidityStateLayoutV4>;\n\nexport const liquidityStateV5Layout = struct([\n u64(\"accountType\"),\n u64(\"status\"),\n u64(\"nonce\"),\n u64(\"maxOrder\"),\n u64(\"depth\"),\n u64(\"baseDecimal\"),\n u64(\"quoteDecimal\"),\n u64(\"state\"),\n u64(\"resetFlag\"),\n u64(\"minSize\"),\n u64(\"volMaxCutRatio\"),\n u64(\"amountWaveRatio\"),\n u64(\"baseLotSize\"),\n u64(\"quoteLotSize\"),\n u64(\"minPriceMultiplier\"),\n u64(\"maxPriceMultiplier\"),\n u64(\"systemDecimalsValue\"),\n u64(\"abortTradeFactor\"),\n u64(\"priceTickMultiplier\"),\n u64(\"priceTick\"),\n // Fees\n u64(\"minSeparateNumerator\"),\n u64(\"minSeparateDenominator\"),\n u64(\"tradeFeeNumerator\"),\n u64(\"tradeFeeDenominator\"),\n u64(\"pnlNumerator\"),\n u64(\"pnlDenominator\"),\n u64(\"swapFeeNumerator\"),\n u64(\"swapFeeDenominator\"),\n // OutPutData\n u64(\"baseNeedTakePnl\"),\n u64(\"quoteNeedTakePnl\"),\n u64(\"quoteTotalPnl\"),\n u64(\"baseTotalPnl\"),\n u64(\"poolOpenTime\"),\n u64(\"punishPcAmount\"),\n u64(\"punishCoinAmount\"),\n u64(\"orderbookToInitTime\"),\n u128(\"swapBaseInAmount\"),\n u128(\"swapQuoteOutAmount\"),\n u128(\"swapQuoteInAmount\"),\n u128(\"swapBaseOutAmount\"),\n u64(\"swapQuote2BaseFee\"),\n u64(\"swapBase2QuoteFee\"),\n\n publicKey(\"baseVault\"),\n publicKey(\"quoteVault\"),\n publicKey(\"baseMint\"),\n publicKey(\"quoteMint\"),\n publicKey(\"lpMint\"),\n\n publicKey(\"modelDataAccount\"),\n publicKey(\"openOrders\"),\n publicKey(\"marketId\"),\n publicKey(\"marketProgramId\"),\n publicKey(\"targetOrders\"),\n publicKey(\"owner\"),\n seq(u64(), 64, \"padding\"),\n]);\n\nexport const addLiquidityLayout = struct([\n u8(\"instruction\"),\n u64(\"baseAmountIn\"),\n u64(\"quoteAmountIn\"),\n u64(\"fixedSide\"),\n u64(\"otherAmountMin\"),\n]);\n\nexport const removeLiquidityLayout = struct([\n u8(\"instruction\"),\n u64(\"lpAmount\"),\n u64(\"baseAmountMin\"),\n u64(\"quoteAmountMin\"),\n]);\n\nexport type LiquidityStateLayoutV5 = typeof liquidityStateV5Layout;\nexport type LiquidityStateV5 = GetStructureSchema<LiquidityStateLayoutV5>;\n\nexport type LiquidityState = LiquidityStateV4 | LiquidityStateV5;\nexport type LiquidityStateLayout = LiquidityStateLayoutV4 | LiquidityStateLayoutV5;\n\n/* ================= index ================= */\n// version => liquidity state layout\nexport const LIQUIDITY_VERSION_TO_STATE_LAYOUT: {\n [version: number]: LiquidityStateLayout;\n} = {\n 4: liquidityStateV4Layout,\n 5: liquidityStateV5Layout,\n};\nexport const createPoolFeeLayout = struct([u64(\"fee\")]);\n","import {\n findProgramAddress,\n parseSimulateLogToJson,\n parseSimulateValue,\n simulateMultipleInstruction,\n} from \"@/common/txTool/txUtils\";\nimport { TOKEN_PROGRAM_ID } from \"@solana/spl-token\";\nimport { Connection, PublicKey } from \"@solana/web3.js\";\nimport BN from \"bn.js\";\nimport Decimal from \"decimal.js\";\nimport { AmmV4Keys, AmmV5Keys } from \"../../api/type\";\nimport { toApiV3Token } from \"../token/utils\";\nimport { makeSimulatePoolInfoInstruction } from \"./instruction\";\nimport { getSerumAssociatedAuthority } from \"./serum\";\nimport { StableLayout } from \"./stable\";\nimport { AmmRpcData, ComputeAmountOutParam, LiquidityPoolKeys } from \"./type\";\nimport { NetworkName } from \"@/config\";\n\ntype AssociatedName =\n | \"amm_associated_seed\"\n | \"lp_mint_associated_seed\"\n | \"coin_vault_associated_seed\"\n | \"pc_vault_associated_seed\"\n | \"lp_mint_associated_seed\"\n | \"temp_lp_token_associated_seed\"\n | \"open_order_associated_seed\"\n | \"target_associated_seed\"\n | \"withdraw_associated_seed\";\n\ninterface GetAssociatedParam {\n name: AssociatedName;\n programId: PublicKey;\n marketId: PublicKey;\n}\n\nexport function getAssociatedConfigId({ programId }: { programId: PublicKey }): PublicKey {\n const { publicKey } = findProgramAddress([Buffer.from(\"amm_config_account_seed\", \"utf-8\")], programId);\n return publicKey;\n}\n\nexport function getLiquidityAssociatedId({ name, programId, marketId }: GetAssociatedParam): PublicKey {\n const { publicKey } = findProgramAddress(\n [programId.toBuffer(), marketId.toBuffer(), Buffer.from(name, \"utf-8\")],\n programId,\n );\n return publicKey;\n}\n\nexport function getAssociatedOpenOrders({ programId, marketId }: { programId: PublicKey; marketId: PublicKey }) {\n const { publicKey } = findProgramAddress(\n [programId.toBuffer(), marketId.toBuffer(), Buffer.from(\"open_order_associated_seed\", \"utf-8\")],\n programId,\n );\n return publicKey;\n}\n\nexport function getLiquidityAssociatedAuthority({ programId }: { programId: PublicKey }): {\n publicKey: PublicKey;\n nonce: number;\n} {\n return findProgramAddress([Buffer.from([97, 109, 109, 32, 97, 117, 116, 104, 111, 114, 105, 116, 121])], programId);\n}\n\nexport function getAssociatedPoolKeys({\n version,\n marketVersion,\n marketId,\n baseMint,\n quoteMint,\n baseDecimals,\n quoteDecimals,\n programId,\n marketProgramId,\n}: {\n version: 4 | 5;\n marketVersion: 3;\n marketId: PublicKey;\n baseMint: PublicKey;\n quoteMint: PublicKey;\n baseDecimals: number;\n quoteDecimals: number;\n programId: PublicKey;\n marketProgramId: PublicKey;\n}): LiquidityPoolKeys {\n const id = getLiquidityAssociatedId({ name: \"amm_associated_seed\", programId, marketId });\n const lpMint = getLiquidityAssociatedId({ name: \"lp_mint_associated_seed\", programId, marketId });\n const { publicKey: authority, nonce } = getLiquidityAssociatedAuthority({ programId });\n const baseVault = getLiquidityAssociatedId({ name: \"coin_vault_associated_seed\", programId, marketId });\n const quoteVault = getLiquidityAssociatedId({ name: \"pc_vault_associated_seed\", programId, marketId });\n const lpVault = getLiquidityAssociatedId({ name: \"temp_lp_token_associated_seed\", programId, marketId });\n const openOrders = getAssociatedOpenOrders({ programId, marketId });\n const targetOrders = getLiquidityAssociatedId({ name: \"target_associated_seed\", programId, marketId });\n const withdrawQueue = getLiquidityAssociatedId({ name: \"withdraw_associated_seed\", programId, marketId });\n\n const { publicKey: marketAuthority } = getSerumAssociatedAuthority({\n programId: marketProgramId,\n marketId,\n });\n\n return {\n // base\n id,\n baseMint,\n quoteMint,\n lpMint,\n baseDecimals,\n quoteDecimals,\n lpDecimals: baseDecimals,\n // version\n version,\n programId,\n // keys\n authority,\n nonce,\n baseVault,\n quoteVault,\n lpVault,\n openOrders,\n targetOrders,\n withdrawQueue,\n // market version\n marketVersion,\n marketProgramId,\n // market keys\n marketId,\n marketAuthority,\n lookupTableAccount: PublicKey.default,\n configId: getAssociatedConfigId({ programId }),\n };\n}\n\nlet stableLayout: StableLayout | undefined;\n\nexport async function fetchMultipleInfo({\n connection,\n poolKeysList,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n config,\n}: {\n connection: Connection;\n poolKeysList: (AmmV4Keys | AmmV5Keys)[];\n config: any;\n}): Promise<\n {\n status: BN;\n baseDecimals: number;\n quoteDecimals: number;\n lpDecimals: number;\n baseReserve: BN;\n quoteReserve: BN;\n lpSupply: BN;\n startTime: BN;\n }[]\n> {\n if (!stableLayout) {\n stableLayout = new StableLayout({ connection });\n await stableLayout.initStableModelLayout();\n }\n\n const instructions = poolKeysList.map((pool) => makeSimulatePoolInfoInstruction({ poolKeys: pool }));\n const logs = await simulateMultipleInstruction(\n connection,\n instructions.map((i) => i.instruction),\n \"GetPoolData\",\n );\n\n const poolsInfo = logs.map((log) => {\n const json = parseSimulateLogToJson(log, \"GetPoolData\");\n\n const status = new BN(parseSimulateValue(json, \"status\"));\n const baseDecimals = Number(parseSimulateValue(json, \"coin_decimals\"));\n const quoteDecimals = Number(parseSimulateValue(json, \"pc_decimals\"));\n const lpDecimals = Number(parseSimulateValue(json, \"lp_decimals\"));\n const baseReserve = new BN(parseSimulateValue(json, \"pool_coin_amount\"));\n const quoteReserve = new BN(parseSimulateValue(json, \"pool_pc_amount\"));\n const lpSupply = new BN(parseSimulateValue(json, \"pool_lp_supply\"));\n // TODO fix it when split stable\n let startTime = \"0\";\n try {\n startTime = parseSimulateValue(json, \"pool_open_time\");\n } catch (error) {\n //\n }\n\n return {\n status,\n baseDecimals,\n quoteDecimals,\n lpDecimals,\n baseReserve,\n quoteReserve,\n lpSupply,\n startTime: new BN(startTime),\n };\n });\n\n return poolsInfo;\n}\n\nconst mockRewardData = {\n volume: 0,\n volumeQuote: 0,\n volumeFee: 0,\n apr: 0,\n feeApr: 0,\n priceMin: 0,\n priceMax: 0,\n rewardApr: [],\n};\n\nexport const toAmmComputePoolInfo = (\n poolData: Record<string, AmmRpcData>,\n network: NetworkName,\n): Record<string, ComputeAmountOutParam[\"poolInfo\"]> => {\n const data: Record<string, ComputeAmountOutParam[\"poolInfo\"]> = {};\n const tokenProgramStr = TOKEN_PROGRAM_ID.toBase58();\n\n Object.keys(poolData).map((poolId) => {\n const poolInfo = poolData[poolId];\n const [mintA, mintB] = [poolInfo.baseMint.toBase58(), poolInfo.quoteMint.toBase58()];\n data[poolId] = {\n id: poolId,\n version: 4,\n status: poolInfo.status.toNumber(),\n programId: poolInfo.programId.toBase58(), // needed\n mintA: toApiV3Token({\n address: mintA, // needed\n programId: tokenProgramStr,\n decimals: poolInfo.baseDecimal.toNumber(),\n network: network,\n }),\n mintB: toApiV3Token({\n address: mintB, // needed\n programId: tokenProgramStr,\n decimals: poolInfo.quoteDecimal.toNumber(),\n network: network,\n }),\n rewardDefaultInfos: [],\n rewardDefaultPoolInfos: \"Ecosystem\",\n price: poolInfo.poolPrice.toNumber(),\n mintAmountA: new Decimal(poolInfo.mintAAmount.toString()).div(10 ** poolInfo.baseDecimal.toNumber()).toNumber(),\n mintAmountB: new Decimal(poolInfo.mintBAmount.toString()).div(10 ** poolInfo.quoteDecimal.toNumber()).toNumber(),\n baseReserve: poolInfo.baseReserve, // needed\n quoteReserve: poolInfo.quoteReserve, // needed\n feeRate: new Decimal(poolInfo.tradeFeeNumerator.toString())\n .div(poolInfo.tradeFeeDenominator.toString())\n .toNumber(),\n openTime: poolInfo.poolOpenTime.toString(),\n tvl: 0,\n day: mockRewardData,\n week: mockRewardData,\n month: mockRewardData,\n pooltype: [],\n farmUpcomingCount: 0,\n farmOngoingCount: 0,\n farmFinishedCount: 0,\n type: \"Standard\",\n marketId: poolInfo.marketId.toBase58(),\n configId: getAssociatedConfigId({ programId: poolInfo.programId }).toBase58(),\n lpPrice: 0,\n lpAmount: 0,\n lpMint: toApiV3Token({\n address: poolInfo.lpMint.toBase58(),\n programId: tokenProgramStr,\n decimals: Math.min(poolInfo.baseDecimal.toNumber(), poolInfo.quoteDecimal.toNumber()),\n network: network,\n }),\n burnPercent: 0,\n };\n });\n return data;\n};\n","import { ASSOCIATED_TOKEN_PROGRAM_ID, TOKEN_PROGRAM_ID } from \"@solana/spl-token\";\nimport { PublicKey, SystemProgram, SYSVAR_RENT_PUBKEY, TransactionInstruction } from \"@solana/web3.js\";\n\nimport { AmmV4Keys, AmmV5Keys } from \"@/api/type\";\nimport { BN_ONE, BN_ZERO, parseBigNumberish } from \"@/common\";\nimport { createLogger } from \"@/common/logger\";\nimport { accountMeta, RENT_PROGRAM_ID } from \"@/common/pubKey\";\nimport { InstructionType } from \"@/common/txTool/txType\";\nimport { struct, u64, u8 } from \"@/marshmallow\";\n\nimport { jsonInfo2PoolKeys } from \"@/common/utility\";\nimport BN from \"bn.js\";\nimport { InstructionReturn } from \"../type\";\nimport {\n addLiquidityLayout,\n fixedSwapInLayout,\n fixedSwapOutLayout,\n initPoolLayout,\n removeLiquidityLayout,\n} from \"./layout\";\nimport { MODEL_DATA_PUBKEY } from \"./stable\";\nimport {\n InitPoolInstructionParamsV4,\n LiquidityAddInstructionParams,\n RemoveLiquidityInstruction,\n SwapFixedInInstructionParamsV4,\n SwapFixedOutInstructionParamsV4,\n SwapInstructionParams,\n} from \"./type\";\n\nconst logger = createLogger(\"CobaltX_liquidity_instruction\");\nexport function makeAddLiquidityInstruction(params: LiquidityAddInstructionParams): TransactionInstruction {\n const { poolInfo, poolKeys, userKeys, baseAmountIn, quoteAmountIn, fixedSide, otherAmountMin } = params;\n\n const data = Buffer.alloc(addLiquidityLayout.span);\n addLiquidityLayout.encode(\n {\n instruction: 3,\n baseAmountIn: parseBigNumberish(baseAmountIn),\n quoteAmountIn: parseBigNumberish(quoteAmountIn),\n otherAmountMin: parseBigNumberish(otherAmountMin),\n fixedSide: fixedSide === \"base\" ? BN_ZERO : BN_ONE,\n },\n data,\n );\n\n const keys = [\n accountMeta({ pubkey: TOKEN_PROGRAM_ID, isWritable: false }),\n // amm\n accountMeta({ pubkey: new PublicKey(poolInfo.id) }),\n accountMeta({ pubkey: new PublicKey(poolKeys.authority), isWritable: false }),\n accountMeta({ pubkey: new PublicKey(poolKeys.openOrders), isWritable: false }),\n accountMeta({ pubkey: new PublicKey(poolKeys.targetOrders) }),\n accountMeta({ pubkey: new PublicKey(poolInfo.lpMint.address) }),\n accountMeta({ pubkey: new PublicKey(poolKeys.vault.A) }),\n accountMeta({ pubkey: new PublicKey(poolKeys.vault.B) }),\n ];\n\n if (poolInfo.pooltype.includes(\"StablePool\")) {\n keys.push(accountMeta({ pubkey: MODEL_DATA_PUBKEY }));\n }\n\n keys.push(\n // serum\n accountMeta({ pubkey: new PublicKey(poolInfo.marketId), isWritable: false }),\n // user\n accountMeta({ pubkey: userKeys.baseTokenAccount }),\n accountMeta({ pubkey: userKeys.quoteTokenAccount }),\n accountMeta({ pubkey: userKeys.lpTokenAccount }),\n accountMeta({ pubkey: userKeys.owner, isWritable: false, isSigner: true }),\n accountMeta({ pubkey: new PublicKey(poolKeys.marketEventQueue), isWritable: false }),\n );\n\n return new TransactionInstruction({\n programId: new PublicKey(poolInfo.programId),\n keys,\n data,\n });\n}\n\nexport function removeLiquidityInstruction(params: RemoveLiquidityInstruction): TransactionInstruction {\n const { poolInfo, poolKeys: poolKeyProps, userKeys, lpAmount, baseAmountMin, quoteAmountMin } = params;\n const poolKeys = jsonInfo2PoolKeys(poolKeyProps);\n\n let version = 4;\n if (poolInfo.pooltype.includes(\"StablePool\")) version = 5;\n\n if (version === 4 || version === 5) {\n const data = Buffer.alloc(removeLiquidityLayout.span);\n removeLiquidityLayout.encode(\n {\n instruction: 4,\n lpAmount: parseBigNumberish(lpAmount),\n baseAmountMin: parseBigNumberish(baseAmountMin),\n quoteAmountMin: parseBigNumberish(quoteAmountMin),\n },\n data,\n );\n\n const keys = [\n // system\n accountMeta({ pubkey: TOKEN_PROGRAM_ID, isWritable: false }),\n // amm\n accountMeta({ pubkey: poolKeys.id }),\n accountMeta({ pubkey: poolKeys.authority, isWritable: false }),\n accountMeta({ pubkey: poolKeys.openOrders }),\n accountMeta({ pubkey: poolKeys.targetOrders }),\n accountMeta({ pubkey: poolKeys.mintLp.address }),\n accountMeta({ pubkey: poolKeys.vault.A }),\n accountMeta({ pubkey: poolKeys.vault.B }),\n ];\n\n if (version === 5) {\n keys.push(accountMeta({ pubkey: MODEL_DATA_PUBKEY }));\n } else {\n keys.push(accountMeta({ pubkey: poolKeys.id }));\n keys.push(accountMeta({ pubkey: poolKeys.id }));\n }\n\n keys.push(\n // serum\n accountMeta({ pubkey: poolKeys.marketProgramId, isWritable: false }),\n accountMeta({ pubkey: poolKeys.marketId }),\n accountMeta({ pubkey: poolKeys.marketBaseVault }),\n accountMeta({ pubkey: poolKeys.marketQuoteVault }),\n accountMeta({ pubkey: poolKeys.marketAuthority, isWritable: false }),\n // user\n accountMeta({ pubkey: userKeys.lpTokenAccount }),\n accountMeta({ pubkey: userKeys.baseTokenAccount }),\n accountMeta({ pubkey: userKeys.quoteTokenAccount }),\n accountMeta({ pubkey: userKeys.owner, isWritable: false, isSigner: true }),\n // serum orderbook\n accountMeta({ pubkey: poolKeys.marketEventQueue }),\n accountMeta({ pubkey: poolKeys.marketBids }),\n accountMeta({ pubkey: poolKeys.marketAsks }),\n );\n\n return new TransactionInstruction({\n programId: poolKeys.programId,\n keys,\n data,\n });\n }\n\n // logger.logWithError(\"invalid version\", \"poolKeys.version\", version);\n return new TransactionInstruction({ programId: poolKeys.programId, keys: [] }); // won't reach\n}\n\nexport function createPoolV4InstructionV2({\n programId,\n ammId,\n ammAuthority,\n ammOpenOrders,\n lpMint,\n coinMint,\n pcMint,\n coinVault,\n pcVault,\n withdrawQueue,\n ammTargetOrders,\n poolTempLp,\n marketProgramId,\n marketId,\n userWallet,\n userCoinVault,\n userPcVault,\n userLpVault,\n nonce,\n openTime,\n coinAmount,\n pcAmount,\n ammConfigId,\n feeDestinationId,\n}: {\n programId: PublicKey;\n ammId: PublicKey;\n ammAuthority: PublicKey;\n ammOpenOrders: PublicKey;\n lpMint: PublicKey;\n coinMint: PublicKey;\n pcMint: PublicKey;\n coinVault: PublicKey;\n pcVault: PublicKey;\n withdrawQueue: PublicKey;\n ammTargetOrders: PublicKey;\n poolTempLp: PublicKey;\n marketProgramId: PublicKey;\n marketId: PublicKey;\n userWallet: PublicKey;\n userCoinVault: PublicKey;\n userPcVault: PublicKey;\n userLpVault: PublicKey;\n ammConfigId: PublicKey;\n feeDestinationId: PublicKey;\n\n nonce: number;\n openTime: BN;\n coinAmount: BN;\n pcAmount: BN;\n}): InstructionReturn {\n const dataLayout = struct([u8(\"instruction\"), u8(\"nonce\"), u64(\"openTime\"), u64(\"pcAmount\"), u64(\"coinAmount\")]);\n\n const keys = [\n { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },\n { pubkey: ASSOCIATED_TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },\n { pubkey: SystemProgram.programId, isSigner: false, isWritable: false },\n { pubkey: RENT_PROGRAM_ID, isSigner: false, isWritable: false },\n { pubkey: ammId, isSigner: false, isWritable: true },\n { pubkey: ammAuthority, isSigner: false, isWritable: false },\n { pubkey: ammOpenOrders, isSigner: false, isWritable: true },\n { pubkey: lpMint, isSigner: false, isWritable: true },\n { pubkey: coinMint, isSigner: false, isWritable: false },\n { pubkey: pcMint, isSigner: false, isWritable: false },\n { pubkey: coinVault, isSigner: false, isWritable: true },\n { pubkey: pcVault, isSigner: false, isWritable: true }, //12\n { pubkey: ammTargetOrders, isSigner: false, isWritable: true }, //13\n { pubkey: ammConfigId, isSigner: false, isWritable: false },\n { pubkey: feeDestinationId, isSigner: false, isWritable: true },\n { pubkey: marketProgramId, isSigner: false, isWritable: false },\n { pubkey: marketId, isSigner: false, isWritable: false },\n { pubkey: userWallet, isSigner: true, isWritable: true },\n { pubkey: userCoinVault, isSigner: false, isWritable: true },\n { pubkey: userPcVault, isSigner: false, isWritable: true },\n { pubkey: userLpVault, isSigner: false, isWritable: true },\n ];\n\n const data = Buffer.alloc(dataLayout.span);\n dataLayout.encode({ instruction: 1, nonce, openTime, coinAmount, pcAmount }, data);\n\n return {\n instruction: new TransactionInstruction({\n keys,\n programId,\n data,\n }),\n instructionType: InstructionType.AmmV4CreatePool,\n };\n}\n\nexport function simulatePoolInfoInstruction(poolKeys: AmmV4Keys | AmmV5Keys): TransactionInstruction {\n const simulatePoolLayout = struct([u8(\"instruction\"), u8(\"simulateType\")]);\n const data = Buffer.alloc(simulatePoolLayout.span);\n simulatePoolLayout.encode(\n {\n instruction: 12,\n simulateType: 0,\n },\n data,\n );\n\n const keys = [\n // amm\n accountMeta({ pubkey: new PublicKey(poolKeys.id), isWritable: false }),\n accountMeta({ pubkey: new PublicKey(poolKeys.authority), isWritable: false }),\n accountMeta({ pubkey: new PublicKey(poolKeys.openOrders), isWritable: false }),\n accountMeta({ pubkey: new PublicKey(poolKeys.vault.A), isWritable: false }),\n accountMeta({ pubkey: new PublicKey(poolKeys.vault.B), isWritable: false }),\n accountMeta({ pubkey: new PublicKey(poolKeys.mintLp.address), isWritable: false }),\n // serum\n accountMeta({ pubkey: new PublicKey(poolKeys.marketId), isWritable: false }),\n accountMeta({ pubkey: new PublicKey(poolKeys.marketEventQueue), isWritable: false }),\n ];\n\n return new TransactionInstruction({\n programId: new PublicKey(poolKeys.programId),\n keys,\n data,\n });\n}\n\nexport function makeSwapFixedInInstruction(\n { poolKeys: propPoolKeys, userKeys, amountIn, minAmountOut }: SwapFixedInInstructionParamsV4,\n version: number,\n): TransactionInstruction {\n const poolKeys = jsonInfo2PoolKeys(propPoolKeys);\n const data = Buffer.alloc(fixedSwapInLayout.span);\n fixedSwapInLayout.encode(\n {\n instruction: 9,\n amountIn: parseBigNumberish(amountIn),\n minAmountOut: parseBigNumberish(minAmountOut),\n },\n data,\n );\n const keys = [\n // amm\n accountMeta({ pubkey: TOKEN_PROGRAM_ID, isWritable: false }),\n accountMeta({ pubkey: poolKeys.id }),\n accountMeta({ pubkey: poolKeys.authority, isWritable: false }),\n accountMeta({ pubkey: poolKeys.openOrders }),\n ];\n\n if (version === 4) keys.push(accountMeta({ pubkey: poolKeys.targetOrders }));\n keys.push(accountMeta({ pubkey: poolKeys.vault.A }), accountMeta({ pubkey: poolKeys.vault.B }));\n if (version === 5) keys.push(accountMeta({ pubkey: MODEL_DATA_PUBKEY }));\n keys.push(\n // serum\n accountMeta({ pubkey: poolKeys.marketProgramId, isWritable: false }),\n accountMeta({ pubkey: poolKeys.marketId }),\n accountMeta({ pubkey: poolKeys.marketBids }),\n accountMeta({ pubkey: poolKeys.marketAsks }),\n accountMeta({ pubkey: poolKeys.marketEventQueue }),\n accountMeta({ pubkey: poolKeys.marketBaseVault }),\n accountMeta({ pubkey: poolKeys.marketQuoteVault }),\n accountMeta({ pubkey: poolKeys.marketAuthority, isWritable: false }),\n // user\n accountMeta({ pubkey: userKeys.tokenAccountIn }),\n accountMeta({ pubkey: userKeys.tokenAccountOut }),\n accountMeta({ pubkey: userKeys.owner, isWritable: false }),\n );\n\n return new TransactionInstruction({\n programId: poolKeys.programId,\n keys,\n data,\n });\n}\n\nexport function makeSwapFixedOutInstruction(\n { poolKeys: propPoolKeys, userKeys, maxAmountIn, amountOut }: SwapFixedOutInstructionParamsV4,\n version: number,\n): TransactionInstruction {\n const poolKeys = jsonInfo2PoolKeys(propPoolKeys);\n const data = Buffer.alloc(fixedSwapOutLayout.span);\n fixedSwapOutLayout.encode(\n {\n instruction: 11,\n maxAmountIn: parseBigNumberish(maxAmountIn),\n amountOut: parseBigNumberish(amountOut),\n },\n data,\n );\n\n const keys = [\n accountMeta({ pubkey: TOKEN_PROGRAM_ID, isWritable: false }),\n // amm\n accountMeta({ pubkey: poolKeys.id }),\n accountMeta({ pubkey: poolKeys.authority, isWritable: false }),\n accountMeta({ pubkey: poolKeys.openOrders }),\n accountMeta({ pubkey: poolKeys.targetOrders }),\n accountMeta({ pubkey: poolKeys.vault.A }),\n accountMeta({ pubkey: poolKeys.vault.B }),\n ];\n\n if (version === 5) keys.push(accountMeta({ pubkey: MODEL_DATA_PUBKEY }));\n\n keys.push(\n // serum\n accountMeta({ pubkey: poolKeys.marketProgramId, isWritable: false }),\n accountMeta({ pubkey: poolKeys.marketId }),\n accountMeta({ pubkey: poolKeys.marketBids }),\n accountMeta({ pubkey: poolKeys.marketAsks }),\n accountMeta({ pubkey: poolKeys.marketEventQueue }),\n accountMeta({ pubkey: poolKeys.marketBaseVault }),\n accountMeta({ pubkey: poolKeys.marketQuoteVault }),\n accountMeta({ pubkey: poolKeys.marketAuthority, isWritable: false }),\n accountMeta({ pubkey: userKeys.tokenAccountIn }),\n accountMeta({ pubkey: userKeys.tokenAccountOut }),\n accountMeta({ pubkey: userKeys.owner, isWritable: false, isSigner: true }),\n );\n\n return new TransactionInstruction({\n programId: poolKeys.programId,\n keys,\n data,\n });\n}\n\nexport function makeAMMSwapInstruction(params: SwapInstructionParams): TransactionInstruction {\n const { poolKeys, version, userKeys, amountIn, amountOut, fixedSide } = params;\n if (version === 4 || version === 5) {\n const props = { poolKeys, userKeys };\n if (fixedSide === \"in\") {\n return makeSwapFixedInInstruction(\n {\n ...props,\n amountIn,\n minAmountOut: amountOut,\n },\n version,\n );\n } else if (fixedSide === \"out\") {\n return makeSwapFixedOutInstruction(\n {\n ...props,\n maxAmountIn: amountIn,\n amountOut,\n },\n version,\n );\n }\n logger.logWithError(\"invalid params\", \"params\", params);\n }\n\n logger.logWithError(\"invalid version\", \"poolKeys.version\", version);\n throw new Error(\"invalid version\");\n}\n\nexport function makeInitPoolInstructionV4({\n poolKeys: propPoolKeys,\n userKeys,\n startTime,\n}: InitPoolInstructionParamsV4): TransactionInstruction {\n const data = Buffer.alloc(initPoolLayout.span);\n initPoolLayout.encode(\n {\n instruction: 0,\n // nonce: poolKeys.nonce, // to do fix\n nonce: 5,\n startTime: parseBigNumberish(startTime),\n },\n data,\n );\n const poolKeys = jsonInfo2PoolKeys(propPoolKeys);\n\n const keys = [\n // system\n accountMeta({ pubkey: TOKEN_PROGRAM_ID, isWritable: false }),\n accountMeta({ pubkey: SystemProgram.programId, isWritable: false }),\n accountMeta({ pubkey: SYSVAR_RENT_PUBKEY, isWritable: false }),\n // amm\n accountMeta({ pubkey: poolKeys.id }),\n accountMeta({ pubkey: poolKeys.authority, isWritable: false }),\n accountMeta({ pubkey: poolKeys.openOrders }),\n accountMeta({ pubkey: poolKeys.mintLp.address }),\n accountMeta({ pubkey: poolKeys.mintA.address, isWritable: false }),\n accountMeta({ pubkey: poolKeys.mintB.address, isWritable: false }),\n accountMeta({ pubkey: poolKeys.vault.A, isWritable: false }),\n accountMeta({ pubkey: poolKeys.vault.B, isWritable: false }),\n accountMeta({ pubkey: poolKeys.id }),\n accountMeta({ pubkey: poolKeys.targetOrders }),\n accountMeta({ pubkey: userKeys.lpTokenAccount }),\n accountMeta({ pubkey: poolKeys.id, isWritable: false }),\n // serum\n accountMeta({ pubkey: poolKeys.marketProgramId, isWritable: false }),\n accountMeta({ pubkey: poolKeys.marketId, isWritable: false }),\n // user\n accountMeta({ pubkey: userKeys.payer, isSigner: true }),\n ];\n\n return new TransactionInstruction({\n programId: poolKeys.programId,\n keys,\n data,\n });\n}\n\nexport function makeSimulatePoolInfoInstruction({ poolKeys }: { poolKeys: AmmV4Keys | AmmV5Keys }): {\n instruction: TransactionInstruction;\n} {\n const LAYOUT = struct([u8(\"instruction\"), u8(\"simulateType\")]);\n const data = Buffer.alloc(LAYOUT.span);\n LAYOUT.encode(\n {\n instruction: 12,\n simulateType: 0,\n },\n data,\n );\n\n const keys = [\n // amm\n accountMeta({ pubkey: new PublicKey(poolKeys.id), isWritable: false }),\n accountMeta({ pubkey: new PublicKey(poolKeys.authority), isWritable: false }),\n accountMeta({ pubkey: new PublicKey(poolKeys.openOrders), isWritable: false }),\n accountMeta({ pubkey: new PublicKey(poolKeys.vault.A), isWritable: false }),\n accountMeta({ pubkey: new PublicKey(poolKeys.vault.B), isWritable: false }),\n accountMeta({ pubkey: new PublicKey(poolKeys.mintLp.address), isWritable: false }),\n // serum\n accountMeta({ pubkey: new PublicKey(poolKeys.marketId), isWritable: false }),\n accountMeta({ pubkey: new PublicKey(poolKeys.marketEventQueue), isWritable: false }),\n ];\n\n return {\n instruction: new TransactionInstruction({\n programId: new PublicKey(poolKeys.programId),\n keys,\n data,\n }),\n };\n}\n","import { Connection, PublicKey } from \"@solana/web3.js\";\n\nimport { seq, struct, u64 } from \"../../marshmallow\";\n\nexport const MODEL_DATA_PUBKEY = new PublicKey(\"CDSr3ssLcRB6XYPJwAfFt18MZvEZp4LjHcvzBVZ45duo\");\nconst ELEMENT_SIZE = 50000;\n\nexport const DataElement = struct([u64(\"x\"), u64(\"y\"), u64(\"price\")]);\n\nexport const modelDataInfoLayout = struct([\n u64(\"accountType\"),\n u64(\"status\"),\n u64(\"multiplier\"),\n u64(\"validDataCount\"),\n seq(DataElement, ELEMENT_SIZE, \"DataElement\"),\n]);\n\nexport interface StableModelLayout {\n accountType: number;\n status: number;\n multiplier: number;\n validDataCount: number;\n DataElement: { x: number; y: number; price: number }[];\n}\n\nfunction estimateRangeByXyReal(_xReal: number, _yReal: number): number[] {\n return [0, ELEMENT_SIZE - 2];\n}\n\nfunction estimateRangeByX(_x: number): number[] {\n return [0, ELEMENT_SIZE - 2];\n}\n\nfunction estimateRangeByY(_y: number): number[] {\n return [0, ELEMENT_SIZE - 2];\n}\n\nfunction getMininumRangeByXyReal(\n layoutData: StableModelLayout,\n xReal: number,\n yReal: number,\n): [number, number, boolean] {\n const [min, max] = estimateRangeByXyReal(xReal, yReal);\n let minRangeIdx = min;\n let maxRangeIdx = max;\n let mid = 0;\n const target = (xReal * layoutData.multiplier) / yReal;\n while (minRangeIdx <= maxRangeIdx) {\n mid = Math.floor((maxRangeIdx + minRangeIdx) / 2);\n if (mid === 0 || mid >= ELEMENT_SIZE - 2) {\n return [mid, mid, false];\n }\n const cur = (layoutData.DataElement[mid].x * layoutData.multiplier) / layoutData.DataElement[mid].y;\n const left = (layoutData.DataElement[mid - 1].x * layoutData.multiplier) / layoutData.DataElement[mid - 1].y;\n const right = (layoutData.DataElement[mid + 1].x * layoutData.multiplier) / layoutData.DataElement[mid + 1].y;\n\n if (target === cur) {\n return [mid, mid, true];\n } else if (target === left) {\n return [mid - 1, mid - 1, true];\n } else if (target === right) {\n return [mid + 1, mid + 1, true];\n } else if (target < left) {\n maxRangeIdx = mid - 1;\n } else if (target > left && target < cur) {\n return [mid - 1, mid, true];\n } else if (target > cur && target < right) {\n return [mid, mid + 1, true];\n } else {\n minRangeIdx = mid + 1;\n }\n }\n return [mid, mid, false];\n}\nfunction getRatio(layoutData: StableModelLayout, xReal: number, yReal: number): number {\n const [minRangeIdx, maxRangeIdx, find] = getMininumRangeByXyReal(layoutData, xReal, yReal);\n\n if (!find) {\n return 0;\n }\n\n if (minRangeIdx === maxRangeIdx) {\n const x = layoutData.DataElement[minRangeIdx].x;\n const ratio = (xReal * layoutData.multiplier) / x;\n return ratio;\n } else {\n const x1 = layoutData.DataElement[minRangeIdx].x;\n const y1 = layoutData.DataElement[minRangeIdx].y;\n const x2 = layoutData.DataElement[maxRangeIdx].x;\n const y2 = layoutData.DataElement[maxRangeIdx].y;\n\n const xDenominator = yReal * (x2 * y1 - x1 * y2);\n const xNumerator1 = x1 * xDenominator;\n const xNumerator2 = (x2 - x1) * (xReal * y1 - x1 * yReal) * y2;\n\n const xNumerator = xNumerator1 + xNumerator2;\n const ratio = (xReal * layoutData.multiplier * xDenominator) / xNumerator;\n return ratio;\n }\n}\n\nfunction realToTable(layoutData: StableModelLayout, realValue: number, ratio: number): number {\n return (realValue * layoutData.multiplier) / ratio;\n}\n\nfunction tableToReal(layoutData: StableModelLayout, tableValue: number, ratio: number): number {\n return (tableValue * ratio) / layoutData.multiplier;\n}\n\nfunction getMinimumRangeByX(layoutData: StableModelLayout, x: number): [number, number, boolean] {\n const [min, max] = estimateRangeByX(x);\n let minRangeIdx = min;\n let maxRangeIdx = max;\n let mid = 0;\n const target = x;\n while (minRangeIdx < maxRangeIdx) {\n mid = Math.floor((maxRangeIdx + minRangeIdx) / 2);\n\n if (mid <= 0 || mid > ELEMENT_SIZE - 2) {\n return [mid, mid, false];\n }\n const cur = layoutData.DataElement[mid].x;\n const left = layoutData.DataElement[mid - 1].x;\n const right = layoutData.DataElement[mid + 1].x;\n\n if (target === cur) return [mid, mid, true];\n else if (target === left) return [mid - 1, mid - 1, true];\n else if (target === right) return [mid + 1, mid + 1, true];\n else if (target < left) maxRangeIdx = mid - 1;\n else if (target > left && target < cur) return [mid - 1, mid, true];\n else if (target > cur && target < right) return [mid, mid + 1, true];\n else minRangeIdx = mid + 1;\n }\n return [mid, mid, false];\n}\n\nfunction getMinimumRangeByY(layoutData: StableModelLayout, y: number): [number, number, boolean] {\n const [min, max] = estimateRangeByY(y);\n let minRangeIdx = min;\n let maxRangeIdx = max;\n let mid = 0;\n const target = y;\n while (minRangeIdx <= maxRangeIdx) {\n mid = Math.floor((maxRangeIdx + minRangeIdx) / 2);\n if (mid <= 0 || mid >= ELEMENT_SIZE - 2) {\n return [mid, mid, false];\n }\n\n const cur = layoutData.DataElement[mid].y;\n const left = layoutData.DataElement[mid - 1].y;\n const right = layoutData.DataElement[mid + 1].y;\n if (target === cur) return [mid, mid, true];\n else if (target === left) return [mid - 1, mid - 1, true];\n else if (target === right) return [mid + 1, mid + 1, true];\n else if (target < right) {\n minRangeIdx = mid + 1;\n } else if (target < left && target > cur) return [mid - 1, mid, true];\n else if (target < cur && target > right) return [mid, mid + 1, true];\n else maxRangeIdx = mid - 1;\n }\n return [mid, mid, false];\n}\n\nfunction getDataByX(\n layoutData: StableModelLayout,\n x: number,\n dx: number,\n priceUp: boolean,\n): [number, number, boolean, boolean] {\n const xWithDx = priceUp ? x + dx : x - dx;\n const [minIdx, maxIdx, find] = getMinimumRangeByX(layoutData, xWithDx);\n if (!find) return [0, 0, false, find];\n\n if (minIdx === maxIdx) return [layoutData.DataElement[maxIdx].price, layoutData.DataElement[maxIdx].y, false, find];\n else {\n const x1 = layoutData.DataElement[minIdx].x;\n const x2 = layoutData.DataElement[maxIdx].x;\n const p1 = layoutData.DataElement[minIdx].price;\n const p2 = layoutData.DataElement[maxIdx].price;\n const y1 = layoutData.DataElement[minIdx].y;\n const y2 = layoutData.DataElement[maxIdx].y;\n\n if (x >= x1 && x <= x2) {\n if (priceUp) return [p2, y2, true, find];\n else return [p1, y1, true, find];\n } else {\n let p, y;\n if (priceUp) {\n p = p1 + ((p2 - p1) * (x - x1)) / (x2 - x1);\n y = y1 - ((xWithDx - x1) * layoutData.multiplier) / p2;\n } else {\n p = p1 + ((p2 - p1) * (x - x1)) / (x2 - x1);\n y = y2 + ((x2 - xWithDx) * layoutData.multiplier) / p1;\n }\n return [p, y, false, find];\n }\n }\n}\n\nfunction getDataByY(\n layoutData: StableModelLayout,\n y: number,\n dy: number,\n priceUp: boolean,\n): [number, number, boolean, boolean] {\n const yWithDy = priceUp ? y - dy : y + dy;\n const [minIdx, maxIdx, find] = getMinimumRangeByY(layoutData, yWithDy);\n if (!find) return [0, 0, false, find];\n if (minIdx === maxIdx) return [layoutData.DataElement[maxIdx].price, layoutData.DataElement[maxIdx].x, false, find];\n else {\n const x1 = layoutData.DataElement[minIdx].x;\n const x2 = layoutData.DataElement[maxIdx].x;\n const p1 = layoutData.DataElement[minIdx].price;\n const p2 = layoutData.DataElement[maxIdx].price;\n const y1 = layoutData.DataElement[minIdx].y;\n const y2 = layoutData.DataElement[maxIdx].y;\n\n if (y >= y2 && y <= y1) {\n return priceUp ? [p2, x2, true, find] : [p1, x1, true, find];\n } else {\n let p, x;\n if (priceUp) {\n p = p1 + ((p2 - p1) * (y1 - y)) / (y1 - y2);\n x = x1 + (p2 * (y1 - yWithDy)) / layoutData.multiplier;\n } else {\n p = p1 + ((p2 - p1) * (y1 - y)) / (y1 - y2);\n x = x2 - (p1 * (yWithDy - y2)) / layoutData.multiplier;\n }\n return [p, x, false, find];\n }\n }\n}\n\nfunction getMidPrice(layoutData: StableModelLayout, x: number): number {\n const ret = getDataByX(layoutData, x, 0, false);\n if (ret[3]) return ret[0];\n else return 0;\n}\n\nexport function getDyByDxBaseIn(layoutData: StableModelLayout, xReal: number, yReal: number, dxReal: number): number {\n const ratio = getRatio(layoutData, xReal, yReal);\n const x = realToTable(layoutData, xReal, ratio);\n const y = realToTable(layoutData, yReal, ratio);\n const dx = realToTable(layoutData, dxReal, ratio);\n const priceUp = true;\n const [p, y2, lessTrade, find] = getDataByX(layoutData, x, dx, priceUp);\n if (!find) return 0;\n if (lessTrade) {\n const dyReal = (dxReal * layoutData.multiplier) / p;\n return dyReal;\n } else {\n const dy = y - y2;\n const dyReal = tableToReal(layoutData, dy, ratio);\n return dyReal;\n }\n}\n\nexport function getDxByDyBaseIn(layoutData: StableModelLayout, xReal: number, yReal: number, dyReal: number): number {\n const ratio = getRatio(layoutData, xReal, yReal);\n const x = realToTable(layoutData, xReal, ratio);\n const y = realToTable(layoutData, yReal, ratio);\n const dy = realToTable(layoutData, dyReal, ratio);\n const priceUp = false;\n const [p, x2, lessTrade, find] = getDataByY(layoutData, y, dy, priceUp);\n if (!find) return 0;\n if (lessTrade) {\n const dxReal = (dyReal * p) / layoutData.multiplier;\n return dxReal;\n } else {\n const dx = x - x2;\n const dxReal = tableToReal(layoutData, dx, ratio);\n return dxReal;\n }\n}\n\nexport function formatLayout(buffer: Buffer): StableModelLayout {\n const layoutInfo = modelDataInfoLayout.decode(buffer);\n return {\n accountType: layoutInfo.accountType.toNumber(),\n status: layoutInfo.status.toNumber(),\n multiplier: layoutInfo.multiplier.toNumber(),\n validDataCount: layoutInfo.validDataCount.toNumber(),\n DataElement: layoutInfo.DataElement.map((item: any) => ({\n x: item.x.toNumber(),\n y: item.y.toNumber(),\n price: item.price.toNumber(),\n })),\n };\n}\n\nexport function getStablePrice(\n layoutData: StableModelLayout,\n coinReal: number,\n pcReal: number,\n baseCoin: boolean,\n): number {\n const price =\n getMidPrice(layoutData, realToTable(layoutData, coinReal, getRatio(layoutData, coinReal, pcReal))) /\n layoutData.multiplier;\n return baseCoin ? price : 1 / price;\n}\n\nexport class StableLayout {\n private readonly connection: Connection;\n private _layoutData: StableModelLayout = {\n accountType: 0,\n status: 0,\n multiplier: 0,\n validDataCount: 0,\n DataElement: [],\n };\n\n constructor({ connection }: { connection: Connection }) {\n this.connection = connection;\n }\n\n get stableModelData(): StableModelLayout {\n return this._layoutData;\n }\n\n public async initStableModelLayout(): Promise<void> {\n if (this._layoutData.validDataCount === 0) {\n if (this.connection) {\n const acc = await this.connection.getAccountInfo(MODEL_DATA_PUBKEY);\n if (acc) this._layoutData = formatLayout(acc?.data);\n }\n }\n }\n}\n","import { PublicKey } from \"@solana/web3.js\";\nimport { createLogger } from \"../../common/logger\";\nimport { SerumVersion } from \"../serum\";\nimport { LIQUIDITY_VERSION_TO_SERUM_VERSION } from \"./constant\";\n\nconst logger = createLogger(\"CobaltX_liquidity_serum\");\n\nexport function getSerumVersion(version: number): SerumVersion {\n const serumVersion = LIQUIDITY_VERSION_TO_SERUM_VERSION[version];\n if (!serumVersion) logger.logWithError(\"invalid version\", \"version\", version);\n\n return serumVersion;\n}\n\nexport function getSerumAssociatedAuthority({ programId, marketId }: { programId: PublicKey; marketId: PublicKey }): {\n publicKey: PublicKey;\n nonce: number;\n} {\n const seeds = [marketId.toBuffer()];\n\n let nonce = 0;\n let publicKey: PublicKey;\n\n while (nonce < 100) {\n try {\n const seedsWithNonce = seeds.concat(Buffer.from([nonce]), Buffer.alloc(7));\n publicKey = PublicKey.createProgramAddressSync(seedsWithNonce, programId);\n } catch (err) {\n if (err instanceof TypeError) {\n throw err;\n }\n nonce++;\n continue;\n }\n return { publicKey, nonce };\n }\n\n logger.logWithError(\"unable to find a viable program address nonce\", \"params\", {\n programId,\n marketId,\n });\n throw new Error(\"unable to find a viable program address nonce\");\n}\n","import { PublicKey } from \"@solana/web3.js\";\nimport { SERUM_PROGRAM_ID_V3 } from \"../../common/programId\";\nimport { SerumVersion } from \"./type\";\n\n// serum program id string => serum version\nexport const SERUM_PROGRAMID_TO_VERSION: {\n [key: string]: SerumVersion;\n} = {\n [SERUM_PROGRAM_ID_V3.toBase58()]: 3,\n};\n\n// serum version => serum program id\nexport const SERUM_VERSION_TO_PROGRAMID: { [key in SerumVersion]?: PublicKey } & {\n [K: number]: PublicKey;\n} = {\n 3: SERUM_PROGRAM_ID_V3,\n};\n","import { blob, GetStructureSchema, publicKey, struct, u64 } from \"../../marshmallow\";\n\n/* ================= state layouts ================= */\nexport const MARKET_STATE_LAYOUT_V3 = struct([\n blob(5),\n\n blob(8), // accountFlagsLayout('accountFlags'),\n\n publicKey(\"ownAddress\"),\n\n u64(\"vaultSignerNonce\"),\n\n publicKey(\"baseMint\"),\n publicKey(\"quoteMint\"),\n\n publicKey(\"baseVault\"),\n u64(\"baseDepositsTotal\"),\n u64(\"baseFeesAccrued\"),\n\n publicKey(\"quoteVault\"),\n u64(\"quoteDepositsTotal\"),\n u64(\"quoteFeesAccrued\"),\n\n u64(\"quoteDustThreshold\"),\n\n publicKey(\"requestQueue\"),\n publicKey(\"eventQueue\"),\n\n publicKey(\"bids\"),\n publicKey(\"asks\"),\n\n u64(\"baseLotSize\"),\n u64(\"quoteLotSize\"),\n\n u64(\"feeRateBps\"),\n\n u64(\"referrerRebatesAccrued\"),\n\n blob(7),\n]);\n\nexport type MarketStateLayoutV3 = typeof MARKET_STATE_LAYOUT_V3;\nexport type MarketStateLayout = MarketStateLayoutV3;\n\nexport type MarketStateV3 = GetStructureSchema<MarketStateLayoutV3>;\nexport type MarketState = MarketStateV3;\n\n/* ================= index ================= */\n// version => market state layout\nexport const MARKET_VERSION_TO_STATE_LAYOUT: {\n [version: number]: MarketStateLayout;\n} = {\n 3: MARKET_STATE_LAYOUT_V3,\n};\n","import { PublicKey } from \"@solana/web3.js\";\n\nimport { createLogger } from \"../../common/logger\";\n\nimport { SERUM_PROGRAMID_TO_VERSION, SERUM_VERSION_TO_PROGRAMID } from \"./id\";\nimport { MARKET_VERSION_TO_STATE_LAYOUT, MarketStateLayout } from \"./layout\";\n\nconst logger = createLogger(\"Serum\");\n\nexport class Market {\n /* ================= get version and program id ================= */\n static getProgramId(version: number): PublicKey {\n const programId = SERUM_VERSION_TO_PROGRAMID[version];\n if (!programId) logger.logWithError(\"invalid version\", \"version\", version);\n\n return programId;\n }\n\n static getVersion(programId: PublicKey): number {\n const programIdString = programId.toBase58();\n\n const version = SERUM_PROGRAMID_TO_VERSION[programIdString];\n if (!version) logger.logWithError(\"invalid program id\", \"programId\", programIdString);\n\n return version;\n }\n\n /* ================= get layout ================= */\n static getStateLayout(version: number): MarketStateLayout {\n const STATE_LAYOUT = MARKET_VERSION_TO_STATE_LAYOUT[version];\n if (!STATE_LAYOUT) logger.logWithError(!!STATE_LAYOUT, \"invalid version\", \"version\", version);\n\n return STATE_LAYOUT;\n }\n\n static getLayouts(version: number): { state: MarketStateLayout } {\n return { state: this.getStateLayout(version) };\n }\n\n /* ================= get key ================= */\n static getAssociatedAuthority({ programId, marketId }: { programId: PublicKey; marketId: PublicKey }): {\n publicKey: PublicKey;\n nonce: number;\n } {\n const seeds = [marketId.toBuffer()];\n\n let nonce = 0;\n let publicKey: PublicKey;\n\n while (nonce < 100) {\n try {\n const seedsWithNonce = seeds.concat(Buffer.from([nonce]), Buffer.alloc(7));\n publicKey = PublicKey.createProgramAddressSync(seedsWithNonce, programId);\n } catch (err) {\n if (err instanceof TypeError) {\n throw err;\n }\n nonce++;\n continue;\n }\n return { publicKey, nonce };\n }\n\n logger.logWithError(\"unable to find a viable program address nonce\", \"params\", {\n programId,\n marketId,\n });\n\n return { publicKey: PublicKey.default, nonce };\n }\n}\n","import { ASSOCIATED_TOKEN_PROGRAM_ID, TOKEN_2022_PROGRAM_ID, TOKEN_PROGRAM_ID } from \"@solana/spl-token\";\nimport { PublicKey, SystemProgram, TransactionInstruction } from \"@solana/web3.js\";\nimport BN from \"bn.js\";\n\nimport {\n ALL_PROGRAM_ID,\n InstructionType,\n LIQUIDITY_POOL_PROGRAM_ID_V5_MODEL,\n MEMO_PROGRAM_ID2,\n accountMeta,\n getATAAddress,\n jsonInfo2PoolKeys,\n} from \"@/common\";\nimport { seq, struct, u128, u64, u8 } from \"../../marshmallow\";\nimport {\n ClmmInstrument,\n MAX_SQRT_PRICE_X64,\n MAX_SQRT_PRICE_X64_SUB_ONE,\n MIN_SQRT_PRICE_X64,\n MIN_SQRT_PRICE_X64_ADD_ONE,\n ONE,\n getPdaExBitmapAccount,\n} from \"../clmm\";\nimport { makeAMMSwapInstruction } from \"../liquidity/instruction\";\n\nimport { AmmV4Keys, AmmV5Keys, ApiV3PoolInfoItem, ClmmKeys, CpmmKeys, PoolKeys } from \"../../api/type\";\nimport { makeSwapCpmmBaseInInInstruction } from \"../cpmm\";\nimport { ComputePoolType, MakeSwapInstructionParam, ReturnTypeMakeSwapInstruction } from \"./type\";\nimport { NetworkName } from \"@/config\";\nexport function route1Instruction(\n programId: PublicKey,\n poolInfoA: ApiV3PoolInfoItem,\n poolKeyA: PoolKeys,\n poolKeyB: PoolKeys,\n\n userSourceToken: PublicKey,\n userRouteToken: PublicKey,\n // userDestinationToken: PublicKey,\n userPdaAccount: PublicKey,\n ownerWallet: PublicKey,\n\n inputMint: PublicKey,\n\n amountIn: BN,\n amountOut: BN,\n\n tickArrayA?: PublicKey[],\n // tickArrayB?: PublicKey[],\n): TransactionInstruction {\n const dataLayout = struct([u8(\"instruction\"), u64(\"amountIn\"), u64(\"amountOut\")]);\n\n const keys: { pubkey: PublicKey; isSigner: boolean; isWritable: boolean }[] = [\n { pubkey: SystemProgram.programId, isSigner: false, isWritable: false },\n { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },\n { pubkey: new PublicKey(poolKeyA.programId), isSigner: false, isWritable: false },\n { pubkey: new PublicKey(poolKeyA.id), isSigner: false, isWritable: true },\n { pubkey: new PublicKey(poolKeyB.id), isSigner: false, isWritable: true },\n\n { pubkey: userSourceToken, isSigner: false, isWritable: true },\n { pubkey: userRouteToken, isSigner: false, isWritable: true },\n { pubkey: userPdaAccount, isSigner: false, isWritable: true },\n { pubkey: ownerWallet, isSigner: true, isWritable: false },\n ];\n\n if (poolInfoA.type === \"Concentrated\") {\n const poolKey = jsonInfo2PoolKeys(poolKeyA as ClmmKeys);\n keys.push(\n ...[\n { pubkey: poolKey.config.id, isSigner: false, isWritable: false },\n { pubkey: poolKey.id, isSigner: false, isWritable: true },\n {\n pubkey: poolKey.mintA.address.equals(inputMint) ? poolKey.vault.A : poolKey.vault.B,\n isSigner: false,\n isWritable: true,\n },\n {\n pubkey: poolKey.mintA.address.equals(inputMint) ? poolKey.vault.B : poolKey.vault.A,\n isSigner: false,\n isWritable: true,\n },\n // { pubkey: poolKey.observationId, isSigner: false, isWritable: true }, // to do\n { pubkey: poolKey.id, isSigner: false, isWritable: true },\n ...tickArrayA!.map((i) => ({ pubkey: i, isSigner: false, isWritable: true })),\n ],\n );\n } else if (poolInfoA.pooltype.includes(\"StablePool\")) {\n const poolKey = jsonInfo2PoolKeys(poolKeyA as AmmV5Keys);\n keys.push(\n ...[\n { pubkey: poolKey.authority, isSigner: false, isWritable: false },\n { pubkey: poolKey.marketProgramId, isSigner: false, isWritable: false },\n { pubkey: poolKey.id, isSigner: false, isWritable: true },\n { pubkey: new PublicKey(\"CDSr3ssLcRB6XYPJwAfFt18MZvEZp4LjHcvzBVZ45duo\"), isSigner: false, isWritable: false },\n { pubkey: poolKey.openOrders, isSigner: false, isWritable: true },\n { pubkey: poolKey.vault.A, isSigner: false, isWritable: true },\n { pubkey: poolKey.vault.B, isSigner: false, isWritable: true },\n { pubkey: poolKey.marketId, isSigner: false, isWritable: true },\n { pubkey: poolKey.marketBids, isSigner: false, isWritable: true },\n { pubkey: poolKey.marketAsks, isSigner: false, isWritable: true },\n { pubkey: poolKey.marketEventQueue, isSigner: false, isWritable: true },\n { pubkey: poolKey.id, isSigner: false, isWritable: true },\n { pubkey: poolKey.id, isSigner: false, isWritable: true },\n ],\n );\n } else {\n const poolKey = jsonInfo2PoolKeys(poolKeyA as AmmV4Keys);\n keys.push(\n ...[\n { pubkey: poolKey.authority, isSigner: false, isWritable: false },\n { pubkey: poolKey.marketProgramId, isSigner: false, isWritable: false },\n { pubkey: poolKey.marketAuthority, isSigner: false, isWritable: false },\n { pubkey: poolKey.openOrders, isSigner: false, isWritable: true },\n { pubkey: poolKey.vault.A, isSigner: false, isWritable: true },\n { pubkey: poolKey.vault.B, isSigner: false, isWritable: true },\n { pubkey: poolKey.marketId, isSigner: false, isWritable: true },\n { pubkey: poolKey.marketBids, isSigner: false, isWritable: true },\n { pubkey: poolKey.marketAsks, isSigner: false, isWritable: true },\n { pubkey: poolKey.marketEventQueue, isSigner: false, isWritable: true },\n ...(poolKey.marketProgramId.toString() === \"srmqPvymJeFKQ4zGQed1GFppgkRHL9kaELCbyksJtPX\"\n ? [\n { pubkey: poolKey.marketBaseVault, isSigner: false, isWritable: true },\n { pubkey: poolKey.marketQuoteVault, isSigner: false, isWritable: true },\n ]\n : [\n { pubkey: poolKey.id, isSigner: false, isWritable: true },\n { pubkey: poolKey.id, isSigner: false, isWritable: true },\n ]),\n ],\n );\n }\n\n const data = Buffer.alloc(dataLayout.span);\n dataLayout.encode(\n {\n instruction: 4,\n amountIn,\n amountOut,\n },\n data,\n );\n\n return new TransactionInstruction({\n keys,\n programId,\n data,\n });\n}\n\nexport function route2Instruction(\n programId: PublicKey,\n poolInfoB: ApiV3PoolInfoItem,\n poolKeyA: PoolKeys,\n poolKeyB: PoolKeys,\n\n // userSourceToken: PublicKey,\n userRouteToken: PublicKey,\n userDestinationToken: PublicKey,\n userPdaAccount: PublicKey,\n ownerWallet: PublicKey,\n\n routeMint: PublicKey,\n\n // tickArrayA?: PublicKey[],\n tickArrayB?: PublicKey[],\n): TransactionInstruction {\n const dataLayout = struct([u8(\"instruction\")]);\n\n const keys: { pubkey: PublicKey; isSigner: boolean; isWritable: boolean }[] = [\n { pubkey: SystemProgram.programId, isSigner: false, isWritable: false },\n { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },\n { pubkey: new PublicKey(String(poolKeyB.programId)), isSigner: false, isWritable: false },\n { pubkey: new PublicKey(String(poolKeyB.id)), isSigner: false, isWritable: true },\n { pubkey: new PublicKey(String(poolKeyA.id)), isSigner: false, isWritable: true },\n\n { pubkey: userRouteToken, isSigner: false, isWritable: true },\n { pubkey: userDestinationToken, isSigner: false, isWritable: true },\n { pubkey: userPdaAccount, isSigner: false, isWritable: true },\n { pubkey: ownerWallet, isSigner: true, isWritable: false },\n ];\n\n if (poolInfoB.type === \"Concentrated\") {\n const poolKey = jsonInfo2PoolKeys(poolKeyB as ClmmKeys);\n keys.push(\n ...[\n { pubkey: poolKey.config.id, isSigner: false, isWritable: false },\n { pubkey: poolKey.id, isSigner: false, isWritable: true },\n {\n pubkey: poolKey.mintA.address.equals(routeMint) ? poolKey.vault.A : poolKey.vault.B,\n isSigner: false,\n isWritable: true,\n },\n {\n pubkey: poolKey.mintA.address.equals(routeMint) ? poolKey.vault.B : poolKey.vault.A,\n isSigner: false,\n isWritable: true,\n },\n // { pubkey: poolKey.observationId, isSigner: false, isWritable: true }, // to do\n { pubkey: poolKey.id, isSigner: false, isWritable: true },\n ...tickArrayB!.map((i) => ({ pubkey: i, isSigner: false, isWritable: true })),\n ],\n );\n } else if (poolInfoB.pooltype.includes(\"StablePool\")) {\n const poolKey = jsonInfo2PoolKeys(poolKeyB as AmmV5Keys);\n keys.push(\n ...[\n { pubkey: poolKey.authority, isSigner: false, isWritable: false },\n { pubkey: poolKey.marketProgramId, isSigner: false, isWritable: false },\n { pubkey: poolKey.id, isSigner: false, isWritable: true },\n { pubkey: new PublicKey(\"CDSr3ssLcRB6XYPJwAfFt18MZvEZp4LjHcvzBVZ45duo\"), isSigner: false, isWritable: false },\n { pubkey: poolKey.openOrders, isSigner: false, isWritable: true },\n { pubkey: poolKey.vault.A, isSigner: false, isWritable: true },\n { pubkey: poolKey.vault.B, isSigner: false, isWritable: true },\n { pubkey: poolKey.marketId, isSigner: false, isWritable: true },\n { pubkey: poolKey.marketBids, isSigner: false, isWritable: true },\n { pubkey: poolKey.marketAsks, isSigner: false, isWritable: true },\n { pubkey: poolKey.marketEventQueue, isSigner: false, isWritable: true },\n { pubkey: poolKey.id, isSigner: false, isWritable: true },\n { pubkey: poolKey.id, isSigner: false, isWritable: true },\n ],\n );\n } else {\n const poolKey = jsonInfo2PoolKeys(poolKeyB as AmmV4Keys);\n keys.push(\n ...[\n { pubkey: poolKey.authority, isSigner: false, isWritable: false },\n { pubkey: poolKey.marketProgramId, isSigner: false, isWritable: false },\n { pubkey: poolKey.marketAuthority, isSigner: false, isWritable: false },\n { pubkey: poolKey.openOrders, isSigner: false, isWritable: true },\n { pubkey: poolKey.vault.A, isSigner: false, isWritable: true },\n { pubkey: poolKey.vault.B, isSigner: false, isWritable: true },\n { pubkey: poolKey.marketId, isSigner: false, isWritable: true },\n { pubkey: poolKey.marketBids, isSigner: false, isWritable: true },\n { pubkey: poolKey.marketAsks, isSigner: false, isWritable: true },\n { pubkey: poolKey.marketEventQueue, isSigner: false, isWritable: true },\n ...(poolKey.marketProgramId.toString() === \"srmqPvymJeFKQ4zGQed1GFppgkRHL9kaELCbyksJtPX\"\n ? [\n { pubkey: poolKey.marketBaseVault, isSigner: false, isWritable: true },\n { pubkey: poolKey.marketQuoteVault, isSigner: false, isWritable: true },\n ]\n : [\n { pubkey: poolKey.id, isSigner: false, isWritable: true },\n { pubkey: poolKey.id, isSigner: false, isWritable: true },\n ]),\n ],\n );\n }\n\n const data = Buffer.alloc(dataLayout.span);\n dataLayout.encode(\n {\n instruction: 5,\n },\n data,\n );\n\n return new TransactionInstruction({\n keys,\n programId,\n data,\n });\n}\n\n/*\nfunction makeInnerInsKey(\n itemPool: ComputePoolType,\n itemPoolKey: PoolKeys,\n inMint: string,\n userInAccount: PublicKey,\n userOutAccount: PublicKey,\n remainingAccount: PublicKey[] | undefined,\n): accountMeta[] {\n if (itemPool.version === 4) {\n const poolKey = jsonInfo2PoolKeys(itemPoolKey as AmmV4Keys);\n\n return [\n { pubkey: poolKey.programId, isSigner: false, isWritable: false },\n { pubkey: userInAccount, isSigner: false, isWritable: true },\n { pubkey: userOutAccount, isSigner: false, isWritable: true },\n\n { pubkey: poolKey.id, isSigner: false, isWritable: true },\n { pubkey: poolKey.authority, isSigner: false, isWritable: false },\n { pubkey: poolKey.marketProgramId, isSigner: false, isWritable: false },\n { pubkey: poolKey.marketAuthority, isSigner: false, isWritable: true },\n\n { pubkey: poolKey.openOrders, isSigner: false, isWritable: true },\n { pubkey: poolKey.vault.A, isSigner: false, isWritable: true },\n { pubkey: poolKey.vault.B, isSigner: false, isWritable: true },\n { pubkey: poolKey.marketId, isSigner: false, isWritable: true },\n { pubkey: poolKey.marketBids, isSigner: false, isWritable: true },\n { pubkey: poolKey.marketAsks, isSigner: false, isWritable: true },\n { pubkey: poolKey.marketEventQueue, isSigner: false, isWritable: true },\n ...(poolKey.marketProgramId.toString() === \"srmqPvymJeFKQ4zGQed1GFppgkRHL9kaELCbyksJtPX\"\n ? [\n { pubkey: poolKey.marketBaseVault, isSigner: false, isWritable: true },\n { pubkey: poolKey.marketQuoteVault, isSigner: false, isWritable: true },\n ]\n : [\n { pubkey: poolKey.id, isSigner: false, isWritable: true },\n { pubkey: poolKey.id, isSigner: false, isWritable: true },\n ]),\n ];\n } else if (itemPool.version === 5) {\n const poolKey = jsonInfo2PoolKeys(itemPoolKey as AmmV4Keys);\n\n return [\n { pubkey: poolKey.programId, isSigner: false, isWritable: false },\n { pubkey: userInAccount, isSigner: false, isWritable: true },\n { pubkey: userOutAccount, isSigner: false, isWritable: true },\n\n { pubkey: poolKey.id, isSigner: false, isWritable: true },\n { pubkey: poolKey.authority, isSigner: false, isWritable: false },\n { pubkey: poolKey.marketProgramId, isSigner: false, isWritable: false },\n { pubkey: poolKey.id, isSigner: false, isWritable: true },\n { pubkey: new PublicKey(\"CDSr3ssLcRB6XYPJwAfFt18MZvEZp4LjHcvzBVZ45duo\"), isSigner: false, isWritable: false },\n { pubkey: poolKey.openOrders, isSigner: false, isWritable: true },\n { pubkey: poolKey.vault.A, isSigner: false, isWritable: true },\n { pubkey: poolKey.vault.B, isSigner: false, isWritable: true },\n { pubkey: poolKey.marketId, isSigner: false, isWritable: true },\n { pubkey: poolKey.marketBids, isSigner: false, isWritable: true },\n { pubkey: poolKey.marketAsks, isSigner: false, isWritable: true },\n { pubkey: poolKey.marketEventQueue, isSigner: false, isWritable: true },\n { pubkey: poolKey.id, isSigner: false, isWritable: true },\n { pubkey: poolKey.id, isSigner: false, isWritable: true },\n ];\n } else if (itemPool.version === 6) {\n const pool = itemPool;\n const poolKey = jsonInfo2PoolKeys(itemPoolKey as ClmmKeys);\n const baseIn = pool.mintA.address === inMint;\n return [\n { pubkey: new PublicKey(String(itemPool.programId)), isSigner: false, isWritable: false },\n { pubkey: userInAccount, isSigner: false, isWritable: true },\n { pubkey: userOutAccount, isSigner: false, isWritable: true },\n { pubkey: poolKey.config.id, isSigner: false, isWritable: false },\n { pubkey: poolKey.id, isSigner: false, isWritable: true },\n { pubkey: baseIn ? poolKey.vault.A : poolKey.vault.B, isSigner: false, isWritable: true },\n { pubkey: baseIn ? poolKey.vault.B : poolKey.vault.A, isSigner: false, isWritable: true },\n { pubkey: itemPool.observationId, isSigner: false, isWritable: true },\n ...(poolKey.mintA.programId.equals(TOKEN_2022_PROGRAM_ID) || poolKey.mintB.programId.equals(TOKEN_2022_PROGRAM_ID)\n ? [\n { pubkey: TOKEN_2022_PROGRAM_ID, isSigner: false, isWritable: false },\n { pubkey: MEMO_PROGRAM_ID, isSigner: false, isWritable: false },\n { pubkey: baseIn ? poolKey.mintA.address : poolKey.mintB.address, isSigner: false, isWritable: false },\n { pubkey: baseIn ? poolKey.mintB.address : poolKey.mintA.address, isSigner: false, isWritable: false },\n ]\n : []),\n ...(remainingAccount ?? []).map((i) => ({ pubkey: i, isSigner: false, isWritable: true })),\n {\n pubkey: getPdaExBitmapAccount(new PublicKey(String(itemPool.programId)), new PublicKey(itemPool.id)).publicKey,\n isSigner: false,\n isWritable: true,\n },\n ];\n } else if (itemPool.version === 7) {\n const pool = itemPool;\n const poolKey = jsonInfo2PoolKeys(itemPoolKey as CpmmKeys);\n const baseIn = pool.mintA.address === inMint;\n return [\n { pubkey: new PublicKey(String(itemPool.programId)), isSigner: false, isWritable: false },\n { pubkey: userInAccount, isSigner: false, isWritable: true },\n { pubkey: userOutAccount, isSigner: false, isWritable: true },\n { pubkey: poolKey.config.id, isSigner: false, isWritable: false },\n { pubkey: poolKey.id, isSigner: false, isWritable: true },\n { pubkey: baseIn ? poolKey.vault.A : poolKey.vault.B, isSigner: false, isWritable: true },\n { pubkey: baseIn ? poolKey.vault.B : poolKey.vault.A, isSigner: false, isWritable: true },\n { pubkey: itemPool.observationId, isSigner: false, isWritable: true },\n ...(poolKey.mintA.programId.equals(TOKEN_2022_PROGRAM_ID) || poolKey.mintB.programId.equals(TOKEN_2022_PROGRAM_ID)\n ? [\n { pubkey: TOKEN_2022_PROGRAM_ID, isSigner: false, isWritable: false },\n { pubkey: MEMO_PROGRAM_ID, isSigner: false, isWritable: false },\n { pubkey: baseIn ? poolKey.mintA.address : poolKey.mintB.address, isSigner: false, isWritable: false },\n { pubkey: baseIn ? poolKey.mintB.address : poolKey.mintA.address, isSigner: false, isWritable: false },\n ]\n : []),\n ...(remainingAccount ?? []).map((i) => ({ pubkey: i, isSigner: false, isWritable: true })),\n {\n pubkey: getPdaExBitmapAccount(new PublicKey(String(itemPool.programId)), new PublicKey(itemPool.id)).publicKey,\n isSigner: false,\n isWritable: true,\n },\n ];\n } else {\n throw Error(\"make swap ins error\");\n }\n}\n*/\n\nexport function routeInstruction(\n programId: PublicKey,\n wallet: PublicKey,\n\n userSourceToken: PublicKey,\n userRouteToken: PublicKey,\n userDestinationToken: PublicKey,\n\n inputMint: string,\n routeMint: string,\n outputMint: string,\n\n poolInfoA: ComputePoolType,\n poolInfoB: ComputePoolType,\n\n poolKeyA: PoolKeys,\n poolKeyB: PoolKeys,\n\n amountIn: BN,\n amountOut: BN,\n\n remainingAccounts: (PublicKey[] | undefined)[],\n): TransactionInstruction {\n const clmmPriceLimit: BN[] = [];\n const keys = [\n accountMeta({ pubkey: TOKEN_PROGRAM_ID, isWritable: false }),\n accountMeta({ pubkey: TOKEN_2022_PROGRAM_ID, isWritable: false }),\n accountMeta({ pubkey: ASSOCIATED_TOKEN_PROGRAM_ID, isWritable: false }),\n accountMeta({ pubkey: SystemProgram.programId, isWritable: false }),\n accountMeta({ pubkey: wallet, isSigner: true }),\n ];\n\n keys.push(accountMeta({ pubkey: userSourceToken }));\n keys.push(accountMeta({ pubkey: userDestinationToken }));\n\n const poolInfos = [poolInfoA, poolInfoB];\n const poolKeys = [poolKeyA, poolKeyB];\n const routeMints = [inputMint, routeMint, outputMint];\n\n for (let index = 0; index < poolInfos.length; index++) {\n const _poolInfo = poolInfos[index];\n const inputIsA = routeMints[index] === _poolInfo.mintA.address;\n keys.push(accountMeta({ pubkey: new PublicKey(_poolInfo.programId), isWritable: false }));\n if (index === poolInfos.length - 1) {\n keys.push(accountMeta({ pubkey: userDestinationToken }));\n } else {\n keys.push(accountMeta({ pubkey: userRouteToken }));\n }\n keys.push(accountMeta({ pubkey: new PublicKey(routeMints[index]) }));\n keys.push(accountMeta({ pubkey: new PublicKey(routeMints[index + 1]) }));\n if (_poolInfo.version === 6) {\n const _poolKey = poolKeys[index] as ClmmKeys;\n\n keys.push(accountMeta({ pubkey: new PublicKey(_poolKey.config.id) }));\n keys.push(accountMeta({ pubkey: new PublicKey(_poolKey.id) }));\n keys.push(accountMeta({ pubkey: new PublicKey(inputIsA ? _poolKey.vault.A : _poolKey.vault.B) }));\n keys.push(accountMeta({ pubkey: new PublicKey(inputIsA ? _poolKey.vault.B : _poolKey.vault.A) }));\n keys.push(accountMeta({ pubkey: new PublicKey(_poolInfo.observationId) })); //todo\n keys.push(accountMeta({ pubkey: MEMO_PROGRAM_ID2 }));\n keys.push(\n accountMeta({\n pubkey: getPdaExBitmapAccount(new PublicKey(_poolInfo.programId), new PublicKey(_poolInfo.id)).publicKey,\n }),\n );\n clmmPriceLimit.push(clmmPriceLimitX64InsData(_poolInfo.sqrtPriceX64.toString(), inputIsA));\n for (const item of remainingAccounts[index] ?? []) {\n keys.push(accountMeta({ pubkey: new PublicKey(item) }));\n }\n } else if (_poolInfo.version === 5) {\n const _poolKey = poolKeys[index] as AmmV5Keys;\n keys.push(accountMeta({ pubkey: new PublicKey(_poolKey.id) }));\n keys.push(accountMeta({ pubkey: new PublicKey(_poolKey.authority), isWritable: false }));\n keys.push(accountMeta({ pubkey: new PublicKey(_poolKey.marketProgramId) }));\n keys.push(accountMeta({ pubkey: new PublicKey(_poolKey.marketAuthority) }));\n keys.push(accountMeta({ pubkey: LIQUIDITY_POOL_PROGRAM_ID_V5_MODEL, isWritable: false }));\n keys.push(accountMeta({ pubkey: new PublicKey(_poolKey.openOrders) }));\n keys.push(accountMeta({ pubkey: new PublicKey(_poolKey.vault.A) }));\n keys.push(accountMeta({ pubkey: new PublicKey(_poolKey.vault.B) }));\n keys.push(accountMeta({ pubkey: new PublicKey(_poolKey.id) }));\n keys.push(accountMeta({ pubkey: new PublicKey(_poolKey.id) }));\n keys.push(accountMeta({ pubkey: new PublicKey(_poolKey.id) }));\n keys.push(accountMeta({ pubkey: new PublicKey(_poolKey.id) }));\n keys.push(accountMeta({ pubkey: new PublicKey(_poolKey.id) }));\n keys.push(accountMeta({ pubkey: new PublicKey(_poolKey.id) }));\n keys.push(accountMeta({ pubkey: new PublicKey(_poolKey.marketId) }));\n keys.push(accountMeta({ pubkey: new PublicKey(_poolKey.marketBids) }));\n keys.push(accountMeta({ pubkey: new PublicKey(_poolKey.marketAsks) }));\n keys.push(accountMeta({ pubkey: new PublicKey(_poolKey.marketEventQueue) }));\n keys.push(accountMeta({ pubkey: new PublicKey(_poolKey.marketBaseVault) }));\n keys.push(accountMeta({ pubkey: new PublicKey(_poolKey.marketQuoteVault) }));\n } else if (_poolInfo.version === 4) {\n const _poolKey = poolKeys[index] as AmmV4Keys;\n const isSupportIdOnly = _poolInfo.status !== 1;\n keys.push(accountMeta({ pubkey: new PublicKey(_poolKey.id) }));\n keys.push(accountMeta({ pubkey: new PublicKey(_poolKey.authority), isWritable: false }));\n keys.push(accountMeta({ pubkey: new PublicKey(isSupportIdOnly ? _poolKey.id : _poolKey.marketProgramId) }));\n keys.push(accountMeta({ pubkey: new PublicKey(isSupportIdOnly ? _poolKey.id : _poolKey.marketAuthority) }));\n keys.push(accountMeta({ pubkey: new PublicKey(isSupportIdOnly ? _poolKey.id : _poolKey.openOrders) }));\n keys.push(accountMeta({ pubkey: new PublicKey(_poolKey.vault.A) }));\n keys.push(accountMeta({ pubkey: new PublicKey(_poolKey.vault.B) }));\n keys.push(accountMeta({ pubkey: new PublicKey(isSupportIdOnly ? _poolKey.id : _poolKey.marketId) }));\n keys.push(accountMeta({ pubkey: new PublicKey(isSupportIdOnly ? _poolKey.id : _poolKey.marketBids) }));\n keys.push(accountMeta({ pubkey: new PublicKey(isSupportIdOnly ? _poolKey.id : _poolKey.marketAsks) }));\n keys.push(accountMeta({ pubkey: new PublicKey(isSupportIdOnly ? _poolKey.id : _poolKey.marketEventQueue) }));\n keys.push(accountMeta({ pubkey: new PublicKey(isSupportIdOnly ? _poolKey.id : _poolKey.marketBaseVault) }));\n keys.push(accountMeta({ pubkey: new PublicKey(isSupportIdOnly ? _poolKey.id : _poolKey.marketQuoteVault) }));\n } else if (_poolInfo.version === 7) {\n const _poolKey = poolKeys[index] as CpmmKeys;\n keys.push(accountMeta({ pubkey: new PublicKey(_poolKey.authority) }));\n keys.push(accountMeta({ pubkey: new PublicKey(_poolKey.config.id) }));\n keys.push(accountMeta({ pubkey: new PublicKey(_poolKey.id) }));\n keys.push(accountMeta({ pubkey: new PublicKey(inputIsA ? _poolKey.vault.A : _poolKey.vault.B) }));\n keys.push(accountMeta({ pubkey: new PublicKey(inputIsA ? _poolKey.vault.B : _poolKey.vault.A) }));\n keys.push(accountMeta({ pubkey: new PublicKey(_poolInfo.observationId) }));\n } else throw Error(\"pool type error\");\n }\n\n const dataLayout = struct([\n u8(\"insId\"),\n u64(\"amountIn\"),\n u64(\"amountOut\"),\n seq(u128(), clmmPriceLimit.length, \"clmmPriceLimit\"),\n ]);\n const data = Buffer.alloc(dataLayout.span);\n dataLayout.encode(\n {\n insId: 0,\n amountIn,\n amountOut,\n clmmPriceLimit,\n },\n data,\n );\n return new TransactionInstruction({\n keys,\n programId,\n data,\n });\n}\n\nfunction clmmPriceLimitX64InsData(x64Price: string | undefined, inputIsA: boolean): BN {\n if (x64Price) {\n if (inputIsA) {\n const _m = new BN(x64Price).div(new BN(25));\n return _m.gt(MIN_SQRT_PRICE_X64_ADD_ONE) ? _m : MIN_SQRT_PRICE_X64_ADD_ONE;\n } else {\n const _m = new BN(x64Price).mul(new BN(25));\n return _m.lt(MAX_SQRT_PRICE_X64_SUB_ONE) ? _m : MAX_SQRT_PRICE_X64_SUB_ONE;\n }\n } else {\n return inputIsA ? MIN_SQRT_PRICE_X64_ADD_ONE : MAX_SQRT_PRICE_X64_SUB_ONE;\n }\n}\n\nexport function makeSwapInstruction({\n routeProgram,\n ownerInfo,\n inputMint,\n swapInfo,\n}: MakeSwapInstructionParam): ReturnTypeMakeSwapInstruction {\n if (swapInfo.routeType === \"amm\") {\n if (swapInfo.poolInfo[0].version === 6) {\n const poolKeys = swapInfo.poolKey[0] as ClmmKeys;\n const _poolKey = jsonInfo2PoolKeys(poolKeys);\n const sqrtPriceLimitX64 = inputMint.equals(_poolKey.mintA.address)\n ? MIN_SQRT_PRICE_X64.add(ONE)\n : MAX_SQRT_PRICE_X64.sub(ONE);\n\n return ClmmInstrument.makeSwapBaseInInstructions({\n poolInfo: poolKeys,\n poolKeys,\n observationId: swapInfo.poolInfo[0].observationId,\n ownerInfo: {\n wallet: ownerInfo.wallet,\n tokenAccountA: _poolKey.mintA.address.equals(inputMint) ? ownerInfo.sourceToken : ownerInfo.destinationToken,\n tokenAccountB: _poolKey.mintA.address.equals(inputMint) ? ownerInfo.destinationToken : ownerInfo.sourceToken,\n },\n inputMint,\n amountIn: swapInfo.amountIn.amount.raw,\n amountOutMin: swapInfo.minAmountOut.amount.raw.sub(swapInfo.minAmountOut.fee?.raw ?? new BN(0)),\n sqrtPriceLimitX64,\n remainingAccounts: swapInfo.remainingAccounts[0] ?? [],\n });\n } else if (swapInfo.poolInfo[0].version === 7) {\n const poolInfo = swapInfo.poolInfo[0];\n const baseIn = inputMint.toString() === swapInfo.poolInfo[0].mintA.address;\n\n return {\n signers: [],\n instructions: [\n makeSwapCpmmBaseInInInstruction(\n poolInfo.programId,\n ownerInfo.wallet,\n poolInfo.authority,\n poolInfo.configId,\n poolInfo.id,\n ownerInfo.sourceToken!,\n ownerInfo.destinationToken!,\n baseIn ? poolInfo.vaultA : poolInfo.vaultB,\n baseIn ? poolInfo.vaultB : poolInfo.vaultA,\n baseIn ? poolInfo.mintProgramA : poolInfo.mintProgramB,\n baseIn ? poolInfo.mintProgramB : poolInfo.mintProgramA,\n new PublicKey(poolInfo[baseIn ? \"mintA\" : \"mintB\"].address),\n new PublicKey(poolInfo[baseIn ? \"mintB\" : \"mintA\"].address),\n poolInfo.observationId,\n\n swapInfo.amountIn.amount.raw,\n swapInfo.minAmountOut.amount.raw,\n ),\n ],\n lookupTableAddress: [],\n instructionTypes: [baseIn ? InstructionType.CpmmSwapBaseIn : InstructionType.CpmmSwapBaseOut],\n address: {},\n };\n } else {\n const _poolKey = swapInfo.poolKey[0] as AmmV4Keys | AmmV5Keys;\n\n return {\n signers: [],\n instructions: [\n makeAMMSwapInstruction({\n poolKeys: _poolKey,\n version: swapInfo.poolInfo[0].pooltype.includes(\"StablePool\") ? 5 : 4,\n userKeys: {\n tokenAccountIn: ownerInfo.sourceToken,\n tokenAccountOut: ownerInfo.destinationToken,\n owner: ownerInfo.wallet,\n },\n amountIn: swapInfo.amountIn.amount.raw,\n amountOut: swapInfo.minAmountOut.amount.raw.sub(swapInfo.minAmountOut.fee?.raw ?? new BN(0)),\n fixedSide: \"in\",\n }),\n ],\n lookupTableAddress: _poolKey.lookupTableAccount ? [_poolKey.lookupTableAccount] : [],\n instructionTypes: [\n swapInfo.poolInfo[0].pooltype.includes(\"StablePool\")\n ? InstructionType.AmmV5SwapBaseIn\n : InstructionType.AmmV4SwapBaseIn,\n ],\n address: {},\n };\n }\n } else if (swapInfo.routeType === \"route\") {\n const poolInfo1 = swapInfo.poolInfo[0];\n const poolInfo2 = swapInfo.poolInfo[1];\n const poolKey1 = swapInfo.poolKey[0];\n const poolKey2 = swapInfo.poolKey[1];\n\n if (ownerInfo.routeToken === undefined) throw Error(\"owner route token account check error\");\n\n return {\n signers: [],\n instructions: [\n routeInstruction(\n routeProgram,\n ownerInfo.wallet,\n ownerInfo.sourceToken,\n ownerInfo.routeToken,\n ownerInfo.destinationToken,\n\n inputMint.toString(),\n swapInfo.middleToken.mint.toString(),\n swapInfo.outputMint.toString(),\n\n poolInfo1,\n poolInfo2,\n poolKey1,\n poolKey2,\n\n swapInfo.amountIn.amount.raw,\n swapInfo.minAmountOut.amount.raw.sub(swapInfo.minAmountOut.fee?.raw ?? new BN(0)),\n\n swapInfo.remainingAccounts,\n ),\n ],\n instructionTypes: [InstructionType.RouteSwap],\n lookupTableAddress: [poolKey1.lookupTableAccount, poolKey2.lookupTableAccount].filter(\n (a) => a !== undefined,\n ) as string[],\n address: {},\n };\n } else {\n throw Error(\"route type error\");\n }\n}\n\nexport interface ApiSwapV1Out {\n id: string;\n success: boolean;\n version: \"V0\" | \"V1\";\n openTime?: undefined;\n msg: undefined;\n data: {\n swapType: \"BaseIn\" | \"BaseOut\";\n inputMint: string;\n inputAmount: string;\n outputMint: string;\n outputAmount: string;\n otherAmountThreshold: string;\n slippageBps: number;\n priceImpactPct: number;\n routePlan: {\n poolId: string;\n inputMint: string;\n outputMint: string;\n feeMint: string;\n feeRate: number;\n feeAmount: string;\n remainingAccounts?: string[];\n lastPoolPriceX64?: string;\n }[];\n };\n}\n\nexport function swapBaseInAutoAccount({\n programId,\n wallet,\n amount,\n inputAccount,\n outputAccount,\n routeInfo,\n poolKeys,\n network\n}: {\n programId: PublicKey;\n wallet: PublicKey;\n amount: BN;\n inputAccount: PublicKey;\n outputAccount: PublicKey;\n routeInfo: ApiSwapV1Out;\n poolKeys: PoolKeys[];\n network: NetworkName;\n}): TransactionInstruction {\n if (routeInfo.success === false) throw Error(\"route info error\");\n const clmmPriceLimit: BN[] = [];\n const keys = [\n accountMeta({ pubkey: TOKEN_PROGRAM_ID, isWritable: false }),\n accountMeta({ pubkey: TOKEN_2022_PROGRAM_ID, isWritable: false }),\n accountMeta({ pubkey: ASSOCIATED_TOKEN_PROGRAM_ID, isWritable: false }),\n accountMeta({ pubkey: SystemProgram.programId, isWritable: false }),\n accountMeta({ pubkey: wallet, isSigner: true }),\n ];\n const cacheAccount: { [mint: string]: PublicKey } = {\n [routeInfo.data.inputMint]: inputAccount,\n [routeInfo.data.outputMint]: outputAccount,\n };\n keys.push(accountMeta({ pubkey: cacheAccount[routeInfo.data.inputMint] }));\n keys.push(accountMeta({ pubkey: cacheAccount[routeInfo.data.outputMint] }));\n for (let index = 0; index < poolKeys.length; index++) {\n const _routeInfo = routeInfo.data.routePlan[index];\n const _poolKey = poolKeys[index];\n const inputIsA = _routeInfo.inputMint === _poolKey.mintA.address;\n keys.push(accountMeta({ pubkey: new PublicKey(_poolKey.programId), isWritable: false }));\n if (index === poolKeys.length - 1) {\n keys.push(accountMeta({ pubkey: cacheAccount[_routeInfo.outputMint] }));\n } else {\n const mint = _routeInfo.outputMint;\n if (cacheAccount[mint] === undefined) {\n const ata = getATAAddress(\n wallet,\n new PublicKey(mint),\n _poolKey.programId === ALL_PROGRAM_ID.getCLMMProgramId(network).toBase58() ||\n _poolKey.programId === ALL_PROGRAM_ID.CREATE_CPMM_POOL_PROGRAM.toBase58()\n ? new PublicKey(inputIsA ? _poolKey.mintB.programId : _poolKey.mintA.programId)\n : TOKEN_PROGRAM_ID,\n ).publicKey;\n cacheAccount[mint] = ata;\n }\n keys.push(accountMeta({ pubkey: cacheAccount[mint] }));\n }\n keys.push(accountMeta({ pubkey: new PublicKey(_routeInfo.inputMint) }));\n keys.push(accountMeta({ pubkey: new PublicKey(_routeInfo.outputMint) }));\n if (_poolKey.programId === ALL_PROGRAM_ID.getCLMMProgramId(network).toBase58()) {\n const poolKey = _poolKey as ClmmKeys;\n\n keys.push(accountMeta({ pubkey: new PublicKey(poolKey.config.id) }));\n keys.push(accountMeta({ pubkey: new PublicKey(poolKey.id) }));\n keys.push(accountMeta({ pubkey: new PublicKey(inputIsA ? poolKey.vault.A : poolKey.vault.B) }));\n keys.push(accountMeta({ pubkey: new PublicKey(inputIsA ? poolKey.vault.B : poolKey.vault.A) }));\n keys.push(accountMeta({ pubkey: new PublicKey(poolKey.observationId) }));\n keys.push(accountMeta({ pubkey: MEMO_PROGRAM_ID2, isWritable: false }));\n keys.push(accountMeta({ pubkey: new PublicKey(poolKey.exBitmapAccount) }));\n clmmPriceLimit.push(clmmPriceLimitX64InsData(_routeInfo.lastPoolPriceX64, inputIsA));\n for (const item of _routeInfo.remainingAccounts ?? []) {\n keys.push(accountMeta({ pubkey: new PublicKey(item) }));\n }\n } else if (_poolKey.programId === ALL_PROGRAM_ID.AMM_STABLE.toBase58()) {\n const poolKey = _poolKey as AmmV5Keys;\n keys.push(accountMeta({ pubkey: new PublicKey(poolKey.id) }));\n keys.push(accountMeta({ pubkey: new PublicKey(poolKey.authority), isWritable: false }));\n keys.push(accountMeta({ pubkey: new PublicKey(poolKey.marketProgramId), isWritable: false }));\n keys.push(accountMeta({ pubkey: new PublicKey(poolKey.marketAuthority), isWritable: false }));\n keys.push(accountMeta({ pubkey: LIQUIDITY_POOL_PROGRAM_ID_V5_MODEL, isWritable: false }));\n keys.push(accountMeta({ pubkey: new PublicKey(poolKey.openOrders) }));\n keys.push(accountMeta({ pubkey: new PublicKey(poolKey.vault.A) }));\n keys.push(accountMeta({ pubkey: new PublicKey(poolKey.vault.B) }));\n keys.push(accountMeta({ pubkey: new PublicKey(poolKey.marketId) }));\n keys.push(accountMeta({ pubkey: new PublicKey(poolKey.marketBids) }));\n keys.push(accountMeta({ pubkey: new PublicKey(poolKey.marketAsks) }));\n keys.push(accountMeta({ pubkey: new PublicKey(poolKey.marketEventQueue) }));\n keys.push(accountMeta({ pubkey: new PublicKey(poolKey.marketBaseVault) }));\n keys.push(accountMeta({ pubkey: new PublicKey(poolKey.marketQuoteVault) }));\n } else if (_poolKey.programId === ALL_PROGRAM_ID.AMM_V4.toBase58()) {\n const poolKey = _poolKey as AmmV4Keys;\n keys.push(accountMeta({ pubkey: new PublicKey(poolKey.id) }));\n keys.push(accountMeta({ pubkey: new PublicKey(poolKey.authority), isWritable: false }));\n keys.push(accountMeta({ pubkey: new PublicKey(poolKey.id) }));\n keys.push(accountMeta({ pubkey: new PublicKey(poolKey.id) }));\n keys.push(accountMeta({ pubkey: new PublicKey(poolKey.id) }));\n keys.push(accountMeta({ pubkey: new PublicKey(poolKey.vault.A) }));\n keys.push(accountMeta({ pubkey: new PublicKey(poolKey.vault.B) }));\n keys.push(accountMeta({ pubkey: new PublicKey(poolKey.id) }));\n keys.push(accountMeta({ pubkey: new PublicKey(poolKey.id) }));\n keys.push(accountMeta({ pubkey: new PublicKey(poolKey.id) }));\n keys.push(accountMeta({ pubkey: new PublicKey(poolKey.id) }));\n keys.push(accountMeta({ pubkey: new PublicKey(poolKey.id) }));\n keys.push(accountMeta({ pubkey: new PublicKey(poolKey.id) }));\n // keys.push(accountMeta({ pubkey: new PublicKey(_poolKey.marketProgramId), isWritable: false }))\n // keys.push(accountMeta({ pubkey: new PublicKey(_poolKey.marketAuthority), isWritable: false }))\n // keys.push(accountMeta({ pubkey: new PublicKey(_poolKey.openOrder) }))\n // keys.push(accountMeta({ pubkey: new PublicKey(poolKey.vault.A) }))\n // keys.push(accountMeta({ pubkey: new PublicKey(poolKey.vault.B) }))\n // keys.push(accountMeta({ pubkey: new PublicKey(_poolKey.marketId) }))\n // keys.push(accountMeta({ pubkey: new PublicKey(_poolKey.bids) }))\n // keys.push(accountMeta({ pubkey: new PublicKey(_poolKey.asks) }))\n // keys.push(accountMeta({ pubkey: new PublicKey(_poolKey.eventQueue) }))\n // keys.push(accountMeta({ pubkey: new PublicKey(_poolKey.marketVaultA) }))\n // keys.push(accountMeta({ pubkey: new PublicKey(_poolKey.marketVaultB) }))\n } else if (_poolKey.programId === ALL_PROGRAM_ID.CREATE_CPMM_POOL_PROGRAM.toBase58()) {\n const poolKey = _poolKey as CpmmKeys;\n keys.push(accountMeta({ pubkey: new PublicKey(poolKey.authority) }));\n keys.push(accountMeta({ pubkey: new PublicKey(poolKey.config.id) }));\n keys.push(accountMeta({ pubkey: new PublicKey(poolKey.id) }));\n keys.push(accountMeta({ pubkey: new PublicKey(inputIsA ? poolKey.vault.A : poolKey.vault.B) }));\n keys.push(accountMeta({ pubkey: new PublicKey(inputIsA ? poolKey.vault.B : poolKey.vault.A) }));\n keys.push(accountMeta({ pubkey: new PublicKey(poolKey.observationId) }));\n } else throw Error(\"pool type error\");\n }\n const dataLayout = struct([\n u8(\"insId\"),\n u64(\"amountIn\"),\n u64(\"amountOut\"),\n seq(u128(), clmmPriceLimit.length, \"clmmPriceLimit\"),\n ]);\n const data = Buffer.alloc(dataLayout.span);\n dataLayout.encode(\n {\n insId: 0,\n amountIn: amount,\n amountOut: new BN(routeInfo.data.otherAmountThreshold),\n clmmPriceLimit,\n },\n data,\n );\n return new TransactionInstruction({\n keys,\n programId,\n data,\n });\n}\n\nexport function swapBaseOutAutoAccount({\n programId,\n wallet,\n inputAccount,\n outputAccount,\n routeInfo,\n poolKeys,\n network\n}: {\n programId: PublicKey;\n wallet: PublicKey;\n inputAccount: PublicKey;\n outputAccount: PublicKey;\n routeInfo: ApiSwapV1Out;\n poolKeys: PoolKeys[];\n network: NetworkName;\n}): TransactionInstruction {\n if (routeInfo.success === false) throw Error(\"route info error\");\n const clmmPriceLimit: BN[] = [];\n const keys = [\n accountMeta({ pubkey: TOKEN_PROGRAM_ID, isWritable: false }),\n accountMeta({ pubkey: TOKEN_2022_PROGRAM_ID, isWritable: false }),\n accountMeta({ pubkey: ASSOCIATED_TOKEN_PROGRAM_ID, isWritable: false }),\n accountMeta({ pubkey: SystemProgram.programId, isWritable: false }),\n accountMeta({ pubkey: wallet, isSigner: true }),\n ];\n const cacheAccount: { [mint: string]: PublicKey } = {\n [routeInfo.data.inputMint]: inputAccount,\n [routeInfo.data.outputMint]: outputAccount,\n };\n for (let index = poolKeys.length - 1; index >= 0; index--) {\n const _routeInfo = routeInfo.data.routePlan[index];\n const _poolKey = poolKeys[index];\n const inputIsA = _routeInfo.inputMint === _poolKey.mintA.address;\n keys.push(accountMeta({ pubkey: new PublicKey(_poolKey.programId) }));\n if (index === 0) {\n keys.push(accountMeta({ pubkey: cacheAccount[_routeInfo.inputMint] }));\n } else {\n const mint = _routeInfo.inputMint;\n if (cacheAccount[mint] === undefined) {\n const ata = getATAAddress(\n wallet,\n new PublicKey(mint),\n _poolKey.programId === ALL_PROGRAM_ID.getCLMMProgramId(network).toBase58() ||\n _poolKey.programId === ALL_PROGRAM_ID.CREATE_CPMM_POOL_PROGRAM.toBase58()\n ? new PublicKey(inputIsA ? _poolKey.mintA.programId : _poolKey.mintB.programId)\n : TOKEN_PROGRAM_ID,\n ).publicKey;\n cacheAccount[mint] = ata;\n }\n keys.push(accountMeta({ pubkey: cacheAccount[mint] }));\n }\n if (index === poolKeys.length - 1) {\n keys.push(accountMeta({ pubkey: cacheAccount[_routeInfo.outputMint] }));\n } else {\n const mint = _routeInfo.outputMint;\n if (cacheAccount[mint] === undefined) {\n const ata = getATAAddress(\n wallet,\n new PublicKey(mint),\n _poolKey.programId === ALL_PROGRAM_ID.getCLMMProgramId(network).toBase58() ||\n _poolKey.programId === ALL_PROGRAM_ID.CREATE_CPMM_POOL_PROGRAM.toBase58()\n ? new PublicKey(inputIsA ? _poolKey.mintB.programId : _poolKey.mintA.programId)\n : TOKEN_PROGRAM_ID,\n ).publicKey;\n cacheAccount[mint] = ata;\n }\n keys.push(accountMeta({ pubkey: cacheAccount[mint] }));\n }\n keys.push(accountMeta({ pubkey: new PublicKey(_routeInfo.inputMint) }));\n keys.push(accountMeta({ pubkey: new PublicKey(_routeInfo.outputMint) }));\n if (_poolKey.programId === ALL_PROGRAM_ID.getCLMMProgramId(network).toBase58()) {\n const poolKey = _poolKey as ClmmKeys;\n keys.push(accountMeta({ pubkey: new PublicKey(poolKey.config.id) }));\n keys.push(accountMeta({ pubkey: new PublicKey(poolKey.id) }));\n keys.push(accountMeta({ pubkey: new PublicKey(inputIsA ? poolKey.vault.A : poolKey.vault.B) }));\n keys.push(accountMeta({ pubkey: new PublicKey(inputIsA ? poolKey.vault.B : poolKey.vault.A) }));\n keys.push(accountMeta({ pubkey: new PublicKey(poolKey.observationId) }));\n keys.push(accountMeta({ pubkey: MEMO_PROGRAM_ID2, isWritable: false }));\n keys.push(accountMeta({ pubkey: new PublicKey(poolKey.exBitmapAccount) }));\n clmmPriceLimit.push(clmmPriceLimitX64InsData(_routeInfo.lastPoolPriceX64, inputIsA));\n for (const item of _routeInfo.remainingAccounts ?? []) {\n keys.push(accountMeta({ pubkey: new PublicKey(item) }));\n }\n } else if (_poolKey.programId === ALL_PROGRAM_ID.AMM_STABLE.toBase58()) {\n const poolkey = _poolKey as AmmV5Keys;\n keys.push(accountMeta({ pubkey: new PublicKey(poolkey.id) }));\n keys.push(accountMeta({ pubkey: new PublicKey(poolkey.authority), isWritable: false }));\n keys.push(accountMeta({ pubkey: new PublicKey(poolkey.marketProgramId), isWritable: false }));\n keys.push(accountMeta({ pubkey: new PublicKey(poolkey.marketAuthority), isWritable: false }));\n keys.push(accountMeta({ pubkey: LIQUIDITY_POOL_PROGRAM_ID_V5_MODEL, isWritable: false }));\n keys.push(accountMeta({ pubkey: new PublicKey(poolkey.openOrders) }));\n keys.push(accountMeta({ pubkey: new PublicKey(poolkey.vault.A) }));\n keys.push(accountMeta({ pubkey: new PublicKey(poolkey.vault.B) }));\n keys.push(accountMeta({ pubkey: new PublicKey(poolkey.marketId) }));\n keys.push(accountMeta({ pubkey: new PublicKey(poolkey.marketBids) }));\n keys.push(accountMeta({ pubkey: new PublicKey(poolkey.marketAsks) }));\n keys.push(accountMeta({ pubkey: new PublicKey(poolkey.marketEventQueue) }));\n keys.push(accountMeta({ pubkey: new PublicKey(poolkey.marketBaseVault) }));\n keys.push(accountMeta({ pubkey: new PublicKey(poolkey.marketQuoteVault) }));\n } else if (_poolKey.programId === ALL_PROGRAM_ID.AMM_V4.toBase58()) {\n const poolkey = _poolKey as AmmV4Keys;\n keys.push(accountMeta({ pubkey: new PublicKey(poolkey.id) }));\n keys.push(accountMeta({ pubkey: new PublicKey(poolkey.authority), isWritable: false }));\n keys.push(accountMeta({ pubkey: new PublicKey(poolkey.id) }));\n keys.push(accountMeta({ pubkey: new PublicKey(poolkey.id) }));\n keys.push(accountMeta({ pubkey: new PublicKey(poolkey.id) }));\n keys.push(accountMeta({ pubkey: new PublicKey(poolkey.vault.A) }));\n keys.push(accountMeta({ pubkey: new PublicKey(poolkey.vault.B) }));\n keys.push(accountMeta({ pubkey: new PublicKey(poolkey.id) }));\n keys.push(accountMeta({ pubkey: new PublicKey(poolkey.id) }));\n keys.push(accountMeta({ pubkey: new PublicKey(poolkey.id) }));\n keys.push(accountMeta({ pubkey: new PublicKey(poolkey.id) }));\n keys.push(accountMeta({ pubkey: new PublicKey(poolkey.id) }));\n keys.push(accountMeta({ pubkey: new PublicKey(poolkey.id) }));\n // keys.push(accountMeta({ pubkey: new PublicKey(_poolKey.marketProgramId), isWritable: false }))\n // keys.push(accountMeta({ pubkey: new PublicKey(_poolKey.marketAuthority), isWritable: false }))\n // keys.push(accountMeta({ pubkey: new PublicKey(_poolKey.openOrder) }))\n // keys.push(accountMeta({ pubkey: new PublicKey(poolKey.vault.A) }))\n // keys.push(accountMeta({ pubkey: new PublicKey(poolKey.vault.B) }))\n // keys.push(accountMeta({ pubkey: new PublicKey(_poolKey.marketId) }))\n // keys.push(accountMeta({ pubkey: new PublicKey(_poolKey.bids) }))\n // keys.push(accountMeta({ pubkey: new PublicKey(_poolKey.asks) }))\n // keys.push(accountMeta({ pubkey: new PublicKey(_poolKey.eventQueue) }))\n // keys.push(accountMeta({ pubkey: new PublicKey(_poolKey.marketVaultA) }))\n // keys.push(accountMeta({ pubkey: new PublicKey(_poolKey.marketVaultB) }))\n } else if (_poolKey.programId === ALL_PROGRAM_ID.CREATE_CPMM_POOL_PROGRAM.toBase58()) {\n const poolkey = _poolKey as CpmmKeys;\n\n keys.push(accountMeta({ pubkey: new PublicKey(poolkey.authority) }));\n keys.push(accountMeta({ pubkey: new PublicKey(poolkey.config.id) }));\n keys.push(accountMeta({ pubkey: new PublicKey(poolkey.id) }));\n keys.push(accountMeta({ pubkey: new PublicKey(inputIsA ? poolkey.vault.A : poolkey.vault.B) }));\n keys.push(accountMeta({ pubkey: new PublicKey(inputIsA ? poolkey.vault.B : poolkey.vault.A) }));\n keys.push(accountMeta({ pubkey: new PublicKey(poolkey.observationId) }));\n } else throw Error(\"pool type error\");\n }\n const dataLayout = struct([\n u8(\"insId\"),\n u64(\"amountIn\"),\n u64(\"amountOut\"),\n seq(u128(), clmmPriceLimit.length, \"clmmPriceLimit\"),\n ]);\n const data = Buffer.alloc(dataLayout.span);\n dataLayout.encode(\n {\n insId: 1,\n amountIn: new BN(routeInfo.data.otherAmountThreshold),\n amountOut: new BN(routeInfo.data.outputAmount),\n clmmPriceLimit,\n },\n data,\n );\n return new TransactionInstruction({\n keys,\n programId,\n data,\n });\n}\n"],"mappings":"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","names":["MINT_SIZE","TOKEN_PROGRAM_ID","getTransferFeeConfig","unpackMint","PublicKey","get","set","Logger","params","logLevel","level","props","msg","arg","moduleLoggers","moduleLevels","createLogger","moduleName","logger","get","set","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","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","getPi","wpr","xsd","halfPi","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","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","_Big","BN","_toFarmat","toFormat","formatter_default","_Big","BN","_Decimal","BN","MAX_SAFE","parseBigNumberish","value","logger","createLogger","BN","logger","createLogger","Big","formatter_default","_Big","Decimal","_Decimal","toSignificantRounding","toFixedRounding","Fraction","numerator","denominator","BN","parseBigNumberish","other","otherParsed","significantDigits","format","rounding","quotient","decimalPlaces","logger","createLogger","Big","formatter_default","_Big","splitNumber","num","decimals","integral","fractional","splited","TokenAmount","Fraction","token","amount","isRaw","name","parsedAmount","BN","multiplier","BN_TEN","parseBigNumberish","integralAmount","fractionalAmount","other","significantDigits","format","rounding","decimalPlaces","TOKEN_PROGRAM_ID","PublicKey","PublicKey","NETWORK_CONFIG","PublicKey","getNetworkConfig","network","getTokenWSol","network","config","getNetworkConfig","TOKEN_PROGRAM_ID","PublicKey","TOKEN_PROGRAM_ID","PublicKey","SystemProgram","SYSVAR_RENT_PUBKEY","accountMeta","pubkey","isSigner","isWritable","commonSystemAccountMeta","validateAndParsePublicKey","orgPubKey","transformSol","network","publicKey","tryParsePublicKey","WSOLMint","getMintAddresses","SOLMint","v","MEMO_PROGRAM_ID","MEMO_PROGRAM_ID2","RENT_PROGRAM_ID","CLOCK_PROGRAM_ID","METADATA_PROGRAM_ID","INSTRUCTION_PROGRAM_ID","SYSTEM_PROGRAM_ID","config","getNetworkConfig","solToWSol","mint","Token","mint","decimals","symbol","name","skipMint","isToken2022","network","SOLMint","PublicKey","getTokenWSol","validateAndParsePublicKey","other","BN","_100_PERCENT","Fraction","BN","Percent","significantDigits","format","rounding","decimalPlaces","logger","createLogger","Price","Fraction","params","baseToken","quoteToken","numerator","denominator","tenExponential","other","fraction","significantDigits","format","rounding","decimalPlaces","PublicKey","BN","notInnerObject","v","Token","TokenAmount","PublicKey","Fraction","BN","Price","Percent","o","jsonInfo2PoolKeys","jsonInfo","tryParsePublicKey","k","BN_ZERO","BN","BN_ONE","BN_TWO","BN_THREE","BN_FIVE","BN_TEN","BN_100","BN_1000","BN_10000","tenExponential","shift","parseBigNumberish","chunkArray","arr","chunkSize","cache","tmp","PublicKey","TOKEN_PROGRAM_ID","ComputeBudgetProgram","Keypair","PublicKey","Transaction","TransactionMessage","VersionedTransaction","InstructionType","TOKEN_PROGRAM_ID","logger","createLogger","findProgramAddress","seeds","programId","publicKey","nonce","PublicKey","getATAAddress","owner","mint","programId","findProgramAddress","TOKEN_PROGRAM_ID","PublicKey","PublicKey","FARM_PROGRAM_ID_V3","FARM_PROGRAM_ID_V4","FARM_PROGRAM_ID_V5","FARM_PROGRAM_ID_V6","UTIL1216","OPEN_BOOK_PROGRAM","SERUM_PROGRAM_ID_V3","AMM_V4","AMM_STABLE","LIQUIDITY_POOL_PROGRAM_ID_V5_MODEL","getCLMMProgramId","network","config","getNetworkConfig","CLMM_LOCK_PROGRAM_ID","CLMM_LOCK_AUTH_ID","Router","FEE_DESTINATION_ID","IDO_PROGRAM_ID_V1","IDO_PROGRAM_ID_V2","IDO_PROGRAM_ID_V3","IDO_PROGRAM_ID_V4","CREATE_CPMM_POOL_PROGRAM","CREATE_CPMM_POOL_AUTH","CREATE_CPMM_POOL_FEE_ACC","DEV_CREATE_CPMM_POOL_PROGRAM","DEV_CREATE_CPMM_POOL_AUTH","DEV_CREATE_CPMM_POOL_FEE_ACC","LOCK_CPMM_PROGRAM","DEV_LOCK_CPMM_PROGRAM","LOCK_CPMM_AUTH","DEV_LOCK_CPMM_AUTH","ALL_PROGRAM_ID","AMM_V4","AMM_STABLE","getCLMMProgramId","CLMM_LOCK_PROGRAM_ID","CLMM_LOCK_AUTH_ID","FARM_PROGRAM_ID_V3","FARM_PROGRAM_ID_V5","FARM_PROGRAM_ID_V6","OPEN_BOOK_PROGRAM","SERUM_PROGRAM_ID_V3","UTIL1216","Router","CREATE_CPMM_POOL_PROGRAM","CREATE_CPMM_POOL_AUTH","CREATE_CPMM_POOL_FEE_ACC","LOCK_CPMM_PROGRAM","LOCK_CPMM_AUTH","DEVNET_PROGRAM_ID","PublicKey","DEV_CREATE_CPMM_POOL_PROGRAM","DEV_CREATE_CPMM_POOL_AUTH","DEV_CREATE_CPMM_POOL_FEE_ACC","DEV_LOCK_CPMM_PROGRAM","DEV_LOCK_CPMM_AUTH","BN","POINT","getTransferAmountFeeV2","amount","_feeConfig","epochInfo","addFee","feeConfig","nowFeeConfig","maxFee","BN","expirationTime","POINT","nowMaxFee","_TAmount","BNDivCeil","TAmount","_fee","fee","minExpirationTime","expirationTime1","expirationTime2","bn1","bn2","div","mod","PublicKey","AddressLookupTableAccount","PublicKey","sendAndConfirmTransaction","Transaction","TransactionMessage","VersionedTransaction","axios","createTransferInstruction","TOKEN_2022_PROGRAM_ID","TOKEN_PROGRAM_ID","PublicKey","BN","PublicKey","BN","isBN","_bits","_BitStructure","_blob","_Blob","_cstr","_f32","_f32be","_f64","_f64be","_greedy","_Layout","_ns64","_ns64be","_nu64","_nu64be","_offset","_s16","_s16be","_s24","_s24be","_s32","_s32be","_s40","_s40be","_s48","_s48be","_s8","_seq","_struct","_Structure","_u16","_u16be","_u24","_u24be","_u32","_u32be","_u40","_u40be","_u48","_u48be","_u8","_UInt","_union","_Union","_unionLayoutDiscriminator","_utf8","Layout","Structure","UInt","_UInt","u8","_u8","u16","_u16","s32","_s32","seq","_seq","blob","_blob","BNLayout","Layout","span","signed","property","blob","b","offset","num","BN","src","u8","property","UInt","u32","u64","BNLayout","u128","i64","property","BNLayout","i128","WrappedLayout","Layout","layout","decoder","encoder","b","offset","src","publicKey","blob","PublicKey","key","bool","property","WrappedLayout","u8","decodeBool","encodeBool","value","Structure","b","offset","struct","fields","property","decodePrefixes","seq","elementLayout","count","property","parsedCount","superCount","isBN","target","countProperty","value","createCloseAccountInstruction","createInitializeAccountInstruction","createTransferInstruction","TOKEN_PROGRAM_ID","PublicKey","SystemProgram","BN","splAccountLayout","struct","publicKey","u64","u32","u8","TOKEN_PROGRAM_ID","Keypair","PublicKey","BN","logger","createLogger","AccountLayout","TOKEN_2022_PROGRAM_ID","TOKEN_PROGRAM_ID","PublicKey","BN","SPL_MINT_LAYOUT","struct","u32","publicKey","u64","u8","PublicKey","MintLayout","TOKEN_PROGRAM_ID","ASSOCIATED_TOKEN_PROGRAM_ID","TOKEN_2022_PROGRAM_ID","TOKEN_PROGRAM_ID","Keypair","PublicKey","SystemProgram","TransactionInstruction","BN","BN","BN","ZERO","ONE","NEGATIVE_ONE","Q64","Q128","MaxU64","U64Resolution","MaxUint128","MIN_TICK","MAX_TICK","MIN_SQRT_PRICE_X64","MAX_SQRT_PRICE_X64","MIN_SQRT_PRICE_X64_ADD_ONE","MAX_SQRT_PRICE_X64_SUB_ONE","BIT_PRECISION","LOG_B_2_X32","LOG_B_P_ERR_MARGIN_LOWER_X64","LOG_B_P_ERR_MARGIN_UPPER_X64","FEE_RATE_DENOMINATOR","U64_IGNORE_RANGE","BN","BN","i32ToBytes","num","arr","leadingZeros","bitNum","data","i","j","trailingZeros","isZero","mostSignificantBit","leastSignificantBit","AMM_CONFIG_SEED","POOL_SEED","POOL_VAULT_SEED","POOL_REWARD_VAULT_SEED","POSITION_SEED","TICK_ARRAY_SEED","OPERATION_SEED","POOL_TICK_ARRAY_BITMAP_SEED","OBSERVATION_SEED","getPdaPoolId","programId","ammConfigId","mintA","mintB","findProgramAddress","POOL_SEED","getPdaPoolVaultId","poolId","vaultMint","POOL_VAULT_SEED","getPdaPoolRewardVaulId","rewardMint","POOL_REWARD_VAULT_SEED","getPdaTickArrayAddress","startIndex","TICK_ARRAY_SEED","i32ToBytes","getPdaProtocolPositionAddress","tickLower","tickUpper","POSITION_SEED","getPdaPersonalPositionAddress","nftMint","getPdaMetadataKey","mint","METADATA_PROGRAM_ID","getPdaOperationAccount","OPERATION_SEED","getPdaExBitmapAccount","POOL_TICK_ARRAY_BITMAP_SEED","getPdaObservationAccount","OBSERVATION_SEED","POOL_LOCK_ID_SEED","getPdaLockPositionId","positionId","getPdaLockClPositionIdV2","lockNftMint","TOKEN_2022_PROGRAM_ID","PublicKey","BN","BN","PositionUtils","poolState","tickLowerState","tickUpperState","feeGrowthBelowX64A","BN","feeGrowthBelowX64B","feeGrowthAboveX64A","feeGrowthAboveX64B","feeGrowthInsideX64A","MathUtil","feeGrowthInsideBX64","ammPool","positionState","feeGrowthdeltaA","Q64","tokenFeeAmountA","feeGrowthdelta1","tokenFeeAmountB","rewards","rewardGrowthsInside","i","rewardGrowthInside","currRewardInfo","rewardGrowthDelta","amountOwedDelta","rewardAmountOwed","tickCurrentIndex","rewardInfos","rewardGrowthsBelow","rewardGrowthsAbove","poolInfo","ownerPosition","liquidity","slippage","add","epochInfo","_a","_b","_c","_d","sqrtPriceX64","SqrtPriceMath","decimal_default","sqrtPriceX64A","sqrtPriceX64B","coefficientRe","amounts","LiquidityMath","amountA","amountB","getTransferAmountFeeV2","amountSlippageA","amountSlippageB","minExpirationTime","FETCH_TICKARRAY_COUNT","TickQuery","connection","programId","poolId","tickCurrent","tickSpacing","tickArrayBitmapArray","exTickArrayBitmap","tickArraysToFetch","currentTickArrayStartIndex","TickUtils","startIndexArray","i","tickArrayAddress","getPdaTickArrayAddress","fetchedTickArrays","getMultipleAccountsInfo","TickArrayLayout","tickArrayCache","_info","tickIndex","zeroForOne","nextTick","tickArrayStartTickIndex","cachedTickArray","_nextTick","_tickArrayAddress","_tickArrayStartTickIndex","tickArrayBitmap","exBitmapInfo","currentOffset","result","tickArray","nextInitializedTick","TICK_ARRAY_SIZE","tickInArray","startIndex","tickPositionInArray","ticksInArray","MAX_TICK","minStartIndex","MIN_TICK","EXTENSION_TICKARRAY_BITMAP_SIZE","TickArrayBitmap","tickSpacing","TICK_ARRAY_SIZE","TICK_ARRAY_BITMAP_SIZE","tickarrayStartIndex","ticksInOneBitmap","m","minValue","bitMap","lastTickArrayStartIndex","zeroForOne","TickQuery","tickBoundary","nextTickArrayStartIndex","multiplier","compressed","bitPos","offsetBitMap","nextBit","mostSignificantBit","nextArrayStartIndex","leastSignificantBit","TickArrayBitmapExtensionUtils","tickIndex","offset","tickArrayBitmapExtension","positiveTickBoundary","negativeTickBoundary","MAX_TICK","MIN_TICK","tickArrayStartIndex","tickarrayBitmap","tickArrayOffsetInBitmap","TickUtils","bitmapMinTickBoundary","bitmapMaxTickBoundary","isZero","leadingZeros","trailingZeros","PoolUtils","network","poolInfo","tickArrayCache","inputTokenMint","inputAmount","sqrtPriceLimitX64","catchLiquidityInsufficient","zeroForOne","allNeededAccounts","isExist","firstTickArrayStartIndex","nextAccountMeta","allTrade","outputAmount","reaminAccounts","executionPrice","feeAmount","SwapMath","NEGATIVE_ONE","outputTokenMint","preTick","address","getPdaTickArrayAddress","isInitialized","startIndex","TickArrayBitmapExtensionUtils","TickQuery","TickUtils","nextStartIndex","currentOffset","result","lastTickArrayStartIndex","startIsInit","TickArrayBitmap","isInit","tickIndex","MIN_TICK","MAX_TICK","connection","apiPoolInfo","chainTime","poolLiquidity","rewardInfos","_a","_b","_c","nRewardInfo","i","_itemReward","apiRewardProgram","itemReward","MathUtil","PublicKey","ZERO","latestUpdateTime","BN","timeDelta","rewardGrowthDeltaX64","rewardGrowthGlobalX64","rewardEmissionedDelta","Q64","rewardTotalEmissioned","tickSpacing","tickarrayStartIndexs","maxTickBoundary","minTickBoundary","tickarrayStartIndex","TICK_ARRAY_BITMAP_SIZE","exBitmapAddress","batchRequest","fetchedBitmapAccount","getMultipleAccountsInfoWithCustomFlags","returnTypeFetchExBitmaps","item","TickArrayBitmapExtensionLayout","poolKeys","tickArraysToPoolId","tickArrays","itemPoolInfo","currentTickArrayStartIndex","startIndexArray","itemIndex","tickArrayAddress","fetchedTickArrays","itemAccountInfo","poolId","accountLayoutData","TickArrayLayout","pools","ownerInfo","updateOwnerRewardAndFee","programIds","index","accountInfo","allMint","allPositionKey","itemMint","itemProgramId","getPdaPersonalPositionAddress","positionAccountInfos","getMultipleAccountsInfo","keyToTickArrayAddress","position","PositionInfoLayout","itemPoolId","poolInfoA","pool","priceLower","priceUpper","amountA","amountB","LiquidityMath","leverage","tickArrayLowerAddress","tickArrayUpperAddress","tickArrayKeys","tickArrayDatas","tickArrayLayout","tickArrayData","key","state","positionAccount","itemPA","keyLower","keyUpper","tickArrayLower","tickArrayUpper","tickLowerState","tickUpperState","tokenFeeAmountA","tokenFeeAmountB","PositionUtils","baseMint","epochInfo","amountIn","slippage","priceLimit","decimal_default","isBaseIn","baseFeeConfig","outFeeConfig","MIN_SQRT_PRICE_X64","MAX_SQRT_PRICE_X64","SqrtPriceMath","realAmountIn","getTransferAmountFeeV2","_expectedAmountOut","remainingAccounts","_executionPriceX64","amountOut","_executionPrice","_minAmountOut","minAmountOut","poolPrice","_numerator","_denominator","priceImpact","Percent","minExpirationTime","_tokenOut","baseIn","inputMint","outMint","baseToken","outToken","Token","TOKEN_2022_PROGRAM_ID","_realAmountIn","_amountOut","expirationTime","currentPrice","fee","executionPriceX64","TokenAmount","_currentPrice","Price","_fee","feeConfigs","realAmountOut","_expectedAmountIn","inMint","_maxAmountIn","maxAmountIn","aprType","positionTickLowerIndex","positionTickUpperIndex","aprInfo","_minPrice","sub","userRange","tradeRange","p","mintPrice","liquidity","aprTypeDay","mintPriceA","solToWSol","mintPriceB","mintDecimalsA","mintDecimalsB","sqrtPriceX64","sqrtPriceX64A","sqrtPriceX64B","poolLiquidityA","poolLiquidityB","userLiquidityA","userLiquidityB","poolTvl","userTvl","feeApr","SECONDS_PER_YEAR","rewardsApr","iDecimal","iPrice","a","b","inputA","tickLower","tickUpper","amount","add","amountHasFee","coefficient","addFeeAmount","_amount","liquidity0","liquidity1","_d","coefficientRe","amounts","amountSlippageA","amountSlippageB","poolList","rpcDataMap","fetchRpcList","r","idx","PoolInfoLayout","pdaList","getPdaExBitmapAccount","exBitData","acc","cur","rpcData","MathUtil","a","b","denominator","numerator","result","ZERO","ONE","num","decimalPlaces","decimal_default","BN","n0","n1","Q128","mulRightShift","val","mulBy","signedRightShift","signedLeftShift","shiftBy","bitWidth","twosN0","twoN0","SqrtPriceMath","sqrtPriceX64","decimalsA","decimalsB","price","liquidity","amountIn","zeroForOne","amountOut","amount","add","liquidityLeftShift","U64Resolution","numerator1","amountMulSqrtPrice","deltaY","amountDivLiquidity","tick","MIN_TICK","MAX_TICK","tickAbs","ratio","MaxUint128","MAX_SQRT_PRICE_X64","MIN_SQRT_PRICE_X64","msb","adjustedMsb","log2pIntegerX32","bit","precision","log2pFractionX64","r","BIT_PRECISION","rMoreThanTwo","log2pFractionX32","logbpX64","LOG_B_2_X32","tickLow","LOG_B_P_ERR_MARGIN_LOWER_X64","tickHigh","LOG_B_P_ERR_MARGIN_UPPER_X64","TickMath","tickSpacing","mintDecimalsA","mintDecimalsB","LiquidityMath","x","y","sqrtPriceX64A","sqrtPriceX64B","roundUp","numerator2","Q64","amountA","MaxU64","amountB","sqrtPriceCurrentX64","liquidity0","liquidity1","amountMax","amountSlippage","coefficient","amount0Slippage","amount1Slippage","poolInfo","tickLower","tickUpper","slippage","epochInfo","amountAddFee","_a","_b","_c","_d","coefficientRe","amounts","getTransferAmountFeeV2","amountSlippageA","amountSlippageB","minExpirationTime","SwapMath","programId","poolId","tickArrayCache","tickArrayBitmap","tickarrayBitmapExtension","fee","currentTick","currentSqrtPriceX64","amountSpecified","lastSavedTickArrayStartIndex","sqrtPriceLimitX64","catchLiquidityInsufficient","baseInput","state","TickQuery","tickAarrayStartIndex","tickArrayCurrent","loopCount","t","step","tickState","TickUtils","nextInitTick","tickArrayAddress","nextInitTickArrayIndex","PoolUtils","expectedNextTickArrayAddress","getPdaTickArrayAddress","targetPrice","liquidityNet","NEGATIVE_ONE","_T","isExist","sqrtPriceX64Current","sqrtPriceX64Target","amountRemaining","feeRate","swapStep","amountRemainingSubtractFee","FEE_RATE_DENOMINATOR","reachTargetPrice","TICK_ARRAY_SIZE","TICK_ARRAY_BITMAP_SIZE","TickUtils","programId","poolId","tickIndex","tickSpacing","startIndex","tickArrayAddress","getPdaTickArrayAddress","startTickIndex","offsetInArray","ticksInArray","TickQuery","tick","multiplier","compressed","bitmap","bitPos","lastTickArrayStartIndex","zeroForOne","bns","b","BN","i","tickArrayBitmap","exTickArrayBitmap","tickArrayStartIndex","expectedCount","tickArrayOffset","result","allInitializedTickArrayIndex","address","tickArray","currentTickArrayBitStartIndex","tickArrayBitmaps","arrayIndex","searchIndex","tickCount","MIN_TICK","MAX_TICK","tickArrayCurrent","currentTickIndex","t","poolInfo","baseIn","tickSqrtPriceX64","SqrtPriceMath","tickPrice","decimal_default","price","_price","TickMath","ClmmConfigLayout","struct","blob","u8","u16","publicKey","u32","seq","u64","ObservationLayout","i64","ObservationInfoLayout","bool","RewardInfo","u128","PoolInfoLayout","s32","PositionRewardInfoLayout","PositionInfoLayout","ProtocolPositionLayout","TickLayout","i128","TickArrayLayout","TICK_ARRAY_SIZE","OperationLayout","TickArrayBitmapExtensionLayout","EXTENSION_TICKARRAY_BITMAP_SIZE","LockPositionLayout","LockClPositionLayoutV2","ObservationInfoLayout","logger","createLogger","anchorDataBuf","lockInsDataBuf","lockHarvestInsDataBuf","ClmmInstrument","programId","poolId","poolCreator","ammConfigId","observationId","mintA","mintVaultA","mintProgramIdA","mintB","mintVaultB","mintProgramIdB","exTickArrayBitmap","sqrtPriceX64","startTime","dataLayout","struct","u128","u64","keys","SystemProgram","RENT_PROGRAM_ID","data","aData","TransactionInstruction","props","owner","initialPriceX64","mintAAddress","mintBAddress","PublicKey","getPdaPoolId","getPdaObservationAccount","mintAVault","getPdaPoolVaultId","mintBVault","exBitmapAccount","getPdaExBitmapAccount","ins","TOKEN_PROGRAM_ID","InstructionType","payer","positionNftOwner","positionNftMint","positionNftAccount","metadataAccount","protocolPosition","tickArrayLower","tickArrayUpper","personalPosition","ownerTokenAccountA","ownerTokenAccountB","tokenVaultA","tokenVaultB","tokenMintA","tokenMintB","tickLowerIndex","tickUpperIndex","tickArrayLowerStartIndex","tickArrayUpperStartIndex","liquidity","amountMaxA","amountMaxB","withMetadata","s32","bool","u8","remainingAccounts","ASSOCIATED_TOKEN_PROGRAM_ID","METADATA_PROGRAM_ID","TOKEN_2022_PROGRAM_ID","poolInfo","poolKeys","ownerInfo","tickLower","tickUpper","getEphemeralSigners","nft2022","signers","id","nftMintAccount","_k","Keypair","TickUtils","getPdaTickArrayAddress","getATAAddress","getPdaMetadataKey","getPdaPersonalPositionAddress","getPdaProtocolPositionAddress","PoolUtils","base","baseAmount","otherAmountMax","BN","ownerPosition","mintMintA","mintMintB","rewardAccounts","amountMinA","amountMinB","i","MEMO_PROGRAM_ID","poolProgramId","decreaseIns","inputTokenAccount","outputTokenAccount","inputVault","outputVault","inputMint","outputMint","tickArray","amount","otherAmountThreshold","sqrtPriceLimitX64","isBaseInput","amountIn","amountOutMin","isInputMintA","amountOut","amountInMax","operationId","ownerTokenAccount","rewardProgramId","rewardMint","rewardVault","openTime","endTime","emissionsPerSecondX64","parseBigNumberish","rewardInfo","poolRewardVault","getPdaPoolRewardVaulId","getPdaOperationAccount","rewardIndex","index","authProgramId","wallet","nftMint","lockNftMint","positionId","lockPositionId","getPdaLockClPositionIdV2","lockNftAccount","auth","positionOwner","lockOwner","authPositionNftAccount","positionNftProgram","positionNft","nftAccount","getPdaLockPositionId","MEMO_PROGRAM_ID2","clmmProgram","vaultA","vaultB","userVaultA","userVaultB","CpmmConfigInfoLayout","struct","blob","u8","bool","u16","u64","publicKey","seq","CpmmPoolInfoLayout","ASSOCIATED_TOKEN_PROGRAM_ID","TOKEN_2022_PROGRAM_ID","TOKEN_PROGRAM_ID","Keypair","PublicKey","SystemProgram","TransactionInstruction","AUTH_SEED","AMM_CONFIG_SEED","POOL_SEED","POOL_LP_MINT_SEED","POOL_VAULT_SEED","OBSERVATION_SEED","LOCK_LIQUIDITY_SEED","logger","createLogger","anchorDataBuf","makeSwapCpmmBaseInInInstruction","programId","payer","authority","configId","poolId","userInputAccount","userOutputAccount","inputVault","outputVault","inputTokenProgram","outputTokenProgram","inputMint","outputMint","observationId","amountIn","amounOutMin","dataLayout","struct","u64","keys","data","TransactionInstruction","anchorDataBuf","BN","Decimal","BN","ZERO","BN","BN","FEE_RATE_DENOMINATOR_VALUE","BN","LIQUIDITY_FEES_NUMERATOR","LIQUIDITY_FEES_DENOMINATOR","fixedSwapInLayout","struct","u8","u64","fixedSwapOutLayout","createPoolV4Layout","initPoolLayout","liquidityStateV4Layout","u128","publicKey","seq","liquidityStateV5Layout","addLiquidityLayout","removeLiquidityLayout","createPoolFeeLayout","struct","u64","TOKEN_PROGRAM_ID","PublicKey","BN","ASSOCIATED_TOKEN_PROGRAM_ID","TOKEN_PROGRAM_ID","PublicKey","SystemProgram","SYSVAR_RENT_PUBKEY","TransactionInstruction","PublicKey","MODEL_DATA_PUBKEY","PublicKey","ELEMENT_SIZE","DataElement","struct","u64","modelDataInfoLayout","seq","logger","createLogger","makeSwapFixedInInstruction","propPoolKeys","userKeys","amountIn","minAmountOut","version","poolKeys","jsonInfo2PoolKeys","data","fixedSwapInLayout","parseBigNumberish","keys","accountMeta","TOKEN_PROGRAM_ID","MODEL_DATA_PUBKEY","TransactionInstruction","makeSwapFixedOutInstruction","maxAmountIn","amountOut","fixedSwapOutLayout","makeAMMSwapInstruction","params","fixedSide","props","logger","PublicKey","logger","createLogger","SERUM_PROGRAMID_TO_VERSION","SERUM_PROGRAM_ID_V3","MARKET_STATE_LAYOUT_V3","struct","blob","publicKey","u64","PublicKey","logger","createLogger","ASSOCIATED_TOKEN_PROGRAM_ID","TOKEN_2022_PROGRAM_ID","TOKEN_PROGRAM_ID","PublicKey","SystemProgram","TransactionInstruction","BN","route1Instruction","programId","poolInfoA","poolKeyA","poolKeyB","userSourceToken","userRouteToken","userPdaAccount","ownerWallet","inputMint","amountIn","amountOut","tickArrayA","dataLayout","struct","u8","u64","keys","SystemProgram","TOKEN_PROGRAM_ID","PublicKey","poolKey","jsonInfo2PoolKeys","i","data","TransactionInstruction","route2Instruction","poolInfoB","userDestinationToken","routeMint","tickArrayB","routeInstruction","wallet","outputMint","remainingAccounts","_a","clmmPriceLimit","accountMeta","TOKEN_2022_PROGRAM_ID","ASSOCIATED_TOKEN_PROGRAM_ID","poolInfos","poolKeys","routeMints","index","_poolInfo","inputIsA","_poolKey","MEMO_PROGRAM_ID2","getPdaExBitmapAccount","clmmPriceLimitX64InsData","item","LIQUIDITY_POOL_PROGRAM_ID_V5_MODEL","isSupportIdOnly","seq","u128","x64Price","_m","BN","MIN_SQRT_PRICE_X64_ADD_ONE","MAX_SQRT_PRICE_X64_SUB_ONE","makeSwapInstruction","routeProgram","ownerInfo","swapInfo","_b","_c","_d","_e","_f","_g","sqrtPriceLimitX64","MIN_SQRT_PRICE_X64","ONE","MAX_SQRT_PRICE_X64","ClmmInstrument","poolInfo","baseIn","makeSwapCpmmBaseInInInstruction","InstructionType","makeAMMSwapInstruction","poolInfo1","poolInfo2","poolKey1","poolKey2","a","swapBaseInAutoAccount","amount","inputAccount","outputAccount","routeInfo","network","cacheAccount","_routeInfo","mint","ata","getATAAddress","ALL_PROGRAM_ID","swapBaseOutAutoAccount","poolkey","ZERO","BN"]}