lll-sdk 0.0.0-experimental-20250821110614 → 0.0.0-experimental-20250821111532
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +1 -12
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1 -12
- package/dist/index.mjs.map +1 -1
- package/package.json +4 -3
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../node_modules/.pnpm/bn.js@5.2.2/node_modules/bn.js/lib/bn.js","../src/index.ts","../src/sdk.ts","../src/config/mainnet.ts","../src/modules/suilendModule.ts","../../../node_modules/.pnpm/bignumber.js@9.3.1/node_modules/bignumber.js/bignumber.mjs","../src/utils/suiLend.ts","../../../node_modules/.pnpm/uuid@9.0.1/node_modules/uuid/dist/esm-node/rng.js","../../../node_modules/.pnpm/uuid@9.0.1/node_modules/uuid/dist/esm-node/stringify.js","../../../node_modules/.pnpm/uuid@9.0.1/node_modules/uuid/dist/esm-node/native.js","../../../node_modules/.pnpm/uuid@9.0.1/node_modules/uuid/dist/esm-node/v4.js","../src/modules/leverageModules.ts","../../../node_modules/.pnpm/bn.js@5.2.2/node_modules/bn.js/lib/bn.js","../../clmm/src/sdk.ts","../../clmm/src/modules/configModule.ts","../../../node_modules/.pnpm/js-base64@3.7.7/node_modules/js-base64/base64.mjs","../../clmm/src/errors/errors.ts","../../clmm/src/modules/poolModule.ts","../../clmm/src/types/clmm_type.ts","../../clmm/src/types/clmmpool.ts","../../clmm/src/utils/swapUtils.ts","../../clmm/src/types/sui.ts","../../clmm/src/utils/positionUtils.ts","../../../node_modules/.pnpm/decimal.js@10.5.0/node_modules/decimal.js/decimal.mjs","../../clmm/src/utils/common.ts","../../clmm/src/utils/vestUtils.ts","../../clmm/src/modules/positionModule.ts","../../clmm/src/modules/rewarderModule.ts","../../clmm/src/modules/swapModule.ts","../../clmm/src/modules/vestModule.ts","../../clmm/src/config/mainnet.ts","../../clmm/src/config/testnet.ts","../../clmm/src/math/apr.ts","../../clmm/src/index.ts"],"sourcesContent":["(function (module, exports) {\n 'use strict';\n\n // Utils\n function assert (val, msg) {\n if (!val) throw new Error(msg || 'Assertion failed');\n }\n\n // Could use `inherits` module, but don't want to move from single file\n // architecture yet.\n function inherits (ctor, superCtor) {\n ctor.super_ = superCtor;\n var TempCtor = function () {};\n TempCtor.prototype = superCtor.prototype;\n ctor.prototype = new TempCtor();\n ctor.prototype.constructor = ctor;\n }\n\n // BN\n\n function BN (number, base, endian) {\n if (BN.isBN(number)) {\n return number;\n }\n\n this.negative = 0;\n this.words = null;\n this.length = 0;\n\n // Reduction context\n this.red = null;\n\n if (number !== null) {\n if (base === 'le' || base === 'be') {\n endian = base;\n base = 10;\n }\n\n this._init(number || 0, base || 10, endian || 'be');\n }\n }\n if (typeof module === 'object') {\n module.exports = BN;\n } else {\n exports.BN = BN;\n }\n\n BN.BN = BN;\n BN.wordSize = 26;\n\n var Buffer;\n try {\n if (typeof window !== 'undefined' && typeof window.Buffer !== 'undefined') {\n Buffer = window.Buffer;\n } else {\n Buffer = require('buffer').Buffer;\n }\n } catch (e) {\n }\n\n BN.isBN = function isBN (num) {\n if (num instanceof BN) {\n return true;\n }\n\n return num !== null && typeof num === 'object' &&\n num.constructor.wordSize === BN.wordSize && Array.isArray(num.words);\n };\n\n BN.max = function max (left, right) {\n if (left.cmp(right) > 0) return left;\n return right;\n };\n\n BN.min = function min (left, right) {\n if (left.cmp(right) < 0) return left;\n return right;\n };\n\n BN.prototype._init = function init (number, base, endian) {\n if (typeof number === 'number') {\n return this._initNumber(number, base, endian);\n }\n\n if (typeof number === 'object') {\n return this._initArray(number, base, endian);\n }\n\n if (base === 'hex') {\n base = 16;\n }\n assert(base === (base | 0) && base >= 2 && base <= 36);\n\n number = number.toString().replace(/\\s+/g, '');\n var start = 0;\n if (number[0] === '-') {\n start++;\n this.negative = 1;\n }\n\n if (start < number.length) {\n if (base === 16) {\n this._parseHex(number, start, endian);\n } else {\n this._parseBase(number, base, start);\n if (endian === 'le') {\n this._initArray(this.toArray(), base, endian);\n }\n }\n }\n };\n\n BN.prototype._initNumber = function _initNumber (number, base, endian) {\n if (number < 0) {\n this.negative = 1;\n number = -number;\n }\n if (number < 0x4000000) {\n this.words = [number & 0x3ffffff];\n this.length = 1;\n } else if (number < 0x10000000000000) {\n this.words = [\n number & 0x3ffffff,\n (number / 0x4000000) & 0x3ffffff\n ];\n this.length = 2;\n } else {\n assert(number < 0x20000000000000); // 2 ^ 53 (unsafe)\n this.words = [\n number & 0x3ffffff,\n (number / 0x4000000) & 0x3ffffff,\n 1\n ];\n this.length = 3;\n }\n\n if (endian !== 'le') return;\n\n // Reverse the bytes\n this._initArray(this.toArray(), base, endian);\n };\n\n BN.prototype._initArray = function _initArray (number, base, endian) {\n // Perhaps a Uint8Array\n assert(typeof number.length === 'number');\n if (number.length <= 0) {\n this.words = [0];\n this.length = 1;\n return this;\n }\n\n this.length = Math.ceil(number.length / 3);\n this.words = new Array(this.length);\n for (var i = 0; i < this.length; i++) {\n this.words[i] = 0;\n }\n\n var j, w;\n var off = 0;\n if (endian === 'be') {\n for (i = number.length - 1, j = 0; i >= 0; i -= 3) {\n w = number[i] | (number[i - 1] << 8) | (number[i - 2] << 16);\n this.words[j] |= (w << off) & 0x3ffffff;\n this.words[j + 1] = (w >>> (26 - off)) & 0x3ffffff;\n off += 24;\n if (off >= 26) {\n off -= 26;\n j++;\n }\n }\n } else if (endian === 'le') {\n for (i = 0, j = 0; i < number.length; i += 3) {\n w = number[i] | (number[i + 1] << 8) | (number[i + 2] << 16);\n this.words[j] |= (w << off) & 0x3ffffff;\n this.words[j + 1] = (w >>> (26 - off)) & 0x3ffffff;\n off += 24;\n if (off >= 26) {\n off -= 26;\n j++;\n }\n }\n }\n return this._strip();\n };\n\n function parseHex4Bits (string, index) {\n var c = string.charCodeAt(index);\n // '0' - '9'\n if (c >= 48 && c <= 57) {\n return c - 48;\n // 'A' - 'F'\n } else if (c >= 65 && c <= 70) {\n return c - 55;\n // 'a' - 'f'\n } else if (c >= 97 && c <= 102) {\n return c - 87;\n } else {\n assert(false, 'Invalid character in ' + string);\n }\n }\n\n function parseHexByte (string, lowerBound, index) {\n var r = parseHex4Bits(string, index);\n if (index - 1 >= lowerBound) {\n r |= parseHex4Bits(string, index - 1) << 4;\n }\n return r;\n }\n\n BN.prototype._parseHex = function _parseHex (number, start, endian) {\n // Create possibly bigger array to ensure that it fits the number\n this.length = Math.ceil((number.length - start) / 6);\n this.words = new Array(this.length);\n for (var i = 0; i < this.length; i++) {\n this.words[i] = 0;\n }\n\n // 24-bits chunks\n var off = 0;\n var j = 0;\n\n var w;\n if (endian === 'be') {\n for (i = number.length - 1; i >= start; i -= 2) {\n w = parseHexByte(number, start, i) << off;\n this.words[j] |= w & 0x3ffffff;\n if (off >= 18) {\n off -= 18;\n j += 1;\n this.words[j] |= w >>> 26;\n } else {\n off += 8;\n }\n }\n } else {\n var parseLength = number.length - start;\n for (i = parseLength % 2 === 0 ? start + 1 : start; i < number.length; i += 2) {\n w = parseHexByte(number, start, i) << off;\n this.words[j] |= w & 0x3ffffff;\n if (off >= 18) {\n off -= 18;\n j += 1;\n this.words[j] |= w >>> 26;\n } else {\n off += 8;\n }\n }\n }\n\n this._strip();\n };\n\n function parseBase (str, start, end, mul) {\n var r = 0;\n var b = 0;\n var len = Math.min(str.length, end);\n for (var i = start; i < len; i++) {\n var c = str.charCodeAt(i) - 48;\n\n r *= mul;\n\n // 'a'\n if (c >= 49) {\n b = c - 49 + 0xa;\n\n // 'A'\n } else if (c >= 17) {\n b = c - 17 + 0xa;\n\n // '0' - '9'\n } else {\n b = c;\n }\n assert(c >= 0 && b < mul, 'Invalid character');\n r += b;\n }\n return r;\n }\n\n BN.prototype._parseBase = function _parseBase (number, base, start) {\n // Initialize as zero\n this.words = [0];\n this.length = 1;\n\n // Find length of limb in base\n for (var limbLen = 0, limbPow = 1; limbPow <= 0x3ffffff; limbPow *= base) {\n limbLen++;\n }\n limbLen--;\n limbPow = (limbPow / base) | 0;\n\n var total = number.length - start;\n var mod = total % limbLen;\n var end = Math.min(total, total - mod) + start;\n\n var word = 0;\n for (var i = start; i < end; i += limbLen) {\n word = parseBase(number, i, i + limbLen, base);\n\n this.imuln(limbPow);\n if (this.words[0] + word < 0x4000000) {\n this.words[0] += word;\n } else {\n this._iaddn(word);\n }\n }\n\n if (mod !== 0) {\n var pow = 1;\n word = parseBase(number, i, number.length, base);\n\n for (i = 0; i < mod; i++) {\n pow *= base;\n }\n\n this.imuln(pow);\n if (this.words[0] + word < 0x4000000) {\n this.words[0] += word;\n } else {\n this._iaddn(word);\n }\n }\n\n this._strip();\n };\n\n BN.prototype.copy = function copy (dest) {\n dest.words = new Array(this.length);\n for (var i = 0; i < this.length; i++) {\n dest.words[i] = this.words[i];\n }\n dest.length = this.length;\n dest.negative = this.negative;\n dest.red = this.red;\n };\n\n function move (dest, src) {\n dest.words = src.words;\n dest.length = src.length;\n dest.negative = src.negative;\n dest.red = src.red;\n }\n\n BN.prototype._move = function _move (dest) {\n move(dest, this);\n };\n\n BN.prototype.clone = function clone () {\n var r = new BN(null);\n this.copy(r);\n return r;\n };\n\n BN.prototype._expand = function _expand (size) {\n while (this.length < size) {\n this.words[this.length++] = 0;\n }\n return this;\n };\n\n // Remove leading `0` from `this`\n BN.prototype._strip = function strip () {\n while (this.length > 1 && this.words[this.length - 1] === 0) {\n this.length--;\n }\n return this._normSign();\n };\n\n BN.prototype._normSign = function _normSign () {\n // -0 = 0\n if (this.length === 1 && this.words[0] === 0) {\n this.negative = 0;\n }\n return this;\n };\n\n // Check Symbol.for because not everywhere where Symbol defined\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol#Browser_compatibility\n if (typeof Symbol !== 'undefined' && typeof Symbol.for === 'function') {\n try {\n BN.prototype[Symbol.for('nodejs.util.inspect.custom')] = inspect;\n } catch (e) {\n BN.prototype.inspect = inspect;\n }\n } else {\n BN.prototype.inspect = inspect;\n }\n\n function inspect () {\n return (this.red ? '<BN-R: ' : '<BN: ') + this.toString(16) + '>';\n }\n\n /*\n\n var zeros = [];\n var groupSizes = [];\n var groupBases = [];\n\n var s = '';\n var i = -1;\n while (++i < BN.wordSize) {\n zeros[i] = s;\n s += '0';\n }\n groupSizes[0] = 0;\n groupSizes[1] = 0;\n groupBases[0] = 0;\n groupBases[1] = 0;\n var base = 2 - 1;\n while (++base < 36 + 1) {\n var groupSize = 0;\n var groupBase = 1;\n while (groupBase < (1 << BN.wordSize) / base) {\n groupBase *= base;\n groupSize += 1;\n }\n groupSizes[base] = groupSize;\n groupBases[base] = groupBase;\n }\n\n */\n\n var zeros = [\n '',\n '0',\n '00',\n '000',\n '0000',\n '00000',\n '000000',\n '0000000',\n '00000000',\n '000000000',\n '0000000000',\n '00000000000',\n '000000000000',\n '0000000000000',\n '00000000000000',\n '000000000000000',\n '0000000000000000',\n '00000000000000000',\n '000000000000000000',\n '0000000000000000000',\n '00000000000000000000',\n '000000000000000000000',\n '0000000000000000000000',\n '00000000000000000000000',\n '000000000000000000000000',\n '0000000000000000000000000'\n ];\n\n var groupSizes = [\n 0, 0,\n 25, 16, 12, 11, 10, 9, 8,\n 8, 7, 7, 7, 7, 6, 6,\n 6, 6, 6, 6, 6, 5, 5,\n 5, 5, 5, 5, 5, 5, 5,\n 5, 5, 5, 5, 5, 5, 5\n ];\n\n var groupBases = [\n 0, 0,\n 33554432, 43046721, 16777216, 48828125, 60466176, 40353607, 16777216,\n 43046721, 10000000, 19487171, 35831808, 62748517, 7529536, 11390625,\n 16777216, 24137569, 34012224, 47045881, 64000000, 4084101, 5153632,\n 6436343, 7962624, 9765625, 11881376, 14348907, 17210368, 20511149,\n 24300000, 28629151, 33554432, 39135393, 45435424, 52521875, 60466176\n ];\n\n BN.prototype.toString = function toString (base, padding) {\n base = base || 10;\n padding = padding | 0 || 1;\n\n var out;\n if (base === 16 || base === 'hex') {\n out = '';\n var off = 0;\n var carry = 0;\n for (var i = 0; i < this.length; i++) {\n var w = this.words[i];\n var word = (((w << off) | carry) & 0xffffff).toString(16);\n carry = (w >>> (24 - off)) & 0xffffff;\n off += 2;\n if (off >= 26) {\n off -= 26;\n i--;\n }\n if (carry !== 0 || i !== this.length - 1) {\n out = zeros[6 - word.length] + word + out;\n } else {\n out = word + out;\n }\n }\n if (carry !== 0) {\n out = carry.toString(16) + out;\n }\n while (out.length % padding !== 0) {\n out = '0' + out;\n }\n if (this.negative !== 0) {\n out = '-' + out;\n }\n return out;\n }\n\n if (base === (base | 0) && base >= 2 && base <= 36) {\n // var groupSize = Math.floor(BN.wordSize * Math.LN2 / Math.log(base));\n var groupSize = groupSizes[base];\n // var groupBase = Math.pow(base, groupSize);\n var groupBase = groupBases[base];\n out = '';\n var c = this.clone();\n c.negative = 0;\n while (!c.isZero()) {\n var r = c.modrn(groupBase).toString(base);\n c = c.idivn(groupBase);\n\n if (!c.isZero()) {\n out = zeros[groupSize - r.length] + r + out;\n } else {\n out = r + out;\n }\n }\n if (this.isZero()) {\n out = '0' + out;\n }\n while (out.length % padding !== 0) {\n out = '0' + out;\n }\n if (this.negative !== 0) {\n out = '-' + out;\n }\n return out;\n }\n\n assert(false, 'Base should be between 2 and 36');\n };\n\n BN.prototype.toNumber = function toNumber () {\n var ret = this.words[0];\n if (this.length === 2) {\n ret += this.words[1] * 0x4000000;\n } else if (this.length === 3 && this.words[2] === 0x01) {\n // NOTE: at this stage it is known that the top bit is set\n ret += 0x10000000000000 + (this.words[1] * 0x4000000);\n } else if (this.length > 2) {\n assert(false, 'Number can only safely store up to 53 bits');\n }\n return (this.negative !== 0) ? -ret : ret;\n };\n\n BN.prototype.toJSON = function toJSON () {\n return this.toString(16, 2);\n };\n\n if (Buffer) {\n BN.prototype.toBuffer = function toBuffer (endian, length) {\n return this.toArrayLike(Buffer, endian, length);\n };\n }\n\n BN.prototype.toArray = function toArray (endian, length) {\n return this.toArrayLike(Array, endian, length);\n };\n\n var allocate = function allocate (ArrayType, size) {\n if (ArrayType.allocUnsafe) {\n return ArrayType.allocUnsafe(size);\n }\n return new ArrayType(size);\n };\n\n BN.prototype.toArrayLike = function toArrayLike (ArrayType, endian, length) {\n this._strip();\n\n var byteLength = this.byteLength();\n var reqLength = length || Math.max(1, byteLength);\n assert(byteLength <= reqLength, 'byte array longer than desired length');\n assert(reqLength > 0, 'Requested array length <= 0');\n\n var res = allocate(ArrayType, reqLength);\n var postfix = endian === 'le' ? 'LE' : 'BE';\n this['_toArrayLike' + postfix](res, byteLength);\n return res;\n };\n\n BN.prototype._toArrayLikeLE = function _toArrayLikeLE (res, byteLength) {\n var position = 0;\n var carry = 0;\n\n for (var i = 0, shift = 0; i < this.length; i++) {\n var word = (this.words[i] << shift) | carry;\n\n res[position++] = word & 0xff;\n if (position < res.length) {\n res[position++] = (word >> 8) & 0xff;\n }\n if (position < res.length) {\n res[position++] = (word >> 16) & 0xff;\n }\n\n if (shift === 6) {\n if (position < res.length) {\n res[position++] = (word >> 24) & 0xff;\n }\n carry = 0;\n shift = 0;\n } else {\n carry = word >>> 24;\n shift += 2;\n }\n }\n\n if (position < res.length) {\n res[position++] = carry;\n\n while (position < res.length) {\n res[position++] = 0;\n }\n }\n };\n\n BN.prototype._toArrayLikeBE = function _toArrayLikeBE (res, byteLength) {\n var position = res.length - 1;\n var carry = 0;\n\n for (var i = 0, shift = 0; i < this.length; i++) {\n var word = (this.words[i] << shift) | carry;\n\n res[position--] = word & 0xff;\n if (position >= 0) {\n res[position--] = (word >> 8) & 0xff;\n }\n if (position >= 0) {\n res[position--] = (word >> 16) & 0xff;\n }\n\n if (shift === 6) {\n if (position >= 0) {\n res[position--] = (word >> 24) & 0xff;\n }\n carry = 0;\n shift = 0;\n } else {\n carry = word >>> 24;\n shift += 2;\n }\n }\n\n if (position >= 0) {\n res[position--] = carry;\n\n while (position >= 0) {\n res[position--] = 0;\n }\n }\n };\n\n if (Math.clz32) {\n BN.prototype._countBits = function _countBits (w) {\n return 32 - Math.clz32(w);\n };\n } else {\n BN.prototype._countBits = function _countBits (w) {\n var t = w;\n var r = 0;\n if (t >= 0x1000) {\n r += 13;\n t >>>= 13;\n }\n if (t >= 0x40) {\n r += 7;\n t >>>= 7;\n }\n if (t >= 0x8) {\n r += 4;\n t >>>= 4;\n }\n if (t >= 0x02) {\n r += 2;\n t >>>= 2;\n }\n return r + t;\n };\n }\n\n BN.prototype._zeroBits = function _zeroBits (w) {\n // Short-cut\n if (w === 0) return 26;\n\n var t = w;\n var r = 0;\n if ((t & 0x1fff) === 0) {\n r += 13;\n t >>>= 13;\n }\n if ((t & 0x7f) === 0) {\n r += 7;\n t >>>= 7;\n }\n if ((t & 0xf) === 0) {\n r += 4;\n t >>>= 4;\n }\n if ((t & 0x3) === 0) {\n r += 2;\n t >>>= 2;\n }\n if ((t & 0x1) === 0) {\n r++;\n }\n return r;\n };\n\n // Return number of used bits in a BN\n BN.prototype.bitLength = function bitLength () {\n var w = this.words[this.length - 1];\n var hi = this._countBits(w);\n return (this.length - 1) * 26 + hi;\n };\n\n function toBitArray (num) {\n var w = new Array(num.bitLength());\n\n for (var bit = 0; bit < w.length; bit++) {\n var off = (bit / 26) | 0;\n var wbit = bit % 26;\n\n w[bit] = (num.words[off] >>> wbit) & 0x01;\n }\n\n return w;\n }\n\n // Number of trailing zero bits\n BN.prototype.zeroBits = function zeroBits () {\n if (this.isZero()) return 0;\n\n var r = 0;\n for (var i = 0; i < this.length; i++) {\n var b = this._zeroBits(this.words[i]);\n r += b;\n if (b !== 26) break;\n }\n return r;\n };\n\n BN.prototype.byteLength = function byteLength () {\n return Math.ceil(this.bitLength() / 8);\n };\n\n BN.prototype.toTwos = function toTwos (width) {\n if (this.negative !== 0) {\n return this.abs().inotn(width).iaddn(1);\n }\n return this.clone();\n };\n\n BN.prototype.fromTwos = function fromTwos (width) {\n if (this.testn(width - 1)) {\n return this.notn(width).iaddn(1).ineg();\n }\n return this.clone();\n };\n\n BN.prototype.isNeg = function isNeg () {\n return this.negative !== 0;\n };\n\n // Return negative clone of `this`\n BN.prototype.neg = function neg () {\n return this.clone().ineg();\n };\n\n BN.prototype.ineg = function ineg () {\n if (!this.isZero()) {\n this.negative ^= 1;\n }\n\n return this;\n };\n\n // Or `num` with `this` in-place\n BN.prototype.iuor = function iuor (num) {\n while (this.length < num.length) {\n this.words[this.length++] = 0;\n }\n\n for (var i = 0; i < num.length; i++) {\n this.words[i] = this.words[i] | num.words[i];\n }\n\n return this._strip();\n };\n\n BN.prototype.ior = function ior (num) {\n assert((this.negative | num.negative) === 0);\n return this.iuor(num);\n };\n\n // Or `num` with `this`\n BN.prototype.or = function or (num) {\n if (this.length > num.length) return this.clone().ior(num);\n return num.clone().ior(this);\n };\n\n BN.prototype.uor = function uor (num) {\n if (this.length > num.length) return this.clone().iuor(num);\n return num.clone().iuor(this);\n };\n\n // And `num` with `this` in-place\n BN.prototype.iuand = function iuand (num) {\n // b = min-length(num, this)\n var b;\n if (this.length > num.length) {\n b = num;\n } else {\n b = this;\n }\n\n for (var i = 0; i < b.length; i++) {\n this.words[i] = this.words[i] & num.words[i];\n }\n\n this.length = b.length;\n\n return this._strip();\n };\n\n BN.prototype.iand = function iand (num) {\n assert((this.negative | num.negative) === 0);\n return this.iuand(num);\n };\n\n // And `num` with `this`\n BN.prototype.and = function and (num) {\n if (this.length > num.length) return this.clone().iand(num);\n return num.clone().iand(this);\n };\n\n BN.prototype.uand = function uand (num) {\n if (this.length > num.length) return this.clone().iuand(num);\n return num.clone().iuand(this);\n };\n\n // Xor `num` with `this` in-place\n BN.prototype.iuxor = function iuxor (num) {\n // a.length > b.length\n var a;\n var b;\n if (this.length > num.length) {\n a = this;\n b = num;\n } else {\n a = num;\n b = this;\n }\n\n for (var i = 0; i < b.length; i++) {\n this.words[i] = a.words[i] ^ b.words[i];\n }\n\n if (this !== a) {\n for (; i < a.length; i++) {\n this.words[i] = a.words[i];\n }\n }\n\n this.length = a.length;\n\n return this._strip();\n };\n\n BN.prototype.ixor = function ixor (num) {\n assert((this.negative | num.negative) === 0);\n return this.iuxor(num);\n };\n\n // Xor `num` with `this`\n BN.prototype.xor = function xor (num) {\n if (this.length > num.length) return this.clone().ixor(num);\n return num.clone().ixor(this);\n };\n\n BN.prototype.uxor = function uxor (num) {\n if (this.length > num.length) return this.clone().iuxor(num);\n return num.clone().iuxor(this);\n };\n\n // Not ``this`` with ``width`` bitwidth\n BN.prototype.inotn = function inotn (width) {\n assert(typeof width === 'number' && width >= 0);\n\n var bytesNeeded = Math.ceil(width / 26) | 0;\n var bitsLeft = width % 26;\n\n // Extend the buffer with leading zeroes\n this._expand(bytesNeeded);\n\n if (bitsLeft > 0) {\n bytesNeeded--;\n }\n\n // Handle complete words\n for (var i = 0; i < bytesNeeded; i++) {\n this.words[i] = ~this.words[i] & 0x3ffffff;\n }\n\n // Handle the residue\n if (bitsLeft > 0) {\n this.words[i] = ~this.words[i] & (0x3ffffff >> (26 - bitsLeft));\n }\n\n // And remove leading zeroes\n return this._strip();\n };\n\n BN.prototype.notn = function notn (width) {\n return this.clone().inotn(width);\n };\n\n // Set `bit` of `this`\n BN.prototype.setn = function setn (bit, val) {\n assert(typeof bit === 'number' && bit >= 0);\n\n var off = (bit / 26) | 0;\n var wbit = bit % 26;\n\n this._expand(off + 1);\n\n if (val) {\n this.words[off] = this.words[off] | (1 << wbit);\n } else {\n this.words[off] = this.words[off] & ~(1 << wbit);\n }\n\n return this._strip();\n };\n\n // Add `num` to `this` in-place\n BN.prototype.iadd = function iadd (num) {\n var r;\n\n // negative + positive\n if (this.negative !== 0 && num.negative === 0) {\n this.negative = 0;\n r = this.isub(num);\n this.negative ^= 1;\n return this._normSign();\n\n // positive + negative\n } else if (this.negative === 0 && num.negative !== 0) {\n num.negative = 0;\n r = this.isub(num);\n num.negative = 1;\n return r._normSign();\n }\n\n // a.length > b.length\n var a, b;\n if (this.length > num.length) {\n a = this;\n b = num;\n } else {\n a = num;\n b = this;\n }\n\n var carry = 0;\n for (var i = 0; i < b.length; i++) {\n r = (a.words[i] | 0) + (b.words[i] | 0) + carry;\n this.words[i] = r & 0x3ffffff;\n carry = r >>> 26;\n }\n for (; carry !== 0 && i < a.length; i++) {\n r = (a.words[i] | 0) + carry;\n this.words[i] = r & 0x3ffffff;\n carry = r >>> 26;\n }\n\n this.length = a.length;\n if (carry !== 0) {\n this.words[this.length] = carry;\n this.length++;\n // Copy the rest of the words\n } else if (a !== this) {\n for (; i < a.length; i++) {\n this.words[i] = a.words[i];\n }\n }\n\n return this;\n };\n\n // Add `num` to `this`\n BN.prototype.add = function add (num) {\n var res;\n if (num.negative !== 0 && this.negative === 0) {\n num.negative = 0;\n res = this.sub(num);\n num.negative ^= 1;\n return res;\n } else if (num.negative === 0 && this.negative !== 0) {\n this.negative = 0;\n res = num.sub(this);\n this.negative = 1;\n return res;\n }\n\n if (this.length > num.length) return this.clone().iadd(num);\n\n return num.clone().iadd(this);\n };\n\n // Subtract `num` from `this` in-place\n BN.prototype.isub = function isub (num) {\n // this - (-num) = this + num\n if (num.negative !== 0) {\n num.negative = 0;\n var r = this.iadd(num);\n num.negative = 1;\n return r._normSign();\n\n // -this - num = -(this + num)\n } else if (this.negative !== 0) {\n this.negative = 0;\n this.iadd(num);\n this.negative = 1;\n return this._normSign();\n }\n\n // At this point both numbers are positive\n var cmp = this.cmp(num);\n\n // Optimization - zeroify\n if (cmp === 0) {\n this.negative = 0;\n this.length = 1;\n this.words[0] = 0;\n return this;\n }\n\n // a > b\n var a, b;\n if (cmp > 0) {\n a = this;\n b = num;\n } else {\n a = num;\n b = this;\n }\n\n var carry = 0;\n for (var i = 0; i < b.length; i++) {\n r = (a.words[i] | 0) - (b.words[i] | 0) + carry;\n carry = r >> 26;\n this.words[i] = r & 0x3ffffff;\n }\n for (; carry !== 0 && i < a.length; i++) {\n r = (a.words[i] | 0) + carry;\n carry = r >> 26;\n this.words[i] = r & 0x3ffffff;\n }\n\n // Copy rest of the words\n if (carry === 0 && i < a.length && a !== this) {\n for (; i < a.length; i++) {\n this.words[i] = a.words[i];\n }\n }\n\n this.length = Math.max(this.length, i);\n\n if (a !== this) {\n this.negative = 1;\n }\n\n return this._strip();\n };\n\n // Subtract `num` from `this`\n BN.prototype.sub = function sub (num) {\n return this.clone().isub(num);\n };\n\n function smallMulTo (self, num, out) {\n out.negative = num.negative ^ self.negative;\n var len = (self.length + num.length) | 0;\n out.length = len;\n len = (len - 1) | 0;\n\n // Peel one iteration (compiler can't do it, because of code complexity)\n var a = self.words[0] | 0;\n var b = num.words[0] | 0;\n var r = a * b;\n\n var lo = r & 0x3ffffff;\n var carry = (r / 0x4000000) | 0;\n out.words[0] = lo;\n\n for (var k = 1; k < len; k++) {\n // Sum all words with the same `i + j = k` and accumulate `ncarry`,\n // note that ncarry could be >= 0x3ffffff\n var ncarry = carry >>> 26;\n var rword = carry & 0x3ffffff;\n var maxJ = Math.min(k, num.length - 1);\n for (var j = Math.max(0, k - self.length + 1); j <= maxJ; j++) {\n var i = (k - j) | 0;\n a = self.words[i] | 0;\n b = num.words[j] | 0;\n r = a * b + rword;\n ncarry += (r / 0x4000000) | 0;\n rword = r & 0x3ffffff;\n }\n out.words[k] = rword | 0;\n carry = ncarry | 0;\n }\n if (carry !== 0) {\n out.words[k] = carry | 0;\n } else {\n out.length--;\n }\n\n return out._strip();\n }\n\n // TODO(indutny): it may be reasonable to omit it for users who don't need\n // to work with 256-bit numbers, otherwise it gives 20% improvement for 256-bit\n // multiplication (like elliptic secp256k1).\n var comb10MulTo = function comb10MulTo (self, num, out) {\n var a = self.words;\n var b = num.words;\n var o = out.words;\n var c = 0;\n var lo;\n var mid;\n var hi;\n var a0 = a[0] | 0;\n var al0 = a0 & 0x1fff;\n var ah0 = a0 >>> 13;\n var a1 = a[1] | 0;\n var al1 = a1 & 0x1fff;\n var ah1 = a1 >>> 13;\n var a2 = a[2] | 0;\n var al2 = a2 & 0x1fff;\n var ah2 = a2 >>> 13;\n var a3 = a[3] | 0;\n var al3 = a3 & 0x1fff;\n var ah3 = a3 >>> 13;\n var a4 = a[4] | 0;\n var al4 = a4 & 0x1fff;\n var ah4 = a4 >>> 13;\n var a5 = a[5] | 0;\n var al5 = a5 & 0x1fff;\n var ah5 = a5 >>> 13;\n var a6 = a[6] | 0;\n var al6 = a6 & 0x1fff;\n var ah6 = a6 >>> 13;\n var a7 = a[7] | 0;\n var al7 = a7 & 0x1fff;\n var ah7 = a7 >>> 13;\n var a8 = a[8] | 0;\n var al8 = a8 & 0x1fff;\n var ah8 = a8 >>> 13;\n var a9 = a[9] | 0;\n var al9 = a9 & 0x1fff;\n var ah9 = a9 >>> 13;\n var b0 = b[0] | 0;\n var bl0 = b0 & 0x1fff;\n var bh0 = b0 >>> 13;\n var b1 = b[1] | 0;\n var bl1 = b1 & 0x1fff;\n var bh1 = b1 >>> 13;\n var b2 = b[2] | 0;\n var bl2 = b2 & 0x1fff;\n var bh2 = b2 >>> 13;\n var b3 = b[3] | 0;\n var bl3 = b3 & 0x1fff;\n var bh3 = b3 >>> 13;\n var b4 = b[4] | 0;\n var bl4 = b4 & 0x1fff;\n var bh4 = b4 >>> 13;\n var b5 = b[5] | 0;\n var bl5 = b5 & 0x1fff;\n var bh5 = b5 >>> 13;\n var b6 = b[6] | 0;\n var bl6 = b6 & 0x1fff;\n var bh6 = b6 >>> 13;\n var b7 = b[7] | 0;\n var bl7 = b7 & 0x1fff;\n var bh7 = b7 >>> 13;\n var b8 = b[8] | 0;\n var bl8 = b8 & 0x1fff;\n var bh8 = b8 >>> 13;\n var b9 = b[9] | 0;\n var bl9 = b9 & 0x1fff;\n var bh9 = b9 >>> 13;\n\n out.negative = self.negative ^ num.negative;\n out.length = 19;\n /* k = 0 */\n lo = Math.imul(al0, bl0);\n mid = Math.imul(al0, bh0);\n mid = (mid + Math.imul(ah0, bl0)) | 0;\n hi = Math.imul(ah0, bh0);\n var w0 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w0 >>> 26)) | 0;\n w0 &= 0x3ffffff;\n /* k = 1 */\n lo = Math.imul(al1, bl0);\n mid = Math.imul(al1, bh0);\n mid = (mid + Math.imul(ah1, bl0)) | 0;\n hi = Math.imul(ah1, bh0);\n lo = (lo + Math.imul(al0, bl1)) | 0;\n mid = (mid + Math.imul(al0, bh1)) | 0;\n mid = (mid + Math.imul(ah0, bl1)) | 0;\n hi = (hi + Math.imul(ah0, bh1)) | 0;\n var w1 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w1 >>> 26)) | 0;\n w1 &= 0x3ffffff;\n /* k = 2 */\n lo = Math.imul(al2, bl0);\n mid = Math.imul(al2, bh0);\n mid = (mid + Math.imul(ah2, bl0)) | 0;\n hi = Math.imul(ah2, bh0);\n lo = (lo + Math.imul(al1, bl1)) | 0;\n mid = (mid + Math.imul(al1, bh1)) | 0;\n mid = (mid + Math.imul(ah1, bl1)) | 0;\n hi = (hi + Math.imul(ah1, bh1)) | 0;\n lo = (lo + Math.imul(al0, bl2)) | 0;\n mid = (mid + Math.imul(al0, bh2)) | 0;\n mid = (mid + Math.imul(ah0, bl2)) | 0;\n hi = (hi + Math.imul(ah0, bh2)) | 0;\n var w2 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w2 >>> 26)) | 0;\n w2 &= 0x3ffffff;\n /* k = 3 */\n lo = Math.imul(al3, bl0);\n mid = Math.imul(al3, bh0);\n mid = (mid + Math.imul(ah3, bl0)) | 0;\n hi = Math.imul(ah3, bh0);\n lo = (lo + Math.imul(al2, bl1)) | 0;\n mid = (mid + Math.imul(al2, bh1)) | 0;\n mid = (mid + Math.imul(ah2, bl1)) | 0;\n hi = (hi + Math.imul(ah2, bh1)) | 0;\n lo = (lo + Math.imul(al1, bl2)) | 0;\n mid = (mid + Math.imul(al1, bh2)) | 0;\n mid = (mid + Math.imul(ah1, bl2)) | 0;\n hi = (hi + Math.imul(ah1, bh2)) | 0;\n lo = (lo + Math.imul(al0, bl3)) | 0;\n mid = (mid + Math.imul(al0, bh3)) | 0;\n mid = (mid + Math.imul(ah0, bl3)) | 0;\n hi = (hi + Math.imul(ah0, bh3)) | 0;\n var w3 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w3 >>> 26)) | 0;\n w3 &= 0x3ffffff;\n /* k = 4 */\n lo = Math.imul(al4, bl0);\n mid = Math.imul(al4, bh0);\n mid = (mid + Math.imul(ah4, bl0)) | 0;\n hi = Math.imul(ah4, bh0);\n lo = (lo + Math.imul(al3, bl1)) | 0;\n mid = (mid + Math.imul(al3, bh1)) | 0;\n mid = (mid + Math.imul(ah3, bl1)) | 0;\n hi = (hi + Math.imul(ah3, bh1)) | 0;\n lo = (lo + Math.imul(al2, bl2)) | 0;\n mid = (mid + Math.imul(al2, bh2)) | 0;\n mid = (mid + Math.imul(ah2, bl2)) | 0;\n hi = (hi + Math.imul(ah2, bh2)) | 0;\n lo = (lo + Math.imul(al1, bl3)) | 0;\n mid = (mid + Math.imul(al1, bh3)) | 0;\n mid = (mid + Math.imul(ah1, bl3)) | 0;\n hi = (hi + Math.imul(ah1, bh3)) | 0;\n lo = (lo + Math.imul(al0, bl4)) | 0;\n mid = (mid + Math.imul(al0, bh4)) | 0;\n mid = (mid + Math.imul(ah0, bl4)) | 0;\n hi = (hi + Math.imul(ah0, bh4)) | 0;\n var w4 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w4 >>> 26)) | 0;\n w4 &= 0x3ffffff;\n /* k = 5 */\n lo = Math.imul(al5, bl0);\n mid = Math.imul(al5, bh0);\n mid = (mid + Math.imul(ah5, bl0)) | 0;\n hi = Math.imul(ah5, bh0);\n lo = (lo + Math.imul(al4, bl1)) | 0;\n mid = (mid + Math.imul(al4, bh1)) | 0;\n mid = (mid + Math.imul(ah4, bl1)) | 0;\n hi = (hi + Math.imul(ah4, bh1)) | 0;\n lo = (lo + Math.imul(al3, bl2)) | 0;\n mid = (mid + Math.imul(al3, bh2)) | 0;\n mid = (mid + Math.imul(ah3, bl2)) | 0;\n hi = (hi + Math.imul(ah3, bh2)) | 0;\n lo = (lo + Math.imul(al2, bl3)) | 0;\n mid = (mid + Math.imul(al2, bh3)) | 0;\n mid = (mid + Math.imul(ah2, bl3)) | 0;\n hi = (hi + Math.imul(ah2, bh3)) | 0;\n lo = (lo + Math.imul(al1, bl4)) | 0;\n mid = (mid + Math.imul(al1, bh4)) | 0;\n mid = (mid + Math.imul(ah1, bl4)) | 0;\n hi = (hi + Math.imul(ah1, bh4)) | 0;\n lo = (lo + Math.imul(al0, bl5)) | 0;\n mid = (mid + Math.imul(al0, bh5)) | 0;\n mid = (mid + Math.imul(ah0, bl5)) | 0;\n hi = (hi + Math.imul(ah0, bh5)) | 0;\n var w5 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w5 >>> 26)) | 0;\n w5 &= 0x3ffffff;\n /* k = 6 */\n lo = Math.imul(al6, bl0);\n mid = Math.imul(al6, bh0);\n mid = (mid + Math.imul(ah6, bl0)) | 0;\n hi = Math.imul(ah6, bh0);\n lo = (lo + Math.imul(al5, bl1)) | 0;\n mid = (mid + Math.imul(al5, bh1)) | 0;\n mid = (mid + Math.imul(ah5, bl1)) | 0;\n hi = (hi + Math.imul(ah5, bh1)) | 0;\n lo = (lo + Math.imul(al4, bl2)) | 0;\n mid = (mid + Math.imul(al4, bh2)) | 0;\n mid = (mid + Math.imul(ah4, bl2)) | 0;\n hi = (hi + Math.imul(ah4, bh2)) | 0;\n lo = (lo + Math.imul(al3, bl3)) | 0;\n mid = (mid + Math.imul(al3, bh3)) | 0;\n mid = (mid + Math.imul(ah3, bl3)) | 0;\n hi = (hi + Math.imul(ah3, bh3)) | 0;\n lo = (lo + Math.imul(al2, bl4)) | 0;\n mid = (mid + Math.imul(al2, bh4)) | 0;\n mid = (mid + Math.imul(ah2, bl4)) | 0;\n hi = (hi + Math.imul(ah2, bh4)) | 0;\n lo = (lo + Math.imul(al1, bl5)) | 0;\n mid = (mid + Math.imul(al1, bh5)) | 0;\n mid = (mid + Math.imul(ah1, bl5)) | 0;\n hi = (hi + Math.imul(ah1, bh5)) | 0;\n lo = (lo + Math.imul(al0, bl6)) | 0;\n mid = (mid + Math.imul(al0, bh6)) | 0;\n mid = (mid + Math.imul(ah0, bl6)) | 0;\n hi = (hi + Math.imul(ah0, bh6)) | 0;\n var w6 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w6 >>> 26)) | 0;\n w6 &= 0x3ffffff;\n /* k = 7 */\n lo = Math.imul(al7, bl0);\n mid = Math.imul(al7, bh0);\n mid = (mid + Math.imul(ah7, bl0)) | 0;\n hi = Math.imul(ah7, bh0);\n lo = (lo + Math.imul(al6, bl1)) | 0;\n mid = (mid + Math.imul(al6, bh1)) | 0;\n mid = (mid + Math.imul(ah6, bl1)) | 0;\n hi = (hi + Math.imul(ah6, bh1)) | 0;\n lo = (lo + Math.imul(al5, bl2)) | 0;\n mid = (mid + Math.imul(al5, bh2)) | 0;\n mid = (mid + Math.imul(ah5, bl2)) | 0;\n hi = (hi + Math.imul(ah5, bh2)) | 0;\n lo = (lo + Math.imul(al4, bl3)) | 0;\n mid = (mid + Math.imul(al4, bh3)) | 0;\n mid = (mid + Math.imul(ah4, bl3)) | 0;\n hi = (hi + Math.imul(ah4, bh3)) | 0;\n lo = (lo + Math.imul(al3, bl4)) | 0;\n mid = (mid + Math.imul(al3, bh4)) | 0;\n mid = (mid + Math.imul(ah3, bl4)) | 0;\n hi = (hi + Math.imul(ah3, bh4)) | 0;\n lo = (lo + Math.imul(al2, bl5)) | 0;\n mid = (mid + Math.imul(al2, bh5)) | 0;\n mid = (mid + Math.imul(ah2, bl5)) | 0;\n hi = (hi + Math.imul(ah2, bh5)) | 0;\n lo = (lo + Math.imul(al1, bl6)) | 0;\n mid = (mid + Math.imul(al1, bh6)) | 0;\n mid = (mid + Math.imul(ah1, bl6)) | 0;\n hi = (hi + Math.imul(ah1, bh6)) | 0;\n lo = (lo + Math.imul(al0, bl7)) | 0;\n mid = (mid + Math.imul(al0, bh7)) | 0;\n mid = (mid + Math.imul(ah0, bl7)) | 0;\n hi = (hi + Math.imul(ah0, bh7)) | 0;\n var w7 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w7 >>> 26)) | 0;\n w7 &= 0x3ffffff;\n /* k = 8 */\n lo = Math.imul(al8, bl0);\n mid = Math.imul(al8, bh0);\n mid = (mid + Math.imul(ah8, bl0)) | 0;\n hi = Math.imul(ah8, bh0);\n lo = (lo + Math.imul(al7, bl1)) | 0;\n mid = (mid + Math.imul(al7, bh1)) | 0;\n mid = (mid + Math.imul(ah7, bl1)) | 0;\n hi = (hi + Math.imul(ah7, bh1)) | 0;\n lo = (lo + Math.imul(al6, bl2)) | 0;\n mid = (mid + Math.imul(al6, bh2)) | 0;\n mid = (mid + Math.imul(ah6, bl2)) | 0;\n hi = (hi + Math.imul(ah6, bh2)) | 0;\n lo = (lo + Math.imul(al5, bl3)) | 0;\n mid = (mid + Math.imul(al5, bh3)) | 0;\n mid = (mid + Math.imul(ah5, bl3)) | 0;\n hi = (hi + Math.imul(ah5, bh3)) | 0;\n lo = (lo + Math.imul(al4, bl4)) | 0;\n mid = (mid + Math.imul(al4, bh4)) | 0;\n mid = (mid + Math.imul(ah4, bl4)) | 0;\n hi = (hi + Math.imul(ah4, bh4)) | 0;\n lo = (lo + Math.imul(al3, bl5)) | 0;\n mid = (mid + Math.imul(al3, bh5)) | 0;\n mid = (mid + Math.imul(ah3, bl5)) | 0;\n hi = (hi + Math.imul(ah3, bh5)) | 0;\n lo = (lo + Math.imul(al2, bl6)) | 0;\n mid = (mid + Math.imul(al2, bh6)) | 0;\n mid = (mid + Math.imul(ah2, bl6)) | 0;\n hi = (hi + Math.imul(ah2, bh6)) | 0;\n lo = (lo + Math.imul(al1, bl7)) | 0;\n mid = (mid + Math.imul(al1, bh7)) | 0;\n mid = (mid + Math.imul(ah1, bl7)) | 0;\n hi = (hi + Math.imul(ah1, bh7)) | 0;\n lo = (lo + Math.imul(al0, bl8)) | 0;\n mid = (mid + Math.imul(al0, bh8)) | 0;\n mid = (mid + Math.imul(ah0, bl8)) | 0;\n hi = (hi + Math.imul(ah0, bh8)) | 0;\n var w8 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w8 >>> 26)) | 0;\n w8 &= 0x3ffffff;\n /* k = 9 */\n lo = Math.imul(al9, bl0);\n mid = Math.imul(al9, bh0);\n mid = (mid + Math.imul(ah9, bl0)) | 0;\n hi = Math.imul(ah9, bh0);\n lo = (lo + Math.imul(al8, bl1)) | 0;\n mid = (mid + Math.imul(al8, bh1)) | 0;\n mid = (mid + Math.imul(ah8, bl1)) | 0;\n hi = (hi + Math.imul(ah8, bh1)) | 0;\n lo = (lo + Math.imul(al7, bl2)) | 0;\n mid = (mid + Math.imul(al7, bh2)) | 0;\n mid = (mid + Math.imul(ah7, bl2)) | 0;\n hi = (hi + Math.imul(ah7, bh2)) | 0;\n lo = (lo + Math.imul(al6, bl3)) | 0;\n mid = (mid + Math.imul(al6, bh3)) | 0;\n mid = (mid + Math.imul(ah6, bl3)) | 0;\n hi = (hi + Math.imul(ah6, bh3)) | 0;\n lo = (lo + Math.imul(al5, bl4)) | 0;\n mid = (mid + Math.imul(al5, bh4)) | 0;\n mid = (mid + Math.imul(ah5, bl4)) | 0;\n hi = (hi + Math.imul(ah5, bh4)) | 0;\n lo = (lo + Math.imul(al4, bl5)) | 0;\n mid = (mid + Math.imul(al4, bh5)) | 0;\n mid = (mid + Math.imul(ah4, bl5)) | 0;\n hi = (hi + Math.imul(ah4, bh5)) | 0;\n lo = (lo + Math.imul(al3, bl6)) | 0;\n mid = (mid + Math.imul(al3, bh6)) | 0;\n mid = (mid + Math.imul(ah3, bl6)) | 0;\n hi = (hi + Math.imul(ah3, bh6)) | 0;\n lo = (lo + Math.imul(al2, bl7)) | 0;\n mid = (mid + Math.imul(al2, bh7)) | 0;\n mid = (mid + Math.imul(ah2, bl7)) | 0;\n hi = (hi + Math.imul(ah2, bh7)) | 0;\n lo = (lo + Math.imul(al1, bl8)) | 0;\n mid = (mid + Math.imul(al1, bh8)) | 0;\n mid = (mid + Math.imul(ah1, bl8)) | 0;\n hi = (hi + Math.imul(ah1, bh8)) | 0;\n lo = (lo + Math.imul(al0, bl9)) | 0;\n mid = (mid + Math.imul(al0, bh9)) | 0;\n mid = (mid + Math.imul(ah0, bl9)) | 0;\n hi = (hi + Math.imul(ah0, bh9)) | 0;\n var w9 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w9 >>> 26)) | 0;\n w9 &= 0x3ffffff;\n /* k = 10 */\n lo = Math.imul(al9, bl1);\n mid = Math.imul(al9, bh1);\n mid = (mid + Math.imul(ah9, bl1)) | 0;\n hi = Math.imul(ah9, bh1);\n lo = (lo + Math.imul(al8, bl2)) | 0;\n mid = (mid + Math.imul(al8, bh2)) | 0;\n mid = (mid + Math.imul(ah8, bl2)) | 0;\n hi = (hi + Math.imul(ah8, bh2)) | 0;\n lo = (lo + Math.imul(al7, bl3)) | 0;\n mid = (mid + Math.imul(al7, bh3)) | 0;\n mid = (mid + Math.imul(ah7, bl3)) | 0;\n hi = (hi + Math.imul(ah7, bh3)) | 0;\n lo = (lo + Math.imul(al6, bl4)) | 0;\n mid = (mid + Math.imul(al6, bh4)) | 0;\n mid = (mid + Math.imul(ah6, bl4)) | 0;\n hi = (hi + Math.imul(ah6, bh4)) | 0;\n lo = (lo + Math.imul(al5, bl5)) | 0;\n mid = (mid + Math.imul(al5, bh5)) | 0;\n mid = (mid + Math.imul(ah5, bl5)) | 0;\n hi = (hi + Math.imul(ah5, bh5)) | 0;\n lo = (lo + Math.imul(al4, bl6)) | 0;\n mid = (mid + Math.imul(al4, bh6)) | 0;\n mid = (mid + Math.imul(ah4, bl6)) | 0;\n hi = (hi + Math.imul(ah4, bh6)) | 0;\n lo = (lo + Math.imul(al3, bl7)) | 0;\n mid = (mid + Math.imul(al3, bh7)) | 0;\n mid = (mid + Math.imul(ah3, bl7)) | 0;\n hi = (hi + Math.imul(ah3, bh7)) | 0;\n lo = (lo + Math.imul(al2, bl8)) | 0;\n mid = (mid + Math.imul(al2, bh8)) | 0;\n mid = (mid + Math.imul(ah2, bl8)) | 0;\n hi = (hi + Math.imul(ah2, bh8)) | 0;\n lo = (lo + Math.imul(al1, bl9)) | 0;\n mid = (mid + Math.imul(al1, bh9)) | 0;\n mid = (mid + Math.imul(ah1, bl9)) | 0;\n hi = (hi + Math.imul(ah1, bh9)) | 0;\n var w10 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w10 >>> 26)) | 0;\n w10 &= 0x3ffffff;\n /* k = 11 */\n lo = Math.imul(al9, bl2);\n mid = Math.imul(al9, bh2);\n mid = (mid + Math.imul(ah9, bl2)) | 0;\n hi = Math.imul(ah9, bh2);\n lo = (lo + Math.imul(al8, bl3)) | 0;\n mid = (mid + Math.imul(al8, bh3)) | 0;\n mid = (mid + Math.imul(ah8, bl3)) | 0;\n hi = (hi + Math.imul(ah8, bh3)) | 0;\n lo = (lo + Math.imul(al7, bl4)) | 0;\n mid = (mid + Math.imul(al7, bh4)) | 0;\n mid = (mid + Math.imul(ah7, bl4)) | 0;\n hi = (hi + Math.imul(ah7, bh4)) | 0;\n lo = (lo + Math.imul(al6, bl5)) | 0;\n mid = (mid + Math.imul(al6, bh5)) | 0;\n mid = (mid + Math.imul(ah6, bl5)) | 0;\n hi = (hi + Math.imul(ah6, bh5)) | 0;\n lo = (lo + Math.imul(al5, bl6)) | 0;\n mid = (mid + Math.imul(al5, bh6)) | 0;\n mid = (mid + Math.imul(ah5, bl6)) | 0;\n hi = (hi + Math.imul(ah5, bh6)) | 0;\n lo = (lo + Math.imul(al4, bl7)) | 0;\n mid = (mid + Math.imul(al4, bh7)) | 0;\n mid = (mid + Math.imul(ah4, bl7)) | 0;\n hi = (hi + Math.imul(ah4, bh7)) | 0;\n lo = (lo + Math.imul(al3, bl8)) | 0;\n mid = (mid + Math.imul(al3, bh8)) | 0;\n mid = (mid + Math.imul(ah3, bl8)) | 0;\n hi = (hi + Math.imul(ah3, bh8)) | 0;\n lo = (lo + Math.imul(al2, bl9)) | 0;\n mid = (mid + Math.imul(al2, bh9)) | 0;\n mid = (mid + Math.imul(ah2, bl9)) | 0;\n hi = (hi + Math.imul(ah2, bh9)) | 0;\n var w11 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w11 >>> 26)) | 0;\n w11 &= 0x3ffffff;\n /* k = 12 */\n lo = Math.imul(al9, bl3);\n mid = Math.imul(al9, bh3);\n mid = (mid + Math.imul(ah9, bl3)) | 0;\n hi = Math.imul(ah9, bh3);\n lo = (lo + Math.imul(al8, bl4)) | 0;\n mid = (mid + Math.imul(al8, bh4)) | 0;\n mid = (mid + Math.imul(ah8, bl4)) | 0;\n hi = (hi + Math.imul(ah8, bh4)) | 0;\n lo = (lo + Math.imul(al7, bl5)) | 0;\n mid = (mid + Math.imul(al7, bh5)) | 0;\n mid = (mid + Math.imul(ah7, bl5)) | 0;\n hi = (hi + Math.imul(ah7, bh5)) | 0;\n lo = (lo + Math.imul(al6, bl6)) | 0;\n mid = (mid + Math.imul(al6, bh6)) | 0;\n mid = (mid + Math.imul(ah6, bl6)) | 0;\n hi = (hi + Math.imul(ah6, bh6)) | 0;\n lo = (lo + Math.imul(al5, bl7)) | 0;\n mid = (mid + Math.imul(al5, bh7)) | 0;\n mid = (mid + Math.imul(ah5, bl7)) | 0;\n hi = (hi + Math.imul(ah5, bh7)) | 0;\n lo = (lo + Math.imul(al4, bl8)) | 0;\n mid = (mid + Math.imul(al4, bh8)) | 0;\n mid = (mid + Math.imul(ah4, bl8)) | 0;\n hi = (hi + Math.imul(ah4, bh8)) | 0;\n lo = (lo + Math.imul(al3, bl9)) | 0;\n mid = (mid + Math.imul(al3, bh9)) | 0;\n mid = (mid + Math.imul(ah3, bl9)) | 0;\n hi = (hi + Math.imul(ah3, bh9)) | 0;\n var w12 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w12 >>> 26)) | 0;\n w12 &= 0x3ffffff;\n /* k = 13 */\n lo = Math.imul(al9, bl4);\n mid = Math.imul(al9, bh4);\n mid = (mid + Math.imul(ah9, bl4)) | 0;\n hi = Math.imul(ah9, bh4);\n lo = (lo + Math.imul(al8, bl5)) | 0;\n mid = (mid + Math.imul(al8, bh5)) | 0;\n mid = (mid + Math.imul(ah8, bl5)) | 0;\n hi = (hi + Math.imul(ah8, bh5)) | 0;\n lo = (lo + Math.imul(al7, bl6)) | 0;\n mid = (mid + Math.imul(al7, bh6)) | 0;\n mid = (mid + Math.imul(ah7, bl6)) | 0;\n hi = (hi + Math.imul(ah7, bh6)) | 0;\n lo = (lo + Math.imul(al6, bl7)) | 0;\n mid = (mid + Math.imul(al6, bh7)) | 0;\n mid = (mid + Math.imul(ah6, bl7)) | 0;\n hi = (hi + Math.imul(ah6, bh7)) | 0;\n lo = (lo + Math.imul(al5, bl8)) | 0;\n mid = (mid + Math.imul(al5, bh8)) | 0;\n mid = (mid + Math.imul(ah5, bl8)) | 0;\n hi = (hi + Math.imul(ah5, bh8)) | 0;\n lo = (lo + Math.imul(al4, bl9)) | 0;\n mid = (mid + Math.imul(al4, bh9)) | 0;\n mid = (mid + Math.imul(ah4, bl9)) | 0;\n hi = (hi + Math.imul(ah4, bh9)) | 0;\n var w13 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w13 >>> 26)) | 0;\n w13 &= 0x3ffffff;\n /* k = 14 */\n lo = Math.imul(al9, bl5);\n mid = Math.imul(al9, bh5);\n mid = (mid + Math.imul(ah9, bl5)) | 0;\n hi = Math.imul(ah9, bh5);\n lo = (lo + Math.imul(al8, bl6)) | 0;\n mid = (mid + Math.imul(al8, bh6)) | 0;\n mid = (mid + Math.imul(ah8, bl6)) | 0;\n hi = (hi + Math.imul(ah8, bh6)) | 0;\n lo = (lo + Math.imul(al7, bl7)) | 0;\n mid = (mid + Math.imul(al7, bh7)) | 0;\n mid = (mid + Math.imul(ah7, bl7)) | 0;\n hi = (hi + Math.imul(ah7, bh7)) | 0;\n lo = (lo + Math.imul(al6, bl8)) | 0;\n mid = (mid + Math.imul(al6, bh8)) | 0;\n mid = (mid + Math.imul(ah6, bl8)) | 0;\n hi = (hi + Math.imul(ah6, bh8)) | 0;\n lo = (lo + Math.imul(al5, bl9)) | 0;\n mid = (mid + Math.imul(al5, bh9)) | 0;\n mid = (mid + Math.imul(ah5, bl9)) | 0;\n hi = (hi + Math.imul(ah5, bh9)) | 0;\n var w14 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w14 >>> 26)) | 0;\n w14 &= 0x3ffffff;\n /* k = 15 */\n lo = Math.imul(al9, bl6);\n mid = Math.imul(al9, bh6);\n mid = (mid + Math.imul(ah9, bl6)) | 0;\n hi = Math.imul(ah9, bh6);\n lo = (lo + Math.imul(al8, bl7)) | 0;\n mid = (mid + Math.imul(al8, bh7)) | 0;\n mid = (mid + Math.imul(ah8, bl7)) | 0;\n hi = (hi + Math.imul(ah8, bh7)) | 0;\n lo = (lo + Math.imul(al7, bl8)) | 0;\n mid = (mid + Math.imul(al7, bh8)) | 0;\n mid = (mid + Math.imul(ah7, bl8)) | 0;\n hi = (hi + Math.imul(ah7, bh8)) | 0;\n lo = (lo + Math.imul(al6, bl9)) | 0;\n mid = (mid + Math.imul(al6, bh9)) | 0;\n mid = (mid + Math.imul(ah6, bl9)) | 0;\n hi = (hi + Math.imul(ah6, bh9)) | 0;\n var w15 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w15 >>> 26)) | 0;\n w15 &= 0x3ffffff;\n /* k = 16 */\n lo = Math.imul(al9, bl7);\n mid = Math.imul(al9, bh7);\n mid = (mid + Math.imul(ah9, bl7)) | 0;\n hi = Math.imul(ah9, bh7);\n lo = (lo + Math.imul(al8, bl8)) | 0;\n mid = (mid + Math.imul(al8, bh8)) | 0;\n mid = (mid + Math.imul(ah8, bl8)) | 0;\n hi = (hi + Math.imul(ah8, bh8)) | 0;\n lo = (lo + Math.imul(al7, bl9)) | 0;\n mid = (mid + Math.imul(al7, bh9)) | 0;\n mid = (mid + Math.imul(ah7, bl9)) | 0;\n hi = (hi + Math.imul(ah7, bh9)) | 0;\n var w16 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w16 >>> 26)) | 0;\n w16 &= 0x3ffffff;\n /* k = 17 */\n lo = Math.imul(al9, bl8);\n mid = Math.imul(al9, bh8);\n mid = (mid + Math.imul(ah9, bl8)) | 0;\n hi = Math.imul(ah9, bh8);\n lo = (lo + Math.imul(al8, bl9)) | 0;\n mid = (mid + Math.imul(al8, bh9)) | 0;\n mid = (mid + Math.imul(ah8, bl9)) | 0;\n hi = (hi + Math.imul(ah8, bh9)) | 0;\n var w17 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w17 >>> 26)) | 0;\n w17 &= 0x3ffffff;\n /* k = 18 */\n lo = Math.imul(al9, bl9);\n mid = Math.imul(al9, bh9);\n mid = (mid + Math.imul(ah9, bl9)) | 0;\n hi = Math.imul(ah9, bh9);\n var w18 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w18 >>> 26)) | 0;\n w18 &= 0x3ffffff;\n o[0] = w0;\n o[1] = w1;\n o[2] = w2;\n o[3] = w3;\n o[4] = w4;\n o[5] = w5;\n o[6] = w6;\n o[7] = w7;\n o[8] = w8;\n o[9] = w9;\n o[10] = w10;\n o[11] = w11;\n o[12] = w12;\n o[13] = w13;\n o[14] = w14;\n o[15] = w15;\n o[16] = w16;\n o[17] = w17;\n o[18] = w18;\n if (c !== 0) {\n o[19] = c;\n out.length++;\n }\n return out;\n };\n\n // Polyfill comb\n if (!Math.imul) {\n comb10MulTo = smallMulTo;\n }\n\n function bigMulTo (self, num, out) {\n out.negative = num.negative ^ self.negative;\n out.length = self.length + num.length;\n\n var carry = 0;\n var hncarry = 0;\n for (var k = 0; k < out.length - 1; k++) {\n // Sum all words with the same `i + j = k` and accumulate `ncarry`,\n // note that ncarry could be >= 0x3ffffff\n var ncarry = hncarry;\n hncarry = 0;\n var rword = carry & 0x3ffffff;\n var maxJ = Math.min(k, num.length - 1);\n for (var j = Math.max(0, k - self.length + 1); j <= maxJ; j++) {\n var i = k - j;\n var a = self.words[i] | 0;\n var b = num.words[j] | 0;\n var r = a * b;\n\n var lo = r & 0x3ffffff;\n ncarry = (ncarry + ((r / 0x4000000) | 0)) | 0;\n lo = (lo + rword) | 0;\n rword = lo & 0x3ffffff;\n ncarry = (ncarry + (lo >>> 26)) | 0;\n\n hncarry += ncarry >>> 26;\n ncarry &= 0x3ffffff;\n }\n out.words[k] = rword;\n carry = ncarry;\n ncarry = hncarry;\n }\n if (carry !== 0) {\n out.words[k] = carry;\n } else {\n out.length--;\n }\n\n return out._strip();\n }\n\n function jumboMulTo (self, num, out) {\n // Temporary disable, see https://github.com/indutny/bn.js/issues/211\n // var fftm = new FFTM();\n // return fftm.mulp(self, num, out);\n return bigMulTo(self, num, out);\n }\n\n BN.prototype.mulTo = function mulTo (num, out) {\n var res;\n var len = this.length + num.length;\n if (this.length === 10 && num.length === 10) {\n res = comb10MulTo(this, num, out);\n } else if (len < 63) {\n res = smallMulTo(this, num, out);\n } else if (len < 1024) {\n res = bigMulTo(this, num, out);\n } else {\n res = jumboMulTo(this, num, out);\n }\n\n return res;\n };\n\n // Cooley-Tukey algorithm for FFT\n // slightly revisited to rely on looping instead of recursion\n\n function FFTM (x, y) {\n this.x = x;\n this.y = y;\n }\n\n FFTM.prototype.makeRBT = function makeRBT (N) {\n var t = new Array(N);\n var l = BN.prototype._countBits(N) - 1;\n for (var i = 0; i < N; i++) {\n t[i] = this.revBin(i, l, N);\n }\n\n return t;\n };\n\n // Returns binary-reversed representation of `x`\n FFTM.prototype.revBin = function revBin (x, l, N) {\n if (x === 0 || x === N - 1) return x;\n\n var rb = 0;\n for (var i = 0; i < l; i++) {\n rb |= (x & 1) << (l - i - 1);\n x >>= 1;\n }\n\n return rb;\n };\n\n // Performs \"tweedling\" phase, therefore 'emulating'\n // behaviour of the recursive algorithm\n FFTM.prototype.permute = function permute (rbt, rws, iws, rtws, itws, N) {\n for (var i = 0; i < N; i++) {\n rtws[i] = rws[rbt[i]];\n itws[i] = iws[rbt[i]];\n }\n };\n\n FFTM.prototype.transform = function transform (rws, iws, rtws, itws, N, rbt) {\n this.permute(rbt, rws, iws, rtws, itws, N);\n\n for (var s = 1; s < N; s <<= 1) {\n var l = s << 1;\n\n var rtwdf = Math.cos(2 * Math.PI / l);\n var itwdf = Math.sin(2 * Math.PI / l);\n\n for (var p = 0; p < N; p += l) {\n var rtwdf_ = rtwdf;\n var itwdf_ = itwdf;\n\n for (var j = 0; j < s; j++) {\n var re = rtws[p + j];\n var ie = itws[p + j];\n\n var ro = rtws[p + j + s];\n var io = itws[p + j + s];\n\n var rx = rtwdf_ * ro - itwdf_ * io;\n\n io = rtwdf_ * io + itwdf_ * ro;\n ro = rx;\n\n rtws[p + j] = re + ro;\n itws[p + j] = ie + io;\n\n rtws[p + j + s] = re - ro;\n itws[p + j + s] = ie - io;\n\n /* jshint maxdepth : false */\n if (j !== l) {\n rx = rtwdf * rtwdf_ - itwdf * itwdf_;\n\n itwdf_ = rtwdf * itwdf_ + itwdf * rtwdf_;\n rtwdf_ = rx;\n }\n }\n }\n }\n };\n\n FFTM.prototype.guessLen13b = function guessLen13b (n, m) {\n var N = Math.max(m, n) | 1;\n var odd = N & 1;\n var i = 0;\n for (N = N / 2 | 0; N; N = N >>> 1) {\n i++;\n }\n\n return 1 << i + 1 + odd;\n };\n\n FFTM.prototype.conjugate = function conjugate (rws, iws, N) {\n if (N <= 1) return;\n\n for (var i = 0; i < N / 2; i++) {\n var t = rws[i];\n\n rws[i] = rws[N - i - 1];\n rws[N - i - 1] = t;\n\n t = iws[i];\n\n iws[i] = -iws[N - i - 1];\n iws[N - i - 1] = -t;\n }\n };\n\n FFTM.prototype.normalize13b = function normalize13b (ws, N) {\n var carry = 0;\n for (var i = 0; i < N / 2; i++) {\n var w = Math.round(ws[2 * i + 1] / N) * 0x2000 +\n Math.round(ws[2 * i] / N) +\n carry;\n\n ws[i] = w & 0x3ffffff;\n\n if (w < 0x4000000) {\n carry = 0;\n } else {\n carry = w / 0x4000000 | 0;\n }\n }\n\n return ws;\n };\n\n FFTM.prototype.convert13b = function convert13b (ws, len, rws, N) {\n var carry = 0;\n for (var i = 0; i < len; i++) {\n carry = carry + (ws[i] | 0);\n\n rws[2 * i] = carry & 0x1fff; carry = carry >>> 13;\n rws[2 * i + 1] = carry & 0x1fff; carry = carry >>> 13;\n }\n\n // Pad with zeroes\n for (i = 2 * len; i < N; ++i) {\n rws[i] = 0;\n }\n\n assert(carry === 0);\n assert((carry & ~0x1fff) === 0);\n };\n\n FFTM.prototype.stub = function stub (N) {\n var ph = new Array(N);\n for (var i = 0; i < N; i++) {\n ph[i] = 0;\n }\n\n return ph;\n };\n\n FFTM.prototype.mulp = function mulp (x, y, out) {\n var N = 2 * this.guessLen13b(x.length, y.length);\n\n var rbt = this.makeRBT(N);\n\n var _ = this.stub(N);\n\n var rws = new Array(N);\n var rwst = new Array(N);\n var iwst = new Array(N);\n\n var nrws = new Array(N);\n var nrwst = new Array(N);\n var niwst = new Array(N);\n\n var rmws = out.words;\n rmws.length = N;\n\n this.convert13b(x.words, x.length, rws, N);\n this.convert13b(y.words, y.length, nrws, N);\n\n this.transform(rws, _, rwst, iwst, N, rbt);\n this.transform(nrws, _, nrwst, niwst, N, rbt);\n\n for (var i = 0; i < N; i++) {\n var rx = rwst[i] * nrwst[i] - iwst[i] * niwst[i];\n iwst[i] = rwst[i] * niwst[i] + iwst[i] * nrwst[i];\n rwst[i] = rx;\n }\n\n this.conjugate(rwst, iwst, N);\n this.transform(rwst, iwst, rmws, _, N, rbt);\n this.conjugate(rmws, _, N);\n this.normalize13b(rmws, N);\n\n out.negative = x.negative ^ y.negative;\n out.length = x.length + y.length;\n return out._strip();\n };\n\n // Multiply `this` by `num`\n BN.prototype.mul = function mul (num) {\n var out = new BN(null);\n out.words = new Array(this.length + num.length);\n return this.mulTo(num, out);\n };\n\n // Multiply employing FFT\n BN.prototype.mulf = function mulf (num) {\n var out = new BN(null);\n out.words = new Array(this.length + num.length);\n return jumboMulTo(this, num, out);\n };\n\n // In-place Multiplication\n BN.prototype.imul = function imul (num) {\n return this.clone().mulTo(num, this);\n };\n\n BN.prototype.imuln = function imuln (num) {\n var isNegNum = num < 0;\n if (isNegNum) num = -num;\n\n assert(typeof num === 'number');\n assert(num < 0x4000000);\n\n // Carry\n var carry = 0;\n for (var i = 0; i < this.length; i++) {\n var w = (this.words[i] | 0) * num;\n var lo = (w & 0x3ffffff) + (carry & 0x3ffffff);\n carry >>= 26;\n carry += (w / 0x4000000) | 0;\n // NOTE: lo is 27bit maximum\n carry += lo >>> 26;\n this.words[i] = lo & 0x3ffffff;\n }\n\n if (carry !== 0) {\n this.words[i] = carry;\n this.length++;\n }\n this.length = num === 0 ? 1 : this.length;\n\n return isNegNum ? this.ineg() : this;\n };\n\n BN.prototype.muln = function muln (num) {\n return this.clone().imuln(num);\n };\n\n // `this` * `this`\n BN.prototype.sqr = function sqr () {\n return this.mul(this);\n };\n\n // `this` * `this` in-place\n BN.prototype.isqr = function isqr () {\n return this.imul(this.clone());\n };\n\n // Math.pow(`this`, `num`)\n BN.prototype.pow = function pow (num) {\n var w = toBitArray(num);\n if (w.length === 0) return new BN(1);\n\n // Skip leading zeroes\n var res = this;\n for (var i = 0; i < w.length; i++, res = res.sqr()) {\n if (w[i] !== 0) break;\n }\n\n if (++i < w.length) {\n for (var q = res.sqr(); i < w.length; i++, q = q.sqr()) {\n if (w[i] === 0) continue;\n\n res = res.mul(q);\n }\n }\n\n return res;\n };\n\n // Shift-left in-place\n BN.prototype.iushln = function iushln (bits) {\n assert(typeof bits === 'number' && bits >= 0);\n var r = bits % 26;\n var s = (bits - r) / 26;\n var carryMask = (0x3ffffff >>> (26 - r)) << (26 - r);\n var i;\n\n if (r !== 0) {\n var carry = 0;\n\n for (i = 0; i < this.length; i++) {\n var newCarry = this.words[i] & carryMask;\n var c = ((this.words[i] | 0) - newCarry) << r;\n this.words[i] = c | carry;\n carry = newCarry >>> (26 - r);\n }\n\n if (carry) {\n this.words[i] = carry;\n this.length++;\n }\n }\n\n if (s !== 0) {\n for (i = this.length - 1; i >= 0; i--) {\n this.words[i + s] = this.words[i];\n }\n\n for (i = 0; i < s; i++) {\n this.words[i] = 0;\n }\n\n this.length += s;\n }\n\n return this._strip();\n };\n\n BN.prototype.ishln = function ishln (bits) {\n // TODO(indutny): implement me\n assert(this.negative === 0);\n return this.iushln(bits);\n };\n\n // Shift-right in-place\n // NOTE: `hint` is a lowest bit before trailing zeroes\n // NOTE: if `extended` is present - it will be filled with destroyed bits\n BN.prototype.iushrn = function iushrn (bits, hint, extended) {\n assert(typeof bits === 'number' && bits >= 0);\n var h;\n if (hint) {\n h = (hint - (hint % 26)) / 26;\n } else {\n h = 0;\n }\n\n var r = bits % 26;\n var s = Math.min((bits - r) / 26, this.length);\n var mask = 0x3ffffff ^ ((0x3ffffff >>> r) << r);\n var maskedWords = extended;\n\n h -= s;\n h = Math.max(0, h);\n\n // Extended mode, copy masked part\n if (maskedWords) {\n for (var i = 0; i < s; i++) {\n maskedWords.words[i] = this.words[i];\n }\n maskedWords.length = s;\n }\n\n if (s === 0) {\n // No-op, we should not move anything at all\n } else if (this.length > s) {\n this.length -= s;\n for (i = 0; i < this.length; i++) {\n this.words[i] = this.words[i + s];\n }\n } else {\n this.words[0] = 0;\n this.length = 1;\n }\n\n var carry = 0;\n for (i = this.length - 1; i >= 0 && (carry !== 0 || i >= h); i--) {\n var word = this.words[i] | 0;\n this.words[i] = (carry << (26 - r)) | (word >>> r);\n carry = word & mask;\n }\n\n // Push carried bits as a mask\n if (maskedWords && carry !== 0) {\n maskedWords.words[maskedWords.length++] = carry;\n }\n\n if (this.length === 0) {\n this.words[0] = 0;\n this.length = 1;\n }\n\n return this._strip();\n };\n\n BN.prototype.ishrn = function ishrn (bits, hint, extended) {\n // TODO(indutny): implement me\n assert(this.negative === 0);\n return this.iushrn(bits, hint, extended);\n };\n\n // Shift-left\n BN.prototype.shln = function shln (bits) {\n return this.clone().ishln(bits);\n };\n\n BN.prototype.ushln = function ushln (bits) {\n return this.clone().iushln(bits);\n };\n\n // Shift-right\n BN.prototype.shrn = function shrn (bits) {\n return this.clone().ishrn(bits);\n };\n\n BN.prototype.ushrn = function ushrn (bits) {\n return this.clone().iushrn(bits);\n };\n\n // Test if n bit is set\n BN.prototype.testn = function testn (bit) {\n assert(typeof bit === 'number' && bit >= 0);\n var r = bit % 26;\n var s = (bit - r) / 26;\n var q = 1 << r;\n\n // Fast case: bit is much higher than all existing words\n if (this.length <= s) return false;\n\n // Check bit and return\n var w = this.words[s];\n\n return !!(w & q);\n };\n\n // Return only lowers bits of number (in-place)\n BN.prototype.imaskn = function imaskn (bits) {\n assert(typeof bits === 'number' && bits >= 0);\n var r = bits % 26;\n var s = (bits - r) / 26;\n\n assert(this.negative === 0, 'imaskn works only with positive numbers');\n\n if (this.length <= s) {\n return this;\n }\n\n if (r !== 0) {\n s++;\n }\n this.length = Math.min(s, this.length);\n\n if (r !== 0) {\n var mask = 0x3ffffff ^ ((0x3ffffff >>> r) << r);\n this.words[this.length - 1] &= mask;\n }\n\n return this._strip();\n };\n\n // Return only lowers bits of number\n BN.prototype.maskn = function maskn (bits) {\n return this.clone().imaskn(bits);\n };\n\n // Add plain number `num` to `this`\n BN.prototype.iaddn = function iaddn (num) {\n assert(typeof num === 'number');\n assert(num < 0x4000000);\n if (num < 0) return this.isubn(-num);\n\n // Possible sign change\n if (this.negative !== 0) {\n if (this.length === 1 && (this.words[0] | 0) <= num) {\n this.words[0] = num - (this.words[0] | 0);\n this.negative = 0;\n return this;\n }\n\n this.negative = 0;\n this.isubn(num);\n this.negative = 1;\n return this;\n }\n\n // Add without checks\n return this._iaddn(num);\n };\n\n BN.prototype._iaddn = function _iaddn (num) {\n this.words[0] += num;\n\n // Carry\n for (var i = 0; i < this.length && this.words[i] >= 0x4000000; i++) {\n this.words[i] -= 0x4000000;\n if (i === this.length - 1) {\n this.words[i + 1] = 1;\n } else {\n this.words[i + 1]++;\n }\n }\n this.length = Math.max(this.length, i + 1);\n\n return this;\n };\n\n // Subtract plain number `num` from `this`\n BN.prototype.isubn = function isubn (num) {\n assert(typeof num === 'number');\n assert(num < 0x4000000);\n if (num < 0) return this.iaddn(-num);\n\n if (this.negative !== 0) {\n this.negative = 0;\n this.iaddn(num);\n this.negative = 1;\n return this;\n }\n\n this.words[0] -= num;\n\n if (this.length === 1 && this.words[0] < 0) {\n this.words[0] = -this.words[0];\n this.negative = 1;\n } else {\n // Carry\n for (var i = 0; i < this.length && this.words[i] < 0; i++) {\n this.words[i] += 0x4000000;\n this.words[i + 1] -= 1;\n }\n }\n\n return this._strip();\n };\n\n BN.prototype.addn = function addn (num) {\n return this.clone().iaddn(num);\n };\n\n BN.prototype.subn = function subn (num) {\n return this.clone().isubn(num);\n };\n\n BN.prototype.iabs = function iabs () {\n this.negative = 0;\n\n return this;\n };\n\n BN.prototype.abs = function abs () {\n return this.clone().iabs();\n };\n\n BN.prototype._ishlnsubmul = function _ishlnsubmul (num, mul, shift) {\n var len = num.length + shift;\n var i;\n\n this._expand(len);\n\n var w;\n var carry = 0;\n for (i = 0; i < num.length; i++) {\n w = (this.words[i + shift] | 0) + carry;\n var right = (num.words[i] | 0) * mul;\n w -= right & 0x3ffffff;\n carry = (w >> 26) - ((right / 0x4000000) | 0);\n this.words[i + shift] = w & 0x3ffffff;\n }\n for (; i < this.length - shift; i++) {\n w = (this.words[i + shift] | 0) + carry;\n carry = w >> 26;\n this.words[i + shift] = w & 0x3ffffff;\n }\n\n if (carry === 0) return this._strip();\n\n // Subtraction overflow\n assert(carry === -1);\n carry = 0;\n for (i = 0; i < this.length; i++) {\n w = -(this.words[i] | 0) + carry;\n carry = w >> 26;\n this.words[i] = w & 0x3ffffff;\n }\n this.negative = 1;\n\n return this._strip();\n };\n\n BN.prototype._wordDiv = function _wordDiv (num, mode) {\n var shift = this.length - num.length;\n\n var a = this.clone();\n var b = num;\n\n // Normalize\n var bhi = b.words[b.length - 1] | 0;\n var bhiBits = this._countBits(bhi);\n shift = 26 - bhiBits;\n if (shift !== 0) {\n b = b.ushln(shift);\n a.iushln(shift);\n bhi = b.words[b.length - 1] | 0;\n }\n\n // Initialize quotient\n var m = a.length - b.length;\n var q;\n\n if (mode !== 'mod') {\n q = new BN(null);\n q.length = m + 1;\n q.words = new Array(q.length);\n for (var i = 0; i < q.length; i++) {\n q.words[i] = 0;\n }\n }\n\n var diff = a.clone()._ishlnsubmul(b, 1, m);\n if (diff.negative === 0) {\n a = diff;\n if (q) {\n q.words[m] = 1;\n }\n }\n\n for (var j = m - 1; j >= 0; j--) {\n var qj = (a.words[b.length + j] | 0) * 0x4000000 +\n (a.words[b.length + j - 1] | 0);\n\n // NOTE: (qj / bhi) is (0x3ffffff * 0x4000000 + 0x3ffffff) / 0x2000000 max\n // (0x7ffffff)\n qj = Math.min((qj / bhi) | 0, 0x3ffffff);\n\n a._ishlnsubmul(b, qj, j);\n while (a.negative !== 0) {\n qj--;\n a.negative = 0;\n a._ishlnsubmul(b, 1, j);\n if (!a.isZero()) {\n a.negative ^= 1;\n }\n }\n if (q) {\n q.words[j] = qj;\n }\n }\n if (q) {\n q._strip();\n }\n a._strip();\n\n // Denormalize\n if (mode !== 'div' && shift !== 0) {\n a.iushrn(shift);\n }\n\n return {\n div: q || null,\n mod: a\n };\n };\n\n // NOTE: 1) `mode` can be set to `mod` to request mod only,\n // to `div` to request div only, or be absent to\n // request both div & mod\n // 2) `positive` is true if unsigned mod is requested\n BN.prototype.divmod = function divmod (num, mode, positive) {\n assert(!num.isZero());\n\n if (this.isZero()) {\n return {\n div: new BN(0),\n mod: new BN(0)\n };\n }\n\n var div, mod, res;\n if (this.negative !== 0 && num.negative === 0) {\n res = this.neg().divmod(num, mode);\n\n if (mode !== 'mod') {\n div = res.div.neg();\n }\n\n if (mode !== 'div') {\n mod = res.mod.neg();\n if (positive && mod.negative !== 0) {\n mod.iadd(num);\n }\n }\n\n return {\n div: div,\n mod: mod\n };\n }\n\n if (this.negative === 0 && num.negative !== 0) {\n res = this.divmod(num.neg(), mode);\n\n if (mode !== 'mod') {\n div = res.div.neg();\n }\n\n return {\n div: div,\n mod: res.mod\n };\n }\n\n if ((this.negative & num.negative) !== 0) {\n res = this.neg().divmod(num.neg(), mode);\n\n if (mode !== 'div') {\n mod = res.mod.neg();\n if (positive && mod.negative !== 0) {\n mod.isub(num);\n }\n }\n\n return {\n div: res.div,\n mod: mod\n };\n }\n\n // Both numbers are positive at this point\n\n // Strip both numbers to approximate shift value\n if (num.length > this.length || this.cmp(num) < 0) {\n return {\n div: new BN(0),\n mod: this\n };\n }\n\n // Very short reduction\n if (num.length === 1) {\n if (mode === 'div') {\n return {\n div: this.divn(num.words[0]),\n mod: null\n };\n }\n\n if (mode === 'mod') {\n return {\n div: null,\n mod: new BN(this.modrn(num.words[0]))\n };\n }\n\n return {\n div: this.divn(num.words[0]),\n mod: new BN(this.modrn(num.words[0]))\n };\n }\n\n return this._wordDiv(num, mode);\n };\n\n // Find `this` / `num`\n BN.prototype.div = function div (num) {\n return this.divmod(num, 'div', false).div;\n };\n\n // Find `this` % `num`\n BN.prototype.mod = function mod (num) {\n return this.divmod(num, 'mod', false).mod;\n };\n\n BN.prototype.umod = function umod (num) {\n return this.divmod(num, 'mod', true).mod;\n };\n\n // Find Round(`this` / `num`)\n BN.prototype.divRound = function divRound (num) {\n var dm = this.divmod(num);\n\n // Fast case - exact division\n if (dm.mod.isZero()) return dm.div;\n\n var mod = dm.div.negative !== 0 ? dm.mod.isub(num) : dm.mod;\n\n var half = num.ushrn(1);\n var r2 = num.andln(1);\n var cmp = mod.cmp(half);\n\n // Round down\n if (cmp < 0 || (r2 === 1 && cmp === 0)) return dm.div;\n\n // Round up\n return dm.div.negative !== 0 ? dm.div.isubn(1) : dm.div.iaddn(1);\n };\n\n BN.prototype.modrn = function modrn (num) {\n var isNegNum = num < 0;\n if (isNegNum) num = -num;\n\n assert(num <= 0x3ffffff);\n var p = (1 << 26) % num;\n\n var acc = 0;\n for (var i = this.length - 1; i >= 0; i--) {\n acc = (p * acc + (this.words[i] | 0)) % num;\n }\n\n return isNegNum ? -acc : acc;\n };\n\n // WARNING: DEPRECATED\n BN.prototype.modn = function modn (num) {\n return this.modrn(num);\n };\n\n // In-place division by number\n BN.prototype.idivn = function idivn (num) {\n var isNegNum = num < 0;\n if (isNegNum) num = -num;\n\n assert(num <= 0x3ffffff);\n\n var carry = 0;\n for (var i = this.length - 1; i >= 0; i--) {\n var w = (this.words[i] | 0) + carry * 0x4000000;\n this.words[i] = (w / num) | 0;\n carry = w % num;\n }\n\n this._strip();\n return isNegNum ? this.ineg() : this;\n };\n\n BN.prototype.divn = function divn (num) {\n return this.clone().idivn(num);\n };\n\n BN.prototype.egcd = function egcd (p) {\n assert(p.negative === 0);\n assert(!p.isZero());\n\n var x = this;\n var y = p.clone();\n\n if (x.negative !== 0) {\n x = x.umod(p);\n } else {\n x = x.clone();\n }\n\n // A * x + B * y = x\n var A = new BN(1);\n var B = new BN(0);\n\n // C * x + D * y = y\n var C = new BN(0);\n var D = new BN(1);\n\n var g = 0;\n\n while (x.isEven() && y.isEven()) {\n x.iushrn(1);\n y.iushrn(1);\n ++g;\n }\n\n var yp = y.clone();\n var xp = x.clone();\n\n while (!x.isZero()) {\n for (var i = 0, im = 1; (x.words[0] & im) === 0 && i < 26; ++i, im <<= 1);\n if (i > 0) {\n x.iushrn(i);\n while (i-- > 0) {\n if (A.isOdd() || B.isOdd()) {\n A.iadd(yp);\n B.isub(xp);\n }\n\n A.iushrn(1);\n B.iushrn(1);\n }\n }\n\n for (var j = 0, jm = 1; (y.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1);\n if (j > 0) {\n y.iushrn(j);\n while (j-- > 0) {\n if (C.isOdd() || D.isOdd()) {\n C.iadd(yp);\n D.isub(xp);\n }\n\n C.iushrn(1);\n D.iushrn(1);\n }\n }\n\n if (x.cmp(y) >= 0) {\n x.isub(y);\n A.isub(C);\n B.isub(D);\n } else {\n y.isub(x);\n C.isub(A);\n D.isub(B);\n }\n }\n\n return {\n a: C,\n b: D,\n gcd: y.iushln(g)\n };\n };\n\n // This is reduced incarnation of the binary EEA\n // above, designated to invert members of the\n // _prime_ fields F(p) at a maximal speed\n BN.prototype._invmp = function _invmp (p) {\n assert(p.negative === 0);\n assert(!p.isZero());\n\n var a = this;\n var b = p.clone();\n\n if (a.negative !== 0) {\n a = a.umod(p);\n } else {\n a = a.clone();\n }\n\n var x1 = new BN(1);\n var x2 = new BN(0);\n\n var delta = b.clone();\n\n while (a.cmpn(1) > 0 && b.cmpn(1) > 0) {\n for (var i = 0, im = 1; (a.words[0] & im) === 0 && i < 26; ++i, im <<= 1);\n if (i > 0) {\n a.iushrn(i);\n while (i-- > 0) {\n if (x1.isOdd()) {\n x1.iadd(delta);\n }\n\n x1.iushrn(1);\n }\n }\n\n for (var j = 0, jm = 1; (b.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1);\n if (j > 0) {\n b.iushrn(j);\n while (j-- > 0) {\n if (x2.isOdd()) {\n x2.iadd(delta);\n }\n\n x2.iushrn(1);\n }\n }\n\n if (a.cmp(b) >= 0) {\n a.isub(b);\n x1.isub(x2);\n } else {\n b.isub(a);\n x2.isub(x1);\n }\n }\n\n var res;\n if (a.cmpn(1) === 0) {\n res = x1;\n } else {\n res = x2;\n }\n\n if (res.cmpn(0) < 0) {\n res.iadd(p);\n }\n\n return res;\n };\n\n BN.prototype.gcd = function gcd (num) {\n if (this.isZero()) return num.abs();\n if (num.isZero()) return this.abs();\n\n var a = this.clone();\n var b = num.clone();\n a.negative = 0;\n b.negative = 0;\n\n // Remove common factor of two\n for (var shift = 0; a.isEven() && b.isEven(); shift++) {\n a.iushrn(1);\n b.iushrn(1);\n }\n\n do {\n while (a.isEven()) {\n a.iushrn(1);\n }\n while (b.isEven()) {\n b.iushrn(1);\n }\n\n var r = a.cmp(b);\n if (r < 0) {\n // Swap `a` and `b` to make `a` always bigger than `b`\n var t = a;\n a = b;\n b = t;\n } else if (r === 0 || b.cmpn(1) === 0) {\n break;\n }\n\n a.isub(b);\n } while (true);\n\n return b.iushln(shift);\n };\n\n // Invert number in the field F(num)\n BN.prototype.invm = function invm (num) {\n return this.egcd(num).a.umod(num);\n };\n\n BN.prototype.isEven = function isEven () {\n return (this.words[0] & 1) === 0;\n };\n\n BN.prototype.isOdd = function isOdd () {\n return (this.words[0] & 1) === 1;\n };\n\n // And first word and num\n BN.prototype.andln = function andln (num) {\n return this.words[0] & num;\n };\n\n // Increment at the bit position in-line\n BN.prototype.bincn = function bincn (bit) {\n assert(typeof bit === 'number');\n var r = bit % 26;\n var s = (bit - r) / 26;\n var q = 1 << r;\n\n // Fast case: bit is much higher than all existing words\n if (this.length <= s) {\n this._expand(s + 1);\n this.words[s] |= q;\n return this;\n }\n\n // Add bit and propagate, if needed\n var carry = q;\n for (var i = s; carry !== 0 && i < this.length; i++) {\n var w = this.words[i] | 0;\n w += carry;\n carry = w >>> 26;\n w &= 0x3ffffff;\n this.words[i] = w;\n }\n if (carry !== 0) {\n this.words[i] = carry;\n this.length++;\n }\n return this;\n };\n\n BN.prototype.isZero = function isZero () {\n return this.length === 1 && this.words[0] === 0;\n };\n\n BN.prototype.cmpn = function cmpn (num) {\n var negative = num < 0;\n\n if (this.negative !== 0 && !negative) return -1;\n if (this.negative === 0 && negative) return 1;\n\n this._strip();\n\n var res;\n if (this.length > 1) {\n res = 1;\n } else {\n if (negative) {\n num = -num;\n }\n\n assert(num <= 0x3ffffff, 'Number is too big');\n\n var w = this.words[0] | 0;\n res = w === num ? 0 : w < num ? -1 : 1;\n }\n if (this.negative !== 0) return -res | 0;\n return res;\n };\n\n // Compare two numbers and return:\n // 1 - if `this` > `num`\n // 0 - if `this` == `num`\n // -1 - if `this` < `num`\n BN.prototype.cmp = function cmp (num) {\n if (this.negative !== 0 && num.negative === 0) return -1;\n if (this.negative === 0 && num.negative !== 0) return 1;\n\n var res = this.ucmp(num);\n if (this.negative !== 0) return -res | 0;\n return res;\n };\n\n // Unsigned comparison\n BN.prototype.ucmp = function ucmp (num) {\n // At this point both numbers have the same sign\n if (this.length > num.length) return 1;\n if (this.length < num.length) return -1;\n\n var res = 0;\n for (var i = this.length - 1; i >= 0; i--) {\n var a = this.words[i] | 0;\n var b = num.words[i] | 0;\n\n if (a === b) continue;\n if (a < b) {\n res = -1;\n } else if (a > b) {\n res = 1;\n }\n break;\n }\n return res;\n };\n\n BN.prototype.gtn = function gtn (num) {\n return this.cmpn(num) === 1;\n };\n\n BN.prototype.gt = function gt (num) {\n return this.cmp(num) === 1;\n };\n\n BN.prototype.gten = function gten (num) {\n return this.cmpn(num) >= 0;\n };\n\n BN.prototype.gte = function gte (num) {\n return this.cmp(num) >= 0;\n };\n\n BN.prototype.ltn = function ltn (num) {\n return this.cmpn(num) === -1;\n };\n\n BN.prototype.lt = function lt (num) {\n return this.cmp(num) === -1;\n };\n\n BN.prototype.lten = function lten (num) {\n return this.cmpn(num) <= 0;\n };\n\n BN.prototype.lte = function lte (num) {\n return this.cmp(num) <= 0;\n };\n\n BN.prototype.eqn = function eqn (num) {\n return this.cmpn(num) === 0;\n };\n\n BN.prototype.eq = function eq (num) {\n return this.cmp(num) === 0;\n };\n\n //\n // A reduce context, could be using montgomery or something better, depending\n // on the `m` itself.\n //\n BN.red = function red (num) {\n return new Red(num);\n };\n\n BN.prototype.toRed = function toRed (ctx) {\n assert(!this.red, 'Already a number in reduction context');\n assert(this.negative === 0, 'red works only with positives');\n return ctx.convertTo(this)._forceRed(ctx);\n };\n\n BN.prototype.fromRed = function fromRed () {\n assert(this.red, 'fromRed works only with numbers in reduction context');\n return this.red.convertFrom(this);\n };\n\n BN.prototype._forceRed = function _forceRed (ctx) {\n this.red = ctx;\n return this;\n };\n\n BN.prototype.forceRed = function forceRed (ctx) {\n assert(!this.red, 'Already a number in reduction context');\n return this._forceRed(ctx);\n };\n\n BN.prototype.redAdd = function redAdd (num) {\n assert(this.red, 'redAdd works only with red numbers');\n return this.red.add(this, num);\n };\n\n BN.prototype.redIAdd = function redIAdd (num) {\n assert(this.red, 'redIAdd works only with red numbers');\n return this.red.iadd(this, num);\n };\n\n BN.prototype.redSub = function redSub (num) {\n assert(this.red, 'redSub works only with red numbers');\n return this.red.sub(this, num);\n };\n\n BN.prototype.redISub = function redISub (num) {\n assert(this.red, 'redISub works only with red numbers');\n return this.red.isub(this, num);\n };\n\n BN.prototype.redShl = function redShl (num) {\n assert(this.red, 'redShl works only with red numbers');\n return this.red.shl(this, num);\n };\n\n BN.prototype.redMul = function redMul (num) {\n assert(this.red, 'redMul works only with red numbers');\n this.red._verify2(this, num);\n return this.red.mul(this, num);\n };\n\n BN.prototype.redIMul = function redIMul (num) {\n assert(this.red, 'redMul works only with red numbers');\n this.red._verify2(this, num);\n return this.red.imul(this, num);\n };\n\n BN.prototype.redSqr = function redSqr () {\n assert(this.red, 'redSqr works only with red numbers');\n this.red._verify1(this);\n return this.red.sqr(this);\n };\n\n BN.prototype.redISqr = function redISqr () {\n assert(this.red, 'redISqr works only with red numbers');\n this.red._verify1(this);\n return this.red.isqr(this);\n };\n\n // Square root over p\n BN.prototype.redSqrt = function redSqrt () {\n assert(this.red, 'redSqrt works only with red numbers');\n this.red._verify1(this);\n return this.red.sqrt(this);\n };\n\n BN.prototype.redInvm = function redInvm () {\n assert(this.red, 'redInvm works only with red numbers');\n this.red._verify1(this);\n return this.red.invm(this);\n };\n\n // Return negative clone of `this` % `red modulo`\n BN.prototype.redNeg = function redNeg () {\n assert(this.red, 'redNeg works only with red numbers');\n this.red._verify1(this);\n return this.red.neg(this);\n };\n\n BN.prototype.redPow = function redPow (num) {\n assert(this.red && !num.red, 'redPow(normalNum)');\n this.red._verify1(this);\n return this.red.pow(this, num);\n };\n\n // Prime numbers with efficient reduction\n var primes = {\n k256: null,\n p224: null,\n p192: null,\n p25519: null\n };\n\n // Pseudo-Mersenne prime\n function MPrime (name, p) {\n // P = 2 ^ N - K\n this.name = name;\n this.p = new BN(p, 16);\n this.n = this.p.bitLength();\n this.k = new BN(1).iushln(this.n).isub(this.p);\n\n this.tmp = this._tmp();\n }\n\n MPrime.prototype._tmp = function _tmp () {\n var tmp = new BN(null);\n tmp.words = new Array(Math.ceil(this.n / 13));\n return tmp;\n };\n\n MPrime.prototype.ireduce = function ireduce (num) {\n // Assumes that `num` is less than `P^2`\n // num = HI * (2 ^ N - K) + HI * K + LO = HI * K + LO (mod P)\n var r = num;\n var rlen;\n\n do {\n this.split(r, this.tmp);\n r = this.imulK(r);\n r = r.iadd(this.tmp);\n rlen = r.bitLength();\n } while (rlen > this.n);\n\n var cmp = rlen < this.n ? -1 : r.ucmp(this.p);\n if (cmp === 0) {\n r.words[0] = 0;\n r.length = 1;\n } else if (cmp > 0) {\n r.isub(this.p);\n } else {\n if (r.strip !== undefined) {\n // r is a BN v4 instance\n r.strip();\n } else {\n // r is a BN v5 instance\n r._strip();\n }\n }\n\n return r;\n };\n\n MPrime.prototype.split = function split (input, out) {\n input.iushrn(this.n, 0, out);\n };\n\n MPrime.prototype.imulK = function imulK (num) {\n return num.imul(this.k);\n };\n\n function K256 () {\n MPrime.call(\n this,\n 'k256',\n 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f');\n }\n inherits(K256, MPrime);\n\n K256.prototype.split = function split (input, output) {\n // 256 = 9 * 26 + 22\n var mask = 0x3fffff;\n\n var outLen = Math.min(input.length, 9);\n for (var i = 0; i < outLen; i++) {\n output.words[i] = input.words[i];\n }\n output.length = outLen;\n\n if (input.length <= 9) {\n input.words[0] = 0;\n input.length = 1;\n return;\n }\n\n // Shift by 9 limbs\n var prev = input.words[9];\n output.words[output.length++] = prev & mask;\n\n for (i = 10; i < input.length; i++) {\n var next = input.words[i] | 0;\n input.words[i - 10] = ((next & mask) << 4) | (prev >>> 22);\n prev = next;\n }\n prev >>>= 22;\n input.words[i - 10] = prev;\n if (prev === 0 && input.length > 10) {\n input.length -= 10;\n } else {\n input.length -= 9;\n }\n };\n\n K256.prototype.imulK = function imulK (num) {\n // K = 0x1000003d1 = [ 0x40, 0x3d1 ]\n num.words[num.length] = 0;\n num.words[num.length + 1] = 0;\n num.length += 2;\n\n // bounded at: 0x40 * 0x3ffffff + 0x3d0 = 0x100000390\n var lo = 0;\n for (var i = 0; i < num.length; i++) {\n var w = num.words[i] | 0;\n lo += w * 0x3d1;\n num.words[i] = lo & 0x3ffffff;\n lo = w * 0x40 + ((lo / 0x4000000) | 0);\n }\n\n // Fast length reduction\n if (num.words[num.length - 1] === 0) {\n num.length--;\n if (num.words[num.length - 1] === 0) {\n num.length--;\n }\n }\n return num;\n };\n\n function P224 () {\n MPrime.call(\n this,\n 'p224',\n 'ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001');\n }\n inherits(P224, MPrime);\n\n function P192 () {\n MPrime.call(\n this,\n 'p192',\n 'ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff');\n }\n inherits(P192, MPrime);\n\n function P25519 () {\n // 2 ^ 255 - 19\n MPrime.call(\n this,\n '25519',\n '7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed');\n }\n inherits(P25519, MPrime);\n\n P25519.prototype.imulK = function imulK (num) {\n // K = 0x13\n var carry = 0;\n for (var i = 0; i < num.length; i++) {\n var hi = (num.words[i] | 0) * 0x13 + carry;\n var lo = hi & 0x3ffffff;\n hi >>>= 26;\n\n num.words[i] = lo;\n carry = hi;\n }\n if (carry !== 0) {\n num.words[num.length++] = carry;\n }\n return num;\n };\n\n // Exported mostly for testing purposes, use plain name instead\n BN._prime = function prime (name) {\n // Cached version of prime\n if (primes[name]) return primes[name];\n\n var prime;\n if (name === 'k256') {\n prime = new K256();\n } else if (name === 'p224') {\n prime = new P224();\n } else if (name === 'p192') {\n prime = new P192();\n } else if (name === 'p25519') {\n prime = new P25519();\n } else {\n throw new Error('Unknown prime ' + name);\n }\n primes[name] = prime;\n\n return prime;\n };\n\n //\n // Base reduction engine\n //\n function Red (m) {\n if (typeof m === 'string') {\n var prime = BN._prime(m);\n this.m = prime.p;\n this.prime = prime;\n } else {\n assert(m.gtn(1), 'modulus must be greater than 1');\n this.m = m;\n this.prime = null;\n }\n }\n\n Red.prototype._verify1 = function _verify1 (a) {\n assert(a.negative === 0, 'red works only with positives');\n assert(a.red, 'red works only with red numbers');\n };\n\n Red.prototype._verify2 = function _verify2 (a, b) {\n assert((a.negative | b.negative) === 0, 'red works only with positives');\n assert(a.red && a.red === b.red,\n 'red works only with red numbers');\n };\n\n Red.prototype.imod = function imod (a) {\n if (this.prime) return this.prime.ireduce(a)._forceRed(this);\n\n move(a, a.umod(this.m)._forceRed(this));\n return a;\n };\n\n Red.prototype.neg = function neg (a) {\n if (a.isZero()) {\n return a.clone();\n }\n\n return this.m.sub(a)._forceRed(this);\n };\n\n Red.prototype.add = function add (a, b) {\n this._verify2(a, b);\n\n var res = a.add(b);\n if (res.cmp(this.m) >= 0) {\n res.isub(this.m);\n }\n return res._forceRed(this);\n };\n\n Red.prototype.iadd = function iadd (a, b) {\n this._verify2(a, b);\n\n var res = a.iadd(b);\n if (res.cmp(this.m) >= 0) {\n res.isub(this.m);\n }\n return res;\n };\n\n Red.prototype.sub = function sub (a, b) {\n this._verify2(a, b);\n\n var res = a.sub(b);\n if (res.cmpn(0) < 0) {\n res.iadd(this.m);\n }\n return res._forceRed(this);\n };\n\n Red.prototype.isub = function isub (a, b) {\n this._verify2(a, b);\n\n var res = a.isub(b);\n if (res.cmpn(0) < 0) {\n res.iadd(this.m);\n }\n return res;\n };\n\n Red.prototype.shl = function shl (a, num) {\n this._verify1(a);\n return this.imod(a.ushln(num));\n };\n\n Red.prototype.imul = function imul (a, b) {\n this._verify2(a, b);\n return this.imod(a.imul(b));\n };\n\n Red.prototype.mul = function mul (a, b) {\n this._verify2(a, b);\n return this.imod(a.mul(b));\n };\n\n Red.prototype.isqr = function isqr (a) {\n return this.imul(a, a.clone());\n };\n\n Red.prototype.sqr = function sqr (a) {\n return this.mul(a, a);\n };\n\n Red.prototype.sqrt = function sqrt (a) {\n if (a.isZero()) return a.clone();\n\n var mod3 = this.m.andln(3);\n assert(mod3 % 2 === 1);\n\n // Fast case\n if (mod3 === 3) {\n var pow = this.m.add(new BN(1)).iushrn(2);\n return this.pow(a, pow);\n }\n\n // Tonelli-Shanks algorithm (Totally unoptimized and slow)\n //\n // Find Q and S, that Q * 2 ^ S = (P - 1)\n var q = this.m.subn(1);\n var s = 0;\n while (!q.isZero() && q.andln(1) === 0) {\n s++;\n q.iushrn(1);\n }\n assert(!q.isZero());\n\n var one = new BN(1).toRed(this);\n var nOne = one.redNeg();\n\n // Find quadratic non-residue\n // NOTE: Max is such because of generalized Riemann hypothesis.\n var lpow = this.m.subn(1).iushrn(1);\n var z = this.m.bitLength();\n z = new BN(2 * z * z).toRed(this);\n\n while (this.pow(z, lpow).cmp(nOne) !== 0) {\n z.redIAdd(nOne);\n }\n\n var c = this.pow(z, q);\n var r = this.pow(a, q.addn(1).iushrn(1));\n var t = this.pow(a, q);\n var m = s;\n while (t.cmp(one) !== 0) {\n var tmp = t;\n for (var i = 0; tmp.cmp(one) !== 0; i++) {\n tmp = tmp.redSqr();\n }\n assert(i < m);\n var b = this.pow(c, new BN(1).iushln(m - i - 1));\n\n r = r.redMul(b);\n c = b.redSqr();\n t = t.redMul(c);\n m = i;\n }\n\n return r;\n };\n\n Red.prototype.invm = function invm (a) {\n var inv = a._invmp(this.m);\n if (inv.negative !== 0) {\n inv.negative = 0;\n return this.imod(inv).redNeg();\n } else {\n return this.imod(inv);\n }\n };\n\n Red.prototype.pow = function pow (a, num) {\n if (num.isZero()) return new BN(1).toRed(this);\n if (num.cmpn(1) === 0) return a.clone();\n\n var windowSize = 4;\n var wnd = new Array(1 << windowSize);\n wnd[0] = new BN(1).toRed(this);\n wnd[1] = a;\n for (var i = 2; i < wnd.length; i++) {\n wnd[i] = this.mul(wnd[i - 1], a);\n }\n\n var res = wnd[0];\n var current = 0;\n var currentLen = 0;\n var start = num.bitLength() % 26;\n if (start === 0) {\n start = 26;\n }\n\n for (i = num.length - 1; i >= 0; i--) {\n var word = num.words[i];\n for (var j = start - 1; j >= 0; j--) {\n var bit = (word >> j) & 1;\n if (res !== wnd[0]) {\n res = this.sqr(res);\n }\n\n if (bit === 0 && current === 0) {\n currentLen = 0;\n continue;\n }\n\n current <<= 1;\n current |= bit;\n currentLen++;\n if (currentLen !== windowSize && (i !== 0 || j !== 0)) continue;\n\n res = this.mul(res, wnd[current]);\n currentLen = 0;\n current = 0;\n }\n start = 26;\n }\n\n return res;\n };\n\n Red.prototype.convertTo = function convertTo (num) {\n var r = num.umod(this.m);\n\n return r === num ? r.clone() : r;\n };\n\n Red.prototype.convertFrom = function convertFrom (num) {\n var res = num.clone();\n res.red = null;\n return res;\n };\n\n //\n // Montgomery method engine\n //\n\n BN.mont = function mont (num) {\n return new Mont(num);\n };\n\n function Mont (m) {\n Red.call(this, m);\n\n this.shift = this.m.bitLength();\n if (this.shift % 26 !== 0) {\n this.shift += 26 - (this.shift % 26);\n }\n\n this.r = new BN(1).iushln(this.shift);\n this.r2 = this.imod(this.r.sqr());\n this.rinv = this.r._invmp(this.m);\n\n this.minv = this.rinv.mul(this.r).isubn(1).div(this.m);\n this.minv = this.minv.umod(this.r);\n this.minv = this.r.sub(this.minv);\n }\n inherits(Mont, Red);\n\n Mont.prototype.convertTo = function convertTo (num) {\n return this.imod(num.ushln(this.shift));\n };\n\n Mont.prototype.convertFrom = function convertFrom (num) {\n var r = this.imod(num.mul(this.rinv));\n r.red = null;\n return r;\n };\n\n Mont.prototype.imul = function imul (a, b) {\n if (a.isZero() || b.isZero()) {\n a.words[0] = 0;\n a.length = 1;\n return a;\n }\n\n var t = a.imul(b);\n var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m);\n var u = t.isub(c).iushrn(this.shift);\n var res = u;\n\n if (u.cmp(this.m) >= 0) {\n res = u.isub(this.m);\n } else if (u.cmpn(0) < 0) {\n res = u.iadd(this.m);\n }\n\n return res._forceRed(this);\n };\n\n Mont.prototype.mul = function mul (a, b) {\n if (a.isZero() || b.isZero()) return new BN(0)._forceRed(this);\n\n var t = a.mul(b);\n var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m);\n var u = t.isub(c).iushrn(this.shift);\n var res = u;\n if (u.cmp(this.m) >= 0) {\n res = u.isub(this.m);\n } else if (u.cmpn(0) < 0) {\n res = u.iadd(this.m);\n }\n\n return res._forceRed(this);\n };\n\n Mont.prototype.invm = function invm (a) {\n // (AR)^-1 * R^2 = (A^-1 * R^-1) * R^2 = A^-1 * R\n var res = this.imod(a._invmp(this.m).mul(this.r2));\n return res._forceRed(this);\n };\n})(typeof module === 'undefined' || module, this);\n","import { CetusLeverageSDK, SdkOptions } from \"./sdk\";\n\nexport * from './config'\nexport { CetusLeverageSDK, SdkOptions };\nexport default CetusLeverageSDK;\n","import type { BaseSdkOptions, Package } from '@cetusprotocol/common-sdk'\nimport { SdkWrapper } from '@cetusprotocol/common-sdk'\nimport { leverage_mainnet } from './config'\nimport { SuiLendModule } from './modules/suilendModule'\nimport type { LeverageConfig, SuiLendConfig } from './types'\nimport { LeverageModules } from './modules/leverageModules'\nimport { AggregatorClient, Env } from '@cetusprotocol/aggregator-sdk'\nimport { normalizeSuiAddress } from '@mysten/sui/utils'\nimport { SuiClient } from '@mysten/sui/client'\nimport { CetusClmmSDK } from '@cetusprotocol/sui-clmm-sdk'\n\n\nexport interface SdkOptions extends BaseSdkOptions {\n leverage: Package<LeverageConfig>\n suilend: SuiLendConfig\n aggregator_url: string\n providers: string[]\n pyth_urls?: string[]\n env: 'mainnet' | 'testnet'\n}\n\nexport class CetusLeverageSDK extends SdkWrapper<SdkOptions> {\n protected _suilendModule: SuiLendModule\n protected _leverageModules: LeverageModules\n protected _aggregatorClient: AggregatorClient\n protected _clmmSDK: CetusClmmSDK\n\n senderAddress: string | undefined\n\n constructor(options: SdkOptions, clmmSDK?: CetusClmmSDK) {\n super(options)\n this._suilendModule = new SuiLendModule(this)\n this._leverageModules = new LeverageModules(this)\n this._aggregatorClient = new AggregatorClient({\n signer: normalizeSuiAddress('0x0'),\n client: options.sui_client || new SuiClient({ url: options.full_rpc_url! }),\n env: options.env === 'testnet' ? Env.Testnet : Env.Mainnet,\n pythUrls: options.pyth_urls,\n })\n this._clmmSDK = clmmSDK || CetusClmmSDK.createSDK({ env: options.env, full_rpc_url: options.full_rpc_url })\n }\n\n get SuiLendModule() {\n return this._suilendModule\n }\n\n get LeverageModules() {\n return this._leverageModules\n }\n\n get AggregatorClient(): AggregatorClient {\n return this._aggregatorClient\n }\n\n get ClmmSDK(): CetusClmmSDK {\n return this._clmmSDK\n }\n\n static createSDK(options: BaseSdkOptions): CetusLeverageSDK {\n return CetusLeverageSDK.createCustomSDK({ ...leverage_mainnet, ...options })\n }\n\n static createCustomSDK<T extends BaseSdkOptions>(options: T & SdkOptions): CetusLeverageSDK {\n return new CetusLeverageSDK(options)\n }\n}\n","import { DefaultProviders, FullRpcUrlMainnet } from '@cetusprotocol/common-sdk'\nimport type { SdkOptions } from '..'\n\nconst SDKConfig = {\n\n}\n\nexport const leverage_mainnet: SdkOptions = {\n full_rpc_url: FullRpcUrlMainnet,\n env: 'mainnet',\n aggregator_url: 'https://api-sui.cetus.zone/router_v2',\n providers: DefaultProviders,\n leverage: {\n package_id: '0xa1265373a081c3529c303a727118205b6a766843fcefa9ffc6d3463b2a7a3117',\n published_at: '0xa1265373a081c3529c303a727118205b6a766843fcefa9ffc6d3463b2a7a3117',\n version: 0,\n config: {\n global_config_id: '0x248fe11489520df1902cef873fb7c83f055506b4510152450fb6925a4fe587f2',\n markets_table_id: '0x353e5a81fbc10a8efddb3217dc5200274bc5afc07496f83350b35fd6d715aba5'\n }\n },\n suilend: {\n lendingMarket: [\n {\n name: \"Main market\",\n slug: \"main\",\n id: \"0x84030d26d85eaa7035084a057f2f11f701b7e2e4eda87551becbc7c97505ece1\",\n type: \"0xf95b06141ed4a174f239417323bde3f209b972f5930d8521ea38a52aff3a6ddf::suilend::MAIN_POOL\",\n ownerCapId:\n \"0xf7a4defe0b6566b6a2674a02a0c61c9f99bd012eed21bc741a069eaa82d35927\",\n },\n {\n name: \"STEAMM LM\",\n slug: \"steamm-lm\",\n id: \"0xc1888ec1b81a414e427a44829310508352aec38252ee0daa9f8b181b6947de9f\",\n type: \"0x0a071f4976abae1a7f722199cf0bfcbe695ef9408a878e7d12a7ca87b7e582a6::lp_rewards::LP_REWARDS\",\n ownerCapId:\n \"0x55a0f33b24e091830302726c8cfbff8cf8abd2ec1f83a4e6f4bf51c7ba3ad5ab\",\n isHidden: true, // Only visible in the admin panel\n },\n ],\n lendingMarketId: '0x84030d26d85eaa7035084a057f2f11f701b7e2e4eda87551becbc7c97505ece1',\n lendingMarketType: '0xf95b06141ed4a174f239417323bde3f209b972f5930d8521ea38a52aff3a6ddf::suilend::MAIN_POOL',\n apiUrl: 'https://d10td5ybgrf39v.cloudfront.net'\n },\n}\n","import type { CetusLeverageSDK } from '../sdk'\nimport { SuilendClient } from '@suilend/sdk/client'\nimport { initializeSuilend, initializeSuilendRewards, initializeObligations, formatRewards, Side, getFilteredRewards, getStakingYieldAprPercent, getDedupedPerDayRewards, getDedupedAprRewards, getTotalAprPercent, getNetAprPercent } from '@suilend/sdk'\nimport { AllAppData } from '../types'\nimport BigNumber from 'bignumber.js'\nimport { appendExtraRewards, calculateBorrowAprPercent, calculateDepositAprPercent, getRewardsAprMultiplier, getUpdatedReserve, updateRewardsWithMultiplier } from '../utils/suiLend'\nimport { d } from '@cetusprotocol/common-sdk'\nimport { Transaction } from '@mysten/sui/dist/cjs/transactions'\n\nexport class SuiLendModule {\n private sdk: CetusLeverageSDK\n\n // 缓存变量\n lendingMarketCache?: AllAppData\n obligationsCache?: Record<string, any>\n\n // 添加 suilendClient 缓存\n private suilendClientCache?: Record<string, SuilendClient>\n\n constructor(sdk: CetusLeverageSDK) {\n this.sdk = sdk\n }\n\n /**\n * 获取或初始化 SuilendClient\n * @param lendingMarketId 借贷市场ID\n * @param lendingMarketType 借贷市场类型\n */\n private async getSuilendClient(lendingMarketId: string, lendingMarketType: string): Promise<SuilendClient> {\n const cacheKey = `${lendingMarketId}_${lendingMarketType}`\n\n if (!this.suilendClientCache) {\n this.suilendClientCache = {}\n }\n\n if (!this.suilendClientCache[cacheKey]) {\n this.suilendClientCache[cacheKey] = await SuilendClient.initialize(\n lendingMarketId,\n lendingMarketType,\n this.sdk.FullClient,\n true,\n )\n }\n\n return this.suilendClientCache[cacheKey]\n }\n\n /**\n * 获取借贷市场数据(缓存)\n * @param forceRefresh 是否强制刷新\n */\n async getLendingMarketData(forceRefresh = false): Promise<AllAppData> {\n if (!forceRefresh && this.lendingMarketCache) {\n return this.lendingMarketCache\n }\n\n const lendingMarkets = this.sdk.sdkOptions?.suilend?.lendingMarket || []\n\n if (!lendingMarkets.length) {\n console.warn('⚠️ No lending markets configured.')\n return {} as AllAppData\n }\n\n try {\n const [allLendingMarketData, lstAprPercentMap] = await Promise.all([\n (async () => {\n const allLendingMarketData: AllAppData[\"allLendingMarketData\"] =\n Object.fromEntries(\n await Promise.all(\n lendingMarkets.map(async (LENDING_MARKET) => {\n // 使用缓存的 SuilendClient\n const suilendClient = await this.getSuilendClient(\n LENDING_MARKET.id,\n LENDING_MARKET.type\n )\n\n const {\n lendingMarket,\n coinMetadataMap,\n refreshedRawReserves,\n reserveMap,\n reserveCoinTypes,\n reserveCoinMetadataMap,\n rewardCoinTypes,\n activeRewardCoinTypes,\n rewardCoinMetadataMap,\n } = await initializeSuilend(this.sdk.FullClient, suilendClient)\n\n const { rewardPriceMap } = await initializeSuilendRewards(\n reserveMap,\n activeRewardCoinTypes,\n )\n\n return [\n LENDING_MARKET.id,\n {\n suilendClient,\n lendingMarket,\n coinMetadataMap,\n refreshedRawReserves,\n reserveMap,\n reserveCoinTypes,\n reserveCoinMetadataMap,\n rewardPriceMap,\n rewardCoinTypes,\n activeRewardCoinTypes,\n rewardCoinMetadataMap,\n },\n ]\n }),\n ),\n )\n return allLendingMarketData\n })(),\n (async () => {\n try {\n const res = await fetch(`${this.sdk.sdkOptions?.suilend?.apiUrl}/springsui/apy`)\n const json: Record<string, string> = await res.json()\n if ((res as any)?.statusCode === 500)\n throw new Error(\"Failed to fetch SpringSui LST APRs\")\n\n return Object.fromEntries(\n Object.entries(json).map(([coinType, aprPercent]) => [\n coinType,\n new BigNumber(aprPercent),\n ]),\n )\n } catch (err) {\n console.error(err)\n return {} as AllAppData[\"lstAprPercentMap\"]\n }\n })(),\n ])\n\n // 存入缓存\n this.lendingMarketCache = { allLendingMarketData, lstAprPercentMap }\n\n return this.lendingMarketCache\n } catch (error) {\n console.log('🚀 getLendingMarketData error:', error)\n throw error\n }\n }\n\n /**\n * 获取 obligations 数据(缓存)\n * @param allAppData 借贷市场数据(可选)\n * @param forceRefresh 是否强制刷新\n */\n async getInitializeObligations(allAppData?: AllAppData, forceRefresh = false): Promise<any> {\n if (!forceRefresh && this.obligationsCache) {\n return this.obligationsCache\n }\n\n if (!allAppData) {\n allAppData = await this.getLendingMarketData()\n }\n\n const result: Record<string, any> = {}\n for (const appData of Object.values(allAppData.allLendingMarketData)) {\n const { obligationOwnerCaps, obligations } = await initializeObligations(\n this.sdk.FullClient,\n appData.suilendClient,\n appData.refreshedRawReserves,\n appData.reserveMap,\n this.sdk.senderAddress,\n )\n\n const rewardMap = formatRewards(\n appData.reserveMap,\n appData.rewardCoinMetadataMap,\n appData.rewardPriceMap as Record<string, BigNumber | undefined>,\n obligations,\n )\n\n result[appData.lendingMarket.id] = {\n obligationOwnerCaps,\n obligations,\n rewardMap,\n }\n }\n\n // 存入缓存\n this.obligationsCache = result\n\n return this.obligationsCache\n }\n\n getSuiLendCoinInfo = (coinType: string, changeAmount: BigNumber) => {\n const { allLendingMarketData, lstAprPercentMap } = this.lendingMarketCache ?? {}\n if (!allLendingMarketData || !lstAprPercentMap) {\n throw new Error('lendingMarketCache is not initialized')\n }\n\n const list: any = Object.values(allLendingMarketData ?? {})[0];\n const reserve = list.lendingMarket.reserves.find((r: any) => r.coinType === coinType);\n if (!reserve) {\n throw new Error('reserve not found')\n }\n const currentUserData = this.obligationsCache?.[list.lendingMarket.id];\n const side: Side = 'borrow' as Side;\n const rewards = currentUserData.rewardMap[reserve.token.coinType]?.[side] ?? [];\n\n const filteredRewards = getFilteredRewards(rewards);\n appendExtraRewards(side, reserve, filteredRewards, this.sdk);\n\n const stakingYieldAprPercent = getStakingYieldAprPercent(side, reserve.coinType, lstAprPercentMap);\n const aprPercent = side === Side.DEPOSIT ? reserve.depositAprPercent : reserve.borrowAprPercent;\n\n let newAprPercent: BigNumber | undefined = aprPercent;\n\n // 更新 reserve 数据\n const newReserve = getUpdatedReserve(reserve, side, changeAmount);\n newAprPercent = side === Side.DEPOSIT\n ? calculateDepositAprPercent(newReserve)\n : calculateBorrowAprPercent(newReserve);\n\n const { multiplier, isValid } = getRewardsAprMultiplier(side, reserve, newReserve);\n\n // 更新奖励\n const perDayRewards = getDedupedPerDayRewards(filteredRewards);\n const aprRewards = getDedupedAprRewards(filteredRewards);\n const { newPerDayRewards, newAprRewards } = updateRewardsWithMultiplier(perDayRewards, aprRewards, multiplier, isValid);\n\n // 总 APR\n const totalAprPercent = getTotalAprPercent(side, aprPercent, filteredRewards, stakingYieldAprPercent);\n const newTotalAprPercent =\n newAprPercent === undefined || newAprRewards.some((reward) => reward.stats.aprPercent === undefined)\n ? undefined\n : getTotalAprPercent(side, newAprPercent, newAprRewards, stakingYieldAprPercent);\n\n // console.log({\n // '最大可出借': reserve.config.borrowLimit.toString(),\n // '已出借': reserve.borrowedAmount.toString(),\n // '剩余可以出借': d(reserve.config.borrowLimit.toString()).sub(d(reserve.borrowedAmount.toString())).toString(),\n // '存款利率': reserve.depositAprPercent.toString(),\n // 'borrow 外部显示利率': totalAprPercent.toString(),\n // 'borrow Interest利率': aprPercent.toString(),\n // 'borrow 质押利率': stakingYieldAprPercent?.toString(),\n // 'reward apr': aprRewards[0]?.stats.aprPercent?.toString(),\n // });\n return {\n borrowLimit: reserve.config.borrowLimit.toString(),\n borrowedAmount: reserve.borrowedAmount.toString(),\n remainingBorrowLimit: d(reserve.config.borrowLimit.toString()).sub(d(reserve.borrowedAmount.toString())).toString(),\n depositAprPercent: reserve.depositAprPercent.toString(),\n totalAprPercent: totalAprPercent.toString(),\n borrowInterest: aprPercent.toString(),\n stakingYieldAprPercent: stakingYieldAprPercent?.toString(),\n rewardAprPercent: aprRewards[0]?.stats.aprPercent?.toString(),\n }\n }\n\n /**\n * 获取用户借贷数据\n * @param obligationId 借贷头寸ID(可选)\n * @param forceRefresh 是否强制刷新\n */\n async getSuiLendUserData(obligationId: string, forceRefresh = false) {\n const { lstAprPercentMap } = this.lendingMarketCache ?? {}\n const obligations = this.obligationsCache ?? {}\n const lendingMarketId = this.sdk.sdkOptions?.suilend?.lendingMarketId\n\n const userData = obligations[lendingMarketId]\n if (!userData) {\n throw new Error(`No user data found for lending market: ${lendingMarketId}`)\n }\n\n // 如果指定了 obligationId,返回特定的借贷头寸数据\n if (obligationId) {\n const obligation = userData.obligations.find((o: any) => o.id === obligationId)\n if (!obligation) {\n throw new Error(`Obligation not found: ${obligationId}`)\n }\n\n const netAprPercent = getNetAprPercent(\n obligation,\n userData.rewardMap,\n lstAprPercentMap ?? {},\n )\n\n return {\n obligation,\n netAprPercent,\n deposits: obligation.deposits,\n borrowedAmount: obligation.borrowedAmount,\n depositedAmount: obligation.depositedAmount,\n netValueUsd: obligation.netValueUsd,\n rewardMap: userData.rewardMap\n }\n }\n\n }\n\n // 创建新的头寸开仓时调用\n createObligation = async (transaction: Transaction) => {\n\n const { lendingMarketId, lendingMarketType } = this.sdk.sdkOptions?.suilend\n const suilendClient = await this.getSuilendClient(\n lendingMarketId,\n lendingMarketType\n )\n\n const obligationOwnerCapId = suilendClient.createObligation(transaction);\n return obligationOwnerCapId\n\n }\n}\n","/*\r\n * bignumber.js v9.3.1\r\n * A JavaScript library for arbitrary-precision arithmetic.\r\n * https://github.com/MikeMcl/bignumber.js\r\n * Copyright (c) 2025 Michael Mclaughlin <M8ch88l@gmail.com>\r\n * MIT Licensed.\r\n *\r\n * BigNumber.prototype methods | BigNumber methods\r\n * |\r\n * absoluteValue abs | clone\r\n * comparedTo | config set\r\n * decimalPlaces dp | DECIMAL_PLACES\r\n * dividedBy div | ROUNDING_MODE\r\n * dividedToIntegerBy idiv | EXPONENTIAL_AT\r\n * exponentiatedBy pow | RANGE\r\n * integerValue | CRYPTO\r\n * isEqualTo eq | MODULO_MODE\r\n * isFinite | POW_PRECISION\r\n * isGreaterThan gt | FORMAT\r\n * isGreaterThanOrEqualTo gte | ALPHABET\r\n * isInteger | isBigNumber\r\n * isLessThan lt | maximum max\r\n * isLessThanOrEqualTo lte | minimum min\r\n * isNaN | random\r\n * isNegative | sum\r\n * isPositive |\r\n * isZero |\r\n * minus |\r\n * modulo mod |\r\n * multipliedBy times |\r\n * negated |\r\n * plus |\r\n * precision sd |\r\n * shiftedBy |\r\n * squareRoot sqrt |\r\n * toExponential |\r\n * toFixed |\r\n * toFormat |\r\n * toFraction |\r\n * toJSON |\r\n * toNumber |\r\n * toPrecision |\r\n * toString |\r\n * valueOf |\r\n *\r\n */\r\n\r\n\r\nvar\r\n isNumeric = /^-?(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:e[+-]?\\d+)?$/i,\r\n mathceil = Math.ceil,\r\n mathfloor = Math.floor,\r\n\r\n bignumberError = '[BigNumber Error] ',\r\n tooManyDigits = bignumberError + 'Number primitive has more than 15 significant digits: ',\r\n\r\n BASE = 1e14,\r\n LOG_BASE = 14,\r\n MAX_SAFE_INTEGER = 0x1fffffffffffff, // 2^53 - 1\r\n // MAX_INT32 = 0x7fffffff, // 2^31 - 1\r\n POWS_TEN = [1, 10, 100, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9, 1e10, 1e11, 1e12, 1e13],\r\n SQRT_BASE = 1e7,\r\n\r\n // EDITABLE\r\n // The limit on the value of DECIMAL_PLACES, TO_EXP_NEG, TO_EXP_POS, MIN_EXP, MAX_EXP, and\r\n // the arguments to toExponential, toFixed, toFormat, and toPrecision.\r\n MAX = 1E9; // 0 to MAX_INT32\r\n\r\n\r\n/*\r\n * Create and return a BigNumber constructor.\r\n */\r\nfunction clone(configObject) {\r\n var div, convertBase, parseNumeric,\r\n P = BigNumber.prototype = { constructor: BigNumber, toString: null, valueOf: null },\r\n ONE = new BigNumber(1),\r\n\r\n\r\n //----------------------------- EDITABLE CONFIG DEFAULTS -------------------------------\r\n\r\n\r\n // The default values below must be integers within the inclusive ranges stated.\r\n // The values can also be changed at run-time using BigNumber.set.\r\n\r\n // The maximum number of decimal places for operations involving division.\r\n DECIMAL_PLACES = 20, // 0 to MAX\r\n\r\n // The rounding mode used when rounding to the above decimal places, and when using\r\n // toExponential, toFixed, toFormat and toPrecision, and round (default value).\r\n // UP 0 Away from zero.\r\n // DOWN 1 Towards zero.\r\n // CEIL 2 Towards +Infinity.\r\n // FLOOR 3 Towards -Infinity.\r\n // HALF_UP 4 Towards nearest neighbour. If equidistant, up.\r\n // HALF_DOWN 5 Towards nearest neighbour. If equidistant, down.\r\n // HALF_EVEN 6 Towards nearest neighbour. If equidistant, towards even neighbour.\r\n // HALF_CEIL 7 Towards nearest neighbour. If equidistant, towards +Infinity.\r\n // HALF_FLOOR 8 Towards nearest neighbour. If equidistant, towards -Infinity.\r\n ROUNDING_MODE = 4, // 0 to 8\r\n\r\n // EXPONENTIAL_AT : [TO_EXP_NEG , TO_EXP_POS]\r\n\r\n // The exponent value at and beneath which toString returns exponential notation.\r\n // Number type: -7\r\n TO_EXP_NEG = -7, // 0 to -MAX\r\n\r\n // The exponent value at and above which toString returns exponential notation.\r\n // Number type: 21\r\n TO_EXP_POS = 21, // 0 to MAX\r\n\r\n // RANGE : [MIN_EXP, MAX_EXP]\r\n\r\n // The minimum exponent value, beneath which underflow to zero occurs.\r\n // Number type: -324 (5e-324)\r\n MIN_EXP = -1e7, // -1 to -MAX\r\n\r\n // The maximum exponent value, above which overflow to Infinity occurs.\r\n // Number type: 308 (1.7976931348623157e+308)\r\n // For MAX_EXP > 1e7, e.g. new BigNumber('1e100000000').plus(1) may be slow.\r\n MAX_EXP = 1e7, // 1 to MAX\r\n\r\n // Whether to use cryptographically-secure random number generation, if available.\r\n CRYPTO = false, // true or false\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.\r\n // This modulo mode is commonly known as 'truncated division' and is\r\n // equivalent to (a % n) in JavaScript.\r\n // FLOOR 3 The remainder has the same sign as the divisor (Python %).\r\n // HALF_EVEN 6 This modulo mode implements the IEEE 754 remainder function.\r\n // EUCLID 9 Euclidian division. q = sign(n) * floor(a / abs(n)).\r\n // The remainder is always positive.\r\n //\r\n // The truncated division, floored division, Euclidian division and IEEE 754 remainder\r\n // modes are commonly used for the modulus operation.\r\n // Although the other rounding modes can also be used, they may not give useful results.\r\n MODULO_MODE = 1, // 0 to 9\r\n\r\n // The maximum number of significant digits of the result of the exponentiatedBy operation.\r\n // If POW_PRECISION is 0, there will be unlimited significant digits.\r\n POW_PRECISION = 0, // 0 to MAX\r\n\r\n // The format specification used by the BigNumber.prototype.toFormat method.\r\n FORMAT = {\r\n prefix: '',\r\n groupSize: 3,\r\n secondaryGroupSize: 0,\r\n groupSeparator: ',',\r\n decimalSeparator: '.',\r\n fractionGroupSize: 0,\r\n fractionGroupSeparator: '\\xA0', // non-breaking space\r\n suffix: ''\r\n },\r\n\r\n // The alphabet used for base conversion. It must be at least 2 characters long, with no '+',\r\n // '-', '.', whitespace, or repeated character.\r\n // '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ$_'\r\n ALPHABET = '0123456789abcdefghijklmnopqrstuvwxyz',\r\n alphabetHasNormalDecimalDigits = true;\r\n\r\n\r\n //------------------------------------------------------------------------------------------\r\n\r\n\r\n // CONSTRUCTOR\r\n\r\n\r\n /*\r\n * The BigNumber constructor and exported function.\r\n * Create and return a new instance of a BigNumber object.\r\n *\r\n * v {number|string|BigNumber} A numeric value.\r\n * [b] {number} The base of v. Integer, 2 to ALPHABET.length inclusive.\r\n */\r\n function BigNumber(v, b) {\r\n var alphabet, c, caseChanged, e, i, isNum, len, str,\r\n x = this;\r\n\r\n // Enable constructor call without `new`.\r\n if (!(x instanceof BigNumber)) return new BigNumber(v, b);\r\n\r\n if (b == null) {\r\n\r\n if (v && v._isBigNumber === true) {\r\n x.s = v.s;\r\n\r\n if (!v.c || v.e > MAX_EXP) {\r\n x.c = x.e = null;\r\n } else if (v.e < MIN_EXP) {\r\n x.c = [x.e = 0];\r\n } else {\r\n x.e = v.e;\r\n x.c = v.c.slice();\r\n }\r\n\r\n return;\r\n }\r\n\r\n if ((isNum = typeof v == 'number') && v * 0 == 0) {\r\n\r\n // Use `1 / n` to handle minus zero also.\r\n x.s = 1 / v < 0 ? (v = -v, -1) : 1;\r\n\r\n // Fast path for integers, where n < 2147483648 (2**31).\r\n if (v === ~~v) {\r\n for (e = 0, i = v; i >= 10; i /= 10, e++);\r\n\r\n if (e > MAX_EXP) {\r\n x.c = x.e = null;\r\n } else {\r\n x.e = e;\r\n x.c = [v];\r\n }\r\n\r\n return;\r\n }\r\n\r\n str = String(v);\r\n } else {\r\n\r\n if (!isNumeric.test(str = String(v))) return parseNumeric(x, str, isNum);\r\n\r\n x.s = str.charCodeAt(0) == 45 ? (str = str.slice(1), -1) : 1;\r\n }\r\n\r\n // Decimal point?\r\n if ((e = str.indexOf('.')) > -1) str = str.replace('.', '');\r\n\r\n // Exponential form?\r\n if ((i = str.search(/e/i)) > 0) {\r\n\r\n // Determine exponent.\r\n if (e < 0) e = i;\r\n e += +str.slice(i + 1);\r\n str = str.substring(0, i);\r\n } else if (e < 0) {\r\n\r\n // Integer.\r\n e = str.length;\r\n }\r\n\r\n } else {\r\n\r\n // '[BigNumber Error] Base {not a primitive number|not an integer|out of range}: {b}'\r\n intCheck(b, 2, ALPHABET.length, 'Base');\r\n\r\n // Allow exponential notation to be used with base 10 argument, while\r\n // also rounding to DECIMAL_PLACES as with other bases.\r\n if (b == 10 && alphabetHasNormalDecimalDigits) {\r\n x = new BigNumber(v);\r\n return round(x, DECIMAL_PLACES + x.e + 1, ROUNDING_MODE);\r\n }\r\n\r\n str = String(v);\r\n\r\n if (isNum = typeof v == 'number') {\r\n\r\n // Avoid potential interpretation of Infinity and NaN as base 44+ values.\r\n if (v * 0 != 0) return parseNumeric(x, str, isNum, b);\r\n\r\n x.s = 1 / v < 0 ? (str = str.slice(1), -1) : 1;\r\n\r\n // '[BigNumber Error] Number primitive has more than 15 significant digits: {n}'\r\n if (BigNumber.DEBUG && str.replace(/^0\\.0*|\\./, '').length > 15) {\r\n throw Error\r\n (tooManyDigits + v);\r\n }\r\n } else {\r\n x.s = str.charCodeAt(0) === 45 ? (str = str.slice(1), -1) : 1;\r\n }\r\n\r\n alphabet = ALPHABET.slice(0, b);\r\n e = i = 0;\r\n\r\n // Check that str is a valid base b number.\r\n // Don't use RegExp, so alphabet can contain special characters.\r\n for (len = str.length; i < len; i++) {\r\n if (alphabet.indexOf(c = str.charAt(i)) < 0) {\r\n if (c == '.') {\r\n\r\n // If '.' is not the first character and it has not be found before.\r\n if (i > e) {\r\n e = len;\r\n continue;\r\n }\r\n } else if (!caseChanged) {\r\n\r\n // Allow e.g. hexadecimal 'FF' as well as 'ff'.\r\n if (str == str.toUpperCase() && (str = str.toLowerCase()) ||\r\n str == str.toLowerCase() && (str = str.toUpperCase())) {\r\n caseChanged = true;\r\n i = -1;\r\n e = 0;\r\n continue;\r\n }\r\n }\r\n\r\n return parseNumeric(x, String(v), isNum, b);\r\n }\r\n }\r\n\r\n // Prevent later check for length on converted number.\r\n isNum = false;\r\n str = convertBase(str, b, 10, x.s);\r\n\r\n // Decimal point?\r\n if ((e = str.indexOf('.')) > -1) str = str.replace('.', '');\r\n else 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) === 48;);\r\n\r\n if (str = str.slice(i, ++len)) {\r\n len -= i;\r\n\r\n // '[BigNumber Error] Number primitive has more than 15 significant digits: {n}'\r\n if (isNum && BigNumber.DEBUG &&\r\n len > 15 && (v > MAX_SAFE_INTEGER || v !== mathfloor(v))) {\r\n throw Error\r\n (tooManyDigits + (x.s * v));\r\n }\r\n\r\n // Overflow?\r\n if ((e = e - i - 1) > MAX_EXP) {\r\n\r\n // Infinity.\r\n x.c = x.e = null;\r\n\r\n // Underflow?\r\n } else if (e < MIN_EXP) {\r\n\r\n // Zero.\r\n x.c = [x.e = 0];\r\n } else {\r\n x.e = e;\r\n x.c = [];\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 element of the coefficient array.\r\n i = (e + 1) % LOG_BASE;\r\n if (e < 0) i += LOG_BASE; // i < 1\r\n\r\n if (i < len) {\r\n if (i) x.c.push(+str.slice(0, i));\r\n\r\n for (len -= LOG_BASE; i < len;) {\r\n x.c.push(+str.slice(i, i += LOG_BASE));\r\n }\r\n\r\n i = LOG_BASE - (str = str.slice(i)).length;\r\n } else {\r\n i -= len;\r\n }\r\n\r\n for (; i--; str += '0');\r\n x.c.push(+str);\r\n }\r\n } else {\r\n\r\n // Zero.\r\n x.c = [x.e = 0];\r\n }\r\n }\r\n\r\n\r\n // CONSTRUCTOR PROPERTIES\r\n\r\n\r\n BigNumber.clone = clone;\r\n\r\n BigNumber.ROUND_UP = 0;\r\n BigNumber.ROUND_DOWN = 1;\r\n BigNumber.ROUND_CEIL = 2;\r\n BigNumber.ROUND_FLOOR = 3;\r\n BigNumber.ROUND_HALF_UP = 4;\r\n BigNumber.ROUND_HALF_DOWN = 5;\r\n BigNumber.ROUND_HALF_EVEN = 6;\r\n BigNumber.ROUND_HALF_CEIL = 7;\r\n BigNumber.ROUND_HALF_FLOOR = 8;\r\n BigNumber.EUCLID = 9;\r\n\r\n\r\n /*\r\n * Configure infrequently-changing library-wide settings.\r\n *\r\n * Accept an object with the following optional properties (if the value of a property is\r\n * a number, it must be an integer within the inclusive range stated):\r\n *\r\n * DECIMAL_PLACES {number} 0 to MAX\r\n * ROUNDING_MODE {number} 0 to 8\r\n * EXPONENTIAL_AT {number|number[]} -MAX to MAX or [-MAX to 0, 0 to MAX]\r\n * RANGE {number|number[]} -MAX to MAX (not zero) or [-MAX to -1, 1 to MAX]\r\n * CRYPTO {boolean} true or false\r\n * MODULO_MODE {number} 0 to 9\r\n * POW_PRECISION {number} 0 to MAX\r\n * ALPHABET {string} A string of two or more unique characters which does\r\n * not contain '.'.\r\n * FORMAT {object} An object with some of the following properties:\r\n * prefix {string}\r\n * groupSize {number}\r\n * secondaryGroupSize {number}\r\n * groupSeparator {string}\r\n * decimalSeparator {string}\r\n * fractionGroupSize {number}\r\n * fractionGroupSeparator {string}\r\n * suffix {string}\r\n *\r\n * (The values assigned to the above FORMAT object properties are not checked for validity.)\r\n *\r\n * E.g.\r\n * BigNumber.config({ DECIMAL_PLACES : 20, ROUNDING_MODE : 4 })\r\n *\r\n * Ignore properties/parameters set to null or undefined, except for ALPHABET.\r\n *\r\n * Return an object with the properties current values.\r\n */\r\n BigNumber.config = BigNumber.set = function (obj) {\r\n var p, v;\r\n\r\n if (obj != null) {\r\n\r\n if (typeof obj == 'object') {\r\n\r\n // DECIMAL_PLACES {number} Integer, 0 to MAX inclusive.\r\n // '[BigNumber Error] DECIMAL_PLACES {not a primitive number|not an integer|out of range}: {v}'\r\n if (obj.hasOwnProperty(p = 'DECIMAL_PLACES')) {\r\n v = obj[p];\r\n intCheck(v, 0, MAX, p);\r\n DECIMAL_PLACES = v;\r\n }\r\n\r\n // ROUNDING_MODE {number} Integer, 0 to 8 inclusive.\r\n // '[BigNumber Error] ROUNDING_MODE {not a primitive number|not an integer|out of range}: {v}'\r\n if (obj.hasOwnProperty(p = 'ROUNDING_MODE')) {\r\n v = obj[p];\r\n intCheck(v, 0, 8, p);\r\n ROUNDING_MODE = v;\r\n }\r\n\r\n // EXPONENTIAL_AT {number|number[]}\r\n // Integer, -MAX to MAX inclusive or\r\n // [integer -MAX to 0 inclusive, 0 to MAX inclusive].\r\n // '[BigNumber Error] EXPONENTIAL_AT {not a primitive number|not an integer|out of range}: {v}'\r\n if (obj.hasOwnProperty(p = 'EXPONENTIAL_AT')) {\r\n v = obj[p];\r\n if (v && v.pop) {\r\n intCheck(v[0], -MAX, 0, p);\r\n intCheck(v[1], 0, MAX, p);\r\n TO_EXP_NEG = v[0];\r\n TO_EXP_POS = v[1];\r\n } else {\r\n intCheck(v, -MAX, MAX, p);\r\n TO_EXP_NEG = -(TO_EXP_POS = v < 0 ? -v : v);\r\n }\r\n }\r\n\r\n // RANGE {number|number[]} Non-zero integer, -MAX to MAX inclusive or\r\n // [integer -MAX to -1 inclusive, integer 1 to MAX inclusive].\r\n // '[BigNumber Error] RANGE {not a primitive number|not an integer|out of range|cannot be zero}: {v}'\r\n if (obj.hasOwnProperty(p = 'RANGE')) {\r\n v = obj[p];\r\n if (v && v.pop) {\r\n intCheck(v[0], -MAX, -1, p);\r\n intCheck(v[1], 1, MAX, p);\r\n MIN_EXP = v[0];\r\n MAX_EXP = v[1];\r\n } else {\r\n intCheck(v, -MAX, MAX, p);\r\n if (v) {\r\n MIN_EXP = -(MAX_EXP = v < 0 ? -v : v);\r\n } else {\r\n throw Error\r\n (bignumberError + p + ' cannot be zero: ' + v);\r\n }\r\n }\r\n }\r\n\r\n // CRYPTO {boolean} true or false.\r\n // '[BigNumber Error] CRYPTO not true or false: {v}'\r\n // '[BigNumber Error] crypto unavailable'\r\n if (obj.hasOwnProperty(p = 'CRYPTO')) {\r\n v = obj[p];\r\n if (v === !!v) {\r\n if (v) {\r\n if (typeof crypto != 'undefined' && crypto &&\r\n (crypto.getRandomValues || crypto.randomBytes)) {\r\n CRYPTO = v;\r\n } else {\r\n CRYPTO = !v;\r\n throw Error\r\n (bignumberError + 'crypto unavailable');\r\n }\r\n } else {\r\n CRYPTO = v;\r\n }\r\n } else {\r\n throw Error\r\n (bignumberError + p + ' not true or false: ' + v);\r\n }\r\n }\r\n\r\n // MODULO_MODE {number} Integer, 0 to 9 inclusive.\r\n // '[BigNumber Error] MODULO_MODE {not a primitive number|not an integer|out of range}: {v}'\r\n if (obj.hasOwnProperty(p = 'MODULO_MODE')) {\r\n v = obj[p];\r\n intCheck(v, 0, 9, p);\r\n MODULO_MODE = v;\r\n }\r\n\r\n // POW_PRECISION {number} Integer, 0 to MAX inclusive.\r\n // '[BigNumber Error] POW_PRECISION {not a primitive number|not an integer|out of range}: {v}'\r\n if (obj.hasOwnProperty(p = 'POW_PRECISION')) {\r\n v = obj[p];\r\n intCheck(v, 0, MAX, p);\r\n POW_PRECISION = v;\r\n }\r\n\r\n // FORMAT {object}\r\n // '[BigNumber Error] FORMAT not an object: {v}'\r\n if (obj.hasOwnProperty(p = 'FORMAT')) {\r\n v = obj[p];\r\n if (typeof v == 'object') FORMAT = v;\r\n else throw Error\r\n (bignumberError + p + ' not an object: ' + v);\r\n }\r\n\r\n // ALPHABET {string}\r\n // '[BigNumber Error] ALPHABET invalid: {v}'\r\n if (obj.hasOwnProperty(p = 'ALPHABET')) {\r\n v = obj[p];\r\n\r\n // Disallow if less than two characters,\r\n // or if it contains '+', '-', '.', whitespace, or a repeated character.\r\n if (typeof v == 'string' && !/^.?$|[+\\-.\\s]|(.).*\\1/.test(v)) {\r\n alphabetHasNormalDecimalDigits = v.slice(0, 10) == '0123456789';\r\n ALPHABET = v;\r\n } else {\r\n throw Error\r\n (bignumberError + p + ' invalid: ' + v);\r\n }\r\n }\r\n\r\n } else {\r\n\r\n // '[BigNumber Error] Object expected: {v}'\r\n throw Error\r\n (bignumberError + 'Object expected: ' + obj);\r\n }\r\n }\r\n\r\n return {\r\n DECIMAL_PLACES: DECIMAL_PLACES,\r\n ROUNDING_MODE: ROUNDING_MODE,\r\n EXPONENTIAL_AT: [TO_EXP_NEG, TO_EXP_POS],\r\n RANGE: [MIN_EXP, MAX_EXP],\r\n CRYPTO: CRYPTO,\r\n MODULO_MODE: MODULO_MODE,\r\n POW_PRECISION: POW_PRECISION,\r\n FORMAT: FORMAT,\r\n ALPHABET: ALPHABET\r\n };\r\n };\r\n\r\n\r\n /*\r\n * Return true if v is a BigNumber instance, otherwise return false.\r\n *\r\n * If BigNumber.DEBUG is true, throw if a BigNumber instance is not well-formed.\r\n *\r\n * v {any}\r\n *\r\n * '[BigNumber Error] Invalid BigNumber: {v}'\r\n */\r\n BigNumber.isBigNumber = function (v) {\r\n if (!v || v._isBigNumber !== true) return false;\r\n if (!BigNumber.DEBUG) return true;\r\n\r\n var i, n,\r\n c = v.c,\r\n e = v.e,\r\n s = v.s;\r\n\r\n out: if ({}.toString.call(c) == '[object Array]') {\r\n\r\n if ((s === 1 || s === -1) && e >= -MAX && e <= MAX && e === mathfloor(e)) {\r\n\r\n // If the first element is zero, the BigNumber value must be zero.\r\n if (c[0] === 0) {\r\n if (e === 0 && c.length === 1) return true;\r\n break out;\r\n }\r\n\r\n // Calculate number of digits that c[0] should have, based on the exponent.\r\n i = (e + 1) % LOG_BASE;\r\n if (i < 1) i += LOG_BASE;\r\n\r\n // Calculate number of digits of c[0].\r\n //if (Math.ceil(Math.log(c[0] + 1) / Math.LN10) == i) {\r\n if (String(c[0]).length == i) {\r\n\r\n for (i = 0; i < c.length; i++) {\r\n n = c[i];\r\n if (n < 0 || n >= BASE || n !== mathfloor(n)) break out;\r\n }\r\n\r\n // Last element cannot be zero, unless it is the only element.\r\n if (n !== 0) return true;\r\n }\r\n }\r\n\r\n // Infinity/NaN\r\n } else if (c === null && e === null && (s === null || s === 1 || s === -1)) {\r\n return true;\r\n }\r\n\r\n throw Error\r\n (bignumberError + 'Invalid BigNumber: ' + v);\r\n };\r\n\r\n\r\n /*\r\n * Return a new BigNumber whose value is the maximum of the arguments.\r\n *\r\n * arguments {number|string|BigNumber}\r\n */\r\n BigNumber.maximum = BigNumber.max = function () {\r\n return maxOrMin(arguments, -1);\r\n };\r\n\r\n\r\n /*\r\n * Return a new BigNumber whose value is the minimum of the arguments.\r\n *\r\n * arguments {number|string|BigNumber}\r\n */\r\n BigNumber.minimum = BigNumber.min = function () {\r\n return maxOrMin(arguments, 1);\r\n };\r\n\r\n\r\n /*\r\n * Return a new BigNumber with a random value equal to or greater than 0 and less than 1,\r\n * and with dp, or DECIMAL_PLACES if dp is omitted, decimal places (or less if trailing\r\n * zeros are produced).\r\n *\r\n * [dp] {number} Decimal places. Integer, 0 to MAX inclusive.\r\n *\r\n * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {dp}'\r\n * '[BigNumber Error] crypto unavailable'\r\n */\r\n BigNumber.random = (function () {\r\n var pow2_53 = 0x20000000000000;\r\n\r\n // Return a 53 bit integer n, where 0 <= n < 9007199254740992.\r\n // Check if Math.random() produces more than 32 bits of randomness.\r\n // If it does, assume at least 53 bits are produced, otherwise assume at least 30 bits.\r\n // 0x40000000 is 2^30, 0x800000 is 2^23, 0x1fffff is 2^21 - 1.\r\n var random53bitInt = (Math.random() * pow2_53) & 0x1fffff\r\n ? function () { return mathfloor(Math.random() * pow2_53); }\r\n : function () { return ((Math.random() * 0x40000000 | 0) * 0x800000) +\r\n (Math.random() * 0x800000 | 0); };\r\n\r\n return function (dp) {\r\n var a, b, e, k, v,\r\n i = 0,\r\n c = [],\r\n rand = new BigNumber(ONE);\r\n\r\n if (dp == null) dp = DECIMAL_PLACES;\r\n else intCheck(dp, 0, MAX);\r\n\r\n k = mathceil(dp / LOG_BASE);\r\n\r\n if (CRYPTO) {\r\n\r\n // Browsers supporting crypto.getRandomValues.\r\n if (crypto.getRandomValues) {\r\n\r\n a = crypto.getRandomValues(new Uint32Array(k *= 2));\r\n\r\n for (; i < k;) {\r\n\r\n // 53 bits:\r\n // ((Math.pow(2, 32) - 1) * Math.pow(2, 21)).toString(2)\r\n // 11111 11111111 11111111 11111111 11100000 00000000 00000000\r\n // ((Math.pow(2, 32) - 1) >>> 11).toString(2)\r\n // 11111 11111111 11111111\r\n // 0x20000 is 2^21.\r\n v = a[i] * 0x20000 + (a[i + 1] >>> 11);\r\n\r\n // Rejection sampling:\r\n // 0 <= v < 9007199254740992\r\n // Probability that v >= 9e15, is\r\n // 7199254740992 / 9007199254740992 ~= 0.0008, i.e. 1 in 1251\r\n if (v >= 9e15) {\r\n b = crypto.getRandomValues(new Uint32Array(2));\r\n a[i] = b[0];\r\n a[i + 1] = b[1];\r\n } else {\r\n\r\n // 0 <= v <= 8999999999999999\r\n // 0 <= (v % 1e14) <= 99999999999999\r\n c.push(v % 1e14);\r\n i += 2;\r\n }\r\n }\r\n i = k / 2;\r\n\r\n // Node.js supporting crypto.randomBytes.\r\n } else if (crypto.randomBytes) {\r\n\r\n // buffer\r\n a = crypto.randomBytes(k *= 7);\r\n\r\n for (; i < k;) {\r\n\r\n // 0x1000000000000 is 2^48, 0x10000000000 is 2^40\r\n // 0x100000000 is 2^32, 0x1000000 is 2^24\r\n // 11111 11111111 11111111 11111111 11111111 11111111 11111111\r\n // 0 <= v < 9007199254740992\r\n v = ((a[i] & 31) * 0x1000000000000) + (a[i + 1] * 0x10000000000) +\r\n (a[i + 2] * 0x100000000) + (a[i + 3] * 0x1000000) +\r\n (a[i + 4] << 16) + (a[i + 5] << 8) + a[i + 6];\r\n\r\n if (v >= 9e15) {\r\n crypto.randomBytes(7).copy(a, i);\r\n } else {\r\n\r\n // 0 <= (v % 1e14) <= 99999999999999\r\n c.push(v % 1e14);\r\n i += 7;\r\n }\r\n }\r\n i = k / 7;\r\n } else {\r\n CRYPTO = false;\r\n throw Error\r\n (bignumberError + 'crypto unavailable');\r\n }\r\n }\r\n\r\n // Use Math.random.\r\n if (!CRYPTO) {\r\n\r\n for (; i < k;) {\r\n v = random53bitInt();\r\n if (v < 9e15) c[i++] = v % 1e14;\r\n }\r\n }\r\n\r\n k = c[--i];\r\n dp %= LOG_BASE;\r\n\r\n // Convert trailing digits to zeros according to dp.\r\n if (k && dp) {\r\n v = POWS_TEN[LOG_BASE - dp];\r\n c[i] = mathfloor(k / v) * v;\r\n }\r\n\r\n // Remove trailing elements which are zero.\r\n for (; c[i] === 0; c.pop(), i--);\r\n\r\n // Zero?\r\n if (i < 0) {\r\n c = [e = 0];\r\n } else {\r\n\r\n // Remove leading elements which are zero and adjust exponent accordingly.\r\n for (e = -1 ; c[0] === 0; c.splice(0, 1), e -= LOG_BASE);\r\n\r\n // Count the digits of the first element of c to determine leading zeros, and...\r\n for (i = 1, v = c[0]; v >= 10; v /= 10, i++);\r\n\r\n // adjust the exponent accordingly.\r\n if (i < LOG_BASE) e -= LOG_BASE - i;\r\n }\r\n\r\n rand.e = e;\r\n rand.c = c;\r\n return rand;\r\n };\r\n })();\r\n\r\n\r\n /*\r\n * Return a BigNumber whose value is the sum of the arguments.\r\n *\r\n * arguments {number|string|BigNumber}\r\n */\r\n BigNumber.sum = function () {\r\n var i = 1,\r\n args = arguments,\r\n sum = new BigNumber(args[0]);\r\n for (; i < args.length;) sum = sum.plus(args[i++]);\r\n return sum;\r\n };\r\n\r\n\r\n // PRIVATE FUNCTIONS\r\n\r\n\r\n // Called by BigNumber and BigNumber.prototype.toString.\r\n convertBase = (function () {\r\n var decimal = '0123456789';\r\n\r\n /*\r\n * Convert string of baseIn to an array of numbers of baseOut.\r\n * Eg. toBaseOut('255', 10, 16) returns [15, 15].\r\n * Eg. toBaseOut('ff', 16, 10) returns [2, 5, 5].\r\n */\r\n function toBaseOut(str, baseIn, baseOut, alphabet) {\r\n var j,\r\n arr = [0],\r\n arrL,\r\n i = 0,\r\n len = str.length;\r\n\r\n for (; i < len;) {\r\n for (arrL = arr.length; arrL--; arr[arrL] *= baseIn);\r\n\r\n arr[0] += alphabet.indexOf(str.charAt(i++));\r\n\r\n for (j = 0; j < arr.length; j++) {\r\n\r\n if (arr[j] > baseOut - 1) {\r\n if (arr[j + 1] == null) 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 // Convert a numeric string of baseIn to a numeric string of baseOut.\r\n // If the caller is toString, we are converting from base 10 to baseOut.\r\n // If the caller is BigNumber, we are converting from baseIn to base 10.\r\n return function (str, baseIn, baseOut, sign, callerIsToString) {\r\n var alphabet, d, e, k, r, x, xc, y,\r\n i = str.indexOf('.'),\r\n dp = DECIMAL_PLACES,\r\n rm = ROUNDING_MODE;\r\n\r\n // Non-integer.\r\n if (i >= 0) {\r\n k = POW_PRECISION;\r\n\r\n // Unlimited precision.\r\n POW_PRECISION = 0;\r\n str = str.replace('.', '');\r\n y = new BigNumber(baseIn);\r\n x = y.pow(str.length - i);\r\n POW_PRECISION = k;\r\n\r\n // Convert str as if an integer, then restore the fraction part by dividing the\r\n // result by its base raised to a power.\r\n\r\n y.c = toBaseOut(toFixedPoint(coeffToString(x.c), x.e, '0'),\r\n 10, baseOut, decimal);\r\n y.e = y.c.length;\r\n }\r\n\r\n // Convert the number as integer.\r\n\r\n xc = toBaseOut(str, baseIn, baseOut, callerIsToString\r\n ? (alphabet = ALPHABET, decimal)\r\n : (alphabet = decimal, ALPHABET));\r\n\r\n // xc now represents str as an integer and converted to baseOut. e is the exponent.\r\n e = k = xc.length;\r\n\r\n // Remove trailing zeros.\r\n for (; xc[--k] == 0; xc.pop());\r\n\r\n // Zero?\r\n if (!xc[0]) return alphabet.charAt(0);\r\n\r\n // Does str represent an integer? If so, no need for the division.\r\n if (i < 0) {\r\n --e;\r\n } else {\r\n x.c = xc;\r\n x.e = e;\r\n\r\n // The sign is needed for correct rounding.\r\n x.s = sign;\r\n x = div(x, y, dp, rm, baseOut);\r\n xc = x.c;\r\n r = x.r;\r\n e = x.e;\r\n }\r\n\r\n // xc now represents str converted to baseOut.\r\n\r\n // The index of the rounding digit.\r\n d = e + dp + 1;\r\n\r\n // The rounding digit: the digit to the right of the digit that may be rounded up.\r\n i = xc[d];\r\n\r\n // Look at the rounding digits and mode to determine whether to round up.\r\n\r\n k = baseOut / 2;\r\n r = r || d < 0 || xc[d + 1] != null;\r\n\r\n r = rm < 4 ? (i != null || r) && (rm == 0 || rm == (x.s < 0 ? 3 : 2))\r\n : i > k || i == k &&(rm == 4 || r || rm == 6 && xc[d - 1] & 1 ||\r\n rm == (x.s < 0 ? 8 : 7));\r\n\r\n // If the index of the rounding digit is not greater than zero, or xc represents\r\n // zero, then the result of the base conversion is zero or, if rounding up, a value\r\n // such as 0.00001.\r\n if (d < 1 || !xc[0]) {\r\n\r\n // 1^-dp or 0\r\n str = r ? toFixedPoint(alphabet.charAt(1), -dp, alphabet.charAt(0)) : alphabet.charAt(0);\r\n } else {\r\n\r\n // Truncate xc to the required number of decimal places.\r\n xc.length = d;\r\n\r\n // Round up?\r\n if (r) {\r\n\r\n // Rounding up may mean the previous digit has to be rounded up and so on.\r\n for (--baseOut; ++xc[--d] > baseOut;) {\r\n xc[d] = 0;\r\n\r\n if (!d) {\r\n ++e;\r\n xc = [1].concat(xc);\r\n }\r\n }\r\n }\r\n\r\n // Determine trailing zeros.\r\n for (k = xc.length; !xc[--k];);\r\n\r\n // E.g. [4, 11, 15] becomes 4bf.\r\n for (i = 0, str = ''; i <= k; str += alphabet.charAt(xc[i++]));\r\n\r\n // Add leading zeros, decimal point and trailing zeros as required.\r\n str = toFixedPoint(str, e, alphabet.charAt(0));\r\n }\r\n\r\n // The caller will add the sign.\r\n return str;\r\n };\r\n })();\r\n\r\n\r\n // Perform division in the specified base. Called by div and convertBase.\r\n div = (function () {\r\n\r\n // Assume non-zero x and k.\r\n function multiply(x, k, base) {\r\n var m, temp, xlo, xhi,\r\n carry = 0,\r\n i = x.length,\r\n klo = k % SQRT_BASE,\r\n khi = k / SQRT_BASE | 0;\r\n\r\n for (x = x.slice(); i--;) {\r\n xlo = x[i] % SQRT_BASE;\r\n xhi = x[i] / SQRT_BASE | 0;\r\n m = khi * xlo + xhi * klo;\r\n temp = klo * xlo + ((m % SQRT_BASE) * SQRT_BASE) + carry;\r\n carry = (temp / base | 0) + (m / SQRT_BASE | 0) + khi * xhi;\r\n x[i] = temp % base;\r\n }\r\n\r\n if (carry) x = [carry].concat(x);\r\n\r\n return x;\r\n }\r\n\r\n function compare(a, b, aL, bL) {\r\n var i, cmp;\r\n\r\n if (aL != bL) {\r\n cmp = aL > bL ? 1 : -1;\r\n } else {\r\n\r\n for (i = cmp = 0; i < aL; i++) {\r\n\r\n if (a[i] != b[i]) {\r\n cmp = a[i] > b[i] ? 1 : -1;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return cmp;\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.splice(0, 1));\r\n }\r\n\r\n // x: dividend, y: divisor.\r\n return function (x, y, dp, rm, base) {\r\n var cmp, e, i, more, n, prod, prodL, q, qc, rem, remL, rem0, xi, xL, yc0,\r\n yL, yz,\r\n s = x.s == y.s ? 1 : -1,\r\n xc = x.c,\r\n yc = y.c;\r\n\r\n // Either NaN, Infinity or 0?\r\n if (!xc || !xc[0] || !yc || !yc[0]) {\r\n\r\n return new BigNumber(\r\n\r\n // Return NaN if either NaN, or both Infinity or 0.\r\n !x.s || !y.s || (xc ? yc && xc[0] == yc[0] : !yc) ? NaN :\r\n\r\n // Return ±0 if x is ±0 or y is ±Infinity, or return ±Infinity as y is ±0.\r\n xc && xc[0] == 0 || !yc ? s * 0 : s / 0\r\n );\r\n }\r\n\r\n q = new BigNumber(s);\r\n qc = q.c = [];\r\n e = x.e - y.e;\r\n s = dp + e + 1;\r\n\r\n if (!base) {\r\n base = BASE;\r\n e = bitFloor(x.e / LOG_BASE) - bitFloor(y.e / LOG_BASE);\r\n s = s / LOG_BASE | 0;\r\n }\r\n\r\n // Result exponent may be one less then the current value of e.\r\n // The coefficients of the BigNumbers from convertBase may have trailing zeros.\r\n for (i = 0; yc[i] == (xc[i] || 0); i++);\r\n\r\n if (yc[i] > (xc[i] || 0)) e--;\r\n\r\n if (s < 0) {\r\n qc.push(1);\r\n more = true;\r\n } else {\r\n xL = xc.length;\r\n yL = yc.length;\r\n i = 0;\r\n s += 2;\r\n\r\n // Normalise xc and yc so highest order digit of yc is >= base / 2.\r\n\r\n n = mathfloor(base / (yc[0] + 1));\r\n\r\n // Not necessary, but to handle odd bases where yc[0] == (base / 2) - 1.\r\n // if (n > 1 || n++ == 1 && yc[0] < base / 2) {\r\n if (n > 1) {\r\n yc = multiply(yc, n, base);\r\n xc = multiply(xc, n, base);\r\n yL = yc.length;\r\n xL = xc.length;\r\n }\r\n\r\n xi = yL;\r\n rem = xc.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 yz = yc.slice();\r\n yz = [0].concat(yz);\r\n yc0 = yc[0];\r\n if (yc[1] >= base / 2) yc0++;\r\n // Not necessary, but to prevent trial digit n > base, when using base 3.\r\n // else if (base == 3 && yc0 == 1) yc0 = 1 + 1e-15;\r\n\r\n do {\r\n n = 0;\r\n\r\n // Compare divisor and remainder.\r\n cmp = compare(yc, rem, yL, remL);\r\n\r\n // If divisor < remainder.\r\n if (cmp < 0) {\r\n\r\n // Calculate trial digit, n.\r\n\r\n rem0 = rem[0];\r\n if (yL != remL) rem0 = rem0 * base + (rem[1] || 0);\r\n\r\n // n is how many times the divisor goes into the current remainder.\r\n n = mathfloor(rem0 / yc0);\r\n\r\n // Algorithm:\r\n // product = divisor multiplied by trial digit (n).\r\n // Compare product and remainder.\r\n // If product is greater than remainder:\r\n // Subtract divisor from product, decrement trial digit.\r\n // Subtract product from remainder.\r\n // If product was less than remainder at the last compare:\r\n // Compare new remainder and divisor.\r\n // If remainder is greater than divisor:\r\n // Subtract divisor from remainder, increment trial digit.\r\n\r\n if (n > 1) {\r\n\r\n // n may be > base only when base is 3.\r\n if (n >= base) n = base - 1;\r\n\r\n // product = divisor * trial digit.\r\n prod = multiply(yc, n, base);\r\n prodL = prod.length;\r\n remL = rem.length;\r\n\r\n // Compare product and remainder.\r\n // If product > remainder then trial digit n too high.\r\n // n is 1 too high about 5% of the time, and is not known to have\r\n // ever been more than 1 too high.\r\n while (compare(prod, rem, prodL, remL) == 1) {\r\n n--;\r\n\r\n // Subtract divisor from product.\r\n subtract(prod, yL < prodL ? yz : yc, prodL, base);\r\n prodL = prod.length;\r\n cmp = 1;\r\n }\r\n } else {\r\n\r\n // n is 0 or 1, cmp is -1.\r\n // If n is 0, there is no need to compare yc and rem again below,\r\n // so change cmp to 1 to avoid it.\r\n // If n is 1, leave cmp as -1, so yc and rem are compared again.\r\n if (n == 0) {\r\n\r\n // divisor < remainder, so n must be at least 1.\r\n cmp = n = 1;\r\n }\r\n\r\n // product = divisor\r\n prod = yc.slice();\r\n prodL = prod.length;\r\n }\r\n\r\n if (prodL < remL) prod = [0].concat(prod);\r\n\r\n // Subtract product from remainder.\r\n subtract(rem, prod, remL, base);\r\n remL = rem.length;\r\n\r\n // If product was < remainder.\r\n if (cmp == -1) {\r\n\r\n // Compare divisor and new remainder.\r\n // If divisor < new remainder, subtract divisor from remainder.\r\n // Trial digit n too low.\r\n // n is 1 too low about 5% of the time, and very rarely 2 too low.\r\n while (compare(yc, rem, yL, remL) < 1) {\r\n n++;\r\n\r\n // Subtract divisor from remainder.\r\n subtract(rem, yL < remL ? yz : yc, remL, base);\r\n remL = rem.length;\r\n }\r\n }\r\n } else if (cmp === 0) {\r\n n++;\r\n rem = [0];\r\n } // else cmp === 1 and n will be 0\r\n\r\n // Add the next digit, n, to the result array.\r\n qc[i++] = n;\r\n\r\n // Update the remainder.\r\n if (rem[0]) {\r\n rem[remL++] = xc[xi] || 0;\r\n } else {\r\n rem = [xc[xi]];\r\n remL = 1;\r\n }\r\n } while ((xi++ < xL || rem[0] != null) && s--);\r\n\r\n more = rem[0] != null;\r\n\r\n // Leading zero?\r\n if (!qc[0]) qc.splice(0, 1);\r\n }\r\n\r\n if (base == BASE) {\r\n\r\n // To calculate q.e, first get the number of digits of qc[0].\r\n for (i = 1, s = qc[0]; s >= 10; s /= 10, i++);\r\n\r\n round(q, dp + (q.e = i + e * LOG_BASE - 1) + 1, rm, more);\r\n\r\n // Caller is convertBase.\r\n } else {\r\n q.e = e;\r\n q.r = +more;\r\n }\r\n\r\n return q;\r\n };\r\n })();\r\n\r\n\r\n /*\r\n * Return a string representing the value of BigNumber n in fixed-point or exponential\r\n * notation rounded to the specified decimal places or significant digits.\r\n *\r\n * n: a BigNumber.\r\n * i: the index of the last digit required (i.e. the digit that may be rounded up).\r\n * rm: the rounding mode.\r\n * id: 1 (toExponential) or 2 (toPrecision).\r\n */\r\n function format(n, i, rm, id) {\r\n var c0, e, ne, len, str;\r\n\r\n if (rm == null) rm = ROUNDING_MODE;\r\n else intCheck(rm, 0, 8);\r\n\r\n if (!n.c) return n.toString();\r\n\r\n c0 = n.c[0];\r\n ne = n.e;\r\n\r\n if (i == null) {\r\n str = coeffToString(n.c);\r\n str = id == 1 || id == 2 && (ne <= TO_EXP_NEG || ne >= TO_EXP_POS)\r\n ? toExponential(str, ne)\r\n : toFixedPoint(str, ne, '0');\r\n } else {\r\n n = round(new BigNumber(n), i, rm);\r\n\r\n // n.e may have changed if the value was rounded up.\r\n e = n.e;\r\n\r\n str = coeffToString(n.c);\r\n len = str.length;\r\n\r\n // toPrecision returns exponential notation if the number of significant digits\r\n // specified is less than the number of digits necessary to represent the integer\r\n // part of the value in fixed-point notation.\r\n\r\n // Exponential notation.\r\n if (id == 1 || id == 2 && (i <= e || e <= TO_EXP_NEG)) {\r\n\r\n // Append zeros?\r\n for (; len < i; str += '0', len++);\r\n str = toExponential(str, e);\r\n\r\n // Fixed-point notation.\r\n } else {\r\n i -= ne + (id === 2 && e > ne);\r\n str = toFixedPoint(str, e, '0');\r\n\r\n // Append zeros?\r\n if (e + 1 > len) {\r\n if (--i > 0) for (str += '.'; i--; str += '0');\r\n } else {\r\n i += e - len;\r\n if (i > 0) {\r\n if (e + 1 == len) str += '.';\r\n for (; i--; str += '0');\r\n }\r\n }\r\n }\r\n }\r\n\r\n return n.s < 0 && c0 ? '-' + str : str;\r\n }\r\n\r\n\r\n // Handle BigNumber.max and BigNumber.min.\r\n // If any number is NaN, return NaN.\r\n function maxOrMin(args, n) {\r\n var k, y,\r\n i = 1,\r\n x = new BigNumber(args[0]);\r\n\r\n for (; i < args.length; i++) {\r\n y = new BigNumber(args[i]);\r\n if (!y.s || (k = compare(x, y)) === 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 * Strip trailing zeros, calculate base 10 exponent and check against MIN_EXP and MAX_EXP.\r\n * Called by minus, plus and times.\r\n */\r\n function normalise(n, c, e) {\r\n var i = 1,\r\n j = c.length;\r\n\r\n // Remove trailing zeros.\r\n for (; !c[--j]; c.pop());\r\n\r\n // Calculate the base 10 exponent. First get the number of digits of c[0].\r\n for (j = c[0]; j >= 10; j /= 10, i++);\r\n\r\n // Overflow?\r\n if ((e = i + e * LOG_BASE - 1) > MAX_EXP) {\r\n\r\n // Infinity.\r\n n.c = n.e = null;\r\n\r\n // Underflow?\r\n } else if (e < MIN_EXP) {\r\n\r\n // Zero.\r\n n.c = [n.e = 0];\r\n } else {\r\n n.e = e;\r\n n.c = c;\r\n }\r\n\r\n return n;\r\n }\r\n\r\n\r\n // Handle values that fail the validity test in BigNumber.\r\n parseNumeric = (function () {\r\n var basePrefix = /^(-?)0([xbo])(?=\\w[\\w.]*$)/i,\r\n dotAfter = /^([^.]+)\\.$/,\r\n dotBefore = /^\\.([^.]+)$/,\r\n isInfinityOrNaN = /^-?(Infinity|NaN)$/,\r\n whitespaceOrPlus = /^\\s*\\+(?=[\\w.])|^\\s+|\\s+$/g;\r\n\r\n return function (x, str, isNum, b) {\r\n var base,\r\n s = isNum ? str : str.replace(whitespaceOrPlus, '');\r\n\r\n // No exception on ±Infinity or NaN.\r\n if (isInfinityOrNaN.test(s)) {\r\n x.s = isNaN(s) ? null : s < 0 ? -1 : 1;\r\n } else {\r\n if (!isNum) {\r\n\r\n // basePrefix = /^(-?)0([xbo])(?=\\w[\\w.]*$)/i\r\n s = s.replace(basePrefix, function (m, p1, p2) {\r\n base = (p2 = p2.toLowerCase()) == 'x' ? 16 : p2 == 'b' ? 2 : 8;\r\n return !b || b == base ? p1 : m;\r\n });\r\n\r\n if (b) {\r\n base = b;\r\n\r\n // E.g. '1.' to '1', '.1' to '0.1'\r\n s = s.replace(dotAfter, '$1').replace(dotBefore, '0.$1');\r\n }\r\n\r\n if (str != s) return new BigNumber(s, base);\r\n }\r\n\r\n // '[BigNumber Error] Not a number: {n}'\r\n // '[BigNumber Error] Not a base {b} number: {n}'\r\n if (BigNumber.DEBUG) {\r\n throw Error\r\n (bignumberError + 'Not a' + (b ? ' base ' + b : '') + ' number: ' + str);\r\n }\r\n\r\n // NaN\r\n x.s = null;\r\n }\r\n\r\n x.c = x.e = null;\r\n }\r\n })();\r\n\r\n\r\n /*\r\n * Round x to sd significant digits using rounding mode rm. Check for over/under-flow.\r\n * If r is truthy, it is known that there are more digits after the rounding digit.\r\n */\r\n function round(x, sd, rm, r) {\r\n var d, i, j, k, n, ni, rd,\r\n xc = x.c,\r\n pows10 = POWS_TEN;\r\n\r\n // if x is not Infinity or NaN...\r\n if (xc) {\r\n\r\n // rd is the rounding digit, i.e. the digit after the digit that may be rounded up.\r\n // n is a base 1e14 number, the value of the element of array x.c containing rd.\r\n // ni is the index of n within x.c.\r\n // d is the number of digits of n.\r\n // i is the index of rd within n including leading zeros.\r\n // j is the actual index of rd within n (if < 0, rd is a leading zero).\r\n out: {\r\n\r\n // Get the number of digits of the first element of xc.\r\n for (d = 1, k = xc[0]; k >= 10; k /= 10, d++);\r\n i = sd - d;\r\n\r\n // If the rounding digit is in the first element of xc...\r\n if (i < 0) {\r\n i += LOG_BASE;\r\n j = sd;\r\n n = xc[ni = 0];\r\n\r\n // Get the rounding digit at index j of n.\r\n rd = mathfloor(n / pows10[d - j - 1] % 10);\r\n } else {\r\n ni = mathceil((i + 1) / LOG_BASE);\r\n\r\n if (ni >= xc.length) {\r\n\r\n if (r) {\r\n\r\n // Needed by sqrt.\r\n for (; xc.length <= ni; xc.push(0));\r\n n = rd = 0;\r\n d = 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 n = k = xc[ni];\r\n\r\n // Get the number of digits of n.\r\n for (d = 1; k >= 10; k /= 10, d++);\r\n\r\n // Get the index of rd within n.\r\n i %= LOG_BASE;\r\n\r\n // Get the index of rd within n, adjusted for leading zeros.\r\n // The number of leading zeros of n is given by LOG_BASE - d.\r\n j = i - LOG_BASE + d;\r\n\r\n // Get the rounding digit at index j of n.\r\n rd = j < 0 ? 0 : mathfloor(n / pows10[d - j - 1] % 10);\r\n }\r\n }\r\n\r\n r = r || sd < 0 ||\r\n\r\n // Are there any non-zero digits after the rounding digit?\r\n // The expression n % pows10[d - j - 1] returns all digits of n to the right\r\n // of the digit at j, e.g. if n is 908714 and j is 2, the expression gives 714.\r\n xc[ni + 1] != null || (j < 0 ? n : n % pows10[d - j - 1]);\r\n\r\n r = rm < 4\r\n ? (rd || r) && (rm == 0 || rm == (x.s < 0 ? 3 : 2))\r\n : rd > 5 || rd == 5 && (rm == 4 || r || 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 ? n / pows10[d - j] : 0 : xc[ni - 1]) % 10) & 1 ||\r\n rm == (x.s < 0 ? 8 : 7));\r\n\r\n if (sd < 1 || !xc[0]) {\r\n xc.length = 0;\r\n\r\n if (r) {\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 xc[0] = pows10[(LOG_BASE - sd % LOG_BASE) % LOG_BASE];\r\n x.e = -sd || 0;\r\n } else {\r\n\r\n // Zero.\r\n xc[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 xc.length = ni;\r\n k = 1;\r\n ni--;\r\n } else {\r\n xc.length = ni + 1;\r\n k = pows10[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 n.\r\n xc[ni] = j > 0 ? mathfloor(n / pows10[d - j] % pows10[j]) * k : 0;\r\n }\r\n\r\n // Round up?\r\n if (r) {\r\n\r\n for (; ;) {\r\n\r\n // If the digit to be rounded up is in the first element of xc...\r\n if (ni == 0) {\r\n\r\n // i will be the length of xc[0] before k is added.\r\n for (i = 1, j = xc[0]; j >= 10; j /= 10, i++);\r\n j = xc[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 (xc[0] == BASE) xc[0] = 1;\r\n }\r\n\r\n break;\r\n } else {\r\n xc[ni] += k;\r\n if (xc[ni] != BASE) break;\r\n xc[ni--] = 0;\r\n k = 1;\r\n }\r\n }\r\n }\r\n\r\n // Remove trailing zeros.\r\n for (i = xc.length; xc[--i] === 0; xc.pop());\r\n }\r\n\r\n // Overflow? Infinity.\r\n if (x.e > MAX_EXP) {\r\n x.c = x.e = null;\r\n\r\n // Underflow? Zero.\r\n } else if (x.e < MIN_EXP) {\r\n x.c = [x.e = 0];\r\n }\r\n }\r\n\r\n return x;\r\n }\r\n\r\n\r\n function valueOf(n) {\r\n var str,\r\n e = n.e;\r\n\r\n if (e === null) return n.toString();\r\n\r\n str = coeffToString(n.c);\r\n\r\n str = e <= TO_EXP_NEG || e >= TO_EXP_POS\r\n ? toExponential(str, e)\r\n : toFixedPoint(str, e, '0');\r\n\r\n return n.s < 0 ? '-' + str : str;\r\n }\r\n\r\n\r\n // PROTOTYPE/INSTANCE METHODS\r\n\r\n\r\n /*\r\n * Return a new BigNumber whose value is the absolute value of this BigNumber.\r\n */\r\n P.absoluteValue = P.abs = function () {\r\n var x = new BigNumber(this);\r\n if (x.s < 0) x.s = 1;\r\n return x;\r\n };\r\n\r\n\r\n /*\r\n * Return\r\n * 1 if the value of this BigNumber is greater than the value of BigNumber(y, b),\r\n * -1 if the value of this BigNumber is less than the value of BigNumber(y, b),\r\n * 0 if they have the same value,\r\n * or null if the value of either is NaN.\r\n */\r\n P.comparedTo = function (y, b) {\r\n return compare(this, new BigNumber(y, b));\r\n };\r\n\r\n\r\n /*\r\n * If dp is undefined or null or true or false, return the number of decimal places of the\r\n * value of this BigNumber, or null if the value of this BigNumber is ±Infinity or NaN.\r\n *\r\n * Otherwise, if dp is a number, return a new BigNumber whose value is the value of this\r\n * BigNumber rounded to a maximum of dp decimal places using rounding mode rm, or\r\n * ROUNDING_MODE if rm is omitted.\r\n *\r\n * [dp] {number} Decimal places: integer, 0 to MAX inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {dp|rm}'\r\n */\r\n P.decimalPlaces = P.dp = function (dp, rm) {\r\n var c, n, v,\r\n x = this;\r\n\r\n if (dp != null) {\r\n intCheck(dp, 0, MAX);\r\n if (rm == null) rm = ROUNDING_MODE;\r\n else intCheck(rm, 0, 8);\r\n\r\n return round(new BigNumber(x), dp + x.e + 1, rm);\r\n }\r\n\r\n if (!(c = x.c)) return null;\r\n n = ((v = c.length - 1) - bitFloor(this.e / LOG_BASE)) * LOG_BASE;\r\n\r\n // Subtract the number of trailing zeros of the last number.\r\n if (v = c[v]) for (; v % 10 == 0; v /= 10, n--);\r\n if (n < 0) n = 0;\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 BigNumber whose value is the value of this BigNumber divided by the value of\r\n * BigNumber(y, b), rounded according to DECIMAL_PLACES and ROUNDING_MODE.\r\n */\r\n P.dividedBy = P.div = function (y, b) {\r\n return div(this, new BigNumber(y, b), DECIMAL_PLACES, ROUNDING_MODE);\r\n };\r\n\r\n\r\n /*\r\n * Return a new BigNumber whose value is the integer part of dividing the value of this\r\n * BigNumber by the value of BigNumber(y, b).\r\n */\r\n P.dividedToIntegerBy = P.idiv = function (y, b) {\r\n return div(this, new BigNumber(y, b), 0, 1);\r\n };\r\n\r\n\r\n /*\r\n * Return a BigNumber whose value is the value of this BigNumber exponentiated by n.\r\n *\r\n * If m is present, return the result modulo m.\r\n * If n is negative round according to DECIMAL_PLACES and ROUNDING_MODE.\r\n * If POW_PRECISION is non-zero and m is not present, round to POW_PRECISION using ROUNDING_MODE.\r\n *\r\n * The modular power operation works efficiently when x, n, and m are integers, otherwise it\r\n * is equivalent to calculating x.exponentiatedBy(n).modulo(m) with a POW_PRECISION of 0.\r\n *\r\n * n {number|string|BigNumber} The exponent. An integer.\r\n * [m] {number|string|BigNumber} The modulus.\r\n *\r\n * '[BigNumber Error] Exponent not an integer: {n}'\r\n */\r\n P.exponentiatedBy = P.pow = function (n, m) {\r\n var half, isModExp, i, k, more, nIsBig, nIsNeg, nIsOdd, y,\r\n x = this;\r\n\r\n n = new BigNumber(n);\r\n\r\n // Allow NaN and ±Infinity, but not other non-integers.\r\n if (n.c && !n.isInteger()) {\r\n throw Error\r\n (bignumberError + 'Exponent not an integer: ' + valueOf(n));\r\n }\r\n\r\n if (m != null) m = new BigNumber(m);\r\n\r\n // Exponent of MAX_SAFE_INTEGER is 15.\r\n nIsBig = n.e > 14;\r\n\r\n // If x is NaN, ±Infinity, ±0 or ±1, or n is ±Infinity, NaN or ±0.\r\n if (!x.c || !x.c[0] || x.c[0] == 1 && !x.e && x.c.length == 1 || !n.c || !n.c[0]) {\r\n\r\n // The sign of the result of pow when x is negative depends on the evenness of n.\r\n // If +n overflows to ±Infinity, the evenness of n would be not be known.\r\n y = new BigNumber(Math.pow(+valueOf(x), nIsBig ? n.s * (2 - isOdd(n)) : +valueOf(n)));\r\n return m ? y.mod(m) : y;\r\n }\r\n\r\n nIsNeg = n.s < 0;\r\n\r\n if (m) {\r\n\r\n // x % m returns NaN if abs(m) is zero, or m is NaN.\r\n if (m.c ? !m.c[0] : !m.s) return new BigNumber(NaN);\r\n\r\n isModExp = !nIsNeg && x.isInteger() && m.isInteger();\r\n\r\n if (isModExp) x = x.mod(m);\r\n\r\n // Overflow to ±Infinity: >=2**1e10 or >=1.0000024**1e15.\r\n // Underflow to ±0: <=0.79**1e10 or <=0.9999975**1e15.\r\n } else if (n.e > 9 && (x.e > 0 || x.e < -1 || (x.e == 0\r\n // [1, 240000000]\r\n ? x.c[0] > 1 || nIsBig && x.c[1] >= 24e7\r\n // [80000000000000] [99999750000000]\r\n : x.c[0] < 8e13 || nIsBig && x.c[0] <= 9999975e7))) {\r\n\r\n // If x is negative and n is odd, k = -0, else k = 0.\r\n k = x.s < 0 && isOdd(n) ? -0 : 0;\r\n\r\n // If x >= 1, k = ±Infinity.\r\n if (x.e > -1) k = 1 / k;\r\n\r\n // If n is negative return ±0, else return ±Infinity.\r\n return new BigNumber(nIsNeg ? 1 / k : k);\r\n\r\n } else if (POW_PRECISION) {\r\n\r\n // Truncating each coefficient array to a length of k after each multiplication\r\n // equates to truncating significant digits to POW_PRECISION + [28, 41],\r\n // i.e. there will be a minimum of 28 guard digits retained.\r\n k = mathceil(POW_PRECISION / LOG_BASE + 2);\r\n }\r\n\r\n if (nIsBig) {\r\n half = new BigNumber(0.5);\r\n if (nIsNeg) n.s = 1;\r\n nIsOdd = isOdd(n);\r\n } else {\r\n i = Math.abs(+valueOf(n));\r\n nIsOdd = i % 2;\r\n }\r\n\r\n y = new BigNumber(ONE);\r\n\r\n // Performs 54 loop iterations for n of 9007199254740991.\r\n for (; ;) {\r\n\r\n if (nIsOdd) {\r\n y = y.times(x);\r\n if (!y.c) break;\r\n\r\n if (k) {\r\n if (y.c.length > k) y.c.length = k;\r\n } else if (isModExp) {\r\n y = y.mod(m); //y = y.minus(div(y, m, 0, MODULO_MODE).times(m));\r\n }\r\n }\r\n\r\n if (i) {\r\n i = mathfloor(i / 2);\r\n if (i === 0) break;\r\n nIsOdd = i % 2;\r\n } else {\r\n n = n.times(half);\r\n round(n, n.e + 1, 1);\r\n\r\n if (n.e > 14) {\r\n nIsOdd = isOdd(n);\r\n } else {\r\n i = +valueOf(n);\r\n if (i === 0) break;\r\n nIsOdd = i % 2;\r\n }\r\n }\r\n\r\n x = x.times(x);\r\n\r\n if (k) {\r\n if (x.c && x.c.length > k) x.c.length = k;\r\n } else if (isModExp) {\r\n x = x.mod(m); //x = x.minus(div(x, m, 0, MODULO_MODE).times(m));\r\n }\r\n }\r\n\r\n if (isModExp) return y;\r\n if (nIsNeg) y = ONE.div(y);\r\n\r\n return m ? y.mod(m) : k ? round(y, POW_PRECISION, ROUNDING_MODE, more) : y;\r\n };\r\n\r\n\r\n /*\r\n * Return a new BigNumber whose value is the value of this BigNumber rounded to an integer\r\n * using rounding mode rm, or ROUNDING_MODE if rm is omitted.\r\n *\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {rm}'\r\n */\r\n P.integerValue = function (rm) {\r\n var n = new BigNumber(this);\r\n if (rm == null) rm = ROUNDING_MODE;\r\n else intCheck(rm, 0, 8);\r\n return round(n, n.e + 1, rm);\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this BigNumber is equal to the value of BigNumber(y, b),\r\n * otherwise return false.\r\n */\r\n P.isEqualTo = P.eq = function (y, b) {\r\n return compare(this, new BigNumber(y, b)) === 0;\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this BigNumber is a finite number, otherwise return false.\r\n */\r\n P.isFinite = function () {\r\n return !!this.c;\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this BigNumber is greater than the value of BigNumber(y, b),\r\n * otherwise return false.\r\n */\r\n P.isGreaterThan = P.gt = function (y, b) {\r\n return compare(this, new BigNumber(y, b)) > 0;\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this BigNumber is greater than or equal to the value of\r\n * BigNumber(y, b), otherwise return false.\r\n */\r\n P.isGreaterThanOrEqualTo = P.gte = function (y, b) {\r\n return (b = compare(this, new BigNumber(y, b))) === 1 || b === 0;\r\n\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this BigNumber is an integer, otherwise return false.\r\n */\r\n P.isInteger = function () {\r\n return !!this.c && bitFloor(this.e / LOG_BASE) > this.c.length - 2;\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this BigNumber is less than the value of BigNumber(y, b),\r\n * otherwise return false.\r\n */\r\n P.isLessThan = P.lt = function (y, b) {\r\n return compare(this, new BigNumber(y, b)) < 0;\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this BigNumber is less than or equal to the value of\r\n * BigNumber(y, b), otherwise return false.\r\n */\r\n P.isLessThanOrEqualTo = P.lte = function (y, b) {\r\n return (b = compare(this, new BigNumber(y, b))) === -1 || b === 0;\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this BigNumber is NaN, otherwise return false.\r\n */\r\n P.isNaN = function () {\r\n return !this.s;\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this BigNumber is negative, otherwise return false.\r\n */\r\n P.isNegative = function () {\r\n return this.s < 0;\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this BigNumber is positive, otherwise return false.\r\n */\r\n P.isPositive = function () {\r\n return this.s > 0;\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this BigNumber is 0 or -0, otherwise return false.\r\n */\r\n P.isZero = function () {\r\n return !!this.c && this.c[0] == 0;\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 BigNumber whose value is the value of this BigNumber minus the value of\r\n * BigNumber(y, b).\r\n */\r\n P.minus = function (y, b) {\r\n var i, j, t, xLTy,\r\n x = this,\r\n a = x.s;\r\n\r\n y = new BigNumber(y, b);\r\n b = y.s;\r\n\r\n // Either NaN?\r\n if (!a || !b) return new BigNumber(NaN);\r\n\r\n // Signs differ?\r\n if (a != b) {\r\n y.s = -b;\r\n return x.plus(y);\r\n }\r\n\r\n var xe = x.e / LOG_BASE,\r\n ye = y.e / LOG_BASE,\r\n xc = x.c,\r\n yc = y.c;\r\n\r\n if (!xe || !ye) {\r\n\r\n // Either Infinity?\r\n if (!xc || !yc) return xc ? (y.s = -b, y) : new BigNumber(yc ? x : NaN);\r\n\r\n // Either zero?\r\n if (!xc[0] || !yc[0]) {\r\n\r\n // Return y if y is non-zero, x if x is non-zero, or zero if both are zero.\r\n return yc[0] ? (y.s = -b, y) : new BigNumber(xc[0] ? x :\r\n\r\n // IEEE 754 (2008) 6.3: n - n = -0 when rounding to -Infinity\r\n ROUNDING_MODE == 3 ? -0 : 0);\r\n }\r\n }\r\n\r\n xe = bitFloor(xe);\r\n ye = bitFloor(ye);\r\n xc = xc.slice();\r\n\r\n // Determine which is the bigger number.\r\n if (a = xe - ye) {\r\n\r\n if (xLTy = a < 0) {\r\n a = -a;\r\n t = xc;\r\n } else {\r\n ye = xe;\r\n t = yc;\r\n }\r\n\r\n t.reverse();\r\n\r\n // Prepend zeros to equalise exponents.\r\n for (b = a; b--; t.push(0));\r\n t.reverse();\r\n } else {\r\n\r\n // Exponents equal. Check digit by digit.\r\n j = (xLTy = (a = xc.length) < (b = yc.length)) ? a : b;\r\n\r\n for (a = b = 0; b < j; b++) {\r\n\r\n if (xc[b] != yc[b]) {\r\n xLTy = xc[b] < yc[b];\r\n break;\r\n }\r\n }\r\n }\r\n\r\n // x < y? Point xc to the array of the bigger number.\r\n if (xLTy) {\r\n t = xc;\r\n xc = yc;\r\n yc = t;\r\n y.s = -y.s;\r\n }\r\n\r\n b = (j = yc.length) - (i = xc.length);\r\n\r\n // Append zeros to xc if shorter.\r\n // No need to add zeros to yc if shorter as subtract only needs to start at yc.length.\r\n if (b > 0) for (; b--; xc[i++] = 0);\r\n b = BASE - 1;\r\n\r\n // Subtract yc from xc.\r\n for (; j > a;) {\r\n\r\n if (xc[--j] < yc[j]) {\r\n for (i = j; i && !xc[--i]; xc[i] = b);\r\n --xc[i];\r\n xc[j] += BASE;\r\n }\r\n\r\n xc[j] -= yc[j];\r\n }\r\n\r\n // Remove leading zeros and adjust exponent accordingly.\r\n for (; xc[0] == 0; xc.splice(0, 1), --ye);\r\n\r\n // Zero?\r\n if (!xc[0]) {\r\n\r\n // Following IEEE 754 (2008) 6.3,\r\n // n - n = +0 but n - n = -0 when rounding towards -Infinity.\r\n y.s = ROUNDING_MODE == 3 ? -1 : 1;\r\n y.c = [y.e = 0];\r\n return y;\r\n }\r\n\r\n // No need to check for Infinity as +x - +y != Infinity && -x - -y != Infinity\r\n // for finite x and y.\r\n return normalise(y, xc, ye);\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 BigNumber whose value is the value of this BigNumber modulo the value of\r\n * BigNumber(y, b). The result depends on the value of MODULO_MODE.\r\n */\r\n P.modulo = P.mod = function (y, b) {\r\n var q, s,\r\n x = this;\r\n\r\n y = new BigNumber(y, b);\r\n\r\n // Return NaN if x is Infinity or NaN, or y is NaN or zero.\r\n if (!x.c || !y.s || y.c && !y.c[0]) {\r\n return new BigNumber(NaN);\r\n\r\n // Return x if y is Infinity or x is zero.\r\n } else if (!y.c || x.c && !x.c[0]) {\r\n return new BigNumber(x);\r\n }\r\n\r\n if (MODULO_MODE == 9) {\r\n\r\n // Euclidian division: q = sign(y) * floor(x / abs(y))\r\n // r = x - qy where 0 <= r < abs(y)\r\n s = y.s;\r\n y.s = 1;\r\n q = div(x, y, 0, 3);\r\n y.s = s;\r\n q.s *= s;\r\n } else {\r\n q = div(x, y, 0, MODULO_MODE);\r\n }\r\n\r\n y = x.minus(q.times(y));\r\n\r\n // To match JavaScript %, ensure sign of zero is sign of dividend.\r\n if (!y.c[0] && MODULO_MODE == 1) y.s = x.s;\r\n\r\n return y;\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 BigNumber whose value is the value of this BigNumber multiplied by the value\r\n * of BigNumber(y, b).\r\n */\r\n P.multipliedBy = P.times = function (y, b) {\r\n var c, e, i, j, k, m, xcL, xlo, xhi, ycL, ylo, yhi, zc,\r\n base, sqrtBase,\r\n x = this,\r\n xc = x.c,\r\n yc = (y = new BigNumber(y, b)).c;\r\n\r\n // Either NaN, ±Infinity or ±0?\r\n if (!xc || !yc || !xc[0] || !yc[0]) {\r\n\r\n // Return NaN if either is NaN, or one is 0 and the other is Infinity.\r\n if (!x.s || !y.s || xc && !xc[0] && !yc || yc && !yc[0] && !xc) {\r\n y.c = y.e = y.s = null;\r\n } else {\r\n y.s *= x.s;\r\n\r\n // Return ±Infinity if either is ±Infinity.\r\n if (!xc || !yc) {\r\n y.c = y.e = null;\r\n\r\n // Return ±0 if either is ±0.\r\n } else {\r\n y.c = [0];\r\n y.e = 0;\r\n }\r\n }\r\n\r\n return y;\r\n }\r\n\r\n e = bitFloor(x.e / LOG_BASE) + bitFloor(y.e / LOG_BASE);\r\n y.s *= x.s;\r\n xcL = xc.length;\r\n ycL = yc.length;\r\n\r\n // Ensure xc points to longer array and xcL to its length.\r\n if (xcL < ycL) {\r\n zc = xc;\r\n xc = yc;\r\n yc = zc;\r\n i = xcL;\r\n xcL = ycL;\r\n ycL = i;\r\n }\r\n\r\n // Initialise the result array with zeros.\r\n for (i = xcL + ycL, zc = []; i--; zc.push(0));\r\n\r\n base = BASE;\r\n sqrtBase = SQRT_BASE;\r\n\r\n for (i = ycL; --i >= 0;) {\r\n c = 0;\r\n ylo = yc[i] % sqrtBase;\r\n yhi = yc[i] / sqrtBase | 0;\r\n\r\n for (k = xcL, j = i + k; j > i;) {\r\n xlo = xc[--k] % sqrtBase;\r\n xhi = xc[k] / sqrtBase | 0;\r\n m = yhi * xlo + xhi * ylo;\r\n xlo = ylo * xlo + ((m % sqrtBase) * sqrtBase) + zc[j] + c;\r\n c = (xlo / base | 0) + (m / sqrtBase | 0) + yhi * xhi;\r\n zc[j--] = xlo % base;\r\n }\r\n\r\n zc[j] = c;\r\n }\r\n\r\n if (c) {\r\n ++e;\r\n } else {\r\n zc.splice(0, 1);\r\n }\r\n\r\n return normalise(y, zc, e);\r\n };\r\n\r\n\r\n /*\r\n * Return a new BigNumber whose value is the value of this BigNumber negated,\r\n * i.e. multiplied by -1.\r\n */\r\n P.negated = function () {\r\n var x = new BigNumber(this);\r\n x.s = -x.s || null;\r\n return 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 BigNumber whose value is the value of this BigNumber plus the value of\r\n * BigNumber(y, b).\r\n */\r\n P.plus = function (y, b) {\r\n var t,\r\n x = this,\r\n a = x.s;\r\n\r\n y = new BigNumber(y, b);\r\n b = y.s;\r\n\r\n // Either NaN?\r\n if (!a || !b) return new BigNumber(NaN);\r\n\r\n // Signs differ?\r\n if (a != b) {\r\n y.s = -b;\r\n return x.minus(y);\r\n }\r\n\r\n var xe = x.e / LOG_BASE,\r\n ye = y.e / LOG_BASE,\r\n xc = x.c,\r\n yc = y.c;\r\n\r\n if (!xe || !ye) {\r\n\r\n // Return ±Infinity if either ±Infinity.\r\n if (!xc || !yc) return new BigNumber(a / 0);\r\n\r\n // Either zero?\r\n // Return y if y is non-zero, x if x is non-zero, or zero if both are zero.\r\n if (!xc[0] || !yc[0]) return yc[0] ? y : new BigNumber(xc[0] ? x : a * 0);\r\n }\r\n\r\n xe = bitFloor(xe);\r\n ye = bitFloor(ye);\r\n xc = xc.slice();\r\n\r\n // Prepend zeros to equalise exponents. Faster to use reverse then do unshifts.\r\n if (a = xe - ye) {\r\n if (a > 0) {\r\n ye = xe;\r\n t = yc;\r\n } else {\r\n a = -a;\r\n t = xc;\r\n }\r\n\r\n t.reverse();\r\n for (; a--; t.push(0));\r\n t.reverse();\r\n }\r\n\r\n a = xc.length;\r\n b = yc.length;\r\n\r\n // Point xc to the longer array, and b to the shorter length.\r\n if (a - b < 0) {\r\n t = yc;\r\n yc = xc;\r\n xc = t;\r\n b = a;\r\n }\r\n\r\n // Only start adding at yc.length - 1 as the further digits of xc can be ignored.\r\n for (a = 0; b;) {\r\n a = (xc[--b] = xc[b] + yc[b] + a) / BASE | 0;\r\n xc[b] = BASE === xc[b] ? 0 : xc[b] % BASE;\r\n }\r\n\r\n if (a) {\r\n xc = [a].concat(xc);\r\n ++ye;\r\n }\r\n\r\n // No need to check for zero, as +x + +y != 0 && -x + -y != 0\r\n // ye = MAX_EXP + 1 possible\r\n return normalise(y, xc, ye);\r\n };\r\n\r\n\r\n /*\r\n * If sd is undefined or null or true or false, return the number of significant digits of\r\n * the value of this BigNumber, or null if the value of this BigNumber is ±Infinity or NaN.\r\n * If sd is true include integer-part trailing zeros in the count.\r\n *\r\n * Otherwise, if sd is a number, return a new BigNumber whose value is the value of this\r\n * BigNumber rounded to a maximum of sd significant digits using rounding mode rm, or\r\n * ROUNDING_MODE if rm is omitted.\r\n *\r\n * sd {number|boolean} number: significant digits: integer, 1 to MAX inclusive.\r\n * boolean: whether to count integer-part trailing zeros: true or false.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {sd|rm}'\r\n */\r\n P.precision = P.sd = function (sd, rm) {\r\n var c, n, v,\r\n x = this;\r\n\r\n if (sd != null && sd !== !!sd) {\r\n intCheck(sd, 1, MAX);\r\n if (rm == null) rm = ROUNDING_MODE;\r\n else intCheck(rm, 0, 8);\r\n\r\n return round(new BigNumber(x), sd, rm);\r\n }\r\n\r\n if (!(c = x.c)) return null;\r\n v = c.length - 1;\r\n n = v * LOG_BASE + 1;\r\n\r\n if (v = c[v]) {\r\n\r\n // Subtract the number of trailing zeros of the last element.\r\n for (; v % 10 == 0; v /= 10, n--);\r\n\r\n // Add the number of digits of the first element.\r\n for (v = c[0]; v >= 10; v /= 10, n++);\r\n }\r\n\r\n if (sd && x.e + 1 > n) n = x.e + 1;\r\n\r\n return n;\r\n };\r\n\r\n\r\n /*\r\n * Return a new BigNumber whose value is the value of this BigNumber shifted by k places\r\n * (powers of 10). Shift to the right if n > 0, and to the left if n < 0.\r\n *\r\n * k {number} Integer, -MAX_SAFE_INTEGER to MAX_SAFE_INTEGER inclusive.\r\n *\r\n * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {k}'\r\n */\r\n P.shiftedBy = function (k) {\r\n intCheck(k, -MAX_SAFE_INTEGER, MAX_SAFE_INTEGER);\r\n return this.times('1e' + k);\r\n };\r\n\r\n\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 * Return a new BigNumber whose value is the square root of the value of this BigNumber,\r\n * rounded according to DECIMAL_PLACES and ROUNDING_MODE.\r\n */\r\n P.squareRoot = P.sqrt = function () {\r\n var m, n, r, rep, t,\r\n x = this,\r\n c = x.c,\r\n s = x.s,\r\n e = x.e,\r\n dp = DECIMAL_PLACES + 4,\r\n half = new BigNumber('0.5');\r\n\r\n // Negative/NaN/Infinity/zero?\r\n if (s !== 1 || !c || !c[0]) {\r\n return new BigNumber(!s || s < 0 && (!c || c[0]) ? NaN : c ? x : 1 / 0);\r\n }\r\n\r\n // Initial estimate.\r\n s = Math.sqrt(+valueOf(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 = coeffToString(c);\r\n if ((n.length + e) % 2 == 0) n += '0';\r\n s = Math.sqrt(+n);\r\n e = bitFloor((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 BigNumber(n);\r\n } else {\r\n r = new BigNumber(s + '');\r\n }\r\n\r\n // Check for zero.\r\n // r could be zero if MIN_EXP is changed after the this value was created.\r\n // This would cause a division by zero (x/t) and hence Infinity below, which would cause\r\n // coeffToString to throw.\r\n if (r.c[0]) {\r\n e = r.e;\r\n s = e + dp;\r\n if (s < 3) s = 0;\r\n\r\n // Newton-Raphson iteration.\r\n for (; ;) {\r\n t = r;\r\n r = half.times(t.plus(div(x, t, dp, 1)));\r\n\r\n if (coeffToString(t.c).slice(0, s) === (n = coeffToString(r.c)).slice(0, s)) {\r\n\r\n // The exponent of r may here be one less than the final result exponent,\r\n // e.g 0.0009999 (e-4) --> 0.001 (e-3), so adjust s so the rounding digits\r\n // are indexed correctly.\r\n if (r.e < e) --s;\r\n n = n.slice(s - 3, s + 1);\r\n\r\n // The 4th rounding digit may be in error by -1 so if the 4 rounding digits\r\n // are 9999 or 4999 (i.e. approaching a rounding boundary) continue the\r\n // 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\r\n // exact result as the nines may infinitely repeat.\r\n if (!rep) {\r\n round(t, t.e + DECIMAL_PLACES + 2, 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 dp += 4;\r\n s += 4;\r\n rep = 1;\r\n } else {\r\n\r\n // If rounding digits are null, 0{0,4} or 50{0,3}, check for exact\r\n // result. 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 round(r, r.e + DECIMAL_PLACES + 2, 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\r\n return round(r, r.e + DECIMAL_PLACES + 1, ROUNDING_MODE, m);\r\n };\r\n\r\n\r\n /*\r\n * Return a string representing the value of this BigNumber in exponential notation and\r\n * rounded using ROUNDING_MODE to dp fixed decimal places.\r\n *\r\n * [dp] {number} Decimal places. Integer, 0 to MAX inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {dp|rm}'\r\n */\r\n P.toExponential = function (dp, rm) {\r\n if (dp != null) {\r\n intCheck(dp, 0, MAX);\r\n dp++;\r\n }\r\n return format(this, dp, rm, 1);\r\n };\r\n\r\n\r\n /*\r\n * Return a string representing the value of this BigNumber in fixed-point notation rounding\r\n * to dp fixed decimal places using rounding mode rm, or ROUNDING_MODE if rm is omitted.\r\n *\r\n * Note: as with JavaScript's number type, (-0).toFixed(0) is '0',\r\n * but e.g. (-0.00001).toFixed(0) is '-0'.\r\n *\r\n * [dp] {number} Decimal places. Integer, 0 to MAX inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {dp|rm}'\r\n */\r\n P.toFixed = function (dp, rm) {\r\n if (dp != null) {\r\n intCheck(dp, 0, MAX);\r\n dp = dp + this.e + 1;\r\n }\r\n return format(this, dp, rm);\r\n };\r\n\r\n\r\n /*\r\n * Return a string representing the value of this BigNumber in fixed-point notation rounded\r\n * using rm or ROUNDING_MODE to dp decimal places, and formatted according to the properties\r\n * of the format or FORMAT object (see BigNumber.set).\r\n *\r\n * The formatting object may contain some or all of the properties shown below.\r\n *\r\n * FORMAT = {\r\n * prefix: '',\r\n * groupSize: 3,\r\n * secondaryGroupSize: 0,\r\n * groupSeparator: ',',\r\n * decimalSeparator: '.',\r\n * fractionGroupSize: 0,\r\n * fractionGroupSeparator: '\\xA0', // non-breaking space\r\n * suffix: ''\r\n * };\r\n *\r\n * [dp] {number} Decimal places. Integer, 0 to MAX inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n * [format] {object} Formatting options. See FORMAT pbject above.\r\n *\r\n * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {dp|rm}'\r\n * '[BigNumber Error] Argument not an object: {format}'\r\n */\r\n P.toFormat = function (dp, rm, format) {\r\n var str,\r\n x = this;\r\n\r\n if (format == null) {\r\n if (dp != null && rm && typeof rm == 'object') {\r\n format = rm;\r\n rm = null;\r\n } else if (dp && typeof dp == 'object') {\r\n format = dp;\r\n dp = rm = null;\r\n } else {\r\n format = FORMAT;\r\n }\r\n } else if (typeof format != 'object') {\r\n throw Error\r\n (bignumberError + 'Argument not an object: ' + format);\r\n }\r\n\r\n str = x.toFixed(dp, rm);\r\n\r\n if (x.c) {\r\n var i,\r\n arr = str.split('.'),\r\n g1 = +format.groupSize,\r\n g2 = +format.secondaryGroupSize,\r\n groupSeparator = format.groupSeparator || '',\r\n intPart = arr[0],\r\n fractionPart = arr[1],\r\n isNeg = x.s < 0,\r\n intDigits = isNeg ? intPart.slice(1) : intPart,\r\n len = intDigits.length;\r\n\r\n if (g2) {\r\n i = g1;\r\n g1 = g2;\r\n g2 = i;\r\n len -= i;\r\n }\r\n\r\n if (g1 > 0 && len > 0) {\r\n i = len % g1 || g1;\r\n intPart = intDigits.substr(0, i);\r\n for (; i < len; i += g1) intPart += groupSeparator + intDigits.substr(i, g1);\r\n if (g2 > 0) intPart += groupSeparator + intDigits.slice(i);\r\n if (isNeg) intPart = '-' + intPart;\r\n }\r\n\r\n str = fractionPart\r\n ? intPart + (format.decimalSeparator || '') + ((g2 = +format.fractionGroupSize)\r\n ? fractionPart.replace(new RegExp('\\\\d{' + g2 + '}\\\\B', 'g'),\r\n '$&' + (format.fractionGroupSeparator || ''))\r\n : fractionPart)\r\n : intPart;\r\n }\r\n\r\n return (format.prefix || '') + str + (format.suffix || '');\r\n };\r\n\r\n\r\n /*\r\n * Return an array of two BigNumbers representing the value of this BigNumber as a simple\r\n * fraction with an integer numerator and an integer denominator.\r\n * The denominator will be a positive non-zero value less than or equal to the specified\r\n * maximum denominator. If a maximum denominator is not specified, the denominator will be\r\n * the lowest value necessary to represent the number exactly.\r\n *\r\n * [md] {number|string|BigNumber} Integer >= 1, or Infinity. The maximum denominator.\r\n *\r\n * '[BigNumber Error] Argument {not an integer|out of range} : {md}'\r\n */\r\n P.toFraction = function (md) {\r\n var d, d0, d1, d2, e, exp, n, n0, n1, q, r, s,\r\n x = this,\r\n xc = x.c;\r\n\r\n if (md != null) {\r\n n = new BigNumber(md);\r\n\r\n // Throw if md is less than one or is not an integer, unless it is Infinity.\r\n if (!n.isInteger() && (n.c || n.s !== 1) || n.lt(ONE)) {\r\n throw Error\r\n (bignumberError + 'Argument ' +\r\n (n.isInteger() ? 'out of range: ' : 'not an integer: ') + valueOf(n));\r\n }\r\n }\r\n\r\n if (!xc) return new BigNumber(x);\r\n\r\n d = new BigNumber(ONE);\r\n n1 = d0 = new BigNumber(ONE);\r\n d1 = n0 = new BigNumber(ONE);\r\n s = coeffToString(xc);\r\n\r\n // Determine initial denominator.\r\n // d is a power of 10 and the minimum max denominator that specifies the value exactly.\r\n e = d.e = s.length - x.e - 1;\r\n d.c[0] = POWS_TEN[(exp = e % LOG_BASE) < 0 ? LOG_BASE + exp : exp];\r\n md = !md || n.comparedTo(d) > 0 ? (e > 0 ? d : n1) : n;\r\n\r\n exp = MAX_EXP;\r\n MAX_EXP = 1 / 0;\r\n n = new BigNumber(s);\r\n\r\n // n0 = d1 = 0\r\n n0.c[0] = 0;\r\n\r\n for (; ;) {\r\n q = div(n, d, 0, 1);\r\n d2 = d0.plus(q.times(d1));\r\n if (d2.comparedTo(md) == 1) break;\r\n d0 = d1;\r\n d1 = d2;\r\n n1 = n0.plus(q.times(d2 = n1));\r\n n0 = d2;\r\n d = n.minus(q.times(d2 = d));\r\n n = d2;\r\n }\r\n\r\n d2 = div(md.minus(d0), d1, 0, 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 e = e * 2;\r\n\r\n // Determine which fraction is closer to x, n0/d0 or n1/d1\r\n r = div(n1, d1, e, ROUNDING_MODE).minus(x).abs().comparedTo(\r\n div(n0, d0, e, ROUNDING_MODE).minus(x).abs()) < 1 ? [n1, d1] : [n0, d0];\r\n\r\n MAX_EXP = exp;\r\n\r\n return r;\r\n };\r\n\r\n\r\n /*\r\n * Return the value of this BigNumber converted to a number primitive.\r\n */\r\n P.toNumber = function () {\r\n return +valueOf(this);\r\n };\r\n\r\n\r\n /*\r\n * Return a string representing the value of this BigNumber rounded to sd significant digits\r\n * using rounding mode rm or ROUNDING_MODE. If sd is less than the number of digits\r\n * necessary to represent the integer part of the value in fixed-point notation, then use\r\n * exponential notation.\r\n *\r\n * [sd] {number} Significant digits. Integer, 1 to MAX inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {sd|rm}'\r\n */\r\n P.toPrecision = function (sd, rm) {\r\n if (sd != null) intCheck(sd, 1, MAX);\r\n return format(this, sd, rm, 2);\r\n };\r\n\r\n\r\n /*\r\n * Return a string representing the value of this BigNumber in base b, or base 10 if b is\r\n * omitted. If a base is specified, including base 10, round according to DECIMAL_PLACES and\r\n * ROUNDING_MODE. If a base is not specified, and this BigNumber has a positive exponent\r\n * that is equal to or greater than TO_EXP_POS, or a negative exponent equal to or less than\r\n * TO_EXP_NEG, return exponential notation.\r\n *\r\n * [b] {number} Integer, 2 to ALPHABET.length inclusive.\r\n *\r\n * '[BigNumber Error] Base {not a primitive number|not an integer|out of range}: {b}'\r\n */\r\n P.toString = function (b) {\r\n var str,\r\n n = this,\r\n s = n.s,\r\n e = n.e;\r\n\r\n // Infinity or NaN?\r\n if (e === null) {\r\n if (s) {\r\n str = 'Infinity';\r\n if (s < 0) str = '-' + str;\r\n } else {\r\n str = 'NaN';\r\n }\r\n } else {\r\n if (b == null) {\r\n str = e <= TO_EXP_NEG || e >= TO_EXP_POS\r\n ? toExponential(coeffToString(n.c), e)\r\n : toFixedPoint(coeffToString(n.c), e, '0');\r\n } else if (b === 10 && alphabetHasNormalDecimalDigits) {\r\n n = round(new BigNumber(n), DECIMAL_PLACES + e + 1, ROUNDING_MODE);\r\n str = toFixedPoint(coeffToString(n.c), n.e, '0');\r\n } else {\r\n intCheck(b, 2, ALPHABET.length, 'Base');\r\n str = convertBase(toFixedPoint(coeffToString(n.c), e, '0'), 10, b, s, true);\r\n }\r\n\r\n if (s < 0 && n.c[0]) str = '-' + str;\r\n }\r\n\r\n return str;\r\n };\r\n\r\n\r\n /*\r\n * Return as toString, but do not accept a base argument, and include the minus sign for\r\n * negative zero.\r\n */\r\n P.valueOf = P.toJSON = function () {\r\n return valueOf(this);\r\n };\r\n\r\n\r\n P._isBigNumber = true;\r\n\r\n P[Symbol.toStringTag] = 'BigNumber';\r\n\r\n // Node.js v10.12.0+\r\n P[Symbol.for('nodejs.util.inspect.custom')] = P.valueOf;\r\n\r\n if (configObject != null) BigNumber.set(configObject);\r\n\r\n return BigNumber;\r\n}\r\n\r\n\r\n// PRIVATE HELPER FUNCTIONS\r\n\r\n// These functions don't need access to variables,\r\n// e.g. DECIMAL_PLACES, in the scope of the `clone` function above.\r\n\r\n\r\nfunction bitFloor(n) {\r\n var i = n | 0;\r\n return n > 0 || n === i ? i : i - 1;\r\n}\r\n\r\n\r\n// Return a coefficient array as a string of base 10 digits.\r\nfunction coeffToString(a) {\r\n var s, z,\r\n i = 1,\r\n j = a.length,\r\n r = a[0] + '';\r\n\r\n for (; i < j;) {\r\n s = a[i++] + '';\r\n z = LOG_BASE - s.length;\r\n for (; z--; s = '0' + s);\r\n r += s;\r\n }\r\n\r\n // Determine trailing zeros.\r\n for (j = r.length; r.charCodeAt(--j) === 48;);\r\n\r\n return r.slice(0, j + 1 || 1);\r\n}\r\n\r\n\r\n// Compare the value of BigNumbers x and y.\r\nfunction compare(x, y) {\r\n var a, b,\r\n xc = x.c,\r\n yc = y.c,\r\n i = x.s,\r\n j = y.s,\r\n k = x.e,\r\n l = y.e;\r\n\r\n // Either NaN?\r\n if (!i || !j) return null;\r\n\r\n a = xc && !xc[0];\r\n b = yc && !yc[0];\r\n\r\n // Either zero?\r\n if (a || b) return a ? b ? 0 : -j : i;\r\n\r\n // Signs differ?\r\n if (i != j) return i;\r\n\r\n a = i < 0;\r\n b = k == l;\r\n\r\n // Either Infinity?\r\n if (!xc || !yc) return b ? 0 : !xc ^ a ? 1 : -1;\r\n\r\n // Compare exponents.\r\n if (!b) return k > l ^ a ? 1 : -1;\r\n\r\n j = (k = xc.length) < (l = yc.length) ? k : l;\r\n\r\n // Compare digit by digit.\r\n for (i = 0; i < j; i++) if (xc[i] != yc[i]) return xc[i] > yc[i] ^ a ? 1 : -1;\r\n\r\n // Compare lengths.\r\n return k == l ? 0 : k > l ^ a ? 1 : -1;\r\n}\r\n\r\n\r\n/*\r\n * Check that n is a primitive number, an integer, and in range, otherwise throw.\r\n */\r\nfunction intCheck(n, min, max, name) {\r\n if (n < min || n > max || n !== mathfloor(n)) {\r\n throw Error\r\n (bignumberError + (name || 'Argument') + (typeof n == 'number'\r\n ? n < min || n > max ? ' out of range: ' : ' not an integer: '\r\n : ' not a primitive number: ') + String(n));\r\n }\r\n}\r\n\r\n\r\n// Assumes finite n.\r\nfunction isOdd(n) {\r\n var k = n.c.length - 1;\r\n return bitFloor(n.e / LOG_BASE) == k && n.c[k] % 2 != 0;\r\n}\r\n\r\n\r\nfunction toExponential(str, e) {\r\n return (str.length > 1 ? str.charAt(0) + '.' + str.slice(1) : str) +\r\n (e < 0 ? 'e' : 'e+') + e;\r\n}\r\n\r\n\r\nfunction toFixedPoint(str, e, z) {\r\n var len, zs;\r\n\r\n // Negative exponent?\r\n if (e < 0) {\r\n\r\n // Prepend zeros.\r\n for (zs = z + '.'; ++e; zs += z);\r\n str = zs + str;\r\n\r\n // Positive exponent\r\n } else {\r\n len = str.length;\r\n\r\n // Append zeros.\r\n if (++e > len) {\r\n for (zs = z, e -= len; --e; zs += z);\r\n str += zs;\r\n } else if (e < len) {\r\n str = str.slice(0, e) + '.' + str.slice(e);\r\n }\r\n }\r\n\r\n return str;\r\n}\r\n\r\n\r\n// EXPORT\r\n\r\n\r\nexport var BigNumber = clone();\r\n\r\nexport default BigNumber;\r\n","import { AprRewardSummary, linearlyInterpolate, ParsedReserve, PerDayRewardSummary, Side } from \"@suilend/sdk\";\nimport { CetusLeverageSDK } from \"../sdk\";\nimport { NORMALIZED_flSUI_COINTYPE, NORMALIZED_jugSUI_COINTYPE, NORMALIZED_LBTC_COINTYPE } from '@suilend/sui-fe'\nimport BigNumber from \"bignumber.js\";\nimport { v4 as uuidv4 } from 'uuid'\n\nexport function calculateUtilizationPercent(reserve: ParsedReserve): BigNumber {\n return reserve.depositedAmount.eq(0)\n ? new BigNumber(0)\n : reserve.borrowedAmount.div(reserve.depositedAmount).times(100);\n}\n\nexport function calculateBorrowAprPercent(reserve: ParsedReserve): BigNumber | undefined {\n const utilizationPercent = calculateUtilizationPercent(reserve);\n if (utilizationPercent.gt(100)) return undefined;\n\n return linearlyInterpolate(\n reserve.config.interestRate,\n \"utilPercent\",\n \"aprPercent\",\n utilizationPercent,\n );\n}\n\nexport function calculateDepositAprPercent(reserve: ParsedReserve): BigNumber | undefined {\n const utilizationPercent = calculateUtilizationPercent(reserve);\n const borrowAprPercent = calculateBorrowAprPercent(reserve);\n\n if (borrowAprPercent === undefined || utilizationPercent.gt(100)) return undefined;\n\n return new BigNumber(utilizationPercent.div(100))\n .times(borrowAprPercent.div(100))\n .times(1 - reserve.config.spreadFeeBps / 10000)\n .times(100);\n}\n\nexport function appendExtraRewards(\n side: Side,\n reserve: ParsedReserve,\n filteredRewards: any[],\n sdk: CetusLeverageSDK,\n) {\n if (side === Side.DEPOSIT) {\n if ([NORMALIZED_flSUI_COINTYPE, NORMALIZED_jugSUI_COINTYPE].includes(reserve.coinType)) {\n filteredRewards.push({\n stats: {\n id: uuidv4(),\n isActive: true,\n rewardIndex: -1,\n reserve,\n rewardCoinType: \"LIQ_AG\",\n mintDecimals: 0,\n symbol: \"LiqAg Points\",\n iconUrl: `${sdk.sdkOptions?.suilend?.apiUrl}/partners/LiqAg.png`,\n perDay: new BigNumber(0.036),\n side: Side.DEPOSIT,\n },\n obligationClaims: {},\n });\n }\n\n if (reserve.coinType === NORMALIZED_LBTC_COINTYPE) {\n filteredRewards.push({\n stats: {\n id: uuidv4(),\n isActive: true,\n rewardIndex: -1,\n reserve,\n rewardCoinType: \"LOMBARD\",\n mintDecimals: 0,\n symbol: \"3x Lombard Lux\",\n iconUrl: `${sdk.sdkOptions?.suilend?.apiUrl}/partners/Lombard Lux.png`,\n perDay: new BigNumber(0),\n side: Side.DEPOSIT,\n },\n obligationClaims: {},\n });\n }\n }\n}\n\nexport function getUpdatedReserve(reserve: ParsedReserve, side: Side, changeAmount: BigNumber): ParsedReserve {\n return {\n ...reserve,\n depositedAmount:\n side === Side.DEPOSIT\n ? BigNumber.max(reserve.depositedAmount.plus(changeAmount), 0)\n : reserve.depositedAmount,\n borrowedAmount:\n side === Side.BORROW\n ? BigNumber.max(reserve.borrowedAmount.plus(changeAmount), 0)\n : reserve.borrowedAmount,\n };\n}\n\n\nexport function getRewardsAprMultiplier(\n side: Side,\n reserve: ParsedReserve,\n newReserve: ParsedReserve\n): { multiplier: BigNumber; isValid: boolean } {\n const totalAmount = side === Side.DEPOSIT ? reserve.depositedAmount : reserve.borrowedAmount;\n const newTotalAmount = side === Side.DEPOSIT ? newReserve.depositedAmount : newReserve.borrowedAmount;\n\n const multiplier = newTotalAmount.eq(0) ? new BigNumber(-1) : totalAmount.div(newTotalAmount);\n return { multiplier, isValid: !multiplier.eq(-1) };\n}\n\n\nexport function updateRewardsWithMultiplier(\n perDayRewards: PerDayRewardSummary[],\n aprRewards: AprRewardSummary[],\n multiplier: BigNumber,\n isValid: boolean\n) {\n const newPerDayRewards = perDayRewards.map((r) => ({\n ...r,\n stats: {\n ...r.stats,\n perDay: isValid ? r.stats.perDay.times(multiplier) : undefined,\n },\n })) as PerDayRewardSummary[];\n\n const newAprRewards = aprRewards.map((r) => ({\n ...r,\n stats: {\n ...r.stats,\n aprPercent: isValid ? r.stats.aprPercent.times(multiplier) : undefined,\n },\n })) as AprRewardSummary[];\n\n return { newPerDayRewards, newAprRewards };\n}\n\n\n","import crypto from 'crypto';\nconst rnds8Pool = new Uint8Array(256); // # of random values to pre-allocate\n\nlet poolPtr = rnds8Pool.length;\nexport default function rng() {\n if (poolPtr > rnds8Pool.length - 16) {\n crypto.randomFillSync(rnds8Pool);\n poolPtr = 0;\n }\n\n return rnds8Pool.slice(poolPtr, poolPtr += 16);\n}","import validate from './validate.js';\n/**\n * Convert array of 16 byte values to UUID string format of the form:\n * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\n */\n\nconst byteToHex = [];\n\nfor (let i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).slice(1));\n}\n\nexport function unsafeStringify(arr, offset = 0) {\n // Note: Be careful editing this code! It's been tuned for performance\n // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434\n return byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]];\n}\n\nfunction stringify(arr, offset = 0) {\n const uuid = unsafeStringify(arr, offset); // Consistency check for valid UUID. If this throws, it's likely due to one\n // of the following:\n // - One or more input array values don't map to a hex octet (leading to\n // \"undefined\" in the uuid)\n // - Invalid input values for the RFC `version` or `variant` fields\n\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n\n return uuid;\n}\n\nexport default stringify;","import crypto from 'crypto';\nexport default {\n randomUUID: crypto.randomUUID\n};","import native from './native.js';\nimport rng from './rng.js';\nimport { unsafeStringify } from './stringify.js';\n\nfunction v4(options, buf, offset) {\n if (native.randomUUID && !buf && !options) {\n return native.randomUUID();\n }\n\n options = options || {};\n const rnds = options.random || (options.rng || rng)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`\n\n rnds[6] = rnds[6] & 0x0f | 0x40;\n rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided\n\n if (buf) {\n offset = offset || 0;\n\n for (let i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n\n return buf;\n }\n\n return unsafeStringify(rnds);\n}\n\nexport default v4;","import { CetusLeverageSDK } from \"../sdk\";\nimport { getPackagerConfigs, CACHE_TIME_5MIN, CoinAssist, CLOCK_ADDRESS, getDefaultSqrtPriceLimit } from \"@cetusprotocol/common-sdk\";\nimport { FlashSwapParams, OpenShortParams, RepayFlashSwapParams } from \"../types\";\nimport Decimal from \"decimal.js\";\nimport BN from \"bn.js\";\nimport { FindRouterParams, RouterData } from \"@cetusprotocol/aggregator-sdk\";\nimport { Transaction } from \"@mysten/sui/dist/cjs/transactions\";\n\nexport class LeverageModules {\n protected _sdk: CetusLeverageSDK\n\n constructor(sdk: CetusLeverageSDK) {\n this._sdk = sdk\n }\n\n // 获取合约config信息 包含是否禁用做多、做空\n getLeverageConfig = async () => {\n const config = getPackagerConfigs(this._sdk.sdkOptions.leverage)\n const globalConfigData: any = await this._sdk.FullClient.getObject({\n id: config.global_config_id,\n options: {\n showContent: true,\n }\n })\n const globalConfig = globalConfigData.data.content.fields\n return globalConfig\n }\n\n getLeverageMarketsList = async (force_refresh = false) => {\n const cacheKey = 'leverage_markets_list'\n\n // 尝试从缓存获取数据\n const cachedData = this._sdk.getCache<any[]>(cacheKey, force_refresh)\n if (cachedData) {\n return cachedData\n }\n\n const config = getPackagerConfigs(this._sdk.sdkOptions.leverage)\n\n const marketsTableObject: any = await this._sdk.FullClient.getObject({\n id: config.markets_table_id,\n options: {\n showContent: true,\n }\n })\n let nextCursor: string | null = null\n const limit = 50\n const marketsList: any = []\n\n while (true) {\n const marketsTableData = await this._sdk.FullClient.getDynamicFields({\n parentId: marketsTableObject.data.content.fields.list.fields.id.id,\n limit,\n cursor: nextCursor,\n })\n marketsList.push(...marketsTableData.data)\n if (marketsTableData.data.length < limit) {\n break\n }\n nextCursor = marketsTableData.nextCursor\n }\n\n // 将结果存入缓存,设置5分钟过期时间\n this._sdk.updateCache(cacheKey, marketsList, CACHE_TIME_5MIN)\n\n return marketsList\n }\n\n getLeverageMarketInfo = async (marketId: string) => {\n const cacheKey = `leverage_market_info_${marketId}`\n const cachedData = this._sdk.getCache<any>(cacheKey)\n if (cachedData) {\n return cachedData\n }\n const marketInfo = await this._sdk.FullClient.getObject({\n id: marketId,\n options: {\n showContent: true,\n }\n })\n // this.sdk.updateCache(cacheKey, marketInfo.data.content.fields, CACHE_TIME_5MIN)\n // return marketInfo.data.content.fields\n }\n\n openShort = async (params: OpenShortParams) => {\n const { isQuote, marketId, amount, clmmPool, slippage } = params\n const { leverage } = this._sdk.sdkOptions\n // const { baseCoinType, quoteCoinType } = this._sdk.getCache<any>(`leverage_market_info_${marketId}`)\n const baseCoinType = '0x2::sui::SUI'\n const quoteCoinType = '0xdba34672e30cb065b1f93e3ab55318768fd6fef66c15942c9f7cb846e2f900e7::usdc::USDC'\n const tx = new Transaction()\n if (!isQuote) {\n const routers: any = await this.findRouters(baseCoinType, quoteCoinType, amount, true, [clmmPool])\n const inputCoin = CoinAssist.buildCoinWithBalance(BigInt(amount.toString()), baseCoinType, tx)\n const quoteCoin = await this._sdk.AggregatorClient.routerSwap({\n routers: routers.route_obj,\n byAmountIn: true,\n inputCoin,\n slippage,\n txb: tx,\n })\n // 闪电贷借资产\n const { balanceA, balanceB, receipt } = this.flashSwap({\n amount: amount,\n clmmPool,\n baseCoinType,\n quoteCoinType,\n tx,\n })\n\n // 抵押资产调用合约方法\n\n // 借资产调用合约方法\n\n // 偿还闪电贷\n // this.repayFlashSwap({\n // clmmPool,\n // coinA: balanceA,\n // coinB: balanceB,\n // tx,\n // baseCoinType,\n // quoteCoinType,\n // })\n\n\n // // 创建仓位\n\n // tx.moveCall({\n // target: `${leverage.published_at}::pool::open_short`,\n // arguments: [\n // tx.object(global_config_id),\n // tx.object(clmmPool),\n // ],\n // })\n\n }\n }\n\n flashSwap = (params: FlashSwapParams) => {\n const { clmm_pool } = this._sdk.ClmmSDK.sdkOptions\n const { global_config_id } = getPackagerConfigs(this._sdk.ClmmSDK.sdkOptions.clmm_pool)\n const { amount, clmmPool, baseCoinType, quoteCoinType, tx } = params\n const sqrt_price_limit = getDefaultSqrtPriceLimit(true).toString()\n const [balanceA, balanceB, receipt] = tx.moveCall({\n target: `${clmm_pool.published_at}::pool::flash_swap`,\n arguments: [\n tx.object(global_config_id),\n tx.object(clmmPool),\n tx.pure.bool(true),\n tx.pure.bool(true),\n tx.pure.u64(amount.toString()),\n tx.pure.u128(sqrt_price_limit),\n tx.object(CLOCK_ADDRESS),\n ],\n typeArguments: [baseCoinType, quoteCoinType],\n })\n return { balanceA, balanceB, receipt }\n }\n\n repayFlashSwap = (params: RepayFlashSwapParams) => {\n const { clmm_pool } = this._sdk.ClmmSDK.sdkOptions\n const { global_config_id } = getPackagerConfigs(this._sdk.ClmmSDK.sdkOptions.clmm_pool)\n const { clmmPool, coinA, coinB, tx, baseCoinType, quoteCoinType } = params\n tx.moveCall({\n target: `${clmm_pool.published_at}::pool::repay_flash_swap`,\n arguments: [\n tx.object(global_config_id),\n tx.object(clmmPool),\n tx.object(coinA),\n tx.object(coinB),\n tx.object(CLOCK_ADDRESS),\n ],\n typeArguments: [baseCoinType, quoteCoinType],\n })\n }\n\n public async findRouters(\n coin_type_a: string,\n coin_type_b: string,\n amount: Decimal,\n by_amount_in: boolean,\n pools: string[],\n ) {\n const { providers } = this._sdk.sdkOptions\n\n try {\n const findRouterParams: FindRouterParams = {\n from: coin_type_a,\n target: coin_type_b,\n amount: new BN(amount.toFixed(0).toString()),\n byAmountIn: by_amount_in,\n depth: 3,\n providers,\n }\n const res = await this._sdk.AggregatorClient.findRouters(findRouterParams)\n if (res?.error?.code === 10001) {\n return {\n ...res,\n is_exceed: res.insufficientLiquidity,\n }\n }\n if (res?.insufficientLiquidity) {\n return {\n ...res,\n is_exceed: res.insufficientLiquidity,\n }\n }\n if (!res?.routes || res?.routes?.length === 0) {\n throw Error('Aggregator no router')\n }\n\n return {\n amount_in: res.amountIn.toString(),\n amount_out: res.amountOut.toString(),\n is_exceed: res.insufficientLiquidity,\n route_obj: res,\n byAmountIn: true,\n originRes: res,\n }\n } catch (error) {\n try {\n if (pools) {\n const res: any = await this._sdk.AggregatorClient.swapInPools({\n from: coin_type_a,\n target: coin_type_b,\n amount: new BN(amount.toFixed(0).toString()),\n byAmountIn: by_amount_in,\n pools,\n })\n\n if (res) {\n return {\n amount_in: res.routeData.amountIn.toString(),\n amount_out: res.routeData.amountOut.toString(),\n is_exceed: res.isExceed,\n route_obj: res.routeData,\n byAmountIn: true,\n originRes: res,\n }\n }\n return null\n }\n return null\n } catch (e) {\n return null\n }\n }\n }\n\n}","(function (module, exports) {\n 'use strict';\n\n // Utils\n function assert (val, msg) {\n if (!val) throw new Error(msg || 'Assertion failed');\n }\n\n // Could use `inherits` module, but don't want to move from single file\n // architecture yet.\n function inherits (ctor, superCtor) {\n ctor.super_ = superCtor;\n var TempCtor = function () {};\n TempCtor.prototype = superCtor.prototype;\n ctor.prototype = new TempCtor();\n ctor.prototype.constructor = ctor;\n }\n\n // BN\n\n function BN (number, base, endian) {\n if (BN.isBN(number)) {\n return number;\n }\n\n this.negative = 0;\n this.words = null;\n this.length = 0;\n\n // Reduction context\n this.red = null;\n\n if (number !== null) {\n if (base === 'le' || base === 'be') {\n endian = base;\n base = 10;\n }\n\n this._init(number || 0, base || 10, endian || 'be');\n }\n }\n if (typeof module === 'object') {\n module.exports = BN;\n } else {\n exports.BN = BN;\n }\n\n BN.BN = BN;\n BN.wordSize = 26;\n\n var Buffer;\n try {\n if (typeof window !== 'undefined' && typeof window.Buffer !== 'undefined') {\n Buffer = window.Buffer;\n } else {\n Buffer = require('buffer').Buffer;\n }\n } catch (e) {\n }\n\n BN.isBN = function isBN (num) {\n if (num instanceof BN) {\n return true;\n }\n\n return num !== null && typeof num === 'object' &&\n num.constructor.wordSize === BN.wordSize && Array.isArray(num.words);\n };\n\n BN.max = function max (left, right) {\n if (left.cmp(right) > 0) return left;\n return right;\n };\n\n BN.min = function min (left, right) {\n if (left.cmp(right) < 0) return left;\n return right;\n };\n\n BN.prototype._init = function init (number, base, endian) {\n if (typeof number === 'number') {\n return this._initNumber(number, base, endian);\n }\n\n if (typeof number === 'object') {\n return this._initArray(number, base, endian);\n }\n\n if (base === 'hex') {\n base = 16;\n }\n assert(base === (base | 0) && base >= 2 && base <= 36);\n\n number = number.toString().replace(/\\s+/g, '');\n var start = 0;\n if (number[0] === '-') {\n start++;\n this.negative = 1;\n }\n\n if (start < number.length) {\n if (base === 16) {\n this._parseHex(number, start, endian);\n } else {\n this._parseBase(number, base, start);\n if (endian === 'le') {\n this._initArray(this.toArray(), base, endian);\n }\n }\n }\n };\n\n BN.prototype._initNumber = function _initNumber (number, base, endian) {\n if (number < 0) {\n this.negative = 1;\n number = -number;\n }\n if (number < 0x4000000) {\n this.words = [number & 0x3ffffff];\n this.length = 1;\n } else if (number < 0x10000000000000) {\n this.words = [\n number & 0x3ffffff,\n (number / 0x4000000) & 0x3ffffff\n ];\n this.length = 2;\n } else {\n assert(number < 0x20000000000000); // 2 ^ 53 (unsafe)\n this.words = [\n number & 0x3ffffff,\n (number / 0x4000000) & 0x3ffffff,\n 1\n ];\n this.length = 3;\n }\n\n if (endian !== 'le') return;\n\n // Reverse the bytes\n this._initArray(this.toArray(), base, endian);\n };\n\n BN.prototype._initArray = function _initArray (number, base, endian) {\n // Perhaps a Uint8Array\n assert(typeof number.length === 'number');\n if (number.length <= 0) {\n this.words = [0];\n this.length = 1;\n return this;\n }\n\n this.length = Math.ceil(number.length / 3);\n this.words = new Array(this.length);\n for (var i = 0; i < this.length; i++) {\n this.words[i] = 0;\n }\n\n var j, w;\n var off = 0;\n if (endian === 'be') {\n for (i = number.length - 1, j = 0; i >= 0; i -= 3) {\n w = number[i] | (number[i - 1] << 8) | (number[i - 2] << 16);\n this.words[j] |= (w << off) & 0x3ffffff;\n this.words[j + 1] = (w >>> (26 - off)) & 0x3ffffff;\n off += 24;\n if (off >= 26) {\n off -= 26;\n j++;\n }\n }\n } else if (endian === 'le') {\n for (i = 0, j = 0; i < number.length; i += 3) {\n w = number[i] | (number[i + 1] << 8) | (number[i + 2] << 16);\n this.words[j] |= (w << off) & 0x3ffffff;\n this.words[j + 1] = (w >>> (26 - off)) & 0x3ffffff;\n off += 24;\n if (off >= 26) {\n off -= 26;\n j++;\n }\n }\n }\n return this._strip();\n };\n\n function parseHex4Bits (string, index) {\n var c = string.charCodeAt(index);\n // '0' - '9'\n if (c >= 48 && c <= 57) {\n return c - 48;\n // 'A' - 'F'\n } else if (c >= 65 && c <= 70) {\n return c - 55;\n // 'a' - 'f'\n } else if (c >= 97 && c <= 102) {\n return c - 87;\n } else {\n assert(false, 'Invalid character in ' + string);\n }\n }\n\n function parseHexByte (string, lowerBound, index) {\n var r = parseHex4Bits(string, index);\n if (index - 1 >= lowerBound) {\n r |= parseHex4Bits(string, index - 1) << 4;\n }\n return r;\n }\n\n BN.prototype._parseHex = function _parseHex (number, start, endian) {\n // Create possibly bigger array to ensure that it fits the number\n this.length = Math.ceil((number.length - start) / 6);\n this.words = new Array(this.length);\n for (var i = 0; i < this.length; i++) {\n this.words[i] = 0;\n }\n\n // 24-bits chunks\n var off = 0;\n var j = 0;\n\n var w;\n if (endian === 'be') {\n for (i = number.length - 1; i >= start; i -= 2) {\n w = parseHexByte(number, start, i) << off;\n this.words[j] |= w & 0x3ffffff;\n if (off >= 18) {\n off -= 18;\n j += 1;\n this.words[j] |= w >>> 26;\n } else {\n off += 8;\n }\n }\n } else {\n var parseLength = number.length - start;\n for (i = parseLength % 2 === 0 ? start + 1 : start; i < number.length; i += 2) {\n w = parseHexByte(number, start, i) << off;\n this.words[j] |= w & 0x3ffffff;\n if (off >= 18) {\n off -= 18;\n j += 1;\n this.words[j] |= w >>> 26;\n } else {\n off += 8;\n }\n }\n }\n\n this._strip();\n };\n\n function parseBase (str, start, end, mul) {\n var r = 0;\n var b = 0;\n var len = Math.min(str.length, end);\n for (var i = start; i < len; i++) {\n var c = str.charCodeAt(i) - 48;\n\n r *= mul;\n\n // 'a'\n if (c >= 49) {\n b = c - 49 + 0xa;\n\n // 'A'\n } else if (c >= 17) {\n b = c - 17 + 0xa;\n\n // '0' - '9'\n } else {\n b = c;\n }\n assert(c >= 0 && b < mul, 'Invalid character');\n r += b;\n }\n return r;\n }\n\n BN.prototype._parseBase = function _parseBase (number, base, start) {\n // Initialize as zero\n this.words = [0];\n this.length = 1;\n\n // Find length of limb in base\n for (var limbLen = 0, limbPow = 1; limbPow <= 0x3ffffff; limbPow *= base) {\n limbLen++;\n }\n limbLen--;\n limbPow = (limbPow / base) | 0;\n\n var total = number.length - start;\n var mod = total % limbLen;\n var end = Math.min(total, total - mod) + start;\n\n var word = 0;\n for (var i = start; i < end; i += limbLen) {\n word = parseBase(number, i, i + limbLen, base);\n\n this.imuln(limbPow);\n if (this.words[0] + word < 0x4000000) {\n this.words[0] += word;\n } else {\n this._iaddn(word);\n }\n }\n\n if (mod !== 0) {\n var pow = 1;\n word = parseBase(number, i, number.length, base);\n\n for (i = 0; i < mod; i++) {\n pow *= base;\n }\n\n this.imuln(pow);\n if (this.words[0] + word < 0x4000000) {\n this.words[0] += word;\n } else {\n this._iaddn(word);\n }\n }\n\n this._strip();\n };\n\n BN.prototype.copy = function copy (dest) {\n dest.words = new Array(this.length);\n for (var i = 0; i < this.length; i++) {\n dest.words[i] = this.words[i];\n }\n dest.length = this.length;\n dest.negative = this.negative;\n dest.red = this.red;\n };\n\n function move (dest, src) {\n dest.words = src.words;\n dest.length = src.length;\n dest.negative = src.negative;\n dest.red = src.red;\n }\n\n BN.prototype._move = function _move (dest) {\n move(dest, this);\n };\n\n BN.prototype.clone = function clone () {\n var r = new BN(null);\n this.copy(r);\n return r;\n };\n\n BN.prototype._expand = function _expand (size) {\n while (this.length < size) {\n this.words[this.length++] = 0;\n }\n return this;\n };\n\n // Remove leading `0` from `this`\n BN.prototype._strip = function strip () {\n while (this.length > 1 && this.words[this.length - 1] === 0) {\n this.length--;\n }\n return this._normSign();\n };\n\n BN.prototype._normSign = function _normSign () {\n // -0 = 0\n if (this.length === 1 && this.words[0] === 0) {\n this.negative = 0;\n }\n return this;\n };\n\n // Check Symbol.for because not everywhere where Symbol defined\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol#Browser_compatibility\n if (typeof Symbol !== 'undefined' && typeof Symbol.for === 'function') {\n try {\n BN.prototype[Symbol.for('nodejs.util.inspect.custom')] = inspect;\n } catch (e) {\n BN.prototype.inspect = inspect;\n }\n } else {\n BN.prototype.inspect = inspect;\n }\n\n function inspect () {\n return (this.red ? '<BN-R: ' : '<BN: ') + this.toString(16) + '>';\n }\n\n /*\n\n var zeros = [];\n var groupSizes = [];\n var groupBases = [];\n\n var s = '';\n var i = -1;\n while (++i < BN.wordSize) {\n zeros[i] = s;\n s += '0';\n }\n groupSizes[0] = 0;\n groupSizes[1] = 0;\n groupBases[0] = 0;\n groupBases[1] = 0;\n var base = 2 - 1;\n while (++base < 36 + 1) {\n var groupSize = 0;\n var groupBase = 1;\n while (groupBase < (1 << BN.wordSize) / base) {\n groupBase *= base;\n groupSize += 1;\n }\n groupSizes[base] = groupSize;\n groupBases[base] = groupBase;\n }\n\n */\n\n var zeros = [\n '',\n '0',\n '00',\n '000',\n '0000',\n '00000',\n '000000',\n '0000000',\n '00000000',\n '000000000',\n '0000000000',\n '00000000000',\n '000000000000',\n '0000000000000',\n '00000000000000',\n '000000000000000',\n '0000000000000000',\n '00000000000000000',\n '000000000000000000',\n '0000000000000000000',\n '00000000000000000000',\n '000000000000000000000',\n '0000000000000000000000',\n '00000000000000000000000',\n '000000000000000000000000',\n '0000000000000000000000000'\n ];\n\n var groupSizes = [\n 0, 0,\n 25, 16, 12, 11, 10, 9, 8,\n 8, 7, 7, 7, 7, 6, 6,\n 6, 6, 6, 6, 6, 5, 5,\n 5, 5, 5, 5, 5, 5, 5,\n 5, 5, 5, 5, 5, 5, 5\n ];\n\n var groupBases = [\n 0, 0,\n 33554432, 43046721, 16777216, 48828125, 60466176, 40353607, 16777216,\n 43046721, 10000000, 19487171, 35831808, 62748517, 7529536, 11390625,\n 16777216, 24137569, 34012224, 47045881, 64000000, 4084101, 5153632,\n 6436343, 7962624, 9765625, 11881376, 14348907, 17210368, 20511149,\n 24300000, 28629151, 33554432, 39135393, 45435424, 52521875, 60466176\n ];\n\n BN.prototype.toString = function toString (base, padding) {\n base = base || 10;\n padding = padding | 0 || 1;\n\n var out;\n if (base === 16 || base === 'hex') {\n out = '';\n var off = 0;\n var carry = 0;\n for (var i = 0; i < this.length; i++) {\n var w = this.words[i];\n var word = (((w << off) | carry) & 0xffffff).toString(16);\n carry = (w >>> (24 - off)) & 0xffffff;\n off += 2;\n if (off >= 26) {\n off -= 26;\n i--;\n }\n if (carry !== 0 || i !== this.length - 1) {\n out = zeros[6 - word.length] + word + out;\n } else {\n out = word + out;\n }\n }\n if (carry !== 0) {\n out = carry.toString(16) + out;\n }\n while (out.length % padding !== 0) {\n out = '0' + out;\n }\n if (this.negative !== 0) {\n out = '-' + out;\n }\n return out;\n }\n\n if (base === (base | 0) && base >= 2 && base <= 36) {\n // var groupSize = Math.floor(BN.wordSize * Math.LN2 / Math.log(base));\n var groupSize = groupSizes[base];\n // var groupBase = Math.pow(base, groupSize);\n var groupBase = groupBases[base];\n out = '';\n var c = this.clone();\n c.negative = 0;\n while (!c.isZero()) {\n var r = c.modrn(groupBase).toString(base);\n c = c.idivn(groupBase);\n\n if (!c.isZero()) {\n out = zeros[groupSize - r.length] + r + out;\n } else {\n out = r + out;\n }\n }\n if (this.isZero()) {\n out = '0' + out;\n }\n while (out.length % padding !== 0) {\n out = '0' + out;\n }\n if (this.negative !== 0) {\n out = '-' + out;\n }\n return out;\n }\n\n assert(false, 'Base should be between 2 and 36');\n };\n\n BN.prototype.toNumber = function toNumber () {\n var ret = this.words[0];\n if (this.length === 2) {\n ret += this.words[1] * 0x4000000;\n } else if (this.length === 3 && this.words[2] === 0x01) {\n // NOTE: at this stage it is known that the top bit is set\n ret += 0x10000000000000 + (this.words[1] * 0x4000000);\n } else if (this.length > 2) {\n assert(false, 'Number can only safely store up to 53 bits');\n }\n return (this.negative !== 0) ? -ret : ret;\n };\n\n BN.prototype.toJSON = function toJSON () {\n return this.toString(16, 2);\n };\n\n if (Buffer) {\n BN.prototype.toBuffer = function toBuffer (endian, length) {\n return this.toArrayLike(Buffer, endian, length);\n };\n }\n\n BN.prototype.toArray = function toArray (endian, length) {\n return this.toArrayLike(Array, endian, length);\n };\n\n var allocate = function allocate (ArrayType, size) {\n if (ArrayType.allocUnsafe) {\n return ArrayType.allocUnsafe(size);\n }\n return new ArrayType(size);\n };\n\n BN.prototype.toArrayLike = function toArrayLike (ArrayType, endian, length) {\n this._strip();\n\n var byteLength = this.byteLength();\n var reqLength = length || Math.max(1, byteLength);\n assert(byteLength <= reqLength, 'byte array longer than desired length');\n assert(reqLength > 0, 'Requested array length <= 0');\n\n var res = allocate(ArrayType, reqLength);\n var postfix = endian === 'le' ? 'LE' : 'BE';\n this['_toArrayLike' + postfix](res, byteLength);\n return res;\n };\n\n BN.prototype._toArrayLikeLE = function _toArrayLikeLE (res, byteLength) {\n var position = 0;\n var carry = 0;\n\n for (var i = 0, shift = 0; i < this.length; i++) {\n var word = (this.words[i] << shift) | carry;\n\n res[position++] = word & 0xff;\n if (position < res.length) {\n res[position++] = (word >> 8) & 0xff;\n }\n if (position < res.length) {\n res[position++] = (word >> 16) & 0xff;\n }\n\n if (shift === 6) {\n if (position < res.length) {\n res[position++] = (word >> 24) & 0xff;\n }\n carry = 0;\n shift = 0;\n } else {\n carry = word >>> 24;\n shift += 2;\n }\n }\n\n if (position < res.length) {\n res[position++] = carry;\n\n while (position < res.length) {\n res[position++] = 0;\n }\n }\n };\n\n BN.prototype._toArrayLikeBE = function _toArrayLikeBE (res, byteLength) {\n var position = res.length - 1;\n var carry = 0;\n\n for (var i = 0, shift = 0; i < this.length; i++) {\n var word = (this.words[i] << shift) | carry;\n\n res[position--] = word & 0xff;\n if (position >= 0) {\n res[position--] = (word >> 8) & 0xff;\n }\n if (position >= 0) {\n res[position--] = (word >> 16) & 0xff;\n }\n\n if (shift === 6) {\n if (position >= 0) {\n res[position--] = (word >> 24) & 0xff;\n }\n carry = 0;\n shift = 0;\n } else {\n carry = word >>> 24;\n shift += 2;\n }\n }\n\n if (position >= 0) {\n res[position--] = carry;\n\n while (position >= 0) {\n res[position--] = 0;\n }\n }\n };\n\n if (Math.clz32) {\n BN.prototype._countBits = function _countBits (w) {\n return 32 - Math.clz32(w);\n };\n } else {\n BN.prototype._countBits = function _countBits (w) {\n var t = w;\n var r = 0;\n if (t >= 0x1000) {\n r += 13;\n t >>>= 13;\n }\n if (t >= 0x40) {\n r += 7;\n t >>>= 7;\n }\n if (t >= 0x8) {\n r += 4;\n t >>>= 4;\n }\n if (t >= 0x02) {\n r += 2;\n t >>>= 2;\n }\n return r + t;\n };\n }\n\n BN.prototype._zeroBits = function _zeroBits (w) {\n // Short-cut\n if (w === 0) return 26;\n\n var t = w;\n var r = 0;\n if ((t & 0x1fff) === 0) {\n r += 13;\n t >>>= 13;\n }\n if ((t & 0x7f) === 0) {\n r += 7;\n t >>>= 7;\n }\n if ((t & 0xf) === 0) {\n r += 4;\n t >>>= 4;\n }\n if ((t & 0x3) === 0) {\n r += 2;\n t >>>= 2;\n }\n if ((t & 0x1) === 0) {\n r++;\n }\n return r;\n };\n\n // Return number of used bits in a BN\n BN.prototype.bitLength = function bitLength () {\n var w = this.words[this.length - 1];\n var hi = this._countBits(w);\n return (this.length - 1) * 26 + hi;\n };\n\n function toBitArray (num) {\n var w = new Array(num.bitLength());\n\n for (var bit = 0; bit < w.length; bit++) {\n var off = (bit / 26) | 0;\n var wbit = bit % 26;\n\n w[bit] = (num.words[off] >>> wbit) & 0x01;\n }\n\n return w;\n }\n\n // Number of trailing zero bits\n BN.prototype.zeroBits = function zeroBits () {\n if (this.isZero()) return 0;\n\n var r = 0;\n for (var i = 0; i < this.length; i++) {\n var b = this._zeroBits(this.words[i]);\n r += b;\n if (b !== 26) break;\n }\n return r;\n };\n\n BN.prototype.byteLength = function byteLength () {\n return Math.ceil(this.bitLength() / 8);\n };\n\n BN.prototype.toTwos = function toTwos (width) {\n if (this.negative !== 0) {\n return this.abs().inotn(width).iaddn(1);\n }\n return this.clone();\n };\n\n BN.prototype.fromTwos = function fromTwos (width) {\n if (this.testn(width - 1)) {\n return this.notn(width).iaddn(1).ineg();\n }\n return this.clone();\n };\n\n BN.prototype.isNeg = function isNeg () {\n return this.negative !== 0;\n };\n\n // Return negative clone of `this`\n BN.prototype.neg = function neg () {\n return this.clone().ineg();\n };\n\n BN.prototype.ineg = function ineg () {\n if (!this.isZero()) {\n this.negative ^= 1;\n }\n\n return this;\n };\n\n // Or `num` with `this` in-place\n BN.prototype.iuor = function iuor (num) {\n while (this.length < num.length) {\n this.words[this.length++] = 0;\n }\n\n for (var i = 0; i < num.length; i++) {\n this.words[i] = this.words[i] | num.words[i];\n }\n\n return this._strip();\n };\n\n BN.prototype.ior = function ior (num) {\n assert((this.negative | num.negative) === 0);\n return this.iuor(num);\n };\n\n // Or `num` with `this`\n BN.prototype.or = function or (num) {\n if (this.length > num.length) return this.clone().ior(num);\n return num.clone().ior(this);\n };\n\n BN.prototype.uor = function uor (num) {\n if (this.length > num.length) return this.clone().iuor(num);\n return num.clone().iuor(this);\n };\n\n // And `num` with `this` in-place\n BN.prototype.iuand = function iuand (num) {\n // b = min-length(num, this)\n var b;\n if (this.length > num.length) {\n b = num;\n } else {\n b = this;\n }\n\n for (var i = 0; i < b.length; i++) {\n this.words[i] = this.words[i] & num.words[i];\n }\n\n this.length = b.length;\n\n return this._strip();\n };\n\n BN.prototype.iand = function iand (num) {\n assert((this.negative | num.negative) === 0);\n return this.iuand(num);\n };\n\n // And `num` with `this`\n BN.prototype.and = function and (num) {\n if (this.length > num.length) return this.clone().iand(num);\n return num.clone().iand(this);\n };\n\n BN.prototype.uand = function uand (num) {\n if (this.length > num.length) return this.clone().iuand(num);\n return num.clone().iuand(this);\n };\n\n // Xor `num` with `this` in-place\n BN.prototype.iuxor = function iuxor (num) {\n // a.length > b.length\n var a;\n var b;\n if (this.length > num.length) {\n a = this;\n b = num;\n } else {\n a = num;\n b = this;\n }\n\n for (var i = 0; i < b.length; i++) {\n this.words[i] = a.words[i] ^ b.words[i];\n }\n\n if (this !== a) {\n for (; i < a.length; i++) {\n this.words[i] = a.words[i];\n }\n }\n\n this.length = a.length;\n\n return this._strip();\n };\n\n BN.prototype.ixor = function ixor (num) {\n assert((this.negative | num.negative) === 0);\n return this.iuxor(num);\n };\n\n // Xor `num` with `this`\n BN.prototype.xor = function xor (num) {\n if (this.length > num.length) return this.clone().ixor(num);\n return num.clone().ixor(this);\n };\n\n BN.prototype.uxor = function uxor (num) {\n if (this.length > num.length) return this.clone().iuxor(num);\n return num.clone().iuxor(this);\n };\n\n // Not ``this`` with ``width`` bitwidth\n BN.prototype.inotn = function inotn (width) {\n assert(typeof width === 'number' && width >= 0);\n\n var bytesNeeded = Math.ceil(width / 26) | 0;\n var bitsLeft = width % 26;\n\n // Extend the buffer with leading zeroes\n this._expand(bytesNeeded);\n\n if (bitsLeft > 0) {\n bytesNeeded--;\n }\n\n // Handle complete words\n for (var i = 0; i < bytesNeeded; i++) {\n this.words[i] = ~this.words[i] & 0x3ffffff;\n }\n\n // Handle the residue\n if (bitsLeft > 0) {\n this.words[i] = ~this.words[i] & (0x3ffffff >> (26 - bitsLeft));\n }\n\n // And remove leading zeroes\n return this._strip();\n };\n\n BN.prototype.notn = function notn (width) {\n return this.clone().inotn(width);\n };\n\n // Set `bit` of `this`\n BN.prototype.setn = function setn (bit, val) {\n assert(typeof bit === 'number' && bit >= 0);\n\n var off = (bit / 26) | 0;\n var wbit = bit % 26;\n\n this._expand(off + 1);\n\n if (val) {\n this.words[off] = this.words[off] | (1 << wbit);\n } else {\n this.words[off] = this.words[off] & ~(1 << wbit);\n }\n\n return this._strip();\n };\n\n // Add `num` to `this` in-place\n BN.prototype.iadd = function iadd (num) {\n var r;\n\n // negative + positive\n if (this.negative !== 0 && num.negative === 0) {\n this.negative = 0;\n r = this.isub(num);\n this.negative ^= 1;\n return this._normSign();\n\n // positive + negative\n } else if (this.negative === 0 && num.negative !== 0) {\n num.negative = 0;\n r = this.isub(num);\n num.negative = 1;\n return r._normSign();\n }\n\n // a.length > b.length\n var a, b;\n if (this.length > num.length) {\n a = this;\n b = num;\n } else {\n a = num;\n b = this;\n }\n\n var carry = 0;\n for (var i = 0; i < b.length; i++) {\n r = (a.words[i] | 0) + (b.words[i] | 0) + carry;\n this.words[i] = r & 0x3ffffff;\n carry = r >>> 26;\n }\n for (; carry !== 0 && i < a.length; i++) {\n r = (a.words[i] | 0) + carry;\n this.words[i] = r & 0x3ffffff;\n carry = r >>> 26;\n }\n\n this.length = a.length;\n if (carry !== 0) {\n this.words[this.length] = carry;\n this.length++;\n // Copy the rest of the words\n } else if (a !== this) {\n for (; i < a.length; i++) {\n this.words[i] = a.words[i];\n }\n }\n\n return this;\n };\n\n // Add `num` to `this`\n BN.prototype.add = function add (num) {\n var res;\n if (num.negative !== 0 && this.negative === 0) {\n num.negative = 0;\n res = this.sub(num);\n num.negative ^= 1;\n return res;\n } else if (num.negative === 0 && this.negative !== 0) {\n this.negative = 0;\n res = num.sub(this);\n this.negative = 1;\n return res;\n }\n\n if (this.length > num.length) return this.clone().iadd(num);\n\n return num.clone().iadd(this);\n };\n\n // Subtract `num` from `this` in-place\n BN.prototype.isub = function isub (num) {\n // this - (-num) = this + num\n if (num.negative !== 0) {\n num.negative = 0;\n var r = this.iadd(num);\n num.negative = 1;\n return r._normSign();\n\n // -this - num = -(this + num)\n } else if (this.negative !== 0) {\n this.negative = 0;\n this.iadd(num);\n this.negative = 1;\n return this._normSign();\n }\n\n // At this point both numbers are positive\n var cmp = this.cmp(num);\n\n // Optimization - zeroify\n if (cmp === 0) {\n this.negative = 0;\n this.length = 1;\n this.words[0] = 0;\n return this;\n }\n\n // a > b\n var a, b;\n if (cmp > 0) {\n a = this;\n b = num;\n } else {\n a = num;\n b = this;\n }\n\n var carry = 0;\n for (var i = 0; i < b.length; i++) {\n r = (a.words[i] | 0) - (b.words[i] | 0) + carry;\n carry = r >> 26;\n this.words[i] = r & 0x3ffffff;\n }\n for (; carry !== 0 && i < a.length; i++) {\n r = (a.words[i] | 0) + carry;\n carry = r >> 26;\n this.words[i] = r & 0x3ffffff;\n }\n\n // Copy rest of the words\n if (carry === 0 && i < a.length && a !== this) {\n for (; i < a.length; i++) {\n this.words[i] = a.words[i];\n }\n }\n\n this.length = Math.max(this.length, i);\n\n if (a !== this) {\n this.negative = 1;\n }\n\n return this._strip();\n };\n\n // Subtract `num` from `this`\n BN.prototype.sub = function sub (num) {\n return this.clone().isub(num);\n };\n\n function smallMulTo (self, num, out) {\n out.negative = num.negative ^ self.negative;\n var len = (self.length + num.length) | 0;\n out.length = len;\n len = (len - 1) | 0;\n\n // Peel one iteration (compiler can't do it, because of code complexity)\n var a = self.words[0] | 0;\n var b = num.words[0] | 0;\n var r = a * b;\n\n var lo = r & 0x3ffffff;\n var carry = (r / 0x4000000) | 0;\n out.words[0] = lo;\n\n for (var k = 1; k < len; k++) {\n // Sum all words with the same `i + j = k` and accumulate `ncarry`,\n // note that ncarry could be >= 0x3ffffff\n var ncarry = carry >>> 26;\n var rword = carry & 0x3ffffff;\n var maxJ = Math.min(k, num.length - 1);\n for (var j = Math.max(0, k - self.length + 1); j <= maxJ; j++) {\n var i = (k - j) | 0;\n a = self.words[i] | 0;\n b = num.words[j] | 0;\n r = a * b + rword;\n ncarry += (r / 0x4000000) | 0;\n rword = r & 0x3ffffff;\n }\n out.words[k] = rword | 0;\n carry = ncarry | 0;\n }\n if (carry !== 0) {\n out.words[k] = carry | 0;\n } else {\n out.length--;\n }\n\n return out._strip();\n }\n\n // TODO(indutny): it may be reasonable to omit it for users who don't need\n // to work with 256-bit numbers, otherwise it gives 20% improvement for 256-bit\n // multiplication (like elliptic secp256k1).\n var comb10MulTo = function comb10MulTo (self, num, out) {\n var a = self.words;\n var b = num.words;\n var o = out.words;\n var c = 0;\n var lo;\n var mid;\n var hi;\n var a0 = a[0] | 0;\n var al0 = a0 & 0x1fff;\n var ah0 = a0 >>> 13;\n var a1 = a[1] | 0;\n var al1 = a1 & 0x1fff;\n var ah1 = a1 >>> 13;\n var a2 = a[2] | 0;\n var al2 = a2 & 0x1fff;\n var ah2 = a2 >>> 13;\n var a3 = a[3] | 0;\n var al3 = a3 & 0x1fff;\n var ah3 = a3 >>> 13;\n var a4 = a[4] | 0;\n var al4 = a4 & 0x1fff;\n var ah4 = a4 >>> 13;\n var a5 = a[5] | 0;\n var al5 = a5 & 0x1fff;\n var ah5 = a5 >>> 13;\n var a6 = a[6] | 0;\n var al6 = a6 & 0x1fff;\n var ah6 = a6 >>> 13;\n var a7 = a[7] | 0;\n var al7 = a7 & 0x1fff;\n var ah7 = a7 >>> 13;\n var a8 = a[8] | 0;\n var al8 = a8 & 0x1fff;\n var ah8 = a8 >>> 13;\n var a9 = a[9] | 0;\n var al9 = a9 & 0x1fff;\n var ah9 = a9 >>> 13;\n var b0 = b[0] | 0;\n var bl0 = b0 & 0x1fff;\n var bh0 = b0 >>> 13;\n var b1 = b[1] | 0;\n var bl1 = b1 & 0x1fff;\n var bh1 = b1 >>> 13;\n var b2 = b[2] | 0;\n var bl2 = b2 & 0x1fff;\n var bh2 = b2 >>> 13;\n var b3 = b[3] | 0;\n var bl3 = b3 & 0x1fff;\n var bh3 = b3 >>> 13;\n var b4 = b[4] | 0;\n var bl4 = b4 & 0x1fff;\n var bh4 = b4 >>> 13;\n var b5 = b[5] | 0;\n var bl5 = b5 & 0x1fff;\n var bh5 = b5 >>> 13;\n var b6 = b[6] | 0;\n var bl6 = b6 & 0x1fff;\n var bh6 = b6 >>> 13;\n var b7 = b[7] | 0;\n var bl7 = b7 & 0x1fff;\n var bh7 = b7 >>> 13;\n var b8 = b[8] | 0;\n var bl8 = b8 & 0x1fff;\n var bh8 = b8 >>> 13;\n var b9 = b[9] | 0;\n var bl9 = b9 & 0x1fff;\n var bh9 = b9 >>> 13;\n\n out.negative = self.negative ^ num.negative;\n out.length = 19;\n /* k = 0 */\n lo = Math.imul(al0, bl0);\n mid = Math.imul(al0, bh0);\n mid = (mid + Math.imul(ah0, bl0)) | 0;\n hi = Math.imul(ah0, bh0);\n var w0 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w0 >>> 26)) | 0;\n w0 &= 0x3ffffff;\n /* k = 1 */\n lo = Math.imul(al1, bl0);\n mid = Math.imul(al1, bh0);\n mid = (mid + Math.imul(ah1, bl0)) | 0;\n hi = Math.imul(ah1, bh0);\n lo = (lo + Math.imul(al0, bl1)) | 0;\n mid = (mid + Math.imul(al0, bh1)) | 0;\n mid = (mid + Math.imul(ah0, bl1)) | 0;\n hi = (hi + Math.imul(ah0, bh1)) | 0;\n var w1 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w1 >>> 26)) | 0;\n w1 &= 0x3ffffff;\n /* k = 2 */\n lo = Math.imul(al2, bl0);\n mid = Math.imul(al2, bh0);\n mid = (mid + Math.imul(ah2, bl0)) | 0;\n hi = Math.imul(ah2, bh0);\n lo = (lo + Math.imul(al1, bl1)) | 0;\n mid = (mid + Math.imul(al1, bh1)) | 0;\n mid = (mid + Math.imul(ah1, bl1)) | 0;\n hi = (hi + Math.imul(ah1, bh1)) | 0;\n lo = (lo + Math.imul(al0, bl2)) | 0;\n mid = (mid + Math.imul(al0, bh2)) | 0;\n mid = (mid + Math.imul(ah0, bl2)) | 0;\n hi = (hi + Math.imul(ah0, bh2)) | 0;\n var w2 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w2 >>> 26)) | 0;\n w2 &= 0x3ffffff;\n /* k = 3 */\n lo = Math.imul(al3, bl0);\n mid = Math.imul(al3, bh0);\n mid = (mid + Math.imul(ah3, bl0)) | 0;\n hi = Math.imul(ah3, bh0);\n lo = (lo + Math.imul(al2, bl1)) | 0;\n mid = (mid + Math.imul(al2, bh1)) | 0;\n mid = (mid + Math.imul(ah2, bl1)) | 0;\n hi = (hi + Math.imul(ah2, bh1)) | 0;\n lo = (lo + Math.imul(al1, bl2)) | 0;\n mid = (mid + Math.imul(al1, bh2)) | 0;\n mid = (mid + Math.imul(ah1, bl2)) | 0;\n hi = (hi + Math.imul(ah1, bh2)) | 0;\n lo = (lo + Math.imul(al0, bl3)) | 0;\n mid = (mid + Math.imul(al0, bh3)) | 0;\n mid = (mid + Math.imul(ah0, bl3)) | 0;\n hi = (hi + Math.imul(ah0, bh3)) | 0;\n var w3 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w3 >>> 26)) | 0;\n w3 &= 0x3ffffff;\n /* k = 4 */\n lo = Math.imul(al4, bl0);\n mid = Math.imul(al4, bh0);\n mid = (mid + Math.imul(ah4, bl0)) | 0;\n hi = Math.imul(ah4, bh0);\n lo = (lo + Math.imul(al3, bl1)) | 0;\n mid = (mid + Math.imul(al3, bh1)) | 0;\n mid = (mid + Math.imul(ah3, bl1)) | 0;\n hi = (hi + Math.imul(ah3, bh1)) | 0;\n lo = (lo + Math.imul(al2, bl2)) | 0;\n mid = (mid + Math.imul(al2, bh2)) | 0;\n mid = (mid + Math.imul(ah2, bl2)) | 0;\n hi = (hi + Math.imul(ah2, bh2)) | 0;\n lo = (lo + Math.imul(al1, bl3)) | 0;\n mid = (mid + Math.imul(al1, bh3)) | 0;\n mid = (mid + Math.imul(ah1, bl3)) | 0;\n hi = (hi + Math.imul(ah1, bh3)) | 0;\n lo = (lo + Math.imul(al0, bl4)) | 0;\n mid = (mid + Math.imul(al0, bh4)) | 0;\n mid = (mid + Math.imul(ah0, bl4)) | 0;\n hi = (hi + Math.imul(ah0, bh4)) | 0;\n var w4 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w4 >>> 26)) | 0;\n w4 &= 0x3ffffff;\n /* k = 5 */\n lo = Math.imul(al5, bl0);\n mid = Math.imul(al5, bh0);\n mid = (mid + Math.imul(ah5, bl0)) | 0;\n hi = Math.imul(ah5, bh0);\n lo = (lo + Math.imul(al4, bl1)) | 0;\n mid = (mid + Math.imul(al4, bh1)) | 0;\n mid = (mid + Math.imul(ah4, bl1)) | 0;\n hi = (hi + Math.imul(ah4, bh1)) | 0;\n lo = (lo + Math.imul(al3, bl2)) | 0;\n mid = (mid + Math.imul(al3, bh2)) | 0;\n mid = (mid + Math.imul(ah3, bl2)) | 0;\n hi = (hi + Math.imul(ah3, bh2)) | 0;\n lo = (lo + Math.imul(al2, bl3)) | 0;\n mid = (mid + Math.imul(al2, bh3)) | 0;\n mid = (mid + Math.imul(ah2, bl3)) | 0;\n hi = (hi + Math.imul(ah2, bh3)) | 0;\n lo = (lo + Math.imul(al1, bl4)) | 0;\n mid = (mid + Math.imul(al1, bh4)) | 0;\n mid = (mid + Math.imul(ah1, bl4)) | 0;\n hi = (hi + Math.imul(ah1, bh4)) | 0;\n lo = (lo + Math.imul(al0, bl5)) | 0;\n mid = (mid + Math.imul(al0, bh5)) | 0;\n mid = (mid + Math.imul(ah0, bl5)) | 0;\n hi = (hi + Math.imul(ah0, bh5)) | 0;\n var w5 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w5 >>> 26)) | 0;\n w5 &= 0x3ffffff;\n /* k = 6 */\n lo = Math.imul(al6, bl0);\n mid = Math.imul(al6, bh0);\n mid = (mid + Math.imul(ah6, bl0)) | 0;\n hi = Math.imul(ah6, bh0);\n lo = (lo + Math.imul(al5, bl1)) | 0;\n mid = (mid + Math.imul(al5, bh1)) | 0;\n mid = (mid + Math.imul(ah5, bl1)) | 0;\n hi = (hi + Math.imul(ah5, bh1)) | 0;\n lo = (lo + Math.imul(al4, bl2)) | 0;\n mid = (mid + Math.imul(al4, bh2)) | 0;\n mid = (mid + Math.imul(ah4, bl2)) | 0;\n hi = (hi + Math.imul(ah4, bh2)) | 0;\n lo = (lo + Math.imul(al3, bl3)) | 0;\n mid = (mid + Math.imul(al3, bh3)) | 0;\n mid = (mid + Math.imul(ah3, bl3)) | 0;\n hi = (hi + Math.imul(ah3, bh3)) | 0;\n lo = (lo + Math.imul(al2, bl4)) | 0;\n mid = (mid + Math.imul(al2, bh4)) | 0;\n mid = (mid + Math.imul(ah2, bl4)) | 0;\n hi = (hi + Math.imul(ah2, bh4)) | 0;\n lo = (lo + Math.imul(al1, bl5)) | 0;\n mid = (mid + Math.imul(al1, bh5)) | 0;\n mid = (mid + Math.imul(ah1, bl5)) | 0;\n hi = (hi + Math.imul(ah1, bh5)) | 0;\n lo = (lo + Math.imul(al0, bl6)) | 0;\n mid = (mid + Math.imul(al0, bh6)) | 0;\n mid = (mid + Math.imul(ah0, bl6)) | 0;\n hi = (hi + Math.imul(ah0, bh6)) | 0;\n var w6 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w6 >>> 26)) | 0;\n w6 &= 0x3ffffff;\n /* k = 7 */\n lo = Math.imul(al7, bl0);\n mid = Math.imul(al7, bh0);\n mid = (mid + Math.imul(ah7, bl0)) | 0;\n hi = Math.imul(ah7, bh0);\n lo = (lo + Math.imul(al6, bl1)) | 0;\n mid = (mid + Math.imul(al6, bh1)) | 0;\n mid = (mid + Math.imul(ah6, bl1)) | 0;\n hi = (hi + Math.imul(ah6, bh1)) | 0;\n lo = (lo + Math.imul(al5, bl2)) | 0;\n mid = (mid + Math.imul(al5, bh2)) | 0;\n mid = (mid + Math.imul(ah5, bl2)) | 0;\n hi = (hi + Math.imul(ah5, bh2)) | 0;\n lo = (lo + Math.imul(al4, bl3)) | 0;\n mid = (mid + Math.imul(al4, bh3)) | 0;\n mid = (mid + Math.imul(ah4, bl3)) | 0;\n hi = (hi + Math.imul(ah4, bh3)) | 0;\n lo = (lo + Math.imul(al3, bl4)) | 0;\n mid = (mid + Math.imul(al3, bh4)) | 0;\n mid = (mid + Math.imul(ah3, bl4)) | 0;\n hi = (hi + Math.imul(ah3, bh4)) | 0;\n lo = (lo + Math.imul(al2, bl5)) | 0;\n mid = (mid + Math.imul(al2, bh5)) | 0;\n mid = (mid + Math.imul(ah2, bl5)) | 0;\n hi = (hi + Math.imul(ah2, bh5)) | 0;\n lo = (lo + Math.imul(al1, bl6)) | 0;\n mid = (mid + Math.imul(al1, bh6)) | 0;\n mid = (mid + Math.imul(ah1, bl6)) | 0;\n hi = (hi + Math.imul(ah1, bh6)) | 0;\n lo = (lo + Math.imul(al0, bl7)) | 0;\n mid = (mid + Math.imul(al0, bh7)) | 0;\n mid = (mid + Math.imul(ah0, bl7)) | 0;\n hi = (hi + Math.imul(ah0, bh7)) | 0;\n var w7 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w7 >>> 26)) | 0;\n w7 &= 0x3ffffff;\n /* k = 8 */\n lo = Math.imul(al8, bl0);\n mid = Math.imul(al8, bh0);\n mid = (mid + Math.imul(ah8, bl0)) | 0;\n hi = Math.imul(ah8, bh0);\n lo = (lo + Math.imul(al7, bl1)) | 0;\n mid = (mid + Math.imul(al7, bh1)) | 0;\n mid = (mid + Math.imul(ah7, bl1)) | 0;\n hi = (hi + Math.imul(ah7, bh1)) | 0;\n lo = (lo + Math.imul(al6, bl2)) | 0;\n mid = (mid + Math.imul(al6, bh2)) | 0;\n mid = (mid + Math.imul(ah6, bl2)) | 0;\n hi = (hi + Math.imul(ah6, bh2)) | 0;\n lo = (lo + Math.imul(al5, bl3)) | 0;\n mid = (mid + Math.imul(al5, bh3)) | 0;\n mid = (mid + Math.imul(ah5, bl3)) | 0;\n hi = (hi + Math.imul(ah5, bh3)) | 0;\n lo = (lo + Math.imul(al4, bl4)) | 0;\n mid = (mid + Math.imul(al4, bh4)) | 0;\n mid = (mid + Math.imul(ah4, bl4)) | 0;\n hi = (hi + Math.imul(ah4, bh4)) | 0;\n lo = (lo + Math.imul(al3, bl5)) | 0;\n mid = (mid + Math.imul(al3, bh5)) | 0;\n mid = (mid + Math.imul(ah3, bl5)) | 0;\n hi = (hi + Math.imul(ah3, bh5)) | 0;\n lo = (lo + Math.imul(al2, bl6)) | 0;\n mid = (mid + Math.imul(al2, bh6)) | 0;\n mid = (mid + Math.imul(ah2, bl6)) | 0;\n hi = (hi + Math.imul(ah2, bh6)) | 0;\n lo = (lo + Math.imul(al1, bl7)) | 0;\n mid = (mid + Math.imul(al1, bh7)) | 0;\n mid = (mid + Math.imul(ah1, bl7)) | 0;\n hi = (hi + Math.imul(ah1, bh7)) | 0;\n lo = (lo + Math.imul(al0, bl8)) | 0;\n mid = (mid + Math.imul(al0, bh8)) | 0;\n mid = (mid + Math.imul(ah0, bl8)) | 0;\n hi = (hi + Math.imul(ah0, bh8)) | 0;\n var w8 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w8 >>> 26)) | 0;\n w8 &= 0x3ffffff;\n /* k = 9 */\n lo = Math.imul(al9, bl0);\n mid = Math.imul(al9, bh0);\n mid = (mid + Math.imul(ah9, bl0)) | 0;\n hi = Math.imul(ah9, bh0);\n lo = (lo + Math.imul(al8, bl1)) | 0;\n mid = (mid + Math.imul(al8, bh1)) | 0;\n mid = (mid + Math.imul(ah8, bl1)) | 0;\n hi = (hi + Math.imul(ah8, bh1)) | 0;\n lo = (lo + Math.imul(al7, bl2)) | 0;\n mid = (mid + Math.imul(al7, bh2)) | 0;\n mid = (mid + Math.imul(ah7, bl2)) | 0;\n hi = (hi + Math.imul(ah7, bh2)) | 0;\n lo = (lo + Math.imul(al6, bl3)) | 0;\n mid = (mid + Math.imul(al6, bh3)) | 0;\n mid = (mid + Math.imul(ah6, bl3)) | 0;\n hi = (hi + Math.imul(ah6, bh3)) | 0;\n lo = (lo + Math.imul(al5, bl4)) | 0;\n mid = (mid + Math.imul(al5, bh4)) | 0;\n mid = (mid + Math.imul(ah5, bl4)) | 0;\n hi = (hi + Math.imul(ah5, bh4)) | 0;\n lo = (lo + Math.imul(al4, bl5)) | 0;\n mid = (mid + Math.imul(al4, bh5)) | 0;\n mid = (mid + Math.imul(ah4, bl5)) | 0;\n hi = (hi + Math.imul(ah4, bh5)) | 0;\n lo = (lo + Math.imul(al3, bl6)) | 0;\n mid = (mid + Math.imul(al3, bh6)) | 0;\n mid = (mid + Math.imul(ah3, bl6)) | 0;\n hi = (hi + Math.imul(ah3, bh6)) | 0;\n lo = (lo + Math.imul(al2, bl7)) | 0;\n mid = (mid + Math.imul(al2, bh7)) | 0;\n mid = (mid + Math.imul(ah2, bl7)) | 0;\n hi = (hi + Math.imul(ah2, bh7)) | 0;\n lo = (lo + Math.imul(al1, bl8)) | 0;\n mid = (mid + Math.imul(al1, bh8)) | 0;\n mid = (mid + Math.imul(ah1, bl8)) | 0;\n hi = (hi + Math.imul(ah1, bh8)) | 0;\n lo = (lo + Math.imul(al0, bl9)) | 0;\n mid = (mid + Math.imul(al0, bh9)) | 0;\n mid = (mid + Math.imul(ah0, bl9)) | 0;\n hi = (hi + Math.imul(ah0, bh9)) | 0;\n var w9 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w9 >>> 26)) | 0;\n w9 &= 0x3ffffff;\n /* k = 10 */\n lo = Math.imul(al9, bl1);\n mid = Math.imul(al9, bh1);\n mid = (mid + Math.imul(ah9, bl1)) | 0;\n hi = Math.imul(ah9, bh1);\n lo = (lo + Math.imul(al8, bl2)) | 0;\n mid = (mid + Math.imul(al8, bh2)) | 0;\n mid = (mid + Math.imul(ah8, bl2)) | 0;\n hi = (hi + Math.imul(ah8, bh2)) | 0;\n lo = (lo + Math.imul(al7, bl3)) | 0;\n mid = (mid + Math.imul(al7, bh3)) | 0;\n mid = (mid + Math.imul(ah7, bl3)) | 0;\n hi = (hi + Math.imul(ah7, bh3)) | 0;\n lo = (lo + Math.imul(al6, bl4)) | 0;\n mid = (mid + Math.imul(al6, bh4)) | 0;\n mid = (mid + Math.imul(ah6, bl4)) | 0;\n hi = (hi + Math.imul(ah6, bh4)) | 0;\n lo = (lo + Math.imul(al5, bl5)) | 0;\n mid = (mid + Math.imul(al5, bh5)) | 0;\n mid = (mid + Math.imul(ah5, bl5)) | 0;\n hi = (hi + Math.imul(ah5, bh5)) | 0;\n lo = (lo + Math.imul(al4, bl6)) | 0;\n mid = (mid + Math.imul(al4, bh6)) | 0;\n mid = (mid + Math.imul(ah4, bl6)) | 0;\n hi = (hi + Math.imul(ah4, bh6)) | 0;\n lo = (lo + Math.imul(al3, bl7)) | 0;\n mid = (mid + Math.imul(al3, bh7)) | 0;\n mid = (mid + Math.imul(ah3, bl7)) | 0;\n hi = (hi + Math.imul(ah3, bh7)) | 0;\n lo = (lo + Math.imul(al2, bl8)) | 0;\n mid = (mid + Math.imul(al2, bh8)) | 0;\n mid = (mid + Math.imul(ah2, bl8)) | 0;\n hi = (hi + Math.imul(ah2, bh8)) | 0;\n lo = (lo + Math.imul(al1, bl9)) | 0;\n mid = (mid + Math.imul(al1, bh9)) | 0;\n mid = (mid + Math.imul(ah1, bl9)) | 0;\n hi = (hi + Math.imul(ah1, bh9)) | 0;\n var w10 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w10 >>> 26)) | 0;\n w10 &= 0x3ffffff;\n /* k = 11 */\n lo = Math.imul(al9, bl2);\n mid = Math.imul(al9, bh2);\n mid = (mid + Math.imul(ah9, bl2)) | 0;\n hi = Math.imul(ah9, bh2);\n lo = (lo + Math.imul(al8, bl3)) | 0;\n mid = (mid + Math.imul(al8, bh3)) | 0;\n mid = (mid + Math.imul(ah8, bl3)) | 0;\n hi = (hi + Math.imul(ah8, bh3)) | 0;\n lo = (lo + Math.imul(al7, bl4)) | 0;\n mid = (mid + Math.imul(al7, bh4)) | 0;\n mid = (mid + Math.imul(ah7, bl4)) | 0;\n hi = (hi + Math.imul(ah7, bh4)) | 0;\n lo = (lo + Math.imul(al6, bl5)) | 0;\n mid = (mid + Math.imul(al6, bh5)) | 0;\n mid = (mid + Math.imul(ah6, bl5)) | 0;\n hi = (hi + Math.imul(ah6, bh5)) | 0;\n lo = (lo + Math.imul(al5, bl6)) | 0;\n mid = (mid + Math.imul(al5, bh6)) | 0;\n mid = (mid + Math.imul(ah5, bl6)) | 0;\n hi = (hi + Math.imul(ah5, bh6)) | 0;\n lo = (lo + Math.imul(al4, bl7)) | 0;\n mid = (mid + Math.imul(al4, bh7)) | 0;\n mid = (mid + Math.imul(ah4, bl7)) | 0;\n hi = (hi + Math.imul(ah4, bh7)) | 0;\n lo = (lo + Math.imul(al3, bl8)) | 0;\n mid = (mid + Math.imul(al3, bh8)) | 0;\n mid = (mid + Math.imul(ah3, bl8)) | 0;\n hi = (hi + Math.imul(ah3, bh8)) | 0;\n lo = (lo + Math.imul(al2, bl9)) | 0;\n mid = (mid + Math.imul(al2, bh9)) | 0;\n mid = (mid + Math.imul(ah2, bl9)) | 0;\n hi = (hi + Math.imul(ah2, bh9)) | 0;\n var w11 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w11 >>> 26)) | 0;\n w11 &= 0x3ffffff;\n /* k = 12 */\n lo = Math.imul(al9, bl3);\n mid = Math.imul(al9, bh3);\n mid = (mid + Math.imul(ah9, bl3)) | 0;\n hi = Math.imul(ah9, bh3);\n lo = (lo + Math.imul(al8, bl4)) | 0;\n mid = (mid + Math.imul(al8, bh4)) | 0;\n mid = (mid + Math.imul(ah8, bl4)) | 0;\n hi = (hi + Math.imul(ah8, bh4)) | 0;\n lo = (lo + Math.imul(al7, bl5)) | 0;\n mid = (mid + Math.imul(al7, bh5)) | 0;\n mid = (mid + Math.imul(ah7, bl5)) | 0;\n hi = (hi + Math.imul(ah7, bh5)) | 0;\n lo = (lo + Math.imul(al6, bl6)) | 0;\n mid = (mid + Math.imul(al6, bh6)) | 0;\n mid = (mid + Math.imul(ah6, bl6)) | 0;\n hi = (hi + Math.imul(ah6, bh6)) | 0;\n lo = (lo + Math.imul(al5, bl7)) | 0;\n mid = (mid + Math.imul(al5, bh7)) | 0;\n mid = (mid + Math.imul(ah5, bl7)) | 0;\n hi = (hi + Math.imul(ah5, bh7)) | 0;\n lo = (lo + Math.imul(al4, bl8)) | 0;\n mid = (mid + Math.imul(al4, bh8)) | 0;\n mid = (mid + Math.imul(ah4, bl8)) | 0;\n hi = (hi + Math.imul(ah4, bh8)) | 0;\n lo = (lo + Math.imul(al3, bl9)) | 0;\n mid = (mid + Math.imul(al3, bh9)) | 0;\n mid = (mid + Math.imul(ah3, bl9)) | 0;\n hi = (hi + Math.imul(ah3, bh9)) | 0;\n var w12 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w12 >>> 26)) | 0;\n w12 &= 0x3ffffff;\n /* k = 13 */\n lo = Math.imul(al9, bl4);\n mid = Math.imul(al9, bh4);\n mid = (mid + Math.imul(ah9, bl4)) | 0;\n hi = Math.imul(ah9, bh4);\n lo = (lo + Math.imul(al8, bl5)) | 0;\n mid = (mid + Math.imul(al8, bh5)) | 0;\n mid = (mid + Math.imul(ah8, bl5)) | 0;\n hi = (hi + Math.imul(ah8, bh5)) | 0;\n lo = (lo + Math.imul(al7, bl6)) | 0;\n mid = (mid + Math.imul(al7, bh6)) | 0;\n mid = (mid + Math.imul(ah7, bl6)) | 0;\n hi = (hi + Math.imul(ah7, bh6)) | 0;\n lo = (lo + Math.imul(al6, bl7)) | 0;\n mid = (mid + Math.imul(al6, bh7)) | 0;\n mid = (mid + Math.imul(ah6, bl7)) | 0;\n hi = (hi + Math.imul(ah6, bh7)) | 0;\n lo = (lo + Math.imul(al5, bl8)) | 0;\n mid = (mid + Math.imul(al5, bh8)) | 0;\n mid = (mid + Math.imul(ah5, bl8)) | 0;\n hi = (hi + Math.imul(ah5, bh8)) | 0;\n lo = (lo + Math.imul(al4, bl9)) | 0;\n mid = (mid + Math.imul(al4, bh9)) | 0;\n mid = (mid + Math.imul(ah4, bl9)) | 0;\n hi = (hi + Math.imul(ah4, bh9)) | 0;\n var w13 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w13 >>> 26)) | 0;\n w13 &= 0x3ffffff;\n /* k = 14 */\n lo = Math.imul(al9, bl5);\n mid = Math.imul(al9, bh5);\n mid = (mid + Math.imul(ah9, bl5)) | 0;\n hi = Math.imul(ah9, bh5);\n lo = (lo + Math.imul(al8, bl6)) | 0;\n mid = (mid + Math.imul(al8, bh6)) | 0;\n mid = (mid + Math.imul(ah8, bl6)) | 0;\n hi = (hi + Math.imul(ah8, bh6)) | 0;\n lo = (lo + Math.imul(al7, bl7)) | 0;\n mid = (mid + Math.imul(al7, bh7)) | 0;\n mid = (mid + Math.imul(ah7, bl7)) | 0;\n hi = (hi + Math.imul(ah7, bh7)) | 0;\n lo = (lo + Math.imul(al6, bl8)) | 0;\n mid = (mid + Math.imul(al6, bh8)) | 0;\n mid = (mid + Math.imul(ah6, bl8)) | 0;\n hi = (hi + Math.imul(ah6, bh8)) | 0;\n lo = (lo + Math.imul(al5, bl9)) | 0;\n mid = (mid + Math.imul(al5, bh9)) | 0;\n mid = (mid + Math.imul(ah5, bl9)) | 0;\n hi = (hi + Math.imul(ah5, bh9)) | 0;\n var w14 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w14 >>> 26)) | 0;\n w14 &= 0x3ffffff;\n /* k = 15 */\n lo = Math.imul(al9, bl6);\n mid = Math.imul(al9, bh6);\n mid = (mid + Math.imul(ah9, bl6)) | 0;\n hi = Math.imul(ah9, bh6);\n lo = (lo + Math.imul(al8, bl7)) | 0;\n mid = (mid + Math.imul(al8, bh7)) | 0;\n mid = (mid + Math.imul(ah8, bl7)) | 0;\n hi = (hi + Math.imul(ah8, bh7)) | 0;\n lo = (lo + Math.imul(al7, bl8)) | 0;\n mid = (mid + Math.imul(al7, bh8)) | 0;\n mid = (mid + Math.imul(ah7, bl8)) | 0;\n hi = (hi + Math.imul(ah7, bh8)) | 0;\n lo = (lo + Math.imul(al6, bl9)) | 0;\n mid = (mid + Math.imul(al6, bh9)) | 0;\n mid = (mid + Math.imul(ah6, bl9)) | 0;\n hi = (hi + Math.imul(ah6, bh9)) | 0;\n var w15 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w15 >>> 26)) | 0;\n w15 &= 0x3ffffff;\n /* k = 16 */\n lo = Math.imul(al9, bl7);\n mid = Math.imul(al9, bh7);\n mid = (mid + Math.imul(ah9, bl7)) | 0;\n hi = Math.imul(ah9, bh7);\n lo = (lo + Math.imul(al8, bl8)) | 0;\n mid = (mid + Math.imul(al8, bh8)) | 0;\n mid = (mid + Math.imul(ah8, bl8)) | 0;\n hi = (hi + Math.imul(ah8, bh8)) | 0;\n lo = (lo + Math.imul(al7, bl9)) | 0;\n mid = (mid + Math.imul(al7, bh9)) | 0;\n mid = (mid + Math.imul(ah7, bl9)) | 0;\n hi = (hi + Math.imul(ah7, bh9)) | 0;\n var w16 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w16 >>> 26)) | 0;\n w16 &= 0x3ffffff;\n /* k = 17 */\n lo = Math.imul(al9, bl8);\n mid = Math.imul(al9, bh8);\n mid = (mid + Math.imul(ah9, bl8)) | 0;\n hi = Math.imul(ah9, bh8);\n lo = (lo + Math.imul(al8, bl9)) | 0;\n mid = (mid + Math.imul(al8, bh9)) | 0;\n mid = (mid + Math.imul(ah8, bl9)) | 0;\n hi = (hi + Math.imul(ah8, bh9)) | 0;\n var w17 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w17 >>> 26)) | 0;\n w17 &= 0x3ffffff;\n /* k = 18 */\n lo = Math.imul(al9, bl9);\n mid = Math.imul(al9, bh9);\n mid = (mid + Math.imul(ah9, bl9)) | 0;\n hi = Math.imul(ah9, bh9);\n var w18 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w18 >>> 26)) | 0;\n w18 &= 0x3ffffff;\n o[0] = w0;\n o[1] = w1;\n o[2] = w2;\n o[3] = w3;\n o[4] = w4;\n o[5] = w5;\n o[6] = w6;\n o[7] = w7;\n o[8] = w8;\n o[9] = w9;\n o[10] = w10;\n o[11] = w11;\n o[12] = w12;\n o[13] = w13;\n o[14] = w14;\n o[15] = w15;\n o[16] = w16;\n o[17] = w17;\n o[18] = w18;\n if (c !== 0) {\n o[19] = c;\n out.length++;\n }\n return out;\n };\n\n // Polyfill comb\n if (!Math.imul) {\n comb10MulTo = smallMulTo;\n }\n\n function bigMulTo (self, num, out) {\n out.negative = num.negative ^ self.negative;\n out.length = self.length + num.length;\n\n var carry = 0;\n var hncarry = 0;\n for (var k = 0; k < out.length - 1; k++) {\n // Sum all words with the same `i + j = k` and accumulate `ncarry`,\n // note that ncarry could be >= 0x3ffffff\n var ncarry = hncarry;\n hncarry = 0;\n var rword = carry & 0x3ffffff;\n var maxJ = Math.min(k, num.length - 1);\n for (var j = Math.max(0, k - self.length + 1); j <= maxJ; j++) {\n var i = k - j;\n var a = self.words[i] | 0;\n var b = num.words[j] | 0;\n var r = a * b;\n\n var lo = r & 0x3ffffff;\n ncarry = (ncarry + ((r / 0x4000000) | 0)) | 0;\n lo = (lo + rword) | 0;\n rword = lo & 0x3ffffff;\n ncarry = (ncarry + (lo >>> 26)) | 0;\n\n hncarry += ncarry >>> 26;\n ncarry &= 0x3ffffff;\n }\n out.words[k] = rword;\n carry = ncarry;\n ncarry = hncarry;\n }\n if (carry !== 0) {\n out.words[k] = carry;\n } else {\n out.length--;\n }\n\n return out._strip();\n }\n\n function jumboMulTo (self, num, out) {\n // Temporary disable, see https://github.com/indutny/bn.js/issues/211\n // var fftm = new FFTM();\n // return fftm.mulp(self, num, out);\n return bigMulTo(self, num, out);\n }\n\n BN.prototype.mulTo = function mulTo (num, out) {\n var res;\n var len = this.length + num.length;\n if (this.length === 10 && num.length === 10) {\n res = comb10MulTo(this, num, out);\n } else if (len < 63) {\n res = smallMulTo(this, num, out);\n } else if (len < 1024) {\n res = bigMulTo(this, num, out);\n } else {\n res = jumboMulTo(this, num, out);\n }\n\n return res;\n };\n\n // Cooley-Tukey algorithm for FFT\n // slightly revisited to rely on looping instead of recursion\n\n function FFTM (x, y) {\n this.x = x;\n this.y = y;\n }\n\n FFTM.prototype.makeRBT = function makeRBT (N) {\n var t = new Array(N);\n var l = BN.prototype._countBits(N) - 1;\n for (var i = 0; i < N; i++) {\n t[i] = this.revBin(i, l, N);\n }\n\n return t;\n };\n\n // Returns binary-reversed representation of `x`\n FFTM.prototype.revBin = function revBin (x, l, N) {\n if (x === 0 || x === N - 1) return x;\n\n var rb = 0;\n for (var i = 0; i < l; i++) {\n rb |= (x & 1) << (l - i - 1);\n x >>= 1;\n }\n\n return rb;\n };\n\n // Performs \"tweedling\" phase, therefore 'emulating'\n // behaviour of the recursive algorithm\n FFTM.prototype.permute = function permute (rbt, rws, iws, rtws, itws, N) {\n for (var i = 0; i < N; i++) {\n rtws[i] = rws[rbt[i]];\n itws[i] = iws[rbt[i]];\n }\n };\n\n FFTM.prototype.transform = function transform (rws, iws, rtws, itws, N, rbt) {\n this.permute(rbt, rws, iws, rtws, itws, N);\n\n for (var s = 1; s < N; s <<= 1) {\n var l = s << 1;\n\n var rtwdf = Math.cos(2 * Math.PI / l);\n var itwdf = Math.sin(2 * Math.PI / l);\n\n for (var p = 0; p < N; p += l) {\n var rtwdf_ = rtwdf;\n var itwdf_ = itwdf;\n\n for (var j = 0; j < s; j++) {\n var re = rtws[p + j];\n var ie = itws[p + j];\n\n var ro = rtws[p + j + s];\n var io = itws[p + j + s];\n\n var rx = rtwdf_ * ro - itwdf_ * io;\n\n io = rtwdf_ * io + itwdf_ * ro;\n ro = rx;\n\n rtws[p + j] = re + ro;\n itws[p + j] = ie + io;\n\n rtws[p + j + s] = re - ro;\n itws[p + j + s] = ie - io;\n\n /* jshint maxdepth : false */\n if (j !== l) {\n rx = rtwdf * rtwdf_ - itwdf * itwdf_;\n\n itwdf_ = rtwdf * itwdf_ + itwdf * rtwdf_;\n rtwdf_ = rx;\n }\n }\n }\n }\n };\n\n FFTM.prototype.guessLen13b = function guessLen13b (n, m) {\n var N = Math.max(m, n) | 1;\n var odd = N & 1;\n var i = 0;\n for (N = N / 2 | 0; N; N = N >>> 1) {\n i++;\n }\n\n return 1 << i + 1 + odd;\n };\n\n FFTM.prototype.conjugate = function conjugate (rws, iws, N) {\n if (N <= 1) return;\n\n for (var i = 0; i < N / 2; i++) {\n var t = rws[i];\n\n rws[i] = rws[N - i - 1];\n rws[N - i - 1] = t;\n\n t = iws[i];\n\n iws[i] = -iws[N - i - 1];\n iws[N - i - 1] = -t;\n }\n };\n\n FFTM.prototype.normalize13b = function normalize13b (ws, N) {\n var carry = 0;\n for (var i = 0; i < N / 2; i++) {\n var w = Math.round(ws[2 * i + 1] / N) * 0x2000 +\n Math.round(ws[2 * i] / N) +\n carry;\n\n ws[i] = w & 0x3ffffff;\n\n if (w < 0x4000000) {\n carry = 0;\n } else {\n carry = w / 0x4000000 | 0;\n }\n }\n\n return ws;\n };\n\n FFTM.prototype.convert13b = function convert13b (ws, len, rws, N) {\n var carry = 0;\n for (var i = 0; i < len; i++) {\n carry = carry + (ws[i] | 0);\n\n rws[2 * i] = carry & 0x1fff; carry = carry >>> 13;\n rws[2 * i + 1] = carry & 0x1fff; carry = carry >>> 13;\n }\n\n // Pad with zeroes\n for (i = 2 * len; i < N; ++i) {\n rws[i] = 0;\n }\n\n assert(carry === 0);\n assert((carry & ~0x1fff) === 0);\n };\n\n FFTM.prototype.stub = function stub (N) {\n var ph = new Array(N);\n for (var i = 0; i < N; i++) {\n ph[i] = 0;\n }\n\n return ph;\n };\n\n FFTM.prototype.mulp = function mulp (x, y, out) {\n var N = 2 * this.guessLen13b(x.length, y.length);\n\n var rbt = this.makeRBT(N);\n\n var _ = this.stub(N);\n\n var rws = new Array(N);\n var rwst = new Array(N);\n var iwst = new Array(N);\n\n var nrws = new Array(N);\n var nrwst = new Array(N);\n var niwst = new Array(N);\n\n var rmws = out.words;\n rmws.length = N;\n\n this.convert13b(x.words, x.length, rws, N);\n this.convert13b(y.words, y.length, nrws, N);\n\n this.transform(rws, _, rwst, iwst, N, rbt);\n this.transform(nrws, _, nrwst, niwst, N, rbt);\n\n for (var i = 0; i < N; i++) {\n var rx = rwst[i] * nrwst[i] - iwst[i] * niwst[i];\n iwst[i] = rwst[i] * niwst[i] + iwst[i] * nrwst[i];\n rwst[i] = rx;\n }\n\n this.conjugate(rwst, iwst, N);\n this.transform(rwst, iwst, rmws, _, N, rbt);\n this.conjugate(rmws, _, N);\n this.normalize13b(rmws, N);\n\n out.negative = x.negative ^ y.negative;\n out.length = x.length + y.length;\n return out._strip();\n };\n\n // Multiply `this` by `num`\n BN.prototype.mul = function mul (num) {\n var out = new BN(null);\n out.words = new Array(this.length + num.length);\n return this.mulTo(num, out);\n };\n\n // Multiply employing FFT\n BN.prototype.mulf = function mulf (num) {\n var out = new BN(null);\n out.words = new Array(this.length + num.length);\n return jumboMulTo(this, num, out);\n };\n\n // In-place Multiplication\n BN.prototype.imul = function imul (num) {\n return this.clone().mulTo(num, this);\n };\n\n BN.prototype.imuln = function imuln (num) {\n var isNegNum = num < 0;\n if (isNegNum) num = -num;\n\n assert(typeof num === 'number');\n assert(num < 0x4000000);\n\n // Carry\n var carry = 0;\n for (var i = 0; i < this.length; i++) {\n var w = (this.words[i] | 0) * num;\n var lo = (w & 0x3ffffff) + (carry & 0x3ffffff);\n carry >>= 26;\n carry += (w / 0x4000000) | 0;\n // NOTE: lo is 27bit maximum\n carry += lo >>> 26;\n this.words[i] = lo & 0x3ffffff;\n }\n\n if (carry !== 0) {\n this.words[i] = carry;\n this.length++;\n }\n this.length = num === 0 ? 1 : this.length;\n\n return isNegNum ? this.ineg() : this;\n };\n\n BN.prototype.muln = function muln (num) {\n return this.clone().imuln(num);\n };\n\n // `this` * `this`\n BN.prototype.sqr = function sqr () {\n return this.mul(this);\n };\n\n // `this` * `this` in-place\n BN.prototype.isqr = function isqr () {\n return this.imul(this.clone());\n };\n\n // Math.pow(`this`, `num`)\n BN.prototype.pow = function pow (num) {\n var w = toBitArray(num);\n if (w.length === 0) return new BN(1);\n\n // Skip leading zeroes\n var res = this;\n for (var i = 0; i < w.length; i++, res = res.sqr()) {\n if (w[i] !== 0) break;\n }\n\n if (++i < w.length) {\n for (var q = res.sqr(); i < w.length; i++, q = q.sqr()) {\n if (w[i] === 0) continue;\n\n res = res.mul(q);\n }\n }\n\n return res;\n };\n\n // Shift-left in-place\n BN.prototype.iushln = function iushln (bits) {\n assert(typeof bits === 'number' && bits >= 0);\n var r = bits % 26;\n var s = (bits - r) / 26;\n var carryMask = (0x3ffffff >>> (26 - r)) << (26 - r);\n var i;\n\n if (r !== 0) {\n var carry = 0;\n\n for (i = 0; i < this.length; i++) {\n var newCarry = this.words[i] & carryMask;\n var c = ((this.words[i] | 0) - newCarry) << r;\n this.words[i] = c | carry;\n carry = newCarry >>> (26 - r);\n }\n\n if (carry) {\n this.words[i] = carry;\n this.length++;\n }\n }\n\n if (s !== 0) {\n for (i = this.length - 1; i >= 0; i--) {\n this.words[i + s] = this.words[i];\n }\n\n for (i = 0; i < s; i++) {\n this.words[i] = 0;\n }\n\n this.length += s;\n }\n\n return this._strip();\n };\n\n BN.prototype.ishln = function ishln (bits) {\n // TODO(indutny): implement me\n assert(this.negative === 0);\n return this.iushln(bits);\n };\n\n // Shift-right in-place\n // NOTE: `hint` is a lowest bit before trailing zeroes\n // NOTE: if `extended` is present - it will be filled with destroyed bits\n BN.prototype.iushrn = function iushrn (bits, hint, extended) {\n assert(typeof bits === 'number' && bits >= 0);\n var h;\n if (hint) {\n h = (hint - (hint % 26)) / 26;\n } else {\n h = 0;\n }\n\n var r = bits % 26;\n var s = Math.min((bits - r) / 26, this.length);\n var mask = 0x3ffffff ^ ((0x3ffffff >>> r) << r);\n var maskedWords = extended;\n\n h -= s;\n h = Math.max(0, h);\n\n // Extended mode, copy masked part\n if (maskedWords) {\n for (var i = 0; i < s; i++) {\n maskedWords.words[i] = this.words[i];\n }\n maskedWords.length = s;\n }\n\n if (s === 0) {\n // No-op, we should not move anything at all\n } else if (this.length > s) {\n this.length -= s;\n for (i = 0; i < this.length; i++) {\n this.words[i] = this.words[i + s];\n }\n } else {\n this.words[0] = 0;\n this.length = 1;\n }\n\n var carry = 0;\n for (i = this.length - 1; i >= 0 && (carry !== 0 || i >= h); i--) {\n var word = this.words[i] | 0;\n this.words[i] = (carry << (26 - r)) | (word >>> r);\n carry = word & mask;\n }\n\n // Push carried bits as a mask\n if (maskedWords && carry !== 0) {\n maskedWords.words[maskedWords.length++] = carry;\n }\n\n if (this.length === 0) {\n this.words[0] = 0;\n this.length = 1;\n }\n\n return this._strip();\n };\n\n BN.prototype.ishrn = function ishrn (bits, hint, extended) {\n // TODO(indutny): implement me\n assert(this.negative === 0);\n return this.iushrn(bits, hint, extended);\n };\n\n // Shift-left\n BN.prototype.shln = function shln (bits) {\n return this.clone().ishln(bits);\n };\n\n BN.prototype.ushln = function ushln (bits) {\n return this.clone().iushln(bits);\n };\n\n // Shift-right\n BN.prototype.shrn = function shrn (bits) {\n return this.clone().ishrn(bits);\n };\n\n BN.prototype.ushrn = function ushrn (bits) {\n return this.clone().iushrn(bits);\n };\n\n // Test if n bit is set\n BN.prototype.testn = function testn (bit) {\n assert(typeof bit === 'number' && bit >= 0);\n var r = bit % 26;\n var s = (bit - r) / 26;\n var q = 1 << r;\n\n // Fast case: bit is much higher than all existing words\n if (this.length <= s) return false;\n\n // Check bit and return\n var w = this.words[s];\n\n return !!(w & q);\n };\n\n // Return only lowers bits of number (in-place)\n BN.prototype.imaskn = function imaskn (bits) {\n assert(typeof bits === 'number' && bits >= 0);\n var r = bits % 26;\n var s = (bits - r) / 26;\n\n assert(this.negative === 0, 'imaskn works only with positive numbers');\n\n if (this.length <= s) {\n return this;\n }\n\n if (r !== 0) {\n s++;\n }\n this.length = Math.min(s, this.length);\n\n if (r !== 0) {\n var mask = 0x3ffffff ^ ((0x3ffffff >>> r) << r);\n this.words[this.length - 1] &= mask;\n }\n\n return this._strip();\n };\n\n // Return only lowers bits of number\n BN.prototype.maskn = function maskn (bits) {\n return this.clone().imaskn(bits);\n };\n\n // Add plain number `num` to `this`\n BN.prototype.iaddn = function iaddn (num) {\n assert(typeof num === 'number');\n assert(num < 0x4000000);\n if (num < 0) return this.isubn(-num);\n\n // Possible sign change\n if (this.negative !== 0) {\n if (this.length === 1 && (this.words[0] | 0) <= num) {\n this.words[0] = num - (this.words[0] | 0);\n this.negative = 0;\n return this;\n }\n\n this.negative = 0;\n this.isubn(num);\n this.negative = 1;\n return this;\n }\n\n // Add without checks\n return this._iaddn(num);\n };\n\n BN.prototype._iaddn = function _iaddn (num) {\n this.words[0] += num;\n\n // Carry\n for (var i = 0; i < this.length && this.words[i] >= 0x4000000; i++) {\n this.words[i] -= 0x4000000;\n if (i === this.length - 1) {\n this.words[i + 1] = 1;\n } else {\n this.words[i + 1]++;\n }\n }\n this.length = Math.max(this.length, i + 1);\n\n return this;\n };\n\n // Subtract plain number `num` from `this`\n BN.prototype.isubn = function isubn (num) {\n assert(typeof num === 'number');\n assert(num < 0x4000000);\n if (num < 0) return this.iaddn(-num);\n\n if (this.negative !== 0) {\n this.negative = 0;\n this.iaddn(num);\n this.negative = 1;\n return this;\n }\n\n this.words[0] -= num;\n\n if (this.length === 1 && this.words[0] < 0) {\n this.words[0] = -this.words[0];\n this.negative = 1;\n } else {\n // Carry\n for (var i = 0; i < this.length && this.words[i] < 0; i++) {\n this.words[i] += 0x4000000;\n this.words[i + 1] -= 1;\n }\n }\n\n return this._strip();\n };\n\n BN.prototype.addn = function addn (num) {\n return this.clone().iaddn(num);\n };\n\n BN.prototype.subn = function subn (num) {\n return this.clone().isubn(num);\n };\n\n BN.prototype.iabs = function iabs () {\n this.negative = 0;\n\n return this;\n };\n\n BN.prototype.abs = function abs () {\n return this.clone().iabs();\n };\n\n BN.prototype._ishlnsubmul = function _ishlnsubmul (num, mul, shift) {\n var len = num.length + shift;\n var i;\n\n this._expand(len);\n\n var w;\n var carry = 0;\n for (i = 0; i < num.length; i++) {\n w = (this.words[i + shift] | 0) + carry;\n var right = (num.words[i] | 0) * mul;\n w -= right & 0x3ffffff;\n carry = (w >> 26) - ((right / 0x4000000) | 0);\n this.words[i + shift] = w & 0x3ffffff;\n }\n for (; i < this.length - shift; i++) {\n w = (this.words[i + shift] | 0) + carry;\n carry = w >> 26;\n this.words[i + shift] = w & 0x3ffffff;\n }\n\n if (carry === 0) return this._strip();\n\n // Subtraction overflow\n assert(carry === -1);\n carry = 0;\n for (i = 0; i < this.length; i++) {\n w = -(this.words[i] | 0) + carry;\n carry = w >> 26;\n this.words[i] = w & 0x3ffffff;\n }\n this.negative = 1;\n\n return this._strip();\n };\n\n BN.prototype._wordDiv = function _wordDiv (num, mode) {\n var shift = this.length - num.length;\n\n var a = this.clone();\n var b = num;\n\n // Normalize\n var bhi = b.words[b.length - 1] | 0;\n var bhiBits = this._countBits(bhi);\n shift = 26 - bhiBits;\n if (shift !== 0) {\n b = b.ushln(shift);\n a.iushln(shift);\n bhi = b.words[b.length - 1] | 0;\n }\n\n // Initialize quotient\n var m = a.length - b.length;\n var q;\n\n if (mode !== 'mod') {\n q = new BN(null);\n q.length = m + 1;\n q.words = new Array(q.length);\n for (var i = 0; i < q.length; i++) {\n q.words[i] = 0;\n }\n }\n\n var diff = a.clone()._ishlnsubmul(b, 1, m);\n if (diff.negative === 0) {\n a = diff;\n if (q) {\n q.words[m] = 1;\n }\n }\n\n for (var j = m - 1; j >= 0; j--) {\n var qj = (a.words[b.length + j] | 0) * 0x4000000 +\n (a.words[b.length + j - 1] | 0);\n\n // NOTE: (qj / bhi) is (0x3ffffff * 0x4000000 + 0x3ffffff) / 0x2000000 max\n // (0x7ffffff)\n qj = Math.min((qj / bhi) | 0, 0x3ffffff);\n\n a._ishlnsubmul(b, qj, j);\n while (a.negative !== 0) {\n qj--;\n a.negative = 0;\n a._ishlnsubmul(b, 1, j);\n if (!a.isZero()) {\n a.negative ^= 1;\n }\n }\n if (q) {\n q.words[j] = qj;\n }\n }\n if (q) {\n q._strip();\n }\n a._strip();\n\n // Denormalize\n if (mode !== 'div' && shift !== 0) {\n a.iushrn(shift);\n }\n\n return {\n div: q || null,\n mod: a\n };\n };\n\n // NOTE: 1) `mode` can be set to `mod` to request mod only,\n // to `div` to request div only, or be absent to\n // request both div & mod\n // 2) `positive` is true if unsigned mod is requested\n BN.prototype.divmod = function divmod (num, mode, positive) {\n assert(!num.isZero());\n\n if (this.isZero()) {\n return {\n div: new BN(0),\n mod: new BN(0)\n };\n }\n\n var div, mod, res;\n if (this.negative !== 0 && num.negative === 0) {\n res = this.neg().divmod(num, mode);\n\n if (mode !== 'mod') {\n div = res.div.neg();\n }\n\n if (mode !== 'div') {\n mod = res.mod.neg();\n if (positive && mod.negative !== 0) {\n mod.iadd(num);\n }\n }\n\n return {\n div: div,\n mod: mod\n };\n }\n\n if (this.negative === 0 && num.negative !== 0) {\n res = this.divmod(num.neg(), mode);\n\n if (mode !== 'mod') {\n div = res.div.neg();\n }\n\n return {\n div: div,\n mod: res.mod\n };\n }\n\n if ((this.negative & num.negative) !== 0) {\n res = this.neg().divmod(num.neg(), mode);\n\n if (mode !== 'div') {\n mod = res.mod.neg();\n if (positive && mod.negative !== 0) {\n mod.isub(num);\n }\n }\n\n return {\n div: res.div,\n mod: mod\n };\n }\n\n // Both numbers are positive at this point\n\n // Strip both numbers to approximate shift value\n if (num.length > this.length || this.cmp(num) < 0) {\n return {\n div: new BN(0),\n mod: this\n };\n }\n\n // Very short reduction\n if (num.length === 1) {\n if (mode === 'div') {\n return {\n div: this.divn(num.words[0]),\n mod: null\n };\n }\n\n if (mode === 'mod') {\n return {\n div: null,\n mod: new BN(this.modrn(num.words[0]))\n };\n }\n\n return {\n div: this.divn(num.words[0]),\n mod: new BN(this.modrn(num.words[0]))\n };\n }\n\n return this._wordDiv(num, mode);\n };\n\n // Find `this` / `num`\n BN.prototype.div = function div (num) {\n return this.divmod(num, 'div', false).div;\n };\n\n // Find `this` % `num`\n BN.prototype.mod = function mod (num) {\n return this.divmod(num, 'mod', false).mod;\n };\n\n BN.prototype.umod = function umod (num) {\n return this.divmod(num, 'mod', true).mod;\n };\n\n // Find Round(`this` / `num`)\n BN.prototype.divRound = function divRound (num) {\n var dm = this.divmod(num);\n\n // Fast case - exact division\n if (dm.mod.isZero()) return dm.div;\n\n var mod = dm.div.negative !== 0 ? dm.mod.isub(num) : dm.mod;\n\n var half = num.ushrn(1);\n var r2 = num.andln(1);\n var cmp = mod.cmp(half);\n\n // Round down\n if (cmp < 0 || (r2 === 1 && cmp === 0)) return dm.div;\n\n // Round up\n return dm.div.negative !== 0 ? dm.div.isubn(1) : dm.div.iaddn(1);\n };\n\n BN.prototype.modrn = function modrn (num) {\n var isNegNum = num < 0;\n if (isNegNum) num = -num;\n\n assert(num <= 0x3ffffff);\n var p = (1 << 26) % num;\n\n var acc = 0;\n for (var i = this.length - 1; i >= 0; i--) {\n acc = (p * acc + (this.words[i] | 0)) % num;\n }\n\n return isNegNum ? -acc : acc;\n };\n\n // WARNING: DEPRECATED\n BN.prototype.modn = function modn (num) {\n return this.modrn(num);\n };\n\n // In-place division by number\n BN.prototype.idivn = function idivn (num) {\n var isNegNum = num < 0;\n if (isNegNum) num = -num;\n\n assert(num <= 0x3ffffff);\n\n var carry = 0;\n for (var i = this.length - 1; i >= 0; i--) {\n var w = (this.words[i] | 0) + carry * 0x4000000;\n this.words[i] = (w / num) | 0;\n carry = w % num;\n }\n\n this._strip();\n return isNegNum ? this.ineg() : this;\n };\n\n BN.prototype.divn = function divn (num) {\n return this.clone().idivn(num);\n };\n\n BN.prototype.egcd = function egcd (p) {\n assert(p.negative === 0);\n assert(!p.isZero());\n\n var x = this;\n var y = p.clone();\n\n if (x.negative !== 0) {\n x = x.umod(p);\n } else {\n x = x.clone();\n }\n\n // A * x + B * y = x\n var A = new BN(1);\n var B = new BN(0);\n\n // C * x + D * y = y\n var C = new BN(0);\n var D = new BN(1);\n\n var g = 0;\n\n while (x.isEven() && y.isEven()) {\n x.iushrn(1);\n y.iushrn(1);\n ++g;\n }\n\n var yp = y.clone();\n var xp = x.clone();\n\n while (!x.isZero()) {\n for (var i = 0, im = 1; (x.words[0] & im) === 0 && i < 26; ++i, im <<= 1);\n if (i > 0) {\n x.iushrn(i);\n while (i-- > 0) {\n if (A.isOdd() || B.isOdd()) {\n A.iadd(yp);\n B.isub(xp);\n }\n\n A.iushrn(1);\n B.iushrn(1);\n }\n }\n\n for (var j = 0, jm = 1; (y.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1);\n if (j > 0) {\n y.iushrn(j);\n while (j-- > 0) {\n if (C.isOdd() || D.isOdd()) {\n C.iadd(yp);\n D.isub(xp);\n }\n\n C.iushrn(1);\n D.iushrn(1);\n }\n }\n\n if (x.cmp(y) >= 0) {\n x.isub(y);\n A.isub(C);\n B.isub(D);\n } else {\n y.isub(x);\n C.isub(A);\n D.isub(B);\n }\n }\n\n return {\n a: C,\n b: D,\n gcd: y.iushln(g)\n };\n };\n\n // This is reduced incarnation of the binary EEA\n // above, designated to invert members of the\n // _prime_ fields F(p) at a maximal speed\n BN.prototype._invmp = function _invmp (p) {\n assert(p.negative === 0);\n assert(!p.isZero());\n\n var a = this;\n var b = p.clone();\n\n if (a.negative !== 0) {\n a = a.umod(p);\n } else {\n a = a.clone();\n }\n\n var x1 = new BN(1);\n var x2 = new BN(0);\n\n var delta = b.clone();\n\n while (a.cmpn(1) > 0 && b.cmpn(1) > 0) {\n for (var i = 0, im = 1; (a.words[0] & im) === 0 && i < 26; ++i, im <<= 1);\n if (i > 0) {\n a.iushrn(i);\n while (i-- > 0) {\n if (x1.isOdd()) {\n x1.iadd(delta);\n }\n\n x1.iushrn(1);\n }\n }\n\n for (var j = 0, jm = 1; (b.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1);\n if (j > 0) {\n b.iushrn(j);\n while (j-- > 0) {\n if (x2.isOdd()) {\n x2.iadd(delta);\n }\n\n x2.iushrn(1);\n }\n }\n\n if (a.cmp(b) >= 0) {\n a.isub(b);\n x1.isub(x2);\n } else {\n b.isub(a);\n x2.isub(x1);\n }\n }\n\n var res;\n if (a.cmpn(1) === 0) {\n res = x1;\n } else {\n res = x2;\n }\n\n if (res.cmpn(0) < 0) {\n res.iadd(p);\n }\n\n return res;\n };\n\n BN.prototype.gcd = function gcd (num) {\n if (this.isZero()) return num.abs();\n if (num.isZero()) return this.abs();\n\n var a = this.clone();\n var b = num.clone();\n a.negative = 0;\n b.negative = 0;\n\n // Remove common factor of two\n for (var shift = 0; a.isEven() && b.isEven(); shift++) {\n a.iushrn(1);\n b.iushrn(1);\n }\n\n do {\n while (a.isEven()) {\n a.iushrn(1);\n }\n while (b.isEven()) {\n b.iushrn(1);\n }\n\n var r = a.cmp(b);\n if (r < 0) {\n // Swap `a` and `b` to make `a` always bigger than `b`\n var t = a;\n a = b;\n b = t;\n } else if (r === 0 || b.cmpn(1) === 0) {\n break;\n }\n\n a.isub(b);\n } while (true);\n\n return b.iushln(shift);\n };\n\n // Invert number in the field F(num)\n BN.prototype.invm = function invm (num) {\n return this.egcd(num).a.umod(num);\n };\n\n BN.prototype.isEven = function isEven () {\n return (this.words[0] & 1) === 0;\n };\n\n BN.prototype.isOdd = function isOdd () {\n return (this.words[0] & 1) === 1;\n };\n\n // And first word and num\n BN.prototype.andln = function andln (num) {\n return this.words[0] & num;\n };\n\n // Increment at the bit position in-line\n BN.prototype.bincn = function bincn (bit) {\n assert(typeof bit === 'number');\n var r = bit % 26;\n var s = (bit - r) / 26;\n var q = 1 << r;\n\n // Fast case: bit is much higher than all existing words\n if (this.length <= s) {\n this._expand(s + 1);\n this.words[s] |= q;\n return this;\n }\n\n // Add bit and propagate, if needed\n var carry = q;\n for (var i = s; carry !== 0 && i < this.length; i++) {\n var w = this.words[i] | 0;\n w += carry;\n carry = w >>> 26;\n w &= 0x3ffffff;\n this.words[i] = w;\n }\n if (carry !== 0) {\n this.words[i] = carry;\n this.length++;\n }\n return this;\n };\n\n BN.prototype.isZero = function isZero () {\n return this.length === 1 && this.words[0] === 0;\n };\n\n BN.prototype.cmpn = function cmpn (num) {\n var negative = num < 0;\n\n if (this.negative !== 0 && !negative) return -1;\n if (this.negative === 0 && negative) return 1;\n\n this._strip();\n\n var res;\n if (this.length > 1) {\n res = 1;\n } else {\n if (negative) {\n num = -num;\n }\n\n assert(num <= 0x3ffffff, 'Number is too big');\n\n var w = this.words[0] | 0;\n res = w === num ? 0 : w < num ? -1 : 1;\n }\n if (this.negative !== 0) return -res | 0;\n return res;\n };\n\n // Compare two numbers and return:\n // 1 - if `this` > `num`\n // 0 - if `this` == `num`\n // -1 - if `this` < `num`\n BN.prototype.cmp = function cmp (num) {\n if (this.negative !== 0 && num.negative === 0) return -1;\n if (this.negative === 0 && num.negative !== 0) return 1;\n\n var res = this.ucmp(num);\n if (this.negative !== 0) return -res | 0;\n return res;\n };\n\n // Unsigned comparison\n BN.prototype.ucmp = function ucmp (num) {\n // At this point both numbers have the same sign\n if (this.length > num.length) return 1;\n if (this.length < num.length) return -1;\n\n var res = 0;\n for (var i = this.length - 1; i >= 0; i--) {\n var a = this.words[i] | 0;\n var b = num.words[i] | 0;\n\n if (a === b) continue;\n if (a < b) {\n res = -1;\n } else if (a > b) {\n res = 1;\n }\n break;\n }\n return res;\n };\n\n BN.prototype.gtn = function gtn (num) {\n return this.cmpn(num) === 1;\n };\n\n BN.prototype.gt = function gt (num) {\n return this.cmp(num) === 1;\n };\n\n BN.prototype.gten = function gten (num) {\n return this.cmpn(num) >= 0;\n };\n\n BN.prototype.gte = function gte (num) {\n return this.cmp(num) >= 0;\n };\n\n BN.prototype.ltn = function ltn (num) {\n return this.cmpn(num) === -1;\n };\n\n BN.prototype.lt = function lt (num) {\n return this.cmp(num) === -1;\n };\n\n BN.prototype.lten = function lten (num) {\n return this.cmpn(num) <= 0;\n };\n\n BN.prototype.lte = function lte (num) {\n return this.cmp(num) <= 0;\n };\n\n BN.prototype.eqn = function eqn (num) {\n return this.cmpn(num) === 0;\n };\n\n BN.prototype.eq = function eq (num) {\n return this.cmp(num) === 0;\n };\n\n //\n // A reduce context, could be using montgomery or something better, depending\n // on the `m` itself.\n //\n BN.red = function red (num) {\n return new Red(num);\n };\n\n BN.prototype.toRed = function toRed (ctx) {\n assert(!this.red, 'Already a number in reduction context');\n assert(this.negative === 0, 'red works only with positives');\n return ctx.convertTo(this)._forceRed(ctx);\n };\n\n BN.prototype.fromRed = function fromRed () {\n assert(this.red, 'fromRed works only with numbers in reduction context');\n return this.red.convertFrom(this);\n };\n\n BN.prototype._forceRed = function _forceRed (ctx) {\n this.red = ctx;\n return this;\n };\n\n BN.prototype.forceRed = function forceRed (ctx) {\n assert(!this.red, 'Already a number in reduction context');\n return this._forceRed(ctx);\n };\n\n BN.prototype.redAdd = function redAdd (num) {\n assert(this.red, 'redAdd works only with red numbers');\n return this.red.add(this, num);\n };\n\n BN.prototype.redIAdd = function redIAdd (num) {\n assert(this.red, 'redIAdd works only with red numbers');\n return this.red.iadd(this, num);\n };\n\n BN.prototype.redSub = function redSub (num) {\n assert(this.red, 'redSub works only with red numbers');\n return this.red.sub(this, num);\n };\n\n BN.prototype.redISub = function redISub (num) {\n assert(this.red, 'redISub works only with red numbers');\n return this.red.isub(this, num);\n };\n\n BN.prototype.redShl = function redShl (num) {\n assert(this.red, 'redShl works only with red numbers');\n return this.red.shl(this, num);\n };\n\n BN.prototype.redMul = function redMul (num) {\n assert(this.red, 'redMul works only with red numbers');\n this.red._verify2(this, num);\n return this.red.mul(this, num);\n };\n\n BN.prototype.redIMul = function redIMul (num) {\n assert(this.red, 'redMul works only with red numbers');\n this.red._verify2(this, num);\n return this.red.imul(this, num);\n };\n\n BN.prototype.redSqr = function redSqr () {\n assert(this.red, 'redSqr works only with red numbers');\n this.red._verify1(this);\n return this.red.sqr(this);\n };\n\n BN.prototype.redISqr = function redISqr () {\n assert(this.red, 'redISqr works only with red numbers');\n this.red._verify1(this);\n return this.red.isqr(this);\n };\n\n // Square root over p\n BN.prototype.redSqrt = function redSqrt () {\n assert(this.red, 'redSqrt works only with red numbers');\n this.red._verify1(this);\n return this.red.sqrt(this);\n };\n\n BN.prototype.redInvm = function redInvm () {\n assert(this.red, 'redInvm works only with red numbers');\n this.red._verify1(this);\n return this.red.invm(this);\n };\n\n // Return negative clone of `this` % `red modulo`\n BN.prototype.redNeg = function redNeg () {\n assert(this.red, 'redNeg works only with red numbers');\n this.red._verify1(this);\n return this.red.neg(this);\n };\n\n BN.prototype.redPow = function redPow (num) {\n assert(this.red && !num.red, 'redPow(normalNum)');\n this.red._verify1(this);\n return this.red.pow(this, num);\n };\n\n // Prime numbers with efficient reduction\n var primes = {\n k256: null,\n p224: null,\n p192: null,\n p25519: null\n };\n\n // Pseudo-Mersenne prime\n function MPrime (name, p) {\n // P = 2 ^ N - K\n this.name = name;\n this.p = new BN(p, 16);\n this.n = this.p.bitLength();\n this.k = new BN(1).iushln(this.n).isub(this.p);\n\n this.tmp = this._tmp();\n }\n\n MPrime.prototype._tmp = function _tmp () {\n var tmp = new BN(null);\n tmp.words = new Array(Math.ceil(this.n / 13));\n return tmp;\n };\n\n MPrime.prototype.ireduce = function ireduce (num) {\n // Assumes that `num` is less than `P^2`\n // num = HI * (2 ^ N - K) + HI * K + LO = HI * K + LO (mod P)\n var r = num;\n var rlen;\n\n do {\n this.split(r, this.tmp);\n r = this.imulK(r);\n r = r.iadd(this.tmp);\n rlen = r.bitLength();\n } while (rlen > this.n);\n\n var cmp = rlen < this.n ? -1 : r.ucmp(this.p);\n if (cmp === 0) {\n r.words[0] = 0;\n r.length = 1;\n } else if (cmp > 0) {\n r.isub(this.p);\n } else {\n if (r.strip !== undefined) {\n // r is a BN v4 instance\n r.strip();\n } else {\n // r is a BN v5 instance\n r._strip();\n }\n }\n\n return r;\n };\n\n MPrime.prototype.split = function split (input, out) {\n input.iushrn(this.n, 0, out);\n };\n\n MPrime.prototype.imulK = function imulK (num) {\n return num.imul(this.k);\n };\n\n function K256 () {\n MPrime.call(\n this,\n 'k256',\n 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f');\n }\n inherits(K256, MPrime);\n\n K256.prototype.split = function split (input, output) {\n // 256 = 9 * 26 + 22\n var mask = 0x3fffff;\n\n var outLen = Math.min(input.length, 9);\n for (var i = 0; i < outLen; i++) {\n output.words[i] = input.words[i];\n }\n output.length = outLen;\n\n if (input.length <= 9) {\n input.words[0] = 0;\n input.length = 1;\n return;\n }\n\n // Shift by 9 limbs\n var prev = input.words[9];\n output.words[output.length++] = prev & mask;\n\n for (i = 10; i < input.length; i++) {\n var next = input.words[i] | 0;\n input.words[i - 10] = ((next & mask) << 4) | (prev >>> 22);\n prev = next;\n }\n prev >>>= 22;\n input.words[i - 10] = prev;\n if (prev === 0 && input.length > 10) {\n input.length -= 10;\n } else {\n input.length -= 9;\n }\n };\n\n K256.prototype.imulK = function imulK (num) {\n // K = 0x1000003d1 = [ 0x40, 0x3d1 ]\n num.words[num.length] = 0;\n num.words[num.length + 1] = 0;\n num.length += 2;\n\n // bounded at: 0x40 * 0x3ffffff + 0x3d0 = 0x100000390\n var lo = 0;\n for (var i = 0; i < num.length; i++) {\n var w = num.words[i] | 0;\n lo += w * 0x3d1;\n num.words[i] = lo & 0x3ffffff;\n lo = w * 0x40 + ((lo / 0x4000000) | 0);\n }\n\n // Fast length reduction\n if (num.words[num.length - 1] === 0) {\n num.length--;\n if (num.words[num.length - 1] === 0) {\n num.length--;\n }\n }\n return num;\n };\n\n function P224 () {\n MPrime.call(\n this,\n 'p224',\n 'ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001');\n }\n inherits(P224, MPrime);\n\n function P192 () {\n MPrime.call(\n this,\n 'p192',\n 'ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff');\n }\n inherits(P192, MPrime);\n\n function P25519 () {\n // 2 ^ 255 - 19\n MPrime.call(\n this,\n '25519',\n '7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed');\n }\n inherits(P25519, MPrime);\n\n P25519.prototype.imulK = function imulK (num) {\n // K = 0x13\n var carry = 0;\n for (var i = 0; i < num.length; i++) {\n var hi = (num.words[i] | 0) * 0x13 + carry;\n var lo = hi & 0x3ffffff;\n hi >>>= 26;\n\n num.words[i] = lo;\n carry = hi;\n }\n if (carry !== 0) {\n num.words[num.length++] = carry;\n }\n return num;\n };\n\n // Exported mostly for testing purposes, use plain name instead\n BN._prime = function prime (name) {\n // Cached version of prime\n if (primes[name]) return primes[name];\n\n var prime;\n if (name === 'k256') {\n prime = new K256();\n } else if (name === 'p224') {\n prime = new P224();\n } else if (name === 'p192') {\n prime = new P192();\n } else if (name === 'p25519') {\n prime = new P25519();\n } else {\n throw new Error('Unknown prime ' + name);\n }\n primes[name] = prime;\n\n return prime;\n };\n\n //\n // Base reduction engine\n //\n function Red (m) {\n if (typeof m === 'string') {\n var prime = BN._prime(m);\n this.m = prime.p;\n this.prime = prime;\n } else {\n assert(m.gtn(1), 'modulus must be greater than 1');\n this.m = m;\n this.prime = null;\n }\n }\n\n Red.prototype._verify1 = function _verify1 (a) {\n assert(a.negative === 0, 'red works only with positives');\n assert(a.red, 'red works only with red numbers');\n };\n\n Red.prototype._verify2 = function _verify2 (a, b) {\n assert((a.negative | b.negative) === 0, 'red works only with positives');\n assert(a.red && a.red === b.red,\n 'red works only with red numbers');\n };\n\n Red.prototype.imod = function imod (a) {\n if (this.prime) return this.prime.ireduce(a)._forceRed(this);\n\n move(a, a.umod(this.m)._forceRed(this));\n return a;\n };\n\n Red.prototype.neg = function neg (a) {\n if (a.isZero()) {\n return a.clone();\n }\n\n return this.m.sub(a)._forceRed(this);\n };\n\n Red.prototype.add = function add (a, b) {\n this._verify2(a, b);\n\n var res = a.add(b);\n if (res.cmp(this.m) >= 0) {\n res.isub(this.m);\n }\n return res._forceRed(this);\n };\n\n Red.prototype.iadd = function iadd (a, b) {\n this._verify2(a, b);\n\n var res = a.iadd(b);\n if (res.cmp(this.m) >= 0) {\n res.isub(this.m);\n }\n return res;\n };\n\n Red.prototype.sub = function sub (a, b) {\n this._verify2(a, b);\n\n var res = a.sub(b);\n if (res.cmpn(0) < 0) {\n res.iadd(this.m);\n }\n return res._forceRed(this);\n };\n\n Red.prototype.isub = function isub (a, b) {\n this._verify2(a, b);\n\n var res = a.isub(b);\n if (res.cmpn(0) < 0) {\n res.iadd(this.m);\n }\n return res;\n };\n\n Red.prototype.shl = function shl (a, num) {\n this._verify1(a);\n return this.imod(a.ushln(num));\n };\n\n Red.prototype.imul = function imul (a, b) {\n this._verify2(a, b);\n return this.imod(a.imul(b));\n };\n\n Red.prototype.mul = function mul (a, b) {\n this._verify2(a, b);\n return this.imod(a.mul(b));\n };\n\n Red.prototype.isqr = function isqr (a) {\n return this.imul(a, a.clone());\n };\n\n Red.prototype.sqr = function sqr (a) {\n return this.mul(a, a);\n };\n\n Red.prototype.sqrt = function sqrt (a) {\n if (a.isZero()) return a.clone();\n\n var mod3 = this.m.andln(3);\n assert(mod3 % 2 === 1);\n\n // Fast case\n if (mod3 === 3) {\n var pow = this.m.add(new BN(1)).iushrn(2);\n return this.pow(a, pow);\n }\n\n // Tonelli-Shanks algorithm (Totally unoptimized and slow)\n //\n // Find Q and S, that Q * 2 ^ S = (P - 1)\n var q = this.m.subn(1);\n var s = 0;\n while (!q.isZero() && q.andln(1) === 0) {\n s++;\n q.iushrn(1);\n }\n assert(!q.isZero());\n\n var one = new BN(1).toRed(this);\n var nOne = one.redNeg();\n\n // Find quadratic non-residue\n // NOTE: Max is such because of generalized Riemann hypothesis.\n var lpow = this.m.subn(1).iushrn(1);\n var z = this.m.bitLength();\n z = new BN(2 * z * z).toRed(this);\n\n while (this.pow(z, lpow).cmp(nOne) !== 0) {\n z.redIAdd(nOne);\n }\n\n var c = this.pow(z, q);\n var r = this.pow(a, q.addn(1).iushrn(1));\n var t = this.pow(a, q);\n var m = s;\n while (t.cmp(one) !== 0) {\n var tmp = t;\n for (var i = 0; tmp.cmp(one) !== 0; i++) {\n tmp = tmp.redSqr();\n }\n assert(i < m);\n var b = this.pow(c, new BN(1).iushln(m - i - 1));\n\n r = r.redMul(b);\n c = b.redSqr();\n t = t.redMul(c);\n m = i;\n }\n\n return r;\n };\n\n Red.prototype.invm = function invm (a) {\n var inv = a._invmp(this.m);\n if (inv.negative !== 0) {\n inv.negative = 0;\n return this.imod(inv).redNeg();\n } else {\n return this.imod(inv);\n }\n };\n\n Red.prototype.pow = function pow (a, num) {\n if (num.isZero()) return new BN(1).toRed(this);\n if (num.cmpn(1) === 0) return a.clone();\n\n var windowSize = 4;\n var wnd = new Array(1 << windowSize);\n wnd[0] = new BN(1).toRed(this);\n wnd[1] = a;\n for (var i = 2; i < wnd.length; i++) {\n wnd[i] = this.mul(wnd[i - 1], a);\n }\n\n var res = wnd[0];\n var current = 0;\n var currentLen = 0;\n var start = num.bitLength() % 26;\n if (start === 0) {\n start = 26;\n }\n\n for (i = num.length - 1; i >= 0; i--) {\n var word = num.words[i];\n for (var j = start - 1; j >= 0; j--) {\n var bit = (word >> j) & 1;\n if (res !== wnd[0]) {\n res = this.sqr(res);\n }\n\n if (bit === 0 && current === 0) {\n currentLen = 0;\n continue;\n }\n\n current <<= 1;\n current |= bit;\n currentLen++;\n if (currentLen !== windowSize && (i !== 0 || j !== 0)) continue;\n\n res = this.mul(res, wnd[current]);\n currentLen = 0;\n current = 0;\n }\n start = 26;\n }\n\n return res;\n };\n\n Red.prototype.convertTo = function convertTo (num) {\n var r = num.umod(this.m);\n\n return r === num ? r.clone() : r;\n };\n\n Red.prototype.convertFrom = function convertFrom (num) {\n var res = num.clone();\n res.red = null;\n return res;\n };\n\n //\n // Montgomery method engine\n //\n\n BN.mont = function mont (num) {\n return new Mont(num);\n };\n\n function Mont (m) {\n Red.call(this, m);\n\n this.shift = this.m.bitLength();\n if (this.shift % 26 !== 0) {\n this.shift += 26 - (this.shift % 26);\n }\n\n this.r = new BN(1).iushln(this.shift);\n this.r2 = this.imod(this.r.sqr());\n this.rinv = this.r._invmp(this.m);\n\n this.minv = this.rinv.mul(this.r).isubn(1).div(this.m);\n this.minv = this.minv.umod(this.r);\n this.minv = this.r.sub(this.minv);\n }\n inherits(Mont, Red);\n\n Mont.prototype.convertTo = function convertTo (num) {\n return this.imod(num.ushln(this.shift));\n };\n\n Mont.prototype.convertFrom = function convertFrom (num) {\n var r = this.imod(num.mul(this.rinv));\n r.red = null;\n return r;\n };\n\n Mont.prototype.imul = function imul (a, b) {\n if (a.isZero() || b.isZero()) {\n a.words[0] = 0;\n a.length = 1;\n return a;\n }\n\n var t = a.imul(b);\n var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m);\n var u = t.isub(c).iushrn(this.shift);\n var res = u;\n\n if (u.cmp(this.m) >= 0) {\n res = u.isub(this.m);\n } else if (u.cmpn(0) < 0) {\n res = u.iadd(this.m);\n }\n\n return res._forceRed(this);\n };\n\n Mont.prototype.mul = function mul (a, b) {\n if (a.isZero() || b.isZero()) return new BN(0)._forceRed(this);\n\n var t = a.mul(b);\n var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m);\n var u = t.isub(c).iushrn(this.shift);\n var res = u;\n if (u.cmp(this.m) >= 0) {\n res = u.isub(this.m);\n } else if (u.cmpn(0) < 0) {\n res = u.iadd(this.m);\n }\n\n return res._forceRed(this);\n };\n\n Mont.prototype.invm = function invm (a) {\n // (AR)^-1 * R^2 = (A^-1 * R^-1) * R^2 = A^-1 * R\n var res = this.imod(a._invmp(this.m).mul(this.r2));\n return res._forceRed(this);\n };\n})(typeof module === 'undefined' || module, this);\n","import type { BaseSdkOptions, Package } from '@cetusprotocol/common-sdk'\nimport { SdkWrapper } from '@cetusprotocol/common-sdk'\nimport { ConfigModule, RewarderModule, VestModule } from './modules'\nimport { PoolModule } from './modules/poolModule'\nimport { PositionModule } from './modules/positionModule'\nimport { SwapModule } from './modules/swapModule'\nimport { ClmmConfig } from './types/clmm_type'\nimport { CetusConfigs } from './types/config_type'\nimport { clmmMainnet } from './config/mainnet'\nimport { clmmTestnet } from './config/testnet'\nimport { VestConfigs } from './types/vest'\n\n/**\n * Represents options and configurations for an SDK.\n */\nexport interface SdkOptions extends BaseSdkOptions {\n /**\n * Package containing Cetus protocol configurations.\n */\n cetus_config: Package<CetusConfigs>\n\n /**\n * Package containing Cryptocurrency Liquidity Mining Module (CLMM) pool configurations.\n */\n clmm_pool: Package<ClmmConfig>\n\n /**\n * Package containing integration-related configurations.\n */\n integrate: Package\n\n /**\n * The URL for the swap count\n */\n stats_pools_url?: string\n\n clmm_vest?: Package<VestConfigs>\n}\n\n/**\n * The entry class of CetusClmmSDK, which is almost responsible for all interactions with CLMM.\n */\nexport class CetusClmmSDK extends SdkWrapper<SdkOptions> {\n /**\n * Provide interact with clmm pools with a pool router interface.\n */\n protected _pool: PoolModule\n\n /**\n * Provide interact with a position rewarder interface.\n */\n protected _rewarder: RewarderModule\n\n /**\n * Provide interact with a pool swap router interface.\n */\n protected _swap: SwapModule\n\n /**\n * Provide interact with clmm position with a position router interface.\n */\n protected _position: PositionModule\n\n /**\n * Provide interact with clmm pool and coin and launchpad pool config\n */\n protected _config: ConfigModule\n\n /**\n * Provide interact with clmm claim\n */\n protected _vest: VestModule\n\n constructor(options: SdkOptions) {\n super(options)\n\n this._swap = new SwapModule(this)\n this._pool = new PoolModule(this)\n this._position = new PositionModule(this)\n this._config = new ConfigModule(this)\n this._rewarder = new RewarderModule(this)\n this._vest = new VestModule(this)\n }\n\n /**\n * Getter for the Pool property.\n * @returns {PoolModule} The Pool property value.\n */\n get Pool(): PoolModule {\n return this._pool\n }\n\n /**\n * Getter for the Position property.\n * @returns {PositionModule} The Position property value.\n */\n get Position(): PositionModule {\n return this._position\n }\n\n /**\n * Getter for the CetusConfig property.\n * @returns {ConfigModule} The CetusConfig property value.\n */\n get CetusConfig(): ConfigModule {\n return this._config\n }\n\n /**\n * Getter for the Rewarder property.\n * @returns {RewarderModule} The Rewarder property value.\n */\n get Rewarder(): RewarderModule {\n return this._rewarder\n }\n\n /**\n * Getter for the Swap property.\n * @returns {SwapModule} The Swap property value.\n */\n get Swap(): SwapModule {\n return this._swap\n }\n\n /**\n * Getter for the Vest property.\n * @returns {VestModule} The Vest property value.\n */\n get Vest(): VestModule {\n return this._vest\n }\n\n static createSDK(options: BaseSdkOptions): CetusClmmSDK {\n const { env = 'mainnet' } = options\n return env === 'mainnet'\n ? CetusClmmSDK.createCustomSDK({ ...clmmMainnet, ...options })\n : CetusClmmSDK.createCustomSDK({ ...clmmTestnet, ...options })\n }\n\n /**\n * Create a custom SDK instance with the given options\n * @param options The options for the SDK\n * @returns An instance of CetusBurnSDK\n */\n static createCustomSDK<T extends BaseSdkOptions>(options: T & SdkOptions): CetusClmmSDK {\n return new CetusClmmSDK(options)\n }\n}\n","import type { SuiObjectResponse } from '@mysten/sui/client'\nimport { normalizeSuiObjectId } from '@mysten/sui/utils'\nimport type { SuiAddressType, SuiResource } from '@cetusprotocol/common-sdk'\nimport {\n CACHE_TIME_24H,\n CACHE_TIME_5MIN,\n CachedContent,\n DETAILS_KEYS,\n extractStructTagFromType,\n fixCoinType,\n getFutureTime,\n getObjectFields,\n getObjectId,\n getObjectPreviousTransactionDigest,\n getObjectType,\n getPackagerConfigs,\n IModule,\n normalizeCoinType,\n} from '@cetusprotocol/common-sdk'\nimport { Base64 } from 'js-base64'\nimport { ConfigErrorCode, handleMessageError, PoolErrorCode } from '../errors/errors'\nimport type { CetusClmmSDK } from '../sdk'\nimport type { CetusConfigs, ClmmPoolConfig, CoinConfig, LaunchpadPoolConfig } from '../types'\n/**\n * Helper class to help interact with clmm pool and coin and launchpad pool config.\n */\nexport class ConfigModule implements IModule<CetusClmmSDK> {\n protected _sdk: CetusClmmSDK\n\n private readonly _cache: Record<string, CachedContent> = {}\n\n constructor(sdk: CetusClmmSDK) {\n this._sdk = sdk\n }\n\n get sdk() {\n return this._sdk\n }\n\n /**\n * Set default token list cache.\n * @param {CoinConfig[]}coin_list\n */\n setTokenListCache(coin_list: CoinConfig[]) {\n const { coin_list_handle } = getPackagerConfigs(this.sdk.sdkOptions.cetus_config)\n const cacheKey = `${coin_list_handle}_getCoinConfigs`\n const cacheData = this.getCache<CoinConfig[]>(cacheKey)\n const updatedCacheData = cacheData ? [...cacheData, ...coin_list] : coin_list\n this.updateCache(cacheKey, updatedCacheData)\n }\n\n /**\n * Get token config list by coin type list.\n * @param {SuiAddressType[]} coin_types Coin type list.\n * @returns {Promise<Record<string, CoinConfig>>} Token config map.\n */\n async getTokenListByCoinTypes(coin_types: SuiAddressType[]): Promise<Record<string, CoinConfig>> {\n const tokenMap: Record<string, CoinConfig> = {}\n const { coin_list_handle } = getPackagerConfigs(this.sdk.sdkOptions.cetus_config)\n const cacheKey = `${coin_list_handle}_getCoinConfigs`\n const cacheData = this.getCache<CoinConfig[]>(cacheKey)\n\n if (cacheData !== undefined) {\n const tokenList = cacheData\n for (const coinType of coin_types) {\n for (const token of tokenList) {\n if (normalizeCoinType(coinType) === normalizeCoinType(token.address)) {\n tokenMap[coinType] = token\n continue\n }\n }\n }\n }\n\n const unFoundArray = coin_types.filter((coinType: string) => {\n return tokenMap[coinType] === undefined\n })\n\n for (const coinType of unFoundArray) {\n const metadataKey = `${coinType}_metadata`\n const metadata = this.getCache<CoinConfig>(metadataKey)\n if (metadata !== undefined) {\n tokenMap[coinType] = metadata as CoinConfig\n } else {\n const data = await this._sdk.FullClient.getCoinMetadata({\n coinType,\n })\n if (data) {\n const token: CoinConfig = {\n id: data.id as string,\n pyth_id: '',\n name: data.name,\n symbol: data.symbol,\n official_symbol: data.symbol,\n coingecko_id: '',\n decimals: data.decimals,\n project_url: '',\n logo_url: data.iconUrl as string,\n address: coinType,\n }\n tokenMap[coinType] = token\n\n this.updateCache(metadataKey, token, CACHE_TIME_24H)\n } else {\n console.log(`not found ${coinType}`)\n }\n }\n }\n\n return tokenMap\n }\n\n /**\n * Get coin config list.\n * @param {boolean} force_refresh Whether to force a refresh of the cache entry.\n * @param {boolean} transform_extensions Whether to transform extensions.\n * @returns {Promise<CoinConfig[]>} Coin config list.\n */\n async getCoinConfigs(force_refresh = false, transform_extensions = true): Promise<CoinConfig[]> {\n const { coin_list_handle } = getPackagerConfigs(this.sdk.sdkOptions.cetus_config)\n const cacheKey = `${coin_list_handle}_getCoinConfigs`\n const cacheData = this.getCache<CoinConfig[]>(cacheKey, force_refresh)\n if (cacheData) {\n return cacheData\n }\n const res = await this._sdk.FullClient.getDynamicFieldsByPage(coin_list_handle)\n const warpIds = res.data.map((item: any) => {\n return item.objectId\n })\n const objects = await this._sdk.FullClient.batchGetObjects(warpIds, { showContent: true })\n const coinList: CoinConfig[] = []\n objects.forEach((object) => {\n if (object.error != null || object.data?.content?.dataType !== 'moveObject') {\n handleMessageError(\n PoolErrorCode.FetchError,\n `when getCoinConfigs get objects error: ${object.error}, please check the rpc and contracts address config.`,\n {\n [DETAILS_KEYS.METHOD_NAME]: 'getCoinConfigs',\n }\n )\n }\n\n const coin = this.buildCoinConfig(object, transform_extensions)\n this.updateCache(`${coin_list_handle}_${coin.address}_getCoinConfig`, coin, CACHE_TIME_24H)\n coinList.push({ ...coin })\n })\n this.updateCache(cacheKey, coinList, CACHE_TIME_24H)\n return coinList\n }\n\n /**\n * Get coin config by coin type.\n * @param {string} coin_type Coin type.\n * @param {boolean} force_refresh Whether to force a refresh of the cache entry.\n * @param {boolean} transform_extensions Whether to transform extensions.\n * @returns {Promise<CoinConfig>} Coin config.\n */\n async getCoinConfig(coin_type: string, force_refresh = false, transform_extensions = true): Promise<CoinConfig> {\n const { coin_list_handle } = getPackagerConfigs(this.sdk.sdkOptions.cetus_config)\n const cacheKey = `${coin_list_handle}_${coin_type}_getCoinConfig`\n const cacheData = this.getCache<CoinConfig>(cacheKey, force_refresh)\n if (cacheData) {\n return cacheData\n }\n const object = await this._sdk.FullClient.getDynamicFieldObject({\n parentId: coin_list_handle,\n name: {\n type: '0x1::type_name::TypeName',\n value: {\n name: fixCoinType(coin_type),\n },\n },\n })\n\n if (object.error != null || object.data?.content?.dataType !== 'moveObject') {\n handleMessageError(\n PoolErrorCode.FetchError,\n `when getCoinConfig get object error: ${object.error}, please check the rpc and contracts address config.`,\n {\n [DETAILS_KEYS.METHOD_NAME]: 'getCoinConfig',\n }\n )\n }\n\n const coin = this.buildCoinConfig(object, transform_extensions)\n this.updateCache(cacheKey, coin, CACHE_TIME_24H)\n return coin\n }\n\n /**\n * Build coin config.\n * @param {SuiObjectResponse} object Coin object.\n * @param {boolean} transform_extensions Whether to transform extensions.\n * @returns {CoinConfig} Coin config.\n */\n private buildCoinConfig(object: SuiObjectResponse, transform_extensions = true) {\n let fields = getObjectFields(object)\n\n fields = fields.value.fields\n const coin: any = { ...fields }\n\n coin.id = getObjectId(object)\n coin.address = extractStructTagFromType(fields.coin_type.fields.name).full_address\n if (fields.pyth_id) {\n coin.pyth_id = normalizeSuiObjectId(fields.pyth_id)\n }\n\n this.transformExtensions(coin, fields.extension_fields.fields.contents, transform_extensions)\n\n delete coin.coin_type\n return coin\n }\n\n /**\n * Get clmm pool config list.\n * @param force_refresh\n * @param transform_extensions\n * @returns\n */\n async getClmmPoolConfigs(force_refresh = false, transform_extensions = true): Promise<ClmmPoolConfig[]> {\n const { clmm_pools_handle } = getPackagerConfigs(this.sdk.sdkOptions.cetus_config)\n const cacheKey = `${clmm_pools_handle}_getClmmPoolConfigs`\n const cacheData = this.getCache<ClmmPoolConfig[]>(cacheKey, force_refresh)\n if (cacheData) {\n return cacheData\n }\n const res = await this._sdk.FullClient.getDynamicFieldsByPage(clmm_pools_handle)\n const warpIds = res.data.map((item: any) => {\n return item.objectId\n })\n const objects = await this._sdk.FullClient.batchGetObjects(warpIds, { showContent: true })\n const poolList: ClmmPoolConfig[] = []\n objects.forEach((object) => {\n if (object.error != null || object.data?.content?.dataType !== 'moveObject') {\n handleMessageError(\n PoolErrorCode.FetchError,\n `when getClmmPoolsConfigs get objects error: ${object.error}, please check the rpc and contracts address config.`,\n {\n [DETAILS_KEYS.METHOD_NAME]: 'getClmmPoolConfigs',\n }\n )\n }\n\n const pool = this.buildClmmPoolConfig(object, transform_extensions)\n this.updateCache(`${pool.pool_address}_getClmmPoolConfig`, pool, CACHE_TIME_24H)\n poolList.push({ ...pool })\n })\n this.updateCache(cacheKey, poolList, CACHE_TIME_24H)\n return poolList\n }\n\n async getClmmPoolConfig(pool_id: string, force_refresh = false, transform_extensions = true): Promise<ClmmPoolConfig> {\n const { clmm_pools_handle } = getPackagerConfigs(this.sdk.sdkOptions.cetus_config)\n const cacheKey = `${pool_id}_getClmmPoolConfig`\n const cacheData = this.getCache<ClmmPoolConfig>(cacheKey, force_refresh)\n if (cacheData) {\n return cacheData\n }\n const object = await this._sdk.FullClient.getDynamicFieldObject({\n parentId: clmm_pools_handle,\n name: {\n type: 'address',\n value: pool_id,\n },\n })\n const pool = this.buildClmmPoolConfig(object, transform_extensions)\n this.updateCache(cacheKey, pool, CACHE_TIME_24H)\n return pool\n }\n\n private buildClmmPoolConfig(object: SuiObjectResponse, transform_extensions = true) {\n let fields = getObjectFields(object)\n fields = fields.value.fields\n const pool: any = { ...fields }\n\n pool.id = getObjectId(object)\n pool.pool_address = normalizeSuiObjectId(fields.pool_address)\n\n this.transformExtensions(pool, fields.extension_fields.fields.contents, transform_extensions)\n return pool\n }\n\n /**\n * Get launchpad pool config list.\n * @param force_refresh\n * @returns\n */\n async getLaunchpadPoolConfigs(force_refresh = false, transform_extensions = true): Promise<LaunchpadPoolConfig[]> {\n const { launchpad_pools_handle } = getPackagerConfigs(this.sdk.sdkOptions.cetus_config)\n const cacheKey = `${launchpad_pools_handle}_getLaunchpadPoolConfigs`\n const cacheData = this.getCache<LaunchpadPoolConfig[]>(cacheKey, force_refresh)\n if (cacheData) {\n return cacheData\n }\n const res = await this._sdk.FullClient.getDynamicFieldsByPage(launchpad_pools_handle)\n const warpIds = res.data.map((item: any) => {\n return item.objectId\n })\n const objects = await this._sdk.FullClient.batchGetObjects(warpIds, { showContent: true })\n const poolList: LaunchpadPoolConfig[] = []\n objects.forEach((object) => {\n if (object.error != null || object.data?.content?.dataType !== 'moveObject') {\n handleMessageError(\n PoolErrorCode.FetchError,\n `when getCoinConfigs get objects error: ${object.error}, please check the rpc and contracts address config.`,\n {\n [DETAILS_KEYS.METHOD_NAME]: 'getLaunchpadPoolConfigs',\n }\n )\n }\n\n const pool = this.buildLaunchpadPoolConfig(object, transform_extensions)\n this.updateCache(`${pool.pool_address}_getLaunchpadPoolConfig`, pool, CACHE_TIME_24H)\n poolList.push({ ...pool })\n })\n this.updateCache(cacheKey, poolList, CACHE_TIME_24H)\n return poolList\n }\n\n async getLaunchpadPoolConfig(pool_id: string, force_refresh = false, transform_extensions = true): Promise<LaunchpadPoolConfig> {\n const { launchpad_pools_handle } = getPackagerConfigs(this.sdk.sdkOptions.cetus_config)\n const cacheKey = `${pool_id}_getLaunchpadPoolConfig`\n const cacheData = this.getCache<LaunchpadPoolConfig>(cacheKey, force_refresh)\n if (cacheData) {\n return cacheData\n }\n const object = await this._sdk.FullClient.getDynamicFieldObject({\n parentId: launchpad_pools_handle,\n name: {\n type: 'address',\n value: pool_id,\n },\n })\n const pool = this.buildLaunchpadPoolConfig(object, transform_extensions)\n this.updateCache(cacheKey, pool, CACHE_TIME_24H)\n return pool\n }\n\n private buildLaunchpadPoolConfig(object: SuiObjectResponse, transform_extensions = true) {\n let fields = getObjectFields(object)\n fields = fields.value.fields\n const pool: any = { ...fields }\n\n pool.id = getObjectId(object)\n pool.pool_address = normalizeSuiObjectId(fields.pool_address)\n\n this.transformExtensions(pool, fields.extension_fields.fields.contents, transform_extensions)\n const social_medias: {\n name: string\n link: string\n }[] = []\n fields.social_media.fields.contents.forEach((item: any) => {\n social_medias.push({\n name: item.fields.value.fields.name,\n link: item.fields.value.fields.link,\n })\n })\n pool.social_media = social_medias\n try {\n pool.regulation = decodeURIComponent(Base64.decode(pool.regulation).replace(/%/g, '%25'))\n } catch (error) {\n pool.regulation = Base64.decode(pool.regulation)\n }\n\n return pool\n }\n\n private transformExtensions(coin: any, data_array: any[], transform_extensions = true) {\n const extensions: any[] = []\n for (const item of data_array) {\n const { key } = item.fields\n let { value } = item.fields\n if (key === 'labels') {\n try {\n const decodedValue = decodeURIComponent(Base64.decode(value))\n try {\n value = JSON.parse(decodedValue)\n } catch {\n value = decodedValue\n }\n } catch (error) {}\n }\n if (transform_extensions) {\n coin[key] = value\n }\n extensions.push({\n key,\n value,\n })\n }\n delete coin.extension_fields\n\n if (!transform_extensions) {\n coin.extensions = extensions\n }\n }\n\n /**\n * Get the token config event.\n *\n * @param force_refresh Whether to force a refresh of the event.\n * @returns The token config event.\n */\n async getCetusConfig(force_refresh = false): Promise<CetusConfigs> {\n const packageObjectId = this._sdk.sdkOptions.cetus_config.package_id\n const cacheKey = `${packageObjectId}_getCetusConfig`\n\n const cacheData = this.getCache<CetusConfigs>(cacheKey, force_refresh)\n\n if (cacheData !== undefined) {\n return cacheData\n }\n\n const packageObject = await this._sdk.FullClient.getObject({\n id: packageObjectId,\n options: {\n showPreviousTransaction: true,\n },\n })\n\n const previousTx = getObjectPreviousTransactionDigest(packageObject) as string\n const objects: any = await this._sdk.FullClient.queryEventsByPage({ Transaction: previousTx })\n let tokenConfig: CetusConfigs = {\n coin_list_id: '',\n launchpad_pools_id: '',\n clmm_pools_id: '',\n admin_cap_id: '',\n global_config_id: '',\n coin_list_handle: '',\n launchpad_pools_handle: '',\n clmm_pools_handle: '',\n }\n\n if (objects.data.length > 0) {\n for (const item of objects.data) {\n const formatType = extractStructTagFromType(item.type)\n switch (formatType.name) {\n case `InitCoinListEvent`:\n tokenConfig.coin_list_id = item.parsedJson.coin_list_id\n break\n case `InitLaunchpadPoolsEvent`:\n tokenConfig.launchpad_pools_id = item.parsedJson.launchpad_pools_id\n break\n case `InitClmmPoolsEvent`:\n tokenConfig.clmm_pools_id = item.parsedJson.pools_id\n break\n case `InitConfigEvent`:\n tokenConfig.global_config_id = item.parsedJson.global_config_id\n tokenConfig.admin_cap_id = item.parsedJson.admin_cap_id\n break\n default:\n break\n }\n }\n }\n tokenConfig = await this.getCetusConfigHandle(tokenConfig)\n if (tokenConfig.clmm_pools_id.length > 0) {\n this.updateCache(cacheKey, tokenConfig, CACHE_TIME_24H)\n }\n return tokenConfig\n }\n\n private async getCetusConfigHandle(token_config: CetusConfigs): Promise<CetusConfigs> {\n const warpIds = [token_config.clmm_pools_id, token_config.coin_list_id, token_config.launchpad_pools_id]\n\n const res = await this._sdk.FullClient.multiGetObjects({ ids: warpIds, options: { showContent: true } })\n\n res.forEach((item) => {\n if (item.error != null || item.data?.content?.dataType !== 'moveObject') {\n handleMessageError(\n ConfigErrorCode.InvalidConfigHandle,\n `when getCetusConfigHandle get objects error: ${item.error}, please check the rpc and contracts address config.`,\n {\n [DETAILS_KEYS.METHOD_NAME]: 'getCetusConfigHandle',\n }\n )\n }\n\n const fields = getObjectFields(item)\n const type = getObjectType(item) as string\n switch (extractStructTagFromType(type).name) {\n case 'ClmmPools':\n token_config.clmm_pools_handle = fields.pools.fields.id.id\n break\n case 'CoinList':\n token_config.coin_list_handle = fields.coins.fields.id.id\n break\n case 'LaunchpadPools':\n token_config.launchpad_pools_handle = fields.pools.fields.id.id\n break\n default:\n break\n }\n })\n\n return token_config\n }\n\n /**\n * Updates the cache for the given key.\n * @param key The key of the cache entry to update.\n * @param data The data to store in the cache.\n * @param time The time in minutes after which the cache entry should expire.\n */\n updateCache(key: string, data: SuiResource, time = CACHE_TIME_5MIN) {\n let cacheData = this._cache[key]\n if (cacheData) {\n cacheData.overdue_time = getFutureTime(time)\n cacheData.value = data\n } else {\n cacheData = new CachedContent(data, getFutureTime(time))\n }\n this._cache[key] = cacheData\n }\n\n /**\n * Gets the cache entry for the given key.\n * @param key The key of the cache entry to get.\n * @param force_refresh Whether to force a refresh of the cache entry.\n * @returns The cache entry for the given key, or undefined if the cache entry does not exist or is expired.\n */\n getCache<T>(key: string, force_refresh = false): T | undefined {\n try {\n const cacheData = this._cache[key]\n if (!cacheData) {\n return undefined // No cache data available\n }\n\n if (force_refresh || !cacheData.isValid()) {\n delete this._cache[key]\n return undefined\n }\n\n return cacheData.value as T\n } catch (error) {\n console.error(`Error accessing cache for key ${key}:`, error)\n return undefined\n }\n }\n}\n","/**\n * base64.ts\n *\n * Licensed under the BSD 3-Clause License.\n * http://opensource.org/licenses/BSD-3-Clause\n *\n * References:\n * http://en.wikipedia.org/wiki/Base64\n *\n * @author Dan Kogai (https://github.com/dankogai)\n */\nconst version = '3.7.7';\n/**\n * @deprecated use lowercase `version`.\n */\nconst VERSION = version;\nconst _hasBuffer = typeof Buffer === 'function';\nconst _TD = typeof TextDecoder === 'function' ? new TextDecoder() : undefined;\nconst _TE = typeof TextEncoder === 'function' ? new TextEncoder() : undefined;\nconst b64ch = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';\nconst b64chs = Array.prototype.slice.call(b64ch);\nconst b64tab = ((a) => {\n let tab = {};\n a.forEach((c, i) => tab[c] = i);\n return tab;\n})(b64chs);\nconst b64re = /^(?:[A-Za-z\\d+\\/]{4})*?(?:[A-Za-z\\d+\\/]{2}(?:==)?|[A-Za-z\\d+\\/]{3}=?)?$/;\nconst _fromCC = String.fromCharCode.bind(String);\nconst _U8Afrom = typeof Uint8Array.from === 'function'\n ? Uint8Array.from.bind(Uint8Array)\n : (it) => new Uint8Array(Array.prototype.slice.call(it, 0));\nconst _mkUriSafe = (src) => src\n .replace(/=/g, '').replace(/[+\\/]/g, (m0) => m0 == '+' ? '-' : '_');\nconst _tidyB64 = (s) => s.replace(/[^A-Za-z0-9\\+\\/]/g, '');\n/**\n * polyfill version of `btoa`\n */\nconst btoaPolyfill = (bin) => {\n // console.log('polyfilled');\n let u32, c0, c1, c2, asc = '';\n const pad = bin.length % 3;\n for (let i = 0; i < bin.length;) {\n if ((c0 = bin.charCodeAt(i++)) > 255 ||\n (c1 = bin.charCodeAt(i++)) > 255 ||\n (c2 = bin.charCodeAt(i++)) > 255)\n throw new TypeError('invalid character found');\n u32 = (c0 << 16) | (c1 << 8) | c2;\n asc += b64chs[u32 >> 18 & 63]\n + b64chs[u32 >> 12 & 63]\n + b64chs[u32 >> 6 & 63]\n + b64chs[u32 & 63];\n }\n return pad ? asc.slice(0, pad - 3) + \"===\".substring(pad) : asc;\n};\n/**\n * does what `window.btoa` of web browsers do.\n * @param {String} bin binary string\n * @returns {string} Base64-encoded string\n */\nconst _btoa = typeof btoa === 'function' ? (bin) => btoa(bin)\n : _hasBuffer ? (bin) => Buffer.from(bin, 'binary').toString('base64')\n : btoaPolyfill;\nconst _fromUint8Array = _hasBuffer\n ? (u8a) => Buffer.from(u8a).toString('base64')\n : (u8a) => {\n // cf. https://stackoverflow.com/questions/12710001/how-to-convert-uint8-array-to-base64-encoded-string/12713326#12713326\n const maxargs = 0x1000;\n let strs = [];\n for (let i = 0, l = u8a.length; i < l; i += maxargs) {\n strs.push(_fromCC.apply(null, u8a.subarray(i, i + maxargs)));\n }\n return _btoa(strs.join(''));\n };\n/**\n * converts a Uint8Array to a Base64 string.\n * @param {boolean} [urlsafe] URL-and-filename-safe a la RFC4648 §5\n * @returns {string} Base64 string\n */\nconst fromUint8Array = (u8a, urlsafe = false) => urlsafe ? _mkUriSafe(_fromUint8Array(u8a)) : _fromUint8Array(u8a);\n// This trick is found broken https://github.com/dankogai/js-base64/issues/130\n// const utob = (src: string) => unescape(encodeURIComponent(src));\n// reverting good old fationed regexp\nconst cb_utob = (c) => {\n if (c.length < 2) {\n var cc = c.charCodeAt(0);\n return cc < 0x80 ? c\n : cc < 0x800 ? (_fromCC(0xc0 | (cc >>> 6))\n + _fromCC(0x80 | (cc & 0x3f)))\n : (_fromCC(0xe0 | ((cc >>> 12) & 0x0f))\n + _fromCC(0x80 | ((cc >>> 6) & 0x3f))\n + _fromCC(0x80 | (cc & 0x3f)));\n }\n else {\n var cc = 0x10000\n + (c.charCodeAt(0) - 0xD800) * 0x400\n + (c.charCodeAt(1) - 0xDC00);\n return (_fromCC(0xf0 | ((cc >>> 18) & 0x07))\n + _fromCC(0x80 | ((cc >>> 12) & 0x3f))\n + _fromCC(0x80 | ((cc >>> 6) & 0x3f))\n + _fromCC(0x80 | (cc & 0x3f)));\n }\n};\nconst re_utob = /[\\uD800-\\uDBFF][\\uDC00-\\uDFFFF]|[^\\x00-\\x7F]/g;\n/**\n * @deprecated should have been internal use only.\n * @param {string} src UTF-8 string\n * @returns {string} UTF-16 string\n */\nconst utob = (u) => u.replace(re_utob, cb_utob);\n//\nconst _encode = _hasBuffer\n ? (s) => Buffer.from(s, 'utf8').toString('base64')\n : _TE\n ? (s) => _fromUint8Array(_TE.encode(s))\n : (s) => _btoa(utob(s));\n/**\n * converts a UTF-8-encoded string to a Base64 string.\n * @param {boolean} [urlsafe] if `true` make the result URL-safe\n * @returns {string} Base64 string\n */\nconst encode = (src, urlsafe = false) => urlsafe\n ? _mkUriSafe(_encode(src))\n : _encode(src);\n/**\n * converts a UTF-8-encoded string to URL-safe Base64 RFC4648 §5.\n * @returns {string} Base64 string\n */\nconst encodeURI = (src) => encode(src, true);\n// This trick is found broken https://github.com/dankogai/js-base64/issues/130\n// const btou = (src: string) => decodeURIComponent(escape(src));\n// reverting good old fationed regexp\nconst re_btou = /[\\xC0-\\xDF][\\x80-\\xBF]|[\\xE0-\\xEF][\\x80-\\xBF]{2}|[\\xF0-\\xF7][\\x80-\\xBF]{3}/g;\nconst cb_btou = (cccc) => {\n switch (cccc.length) {\n case 4:\n var cp = ((0x07 & cccc.charCodeAt(0)) << 18)\n | ((0x3f & cccc.charCodeAt(1)) << 12)\n | ((0x3f & cccc.charCodeAt(2)) << 6)\n | (0x3f & cccc.charCodeAt(3)), offset = cp - 0x10000;\n return (_fromCC((offset >>> 10) + 0xD800)\n + _fromCC((offset & 0x3FF) + 0xDC00));\n case 3:\n return _fromCC(((0x0f & cccc.charCodeAt(0)) << 12)\n | ((0x3f & cccc.charCodeAt(1)) << 6)\n | (0x3f & cccc.charCodeAt(2)));\n default:\n return _fromCC(((0x1f & cccc.charCodeAt(0)) << 6)\n | (0x3f & cccc.charCodeAt(1)));\n }\n};\n/**\n * @deprecated should have been internal use only.\n * @param {string} src UTF-16 string\n * @returns {string} UTF-8 string\n */\nconst btou = (b) => b.replace(re_btou, cb_btou);\n/**\n * polyfill version of `atob`\n */\nconst atobPolyfill = (asc) => {\n // console.log('polyfilled');\n asc = asc.replace(/\\s+/g, '');\n if (!b64re.test(asc))\n throw new TypeError('malformed base64.');\n asc += '=='.slice(2 - (asc.length & 3));\n let u24, bin = '', r1, r2;\n for (let i = 0; i < asc.length;) {\n u24 = b64tab[asc.charAt(i++)] << 18\n | b64tab[asc.charAt(i++)] << 12\n | (r1 = b64tab[asc.charAt(i++)]) << 6\n | (r2 = b64tab[asc.charAt(i++)]);\n bin += r1 === 64 ? _fromCC(u24 >> 16 & 255)\n : r2 === 64 ? _fromCC(u24 >> 16 & 255, u24 >> 8 & 255)\n : _fromCC(u24 >> 16 & 255, u24 >> 8 & 255, u24 & 255);\n }\n return bin;\n};\n/**\n * does what `window.atob` of web browsers do.\n * @param {String} asc Base64-encoded string\n * @returns {string} binary string\n */\nconst _atob = typeof atob === 'function' ? (asc) => atob(_tidyB64(asc))\n : _hasBuffer ? (asc) => Buffer.from(asc, 'base64').toString('binary')\n : atobPolyfill;\n//\nconst _toUint8Array = _hasBuffer\n ? (a) => _U8Afrom(Buffer.from(a, 'base64'))\n : (a) => _U8Afrom(_atob(a).split('').map(c => c.charCodeAt(0)));\n/**\n * converts a Base64 string to a Uint8Array.\n */\nconst toUint8Array = (a) => _toUint8Array(_unURI(a));\n//\nconst _decode = _hasBuffer\n ? (a) => Buffer.from(a, 'base64').toString('utf8')\n : _TD\n ? (a) => _TD.decode(_toUint8Array(a))\n : (a) => btou(_atob(a));\nconst _unURI = (a) => _tidyB64(a.replace(/[-_]/g, (m0) => m0 == '-' ? '+' : '/'));\n/**\n * converts a Base64 string to a UTF-8 string.\n * @param {String} src Base64 string. Both normal and URL-safe are supported\n * @returns {string} UTF-8 string\n */\nconst decode = (src) => _decode(_unURI(src));\n/**\n * check if a value is a valid Base64 string\n * @param {String} src a value to check\n */\nconst isValid = (src) => {\n if (typeof src !== 'string')\n return false;\n const s = src.replace(/\\s+/g, '').replace(/={0,2}$/, '');\n return !/[^\\s0-9a-zA-Z\\+/]/.test(s) || !/[^\\s0-9a-zA-Z\\-_]/.test(s);\n};\n//\nconst _noEnum = (v) => {\n return {\n value: v, enumerable: false, writable: true, configurable: true\n };\n};\n/**\n * extend String.prototype with relevant methods\n */\nconst extendString = function () {\n const _add = (name, body) => Object.defineProperty(String.prototype, name, _noEnum(body));\n _add('fromBase64', function () { return decode(this); });\n _add('toBase64', function (urlsafe) { return encode(this, urlsafe); });\n _add('toBase64URI', function () { return encode(this, true); });\n _add('toBase64URL', function () { return encode(this, true); });\n _add('toUint8Array', function () { return toUint8Array(this); });\n};\n/**\n * extend Uint8Array.prototype with relevant methods\n */\nconst extendUint8Array = function () {\n const _add = (name, body) => Object.defineProperty(Uint8Array.prototype, name, _noEnum(body));\n _add('toBase64', function (urlsafe) { return fromUint8Array(this, urlsafe); });\n _add('toBase64URI', function () { return fromUint8Array(this, true); });\n _add('toBase64URL', function () { return fromUint8Array(this, true); });\n};\n/**\n * extend Builtin prototypes with relevant methods\n */\nconst extendBuiltins = () => {\n extendString();\n extendUint8Array();\n};\nconst gBase64 = {\n version: version,\n VERSION: VERSION,\n atob: _atob,\n atobPolyfill: atobPolyfill,\n btoa: _btoa,\n btoaPolyfill: btoaPolyfill,\n fromBase64: decode,\n toBase64: encode,\n encode: encode,\n encodeURI: encodeURI,\n encodeURL: encodeURI,\n utob: utob,\n btou: btou,\n decode: decode,\n isValid: isValid,\n fromUint8Array: fromUint8Array,\n toUint8Array: toUint8Array,\n extendString: extendString,\n extendUint8Array: extendUint8Array,\n extendBuiltins: extendBuiltins\n};\n// makecjs:CUT //\nexport { version };\nexport { VERSION };\nexport { _atob as atob };\nexport { atobPolyfill };\nexport { _btoa as btoa };\nexport { btoaPolyfill };\nexport { decode as fromBase64 };\nexport { encode as toBase64 };\nexport { utob };\nexport { encode };\nexport { encodeURI };\nexport { encodeURI as encodeURL };\nexport { btou };\nexport { decode };\nexport { isValid };\nexport { fromUint8Array };\nexport { toUint8Array };\nexport { extendString };\nexport { extendUint8Array };\nexport { extendBuiltins };\n// and finally,\nexport { gBase64 as Base64 };\n","import { BaseError } from '@cetusprotocol/common-sdk'\n\nexport enum SwapErrorCode {\n InvalidSqrtPriceLimitDirection = `InvalidSqrtPriceLimitDirection`,\n ZeroTradableAmount = `ZeroTradableAmount`,\n AmountOutBelowMinimum = `AmountOutBelowMinimum`,\n AmountInAboveMaximum = `AmountInAboveMaximum`,\n NextTickNotFound = `NextTickNotFound`,\n TickArraySequenceInvalid = `TickArraySequenceInvalid`,\n TickArrayCrossingAboveMax = `TickArrayCrossingAboveMax`,\n TickArrayIndexNotInitialized = `TickArrayIndexNotInitialized`,\n ParamsLengthNotEqual = `ParamsLengthNotEqual`,\n}\n\nexport enum PositionErrorCode {\n InvalidTickEvent = `InvalidTickEvent`,\n InvalidPositionObject = `InvalidPositionObject`,\n InvalidPositionRewardObject = `InvalidPositionRewardObject`,\n InvalidParams = `InvalidParams`,\n FetchError = `FetchError`,\n}\n\nexport enum PoolErrorCode {\n InvalidCoinTypeSequence = `InvalidCoinTypeSequence`,\n InvalidTickIndex = `InvalidTickIndex`,\n InvalidPoolObject = `InvalidPoolObject`,\n InvalidTickObjectId = `InvalidTickObjectId`,\n InvalidTickObject = `InvalidTickObject`,\n InvalidTickFields = `InvalidTickFields`,\n PoolsNotFound = `PoolsNotFound`,\n StatsPoolsUrlNotSet = `StatsPoolsUrlNotSet`,\n FetchError = `FetchError`,\n}\n\nexport enum VestErrorCode {\n ClmmVestNotSet = `ClmmVestNotSet`,\n ClmmVestFetchError = `ClmmVestFetchError`,\n}\n\nexport enum PartnerErrorCode {\n NotFoundPartnerObject = `NotFoundPartnerObject`,\n InvalidPartnerRefFeeFields = `InvalidPartnerRefFeeFields`,\n}\n\nexport enum ConfigErrorCode {\n InvalidConfig = `InvalidConfig`,\n InvalidConfigHandle = `InvalidConfigHandle`,\n InvalidSimulateAccount = `InvalidSimulateAccount`,\n}\n\nexport enum UtilsErrorCode {\n InvalidSendAddress = `InvalidSendAddress`,\n InvalidRecipientAddress = `InvalidRecipientAddress`,\n InvalidRecipientAndAmountLength = `InvalidRecipientAndAmountLength`,\n InsufficientBalance = `InsufficientBalance`,\n InvalidTarget = `InvalidTarget`,\n InvalidTransactionBuilder = `InvalidTransactionBuilder`,\n}\n\nexport enum RouterErrorCode {\n InvalidCoin = `InvalidCoin`,\n NotFoundPath = `NotFoundPath`,\n NoDowngradeNeedParams = `NoDowngradeNeedParams`,\n InvalidSwapCountUrl = `InvalidSwapCountUrl`,\n InvalidTransactionBuilder = `InvalidTransactionBuilder`,\n InvalidServerResponse = `InvalidServerResponse`,\n}\n\nexport enum TypesErrorCode {\n InvalidType = `InvalidType`,\n}\n\nexport type ClmmErrorCode =\n | SwapErrorCode\n | PoolErrorCode\n | PositionErrorCode\n | PartnerErrorCode\n | ConfigErrorCode\n | UtilsErrorCode\n | RouterErrorCode\n | TypesErrorCode\n | VestErrorCode\n\nexport class ClmmError extends BaseError {\n constructor(message: string, errorCode?: ClmmErrorCode, details?: Record<string, any>) {\n super(message, errorCode || 'UnknownError', details)\n }\n\n static isVaultsErrorCode(e: any, code: ClmmErrorCode): boolean {\n return this.isErrorCode<ClmmError>(e, code)\n }\n}\n\nexport const handleError = (code: ClmmErrorCode, error: Error, details?: Record<string, any>) => {\n throw new ClmmError(error.message, code, details)\n}\n\nexport const handleMessageError = (code: ClmmErrorCode, message: string, details?: Record<string, any>) => {\n throw new ClmmError(message, code, details)\n}\n","import { SuiClient, type DynamicFieldPage, type SuiObjectResponse } from '@mysten/sui/client'\nimport type { TransactionObjectArgument } from '@mysten/sui/transactions'\nimport { Transaction } from '@mysten/sui/transactions'\nimport { normalizeSuiAddress } from '@mysten/sui/utils'\nimport BN from 'bn.js'\nimport { ConfigErrorCode, handleError, handleMessageError, PartnerErrorCode, PoolErrorCode, PositionErrorCode } from '../errors/errors'\nimport type { CetusClmmSDK } from '../sdk'\nimport {\n PoolLiquiditySnapshot,\n poolLiquiditySnapshotType,\n PositionSnapshot,\n type CalculateCreatePoolResult,\n type CalculateCreatePoolWithPriceParams,\n type ClmmConfig,\n type CreatePoolAddLiquidityParams,\n type CreatePoolAddLiquidityWithPriceParams,\n type FetchParams,\n type Pool,\n type PoolImmutables,\n PoolStatus,\n type PoolTransactionInfo,\n type Position,\n type PositionInfo,\n type TickData,\n} from '../types'\nimport { ClmmFetcherModule, ClmmPartnerModule } from '../types/sui'\nimport {\n buildPool,\n buildPoolTransactionInfo,\n buildPositionInfo,\n buildTickData,\n buildTickDataByEvent,\n buildTransferCoinToSender,\n} from '../utils/common'\n\nimport type { PageQuery, PaginationArgs, SuiObjectIdType } from '@cetusprotocol/common-sdk'\nimport {\n asUintN,\n CACHE_TIME_24H,\n ClmmPoolUtil,\n CLOCK_ADDRESS,\n CoinAsset,\n CoinAssist,\n createFullClient,\n d,\n DataPage,\n DETAILS_KEYS,\n extractStructTagFromType,\n getObjectFields,\n getObjectPreviousTransactionDigest,\n getPackagerConfigs,\n IModule,\n isSortedSymbols,\n TickMath,\n tickScore,\n TickUtil,\n} from '@cetusprotocol/common-sdk'\nimport { VestUtils } from '../utils/vestUtils'\n\ntype GetTickParams = {\n start: number[]\n limit: number\n} & FetchParams\n\nexport type CreatePoolAndAddLiquidityRowResult = {\n pos_id: TransactionObjectArgument\n remain_coin_a: TransactionObjectArgument\n remain_coin_b: TransactionObjectArgument\n tx: Transaction\n remain_coin_type_a: string\n remain_coin_type_b: string\n}\n\n/**\n * Helper class to help interact with clmm pools with a pool router interface.\n */\nexport class PoolModule implements IModule<CetusClmmSDK> {\n protected _sdk: CetusClmmSDK\n\n constructor(sdk: CetusClmmSDK) {\n this._sdk = sdk\n }\n\n get sdk() {\n return this._sdk\n }\n\n /**\n * Gets a list of positions for the given positionHandle.\n * @param {string} position_handle The handle for the position.\n * @returns {DataPage<Position>} A promise that resolves to an array of Position objects.\n */\n async getPositionList(position_handle: string, pagination_args: PaginationArgs = 'all'): Promise<DataPage<Position>> {\n const dataPage: DataPage<Position> = {\n data: [],\n has_next_page: true,\n }\n const objects = await this._sdk.FullClient.getDynamicFieldsByPage(position_handle, pagination_args)\n\n dataPage.has_next_page = objects.has_next_page\n dataPage.next_cursor = objects.next_cursor\n\n const positionObjectIDs = objects.data.map((item: any) => {\n if (item.error != null) {\n handleMessageError(\n ConfigErrorCode.InvalidConfig,\n `when getPositionList get position objects error: ${item.error}, please check the rpc, contracts address config and position id.`,\n {\n [DETAILS_KEYS.METHOD_NAME]: 'getPositionList',\n }\n )\n }\n\n return item.name.value\n })\n\n const allPosition: Position[] = await this._sdk.Position.getSimplePositionList(positionObjectIDs)\n dataPage.data = allPosition\n return dataPage\n }\n\n /**\n * Gets a list of pool immutables.\n * @param {PaginationArgs} paginationArgs The cursor and limit to start at.\n * @returns {Promise<DataPage<PoolImmutables>>} Array of PoolImmutable objects.\n */\n async getPoolImmutablesWithPage(pagination_args: PaginationArgs = 'all', force_refresh = false): Promise<DataPage<PoolImmutables>> {\n const { package_id } = this._sdk.sdkOptions.clmm_pool\n const allPools: PoolImmutables[] = []\n const dataPage: DataPage<PoolImmutables> = {\n data: [],\n has_next_page: false,\n }\n\n const queryAll = pagination_args === 'all'\n const cacheAllKey = `${package_id}_getPoolImmutables`\n if (queryAll) {\n const cacheDate = this._sdk.getCache<PoolImmutables[]>(cacheAllKey, force_refresh)\n if (cacheDate) {\n allPools.push(...cacheDate)\n }\n }\n if (allPools.length === 0) {\n try {\n const moveEventType = `${package_id}::factory::CreatePoolEvent`\n const objects = await this._sdk.FullClient.queryEventsByPage({ MoveEventType: moveEventType }, pagination_args)\n dataPage.has_next_page = objects.has_next_page\n dataPage.next_cursor = objects.next_cursor\n objects.data.forEach((object: any) => {\n const fields = object.parsedJson\n if (fields) {\n allPools.push({\n id: fields.pool_id,\n tick_spacing: fields.tick_spacing,\n coin_type_a: extractStructTagFromType(fields.coin_type_a).full_address,\n coin_type_b: extractStructTagFromType(fields.coin_type_b).full_address,\n })\n }\n })\n } catch (error) {\n return handleError(PoolErrorCode.FetchError, error as Error, {\n [DETAILS_KEYS.METHOD_NAME]: 'getPoolImmutables',\n })\n }\n }\n dataPage.data = allPools\n if (queryAll) {\n this._sdk.updateCache(`${package_id}_getPoolImmutables`, allPools, CACHE_TIME_24H)\n }\n return dataPage\n }\n\n /**\n * Gets a list of pools.\n * @param {PaginationArgs} pagination_args The cursor and limit to start at.\n * @param {boolean} force_refresh Whether to force a refresh of the cache.\n * @returns {Promise<Pool[]>} An array of Pool objects.\n */\n async getPoolsWithPage(pagination_args: PaginationArgs = 'all', force_refresh = false): Promise<DataPage<Pool>> {\n const dataPage: DataPage<Pool> = {\n data: [],\n has_next_page: false,\n }\n\n const poolImmutables = await this.getPoolImmutablesWithPage(pagination_args, force_refresh)\n\n const objectDataResponses: any[] = await this._sdk.FullClient.batchGetObjects(\n poolImmutables.data.map((item) => item.id),\n {\n showContent: true,\n showType: true,\n }\n )\n\n for (const suiObj of objectDataResponses) {\n if (suiObj.error != null || suiObj.data?.content?.dataType !== 'moveObject') {\n handleMessageError(\n PoolErrorCode.InvalidPoolObject,\n `getPoolWithPages error code: ${suiObj.error?.code ?? 'unknown error'}, please check config and object ids`,\n {\n [DETAILS_KEYS.METHOD_NAME]: 'getPoolsWithPage',\n }\n )\n }\n const pool = buildPool(suiObj)\n dataPage.data.push(pool)\n const cacheKey = `${pool.id}_getPoolObject`\n this._sdk.updateCache(cacheKey, pool, CACHE_TIME_24H)\n }\n dataPage.has_next_page = poolImmutables.has_next_page\n dataPage.next_cursor = poolImmutables.next_cursor\n return dataPage\n }\n\n /**\n * Get the liquidity snapshot of a pool.\n * @param pool_id The ID of the pool.\n * @returns The liquidity snapshot of the pool.\n */\n async getPoolLiquiditySnapshot(pool_id: string, show_details = false): Promise<PoolLiquiditySnapshot> {\n try {\n const res = await this._sdk.FullClient.getDynamicFieldObject({\n parentId: pool_id,\n name: {\n type: '0x1::string::String',\n value: poolLiquiditySnapshotType,\n },\n })\n const fields = VestUtils.parsePoolLiquiditySnapshot(res)\n\n if (show_details) {\n const posSnapshots = await this._sdk.FullClient.getDynamicFieldsByPage(fields.snapshots.id)\n const posSnapshotIds = posSnapshots.data.map((item) => item.objectId)\n if (posSnapshotIds.length > 0) {\n const posSnapshotsData = await this._sdk.FullClient.batchGetObjects(posSnapshotIds, {\n showContent: true,\n showType: true,\n })\n\n const positionSnapshots: PositionSnapshot[] = []\n posSnapshotsData.forEach((item) => {\n const fields = VestUtils.parsePositionSnapshot(item)\n positionSnapshots.push(fields)\n })\n fields.position_snapshots = positionSnapshots\n }\n }\n\n return fields\n } catch (error) {\n return handleError(PoolErrorCode.InvalidPoolObject, error as Error, {\n [DETAILS_KEYS.METHOD_NAME]: 'getPoolLiquiditySnapshot',\n [DETAILS_KEYS.REQUEST_PARAMS]: pool_id,\n })\n }\n }\n\n async getPositionSnapshot(snapshot_handle: string, pos_ids: string[]): Promise<PositionSnapshot[]> {\n const res = await this._sdk.FullClient.getDynamicFieldObjects(snapshot_handle, pos_ids, '0x2::object::ID', 'address')\n const positionSnapshots: PositionSnapshot[] = []\n res.forEach((item) => {\n try {\n const fields = VestUtils.parsePositionSnapshot(item)\n positionSnapshots.push(fields)\n } catch (error) {\n console.log('getPositionSnapshot error: ', error)\n }\n })\n return positionSnapshots\n }\n\n /**\n * Gets a list of pools.\n * @param {string[]} assign_pools An array of pool ID to get.\n * @returns {Promise<Pool[]>} array of Pool objects.\n */\n async getAssignPools(assign_pools: string[]): Promise<Pool[]> {\n if (assign_pools.length === 0) {\n return []\n }\n const allPool: Pool[] = []\n\n const objectDataResponses = await this._sdk.FullClient.batchGetObjects(assign_pools, {\n showContent: true,\n showType: true,\n })\n\n for (const suiObj of objectDataResponses) {\n if (suiObj.error != null || suiObj.data?.content?.dataType !== 'moveObject') {\n handleMessageError(\n PoolErrorCode.InvalidPoolObject,\n `getPools error code: ${suiObj.error?.code ?? 'unknown error'}, please check config and object ids`,\n {\n [DETAILS_KEYS.METHOD_NAME]: 'getAssignPools',\n }\n )\n }\n\n const pool = buildPool(suiObj)\n allPool.push(pool)\n const cacheKey = `${pool.id}_getPoolObject`\n this._sdk.updateCache(cacheKey, pool, CACHE_TIME_24H)\n }\n return allPool\n }\n\n /**\n * Gets a pool by its object ID.\n * @param {string} pool_id The object ID of the pool to get.\n * @param {true} force_refresh Whether to force a refresh of the cache.\n * @param {boolean} verify_pool_status Whether to verify the pool status.\n * @returns {Promise<Pool>} A promise that resolves to a Pool object.\n */\n async getPool(pool_id: string, force_refresh = true, verify_pool_status = false): Promise<Pool> {\n const cacheKey = `${pool_id}_getPoolObject`\n const cacheData = this._sdk.getCache<Pool>(cacheKey, force_refresh)\n if (cacheData !== undefined) {\n return cacheData\n }\n const object = (await this._sdk.FullClient.getObject({\n id: pool_id,\n options: {\n showType: true,\n showContent: true,\n },\n })) as SuiObjectResponse\n\n if (object.error != null || object.data?.content?.dataType !== 'moveObject') {\n handleMessageError(\n PoolErrorCode.InvalidPoolObject,\n `getPool error code: ${object.error?.code ?? 'unknown error'}, please check config and object id`,\n {\n [DETAILS_KEYS.METHOD_NAME]: 'getPool',\n }\n )\n }\n const pool = buildPool(object)\n if (verify_pool_status) {\n const poolStatus = await this.getPoolStatus(pool_id)\n if (poolStatus) {\n pool.pool_status = poolStatus\n }\n }\n this._sdk.updateCache(cacheKey, pool)\n return pool\n }\n\n async getPoolByCoins(coins: string[], fee_rate?: number): Promise<Pool[]> {\n if (coins.length === 0) {\n return []\n }\n\n // 0x2::sui::SUI -> 0x0000000000000000000000000000000000000000000000000000000000000002::sui::SUI\n for (let i = 0; i < coins.length; i++) {\n if (coins[i] === '0x2::sui::SUI') {\n coins[i] = '0x0000000000000000000000000000000000000000000000000000000000000002::sui::SUI'\n }\n }\n\n let url = this._sdk.sdkOptions.stats_pools_url!\n if (!url) {\n handleMessageError(PoolErrorCode.StatsPoolsUrlNotSet, `statsPoolsUrl is not set in the sdk options.`, {\n [DETAILS_KEYS.METHOD_NAME]: 'getPoolByCoins',\n })\n }\n url += `?order_by=-fees&limit=100&has_mining=true&has_farming=true&no_incentives=true&display_all_pools=true&coin_type=${coins.join(\n ','\n )}`\n\n const response = await fetch(url)\n let json\n try {\n json = await response.json()\n } catch (e) {\n handleError(PoolErrorCode.FetchError, e as Error, {\n [DETAILS_KEYS.METHOD_NAME]: 'getPoolByCoins',\n [DETAILS_KEYS.REQUEST_PARAMS]: url,\n })\n }\n const pools = json.data.lp_list\n\n const poolAddresses = []\n for (const pool of pools) {\n if (coins.includes(pool.coin_a_address) && coins.includes(pool.coin_b_address)) {\n if (fee_rate != null) {\n if (pool.object.feeRate === fee_rate) {\n poolAddresses.push(pool.address)\n }\n } else {\n poolAddresses.push(pool.address)\n }\n }\n }\n\n if (poolAddresses.length > 0) {\n const poolObjects = await this.getAssignPools(poolAddresses)\n return poolObjects\n }\n\n return []\n }\n\n /**\n * Create a pool of clmmpool protocol. The pool is identified by (CoinTypeA, CoinTypeB, tick_spacing).\n * @param {CreatePoolParams | CreatePoolAddLiquidityParams} params\n * @returns {Promise<Transaction>}\n */\n async createPoolPayload(params: CreatePoolAddLiquidityParams, tx?: Transaction): Promise<Transaction> {\n if (isSortedSymbols(normalizeSuiAddress(params.coin_type_a), normalizeSuiAddress(params.coin_type_b))) {\n const swap_coin_type_b = params.coin_type_b\n params.coin_type_b = params.coin_type_a\n params.coin_type_a = swap_coin_type_b\n const metadata_b = params.metadata_b\n params.metadata_b = params.metadata_a\n params.metadata_a = metadata_b\n }\n return await this.createPoolAndAddLiquidity(params, tx)\n }\n\n /**\n * Create pool and add liquidity row. It will call `pool_creator_v2::create_pool_v2` function.\n * This method will return the position, coin_a, coin_b. User can use these to build own transaction.\n * @param {CreatePoolAddLiquidityParams}params The parameters for the create and liquidity.\n * @returns {Promise<CreatePoolAndAddLiquidityRowResult>} A promise that resolves to the transaction payload.\n */\n async createPoolRowPayload(params: CreatePoolAddLiquidityParams, tx?: Transaction): Promise<CreatePoolAndAddLiquidityRowResult> {\n // If the coin types are not sorted, swap them and swap the metadata.\n // You can refer to the documentation for the specific sorting rules. ## How to determine coin_type_a and coin_type_b ?\n // https://cetus-1.gitbook.io/cetus-developer-docs/developer/via-sdk/features-available/create-clmm-pool\n if (isSortedSymbols(normalizeSuiAddress(params.coin_type_a), normalizeSuiAddress(params.coin_type_b))) {\n const swap_coin_type_b = params.coin_type_b\n params.coin_type_b = params.coin_type_a\n params.coin_type_a = swap_coin_type_b\n const metadata_b = params.metadata_b\n params.metadata_b = params.metadata_a\n params.metadata_a = metadata_b\n }\n return await this.createPoolAndAddLiquidityRow(params, tx)\n }\n\n /**\n * Gets the ClmmConfig object for the given package object ID.\n * @param {boolean} force_refresh Whether to force a refresh of the cache.\n * @returns the ClmmConfig object.\n */\n async getClmmConfigs(force_refresh = false): Promise<ClmmConfig> {\n const { package_id } = this._sdk.sdkOptions.clmm_pool\n const cacheKey = `${package_id}_getInitEvent`\n const cacheData = this._sdk.getCache<ClmmConfig>(cacheKey, force_refresh)\n if (cacheData !== undefined) {\n return cacheData\n }\n const packageObject = await this._sdk.FullClient.getObject({\n id: package_id,\n options: { showPreviousTransaction: true },\n })\n\n const previousTx = getObjectPreviousTransactionDigest(packageObject) as string\n\n const objects = (await this._sdk.FullClient.queryEventsByPage({ Transaction: previousTx })).data\n\n const clmmConfig: ClmmConfig = {\n pools_id: '',\n global_config_id: '',\n global_vault_id: '',\n admin_cap_id: '',\n }\n\n if (objects.length > 0) {\n objects.forEach((item: any) => {\n const fields = item.parsedJson as any\n\n if (item.type) {\n switch (extractStructTagFromType(item.type).full_address) {\n case `${package_id}::config::InitConfigEvent`:\n clmmConfig.global_config_id = fields.global_config_id\n clmmConfig.admin_cap_id = fields.admin_cap_id\n break\n case `${package_id}::factory::InitFactoryEvent`:\n clmmConfig.pools_id = fields.pools_id\n break\n case `${package_id}::rewarder::RewarderInitEvent`:\n clmmConfig.global_vault_id = fields.global_vault_id\n break\n case `${package_id}::partner::InitPartnerEvent`:\n clmmConfig.partners_id = fields.partners_id\n break\n default:\n break\n }\n }\n })\n this._sdk.updateCache(cacheKey, clmmConfig, CACHE_TIME_24H)\n return clmmConfig\n }\n\n return clmmConfig\n }\n\n async getPoolTransactionList({\n pool_id,\n pagination_args,\n order = 'descending',\n full_rpc_url,\n }: {\n pool_id: string\n full_rpc_url?: string\n pagination_args: PageQuery\n order?: 'ascending' | 'descending' | null | undefined\n }): Promise<DataPage<PoolTransactionInfo>> {\n const { FullClient: fullClient, sdkOptions } = this._sdk\n let client\n if (full_rpc_url) {\n client = createFullClient(new SuiClient({ url: full_rpc_url }))\n } else {\n client = fullClient\n }\n const data: DataPage<PoolTransactionInfo> = {\n data: [],\n has_next_page: false,\n }\n\n const limit = 50\n const query = pagination_args\n const user_limit = pagination_args.limit || 10\n do {\n const res = await client.queryTransactionBlocksByPage({ ChangedObject: pool_id }, { ...query, limit: 50 }, order)\n res.data.forEach((item, index) => {\n data.next_cursor = res.next_cursor\n const dataList = buildPoolTransactionInfo(item, index, sdkOptions.clmm_pool.package_id, pool_id)\n data.data = [...data.data, ...dataList]\n })\n data.has_next_page = res.has_next_page\n data.next_cursor = res.next_cursor\n query.cursor = res.next_cursor\n } while (data.data.length < user_limit && data.has_next_page)\n\n if (data.data.length > user_limit) {\n data.data = data.data.slice(0, user_limit)\n data.next_cursor = data.data[data.data.length - 1].tx\n }\n\n return data\n }\n\n async calculateCreatePoolWithPrice(params: CalculateCreatePoolWithPriceParams): Promise<CalculateCreatePoolResult> {\n const { current_price, slippage, tick_spacing, add_mode_params, price_base_coin, coin_decimals_a, coin_decimals_b } = params\n\n const current_sqrt_price = TickMath.priceToSqrtPriceX64(\n price_base_coin === 'coin_a' ? d(current_price) : d(1).div(current_price),\n coin_decimals_a,\n coin_decimals_b\n )\n\n let tick_lower = 0\n let tick_upper = 0\n\n if (add_mode_params.is_full_range) {\n tick_lower = TickUtil.getMinIndex(tick_spacing)\n tick_upper = TickUtil.getMaxIndex(tick_spacing)\n } else {\n const { min_price, max_price } = add_mode_params\n tick_lower = TickMath.priceToInitializeTickIndex(\n price_base_coin === 'coin_a' ? d(min_price) : d(1).div(max_price),\n coin_decimals_a,\n coin_decimals_b,\n tick_spacing\n )\n tick_upper = TickMath.priceToInitializeTickIndex(\n price_base_coin === 'coin_a' ? d(max_price) : d(1).div(min_price),\n coin_decimals_a,\n coin_decimals_b,\n tick_spacing\n )\n }\n\n const { coin_amount, fix_amount_a } = params\n const { coin_amount_limit_a, coin_amount_limit_b, liquidity_amount, coin_amount_a, coin_amount_b } =\n ClmmPoolUtil.estLiquidityAndCoinAmountFromOneAmounts(\n tick_lower,\n tick_upper,\n new BN(coin_amount),\n fix_amount_a,\n true,\n slippage,\n current_sqrt_price\n )\n\n return {\n coin_amount_a,\n coin_amount_b,\n coin_amount_limit_a,\n coin_amount_limit_b,\n liquidity: liquidity_amount,\n initialize_sqrt_price: current_sqrt_price.toString(),\n tick_lower,\n tick_upper,\n fix_amount_a,\n }\n }\n\n /**\n * Create pool and add liquidity internal. It will call `pool_creator_v2::create_pool_v2` function in cetus integrate contract.\n * It encapsulates the original create_pool_v2 method from the Cetus CLMM and processes the additional outputs for position and coin within a single move call.\n * @param {CreatePoolAddLiquidityParams}params The parameters for the create and liquidity.\n * @returns {Promise<Transaction>} A promise that resolves to the transaction payload.\n */\n private async createPoolAndAddLiquidity(params: CreatePoolAddLiquidityParams, tx?: Transaction): Promise<Transaction> {\n tx = tx || new Transaction()\n tx.setSender(this.sdk.getSenderAddress())\n const { integrate, clmm_pool } = this.sdk.sdkOptions\n const eventConfig = getPackagerConfigs(clmm_pool)\n const globalPauseStatusObjectId = eventConfig.global_config_id\n const poolsId = eventConfig.pools_id\n\n const allCoinAsset = await this._sdk.FullClient.getOwnerCoinAssets(this.sdk.getSenderAddress())\n const primaryCoinAInputsR = CoinAssist.buildCoinForAmount(tx, allCoinAsset, BigInt(params.amount_a), params.coin_type_a, false, true)\n const primaryCoinBInputsR = CoinAssist.buildCoinForAmount(tx, allCoinAsset, BigInt(params.amount_b), params.coin_type_b, false, true)\n\n const args = [\n tx.object(globalPauseStatusObjectId),\n tx.object(poolsId),\n tx.pure.u32(params.tick_spacing),\n tx.pure.u128(params.initialize_sqrt_price),\n tx.pure.string(params.uri),\n tx.pure.u32(Number(asUintN(BigInt(params.tick_lower)).toString())),\n tx.pure.u32(Number(asUintN(BigInt(params.tick_upper)).toString())),\n primaryCoinAInputsR.target_coin,\n primaryCoinBInputsR.target_coin,\n tx.object(params.metadata_a),\n tx.object(params.metadata_b),\n tx.pure.bool(params.fix_amount_a),\n tx.object(CLOCK_ADDRESS),\n ]\n tx.moveCall({\n target: `${integrate.published_at}::pool_creator_v2::create_pool_v2`,\n typeArguments: [params.coin_type_a, params.coin_type_b],\n arguments: args,\n })\n buildTransferCoinToSender(this._sdk, tx, primaryCoinAInputsR.target_coin, params.coin_type_a)\n buildTransferCoinToSender(this._sdk, tx, primaryCoinBInputsR.target_coin, params.coin_type_b)\n\n return tx\n }\n\n /**\n * Create pool and add liquidity row. It will call `pool_creator_v2::create_pool_v2` function.\n * This method will return the position, coin_a, coin_b. User can use these to build own transaction.\n * @param {CreatePoolAddLiquidityParams}params The parameters for the create and liquidity.\n * @returns {Promise<Transaction>} A promise that resolves to the transaction payload.\n */\n private async createPoolAndAddLiquidityRow(\n params: CreatePoolAddLiquidityParams,\n tx?: Transaction\n ): Promise<CreatePoolAndAddLiquidityRowResult> {\n tx = tx || new Transaction()\n const { clmm_pool } = this.sdk.sdkOptions\n const eventConfig = getPackagerConfigs(clmm_pool)\n const globalPauseStatusObjectId = eventConfig.global_config_id\n const poolsId = eventConfig.pools_id\n const allCoinAsset = await this._sdk.FullClient.getOwnerCoinAssets(this.sdk.getSenderAddress())\n const primaryCoinAInputsR = CoinAssist.buildCoinForAmount(tx, allCoinAsset, BigInt(params.amount_a), params.coin_type_a, false, true)\n const primaryCoinBInputsR = CoinAssist.buildCoinForAmount(tx, allCoinAsset, BigInt(params.amount_b), params.coin_type_b, false, true)\n\n const args = [\n tx.object(globalPauseStatusObjectId),\n tx.object(poolsId),\n tx.pure.u32(params.tick_spacing),\n tx.pure.u128(params.initialize_sqrt_price),\n tx.pure.string(params.uri),\n tx.pure.u32(Number(asUintN(BigInt(params.tick_lower)).toString())),\n tx.pure.u32(Number(asUintN(BigInt(params.tick_upper)).toString())),\n primaryCoinAInputsR.target_coin,\n primaryCoinBInputsR.target_coin,\n tx.object(params.metadata_a),\n tx.object(params.metadata_b),\n tx.pure.bool(params.fix_amount_a),\n tx.object(CLOCK_ADDRESS),\n ]\n const res: TransactionObjectArgument[] = tx.moveCall({\n target: `${clmm_pool.published_at}::pool_creator::create_pool_v2`,\n typeArguments: [params.coin_type_a, params.coin_type_b],\n arguments: args,\n })\n\n return {\n tx,\n pos_id: res[0],\n remain_coin_a: res[1],\n remain_coin_b: res[2],\n remain_coin_type_a: params.coin_type_a,\n remain_coin_type_b: params.coin_type_b,\n }\n }\n\n public async createPoolWithPriceReturnPositionPayload(\n params: CreatePoolAddLiquidityWithPriceParams,\n tx?: Transaction\n ): Promise<CreatePoolAndAddLiquidityRowResult> {\n const { coin_type_a, coin_type_b, tick_spacing, uri, calculate_result } = params\n const {\n initialize_sqrt_price,\n tick_lower,\n tick_upper,\n liquidity,\n coin_amount_a,\n coin_amount_b,\n fix_amount_a,\n coin_amount_limit_a,\n coin_amount_limit_b,\n } = calculate_result\n\n const coinMetadataA = await this._sdk.FullClient.fetchCoinMetadata(coin_type_a)\n const coinMetadataB = await this._sdk.FullClient.fetchCoinMetadata(coin_type_b)\n\n if (coinMetadataA === null) {\n return handleMessageError(PoolErrorCode.FetchError, `fetch coin ${coin_type_a} metadata failed`, {\n [DETAILS_KEYS.METHOD_NAME]: 'createPoolAndAddLiquidityWithPrice',\n [DETAILS_KEYS.REQUEST_PARAMS]: params,\n })\n }\n\n if (coinMetadataB === null) {\n return handleMessageError(PoolErrorCode.FetchError, `fetch coin ${coin_type_b} metadata failed`, {\n [DETAILS_KEYS.METHOD_NAME]: 'createPoolAndAddLiquidityWithPrice',\n [DETAILS_KEYS.REQUEST_PARAMS]: params,\n })\n }\n\n let metadata_a = coinMetadataA.id!\n let metadata_b = coinMetadataB.id!\n\n return this.createPoolRowPayload(\n {\n tick_spacing,\n initialize_sqrt_price,\n uri: uri || '',\n coin_type_a: coin_type_a,\n coin_type_b: coin_type_b,\n amount_a: fix_amount_a ? coin_amount_a : coin_amount_limit_a,\n amount_b: fix_amount_a ? coin_amount_limit_b : coin_amount_b,\n fix_amount_a: fix_amount_a,\n tick_lower: tick_lower,\n tick_upper: tick_upper,\n metadata_a: metadata_a,\n metadata_b: metadata_b,\n },\n tx\n )\n }\n\n public async createPoolWithPricePayload(params: CreatePoolAddLiquidityWithPriceParams): Promise<Transaction> {\n const { coin_type_a, coin_type_b, tick_spacing, uri, calculate_result } = params\n const {\n initialize_sqrt_price,\n tick_lower,\n tick_upper,\n liquidity,\n coin_amount_a,\n coin_amount_b,\n fix_amount_a,\n coin_amount_limit_a,\n coin_amount_limit_b,\n } = calculate_result\n\n const coinMetadataA = await this._sdk.FullClient.fetchCoinMetadata(coin_type_a)\n const coinMetadataB = await this._sdk.FullClient.fetchCoinMetadata(coin_type_b)\n\n if (coinMetadataA === null) {\n return handleMessageError(PoolErrorCode.FetchError, `fetch coin ${coin_type_a} metadata failed`, {\n [DETAILS_KEYS.METHOD_NAME]: 'createPoolAndAddLiquidityWithPrice',\n [DETAILS_KEYS.REQUEST_PARAMS]: params,\n })\n }\n\n if (coinMetadataB === null) {\n return handleMessageError(PoolErrorCode.FetchError, `fetch coin ${coin_type_b} metadata failed`, {\n [DETAILS_KEYS.METHOD_NAME]: 'createPoolAndAddLiquidityWithPrice',\n [DETAILS_KEYS.REQUEST_PARAMS]: params,\n })\n }\n\n let metadata_a = coinMetadataA.id!\n let metadata_b = coinMetadataB.id!\n\n return this.createPoolPayload({\n tick_spacing,\n initialize_sqrt_price,\n uri: uri || '',\n coin_type_a: coin_type_a,\n coin_type_b: coin_type_b,\n amount_a: fix_amount_a ? coin_amount_a : coin_amount_limit_a,\n amount_b: fix_amount_a ? coin_amount_limit_b : coin_amount_b,\n fix_amount_a: fix_amount_a,\n tick_lower: tick_lower,\n tick_upper: tick_upper,\n metadata_a: metadata_a,\n metadata_b: metadata_b,\n })\n }\n\n /**\n * Fetches ticks from the exchange.\n * @param {FetchParams} params The parameters for the fetch.\n * @returns {Promise<TickData[]>} A promise that resolves to an array of tick data.\n */\n async fetchTicks(params: FetchParams): Promise<TickData[]> {\n let ticks: TickData[] = []\n let start: number[] = []\n const limit = 512\n\n while (true) {\n const data = await this.getTicks({\n pool_id: params.pool_id,\n coin_type_a: params.coin_type_a,\n coin_type_b: params.coin_type_b,\n start,\n limit,\n })\n ticks = [...ticks, ...data]\n if (data.length < limit) {\n break\n }\n start = [Number(asUintN(BigInt(data[data.length - 1].index)))]\n }\n return ticks\n }\n\n /**\n * Fetches ticks from the exchange using the simulation exec tx.\n * @param {GetTickParams} params The parameters for the fetch.\n * @returns {Promise<TickData[]>} A promise that resolves to an array of tick data.\n */\n private async getTicks(params: GetTickParams): Promise<TickData[]> {\n const { integrate } = this.sdk.sdkOptions\n const ticks: TickData[] = []\n const typeArguments = [params.coin_type_a, params.coin_type_b]\n\n const tx = new Transaction()\n\n const start = tx.makeMoveVec({\n elements: params.start.map((index) => tx.pure.u32(index)),\n type: 'u32',\n })\n\n const args = [tx.object(params.pool_id), start, tx.pure.u64(params.limit.toString())]\n\n tx.moveCall({\n target: `${integrate.published_at}::${ClmmFetcherModule}::fetch_ticks`,\n arguments: args,\n typeArguments,\n })\n\n const simulateRes = await this.sdk.FullClient.devInspectTransactionBlock({\n transactionBlock: tx,\n sender: normalizeSuiAddress('0x0'),\n })\n\n if (simulateRes.error != null) {\n handleMessageError(\n PoolErrorCode.InvalidTickObjectId,\n `getTicks error code: ${simulateRes.error ?? 'unknown error'}, please check config and tick object ids`,\n {\n [DETAILS_KEYS.METHOD_NAME]: 'getTicks',\n [DETAILS_KEYS.REQUEST_PARAMS]: params,\n }\n )\n }\n\n simulateRes.events?.forEach((item: any) => {\n if (extractStructTagFromType(item.type).name === `FetchTicksResultEvent`) {\n item.parsedJson.ticks.forEach((tick: any) => {\n ticks.push(buildTickDataByEvent(tick))\n })\n }\n })\n return ticks\n }\n\n /**\n * Fetches a list of position rewards from the exchange.\n * @param {FetchParams} params The parameters for the fetch.\n * @returns {Promise<PositionReward[]>} A promise that resolves to an array of position rewards.\n */\n async fetchPoolPositionInfoList(params: FetchParams): Promise<PositionInfo[]> {\n const { integrate } = this.sdk.sdkOptions\n const allPosition: PositionInfo[] = []\n let start: SuiObjectIdType[] = []\n const limit = 512\n\n while (true) {\n const typeArguments = [params.coin_type_a, params.coin_type_b]\n\n const tx = new Transaction()\n\n const vecStart = tx.pure.vector(\n 'id',\n start.map((id) => id)\n )\n\n const args = [tx.object(params.pool_id), vecStart, tx.pure.u64(limit)]\n\n tx.moveCall({\n target: `${integrate.published_at}::${ClmmFetcherModule}::fetch_positions`,\n arguments: args,\n typeArguments,\n })\n\n const simulateRes = await this.sdk.FullClient.devInspectTransactionBlock({\n transactionBlock: tx,\n sender: normalizeSuiAddress('0x0'),\n })\n\n if (simulateRes.error != null) {\n handleMessageError(\n PositionErrorCode.InvalidPositionRewardObject,\n `fetch position info error code: ${simulateRes.error ?? 'unknown error'}, please check config and tick object ids`,\n {\n [DETAILS_KEYS.METHOD_NAME]: 'fetchPoolPositionInfoList',\n [DETAILS_KEYS.REQUEST_PARAMS]: params,\n }\n )\n }\n\n const positionInfos: PositionInfo[] = []\n simulateRes?.events?.forEach((item: any) => {\n if (extractStructTagFromType(item.type).name === `FetchPositionsEvent`) {\n item.parsedJson.positions.forEach((item: any) => {\n const positionReward = buildPositionInfo(item)\n positionInfos.push(positionReward)\n })\n }\n })\n\n allPosition.push(...positionInfos)\n\n if (positionInfos.length < limit) {\n break\n } else {\n start = [positionInfos[positionInfos.length - 1].pos_object_id]\n }\n }\n\n return allPosition\n }\n\n /**\n * Fetches ticks from the fullnode using the RPC API.\n * @param {string} tick_handle The handle for the tick. Get tick handle from `sdk.Pool.getPool()`\n * @returns {Promise<TickData[]>} A promise that resolves to an array of tick data.\n */\n async fetchTicksByRpc(tick_handle: string): Promise<TickData[]> {\n let allTickData: TickData[] = []\n let nextCursor: string | null = null\n const limit = 50\n while (true) {\n const allTickId: SuiObjectIdType[] = []\n const idRes: DynamicFieldPage = await this.sdk.FullClient.getDynamicFields({\n parentId: tick_handle,\n cursor: nextCursor,\n limit,\n })\n nextCursor = idRes.nextCursor\n idRes.data.forEach((item) => {\n if (extractStructTagFromType(item.objectType).module === 'skip_list') {\n allTickId.push(item.objectId)\n }\n })\n\n allTickData = [...allTickData, ...(await this.getTicksByRpc(allTickId))]\n\n if (!idRes.hasNextPage) {\n break\n }\n }\n\n return allTickData\n }\n\n /**\n * Get ticks by tick object ids.\n * @param {string} tick_object_id The object ids of the ticks.\n * @returns {Promise<TickData[]>} A promise that resolves to an array of tick data.\n */\n private async getTicksByRpc(tick_object_id: string[]): Promise<TickData[]> {\n const ticks: TickData[] = []\n const objectDataResponses = await this.sdk.FullClient.batchGetObjects(tick_object_id, { showContent: true, showType: true })\n for (const suiObj of objectDataResponses) {\n if (suiObj.error != null || suiObj.data?.content?.dataType !== 'moveObject') {\n handleMessageError(\n PoolErrorCode.InvalidTickObjectId,\n `getTicksByRpc error code: ${suiObj.error?.code ?? 'unknown error'}, please check config and tick object ids`,\n {\n [DETAILS_KEYS.METHOD_NAME]: 'getTicksByRpc',\n }\n )\n }\n\n const tick = buildTickData(suiObj)\n if (tick != null) {\n ticks.push(tick)\n }\n }\n return ticks\n }\n\n /**\n * Gets the tick data for the given tick index.\n * @param {string} tick_handle The handle for the tick.\n * @param {number} tick_index The index of the tick.\n * @returns {Promise<TickData | null>} A promise that resolves to the tick data.\n */\n async getTickDataByIndex(tick_handle: string, tick_index: number): Promise<TickData> {\n const name = { type: 'u64', value: asUintN(BigInt(tickScore(tick_index).toString())).toString() }\n const res = await this.sdk.FullClient.getDynamicFieldObject({\n parentId: tick_handle,\n name,\n })\n\n if (res.error != null || res.data?.content?.dataType !== 'moveObject') {\n handleMessageError(PoolErrorCode.InvalidTickIndex, `get tick by index: ${tick_index} error: ${res.error}`, {\n [DETAILS_KEYS.METHOD_NAME]: 'getTickDataByIndex',\n })\n }\n\n return buildTickData(res)\n }\n\n /**\n * Gets the tick data for the given object ID.\n * @param {string} tick_id The object ID of the tick.\n * @returns {Promise<TickData | null>} A promise that resolves to the tick data.\n */\n async getTickDataByObjectId(tick_id: string): Promise<TickData | null> {\n const res = await this.sdk.FullClient.getObject({\n id: tick_id,\n options: { showContent: true },\n })\n\n if (res.error != null || res.data?.content?.dataType !== 'moveObject') {\n handleMessageError(\n PoolErrorCode.InvalidTickObjectId,\n `getTicksByRpc error code: ${res.error?.code ?? 'unknown error'}, please check config and tick object ids`,\n {\n [DETAILS_KEYS.METHOD_NAME]: 'getTickDataByObjectId',\n }\n )\n }\n return buildTickData(res)\n }\n\n /**\n * Get partner ref fee amount\n * @param {string}partner Partner object id\n * @returns {Promise<CoinAsset[]>} A promise that resolves to an array of coin asset.\n */\n async getPartnerRefFeeAmount(partner: string, show_display = true): Promise<CoinAsset[]> {\n const objectDataResponses: any = await this._sdk.FullClient.batchGetObjects([partner], {\n showOwner: true,\n showContent: true,\n showDisplay: show_display,\n showType: true,\n })\n\n if (objectDataResponses[0].data?.content?.dataType !== 'moveObject') {\n handleMessageError(\n PartnerErrorCode.NotFoundPartnerObject,\n `get partner by object id: ${partner} error: ${objectDataResponses[0].error}`,\n {\n [DETAILS_KEYS.METHOD_NAME]: 'getPartnerRefFeeAmount',\n }\n )\n }\n\n const balance = (objectDataResponses[0].data.content.fields as any).balances\n\n const objects = await this._sdk.FullClient.getDynamicFieldsByPage(balance.fields.id.id)\n\n const coins: string[] = []\n objects.data.forEach((object) => {\n if (object.objectId != null) {\n coins.push(object.objectId)\n }\n })\n\n const refFee: CoinAsset[] = []\n const object = await this._sdk.FullClient.batchGetObjects(coins, {\n showOwner: true,\n showContent: true,\n showDisplay: show_display,\n showType: true,\n })\n object.forEach((info: any) => {\n if (info.error != null || info.data?.content?.dataType !== 'moveObject') {\n handleMessageError(\n PartnerErrorCode.InvalidPartnerRefFeeFields,\n `get coin by object id: ${info.data.objectId} error: ${info.error}`,\n {\n [DETAILS_KEYS.METHOD_NAME]: 'getPartnerRefFeeAmount',\n }\n )\n }\n\n const coinAsset: CoinAsset = {\n coin_type: info.data.content.fields.name,\n coin_object_id: info.data.objectId,\n balance: BigInt(info.data.content.fields.value),\n }\n refFee.push(coinAsset)\n })\n\n return refFee\n }\n\n /**\n * Claim partner ref fee.\n * @param {string} partner_cap partner cap id.\n * @param {string} partner partner id.\n * @param {string} coin_type coin type.\n * @returns {Promise<Transaction>} A promise that resolves to the transaction payload.\n */\n async claimPartnerRefFeePayload(partner_cap: string, partner: string, coin_type: string): Promise<Transaction> {\n const tx = new Transaction()\n const { clmm_pool } = this.sdk.sdkOptions\n const { global_config_id } = getPackagerConfigs(clmm_pool)\n const typeArguments = [coin_type]\n\n const args = [tx.object(global_config_id), tx.object(partner_cap), tx.object(partner)]\n\n tx.moveCall({\n target: `${clmm_pool.published_at}::${ClmmPartnerModule}::claim_ref_fee`,\n arguments: args,\n typeArguments,\n })\n\n return tx\n }\n\n async getPoolStatus(poolId: string): Promise<PoolStatus | undefined> {\n try {\n const res: any = await this._sdk.FullClient.getDynamicFieldObject({\n parentId: poolId,\n name: {\n type: '0x1::string::String',\n value: 'pool_status',\n },\n })\n\n const fields = getObjectFields(res)\n const status = fields.position.fields.status\n if (status) {\n return status as PoolStatus\n }\n } catch (error) {\n console.log('🚀 ~ file: poolModule.ts:1093 ~ PoolModule ~ getPoolStatus ~ error:', error)\n }\n return undefined\n }\n}\n","import BN from 'bn.js'\nimport { CoinPairType, NFT, Percentage, SuiAddressType, SuiObjectIdType } from '@cetusprotocol/common-sdk'\nimport { TickData } from './clmmpool'\n\nexport const poolLiquiditySnapshotType = 'position_liquidity_snapshot'\n\n/**\n * Enumerates the possible status values of a position within a liquidity mining module.\n */\nexport enum ClmmPositionStatus {\n /**\n * The position has been deleted or removed.\n */\n 'Deleted' = 'Deleted',\n /**\n * The position exists and is active.\n */\n 'Exists' = 'Exists',\n /**\n * The position does not exist or is not active.\n */\n 'NotExists' = 'NotExists',\n}\n\n/**\n * The Cetus clmmpool's position NFT.\n */\nexport type Position = {\n /**\n * The unique identifier of the position object.\n */\n pos_object_id: SuiObjectIdType\n /**\n * The owner of the position.\n */\n owner: SuiObjectIdType\n /**\n * The liquidity pool associated with the position.\n */\n pool: SuiObjectIdType\n /**\n * The type of position represented by an address.\n */\n type: SuiAddressType\n /**\n * The index of the position.\n */\n index: number\n /**\n * The amount of liquidity held by the position.\n */\n liquidity: string\n /**\n * The lower tick index of the position range.\n */\n tick_lower_index: number\n /**\n * The upper tick index of the position range.\n */\n tick_upper_index: number\n /**\n * The status of the position within the liquidity mining module.\n */\n position_status: ClmmPositionStatus\n\n /**\n * The address type of the first coin in the position.\n */\n coin_type_a: SuiAddressType\n /**\n * The address type of the second coin in the position.\n */\n coin_type_b: SuiAddressType\n} & NFT &\n PositionInfo\n\n/**\n * Represents reward information associated with a liquidity mining position.\n */\nexport type PositionInfo = {\n /**\n * The unique identifier of the position object.\n */\n pos_object_id: SuiObjectIdType\n\n /**\n * The amount of liquidity held by the position.\n */\n liquidity: string\n\n /**\n * The lower tick index of the position range.\n */\n tick_lower_index: number\n\n /**\n * The upper tick index of the position range.\n */\n tick_upper_index: number\n\n /**\n * The accumulated fee growth inside the first coin of the position.\n */\n fee_growth_inside_a: string\n\n /**\n * The accumulated fee owned in the first coin of the position.\n */\n fee_owned_a: string\n\n /**\n * The accumulated fee growth inside the second coin of the position.\n */\n fee_growth_inside_b: string\n\n /**\n * The accumulated fee owned in the second coin of the position.\n */\n fee_owned_b: string\n\n /**\n * The amount of reward owned in the first reward category.\n */\n reward_amount_owned_0: string\n\n /**\n * The amount of reward owned in the second reward category.\n */\n reward_amount_owned_1: string\n\n /**\n * The amount of reward owned in the third reward category.\n */\n reward_amount_owned_2: string\n\n /**\n * The accumulated reward growth inside the first reward category.\n */\n reward_growth_inside_0: string\n\n /**\n * The accumulated reward growth inside the second reward category.\n */\n reward_growth_inside_1: string\n\n /**\n * The accumulated reward growth inside the third reward category.\n */\n reward_growth_inside_2: string\n}\n\n/**\n * Represents immutable properties of a liquidity pool.\n */\nexport type PoolImmutables = {\n /**\n * The address of the liquidity pool.\n */\n id: string\n\n /**\n * The tick spacing value used in the pool.\n */\n tick_spacing: string\n} & CoinPairType\n/**\n * \"Pool\" is the core module of Clmm protocol, which defines the trading pairs of \"clmmpool\".\n */\nexport type Pool = {\n /**\n * Represents the type or category of a liquidity pool.\n */\n pool_type: string\n /**\n * The amount of coin a.\n */\n coin_amount_a: number\n /**\n * The amount of coin b.\n */\n coin_amount_b: number\n /**\n * The current sqrt price\n */\n current_sqrt_price: number\n /**\n * The current tick index\n */\n current_tick_index: number\n /**\n * The global fee growth of coin a as Q64.64\n */\n fee_growth_global_b: number\n /**\n * The global fee growth of coin b as Q64.64\n */\n fee_growth_global_a: number\n /**\n * The amounts of coin a owned to protocol\n */\n fee_protocol_coin_a: number\n /**\n * The amounts of coin b owned to protocol\n */\n fee_protocol_coin_b: number\n /**\n * The numerator of fee rate, the denominator is 1_000_000.\n */\n fee_rate: number\n /**\n * is the pool pause\n */\n pool_status: PoolStatus\n /**\n * The liquidity of current tick index\n */\n liquidity: number\n /**\n * The pool index\n */\n index: number\n /**\n * The positions manager\n */\n position_manager: {\n positions_handle: string\n size: number\n }\n /**\n * The rewarder manager\n */\n rewarder_infos: Array<Rewarder>\n rewarder_last_updated_time: string\n /**\n * The tick manager handle\n */\n ticks_handle: string\n /**\n * The url for pool and position\n */\n uri: string\n /**\n * The name for pool\n */\n name: string\n} & PoolImmutables\n\nexport type Rewarder = {\n /**\n * The coin address where rewards will be distributed.\n */\n coin_type: string\n /**\n * The rate of emissions in coins per second.\n */\n emissions_per_second: number\n /**\n * The global growth factor influencing reward emissions.\n */\n growth_global: number\n /**\n * The total emissions in coins that occur every day.\n */\n emissions_every_day: number\n}\n/**\n * Configuration settings for the Cryptocurrency Liquidity Mining Module (CLMM).\n */\nexport type ClmmConfig = {\n /**\n * Identifier of the pools for liquidity mining.\n */\n pools_id: SuiObjectIdType\n\n /**\n * Identifier of the global configuration for the module.\n */\n global_config_id: SuiObjectIdType\n\n /**\n * Identifier of the administrative capacity for the module.\n */\n admin_cap_id: SuiObjectIdType\n\n /**\n * Identifier of the global vault for the module.\n */\n global_vault_id: SuiObjectIdType\n\n /**\n * Optional identifier of partners for the liquidity mining module.\n */\n partners_id?: SuiObjectIdType\n}\n\n/**\n * Represents an event to create a liquidity mining partner.\n */\nexport type CreatePartnerEvent = {\n /**\n * The name of the liquidity mining partner.\n */\n name: string\n\n /**\n * The recipient's address for the partner.\n */\n recipient: SuiAddressType\n\n /**\n * Identifier of the partner.\n */\n partner_id: SuiObjectIdType\n\n /**\n * Identifier of the partner's capacity.\n */\n partner_cap_id: SuiObjectIdType\n\n /**\n * The fee rate associated with the partner.\n */\n fee_rate: string\n\n /**\n * The starting epoch of the partnership.\n */\n start_epoch: string\n\n /**\n * The ending epoch of the partnership.\n */\n end_epoch: string\n}\n\n/**\n * Represents parameters for creating a liquidity pool.\n */\nexport type CreatePoolParams = {\n /**\n * The tick spacing value used for the pool.\n */\n tick_spacing: number\n\n /**\n * The initial square root price value for the pool.\n */\n initialize_sqrt_price: string\n\n /**\n * The Uniform Resource Identifier (URI) associated with the pool.\n */\n uri: string\n} & CoinPairType\n\n/**\n * Represents parameters for adding liquidity to a created liquidity pool.\n * Extends the CreatePoolParams type.\n */\nexport type CreatePoolAddLiquidityParams = CreatePoolParams & {\n /**\n * The amount of the first coin to be added as liquidity.\n * Can be a number or a string.\n */\n amount_a: number | string\n\n /**\n * The amount of the second coin to be added as liquidity.\n * Can be a number or a string.\n */\n amount_b: number | string\n\n /**\n * Indicates whether the amount of the first coin is fixed.\n */\n fix_amount_a: boolean\n\n /**\n * The lower tick index for liquidity provision.\n */\n tick_lower: number\n\n /**\n * The upper tick index for liquidity provision.\n */\n tick_upper: number\n\n metadata_a: SuiObjectIdType\n metadata_b: SuiObjectIdType\n}\n\nexport type FetchParams = {\n pool_id: SuiObjectIdType\n} & CoinPairType\n\ntype CommonParams = {\n /**\n * The object id about which pool you want to operation.\n */\n pool_id: SuiObjectIdType\n /**\n * The object id about position.\n */\n pos_id: SuiObjectIdType\n}\n\nexport type AddLiquidityFixTokenParams = {\n /**\n * If fixed amount A, you must set amount_a, amount_b will be auto calculated by ClmmPoolUtil.estLiquidityAndcoinAmountFromOneAmounts().\n */\n amount_a: number | string\n /**\n * If fixed amount B, you must set amount_b, amount_a will be auto calculated by ClmmPoolUtil.estLiquidityAndcoinAmountFromOneAmounts().\n */\n amount_b: number | string\n /**\n * Price slippage point.\n */\n slippage: number\n /**\n * true means fixed coinA amount, false means fixed coinB amount\n */\n fix_amount_a: boolean\n /**\n * control whether or not to create a new position or add liquidity on existed position.\n */\n is_open: boolean\n} & AddLiquidityCommonParams\n\nexport type AddLiquidityParams = {\n /**\n * The actual change in liquidity that has been added.\n */\n delta_liquidity: string\n /**\n * The max limit about used coin a amount\n */\n max_amount_a: number | string\n /**\n * The max limit about used coin b amount.\n */\n max_amount_b: number | string\n} & AddLiquidityCommonParams\n\nexport type AddLiquidityCommonParams = {\n /**\n * Represents the index of the lower tick boundary.\n */\n tick_lower: string | number\n /**\n * Represents the index of the upper tick boundary.\n */\n tick_upper: string | number\n /**\n * If you already has one position, you can select collect fees while adding liquidity.\n */\n collect_fee: boolean\n /**\n * If these not empty, it will collect rewarder in this position, if you already open the position.\n */\n rewarder_coin_types: SuiAddressType[]\n} & CoinPairType &\n CommonParams\n\n/**\n * Parameters for opening a position within a liquidity pool.\n * Extends the CoinPairType type.\n */\nexport type OpenPositionParams = CoinPairType & {\n /**\n * The lower tick index for the position.\n */\n tick_lower: string\n\n /**\n * The upper tick index for the position.\n */\n tick_upper: string\n\n /**\n * The object identifier of the liquidity pool.\n */\n pool_id: SuiObjectIdType\n}\n\n/**\n * Parameters for opening a position within a liquidity pool using full range.\n */\nexport type FullRangeParams = {\n is_full_range: true\n}\n\nexport type CustomRangeParams = {\n is_full_range: false\n min_price: string\n max_price: string\n coin_decimals_a: number\n coin_decimals_b: number\n price_base_coin: 'coin_a' | 'coin_b'\n}\n\nexport type CreatePoolCustomRangeParams = {\n is_full_range: false\n min_price: string\n max_price: string\n}\n\nexport type CalculateAddLiquidityWithPriceParams = {\n pool_id: SuiObjectIdType\n liquidity: string\n slippage: number\n refresh_pool_price?: boolean\n add_mode_params: FullRangeParams | CustomRangeParams\n}\n\nexport type CalculateAddLiquidityFixCoinWithPriceParams = {\n pool_id: SuiObjectIdType\n coin_amount: string\n fix_amount_a: boolean\n slippage: number\n refresh_pool_price?: boolean\n add_mode_params: FullRangeParams | CustomRangeParams\n}\n\nexport type CalculateAddLiquidityResult = {\n coin_amount_a: string\n coin_amount_b: string\n coin_amount_limit_a: string\n coin_amount_limit_b: string\n liquidity: string\n tick_lower: number\n tick_upper: number\n fix_amount_a?: boolean\n}\n\nexport type CalculateCreatePoolWithPriceParams = {\n tick_spacing: number\n current_price: string\n coin_amount: string\n fix_amount_a: boolean\n slippage: number\n coin_decimals_a: number\n coin_decimals_b: number\n price_base_coin: 'coin_a' | 'coin_b'\n add_mode_params: FullRangeParams | CreatePoolCustomRangeParams\n}\n\nexport type CalculateCreatePoolResult = {\n coin_amount_a: string\n coin_amount_b: string\n coin_amount_limit_a: string\n coin_amount_limit_b: string\n liquidity: string\n tick_lower: number\n tick_upper: number\n initialize_sqrt_price: string\n fix_amount_a: boolean\n}\n\nexport type CreatePoolAddLiquidityWithPriceParams = {\n tick_spacing: number\n uri?: string\n calculate_result: CalculateCreatePoolResult\n add_mode_params: FullRangeParams | CreatePoolCustomRangeParams\n} & CoinPairType\n\n/**\n * Parameters for adding liquidity to a liquidity pool using price range.\n */\nexport type AddLiquidityWithPriceRangeParams = {\n /**\n * The object identifier of the liquidity pool.\n */\n pool_id: SuiObjectIdType\n /**\n * The result of calculateAddLiquidityResultWithPrice.\n */\n calculate_result: CalculateAddLiquidityResult\n /**\n * The parameters of full range or custom range.\n */\n add_mode_params: FullRangeParams | CustomRangeParams\n}\n\n/**\n * Parameters for opening a position within a liquidity pool using price range.\n * Extends the CoinPairType type.\n */\nexport type OpenPositionWithPriceParams = {\n /**\n * The object identifier of the liquidity pool.\n */\n pool_id: SuiObjectIdType\n} & (FullRangeParams | CustomRangeParams)\n\n/**\n * Parameters for removing liquidity from a pool.\n * Extends the CoinPairType and CommonParams types.\n */\nexport type RemoveLiquidityParams = CoinPairType &\n CommonParams & {\n /**\n * The change in liquidity amount to be removed.\n */\n delta_liquidity: string\n\n /**\n * The minimum amount of the first coin to be received.\n */\n min_amount_a: string\n\n /**\n * The minimum amount of the second coin to be received.\n */\n min_amount_b: string\n\n /**\n * Indicates whether to collect fees during the removal.\n */\n collect_fee: boolean\n\n /**\n * Coin types associated with rewarder contracts.\n */\n rewarder_coin_types: string[]\n }\n\n/**\n * Parameters for closing a position within a liquidity pool.\n * Extends the CoinPairType, CommonParams, and CommonParams types.\n */\nexport type ClosePositionParams = CoinPairType &\n CommonParams & {\n /**\n * Coin types associated with rewarder contracts.\n */\n rewarder_coin_types: SuiAddressType[]\n\n /**\n * The minimum amount of the first coin to be received.\n */\n min_amount_a: string\n\n /**\n * The minimum amount of the second coin to be received.\n */\n min_amount_b: string\n\n /**\n * Indicates whether to collect fees during the closing.\n */\n collect_fee: boolean\n } & CoinPairType &\n CommonParams\n/**\n * Represents parameters for collecting fees.\n */\nexport type CollectFeeParams = CommonParams & CoinPairType\n\n/**\n * Represents parameters for collecting rewarder fees.\n */\nexport type CollectRewarderParams = {\n /**\n * The identifier of the pool.\n */\n pool_id: SuiObjectIdType\n\n /**\n * The identifier of the position.\n */\n pos_id: SuiObjectIdType\n\n /**\n * Specifies if the fee should be collected.\n */\n collect_fee: boolean\n\n /**\n * An array of rewarder coin types.\n */\n rewarder_coin_types: SuiAddressType[]\n} & CoinPairType\n\n/**\n * Represents the amount owned by a rewarder.\n */\nexport type RewarderAmountOwned = {\n /**\n * The amount owed.\n */\n amount_owned: string\n\n /**\n * The address of the coin.\n */\n coin_type: string\n}\n\nexport type PositionTransactionInfo = {\n index: string\n tx_digest: string\n package_id: string\n transaction_module: string\n sender: string\n type: string\n timestamp_ms: string\n parsed_json: any\n}\n\nexport type PoolTransactionInfo = {\n index: string\n tx: string\n sender: string\n type: string\n block_time: string\n parsed_json: any\n}\n\nexport const poolFilterEvenTypes = ['RemoveLiquidityEvent', 'SwapEvent', 'AddLiquidityEvent']\n\n/**\n * @category CollectFeesQuote\n */\nexport type CollectFeesQuote = {\n position_id: string\n fee_owned_a: string\n fee_owned_b: string\n}\n\nexport type FetchPosRewardParams = {\n pool_id: string\n position_id: string\n rewarder_types: string[]\n} & CoinPairType\n\nexport type FetchPosFeeParams = {\n pool_id: string\n position_id: string\n} & CoinPairType\n\nexport type PosRewarderResult = {\n pool_id: string\n position_id: string\n rewarder_amounts: RewarderAmountOwned[]\n}\n\n/**\n * If changes in liquidity are required before the swap, then this parameter should be passed.\n */\nexport type PreSwapLpChangeParams = {\n /**\n * Unique identifier for the liquidity pool involved in the transaction.\n */\n pool_id: string\n\n /**\n * Lower bound of the liquidity range. In AMM models, like Uniswap V3, liquidity is provided within specific price ranges. This represents the lower limit of that range.\n */\n tick_lower: number\n\n /**\n * Upper bound of the liquidity range, corresponding to the lower bound. This defines the upper limit of the range where liquidity is provided.\n */\n tick_upper: number\n\n /**\n * The change in liquidity, which can be a large number and is thus represented as a string. It can be positive or negative, indicating an increase or decrease in liquidity.\n */\n delta_liquidity: number\n\n /**\n * A boolean value indicating whether the 'delta_liquidity' represents an increase (true) or decrease (false) in liquidity.\n */\n is_increase: boolean\n}\n/**\n * Represents parameters for a pre-swap operation with multiple pools.\n */\nexport type PreSwapWithMultiPoolParams = {\n /**\n * An array of pool addresses for the pre-swap.\n */\n pool_ids: string[]\n\n /**\n * Specifies if the swap is from token A to token B.\n */\n a2b: boolean\n\n /**\n * Specifies if the swap amount is specified in token A.\n */\n by_amount_in: boolean\n\n /**\n * The swap amount.\n */\n amount: string\n} & CoinPairType\n\n/**\n * Represents parameters for a pre-swap operation.\n */\nexport type PreSwapParams = {\n /**\n * The pool information for the pre-swap.\n */\n pool: Pool\n\n /**\n * The current square root price.\n */\n current_sqrt_price: number\n\n /**\n * The number of decimal places for token A.\n */\n decimals_a: number\n\n /**\n * The number of decimal places for token B.\n */\n decimals_b: number\n\n /**\n * Specifies if the swap is from token A to token B.\n */\n a2b: boolean\n\n /**\n * Specifies if the swap amount is specified in token A.\n */\n by_amount_in: boolean\n\n /**\n * The swap amount.\n */\n amount: string\n} & CoinPairType\n\n/**\n * Represents parameters for a transitional pre-swap operation with multiple pools.\n */\nexport type TransPreSwapWithMultiPoolParams = {\n /**\n * The address of the pool for the transitional pre-swap.\n */\n pool_address: string\n\n /**\n * Specifies if the swap is from token A to token B.\n */\n a2b: boolean\n\n /**\n * Specifies if the swap amount is specified in token A.\n */\n by_amount_in: boolean\n\n /**\n * The swap amount.\n */\n amount: string\n} & CoinPairType\n\n/**\n * Represents parameters for calculating rates in a swap.\n */\nexport type CalculateRatesParams = {\n /**\n * The number of decimal places for token A.\n */\n decimals_a: number\n\n /**\n * The number of decimal places for token B.\n */\n decimals_b: number\n\n /**\n * Specifies if the swap is from token A to token B.\n */\n a2b: boolean\n\n /**\n * Specifies if the swap amount is specified in token A.\n */\n by_amount_in: boolean\n\n /**\n * The amount to swap.\n */\n amount: BN\n\n /**\n * An array of tick data for swap ticks.\n */\n swap_ticks: Array<TickData>\n\n /**\n * The current pool information.\n */\n current_pool: Pool\n}\n\n/**\n * Represents the result of calculating rates in a swap.\n */\nexport type CalculateRatesResult = {\n /**\n * The estimated amount in token A.\n */\n estimated_amount_in: BN\n\n /**\n * The estimated amount in token B.\n */\n estimated_amount_out: BN\n\n /**\n * The estimated ending square root price.\n */\n estimated_end_sqrt_price: BN\n\n /**\n * The estimated fee amount.\n */\n estimated_fee_amount: BN\n\n /**\n * Indicates if the estimated amount exceeds the limit.\n */\n is_exceed: boolean\n\n /**\n * The extra compute limit.\n */\n extra_compute_limit: number\n\n /**\n * Specifies if the swap is from token A to token B.\n */\n a2b: boolean\n\n /**\n * Specifies if the swap amount is specified in token A.\n */\n by_amount_in: boolean\n\n /**\n * The amount to swap.\n */\n amount: BN\n\n /**\n * The price impact percentage.\n */\n price_impact_pct: number\n}\n\n/**\n * Represents parameters for a swap operation.\n */\nexport type SwapParams = {\n /**\n * The identifier of the pool.\n */\n pool_id: SuiObjectIdType\n\n /**\n * Specifies if the swap is from token A to token B.\n */\n a2b: boolean\n\n /**\n * Specifies if the swap amount is specified in token A.\n */\n by_amount_in: boolean\n\n /**\n * The swap amount.\n */\n amount: string\n\n /**\n * The amount limit for the swap.\n */\n amount_limit: string\n\n /**\n * The optional swap partner.\n */\n swap_partner?: string\n} & CoinPairType\n\nexport type SwapGasEstimateArg = {\n by_amount_in: boolean\n slippage: Percentage\n decimals_a: number\n decimals_b: number\n swap_ticks: Array<TickData>\n current_pool: Pool\n}\n\nexport type GetPositionInfoListParams = {\n position_handle: string\n position_ids: string[]\n}\n\nexport type PoolLiquiditySnapshot = {\n current_sqrt_price: string\n remove_percent: string\n snapshots: {\n id: string\n size: string\n }\n position_snapshots?: PositionSnapshot[]\n}\n\nexport type PositionSnapshot = {\n position_id: string\n liquidity: string\n tick_lower_index: number\n tick_upper_index: number\n fee_owned_a: string\n fee_owned_b: string\n value_cut: string\n rewards: string[]\n}\n\nexport type PoolStatus = {\n disable_add_liquidity: boolean\n disable_remove_liquidity: boolean\n disable_swap: boolean\n disable_flash_loan: boolean\n disable_collect_fee: boolean\n disable_collect_reward: boolean\n}\n","import BN from 'bn.js'\nimport {\n asUintN,\n CoinPairType,\n FEE_RATE_DENOMINATOR,\n getDeltaDownFromOutput,\n getDeltaUpFromInput,\n getNextSqrtPriceFromInput,\n getNextSqrtPriceFromOutput,\n MathUtil,\n ZERO,\n} from '@cetusprotocol/common-sdk'\nimport Decimal from 'decimal.js'\nimport { SwapUtils } from '../utils/swapUtils'\nimport { Pool } from './clmm_type'\n\nexport type BasePath = {\n direction: boolean\n label: string\n pool_address: string\n from_coin: string\n to_coin: string\n fee_rate: number\n output_amount: number\n input_amount: number\n current_sqrt_price: BN\n from_decimal: number\n to_decimal: number\n current_price: Decimal\n}\n\nexport type SplitPath = {\n percent: number\n input_amount: number\n output_amount: number\n path_index: number\n last_quote_output: number\n base_paths: BasePath[]\n}\n/**\n * Represents tick data for a liquidity pool.\n */\nexport type TickData = {\n /**\n * The object identifier of the tick data.\n */\n object_id: string\n\n /**\n * The index of the tick.\n */\n index: number\n\n /**\n * The square root price value for the tick.\n */\n sqrt_price: BN\n\n /**\n * The net liquidity value for the tick.\n */\n liquidity_net: BN\n\n /**\n * The gross liquidity value for the tick.\n */\n liquidity_gross: BN\n\n /**\n * The fee growth outside coin A for the tick.\n */\n fee_growth_outside_a: BN\n\n /**\n * The fee growth outside coin B for the tick.\n */\n fee_growth_outside_b: BN\n\n /**\n * An array of rewarders' growth outside values for the tick.\n */\n rewarders_growth_outside: BN[]\n}\n\n/**\n * Represents a tick for a liquidity pool.\n */\nexport type Tick = {\n /**\n * The index of the tick.\n */\n index: Bits\n\n /**\n * The square root price value for the tick (string representation).\n */\n sqrt_price: string\n\n /**\n * The net liquidity value for the tick (Bits format).\n */\n liquidity_net: Bits\n\n /**\n * The gross liquidity value for the tick (string representation).\n */\n liquidity_gross: string\n\n /**\n * The fee growth outside coin A for the tick (string representation).\n */\n fee_growth_outside_a: string\n\n /**\n * The fee growth outside coin B for the tick (string representation).\n */\n fee_growth_outside_b: string\n\n /**\n * An array of rewarders' growth outside values for the tick (array of string representations).\n */\n rewarders_growth_outside: string[3]\n}\n\nexport type SwapResult = {\n amount_in: BN\n amount_out: BN\n fee_amount: BN\n ref_amount: BN\n next_sqrt_price: BN\n cross_tick_num: number\n}\n\nexport type SwapStepResult = {\n amount_in: BN\n amount_out: BN\n next_sqrt_price: BN\n fee_amount: BN\n}\n\n/**\n * Represents bits information.\n */\nexport type Bits = {\n bits: string\n}\n\n/**\n * Creates a Bits object from an index.\n * @param {number | string} index - The index value.\n * @returns {Bits} The created Bits object.\n */\nexport function newBits(index: number | string): Bits {\n const index_BN = new BN(index)\n if (index_BN.lt(ZERO)) {\n return {\n bits: index_BN\n .neg()\n .xor(new BN(2).pow(new BN(64)).sub(new BN(1)))\n .add(new BN(1))\n .toString(),\n }\n }\n return {\n bits: index_BN.toString(),\n }\n}\n\n/**\n * Represents data for a liquidity mining pool.\n */\nexport type ClmmpoolData = {\n current_sqrt_price: BN\n current_tick_index: number\n fee_growth_global_a: BN\n fee_growth_global_b: BN\n fee_protocol_coin_a: BN\n fee_protocol_coin_b: BN\n fee_rate: BN\n liquidity: BN\n tick_indexes: number[]\n tick_spacing: number\n ticks: Array<TickData>\n collection_name: string\n} & CoinPairType\n\n/**\n * Transforms a Pool object into ClmmpoolData format.\n * @param {Pool} pool - The liquidity pool object to transform.\n * @returns {ClmmpoolData} The transformed ClmmpoolData object.\n */\nexport function transClmmpoolDataWithoutTicks(pool: Pool): ClmmpoolData {\n const poolData: ClmmpoolData = {\n coin_type_a: pool.coin_type_a, // string\n coin_type_b: pool.coin_type_b, // string\n current_sqrt_price: new BN(pool.current_sqrt_price), // BN\n current_tick_index: pool.current_tick_index, // number\n fee_growth_global_a: new BN(pool.fee_growth_global_a), // BN\n fee_growth_global_b: new BN(pool.fee_growth_global_b), // BN\n fee_protocol_coin_a: new BN(pool.fee_protocol_coin_a), // BN\n fee_protocol_coin_b: new BN(pool.fee_protocol_coin_b), // BN\n fee_rate: new BN(pool.fee_rate), // number\n liquidity: new BN(pool.liquidity), // BN\n tick_indexes: [], // number[]\n tick_spacing: Number(pool.tick_spacing), // number\n ticks: [], // Array<TickData>\n collection_name: '',\n }\n return poolData\n}\n\n/**\n * Simulate per step of swap on every tick.\n *\n * @param currentSqrtPrice\n * @param targetSqrtPrice\n * @param liquidity\n * @param amount\n * @param feeRate\n * @param byAmountIn\n * @returns\n */\nexport function computeSwapStep(\n currentSqrtPrice: BN,\n targetSqrtPrice: BN,\n liquidity: BN,\n amount: BN,\n feeRate: BN,\n byAmountIn: boolean\n): SwapStepResult {\n if (liquidity === ZERO) {\n return {\n amount_in: ZERO,\n amount_out: ZERO,\n next_sqrt_price: targetSqrtPrice,\n fee_amount: ZERO,\n }\n }\n const a2b = currentSqrtPrice.gte(targetSqrtPrice)\n let amountIn: BN\n let amountOut: BN\n let nextSqrtPrice: BN\n let feeAmount: BN\n if (byAmountIn) {\n const amountRemain = MathUtil.checkMulDivFloor(\n amount,\n MathUtil.checkUnsignedSub(FEE_RATE_DENOMINATOR, feeRate),\n FEE_RATE_DENOMINATOR,\n 64\n )\n const maxAmountIn = getDeltaUpFromInput(currentSqrtPrice, targetSqrtPrice, liquidity, a2b)\n if (maxAmountIn.gt(amountRemain)) {\n amountIn = amountRemain\n feeAmount = MathUtil.checkUnsignedSub(amount, amountRemain)\n nextSqrtPrice = getNextSqrtPriceFromInput(currentSqrtPrice, liquidity, amountRemain, a2b)\n } else {\n amountIn = maxAmountIn\n feeAmount = MathUtil.checkMulDivCeil(amountIn, feeRate, FEE_RATE_DENOMINATOR.sub(feeRate), 64)\n nextSqrtPrice = targetSqrtPrice\n }\n amountOut = getDeltaDownFromOutput(currentSqrtPrice, nextSqrtPrice, liquidity, a2b)\n } else {\n const maxAmountOut = getDeltaDownFromOutput(currentSqrtPrice, targetSqrtPrice, liquidity, a2b)\n if (maxAmountOut.gt(amount)) {\n amountOut = amount\n nextSqrtPrice = getNextSqrtPriceFromOutput(currentSqrtPrice, liquidity, amount, a2b)\n } else {\n amountOut = maxAmountOut\n nextSqrtPrice = targetSqrtPrice\n }\n amountIn = getDeltaUpFromInput(currentSqrtPrice, nextSqrtPrice, liquidity, a2b)\n feeAmount = MathUtil.checkMulDivCeil(amountIn, feeRate, FEE_RATE_DENOMINATOR.sub(feeRate), 64)\n }\n return {\n amount_in: amountIn,\n amount_out: amountOut,\n next_sqrt_price: nextSqrtPrice,\n fee_amount: feeAmount,\n }\n}\n\n/**\n * Simulate swap by imput lots of ticks.\n * @param aToB\n * @param byAmountIn\n * @param amount\n * @param poolData\n * @param swapTicks\n * @returns\n */\nexport function computeSwap(\n aToB: boolean,\n byAmountIn: boolean,\n amount: BN,\n poolData: ClmmpoolData,\n swapTicks: Array<TickData>\n): SwapResult {\n let remainAmount = amount\n let currentLiquidity = poolData.liquidity\n let { current_sqrt_price } = poolData\n const swapResult: SwapResult = {\n amount_in: ZERO,\n amount_out: ZERO,\n fee_amount: ZERO,\n ref_amount: ZERO,\n next_sqrt_price: ZERO,\n cross_tick_num: 0,\n }\n let target_sqrt_price\n let signed_liquidity_change\n const sqrt_price_limit = SwapUtils.getDefaultSqrtPriceLimit(aToB)\n for (const tick of swapTicks) {\n if (aToB && poolData.current_tick_index < tick.index) {\n continue\n }\n if (!aToB && poolData.current_tick_index >= tick.index) {\n continue\n }\n if (tick === null) {\n continue\n }\n if ((aToB && sqrt_price_limit.gt(tick.sqrt_price)) || (!aToB && sqrt_price_limit.lt(tick.sqrt_price))) {\n target_sqrt_price = sqrt_price_limit\n } else {\n target_sqrt_price = tick.sqrt_price\n }\n\n const stepResult = computeSwapStep(current_sqrt_price, target_sqrt_price, currentLiquidity, remainAmount, poolData.fee_rate, byAmountIn)\n\n if (!stepResult.amount_in.eq(ZERO)) {\n remainAmount = byAmountIn\n ? remainAmount.sub(stepResult.amount_in.add(stepResult.fee_amount))\n : remainAmount.sub(stepResult.amount_out)\n }\n\n swapResult.amount_in = swapResult.amount_in.add(stepResult.amount_in)\n swapResult.amount_out = swapResult.amount_out.add(stepResult.amount_out)\n swapResult.fee_amount = swapResult.fee_amount.add(stepResult.fee_amount)\n if (stepResult.next_sqrt_price.eq(tick.sqrt_price)) {\n signed_liquidity_change = tick.liquidity_net.mul(new BN(-1))\n\n if (aToB) {\n if (MathUtil.is_neg(signed_liquidity_change)) {\n currentLiquidity = currentLiquidity.add(new BN(asUintN(BigInt(signed_liquidity_change.toString()), 128)))\n } else {\n currentLiquidity = currentLiquidity.add(signed_liquidity_change)\n }\n } else if (MathUtil.is_neg(signed_liquidity_change)) {\n currentLiquidity = currentLiquidity.sub(new BN(asUintN(BigInt(signed_liquidity_change.toString()), 128)))\n } else {\n currentLiquidity = currentLiquidity.sub(signed_liquidity_change)\n }\n\n current_sqrt_price = tick.sqrt_price\n } else {\n current_sqrt_price = stepResult.next_sqrt_price\n }\n swapResult.cross_tick_num += 1\n if (remainAmount.eq(ZERO)) {\n break\n }\n }\n swapResult.amount_in = swapResult.amount_in.add(swapResult.fee_amount)\n swapResult.next_sqrt_price = current_sqrt_price\n return swapResult\n}\n","import { Transaction, TransactionObjectArgument } from '@mysten/sui/transactions'\nimport BN from 'bn.js'\nimport {\n adjustForSlippage,\n BuildCoinResult,\n CLOCK_ADDRESS,\n CoinAsset,\n CoinAssist,\n getPackagerConfigs,\n MathUtil,\n MAX_SQRT_PRICE,\n MIN_SQRT_PRICE,\n U64_MAX,\n ZERO,\n} from '@cetusprotocol/common-sdk'\nimport { ConfigErrorCode, handleError, handleMessageError, UtilsErrorCode } from '../errors/errors'\nimport { CetusClmmSDK, SdkOptions } from '../sdk'\nimport { SwapGasEstimateArg, SwapParams } from '../types/clmm_type'\nimport { ClmmIntegratePoolV2Module, ClmmIntegrateRouterModule, ClmmIntegrateRouterWithPartnerModule } from '../types/sui'\nimport { PositionUtils } from './positionUtils'\n\nexport class SwapUtils {\n /**\n * Get the default sqrt price limit for a swap.\n *\n * @param a2b - true if the swap is A to B, false if the swap is B to A.\n * @returns The default sqrt price limit for the swap.\n */\n static getDefaultSqrtPriceLimit(a2b: boolean): BN {\n return new BN(a2b ? MIN_SQRT_PRICE : MAX_SQRT_PRICE)\n }\n\n /**\n * Get the default values for the otherAmountThreshold in a swap.\n *\n * @param amount_specified_is_input - The direction of a swap\n * @returns The default values for the otherAmountThreshold parameter in a swap.\n */\n static getDefaultOtherAmountThreshold(amount_specified_is_input: boolean): BN {\n return amount_specified_is_input ? ZERO : U64_MAX\n }\n\n /**\n * build add liquidity transaction\n * @param params\n * @param slippage\n * @param curSqrtPrice\n * @returns\n */\n static async buildSwapTransactionForGas(\n sdk: CetusClmmSDK,\n params: SwapParams,\n all_coin_asset: CoinAsset[],\n gas_estimate_arg: SwapGasEstimateArg\n ): Promise<Transaction> {\n let tx = this.buildSwapTransaction(sdk, params, all_coin_asset)\n tx.setSender(sdk.getSenderAddress())\n const newResult = await this.adjustTransactionForGas(\n sdk,\n CoinAssist.getCoinAssets(params.a2b ? params.coin_type_a : params.coin_type_b, all_coin_asset),\n BigInt(params.by_amount_in ? params.amount : params.amount_limit),\n tx\n )\n\n const { fixAmount, newTx } = newResult\n\n if (newTx !== undefined) {\n newTx.setSender(sdk.getSenderAddress())\n if (params.by_amount_in) {\n params.amount = fixAmount.toString()\n } else {\n params.amount_limit = fixAmount.toString()\n }\n params = await this.fixSwapParams(sdk, params, gas_estimate_arg)\n\n const primaryCoinInputA = CoinAssist.buildCoinForAmount(\n tx,\n all_coin_asset,\n params.a2b ? BigInt(params.by_amount_in ? params.amount : params.amount_limit) : BigInt(0),\n params.coin_type_a\n )\n\n const primaryCoinInputB = CoinAssist.buildCoinForAmount(\n tx,\n all_coin_asset,\n params.a2b ? BigInt(0) : BigInt(params.by_amount_in ? params.amount : params.amount_limit),\n params.coin_type_b\n )\n\n tx = this.buildSwapTransactionArgs(newTx, params, sdk.sdkOptions, primaryCoinInputA, primaryCoinInputB)\n }\n\n return tx\n }\n\n /**\n * build swap transaction\n * @param params\n * @param packageId\n * @returns\n */\n static buildSwapTransactionArgs(\n tx: Transaction,\n params: SwapParams,\n sdk_options: SdkOptions,\n primary_coin_input_a: BuildCoinResult,\n primary_coin_input_b: BuildCoinResult\n ): Transaction {\n const { clmm_pool, integrate } = sdk_options\n\n const sqrtPriceLimit = SwapUtils.getDefaultSqrtPriceLimit(params.a2b)\n const typeArguments = [params.coin_type_a, params.coin_type_b]\n const { global_config_id } = getPackagerConfigs(clmm_pool)\n\n if (global_config_id === undefined) {\n handleMessageError(ConfigErrorCode.InvalidConfig, 'clmm.config.global_config_id is undefined')\n }\n\n const hasSwapPartner = params.swap_partner !== undefined\n\n const functionName = hasSwapPartner\n ? params.a2b\n ? 'swap_a2b_with_partner'\n : 'swap_b2a_with_partner'\n : params.a2b\n ? 'swap_a2b'\n : 'swap_b2a'\n\n const args = hasSwapPartner\n ? [\n tx.object(global_config_id),\n tx.object(params.pool_id),\n tx.object(params.swap_partner!),\n primary_coin_input_a.target_coin,\n primary_coin_input_b.target_coin,\n tx.pure.bool(params.by_amount_in),\n tx.pure.u64(params.amount),\n tx.pure.u64(params.amount_limit),\n tx.pure.u128(sqrtPriceLimit.toString()),\n tx.object(CLOCK_ADDRESS),\n ]\n : [\n tx.object(global_config_id),\n tx.object(params.pool_id),\n primary_coin_input_a.target_coin,\n primary_coin_input_b.target_coin,\n tx.pure.bool(params.by_amount_in),\n tx.pure.u64(params.amount),\n tx.pure.u64(params.amount_limit),\n tx.pure.u128(sqrtPriceLimit.toString()),\n tx.object(CLOCK_ADDRESS),\n ]\n\n tx.moveCall({\n target: `${integrate.published_at}::${ClmmIntegratePoolV2Module}::${functionName}`,\n typeArguments,\n arguments: args,\n })\n return tx\n }\n\n /**\n * adjust transaction for gas\n * @param sdk\n * @param amount\n * @param tx\n * @returns\n */\n static async adjustTransactionForGas(\n sdk: CetusClmmSDK,\n all_coins: CoinAsset[],\n amount: bigint,\n tx: Transaction\n ): Promise<{ fixAmount: bigint; newTx?: Transaction }> {\n tx.setSender(sdk.getSenderAddress())\n // amount coins\n const amount_coins = CoinAssist.selectCoinAssetGreaterThanOrEqual(all_coins, amount).selected_coins\n const total_amount = CoinAssist.calculateTotalBalance(all_coins)\n\n if (amount_coins.length === 0) {\n handleMessageError(UtilsErrorCode.InsufficientBalance, `Insufficient balance exceed amount ${amount} real amount ${total_amount}`)\n }\n\n // If the remaining coin balance is greater than 1000000000, no gas fee correction will be done\n if (total_amount - amount > 1000000000) {\n return { fixAmount: amount }\n }\n\n // payload Estimated gas consumption\n const estimate_gas = await sdk.FullClient.calculationTxGas(tx)\n\n // Find estimateGas objectIds\n const gas_coins = CoinAssist.selectCoinAssetGreaterThanOrEqual(\n all_coins,\n BigInt(estimate_gas),\n amount_coins.map((item) => item.coin_object_id)\n ).selected_coins\n\n // There is not enough gas and the amount needs to be adjusted\n if (gas_coins.length === 0) {\n // Readjust the amount , Reserve 500 gas for the spit\n const new_gas = BigInt(estimate_gas) + BigInt(500)\n if (total_amount - amount < new_gas) {\n amount -= new_gas\n if (amount < 0) {\n handleMessageError(UtilsErrorCode.InsufficientBalance, `gas Insufficient balance`)\n }\n\n const newTx = new Transaction()\n return { fixAmount: amount, newTx }\n }\n }\n return { fixAmount: amount }\n }\n\n /**\n * build swap transaction\n * @param params\n * @param packageId\n * @returns\n */\n static buildSwapTransaction(sdk: CetusClmmSDK, params: SwapParams, all_coin_asset: CoinAsset[]): Transaction {\n let tx = new Transaction()\n tx.setSender(sdk.getSenderAddress())\n\n const primaryCoinInputA = CoinAssist.buildCoinForAmount(\n tx,\n all_coin_asset,\n params.a2b ? BigInt(params.by_amount_in ? params.amount : params.amount_limit) : BigInt(0),\n params.coin_type_a,\n false\n )\n\n const primaryCoinInputB = CoinAssist.buildCoinForAmount(\n tx,\n all_coin_asset,\n params.a2b ? BigInt(0) : BigInt(params.by_amount_in ? params.amount : params.amount_limit),\n params.coin_type_b,\n false\n )\n\n tx = this.buildSwapTransactionArgs(tx, params, sdk.sdkOptions, primaryCoinInputA, primaryCoinInputB)\n return tx\n }\n\n static async fixSwapParams(sdk: CetusClmmSDK, params: SwapParams, gasEstimateArg: SwapGasEstimateArg): Promise<SwapParams> {\n const { current_pool } = gasEstimateArg\n try {\n const res: any = await sdk.Swap.preSwap({\n decimals_a: gasEstimateArg.decimals_a,\n decimals_b: gasEstimateArg.decimals_b,\n a2b: params.a2b,\n by_amount_in: params.by_amount_in,\n amount: params.amount,\n pool: current_pool,\n current_sqrt_price: current_pool.current_sqrt_price,\n coin_type_a: current_pool.coin_type_a,\n coin_type_b: current_pool.coin_type_b,\n })\n\n const to_amount = gasEstimateArg.by_amount_in ? res.estimated_amount_out : res.estimated_amount_in\n\n const amount_limit = adjustForSlippage(to_amount, gasEstimateArg.slippage, !gasEstimateArg.by_amount_in)\n params.amount_limit = amount_limit.toString()\n } catch (error) {\n handleError(ConfigErrorCode.InvalidConfig, error as Error)\n }\n\n return params\n }\n\n static async buildSwapTransactionWithoutTransferCoinsForGas(\n sdk: CetusClmmSDK,\n params: SwapParams,\n all_coin_asset: CoinAsset[],\n gas_estimate_arg: SwapGasEstimateArg\n ): Promise<{ tx: Transaction; coin_ab_s: TransactionObjectArgument[] }> {\n let { tx, coin_ab_s } = SwapUtils.buildSwapTransactionWithoutTransferCoins(sdk, params, all_coin_asset)\n tx.setSender(sdk.getSenderAddress())\n const newResult = await SwapUtils.adjustTransactionForGas(\n sdk,\n CoinAssist.getCoinAssets(params.a2b ? params.coin_type_a : params.coin_type_b, all_coin_asset),\n BigInt(params.by_amount_in ? params.amount : params.amount_limit),\n tx\n )\n\n const { fixAmount, newTx } = newResult\n\n if (newTx !== undefined) {\n newTx.setSender(sdk.getSenderAddress())\n if (params.by_amount_in) {\n params.amount = fixAmount.toString()\n } else {\n params.amount_limit = fixAmount.toString()\n }\n params = await SwapUtils.fixSwapParams(sdk, params, gas_estimate_arg)\n\n const primaryCoinInputA = CoinAssist.buildCoinForAmount(\n tx,\n all_coin_asset,\n params.a2b ? BigInt(params.by_amount_in ? params.amount : params.amount_limit) : BigInt(0),\n params.coin_type_a,\n false,\n true\n )\n\n const primaryCoinInputB = CoinAssist.buildCoinForAmount(\n tx,\n all_coin_asset,\n params.a2b ? BigInt(0) : BigInt(params.by_amount_in ? params.amount : params.amount_limit),\n params.coin_type_b,\n false,\n true\n )\n\n const res = SwapUtils.buildSwapTransactionWithoutTransferCoinArgs(\n sdk,\n newTx,\n params,\n sdk.sdkOptions,\n primaryCoinInputA,\n primaryCoinInputB\n )\n tx = res.tx\n coin_ab_s = res.txRes\n }\n\n return { tx, coin_ab_s }\n }\n\n /**\n * build swap transaction and return swapped coin\n * @param params\n * @param packageId\n * @returns\n */\n static buildSwapTransactionWithoutTransferCoins(\n sdk: CetusClmmSDK,\n params: SwapParams,\n all_coin_asset: CoinAsset[]\n ): { tx: Transaction; coin_ab_s: TransactionObjectArgument[] } {\n const tx = new Transaction()\n tx.setSender(sdk.getSenderAddress())\n\n // Fix amount must set true, to support amount limit.\n const primaryCoinInputA = CoinAssist.buildCoinForAmount(\n tx,\n all_coin_asset,\n params.a2b ? BigInt(params.by_amount_in ? params.amount : params.amount_limit) : BigInt(0),\n params.coin_type_a,\n false,\n true\n )\n\n const primaryCoinInputB = CoinAssist.buildCoinForAmount(\n tx,\n all_coin_asset,\n params.a2b ? BigInt(0) : BigInt(params.by_amount_in ? params.amount : params.amount_limit),\n params.coin_type_b,\n false,\n true\n )\n\n const res = SwapUtils.buildSwapTransactionWithoutTransferCoinArgs(sdk, tx, params, sdk.sdkOptions, primaryCoinInputA, primaryCoinInputB)\n return { tx: res.tx, coin_ab_s: res.txRes }\n }\n\n /**\n * build swap transaction\n * @param params\n * @param packageId\n * @returns\n */\n static buildSwapTransactionWithoutTransferCoinArgs(\n sdk: CetusClmmSDK,\n tx: Transaction,\n params: SwapParams,\n sdk_options: SdkOptions,\n primary_coin_input_a: BuildCoinResult,\n primary_coin_input_b: BuildCoinResult\n ): { tx: Transaction; txRes: TransactionObjectArgument[] } {\n const { clmm_pool, integrate } = sdk_options\n\n const sqrtPriceLimit = SwapUtils.getDefaultSqrtPriceLimit(params.a2b)\n\n const { global_config_id } = getPackagerConfigs(clmm_pool)\n\n if (global_config_id === undefined) {\n handleMessageError(ConfigErrorCode.InvalidConfig, 'clmm.config.global_config_id is undefined')\n }\n\n const hasSwapPartner = params.swap_partner !== undefined\n\n const functionName = hasSwapPartner ? 'swap_with_partner' : 'swap'\n\n const moduleName = hasSwapPartner ? ClmmIntegrateRouterWithPartnerModule : ClmmIntegrateRouterModule\n\n const args = hasSwapPartner\n ? [\n tx.object(global_config_id),\n tx.object(params.pool_id),\n tx.object(params.swap_partner!),\n primary_coin_input_a.target_coin,\n primary_coin_input_b.target_coin,\n tx.pure.bool(params.a2b),\n tx.pure.bool(params.by_amount_in),\n tx.pure.u64(params.amount),\n tx.pure.u128(sqrtPriceLimit.toString()),\n tx.pure.bool(false), // use coin value always set false.\n tx.object(CLOCK_ADDRESS),\n ]\n : [\n tx.object(global_config_id),\n tx.object(params.pool_id),\n primary_coin_input_a.target_coin,\n primary_coin_input_b.target_coin,\n tx.pure.bool(params.a2b),\n tx.pure.bool(params.by_amount_in),\n tx.pure.u64(params.amount),\n tx.pure.u128(sqrtPriceLimit.toString()),\n tx.pure.bool(false), // use coin value always set false.\n tx.object(CLOCK_ADDRESS),\n ]\n\n const typeArguments = [params.coin_type_a, params.coin_type_b]\n const coinABs: TransactionObjectArgument[] = tx.moveCall({\n target: `${integrate.published_at}::${moduleName}::${functionName}`,\n typeArguments,\n arguments: args,\n })\n\n if (params.by_amount_in) {\n const toCoinType = params.a2b ? params.coin_type_b : params.coin_type_a\n const toCoin = params.a2b ? coinABs[1] : coinABs[0]\n const totalAmount = Number(params.amount_limit)\n PositionUtils.checkCoinThreshold(sdk, params.by_amount_in, tx, toCoin, totalAmount, toCoinType)\n }\n\n return { tx, txRes: coinABs }\n }\n}\n\n/**\n * Get lower sqrt price from token A.\n *\n * @param amount - The amount of tokens the user wanted to swap from.\n * @param liquidity - The liquidity of the pool.\n * @param sqrt_price_x64 - The sqrt price of the pool.\n * @returns LowerSqrtPriceX64\n */\nexport function getLowerSqrtPriceFromCoinA(amount: BN, liquidity: BN, sqrt_price_x64: BN): BN {\n const numerator = liquidity.mul(sqrt_price_x64).shln(64)\n const denominator = liquidity.shln(64).add(amount.mul(sqrt_price_x64))\n\n // always round up\n return MathUtil.divRoundUp(numerator, denominator)\n}\n\n/**\n * Get upper sqrt price from token A.\n *\n * @param amount - The amount of tokens the user wanted to swap from.\n * @param liquidity - The liquidity of the pool.\n * @param sqrt_price_x64 - The sqrt price of the pool.\n * @returns LowerSqrtPriceX64\n */\nexport function getUpperSqrtPriceFromCoinA(amount: BN, liquidity: BN, sqrt_price_x64: BN): BN {\n const numerator = liquidity.mul(sqrt_price_x64).shln(64)\n const denominator = liquidity.shln(64).sub(amount.mul(sqrt_price_x64))\n\n // always round up\n return MathUtil.divRoundUp(numerator, denominator)\n}\n\n/**\n * Get lower sqrt price from coin B.\n *\n * @param amount - The amount of coins the user wanted to swap from.\n * @param liquidity - The liquidity of the pool.\n * @param sqrt_price_x64 - The sqrt price of the pool.\n * @returns LowerSqrtPriceX64\n */\nexport function getLowerSqrtPriceFromCoinB(amount: BN, liquidity: BN, sqrt_price_x64: BN): BN {\n // always round down(rounding up a negative number)\n return sqrt_price_x64.sub(MathUtil.divRoundUp(amount.shln(64), liquidity))\n}\n\n/**\n * Get upper sqrt price from coin B.\n *\n * @param amount - The amount of coins the user wanted to swap from.\n * @param liquidity - The liquidity of the pool.\n * @param sqrtPriceX64 - The sqrt price of the pool.\n * @returns LowerSqrtPriceX64\n */\nexport function getUpperSqrtPriceFromCoinB(amount: BN, liquidity: BN, sqrt_price_x64: BN): BN {\n // always round down (rounding up a negative number)\n return sqrt_price_x64.add(amount.shln(64).div(liquidity))\n}\n","import type { TransactionArgument } from '@mysten/sui/transactions'\nimport type { SuiAddressType } from '@cetusprotocol/common-sdk'\nimport { ClmmError, TypesErrorCode } from '../errors/errors'\n\n/**\n * Constants for different modules in the CLMM (Cryptocurrency Liquidity Mining Module).\n */\nexport const ClmmPartnerModule = 'partner'\nexport const ClmmIntegratePoolModule = 'pool_script'\nexport const ClmmIntegratePoolV2Module = 'pool_script_v2'\nexport const ClmmIntegratePoolV3Module = 'pool_script_v3'\nexport const ClmmIntegrateRouterModule = 'router'\nexport const ClmmIntegrateRouterWithPartnerModule = 'router_with_partner'\nexport const ClmmFetcherModule = 'fetcher_script'\nexport const ClmmExpectSwapModule = 'expect_swap'\nexport const ClmmIntegrateUtilsModule = 'utils'\n\nexport const DeepbookCustodianV2Module = 'custodian_v2'\nexport const DeepbookClobV2Module = 'clob_v2'\nexport const DeepbookEndpointsV2Module = 'endpoints_v2'\n\n/**\n * Represents a Non-Fungible Token (NFT) with associated metadata.\n */\nexport type NFT = {\n /**\n * The address or identifier of the creator of the NFT.\n */\n creator: string\n\n /**\n * A description providing additional information about the NFT.\n */\n description: string\n\n /**\n * The URL to the image representing the NFT visually.\n */\n image_url: string\n\n /**\n * A link associated with the NFT, providing more details or interactions.\n */\n link: string\n\n /**\n * The name or title of the NFT.\n */\n name: string\n\n /**\n * The URL to the project or collection associated with the NFT.\n */\n project_url: string\n}\n\n/**\n * Represents a SUI struct tag.\n */\nexport type SuiStructTag = {\n /**\n * The full address of the struct.\n */\n full_address: string\n\n /**\n * The source address of the struct.\n */\n source_address: string\n\n /**\n * The address of the struct.\n */\n address: SuiAddressType\n\n /**\n * The module to which the struct belongs.\n */\n module: string\n\n /**\n * The name of the struct.\n */\n name: string\n\n /**\n * An array of type arguments (SUI addresses) for the struct.\n */\n type_arguments: SuiAddressType[]\n}\n\n/**\n * Represents basic SUI data types.\n */\nexport type SuiBasicTypes = 'address' | 'bool' | 'u8' | 'u16' | 'u32' | 'u64' | 'u128' | 'u256'\n\n/**\n * Represents a SUI transaction argument, which can be of various types.\n */\nexport type SuiTxArg = TransactionArgument | string | number | bigint | boolean\n\n/**\n * Represents input types for SUI data.\n */\nexport type SuiInputTypes = 'object' | SuiBasicTypes\n\n/**\n * Gets the default SUI input type based on the provided value.\n * @param value - The value to determine the default input type for.\n * @returns The default SUI input type.\n * @throws Error if the type of the value is unknown.\n */\nexport const getDefaultSuiInputType = (value: any): SuiInputTypes => {\n if (typeof value === 'string' && value.startsWith('0x')) {\n return 'object' // Treat value as an object if it starts with '0x'.\n }\n if (typeof value === 'number' || typeof value === 'bigint') {\n return 'u64' // Treat number or bigint values as 'u64' type.\n }\n if (typeof value === 'boolean') {\n return 'bool' // Treat boolean values as 'bool' type.\n }\n throw new ClmmError(`Unknown type for value: ${value}`, TypesErrorCode.InvalidType)\n}\n","import type { TransactionObjectArgument } from '@mysten/sui/transactions'\nimport { Transaction } from '@mysten/sui/transactions'\nimport BN from 'bn.js'\nimport {\n asUintN,\n BuildCoinResult,\n ClmmPoolUtil,\n CLOCK_ADDRESS,\n CoinAsset,\n CoinAssist,\n CoinPairType,\n getPackagerConfigs,\n normalizeCoinType,\n} from '@cetusprotocol/common-sdk'\nimport Decimal from 'decimal.js'\nimport { handleMessageError, UtilsErrorCode } from '../errors/errors'\nimport SDK, { AddLiquidityFixTokenParams, CollectRewarderParams } from '../index'\nimport { ClmmIntegratePoolV2Module, ClmmIntegrateRouterModule } from '../types/sui'\n\nexport type AdjustResult = {\n is_adjust_coin_a: boolean\n is_adjust_coin_b: boolean\n}\n\n/**\n * Adjust coinpair is sui\n * @param {CoinPairType} coinPair\n * @returns\n */\nexport function findAdjustCoin(coinPair: CoinPairType): AdjustResult {\n const is_adjust_coin_a = CoinAssist.isSuiCoin(coinPair.coin_type_a)\n const is_adjust_coin_b = CoinAssist.isSuiCoin(coinPair.coin_type_b)\n return { is_adjust_coin_a, is_adjust_coin_b }\n}\n\n/**\n *\n * @param {number} slippageAmount\n * @param slippage\n * @returns\n */\nfunction raverSlippageAmount(slippageAmount: number | string, slippage: number): string {\n return Decimal.ceil(Decimal(slippageAmount).div(1 + slippage)).toString()\n}\n\nexport class PositionUtils {\n static createCollectRewarderAndFeeParams(\n sdk: SDK,\n tx: Transaction,\n params: CollectRewarderParams,\n all_coin_asset: CoinAsset[],\n all_coin_asset_a?: CoinAsset[],\n all_coin_asset_b?: CoinAsset[]\n ) {\n if (all_coin_asset_a === undefined) {\n all_coin_asset_a = [...all_coin_asset]\n }\n if (all_coin_asset_b === undefined) {\n all_coin_asset_b = [...all_coin_asset]\n }\n const coin_type_a = normalizeCoinType(params.coin_type_a)\n const coin_type_b = normalizeCoinType(params.coin_type_b)\n if (params.collect_fee) {\n const primary_coin_a_input = CoinAssist.buildCoinForAmount(tx, all_coin_asset_a, BigInt(0), coin_type_a, false)\n all_coin_asset_a = primary_coin_a_input.remain_coins\n\n const primary_coin_b_input = CoinAssist.buildCoinForAmount(tx, all_coin_asset_b, BigInt(0), coin_type_b, false)\n all_coin_asset_b = primary_coin_b_input.remain_coins\n\n tx = sdk.Position.createCollectFeePayload(\n {\n pool_id: params.pool_id,\n pos_id: params.pos_id,\n coin_type_a: params.coin_type_a,\n coin_type_b: params.coin_type_b,\n },\n tx,\n primary_coin_a_input.target_coin,\n primary_coin_b_input.target_coin\n )\n }\n const primary_coin_inputs: TransactionObjectArgument[] = []\n params.rewarder_coin_types.forEach((type) => {\n switch (normalizeCoinType(type)) {\n case coin_type_a:\n primary_coin_inputs.push(CoinAssist.buildCoinForAmount(tx, all_coin_asset_a!, BigInt(0), type, false).target_coin)\n break\n case coin_type_b:\n primary_coin_inputs.push(CoinAssist.buildCoinForAmount(tx, all_coin_asset_b!, BigInt(0), type, false).target_coin)\n break\n default:\n primary_coin_inputs.push(CoinAssist.buildCoinForAmount(tx, all_coin_asset, BigInt(0), type, false).target_coin)\n break\n }\n })\n tx = sdk.Rewarder.createCollectRewarderPayload(params, tx, primary_coin_inputs)\n return tx\n }\n\n /**\n * adjust transaction for gas\n * @param sdk\n * @param amount\n * @param tx\n * @returns\n */\n static async adjustTransactionForGas(\n sdk: SDK,\n all_coins: CoinAsset[],\n amount: bigint,\n tx: Transaction\n ): Promise<{ fixAmount: bigint; newTx?: Transaction }> {\n tx.setSender(sdk.getSenderAddress())\n // amount coins\n const amount_coins = CoinAssist.selectCoinAssetGreaterThanOrEqual(all_coins, amount).selected_coins\n\n const total_amount = CoinAssist.calculateTotalBalance(all_coins)\n\n if (amount_coins.length === 0) {\n handleMessageError(UtilsErrorCode.InsufficientBalance, `Insufficient balance exceed amount ${amount} real amount ${total_amount}`)\n }\n // If the remaining coin balance is greater than 1000000000, no gas fee correction will be done\n if (total_amount - amount > 1000000000) {\n return { fixAmount: amount }\n }\n\n // payload Estimated gas consumption\n const estimate_gas = await sdk.FullClient.calculationTxGas(Transaction.from(tx))\n\n // Find estimateGas objectIds\n const gas_coins = CoinAssist.selectCoinAssetGreaterThanOrEqual(\n all_coins,\n BigInt(estimate_gas),\n amount_coins.map((item) => item.coin_object_id)\n ).selected_coins\n\n // There is not enough gas and the amount needs to be adjusted\n if (gas_coins.length === 0) {\n // Readjust the amount , Reserve 500 gas for the spit\n const new_gas = BigInt(estimate_gas) + BigInt(500)\n if (total_amount - amount < new_gas) {\n amount -= new_gas\n if (amount < 0) {\n handleMessageError(UtilsErrorCode.InsufficientBalance, `gas Insufficient balance`)\n }\n\n const newTx = new Transaction()\n return { fixAmount: amount, newTx }\n }\n }\n return { fixAmount: amount }\n }\n\n // -----------------------------------------liquidity-----------------------------------------------//\n /**\n * build add liquidity transaction\n * @param params\n * @param slippage\n * @param curSqrtPrice\n * @returns\n */\n static async buildAddLiquidityFixTokenForGas(\n sdk: SDK,\n all_coins: CoinAsset[],\n params: AddLiquidityFixTokenParams,\n gas_estimate_arg: {\n slippage: number\n cur_sqrt_price: BN\n },\n tx?: Transaction,\n input_coin_a?: TransactionObjectArgument,\n input_coin_b?: TransactionObjectArgument\n ): Promise<Transaction> {\n tx = await this.buildAddLiquidityFixToken(sdk, all_coins, params, tx, input_coin_a, input_coin_b)\n\n const { is_adjust_coin_a } = findAdjustCoin(params)\n\n const sui_amount = is_adjust_coin_a ? params.amount_a : params.amount_b\n\n const newResult = await this.adjustTransactionForGas(\n sdk,\n CoinAssist.getCoinAssets(is_adjust_coin_a ? params.coin_type_a : params.coin_type_b, all_coins),\n BigInt(sui_amount),\n tx\n )\n\n const { fixAmount } = newResult\n let newTx = newResult.newTx\n\n if (newTx != null) {\n let primaryCoinAInputs: BuildCoinResult\n let primaryCoinBInputs: BuildCoinResult\n\n if (is_adjust_coin_a) {\n params.amount_a = Number(fixAmount)\n primaryCoinAInputs = this.buildAddLiquidityFixTokenCoinInput(\n newTx,\n !params.fix_amount_a,\n fixAmount.toString(),\n params.slippage,\n params.coin_type_a,\n all_coins,\n false,\n true\n )\n primaryCoinBInputs = this.buildAddLiquidityFixTokenCoinInput(\n newTx,\n params.fix_amount_a,\n params.amount_b,\n params.slippage,\n params.coin_type_b,\n all_coins,\n false,\n true\n )\n } else {\n params.amount_b = Number(fixAmount)\n primaryCoinAInputs = this.buildAddLiquidityFixTokenCoinInput(\n newTx,\n !params.fix_amount_a,\n params.amount_a,\n params.slippage,\n params.coin_type_a,\n all_coins,\n false,\n true\n )\n primaryCoinBInputs = this.buildAddLiquidityFixTokenCoinInput(\n newTx,\n params.fix_amount_a,\n fixAmount.toString(),\n params.slippage,\n params.coin_type_b,\n all_coins,\n false,\n true\n )\n params = this.fixAddLiquidityFixTokenParams(params, gas_estimate_arg.slippage, gas_estimate_arg.cur_sqrt_price)\n\n return this.buildAddLiquidityFixTokenArgs(newTx, sdk, all_coins, params, primaryCoinAInputs, primaryCoinBInputs)\n }\n }\n return tx\n }\n\n /**\n * build add liquidity transaction\n * @param params\n * @param packageId\n * @returns\n */\n static async buildAddLiquidityFixToken(\n sdk: SDK,\n all_coins: CoinAsset[],\n params: AddLiquidityFixTokenParams,\n tx?: Transaction,\n input_coin_a?: TransactionObjectArgument,\n input_coin_b?: TransactionObjectArgument\n ): Promise<Transaction> {\n tx = tx || new Transaction()\n\n let primaryCoinAInputs: BuildCoinResult\n let primaryCoinBInputs: BuildCoinResult\n if (input_coin_a == null || input_coin_b == null) {\n primaryCoinAInputs = this.buildAddLiquidityFixTokenCoinInput(\n tx,\n !params.fix_amount_a,\n params.amount_a,\n params.slippage,\n params.coin_type_a,\n all_coins,\n false,\n true\n )\n primaryCoinBInputs = this.buildAddLiquidityFixTokenCoinInput(\n tx,\n params.fix_amount_a,\n params.amount_b,\n params.slippage,\n params.coin_type_b,\n all_coins,\n false,\n true\n )\n } else {\n primaryCoinAInputs = {\n target_coin: input_coin_a,\n remain_coins: [],\n is_mint_zero_coin: false,\n target_coin_amount: '0',\n selected_coins: [],\n }\n primaryCoinBInputs = {\n target_coin: input_coin_b,\n remain_coins: [],\n is_mint_zero_coin: false,\n target_coin_amount: '0',\n selected_coins: [],\n }\n }\n\n tx = this.buildAddLiquidityFixTokenArgs(\n tx,\n sdk,\n all_coins,\n params as AddLiquidityFixTokenParams,\n primaryCoinAInputs,\n primaryCoinBInputs\n )\n return tx\n }\n\n public static buildAddLiquidityFixTokenCoinInput(\n tx: Transaction,\n need_interval_amount: boolean,\n amount: number | string,\n slippage: number,\n coin_type: string,\n all_coins: CoinAsset[],\n build_vector = true,\n fix_amount = true\n ): BuildCoinResult {\n return need_interval_amount\n ? CoinAssist.buildCoinForAmountInterval(\n tx,\n all_coins,\n { amount_second: BigInt(raverSlippageAmount(amount, slippage)), amount_first: BigInt(amount) },\n coin_type,\n build_vector,\n fix_amount\n )\n : CoinAssist.buildCoinForAmount(tx, all_coins, BigInt(amount), coin_type, build_vector, fix_amount)\n }\n\n /**\n * fix add liquidity fix token for coin amount\n * @param params\n * @param slippage\n * @param curSqrtPrice\n * @returns\n */\n static fixAddLiquidityFixTokenParams(params: AddLiquidityFixTokenParams, slippage: number, curSqrtPrice: BN): AddLiquidityFixTokenParams {\n const coinAmount = params.fix_amount_a ? params.amount_a : params.amount_b\n const liquidityInput = ClmmPoolUtil.estLiquidityAndCoinAmountFromOneAmounts(\n Number(params.tick_lower),\n Number(params.tick_upper),\n new BN(coinAmount),\n params.fix_amount_a,\n true,\n slippage,\n curSqrtPrice\n )\n\n params.amount_a = params.fix_amount_a ? params.amount_a : liquidityInput.coin_amount_limit_a\n params.amount_b = params.fix_amount_a ? liquidityInput.coin_amount_limit_b : params.amount_b\n\n return params\n }\n\n private static buildAddLiquidityFixTokenArgs(\n tx: Transaction,\n sdk: SDK,\n all_coins: CoinAsset[],\n params: AddLiquidityFixTokenParams,\n primary_coina_inputs: BuildCoinResult,\n primary_coinb_inputs: BuildCoinResult\n ) {\n const typeArguments = [params.coin_type_a, params.coin_type_b]\n const functionName = params.is_open ? 'open_position_with_liquidity_by_fix_coin' : 'add_liquidity_by_fix_coin'\n const { clmm_pool, integrate } = sdk.sdkOptions\n\n if (!params.is_open) {\n tx = this.createCollectRewarderAndFeeParams(\n sdk,\n tx,\n params,\n all_coins,\n primary_coina_inputs.remain_coins,\n primary_coinb_inputs.remain_coins\n )\n }\n\n const clmmConfig = getPackagerConfigs(clmm_pool)\n const args = params.is_open\n ? [\n tx.object(clmmConfig.global_config_id),\n tx.object(params.pool_id),\n tx.pure.u32(Number(asUintN(BigInt(params.tick_lower)).toString())),\n tx.pure.u32(Number(asUintN(BigInt(params.tick_upper)).toString())),\n primary_coina_inputs.target_coin,\n primary_coinb_inputs.target_coin,\n tx.pure.u64(params.amount_a),\n tx.pure.u64(params.amount_b),\n tx.pure.bool(params.fix_amount_a),\n tx.object(CLOCK_ADDRESS),\n ]\n : [\n tx.object(clmmConfig.global_config_id),\n tx.object(params.pool_id),\n tx.object(params.pos_id),\n primary_coina_inputs.target_coin,\n primary_coinb_inputs.target_coin,\n tx.pure.u64(params.amount_a),\n tx.pure.u64(params.amount_b),\n tx.pure.bool(params.fix_amount_a),\n tx.object(CLOCK_ADDRESS),\n ]\n\n tx.moveCall({\n target: `${integrate.published_at}::${ClmmIntegratePoolV2Module}::${functionName}`,\n typeArguments,\n arguments: args,\n })\n return tx\n }\n\n static checkCoinThreshold(\n sdk: SDK,\n by_amount_in: boolean,\n tx: Transaction,\n coin: TransactionObjectArgument,\n amount_limit: number,\n coin_type: string\n ) {\n if (by_amount_in) {\n tx.moveCall({\n target: `${sdk.sdkOptions.integrate.published_at}::${ClmmIntegrateRouterModule}::check_coin_threshold`,\n typeArguments: [coin_type],\n arguments: [coin, tx.pure.u64(amount_limit)],\n })\n }\n }\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 type { SuiObjectResponse, SuiTransactionBlockResponse } from '@mysten/sui/client'\nimport { Transaction, TransactionObjectArgument } from '@mysten/sui/transactions'\nimport BN from 'bn.js'\nimport {\n asIntN,\n buildNFT,\n d,\n DETAILS_KEYS,\n extractStructTagFromType,\n getMoveObjectType,\n getObjectDeletedResponse,\n getObjectFields,\n getObjectId,\n getObjectNotExistsResponse,\n getObjectOwner,\n MathUtil,\n} from '@cetusprotocol/common-sdk'\nimport { handleMessageError, PoolErrorCode, PositionErrorCode } from '../errors/errors'\nimport { CetusClmmSDK } from '../sdk'\nimport type { Pool, PoolStatus, PoolTransactionInfo, Position, PositionInfo, PositionTransactionInfo, Rewarder } from '../types'\nimport { ClmmIntegrateUtilsModule, ClmmPositionStatus, poolFilterEvenTypes } from '../types'\nimport type { TickData } from '../types/clmmpool'\nimport type { NFT } from '../types/sui'\n\n/**\n * Builds a pool name based on two coin types and tick spacing.\n * @param {string} coin_type_a - The type of the first coin.\n * @param {string} coin_type_b - The type of the second coin.\n * @param {string} tick_spacing - The tick spacing of the pool.\n * @returns {string} - The name of the pool.\n */\nfunction buildPoolName(coin_type_a: string, coin_type_b: string, tick_spacing: string) {\n const coinNameA = extractStructTagFromType(coin_type_a).name\n const coinNameB = extractStructTagFromType(coin_type_b).name\n return `${coinNameA}-${coinNameB}[${tick_spacing}]`\n}\n\n/**\n * Builds a Pool object based on a SuiObjectResponse.\n * @param {SuiObjectResponse} objects - The SuiObjectResponse containing information about the pool.\n * @returns {Pool} - The built Pool object.\n */\nexport function buildPool(objects: SuiObjectResponse): Pool {\n const type = getMoveObjectType(objects) as string\n const formatType = extractStructTagFromType(type)\n const fields = getObjectFields(objects)\n if (fields == null) {\n handleMessageError(PoolErrorCode.InvalidPoolObject, `Pool id ${getObjectId(objects)} not exists.`, {\n [DETAILS_KEYS.METHOD_NAME]: 'buildPool',\n })\n }\n\n const rewarders: Rewarder[] = []\n fields.rewarder_manager.fields.rewarders.forEach((item: any) => {\n const { emissions_per_second } = item.fields\n const emissionSeconds = MathUtil.fromX64(new BN(emissions_per_second))\n const emissionsEveryDay = Math.floor(emissionSeconds.toNumber() * 60 * 60 * 24)\n\n rewarders.push({\n emissions_per_second,\n coin_type: extractStructTagFromType(item.fields.reward_coin.fields.name).source_address,\n growth_global: item.fields.growth_global,\n emissions_every_day: emissionsEveryDay,\n })\n })\n\n const is_pause = fields.is_pause\n const pool_status: PoolStatus = {\n disable_add_liquidity: is_pause,\n disable_remove_liquidity: is_pause,\n disable_swap: is_pause,\n disable_flash_loan: is_pause,\n disable_collect_fee: is_pause,\n disable_collect_reward: is_pause,\n }\n\n const pool: Pool = {\n id: getObjectId(objects),\n pool_type: type,\n coin_type_a: formatType.type_arguments[0],\n coin_type_b: formatType.type_arguments[1],\n coin_amount_a: fields.coin_a,\n coin_amount_b: fields.coin_b,\n current_sqrt_price: fields.current_sqrt_price,\n current_tick_index: asIntN(BigInt(fields.current_tick_index.fields.bits)),\n fee_growth_global_a: fields.fee_growth_global_a,\n fee_growth_global_b: fields.fee_growth_global_b,\n fee_protocol_coin_a: fields.fee_protocol_coin_a,\n fee_protocol_coin_b: fields.fee_protocol_coin_b,\n fee_rate: fields.fee_rate,\n pool_status,\n liquidity: fields.liquidity,\n position_manager: {\n positions_handle: fields.position_manager.fields.positions.fields.id.id,\n size: fields.position_manager.fields.positions.fields.size,\n },\n rewarder_infos: rewarders,\n rewarder_last_updated_time: fields.rewarder_manager.fields.last_updated_time,\n tick_spacing: fields.tick_spacing,\n ticks_handle: fields.tick_manager.fields.ticks.fields.id.id,\n uri: fields.url,\n index: Number(fields.index),\n name: '',\n }\n pool.name = buildPoolName(pool.coin_type_a, pool.coin_type_b, pool.tick_spacing)\n return pool\n}\n\n/** Builds a Position object based on a SuiObjectResponse.\n * @param {SuiObjectResponse} object - The SuiObjectResponse containing information about the position.\n * @returns {Position} - The built Position object.\n */\nexport function buildPosition(object: SuiObjectResponse): Position {\n if (object.error != null || object.data?.content?.dataType !== 'moveObject') {\n handleMessageError(PositionErrorCode.InvalidPositionObject, `Position not exists. Get Position error:${object.error}`, {\n [DETAILS_KEYS.METHOD_NAME]: 'buildPosition',\n })\n }\n\n let nft: NFT = {\n creator: '',\n description: '',\n image_url: '',\n link: '',\n name: '',\n project_url: '',\n }\n\n let position = {\n ...nft,\n pos_object_id: '',\n owner: '',\n type: '',\n coin_type_a: '',\n coin_type_b: '',\n liquidity: '',\n tick_lower_index: 0,\n tick_upper_index: 0,\n index: 0,\n pool: '',\n reward_amount_owned_0: '0',\n reward_amount_owned_1: '0',\n reward_amount_owned_2: '0',\n reward_growth_inside_0: '0',\n reward_growth_inside_1: '0',\n reward_growth_inside_2: '0',\n fee_growth_inside_a: '0',\n fee_owned_a: '0',\n fee_growth_inside_b: '0',\n fee_owned_b: '0',\n position_status: ClmmPositionStatus.Exists,\n }\n let fields = getObjectFields(object)\n if (fields) {\n const type = getMoveObjectType(object) as string\n const ownerWarp = getObjectOwner(object) as {\n AddressOwner: string\n }\n\n if ('nft' in fields) {\n fields = fields.nft.fields\n nft.description = fields.description as string\n nft.name = fields.name\n nft.link = fields.url\n } else {\n nft = buildNFT(object)\n }\n\n position = {\n ...nft,\n pos_object_id: fields.id.id,\n owner: ownerWarp.AddressOwner,\n type,\n liquidity: fields.liquidity,\n coin_type_a: fields.coin_type_a.fields.name,\n coin_type_b: fields.coin_type_b.fields.name,\n tick_lower_index: asIntN(BigInt(fields.tick_lower_index.fields.bits)),\n tick_upper_index: asIntN(BigInt(fields.tick_upper_index.fields.bits)),\n index: fields.index,\n pool: fields.pool,\n reward_amount_owned_0: '0',\n reward_amount_owned_1: '0',\n reward_amount_owned_2: '0',\n reward_growth_inside_0: '0',\n reward_growth_inside_1: '0',\n reward_growth_inside_2: '0',\n fee_growth_inside_a: '0',\n fee_owned_a: '0',\n fee_growth_inside_b: '0',\n fee_owned_b: '0',\n position_status: ClmmPositionStatus.Exists,\n }\n }\n\n const deletedResponse = getObjectDeletedResponse(object)\n if (deletedResponse) {\n position.pos_object_id = deletedResponse.objectId\n position.position_status = ClmmPositionStatus.Deleted\n }\n const objectNotExistsResponse = getObjectNotExistsResponse(object)\n if (objectNotExistsResponse) {\n position.pos_object_id = objectNotExistsResponse\n position.position_status = ClmmPositionStatus.NotExists\n }\n\n return position\n}\n\n/**\n * Builds a PositionReward object based on a response containing information about the reward.\n * @param {any} fields - The response containing information about the reward.\n * @returns {PositionReward} - The built PositionReward object.\n */\nexport function buildPositionInfo(fields: any): PositionInfo {\n const rewarders = {\n reward_amount_owned_0: '0',\n reward_amount_owned_1: '0',\n reward_amount_owned_2: '0',\n reward_growth_inside_0: '0',\n reward_growth_inside_1: '0',\n reward_growth_inside_2: '0',\n }\n fields = 'fields' in fields ? fields.fields : fields\n\n fields.rewards.forEach((item: any, index: number) => {\n const { amount_owned, growth_inside } = 'fields' in item ? item.fields : item\n if (index === 0) {\n rewarders.reward_amount_owned_0 = amount_owned\n rewarders.reward_growth_inside_0 = growth_inside\n } else if (index === 1) {\n rewarders.reward_amount_owned_1 = amount_owned\n rewarders.reward_growth_inside_1 = growth_inside\n } else if (index === 2) {\n rewarders.reward_amount_owned_2 = amount_owned\n rewarders.reward_growth_inside_2 = growth_inside\n }\n })\n\n const tick_lower_index = 'fields' in fields.tick_lower_index ? fields.tick_lower_index.fields.bits : fields.tick_lower_index.bits\n const tick_upper_index = 'fields' in fields.tick_upper_index ? fields.tick_upper_index.fields.bits : fields.tick_upper_index.bits\n\n const position: PositionInfo = {\n liquidity: fields.liquidity,\n tick_lower_index: asIntN(BigInt(tick_lower_index)),\n tick_upper_index: asIntN(BigInt(tick_upper_index)),\n ...rewarders,\n fee_growth_inside_a: fields.fee_growth_inside_a,\n fee_owned_a: fields.fee_owned_a,\n fee_growth_inside_b: fields.fee_growth_inside_b,\n fee_owned_b: fields.fee_owned_b,\n pos_object_id: fields.position_id,\n }\n return position\n}\n\n/**\n * Builds a TickData object based on a response containing information about tick data.\n * It must check if the response contains the required fields.\n * @param {SuiObjectResponse} objects - The response containing information about tick data.\n * @returns {TickData} - The built TickData object.\n */\nexport function buildTickData(objects: SuiObjectResponse): TickData {\n if (objects.error != null || objects.data?.content?.dataType !== 'moveObject') {\n handleMessageError(PoolErrorCode.InvalidTickObject, `Tick not exists. Get tick data error:${objects.error}`, {\n [DETAILS_KEYS.METHOD_NAME]: 'buildTickData',\n })\n }\n\n const fields = getObjectFields(objects)\n\n const valueItem = fields.value.fields.value.fields\n const position: TickData = {\n object_id: getObjectId(objects),\n index: asIntN(BigInt(valueItem.index.fields.bits)),\n sqrt_price: new BN(valueItem.sqrt_price),\n liquidity_net: new BN(valueItem.liquidity_net.fields.bits),\n liquidity_gross: new BN(valueItem.liquidity_gross),\n fee_growth_outside_a: new BN(valueItem.fee_growth_outside_a),\n fee_growth_outside_b: new BN(valueItem.fee_growth_outside_b),\n rewarders_growth_outside: valueItem.rewards_growth_outside,\n }\n\n return position\n}\n\n/**\n * Builds a TickData object based on a given event's fields.\n * @param {any} fields - The fields of an event.\n * @returns {TickData} - The built TickData object.\n * @throws {Error} If any required field is missing.\n */\nexport function buildTickDataByEvent(fields: any): TickData {\n if (\n !fields ||\n !fields.index ||\n !fields.sqrt_price ||\n !fields.liquidity_net ||\n !fields.liquidity_gross ||\n !fields.fee_growth_outside_a ||\n !fields.fee_growth_outside_b\n ) {\n handleMessageError(PoolErrorCode.InvalidTickFields, `Invalid tick fields.`, {\n [DETAILS_KEYS.METHOD_NAME]: 'buildTickDataByEvent',\n })\n }\n\n // It's assumed that asIntN is a function that converts a BigInt to an integer.\n const index = asIntN(BigInt(fields.index.bits))\n const sqrt_price = new BN(fields.sqrt_price)\n const liquidity_net = new BN(fields.liquidity_net.bits)\n const liquidity_gross = new BN(fields.liquidity_gross)\n const fee_growth_outside_a = new BN(fields.fee_growth_outside_a)\n const fee_growth_outside_b = new BN(fields.fee_growth_outside_b)\n const rewarders_growth_outside = fields.rewards_growth_outside || []\n\n const tick: TickData = {\n object_id: '',\n index,\n sqrt_price,\n liquidity_net,\n liquidity_gross,\n fee_growth_outside_a,\n fee_growth_outside_b,\n rewarders_growth_outside,\n }\n\n return tick\n}\n\nexport function buildClmmPositionName(pool_index: number, position_index: number): string {\n return `Cetus LP | Pool${pool_index}-${position_index}`\n}\n\nexport function buildPositionTransactionInfo(data: SuiTransactionBlockResponse, txIndex: number, filterIds: string[]) {\n const list: PositionTransactionInfo[] = []\n const { timestampMs, events } = data\n\n const filterEvenTypes = [\n 'AddLiquidityEvent',\n 'RemoveLiquidityEvent',\n 'CollectFeeEvent',\n 'CollectRewardEvent',\n 'CollectRewardV2Event',\n 'HarvestEvent',\n ]\n\n events?.forEach((event, index) => {\n const type = extractStructTagFromType(event.type).name\n if (filterEvenTypes.includes(type)) {\n const info: PositionTransactionInfo = {\n tx_digest: event.id.txDigest,\n package_id: event.packageId,\n transaction_module: event.transactionModule,\n sender: event.sender,\n type: event.type,\n timestamp_ms: timestampMs || '0',\n parsed_json: event.parsedJson,\n index: `${txIndex}_${index}`,\n }\n\n switch (type) {\n case 'CollectFeeEvent':\n if (filterIds.includes(info.parsed_json.position) && (d(info.parsed_json.amount_a).gt(0) || d(info.parsed_json.amount_b).gt(0))) {\n list.push(info)\n }\n break\n case 'RemoveLiquidityEvent':\n case 'AddLiquidityEvent':\n if (d(info.parsed_json.amount_a).gt(0) || d(info.parsed_json.amount_b).gt(0)) {\n list.push(info)\n }\n break\n case 'CollectRewardEvent':\n case 'HarvestEvent':\n case 'CollectRewardV2Event':\n if (\n (filterIds.includes(info.parsed_json.position) || filterIds.includes(info.parsed_json.wrapped_position_id)) &&\n d(info.parsed_json.amount).gt(0)\n ) {\n list.push(info)\n }\n break\n\n default:\n break\n }\n }\n })\n\n return list\n}\n\nexport function buildPoolTransactionInfo(data: SuiTransactionBlockResponse, txIndex: number, package_id: string, pool_id: string) {\n const list: PoolTransactionInfo[] = []\n const { timestampMs, events } = data\n\n events?.forEach((event: any, index) => {\n const { name: type, address: package_address } = extractStructTagFromType(event.type)\n if (poolFilterEvenTypes.includes(type) && package_address === package_id && pool_id === event.parsedJson.pool) {\n const info: PoolTransactionInfo = {\n tx: event.id.txDigest,\n sender: event.sender,\n type: event.type,\n block_time: timestampMs || '0',\n index: `${txIndex}_${index}`,\n parsed_json: event.parsedJson,\n }\n list.push(info)\n }\n })\n\n return list\n}\n\nexport function buildTransferCoinToSender(sdk: CetusClmmSDK, tx: Transaction, coin: TransactionObjectArgument, coinType: string) {\n tx.moveCall({\n target: `${sdk.sdkOptions.integrate.published_at}::${ClmmIntegrateUtilsModule}::transfer_coin_to_sender`,\n typeArguments: [coinType],\n arguments: [coin],\n })\n}\n\n// If recipient not set, transfer objects move call will use ctx sender\nexport function buildTransferCoin(\n sdk: CetusClmmSDK,\n tx: Transaction,\n coin: TransactionObjectArgument,\n coinType: string,\n recipient?: string\n) {\n if (recipient != null) {\n tx.transferObjects([coin], tx.pure.address(recipient))\n } else {\n buildTransferCoinToSender(sdk, tx, coin, coinType)\n }\n}\n","import { SuiObjectResponse } from '@mysten/sui/client'\nimport { ClmmVestInfo, PositionVesting } from '../types/vest'\nimport { asIntN, d, extractStructTagFromType, fixCoinType, getObjectFields, getObjectType } from '@cetusprotocol/common-sdk'\nimport { PoolLiquiditySnapshot, PositionSnapshot } from '../types/clmm_type'\n\nexport const BPS = 10000\nexport class VestUtils {\n static parseClmmVestInfo(res: SuiObjectResponse): ClmmVestInfo {\n const fields = getObjectFields(res)\n const type = getObjectType(res) as any\n const structTag = extractStructTagFromType(type)\n\n const global_vesting_periods = fields.global_vesting_periods.map((item: any) => {\n return {\n period: item.fields.period,\n release_time: item.fields.release_time,\n redeemed_amount: item.fields.redeemed_amount,\n percentage: d(item.fields.percentage).div(BPS).toNumber(),\n }\n })\n\n const vestInfo: ClmmVestInfo = {\n id: fields.id.id,\n balance: fields.balance,\n global_vesting_periods,\n total_value: fields.total_value,\n total_cetus_amount: fields.total_cetus_amount,\n redeemed_amount: fields.redeemed_amount,\n start_time: fields.start_time,\n type: structTag.full_address,\n positions: {\n id: fields.positions.fields.id,\n size: fields.positions.fields.size,\n },\n }\n return vestInfo\n }\n\n static parsePositionVesting(fields: any): PositionVesting {\n const info: PositionVesting = {\n position_id: fields.position_id,\n cetus_amount: fields.cetus_amount,\n redeemed_amount: fields.redeemed_amount,\n is_paused: fields.is_paused,\n impaired_a: fields.impaired_a,\n impaired_b: fields.impaired_b,\n period_details: fields.period_details,\n coin_type_a: fixCoinType(fields.coin_a.name, false),\n coin_type_b: fixCoinType(fields.coin_b.name, false),\n }\n\n return info\n }\n\n static parsePoolLiquiditySnapshot(res: SuiObjectResponse): PoolLiquiditySnapshot {\n const fields = getObjectFields(res)\n const info: PoolLiquiditySnapshot = {\n current_sqrt_price: fields.current_sqrt_price,\n remove_percent: d(fields.remove_percent).div(1000000).toString(),\n snapshots: {\n id: fields.snapshots.fields.id.id,\n size: fields.snapshots.fields.size,\n },\n }\n\n return info\n }\n\n static parsePositionSnapshot(res: SuiObjectResponse): PositionSnapshot {\n const fields = getObjectFields(res)\n const subFields = fields.value.fields.value.fields\n const info: PositionSnapshot = {\n position_id: fields.name,\n liquidity: subFields.liquidity,\n tick_lower_index: asIntN(BigInt(subFields.tick_lower_index.fields.bits)),\n tick_upper_index: asIntN(BigInt(subFields.tick_upper_index.fields.bits)),\n fee_owned_a: subFields.fee_owned_a,\n fee_owned_b: subFields.fee_owned_b,\n value_cut: subFields.value_cut,\n rewards: subFields.rewards,\n }\n\n return info\n }\n}\n","import { DevInspectResults, SuiClient } from '@mysten/sui/client'\nimport type { TransactionObjectArgument } from '@mysten/sui/transactions'\nimport { Transaction } from '@mysten/sui/transactions'\nimport { isValidSuiObjectId, normalizeSuiAddress } from '@mysten/sui/utils'\nimport BN from 'bn.js'\nimport type { BuildCoinResult, DataPage, PaginationArgs, SuiObjectIdType } from '@cetusprotocol/common-sdk'\nimport {\n asUintN,\n ClmmPoolUtil,\n CLOCK_ADDRESS,\n CoinAssist,\n d,\n DETAILS_KEYS,\n extractStructTagFromType,\n getObjectFields,\n getPackagerConfigs,\n IModule,\n FullClient,\n TickMath,\n TickUtil,\n createFullClient,\n deriveDynamicFieldIdByType,\n} from '@cetusprotocol/common-sdk'\nimport Decimal from 'decimal.js'\nimport { handleError, handleMessageError, PoolErrorCode, PositionErrorCode } from '../errors/errors'\nimport type { CetusClmmSDK } from '../sdk'\nimport type {\n AddLiquidityFixTokenParams,\n AddLiquidityParams,\n AddLiquidityWithPriceRangeParams,\n CalculateAddLiquidityFixCoinWithPriceParams,\n CalculateAddLiquidityResult,\n CalculateAddLiquidityWithPriceParams,\n ClosePositionParams,\n CollectFeeParams,\n CollectFeesQuote,\n FetchPosFeeParams,\n GetPositionInfoListParams,\n OpenPositionParams,\n OpenPositionWithPriceParams,\n Position,\n PositionInfo,\n PositionTransactionInfo,\n RemoveLiquidityParams,\n} from '../types'\nimport { ClmmFetcherModule, ClmmIntegratePoolModule, ClmmIntegratePoolV2Module, ClmmIntegratePoolV3Module } from '../types/sui'\nimport { buildPosition, buildPositionInfo, buildPositionTransactionInfo } from '../utils'\nimport { findAdjustCoin, PositionUtils } from '../utils/positionUtils'\n/**\n * Helper class to help interact with clmm position with a position router interface.\n */\nexport class PositionModule implements IModule<CetusClmmSDK> {\n protected _sdk: CetusClmmSDK\n\n constructor(sdk: CetusClmmSDK) {\n this._sdk = sdk\n }\n\n get sdk() {\n return this._sdk\n }\n\n /**\n * Builds the full address of the Position type.\n * @returns The full address of the Position type.\n */\n buildPositionType() {\n const cetusClmm = this._sdk.sdkOptions.clmm_pool.package_id\n return `${cetusClmm}::position::Position`\n }\n\n /**\n * Gets a list of position transaction information for the given position ID.\n * @param {Object} params - The parameters for the position transaction list.\n * @param {string} params.pos_id - The ID of the position to get transactions for.\n * @param {PaginationArgs} [params.pagination_args] - The pagination arguments for the transaction list.\n * @param {string} [params.order] - The order of the transaction list.\n * @param {string} [params.full_rpc_url] - The full RPC URL for the transaction list.\n * @param {string} [params.origin_pos_id] - The origin position ID for the transaction list.\n * @returns {Promise<DataPage<PositionTransactionInfo>>} A promise that resolves to a DataPage object containing the position transaction information.\n */\n async getPositionTransactionList({\n pos_id,\n origin_pos_id,\n full_rpc_url,\n pagination_args = 'all',\n order = 'ascending',\n }: {\n pos_id: string\n origin_pos_id?: string\n full_rpc_url?: string\n pagination_args?: PaginationArgs\n order?: 'ascending' | 'descending' | null | undefined\n }): Promise<DataPage<PositionTransactionInfo>> {\n const { FullClient: fullClient } = this._sdk\n const filterIds: string[] = [pos_id]\n if (origin_pos_id) {\n filterIds.push(origin_pos_id)\n }\n let client\n if (full_rpc_url) {\n client = createFullClient(new SuiClient({ url: full_rpc_url }))\n } else {\n client = fullClient\n }\n const data: DataPage<PositionTransactionInfo> = {\n data: [],\n has_next_page: false,\n }\n try {\n const res = await client.queryTransactionBlocksByPage({ ChangedObject: pos_id }, pagination_args, order)\n\n res.data.forEach((item, index) => {\n const dataList = buildPositionTransactionInfo(item, index, filterIds)\n data.data = [...data.data, ...dataList]\n })\n data.has_next_page = res.has_next_page\n data.next_cursor = res.next_cursor\n return data\n } catch (error) {\n handleError(PoolErrorCode.FetchError, error as Error, {\n [DETAILS_KEYS.METHOD_NAME]: 'getPositionTransactionList',\n })\n }\n\n return data\n }\n\n /**\n * Gets a list of positions for the given account address.\n * @param account_address The account address to get positions for.\n * @param assign_pool_ids An array of pool ID to filter the positions by.\n * @returns array of Position objects.\n */\n async getPositionList(account_address: string, assign_pool_ids: string[] = [], show_display = true): Promise<Position[]> {\n const all_position: Position[] = []\n\n const owner_res: any = await this._sdk.FullClient.getOwnedObjectsByPage(account_address, {\n options: { showType: true, showContent: true, showDisplay: show_display, showOwner: true },\n filter: { Package: this._sdk.sdkOptions.clmm_pool.package_id },\n })\n\n const has_assign_pool_ids = assign_pool_ids.length > 0\n for (const item of owner_res.data as any[]) {\n const type = extractStructTagFromType(item.data.type)\n\n if (type.full_address === this.buildPositionType()) {\n const position = buildPosition(item)\n const cache_key = `${position.pos_object_id}_getPositionList`\n this._sdk.updateCache(cache_key, position)\n if (has_assign_pool_ids) {\n if (assign_pool_ids.includes(position.pool)) {\n all_position.push(position)\n }\n } else {\n all_position.push(position)\n }\n }\n }\n\n return all_position\n }\n\n /**\n * Gets a position by its handle and ID. But it needs pool info, so it is not recommended to use this method.\n * if you want to get a position, you can use getPositionById method directly.\n * @param {string} position_handle The handle of the position to get.\n * @param {string} position_id The ID of the position to get.\n * @param {boolean} calculate_rewarder Whether to calculate the rewarder of the position.\n * @returns {Promise<Position>} Position object.\n */\n async getPosition(position_handle: string, position_id: string, calculate_rewarder = true, show_display = true): Promise<Position> {\n let position = await this.getSimplePosition(position_id, show_display)\n if (calculate_rewarder) {\n position = await this.updatePositionInfo(position_handle, position)\n }\n return position\n }\n\n /**\n * Gets a position by its ID.\n * @param {string} position_id The ID of the position to get.\n * @param {boolean} calculate_rewarder Whether to calculate the rewarder of the position.\n * @param {boolean} show_display When some testnet rpc nodes can't return object's display data, you can set this option to false to avoid returning errors. Default is true.\n * @returns {Promise<Position>} Position object.\n */\n async getPositionById(position_id: string, calculate_rewarder = true, show_display = true): Promise<Position> {\n const position = await this.getSimplePosition(position_id, show_display)\n if (calculate_rewarder) {\n const pool = await this._sdk.Pool.getPool(position.pool, false)\n const result = await this.updatePositionInfo(pool.position_manager.positions_handle, position)\n return result\n }\n return position\n }\n\n /**\n * Gets a simple position for the given position ID.\n * @param {string} position_id The ID of the position to get.\n * @returns {Promise<Position>} Position object.\n */\n async getSimplePosition(position_id: string, show_display = true): Promise<Position> {\n const cache_key = `${position_id}_getPositionList`\n\n let position = this.getSimplePositionByCache(position_id)\n\n if (position === undefined) {\n const object_data_responses = await this.sdk.FullClient.getObject({\n id: position_id,\n options: { showContent: true, showType: true, showDisplay: show_display, showOwner: true },\n })\n position = buildPosition(object_data_responses)\n\n this._sdk.updateCache(cache_key, position)\n }\n return position\n }\n\n /**\n * Gets a simple position for the given position ID.\n * @param {string} position_id Position object id\n * @returns {Position | undefined} Position object\n */\n private getSimplePositionByCache(position_id: string): Position | undefined {\n const cache_key = `${position_id}_getPositionList`\n return this._sdk.getCache<Position>(cache_key)\n }\n\n /**\n * Gets a list of simple positions for the given position ID.\n * @param {SuiObjectIdType[]} position_ids The IDs of the positions to get.\n * @returns {Promise<Position[]>} A promise that resolves to an array of Position objects.\n */\n async getSimplePositionList(position_ids: SuiObjectIdType[], show_display = true): Promise<Position[]> {\n const position_list: Position[] = []\n const not_found_ids: SuiObjectIdType[] = []\n\n position_ids.forEach((id) => {\n const position = this.getSimplePositionByCache(id)\n if (position) {\n position_list.push(position)\n } else {\n not_found_ids.push(id)\n }\n })\n\n if (not_found_ids.length > 0) {\n const object_data_responses = await this._sdk.FullClient.batchGetObjects(not_found_ids, {\n showOwner: true,\n showContent: true,\n showDisplay: show_display,\n showType: true,\n })\n\n object_data_responses.forEach((info) => {\n if (info.error == null) {\n const position = buildPosition(info)\n position_list.push(position)\n const cache_key = `${position.pos_object_id}_getPositionList`\n this._sdk.updateCache(cache_key, position)\n }\n })\n }\n\n return position_list\n }\n\n /**\n * Updates the position info\n * @param {string} position_handle Position handle\n * @param {Position} position Position object\n * @returns {Promise<Position>} A promise that resolves to an array of Position objects.\n */\n public async updatePositionInfo(position_handle: string, position: Position): Promise<Position> {\n const position_reward = await this.getPositionInfo(position_handle, position.pos_object_id)\n return {\n ...position,\n ...position_reward,\n }\n }\n\n /**\n * Gets the position info for the given position handle and position object ID.\n * @param {string} position_handle The handle of the position.\n * @param {string} position_id The ID of the position object.\n * @returns {Promise<PositionInfo>} PositionInfo object.\n */\n async getPositionInfo(position_handle: string, position_id: string): Promise<PositionInfo> {\n try {\n const dynamic_field_object = await this._sdk.FullClient.getDynamicFieldObject({\n parentId: position_handle,\n name: {\n type: '0x2::object::ID',\n value: position_id,\n },\n })\n\n const object_fields = getObjectFields(dynamic_field_object.data as any) as any\n const fields = object_fields.value.fields.value\n const position_info = buildPositionInfo(fields)\n return position_info\n } catch (error) {\n return handleError(PositionErrorCode.FetchError, error as Error, {\n [DETAILS_KEYS.METHOD_NAME]: 'getPositionInfo',\n [DETAILS_KEYS.REQUEST_PARAMS]: {\n position_handle,\n position_id,\n },\n })\n }\n }\n\n async getPositionInfoList(options: GetPositionInfoListParams[]): Promise<PositionInfo[]> {\n try {\n const position_info_list: PositionInfo[] = []\n const warpIds: string[] = []\n options.forEach(async (option) => {\n const { position_handle, position_ids } = option\n position_ids.forEach((value) => {\n const dynamic_field_id = deriveDynamicFieldIdByType(position_handle, value, '0x2::object::ID', 'address')\n warpIds.push(dynamic_field_id)\n })\n })\n\n if (warpIds.length === 0) {\n return []\n }\n const res = await this._sdk.FullClient.batchGetObjects(warpIds, {\n showContent: true,\n showType: true,\n showOwner: true,\n })\n\n res.forEach((item) => {\n try {\n const object_fields = getObjectFields(item.data as any) as any\n const fields = object_fields.value.fields.value\n const position_info = buildPositionInfo(fields)\n position_info_list.push(position_info)\n } catch (error) {\n console.log('getPositionInfoList error', error)\n }\n })\n return position_info_list\n } catch (error) {\n return handleError(PositionErrorCode.FetchError, error as Error, {\n [DETAILS_KEYS.METHOD_NAME]: 'getPositionInfoList',\n [DETAILS_KEYS.REQUEST_PARAMS]: {\n options,\n },\n })\n }\n }\n\n public buildFetchPosFee(params: FetchPosFeeParams, tx: Transaction) {\n const { clmm_pool, integrate } = this.sdk.sdkOptions\n const typeArguments = [params.coin_type_a, params.coin_type_b]\n const args = [tx.object(getPackagerConfigs(clmm_pool).global_config_id), tx.object(params.pool_id), tx.pure.address(params.position_id)]\n tx.moveCall({\n target: `${integrate.published_at}::${ClmmFetcherModule}::fetch_position_fees`,\n arguments: args,\n typeArguments,\n })\n }\n\n parsedPosFeeData(simulate_res: DevInspectResults) {\n const feeData: Record<string, { position_id: string; fee_owned_a: string; fee_owned_b: string }> = {}\n const feeValueData: any[] = simulate_res.events?.filter((item: any) => {\n return item.type.includes('fetcher_script::FetchPositionFeesEvent')\n })\n\n for (let i = 0; i < feeValueData.length; i += 1) {\n const { parsedJson } = feeValueData[i]\n const posObj = {\n position_id: parsedJson.position_id,\n fee_owned_a: parsedJson.fee_owned_a,\n fee_owned_b: parsedJson.fee_owned_b,\n }\n feeData[parsedJson.position_id] = posObj\n }\n\n return feeData\n }\n\n /**\n * Fetches the Position fee amount for a given list of addresses.\n * @param {FetchPosFeeParams[]} params An array of FetchPosFeeParams objects containing the target addresses and their corresponding amounts.\n * @returns {Promise<CollectFeesQuote[]>} A Promise that resolves with the fetched position fee amount for the specified addresses.\n */\n public async fetchPosFeeAmount(params: FetchPosFeeParams[]): Promise<CollectFeesQuote[]> {\n const { clmm_pool, integrate } = this.sdk.sdkOptions\n const tx = new Transaction()\n\n for (const paramItem of params) {\n this.buildFetchPosFee(paramItem, tx)\n }\n\n const simulateRes = await this.sdk.FullClient.devInspectTransactionBlock({\n transactionBlock: tx,\n sender: normalizeSuiAddress('0x0'),\n })\n\n if (simulateRes.error != null) {\n handleMessageError(\n PoolErrorCode.InvalidPoolObject,\n `fetch position fee error code: ${simulateRes.error ?? 'unknown error'}, please check config and position and pool object ids`,\n {\n [DETAILS_KEYS.METHOD_NAME]: 'fetchPosFeeAmount',\n }\n )\n }\n\n const result: CollectFeesQuote[] = []\n const parsedPosFeeData = this.parsedPosFeeData(simulateRes)\n for (let i = 0; i < params.length; i += 1) {\n const posFeeData = parsedPosFeeData[params[i].position_id]\n if (posFeeData) {\n const posFeeResult: CollectFeesQuote = {\n fee_owned_a: posFeeData.fee_owned_a,\n fee_owned_b: posFeeData.fee_owned_b,\n position_id: params[i].position_id,\n }\n result.push(posFeeResult)\n }\n }\n\n return result\n }\n\n /**\n * Fetches the Position fee amount for a given list of addresses.\n * @param position_ids An array of position object id.\n * @returns {Promise<Record<string, CollectFeesQuote>>} A Promise that resolves with the fetched position fee amount for the specified position object ids.\n */\n async batchFetchPositionFees(position_ids: string[]): Promise<Record<string, CollectFeesQuote>> {\n const pos_fee_params_list: FetchPosFeeParams[] = []\n for (const id of position_ids) {\n const position = await this._sdk.Position.getPositionById(id, false)\n const pool = await this._sdk.Pool.getPool(position.pool, false)\n pos_fee_params_list.push({\n pool_id: pool.id,\n position_id: position.pos_object_id,\n coin_type_a: pool.coin_type_a,\n coin_type_b: pool.coin_type_b,\n })\n }\n\n const positionMap: Record<string, CollectFeesQuote> = {}\n\n if (pos_fee_params_list.length > 0) {\n const result: CollectFeesQuote[] = await this.fetchPosFeeAmount(pos_fee_params_list)\n for (const pos_rewarder_info of result) {\n positionMap[pos_rewarder_info.position_id] = pos_rewarder_info\n }\n return positionMap\n }\n return positionMap\n }\n\n /**\n * create add liquidity transaction payload with fix token\n * @param {AddLiquidityFixTokenParams} params\n * @param gas_estimate_arg : When the fix input amount is SUI, gasEstimateArg can control whether to recalculate the number of SUI to prevent insufficient gas.\n * If this parameter is not passed, gas estimation is not performed\n * @returns {Promise<TransactionBlock>}\n */\n async createAddLiquidityFixTokenPayload(\n params: AddLiquidityFixTokenParams,\n gas_estimate_arg?: {\n slippage: number\n cur_sqrt_price: BN\n },\n tx?: Transaction,\n input_coin_a?: TransactionObjectArgument,\n input_coin_b?: TransactionObjectArgument\n ): Promise<Transaction> {\n const all_coin_asset = await this._sdk.FullClient.getOwnerCoinAssets(this.sdk.getSenderAddress())\n\n if (gas_estimate_arg) {\n const { is_adjust_coin_a, is_adjust_coin_b } = findAdjustCoin(params)\n params = params as AddLiquidityFixTokenParams\n if ((params.fix_amount_a && is_adjust_coin_a) || (!params.fix_amount_a && is_adjust_coin_b)) {\n tx = await PositionUtils.buildAddLiquidityFixTokenForGas(\n this._sdk,\n all_coin_asset,\n params,\n gas_estimate_arg,\n tx,\n input_coin_a,\n input_coin_b\n )\n return tx\n }\n }\n\n return PositionUtils.buildAddLiquidityFixToken(this._sdk, all_coin_asset, params, tx, input_coin_a, input_coin_b)\n }\n\n /**\n * create add liquidity transaction payload\n * @param {AddLiquidityParams} params\n * @returns {Promise<TransactionBlock>}\n */\n async createAddLiquidityPayload(\n params: AddLiquidityParams,\n tx?: Transaction,\n input_coin_a?: TransactionObjectArgument,\n input_coin_b?: TransactionObjectArgument\n ): Promise<Transaction> {\n const { integrate, clmm_pool } = this._sdk.sdkOptions\n\n const tick_lower = asUintN(BigInt(params.tick_lower)).toString()\n const tick_upper = asUintN(BigInt(params.tick_upper)).toString()\n\n const typeArguments = [params.coin_type_a, params.coin_type_b]\n\n tx = tx || new Transaction()\n\n const needOpenPosition = !isValidSuiObjectId(params.pos_id)\n const max_amount_a = BigInt(params.max_amount_a)\n const max_amount_b = BigInt(params.max_amount_b)\n\n let primary_coin_a_inputs: BuildCoinResult\n let primary_coin_b_inputs: BuildCoinResult\n if (input_coin_a == null || input_coin_b == null) {\n const all_coin_asset = await this._sdk.FullClient.getOwnerCoinAssets(this.sdk.getSenderAddress())\n primary_coin_a_inputs = CoinAssist.buildCoinForAmount(tx, all_coin_asset, max_amount_a, params.coin_type_a, false, true)\n primary_coin_b_inputs = CoinAssist.buildCoinForAmount(tx, all_coin_asset, max_amount_b, params.coin_type_b, false, true)\n } else {\n primary_coin_a_inputs = {\n target_coin: input_coin_a,\n remain_coins: [],\n is_mint_zero_coin: false,\n target_coin_amount: '0',\n selected_coins: [],\n }\n primary_coin_b_inputs = {\n target_coin: input_coin_b,\n remain_coins: [],\n is_mint_zero_coin: false,\n target_coin_amount: '0',\n selected_coins: [],\n }\n }\n\n if (needOpenPosition) {\n tx.moveCall({\n target: `${integrate.published_at}::${ClmmIntegratePoolV2Module}::open_position_with_liquidity`,\n typeArguments,\n arguments: [\n tx.object(getPackagerConfigs(clmm_pool).global_config_id),\n tx.object(params.pool_id),\n tx.pure.u32(Number(tick_lower)),\n tx.pure.u32(Number(tick_upper)),\n primary_coin_a_inputs.target_coin,\n primary_coin_b_inputs.target_coin,\n tx.pure.u64(params.max_amount_a),\n tx.pure.u64(params.max_amount_b),\n tx.pure.u128(params.delta_liquidity),\n tx.object(CLOCK_ADDRESS),\n ],\n })\n } else {\n const all_coin_asset = await this._sdk.FullClient.getOwnerCoinAssets(this._sdk.getSenderAddress())\n tx = PositionUtils.createCollectRewarderAndFeeParams(\n this._sdk,\n tx,\n params,\n all_coin_asset,\n primary_coin_a_inputs.remain_coins,\n primary_coin_b_inputs.remain_coins\n )\n tx.moveCall({\n target: `${integrate.published_at}::${ClmmIntegratePoolV2Module}::add_liquidity`,\n typeArguments,\n arguments: [\n tx.object(getPackagerConfigs(clmm_pool).global_config_id),\n tx.object(params.pool_id),\n tx.object(params.pos_id),\n primary_coin_a_inputs.target_coin,\n primary_coin_b_inputs.target_coin,\n tx.pure.u64(params.max_amount_a),\n tx.pure.u64(params.max_amount_b),\n tx.pure.u128(params.delta_liquidity),\n tx.object(CLOCK_ADDRESS),\n ],\n })\n }\n return tx\n }\n\n /**\n * Remove liquidity from a position.\n * @param {RemoveLiquidityParams} params\n * @returns {TransactionBlock}\n */\n async removeLiquidityPayload(params: RemoveLiquidityParams, tx?: Transaction): Promise<Transaction> {\n const { clmm_pool, integrate } = this.sdk.sdkOptions\n\n const functionName = 'remove_liquidity'\n\n tx = tx || new Transaction()\n\n const typeArguments = [params.coin_type_a, params.coin_type_b]\n\n const allCoinAsset = await this._sdk.FullClient.getOwnerCoinAssets(this.sdk.getSenderAddress())\n\n tx = PositionUtils.createCollectRewarderAndFeeParams(this._sdk, tx, params, allCoinAsset)\n\n const args = [\n tx.object(getPackagerConfigs(clmm_pool).global_config_id),\n tx.object(params.pool_id),\n tx.object(params.pos_id),\n tx.pure.u128(params.delta_liquidity),\n tx.pure.u64(params.min_amount_a),\n tx.pure.u64(params.min_amount_b),\n tx.object(CLOCK_ADDRESS),\n ]\n\n tx.moveCall({\n target: `${integrate.published_at}::${ClmmIntegratePoolModule}::${functionName}`,\n typeArguments,\n arguments: args,\n })\n\n return tx\n }\n\n /**\n * Close position and remove all liquidity and collect_reward\n * @param {ClosePositionParams} params\n * @returns {TransactionBlock}\n */\n async closePositionPayload(params: ClosePositionParams, tx?: Transaction): Promise<Transaction> {\n const { clmm_pool, integrate } = this.sdk.sdkOptions\n\n tx = tx || new Transaction()\n\n const typeArguments = [params.coin_type_a, params.coin_type_b]\n\n const allCoinAsset = await this._sdk.FullClient.getOwnerCoinAssets(this.sdk.getSenderAddress())\n\n tx = PositionUtils.createCollectRewarderAndFeeParams(this._sdk, tx, params, allCoinAsset)\n\n tx.moveCall({\n target: `${integrate.published_at}::${ClmmIntegratePoolModule}::close_position`,\n typeArguments,\n arguments: [\n tx.object(getPackagerConfigs(clmm_pool).global_config_id),\n tx.object(params.pool_id),\n tx.object(params.pos_id),\n tx.pure.u64(params.min_amount_a),\n tx.pure.u64(params.min_amount_b),\n tx.object(CLOCK_ADDRESS),\n ],\n })\n\n return tx\n }\n\n /**\n * Open position in clmmpool.\n * @param {OpenPositionParams} params\n * @returns {TransactionBlock}\n */\n openPositionPayload(params: OpenPositionParams, tx?: Transaction): Transaction {\n const { clmm_pool, integrate } = this.sdk.sdkOptions\n tx = tx || new Transaction()\n\n const typeArguments = [params.coin_type_a, params.coin_type_b]\n const tick_lower = asUintN(BigInt(params.tick_lower)).toString()\n const tick_upper = asUintN(BigInt(params.tick_upper)).toString()\n const args = [\n tx.object(getPackagerConfigs(clmm_pool).global_config_id),\n tx.object(params.pool_id),\n tx.pure.u32(Number(tick_lower)),\n tx.pure.u32(Number(tick_upper)),\n ]\n\n tx.moveCall({\n target: `${integrate.published_at}::${ClmmIntegratePoolModule}::open_position`,\n typeArguments,\n arguments: args,\n })\n\n return tx\n }\n\n /**\n * Open position with price range in clmmpool.\n * @param {OpenPositionWithPriceParams} params\n * @returns {TransactionBlock}\n */\n async openPositionWithPricePayload(params: OpenPositionWithPriceParams, tx?: Transaction): Promise<Transaction> {\n const { pool_id } = params\n const { clmm_pool, integrate } = this.sdk.sdkOptions\n tx = tx || new Transaction()\n\n const pool = await this.sdk.Pool.getPool(pool_id, false)\n const tick_spacing = Number(pool.tick_spacing)\n\n let tick_lower = 0\n let tick_upper = 0\n\n if (params.is_full_range) {\n tick_lower = TickUtil.getMinIndex(tick_spacing)\n tick_upper = TickUtil.getMaxIndex(tick_spacing)\n } else {\n const { price_base_coin, min_price, max_price } = params\n tick_lower = TickMath.priceToInitializeTickIndex(\n price_base_coin === 'coin_a' ? d(min_price) : d(1).div(max_price),\n params.coin_decimals_a,\n params.coin_decimals_b,\n tick_spacing\n )\n tick_upper = TickMath.priceToInitializeTickIndex(\n price_base_coin === 'coin_a' ? d(max_price) : d(1).div(min_price),\n params.coin_decimals_a,\n params.coin_decimals_b,\n tick_spacing\n )\n }\n\n const typeArguments = [pool.coin_type_a, pool.coin_type_b]\n const args = [\n tx.object(getPackagerConfigs(clmm_pool).global_config_id),\n tx.object(params.pool_id),\n tx.pure.u32(Number(asUintN(BigInt(tick_lower)))),\n tx.pure.u32(Number(asUintN(BigInt(tick_upper)))),\n ]\n\n tx.moveCall({\n target: `${integrate.published_at}::${ClmmIntegratePoolModule}::open_position`,\n typeArguments,\n arguments: args,\n })\n\n return tx\n }\n\n /**\n * Collect LP fee from Position.\n * @param {CollectFeeParams} params\n * @param {TransactionBlock} tx\n * @returns {TransactionBlock}\n */\n async collectFeePayload(\n params: CollectFeeParams,\n tx?: Transaction,\n input_coin_a?: TransactionObjectArgument,\n input_coin_b?: TransactionObjectArgument\n ): Promise<Transaction> {\n tx = tx || new Transaction()\n\n const coin_a = input_coin_a || CoinAssist.buildCoinWithBalance(BigInt(0), params.coin_type_a, tx)\n const coin_b = input_coin_b || CoinAssist.buildCoinWithBalance(BigInt(0), params.coin_type_b, tx)\n\n this.createCollectFeePayload(params, tx, coin_a, coin_b)\n return tx\n }\n\n createCollectFeePayload(\n params: CollectFeeParams,\n tx: Transaction,\n primary_coin_a_input: TransactionObjectArgument,\n primary_coin_b_input: TransactionObjectArgument\n ) {\n const { clmm_pool, integrate } = this.sdk.sdkOptions\n const typeArguments = [params.coin_type_a, params.coin_type_b]\n const args = [\n tx.object(getPackagerConfigs(clmm_pool).global_config_id),\n tx.object(params.pool_id),\n tx.object(params.pos_id),\n primary_coin_a_input,\n primary_coin_b_input,\n ]\n\n tx.moveCall({\n target: `${integrate.published_at}::${ClmmIntegratePoolV2Module}::collect_fee`,\n typeArguments,\n arguments: args,\n })\n return tx\n }\n\n /**\n * Calculate the result of add liquidity with price.\n * @param {CalculateAddLiquidityWithPriceParams} params\n * @returns {Promise<CalculateAddLiquidityResult>}\n */\n async calculateAddLiquidityResultWithPrice(\n params: CalculateAddLiquidityWithPriceParams | CalculateAddLiquidityFixCoinWithPriceParams\n ): Promise<CalculateAddLiquidityResult> {\n const { pool_id, slippage, refresh_pool_price, add_mode_params } = params\n\n const pool = await this.sdk.Pool.getPool(pool_id, refresh_pool_price)\n const tick_spacing = Number(pool.tick_spacing)\n\n let tick_lower = 0\n let tick_upper = 0\n\n if (add_mode_params.is_full_range) {\n tick_lower = TickUtil.getMinIndex(tick_spacing)\n tick_upper = TickUtil.getMaxIndex(tick_spacing)\n } else {\n const { price_base_coin, min_price, max_price } = add_mode_params\n tick_lower = TickMath.priceToInitializeTickIndex(\n price_base_coin === 'coin_a' ? d(min_price) : d(1).div(max_price),\n add_mode_params.coin_decimals_a,\n add_mode_params.coin_decimals_b,\n tick_spacing\n )\n tick_upper = TickMath.priceToInitializeTickIndex(\n price_base_coin === 'coin_a' ? d(max_price) : d(1).div(min_price),\n add_mode_params.coin_decimals_a,\n add_mode_params.coin_decimals_b,\n tick_spacing\n )\n }\n\n if ('liquidity' in params) {\n const { liquidity } = params\n\n const lower_sqrt_price = TickMath.tickIndexToSqrtPriceX64(tick_lower)\n const upper_sqrt_price = TickMath.tickIndexToSqrtPriceX64(tick_upper)\n\n const { coin_amount_a, coin_amount_b } = ClmmPoolUtil.getCoinAmountFromLiquidity(\n new BN(liquidity),\n new BN(pool.current_sqrt_price),\n lower_sqrt_price,\n upper_sqrt_price,\n false\n )\n\n const coin_amount_limit_a = d(coin_amount_a)\n .mul(1 + slippage)\n .toFixed(0, Decimal.ROUND_UP)\n\n const coin_amount_limit_b = d(coin_amount_b)\n .mul(1 + slippage)\n .toFixed(0, Decimal.ROUND_UP)\n\n return { coin_amount_a, coin_amount_b, coin_amount_limit_a, coin_amount_limit_b, liquidity, tick_lower, tick_upper }\n }\n\n const { coin_amount, fix_amount_a } = params\n const { coin_amount_limit_a, coin_amount_limit_b, liquidity_amount, coin_amount_a, coin_amount_b } =\n ClmmPoolUtil.estLiquidityAndCoinAmountFromOneAmounts(\n tick_lower,\n tick_upper,\n new BN(coin_amount),\n fix_amount_a,\n true,\n slippage,\n new BN(pool.current_sqrt_price)\n )\n\n return {\n coin_amount_a,\n coin_amount_b,\n coin_amount_limit_a,\n coin_amount_limit_b,\n liquidity: liquidity_amount,\n tick_lower,\n tick_upper,\n fix_amount_a,\n }\n }\n\n /**\n * Add liquidity with price range.\n * @param {AddLiquidityWithPriceRangeParams} params\n * @param {TransactionBlock} tx\n * @returns {TransactionBlock}\n */\n async addLiquidityWithPricePayload(\n params: AddLiquidityWithPriceRangeParams,\n tx?: Transaction,\n input_coin_a?: TransactionObjectArgument,\n input_coin_b?: TransactionObjectArgument\n ): Promise<Transaction> {\n const { pool_id, calculate_result } = params\n const { coin_amount_limit_a, coin_amount_limit_b, liquidity, tick_lower, tick_upper } = calculate_result\n tx = tx || new Transaction()\n const pool = await this.sdk.Pool.getPool(pool_id, false)\n\n await this.createAddLiquidityPayload(\n {\n delta_liquidity: liquidity,\n max_amount_a: coin_amount_limit_a,\n max_amount_b: coin_amount_limit_b,\n tick_lower: tick_lower,\n tick_upper: tick_upper,\n collect_fee: false,\n rewarder_coin_types: [],\n coin_type_a: pool.coin_type_a,\n coin_type_b: pool.coin_type_b,\n pool_id: pool_id,\n pos_id: '',\n },\n tx,\n input_coin_a,\n input_coin_b\n )\n\n return tx\n }\n\n /**\n * Add liquidity with price range.\n * @param {AddLiquidityWithPriceRangeParams} params\n * @param {TransactionBlock} tx\n * @returns {TransactionBlock}\n */\n async createAddLiquidityFixCoinWithPricePayload(\n params: AddLiquidityWithPriceRangeParams,\n tx?: Transaction,\n input_coin_a?: TransactionObjectArgument,\n input_coin_b?: TransactionObjectArgument\n ): Promise<Transaction> {\n const { pool_id, calculate_result } = params\n const { coin_amount_limit_a, coin_amount_limit_b, liquidity, tick_lower, tick_upper, fix_amount_a, coin_amount_a, coin_amount_b } =\n calculate_result\n if (fix_amount_a === undefined) {\n throw handleMessageError(PositionErrorCode.InvalidParams, 'fix_amount_a is undefined', {\n [DETAILS_KEYS.METHOD_NAME]: 'addLiquidityFixCoinCoinWithPricePayload',\n [DETAILS_KEYS.REQUEST_PARAMS]: params,\n })\n }\n tx = tx || new Transaction()\n const pool = await this.sdk.Pool.getPool(pool_id, false)\n\n await this.createAddLiquidityFixTokenPayload(\n {\n amount_a: fix_amount_a ? coin_amount_a : coin_amount_limit_a,\n amount_b: fix_amount_a ? coin_amount_limit_b : coin_amount_b,\n slippage: 0,\n fix_amount_a,\n is_open: true,\n tick_lower: tick_lower,\n tick_upper: tick_upper,\n collect_fee: false,\n rewarder_coin_types: [],\n coin_type_a: pool.coin_type_a,\n coin_type_b: pool.coin_type_b,\n pool_id: pool_id,\n pos_id: '',\n },\n undefined,\n tx,\n input_coin_a,\n input_coin_b\n )\n\n return tx\n }\n\n createCollectFeeNoSendPayload(\n params: CollectFeeParams,\n tx: Transaction,\n primary_coin_a_input: TransactionObjectArgument,\n primary_coin_b_input: TransactionObjectArgument\n ) {\n const { clmm_pool, integrate } = this.sdk.sdkOptions\n const typeArguments = [params.coin_type_a, params.coin_type_b]\n const args = [\n tx.object(getPackagerConfigs(clmm_pool).global_config_id),\n tx.object(params.pool_id),\n tx.object(params.pos_id),\n primary_coin_a_input,\n primary_coin_b_input,\n ]\n\n tx.moveCall({\n target: `${integrate.published_at}::${ClmmIntegratePoolV3Module}::collect_fee`,\n typeArguments,\n arguments: args,\n })\n return tx\n }\n}\n","import { DevInspectResults } from '@mysten/sui/client'\nimport { Transaction, TransactionArgument, TransactionObjectArgument } from '@mysten/sui/transactions'\nimport { normalizeSuiAddress } from '@mysten/sui/utils'\nimport BN from 'bn.js'\nimport {\n BuildCoinResult,\n CLOCK_ADDRESS,\n CoinAssist,\n DETAILS_KEYS,\n getPackagerConfigs,\n IModule,\n MathUtil,\n normalizeCoinType,\n ZERO,\n} from '@cetusprotocol/common-sdk'\nimport { ConfigErrorCode, handleMessageError } from '../errors/errors'\nimport { CetusClmmSDK } from '../sdk'\nimport {\n CollectFeesQuote,\n CollectRewarderParams,\n FetchPosFeeParams,\n FetchPosRewardParams,\n Pool,\n Position,\n PosRewarderResult,\n RewarderAmountOwned,\n TickData,\n} from '../types'\nimport { ClmmFetcherModule, ClmmIntegratePoolV2Module, ClmmIntegratePoolV3Module } from '../types/sui'\nimport { PositionUtils } from '../utils/positionUtils'\nimport { buildTransferCoin } from '../utils/common'\n\n/**\n * Helper class to help interact with clmm position rewaeder with a rewaeder router interface.\n */\nexport class RewarderModule implements IModule<CetusClmmSDK> {\n protected _sdk: CetusClmmSDK\n\n private growthGlobal: BN[]\n\n constructor(sdk: CetusClmmSDK) {\n this._sdk = sdk\n this.growthGlobal = [ZERO, ZERO, ZERO]\n }\n\n get sdk() {\n return this._sdk\n }\n\n /**\n * Gets the emissions for the given pool every day.\n *\n * @param {string} pool_id The object ID of the pool.\n * @returns {Promise<Array<{emissions: number, coinAddress: string}>>} A promise that resolves to an array of objects with the emissions and coin address for each rewarder.\n */\n async emissionsEveryDay(pool_id: string) {\n const currentPool: Pool = await this.sdk.Pool.getPool(pool_id)\n const rewarderInfos = currentPool.rewarder_infos\n if (!rewarderInfos) {\n return null\n }\n\n const emissionsEveryDay = []\n for (const rewarderInfo of rewarderInfos) {\n const emissionSeconds = MathUtil.fromX64(new BN(rewarderInfo.emissions_per_second))\n emissionsEveryDay.push({\n emissions: Math.floor(emissionSeconds.toNumber() * 60 * 60 * 24),\n coin_type: rewarderInfo.coin_type,\n })\n }\n\n return emissionsEveryDay\n }\n\n /**\n * Fetches the Position reward amount for a given list of addresses.\n * @param {string[]}position_ids An array of position object id.\n * @returns {Promise<Record<string, RewarderAmountOwned[]>>} A Promise that resolves with the fetched position reward amount for the specified position object ids.\n */\n async batchFetchPositionRewarders(position_ids: string[]): Promise<Record<string, RewarderAmountOwned[]>> {\n const posRewardParamsList: FetchPosRewardParams[] = []\n for (const id of position_ids) {\n const position = await this._sdk.Position.getPositionById(id, false)\n const pool = await this._sdk.Pool.getPool(position.pool, false)\n posRewardParamsList.push({\n pool_id: pool.id,\n position_id: position.pos_object_id,\n coin_type_a: pool.coin_type_a,\n coin_type_b: pool.coin_type_b,\n rewarder_types: pool.rewarder_infos.map((rewarder) => rewarder.coin_type),\n })\n }\n\n const positionMap: Record<string, RewarderAmountOwned[]> = {}\n\n if (posRewardParamsList.length > 0) {\n const result: PosRewarderResult[] = await this.fetchPosRewardersAmount(posRewardParamsList)\n for (const posRewarderInfo of result) {\n positionMap[posRewarderInfo.position_id] = posRewarderInfo.rewarder_amounts\n }\n return positionMap\n }\n return positionMap\n }\n\n /**\n * Fetch the position rewards for a given pool.\n * @param {Pool}pool Pool object\n * @param {string}position_id Position object id\n * @returns {Promise<RewarderAmountOwned[]>} A Promise that resolves with the fetched position reward amount for the specified position object id.\n */\n async fetchPositionRewarders(pool: Pool, position_id: string): Promise<RewarderAmountOwned[]> {\n const param = {\n pool_id: pool.id,\n position_id: position_id,\n coin_type_a: pool.coin_type_a,\n coin_type_b: pool.coin_type_b,\n rewarder_types: pool.rewarder_infos.map((rewarder) => rewarder.coin_type),\n }\n\n const result = await this.fetchPosRewardersAmount([param])\n\n return result[0].rewarder_amounts\n }\n\n /**\n * Fetches the Position fee amount for a given list of addresses.\n * @param position_ids An array of position object id.\n * @returns {Promise<Record<string, CollectFeesQuote>>} A Promise that resolves with the fetched position fee amount for the specified position object ids.\n * @deprecated This method is deprecated and may be removed in future versions. Use alternative methods if available.\n */\n async batchFetchPositionFees(position_ids: string[]): Promise<Record<string, CollectFeesQuote>> {\n return await this._sdk.Position.batchFetchPositionFees(position_ids)\n }\n\n /**\n * Fetches the Position fee amount for a given list of addresses.\n * @param params An array of FetchPosFeeParams objects containing the target addresses and their corresponding amounts.\n * @returns\n */\n async fetchPosFeeAmount(params: FetchPosFeeParams[]): Promise<CollectFeesQuote[]> {\n return await this._sdk.Position.fetchPosFeeAmount(params)\n }\n\n public buildFetchPosReward(params: FetchPosRewardParams, tx: Transaction) {\n const { clmm_pool, integrate } = this.sdk.sdkOptions\n const typeArguments = [params.coin_type_a, params.coin_type_b]\n const args = [\n tx.object(getPackagerConfigs(clmm_pool).global_config_id),\n tx.object(params.pool_id),\n tx.pure.address(params.position_id),\n tx.object(CLOCK_ADDRESS),\n ]\n tx.moveCall({\n target: `${integrate.published_at}::${ClmmFetcherModule}::fetch_position_rewards`,\n arguments: args,\n typeArguments,\n })\n }\n\n /**\n * Fetches the Position reward amount for a given list of addresses.\n * @param params An array of FetchPosRewardParams objects containing the target addresses and their corresponding amounts.\n * @returns\n */\n async fetchPosRewardersAmount(params: FetchPosRewardParams[]) {\n const tx = new Transaction()\n\n for (const paramItem of params) {\n this.buildFetchPosReward(paramItem, tx)\n }\n\n const simulateRes = await this.sdk.FullClient.devInspectTransactionBlock({\n transactionBlock: tx,\n sender: normalizeSuiAddress('0x'),\n })\n\n if (simulateRes.error != null) {\n handleMessageError(\n ConfigErrorCode.InvalidConfig,\n `fetch position rewards error code: ${simulateRes.error ?? 'unknown error'}, please check config and params`,\n {\n [DETAILS_KEYS.METHOD_NAME]: 'fetchPosRewardersAmount',\n [DETAILS_KEYS.REQUEST_PARAMS]: { params },\n }\n )\n }\n\n const rewarderData = this.parsedPosRewardData(simulateRes)\n\n const result: PosRewarderResult[] = []\n\n for (let i = 0; i < params.length; i += 1) {\n const rewarder = rewarderData[params[i].position_id]\n if (rewarder) {\n const posRewarderResult: PosRewarderResult = {\n pool_id: params[i].pool_id,\n position_id: params[i].position_id,\n rewarder_amounts: rewarder.rewarder_amount.map((amount: string, index: number) => {\n return {\n amount_owned: amount,\n coin_type: params[i].rewarder_types[index],\n }\n }),\n }\n result.push(posRewarderResult)\n }\n }\n\n return result\n }\n\n parsedPosRewardData(simulate_res: DevInspectResults) {\n const rewarderData: Record<string, { position_id: string; rewarder_amount: string[] }> = {}\n const rewarderValueData: any[] = simulate_res.events?.filter((item: any) => {\n return item.type.includes('fetcher_script::FetchPositionRewardsEvent')\n })\n\n for (let i = 0; i < rewarderValueData.length; i += 1) {\n const { parsedJson } = rewarderValueData[i]\n const posObj = {\n position_id: parsedJson.position_id,\n rewarder_amount: parsedJson.data,\n }\n rewarderData[parsedJson.position_id] = posObj\n }\n\n return rewarderData\n }\n\n /**\n * Fetches the pool reward amount for a given account and pool object id.\n * @param {string} account - The target account.\n * @param {string} pool_object_id - The target pool object id.\n * @returns {Promise<number|null>} - A Promise that resolves with the fetched pool reward amount for the specified account and pool, or null if the fetch is unsuccessful.\n */\n async fetchPoolRewardersAmount(account: string, pool_object_id: string) {\n const pool: Pool = await this.sdk.Pool.getPool(pool_object_id)\n const positions = await this.sdk.Position.getPositionList(account, [pool_object_id])\n\n const params: FetchPosRewardParams[] = []\n\n for (const position of positions) {\n params.push({\n pool_id: pool.id,\n position_id: position.pos_object_id,\n rewarder_types: pool.rewarder_infos.map((rewarder) => rewarder.coin_type),\n coin_type_a: pool.coin_type_a,\n coin_type_b: pool.coin_type_b,\n })\n }\n\n const result = await this.fetchPosRewardersAmount(params)\n\n const rewarderAmount = [ZERO, ZERO, ZERO]\n\n if (result != null) {\n for (const posRewarderInfo of result) {\n for (let j = 0; j < posRewarderInfo.rewarder_amounts.length; j += 1) {\n rewarderAmount[j] = rewarderAmount[j].add(new BN(posRewarderInfo.rewarder_amounts[j].amount_owned))\n }\n }\n }\n return rewarderAmount\n }\n\n private async getPoolLowerAndUpperTicks(ticks_handle: string, positions: Position[]): Promise<TickData[][]> {\n const lower_ticks: TickData[] = []\n const upper_ticks: TickData[] = []\n\n for (const pos of positions) {\n const tick_lower = await this.sdk.Pool.getTickDataByIndex(ticks_handle, pos.tick_lower_index)\n const tick_upper = await this.sdk.Pool.getTickDataByIndex(ticks_handle, pos.tick_upper_index)\n lower_ticks.push(tick_lower!)\n upper_ticks.push(tick_upper!)\n }\n\n return [lower_ticks, upper_ticks]\n }\n\n /**\n * Collect rewards from Position.\n * @param params\n * @returns\n */\n async collectRewarderPayload(params: CollectRewarderParams): Promise<Transaction> {\n const allCoinAsset = await this.sdk.FullClient.getOwnerCoinAssets(this.sdk.getSenderAddress(), null)\n let tx = new Transaction()\n\n tx = PositionUtils.createCollectRewarderAndFeeParams(this._sdk, tx, params, allCoinAsset)\n return tx\n }\n\n /**\n * batch Collect rewards from Position.\n * @param params\n * @param tx\n * @param input_coin_a\n * @param input_coin_b\n * @returns\n */\n async batchCollectRewardsPayload(\n params: CollectRewarderParams[],\n tx?: Transaction,\n input_coin_a?: TransactionObjectArgument,\n input_coin_b?: TransactionObjectArgument\n ) {\n const all_coin_asset = await this.sdk.FullClient.getOwnerCoinAssets(this.sdk.getSenderAddress(), null)\n tx = tx || new Transaction()\n const coin_id_maps: Record<string, BuildCoinResult> = {}\n params.forEach((item) => {\n const coin_type_a = normalizeCoinType(item.coin_type_a)\n const coin_type_b = normalizeCoinType(item.coin_type_b)\n\n if (item.collect_fee) {\n let coin_a_input = coin_id_maps[coin_type_a]\n if (coin_a_input == null) {\n if (input_coin_a == null) {\n coin_a_input = CoinAssist.buildCoinForAmount(tx!, all_coin_asset!, BigInt(0), coin_type_a, false)\n } else {\n coin_a_input = {\n target_coin: input_coin_a,\n remain_coins: [],\n is_mint_zero_coin: false,\n target_coin_amount: '0',\n selected_coins: [],\n }\n }\n\n coin_id_maps[coin_type_a] = coin_a_input\n }\n\n let coin_b_input = coin_id_maps[coin_type_b]\n if (coin_b_input == null) {\n if (input_coin_b == null) {\n coin_b_input = CoinAssist.buildCoinForAmount(tx!, all_coin_asset!, BigInt(0), coin_type_b, false)\n } else {\n coin_b_input = {\n target_coin: input_coin_b,\n remain_coins: [],\n is_mint_zero_coin: false,\n target_coin_amount: '0',\n selected_coins: [],\n }\n }\n\n coin_id_maps[coin_type_b] = coin_b_input\n }\n\n tx = this._sdk.Position.createCollectFeeNoSendPayload(\n {\n pool_id: item.pool_id,\n pos_id: item.pos_id,\n coin_type_a: item.coin_type_a,\n coin_type_b: item.coin_type_b,\n },\n tx!,\n coin_a_input.target_coin,\n coin_b_input.target_coin\n )\n }\n const primaryCoinInputs: TransactionObjectArgument[] = []\n item.rewarder_coin_types.forEach((type) => {\n const coinType = normalizeCoinType(type)\n let coinInput = coin_id_maps[type]\n if (coinInput === undefined) {\n coinInput = CoinAssist.buildCoinForAmount(tx!, all_coin_asset!, BigInt(0), coinType, false)\n coin_id_maps[coinType] = coinInput\n }\n primaryCoinInputs.push(coinInput.target_coin)\n })\n\n tx = this.createCollectRewarderNoSendPayload(item, tx!, primaryCoinInputs)\n })\n\n Object.keys(coin_id_maps).forEach((key) => {\n const value = coin_id_maps[key]\n if (value.is_mint_zero_coin) {\n buildTransferCoin(this.sdk, tx!, value.target_coin, key, this.sdk.getSenderAddress())\n }\n })\n\n return tx\n }\n\n createCollectRewarderPayload(params: CollectRewarderParams, tx: Transaction, primary_coin_inputs: TransactionArgument[]) {\n const { clmm_pool, integrate } = this.sdk.sdkOptions\n const clmm_configs = getPackagerConfigs(clmm_pool)\n const type_arguments = [params.coin_type_a, params.coin_type_b]\n params.rewarder_coin_types.forEach((type, index) => {\n if (tx) {\n tx.moveCall({\n target: `${integrate.published_at}::${ClmmIntegratePoolV2Module}::collect_reward`,\n typeArguments: [...type_arguments, type],\n arguments: [\n tx.object(clmm_configs.global_config_id),\n tx.object(params.pool_id),\n tx.object(params.pos_id),\n tx.object(clmm_configs.global_vault_id),\n primary_coin_inputs[index],\n tx.object(CLOCK_ADDRESS),\n ],\n })\n }\n })\n return tx\n }\n\n createCollectRewarderNoSendPayload(params: CollectRewarderParams, tx: Transaction, primary_coin_inputs: TransactionArgument[]) {\n const { clmm_pool, integrate } = this.sdk.sdkOptions\n const clmm_configs = getPackagerConfigs(clmm_pool)\n const type_arguments = [params.coin_type_a, params.coin_type_b]\n params.rewarder_coin_types.forEach((type, index) => {\n if (tx) {\n tx.moveCall({\n target: `${integrate.published_at}::${ClmmIntegratePoolV3Module}::collect_reward`,\n typeArguments: [...type_arguments, type],\n arguments: [\n tx.object(clmm_configs.global_config_id),\n tx.object(params.pool_id),\n tx.object(params.pos_id),\n tx.object(clmm_configs.global_vault_id),\n primary_coin_inputs[index],\n tx.object(CLOCK_ADDRESS),\n ],\n })\n }\n })\n return tx\n }\n}\n","import { Transaction, TransactionObjectArgument } from '@mysten/sui/transactions'\nimport { normalizeSuiAddress } from '@mysten/sui/utils'\nimport BN from 'bn.js'\nimport { d, DETAILS_KEYS, extractStructTagFromType, IModule, TickMath, U64_MAX, ZERO } from '@cetusprotocol/common-sdk'\nimport Decimal from 'decimal.js'\nimport { ConfigErrorCode, handleMessageError, SwapErrorCode } from '../errors/errors'\nimport { CetusClmmSDK } from '../sdk'\nimport {\n CalculateRatesParams,\n CalculateRatesResult,\n PreSwapParams,\n PreSwapWithMultiPoolParams,\n SwapGasEstimateArg,\n SwapParams,\n TransPreSwapWithMultiPoolParams,\n} from '../types/clmm_type'\nimport { computeSwap, SplitPath, transClmmpoolDataWithoutTicks } from '../types/clmmpool'\nimport { ClmmFetcherModule } from '../types/sui'\nimport { findAdjustCoin } from '../utils/positionUtils'\nimport { SwapUtils } from '../utils/swapUtils'\nexport const AMM_SWAP_MODULE = 'amm_swap'\nexport const POOL_STRUCT = 'Pool'\n\n/**\n * Helper class to help interact with clmm pool swap with a swap router interface.\n */\nexport class SwapModule implements IModule<CetusClmmSDK> {\n protected _sdk: CetusClmmSDK\n\n constructor(sdk: CetusClmmSDK) {\n this._sdk = sdk\n }\n\n get sdk() {\n return this._sdk\n }\n\n calculateSwapFee(paths: SplitPath[]) {\n let fee = d(0)\n paths.forEach((item) => {\n const pathCount = item.base_paths.length\n if (pathCount > 0) {\n const path = item.base_paths[0]\n const fee_rate = path.label === 'Cetus' ? new Decimal(path.fee_rate).div(10 ** 6) : new Decimal(path.fee_rate).div(10 ** 9)\n const feeAmount = d(path.input_amount)\n .div(10 ** path.from_decimal)\n .mul(fee_rate)\n fee = fee.add(feeAmount)\n if (pathCount > 1) {\n const path2 = item.base_paths[1]\n const price1 = path.direction ? path.current_price : new Decimal(1).div(path.current_price)\n const price2 = path2.direction ? path2.current_price : new Decimal(1).div(path2.current_price)\n const feeRate2 = path2.label === 'Cetus' ? new Decimal(path2.fee_rate).div(10 ** 6) : new Decimal(path2.fee_rate).div(10 ** 9)\n\n const feeAmount2 = d(path2.output_amount)\n .div(10 ** path2.to_decimal)\n .mul(feeRate2)\n const fee2 = feeAmount2.div(price1.mul(price2))\n fee = fee.add(fee2)\n }\n }\n })\n\n return fee.toString()\n }\n\n calculateSwapPriceImpact(paths: SplitPath[]) {\n let impactValue = d(0)\n paths.forEach((item) => {\n const pathCount = item.base_paths.length\n if (pathCount === 1) {\n const path = item.base_paths[0]\n const output_amount = d(path.output_amount).div(10 ** path.to_decimal)\n const input_amount = d(path.input_amount).div(10 ** path.from_decimal)\n const rate = output_amount.div(input_amount)\n const cprice = path.direction ? new Decimal(path.current_price) : new Decimal(1).div(path.current_price)\n impactValue = impactValue.add(this.calculateSingleImpact(rate, cprice))\n }\n if (pathCount === 2) {\n const path = item.base_paths[0]\n const path2 = item.base_paths[1]\n const cprice1 = path.direction ? new Decimal(path.current_price) : new Decimal(1).div(path.current_price)\n const cprice2 = path2.direction ? new Decimal(path2.current_price) : new Decimal(1).div(path2.current_price)\n const cprice = cprice1.mul(cprice2)\n const output_amount = new Decimal(path2.output_amount).div(10 ** path2.to_decimal)\n const input_amount = new Decimal(path.input_amount).div(10 ** path.from_decimal)\n const rate = output_amount.div(input_amount)\n impactValue = impactValue.add(this.calculateSingleImpact(rate, cprice))\n }\n })\n\n return impactValue.toString()\n }\n\n private calculateSingleImpact = (rate: Decimal, c_price: Decimal) => {\n // ((cprice - rate)/cprice)*100\n return c_price.minus(rate).div(c_price).mul(100)\n }\n\n /**\n * Performs a pre-swap with multiple pools.\n *\n * @param {PreSwapWithMultiPoolParams} params The parameters for the pre-swap.\n * @returns {Promise<SwapWithMultiPoolData>} A promise that resolves to the swap data.\n */\n async preSwapWithMultiPool(params: PreSwapWithMultiPoolParams) {\n const { integrate } = this.sdk.sdkOptions\n const tx = new Transaction()\n\n const typeArguments = [params.coin_type_a, params.coin_type_b]\n for (let i = 0; i < params.pool_ids.length; i += 1) {\n const args = [tx.object(params.pool_ids[i]), tx.pure.bool(params.a2b), tx.pure.bool(params.by_amount_in), tx.pure.u64(params.amount)]\n tx.moveCall({\n target: `${integrate.published_at}::${ClmmFetcherModule}::calculate_swap_result`,\n arguments: args,\n typeArguments,\n })\n }\n\n const simulateRes = await this.sdk.FullClient.devInspectTransactionBlock({\n transactionBlock: tx,\n sender: normalizeSuiAddress('0x0'),\n })\n if (simulateRes.error != null) {\n handleMessageError(\n ConfigErrorCode.InvalidConfig,\n `pre swap with multi pools error code: ${simulateRes.error ?? 'unknown error'}, please check config and params`,\n {\n [DETAILS_KEYS.METHOD_NAME]: 'preSwapWithMultiPool',\n [DETAILS_KEYS.REQUEST_PARAMS]: {\n params,\n },\n }\n )\n }\n\n const valueData: any = simulateRes.events?.filter((item: any) => {\n return extractStructTagFromType(item.type).name === `CalculatedSwapResultEvent`\n })\n if (valueData.length === 0) {\n return null\n }\n\n if (valueData.length !== params.pool_ids.length) {\n handleMessageError(SwapErrorCode.ParamsLengthNotEqual, 'valueData.length !== params.pools.length', {\n [DETAILS_KEYS.METHOD_NAME]: 'preSwapWithMultiPool',\n [DETAILS_KEYS.REQUEST_PARAMS]: {\n params,\n },\n })\n }\n let tempMaxAmount = params.by_amount_in ? ZERO : U64_MAX\n let tempIndex = 0\n for (let i = 0; i < valueData.length; i += 1) {\n if (valueData[i].parsedJson.data.is_exceed) {\n continue\n }\n\n if (params.by_amount_in) {\n const amount = new BN(valueData[i].parsedJson.data.amount_out)\n if (amount.gt(tempMaxAmount)) {\n tempIndex = i\n tempMaxAmount = amount\n }\n } else {\n const amount = new BN(valueData[i].parsedJson.data.amount_out)\n if (amount.lt(tempMaxAmount)) {\n tempIndex = i\n tempMaxAmount = amount\n }\n }\n }\n\n return this.transformSwapWithMultiPoolData(\n {\n pool_address: params.pool_ids[tempIndex],\n a2b: params.a2b,\n by_amount_in: params.by_amount_in,\n amount: params.amount,\n coin_type_a: params.coin_type_a,\n coin_type_b: params.coin_type_b,\n },\n valueData[tempIndex].parsedJson\n )\n }\n\n /**\n * Performs a pre-swap.\n *\n * @param {PreSwapParams} params The parameters for the pre-swap.\n * @returns {Promise<PreSwapParams>} A promise that resolves to the swap data.\n */\n async preSwap(params: PreSwapParams) {\n const { integrate } = this.sdk.sdkOptions\n\n const tx = new Transaction()\n\n const typeArguments = [params.coin_type_a, params.coin_type_b]\n const args = [tx.object(params.pool.id), tx.pure.bool(params.a2b), tx.pure.bool(params.by_amount_in), tx.pure.u64(params.amount)]\n\n tx.moveCall({\n target: `${integrate.published_at}::${ClmmFetcherModule}::calculate_swap_result`,\n arguments: args,\n typeArguments,\n })\n\n const simulateRes = await this.sdk.FullClient.devInspectTransactionBlock({\n transactionBlock: tx,\n sender: normalizeSuiAddress('0x0'),\n })\n if (simulateRes.error != null) {\n return handleMessageError(\n ConfigErrorCode.InvalidConfig,\n `preSwap error code: ${simulateRes.error ?? 'unknown error'}, please check config and params`,\n {\n [DETAILS_KEYS.METHOD_NAME]: 'preSwap',\n [DETAILS_KEYS.REQUEST_PARAMS]: {\n params,\n },\n }\n )\n }\n\n const valueData: any = simulateRes.events?.filter((item: any) => {\n return extractStructTagFromType(item.type).name === `CalculatedSwapResultEvent`\n })\n if (valueData.length === 0) {\n return handleMessageError(\n ConfigErrorCode.InvalidConfig,\n `preSwap error code: ${simulateRes.error ?? 'unknown error'}, please check config and params`,\n {\n [DETAILS_KEYS.METHOD_NAME]: 'preSwap',\n [DETAILS_KEYS.REQUEST_PARAMS]: {\n params,\n },\n }\n )\n }\n return this.transformSwapData(params, valueData[0].parsedJson.data)\n }\n\n private transformSwapData(params: PreSwapParams, data: any) {\n const estimatedAmountIn = data.amount_in && data.fee_amount ? new BN(data.amount_in).add(new BN(data.fee_amount)).toString() : ''\n return {\n pool_address: params.pool.id,\n current_sqrt_price: params.current_sqrt_price,\n estimated_amount_in: estimatedAmountIn,\n estimated_amount_out: data.amount_out,\n estimated_end_sqrt_price: data.after_sqrt_price,\n estimated_fee_amount: data.fee_amount,\n is_exceed: data.is_exceed,\n amount: params.amount,\n a2b: params.a2b,\n by_amount_in: params.by_amount_in,\n }\n }\n\n private transformSwapWithMultiPoolData(params: TransPreSwapWithMultiPoolParams, json_data: any) {\n const { data } = json_data\n\n console.log('json data. ', data)\n\n const estimatedAmountIn = data.amount_in && data.fee_amount ? new BN(data.amount_in).add(new BN(data.fee_amount)).toString() : ''\n return {\n pool_address: params.pool_address,\n estimated_amount_in: estimatedAmountIn,\n estimated_amount_out: data.amount_out,\n estimated_end_sqrt_price: data.after_sqrt_price,\n estimated_start_sqrt_price: data.step_results[0].current_sqrt_price,\n estimated_fee_amount: data.fee_amount,\n is_exceed: data.is_exceed,\n amount: params.amount,\n a2b: params.a2b,\n by_amount_in: params.by_amount_in,\n }\n }\n\n /**\n * Calculates the rates for a swap.\n * @param {CalculateRatesParams} params The parameters for the calculation.\n * @returns {CalculateRatesResult} The results of the calculation.\n */\n calculateRates(params: CalculateRatesParams): CalculateRatesResult {\n const { current_pool } = params\n const poolData = transClmmpoolDataWithoutTicks(current_pool)\n\n let ticks\n if (params.a2b) {\n ticks = params.swap_ticks.sort((a, b) => {\n return b.index - a.index\n })\n } else {\n ticks = params.swap_ticks.sort((a, b) => {\n return a.index - b.index\n })\n }\n\n const swapResult = computeSwap(params.a2b, params.by_amount_in, params.amount, poolData, ticks)\n\n let isExceed = false\n if (params.by_amount_in) {\n isExceed = swapResult.amount_in.lt(params.amount)\n } else {\n isExceed = swapResult.amount_out.lt(params.amount)\n }\n const sqrtPriceLimit = SwapUtils.getDefaultSqrtPriceLimit(params.a2b)\n if (params.a2b && swapResult.next_sqrt_price.lt(sqrtPriceLimit)) {\n isExceed = true\n }\n\n if (!params.a2b && swapResult.next_sqrt_price.gt(sqrtPriceLimit)) {\n isExceed = true\n }\n\n let extraComputeLimit = 0\n if (swapResult.cross_tick_num > 6 && swapResult.cross_tick_num < 40) {\n extraComputeLimit = 22000 * (swapResult.cross_tick_num - 6)\n }\n\n if (swapResult.cross_tick_num > 40) {\n isExceed = true\n }\n\n const prePrice = TickMath.sqrtPriceX64ToPrice(poolData.current_sqrt_price, params.decimals_a, params.decimals_b).toNumber()\n const afterPrice = TickMath.sqrtPriceX64ToPrice(swapResult.next_sqrt_price, params.decimals_a, params.decimals_b).toNumber()\n\n const priceImpactPct = (Math.abs(prePrice - afterPrice) / prePrice) * 100\n\n return {\n estimated_amount_in: swapResult.amount_in,\n estimated_amount_out: swapResult.amount_out,\n estimated_end_sqrt_price: swapResult.next_sqrt_price,\n estimated_fee_amount: swapResult.fee_amount,\n is_exceed: isExceed,\n extra_compute_limit: extraComputeLimit,\n amount: params.amount,\n a2b: params.a2b,\n by_amount_in: params.by_amount_in,\n price_impact_pct: priceImpactPct,\n }\n }\n\n /**\n * create swap transaction payload\n * @param params\n * @param gas_estimate_arg When the fix input amount is SUI, gasEstimateArg can control whether to recalculate the number of SUI to prevent insufficient gas.\n * If this parameter is not passed, gas estimation is not performed\n * @returns\n */\n async createSwapPayload(params: SwapParams, gas_estimate_arg?: SwapGasEstimateArg): Promise<Transaction> {\n const all_coin_asset = await this._sdk.FullClient.getOwnerCoinAssets(this.sdk.getSenderAddress())\n\n if (gas_estimate_arg) {\n const { is_adjust_coin_a, is_adjust_coin_b } = findAdjustCoin(params)\n\n if ((params.a2b && is_adjust_coin_a) || (!params.a2b && is_adjust_coin_b)) {\n const tx = await SwapUtils.buildSwapTransactionForGas(this._sdk, params, all_coin_asset, gas_estimate_arg)\n return tx\n }\n }\n\n return SwapUtils.buildSwapTransaction(this.sdk, params, all_coin_asset)\n }\n\n /**\n * create swap transaction without transfer coins payload\n * @param params\n * @param gas_estimate_arg When the fix input amount is SUI, gasEstimateArg can control whether to recalculate the number of SUI to prevent insufficient gas.\n * If this parameter is not passed, gas estimation is not performed\n * @returns tx and coin ABs\n */\n async createSwapWithoutTransferCoinsPayload(\n params: SwapParams,\n gas_estimate_arg?: SwapGasEstimateArg\n ): Promise<{ tx: Transaction; coin_ab_s: TransactionObjectArgument[] }> {\n const all_coin_asset = await this._sdk.FullClient.getOwnerCoinAssets(this.sdk.getSenderAddress())\n\n if (gas_estimate_arg) {\n const { is_adjust_coin_a, is_adjust_coin_b } = findAdjustCoin(params)\n\n if ((params.a2b && is_adjust_coin_a) || (!params.a2b && is_adjust_coin_b)) {\n const res = await SwapUtils.buildSwapTransactionWithoutTransferCoinsForGas(this._sdk, params, all_coin_asset, gas_estimate_arg)\n return res\n }\n }\n\n return SwapUtils.buildSwapTransactionWithoutTransferCoins(this.sdk, params, all_coin_asset)\n }\n}\n","import { CLOCK_ADDRESS, CoinAssist, DETAILS_KEYS, getPackagerConfigs, IModule } from '@cetusprotocol/common-sdk'\nimport { CetusClmmSDK } from '../sdk'\nimport { ClmmVestInfo, GetPositionVestOption, PositionVesting, RedeemOption } from '../types/vest'\nimport { handleError, handleMessageError, VestErrorCode } from '../errors'\nimport { VestUtils } from '../utils/vestUtils'\nimport { Transaction } from '@mysten/sui/transactions'\nimport { normalizeSuiAddress } from '@mysten/sui/utils'\n\nexport class VestModule implements IModule<CetusClmmSDK> {\n protected _sdk: CetusClmmSDK\n\n constructor(sdk: CetusClmmSDK) {\n this._sdk = sdk\n }\n\n get sdk() {\n return this._sdk\n }\n\n /**\n * Get the clmm vest info list\n * @returns {Promise<ClmmVestInfo[]>} The clmm vest info list\n */\n async getClmmVestInfoList(): Promise<ClmmVestInfo[]> {\n const { clmm_vest } = this._sdk.sdkOptions\n if (clmm_vest === undefined) {\n return handleMessageError(VestErrorCode.ClmmVestNotSet, 'clmm_vest is not set config in sdk options', {\n [DETAILS_KEYS.METHOD_NAME]: 'getClmmVestInfo',\n })\n }\n\n const vestInfoList: ClmmVestInfo[] = []\n\n try {\n const moveEventType = `${clmm_vest.package_id}::clmm_vester::CreateEvent`\n const objects = await this._sdk.FullClient.queryEventsByPage({ MoveEventType: moveEventType })\n const warpIds = objects.data.map((object) => (object.parsedJson as any).clmm_vester_id)\n if (warpIds.length > 0) {\n const res = await this._sdk.FullClient.batchGetObjects(warpIds, { showContent: true, showType: true })\n res.forEach((item) => {\n const vestInfo = VestUtils.parseClmmVestInfo(item)\n const cacheKey = `${vestInfo.id}-ClmmVestInfo`\n this._sdk.updateCache(cacheKey, vestInfo)\n vestInfoList.push(vestInfo)\n })\n }\n return vestInfoList\n } catch (error) {\n handleError(VestErrorCode.ClmmVestFetchError, error as Error, {\n [DETAILS_KEYS.METHOD_NAME]: 'getClmmVestInfoList',\n })\n }\n return []\n }\n\n /**\n * Get the clmm vest info\n * @param vest_id - The vest id\n * @returns {Promise<ClmmVestInfo>} The clmm vest info\n */\n async getClmmVestInfo(force_refresh = true): Promise<ClmmVestInfo> {\n const { clmm_vest } = this._sdk.sdkOptions\n if (clmm_vest === undefined) {\n return handleMessageError(VestErrorCode.ClmmVestNotSet, 'clmm_vest is not set config in sdk options', {\n [DETAILS_KEYS.METHOD_NAME]: 'getClmmVestInfo',\n })\n }\n const { clmm_vest_id } = getPackagerConfigs(clmm_vest)\n\n const cacheKey = `${clmm_vest_id}-ClmmVestInfo`\n const cacheValue = this._sdk.getCache<ClmmVestInfo>(cacheKey, force_refresh)\n if (cacheValue) {\n return cacheValue\n }\n\n try {\n const res = await this._sdk.FullClient.getObject({ id: clmm_vest_id, options: { showContent: true, showType: true } })\n const vestInfo = VestUtils.parseClmmVestInfo(res)\n this._sdk.updateCache(cacheKey, vestInfo)\n return vestInfo\n } catch (error) {\n return handleError(VestErrorCode.ClmmVestFetchError, error as Error, {\n [DETAILS_KEYS.METHOD_NAME]: 'getClmmVestInfo',\n [DETAILS_KEYS.REQUEST_PARAMS]: { clmm_vest_id },\n })\n }\n }\n\n async getPositionVesting(options: GetPositionVestOption[]): Promise<PositionVesting[]> {\n const { clmm_vest } = this._sdk.sdkOptions\n if (clmm_vest === undefined) {\n return handleMessageError(VestErrorCode.ClmmVestNotSet, 'clmm_vest is not set config in sdk options', {\n [DETAILS_KEYS.METHOD_NAME]: 'getPositionVesting',\n })\n }\n\n if (options.length === 0) {\n return []\n }\n\n const { clmm_vest_id } = getPackagerConfigs(clmm_vest)\n\n const tx = new Transaction()\n options.forEach((option) => {\n const { clmm_pool_id, coin_type_a, coin_type_b, clmm_position_ids } = option\n\n tx.moveCall({\n package: clmm_vest.published_at,\n module: 'clmm_vester',\n function: 'get_positions_vesting',\n typeArguments: [coin_type_a, coin_type_b],\n arguments: [tx.object(clmm_vest_id), tx.object(clmm_pool_id), tx.pure.vector('id', clmm_position_ids)],\n })\n })\n\n const simulateRes = await this.sdk.FullClient.devInspectTransactionBlock({\n transactionBlock: tx,\n sender: normalizeSuiAddress('0x0'),\n })\n\n const position_vesting_list: PositionVesting[] = []\n simulateRes.events?.forEach((event) => {\n if (event.type.includes('clmm_vester::GetPositionsVestingEvent')) {\n const { parsedJson } = event as any\n position_vesting_list.push(...parsedJson.position_vestings.map((item: any) => VestUtils.parsePositionVesting(item)))\n }\n })\n\n return position_vesting_list\n }\n\n /**\n * Build the redeem payload\n * @param options - The redeem options\n * @returns {Transaction} The redeem payload\n */\n buildRedeemPayload(options: RedeemOption[], tx?: Transaction): Transaction {\n const { clmm_vest } = this._sdk.sdkOptions\n if (clmm_vest === undefined) {\n return handleMessageError(VestErrorCode.ClmmVestNotSet, 'clmm_vest is not set config in sdk options', {\n [DETAILS_KEYS.METHOD_NAME]: 'buildRedeemVestPayload',\n })\n }\n\n const { versioned_id, clmm_vest_id, cetus_coin_type } = getPackagerConfigs(clmm_vest)\n tx = tx || new Transaction()\n\n options.forEach((option) => {\n const { clmm_pool_id, clmm_position_id, coin_type_a, coin_type_b, period } = option\n\n const balance = tx.moveCall({\n package: clmm_vest.published_at,\n module: 'clmm_vester',\n function: 'redeem',\n arguments: [\n tx.object(versioned_id),\n tx.object(clmm_vest_id),\n tx.object(clmm_pool_id),\n typeof clmm_position_id === 'string' ? tx.object(clmm_position_id) : clmm_position_id,\n tx.pure.u16(period),\n tx.object(CLOCK_ADDRESS),\n ],\n typeArguments: [coin_type_a, coin_type_b],\n })\n const vest_coin = CoinAssist.fromBalance(balance, cetus_coin_type, tx)\n tx.transferObjects([vest_coin], this._sdk.getSenderAddress())\n })\n\n return tx\n }\n}\n","import { FullRpcUrlMainnet } from '@cetusprotocol/common-sdk'\nimport { CetusClmmSDK, SdkOptions } from '../sdk'\nconst SDKConfig = {\n clmmConfig: {\n pools_id: '0xf699e7f2276f5c9a75944b37a0c5b5d9ddfd2471bf6242483b03ab2887d198d0',\n global_config_id: '0xdaa46292632c3c4d8f31f23ea0f9b36a28ff3677e9684980e4438403a67a3d8f',\n global_vault_id: '0xce7bceef26d3ad1f6d9b6f13a953f053e6ed3ca77907516481ce99ae8e588f2b',\n admin_cap_id: '0x89c1a321291d15ddae5a086c9abc533dff697fde3d89e0ca836c41af73e36a75',\n },\n cetusConfig: {\n coin_list_id: '0x8cbc11d9e10140db3d230f50b4d30e9b721201c0083615441707ffec1ef77b23',\n launchpad_pools_id: '0x1098fac992eab3a0ab7acf15bb654fc1cf29b5a6142c4ef1058e6c408dd15115',\n clmm_pools_id: '0x15b6a27dd9ae03eb455aba03b39e29aad74abd3757b8e18c0755651b2ae5b71e',\n admin_cap_id: '0x39d78781750e193ce35c45ff32c6c0c3f2941fa3ddaf8595c90c555589ddb113',\n global_config_id: '0x0408fa4e4a4c03cc0de8f23d0c2bbfe8913d178713c9a271ed4080973fe42d8f',\n coin_list_handle: '0x49136005e90e28c4695419ed4194cc240603f1ea8eb84e62275eaff088a71063',\n launchpad_pools_handle: '0x5e194a8efcf653830daf85a85b52e3ae8f65dc39481d54b2382acda25068375c',\n clmm_pools_handle: '0x37f60eb2d9d227949b95da8fea810db3c32d1e1fa8ed87434fc51664f87d83cb',\n },\n}\n\n// mainnet\nexport const clmmMainnet: SdkOptions = {\n env: 'mainnet',\n full_rpc_url: FullRpcUrlMainnet,\n cetus_config: {\n package_id: '0x95b8d278b876cae22206131fb9724f701c9444515813042f54f0a426c9a3bc2f',\n published_at: '0xba7e740c3c002673dbe69ad5fbdb0691ec260170e141297cefb982e7081fde52',\n version: 2,\n config: SDKConfig.cetusConfig,\n },\n clmm_pool: {\n package_id: '0x1eabed72c53feb3805120a081dc15963c204dc8d091542592abaf7a35689b2fb',\n published_at: '0x75b2e9ecad34944b8d0c874e568c90db0cf9437f0d7392abfd4cb902972f3e40',\n version: 12,\n config: SDKConfig.clmmConfig,\n },\n integrate: {\n package_id: '0x996c4d9480708fb8b92aa7acf819fb0497b5ec8e65ba06601cae2fb6db3312c3',\n published_at: '0xb2db7142fa83210a7d78d9c12ac49c043b3cbbd482224fea6e3da00aa5a5ae2d',\n version: 12,\n },\n stats_pools_url: 'https://api-sui.cetus.zone/v2/sui/stats_pools',\n clmm_vest: {\n package_id: '0x9d2f067d3b9d19ac0f8d2e5c2c393b1760232083e42005b2e5df39c06064d522',\n published_at: '0x9d2f067d3b9d19ac0f8d2e5c2c393b1760232083e42005b2e5df39c06064d522',\n version: 1,\n config: {\n clmm_vest_id: '0xe255c47472470c03bbefb1fc883459c2b978d3ad29aa8ee0c8c1ec9753fa7d01',\n versioned_id: '0x4f6f2f638362505836114f313809b834dafd58e3910df5110f6e54e4e35c929b',\n cetus_coin_type: '0x06864a6f921804860930db6ddbe2e16acdf8504495ea7481637a1c8b9a8fe54b::cetus::CETUS',\n },\n },\n}\n","import { FullRpcUrlTestnet } from '@cetusprotocol/common-sdk'\nimport { CetusClmmSDK, SdkOptions } from '../sdk'\nconst SDKConfig = {\n clmmConfig: {\n pools_id: '0xe54890bdb721cf2ee12c6327039bf3aaab900ae5ed4e0ffcc528c4a0c539edf0',\n global_config_id: '0x88b0bc51163ad221218be14a0e614342db9a11d54bb54670a82e07049ec77396',\n global_vault_id: '0xe962b50e2da5bb7ad17ef75fa377fc516dd84c5a477947fdef09b36e133bce8c',\n admin_cap_id: '0xdcb9424f5996bcbe8e20ead25420364981681d48054d9916849b3fec7f300c71',\n partners_id: '0x7699f3e3165509db1d1e83c6b7fa95e38db399fae2c2eee6b5dfadaee3c4f2c1',\n },\n cetusConfig: {\n coin_list_id: '0x257eb2ba592a5480bba0a97d05338fab17cc3283f8df6998a0e12e4ab9b84478',\n launchpad_pools_id: '0xdc3a7bd66a6dcff73c77c866e87d73826e446e9171f34e1c1b656377314f94da',\n clmm_pools_id: '0x26c85500f5dd2983bf35123918a144de24e18936d0b234ef2b49fbb2d3d6307d',\n admin_cap_id: '0x1a496f6c67668eb2c27c99e07e1d61754715c1acf86dac45020c886ac601edb8',\n global_config_id: '0xe1f3db327e75f7ec30585fa52241edf66f7e359ef550b533f89aa1528dd1be52',\n coin_list_handle: '0x3204350fc603609c91675e07b8f9ac0999b9607d83845086321fca7f469de235',\n launchpad_pools_handle: '0xae67ff87c34aceea4d28107f9c6c62e297a111e9f8e70b9abbc2f4c9f5ec20fd',\n clmm_pools_handle: '0xd28736923703342b4752f5ed8c2f2a5c0cb2336c30e1fed42b387234ce8408ec',\n },\n}\n\n// origin testnet\n// export const clmmTestnet: SdkOptions = {\n// env: 'testnet',\n// full_rpc_url: FullRpcUrlTestnet,\n// cetus_config: {\n// package_id: '0xf5ff7d5ba73b581bca6b4b9fa0049cd320360abd154b809f8700a8fd3cfaf7ca',\n// published_at: '0xf5ff7d5ba73b581bca6b4b9fa0049cd320360abd154b809f8700a8fd3cfaf7ca',\n// config: SDKConfig.cetusConfig,\n// },\n// clmm_pool: {\n// package_id: '0x0c7ae833c220aa73a3643a0d508afa4ac5d50d97312ea4584e35f9eb21b9df12',\n// published_at: '0x85e61285a10efc6602ab00df70a0c06357c384ef4c5633ecf73016df1500c704',\n// config: SDKConfig.clmmConfig,\n// },\n// integrate: {\n// package_id: '0x2918cf39850de6d5d94d8196dc878c8c722cd79db659318e00bff57fbb4e2ede',\n// published_at: '0x19dd42e05fa6c9988a60d30686ee3feb776672b5547e328d6dab16563da65293',\n// },\n// stats_pools_url: 'https://api-sui.devcetus.com/v2/sui/stats_pools',\n// }\n\n// testnet test compensation\nexport const clmmTestnet: SdkOptions = {\n env: 'testnet',\n full_rpc_url: FullRpcUrlTestnet,\n cetus_config: {\n package_id: '0x2933975c3f74ef7c31f512edead6c6ce3f58f8e8fdbea78770ec8d5abd8ff700',\n published_at: '0xb50a626294f743b40ea51c9cb75190f0e38c71f580981b5613aef910b67a2691',\n config: {\n coin_list_id: '',\n launchpad_pools_id: '',\n clmm_pools_id: '',\n admin_cap_id: '0x774656a83f4f625fcc4e4dbf103eb77caf2d8b8f114ad33f55b848be068267b9',\n global_config_id: '0x95275a022123c66682278e9df6b5bac4da9abcc29ab698b7b2a6213262a592fe',\n coin_list_handle: '',\n launchpad_pools_handle: '',\n clmm_pools_handle: '',\n },\n },\n clmm_pool: {\n package_id: '0x5372d555ac734e272659136c2a0cd3227f9b92de67c80dc11250307268af2db8',\n published_at: '0x5372d555ac734e272659136c2a0cd3227f9b92de67c80dc11250307268af2db8',\n config: {\n pools_id: '0x20a086e6fa0741b3ca77d033a65faf0871349b986ddbdde6fa1d85d78a5f4222',\n global_config_id: '0xc6273f844b4bc258952c4e477697aa12c918c8e08106fac6b934811298c9820a',\n global_vault_id: '0x71e74a999dd7959e483f758ddf573e85fa4c24944db33ff6763c9d85a9c045fe',\n admin_cap_id: '0xbf4c48590f403c38351de0e8aa13d6d91bf78fd8c04e93ac1d0269c44d70ae02',\n partners_id: '0xb5ae5ed3f403654ae1307aadc0140f746db41efb7bda92235257c84d90a1397e',\n },\n },\n integrate: {\n package_id: '0x36187418dd79415d50e2e5903f9b3caca582052005f062959c86da64e82107a9',\n published_at: '0x36187418dd79415d50e2e5903f9b3caca582052005f062959c86da64e82107a9',\n version: 1,\n },\n stats_pools_url: 'https://api-sui.devcetus.com/v2/sui/stats_pools',\n clmm_vest: {\n package_id: '0xa46d9c66e7b24ab14c5fc5f0d08fa257d833718f0295a6343556ea2f2fdfbd7f',\n published_at: '0xa46d9c66e7b24ab14c5fc5f0d08fa257d833718f0295a6343556ea2f2fdfbd7f',\n config: {\n clmm_vest_id: '0x308b24963e5992f699e32db2f7088b812566a0cae580317fd3b8bf61de7f5508',\n versioned_id: '0x1cfb684d8ff581416a56caba2aa419bee45fe98a23cbf28e2c6c1021b14cab7c',\n cetus_coin_type: '0xc6c51938da9a5cf6d6dca692783ea7bdf4478f7b1fef693f58947848f84bcf89::cetus::CETUS',\n },\n },\n}\n","import BN from 'bn.js'\nimport { MathUtil, TickMath } from '@cetusprotocol/common-sdk'\nimport Decimal from 'decimal.js'\n\nconst D365 = new BN(365)\nconst H24 = new BN(24)\nconst S3600 = new BN(3600)\nconst B05 = new BN(0.5)\n\nexport function estPoolAPR(pre_block_reward: BN, reward_price: BN, total_trading_fee: BN, total_liquidity_value: BN): BN {\n const annualRate = D365.mul(H24).mul(S3600).mul(B05)\n\n const APR = annualRate.mul(pre_block_reward.mul(reward_price).add(total_trading_fee).div(total_liquidity_value))\n\n return APR\n}\n\nfunction calculatePoolValidTVL(\n amount_a: BN,\n amount_b: BN,\n decimals_a: number,\n decimals_b: number,\n coin_a_price: Decimal,\n coin_b_price: Decimal\n): Decimal {\n const poolValidAmountA = new Decimal(amount_a.toString()).div(new Decimal(10 ** decimals_a))\n const poolValidAmountB = new Decimal(amount_b.toString()).div(new Decimal(10 ** decimals_b))\n\n const TVL = poolValidAmountA.mul(coin_a_price).add(poolValidAmountB.mul(coin_b_price))\n\n return TVL\n}\n\nexport type estPosAPRResult = {\n fee_apr: Decimal\n pos_rewarder_0_apr: Decimal\n pos_rewarder_1_apr: Decimal\n pos_rewarder_2_apr: Decimal\n}\n\nexport function estPositionAPRWithDeltaMethod(\n current_tick_index: number,\n lower_tick_index: number,\n upper_tick_index: number,\n current_sqrt_price_x64: BN,\n pool_liquidity: BN,\n decimals_a: number,\n decimals_b: number,\n decimals_rewarder_0: number,\n decimals_rewarder_1: number,\n decimals_rewarder_2: number,\n fee_rate: number,\n amount_a_str: string,\n amount_b_str: string,\n pool_amount_a: BN,\n pool_amount_b: BN,\n swap_volume_str: string,\n pool_rewarders_0_str: string,\n pool_rewarders_1_str: string,\n pool_rewarders_2_str: string,\n coin_a_price_str: string,\n coin_b_price_str: string,\n rewarder_0_price_str: string,\n rewarder_1_price_str: string,\n rewarder_2_price_str: string\n): estPosAPRResult {\n const amount_a = new Decimal(amount_a_str)\n const amount_b = new Decimal(amount_b_str)\n const swap_volume = new Decimal(swap_volume_str)\n const pool_rewarders_0 = new Decimal(pool_rewarders_0_str)\n const pool_rewarders_1 = new Decimal(pool_rewarders_1_str)\n const pool_rewarders_2 = new Decimal(pool_rewarders_2_str)\n const coin_a_price = new Decimal(coin_a_price_str)\n const coin_b_price = new Decimal(coin_b_price_str)\n const rewarder_0_price = new Decimal(rewarder_0_price_str)\n const rewarder_1_price = new Decimal(rewarder_1_price_str)\n const rewarder_2_price = new Decimal(rewarder_2_price_str)\n\n const lower_sqrt_price_x64 = TickMath.tickIndexToSqrtPriceX64(lower_tick_index)\n const upper_sqrt_price_x64 = TickMath.tickIndexToSqrtPriceX64(upper_tick_index)\n const lower_sqrt_price_d = MathUtil.toX64Decimal(MathUtil.fromX64(lower_sqrt_price_x64)).round()\n const upper_sqrt_price_d = MathUtil.toX64Decimal(MathUtil.fromX64(upper_sqrt_price_x64)).round()\n const current_sqrt_price_d = MathUtil.toX64Decimal(MathUtil.fromX64(current_sqrt_price_x64)).round()\n let delta_liquidity\n const liquidity_amount_0 = amount_a\n .mul(new Decimal(10 ** decimals_a))\n .mul(upper_sqrt_price_d.mul(lower_sqrt_price_d))\n .div(upper_sqrt_price_d.sub(lower_sqrt_price_d))\n .round()\n const liquidity_amount_1 = amount_b\n .mul(new Decimal(10 ** decimals_b))\n .div(upper_sqrt_price_d.sub(lower_sqrt_price_d))\n .round()\n if (current_tick_index < lower_tick_index) {\n delta_liquidity = liquidity_amount_0\n } else if (current_tick_index > upper_tick_index) {\n delta_liquidity = liquidity_amount_1\n } else {\n delta_liquidity = Decimal.min(liquidity_amount_0, liquidity_amount_1)\n }\n const delta_y = delta_liquidity.mul(current_sqrt_price_d.sub(lower_sqrt_price_d))\n const delta_x = delta_liquidity.mul(upper_sqrt_price_d.sub(current_sqrt_price_d)).div(current_sqrt_price_d.mul(upper_sqrt_price_d))\n const pos_valid_tvl = delta_x\n .div(new Decimal(10 ** decimals_a))\n .mul(coin_a_price)\n .add(delta_y.div(new Decimal(10 ** decimals_b).mul(coin_b_price)))\n const pool_valid_tvl = calculatePoolValidTVL(pool_amount_a, pool_amount_b, decimals_a, decimals_b, coin_a_price, coin_b_price)\n const pos_valid_rate = pos_valid_tvl.div(pool_valid_tvl)\n\n const fee_apr = delta_liquidity.eq(new Decimal(0))\n ? new Decimal(0)\n : new Decimal(fee_rate / 10000)\n .mul(swap_volume)\n .mul(\n new Decimal(delta_liquidity.toString()).div(new Decimal(pool_liquidity.toString()).add(new Decimal(delta_liquidity.toString())))\n )\n .div(pos_valid_tvl)\n\n const apr_coe = pos_valid_rate.eq(new Decimal(0)) ? new Decimal(0) : pos_valid_rate.mul(new Decimal(36500 / 7)).div(pos_valid_tvl)\n const pos_rewarder_0_apr = pool_rewarders_0\n .div(new Decimal(10 ** decimals_rewarder_0))\n .mul(rewarder_0_price)\n .mul(apr_coe)\n const pos_rewarder_1_apr = pool_rewarders_1\n .div(new Decimal(10 ** decimals_rewarder_1))\n .mul(rewarder_1_price)\n .mul(apr_coe)\n const pos_rewarder_2_apr = pool_rewarders_2\n .div(new Decimal(10 ** decimals_rewarder_2))\n .mul(rewarder_2_price)\n .mul(apr_coe)\n return {\n fee_apr,\n pos_rewarder_0_apr,\n pos_rewarder_1_apr,\n pos_rewarder_2_apr,\n }\n}\n\nexport function estPositionAPRWithMultiMethod(\n lower_user_price: number,\n upper_user_price: number,\n lower_hist_price: number,\n upper_hist_price: number\n): Decimal {\n const retro_lower = Math.max(lower_user_price, lower_hist_price)\n const retro_upper = Math.min(upper_user_price, upper_hist_price)\n const retro_range = retro_upper - retro_lower\n const user_range = upper_user_price - lower_user_price\n const hist_range = upper_hist_price - lower_hist_price\n const user_range_d = new Decimal(user_range.toString())\n const hist_range_d = new Decimal(hist_range.toString())\n const retro_range_d = new Decimal(retro_range.toString())\n\n let m = new Decimal('0')\n if (retro_range < 0) {\n m = new Decimal('0')\n } else if (user_range === retro_range) {\n m = hist_range_d.div(retro_range_d)\n } else if (hist_range === retro_range) {\n m = retro_range_d.div(user_range_d)\n } else {\n m = retro_range_d.mul(retro_range_d).div(hist_range_d).div(user_range_d)\n }\n\n return m\n}\n","import { CetusClmmSDK, SdkOptions } from './sdk'\n\nexport * from './utils'\nexport * from './math'\nexport * from './types'\nexport * from './modules'\nexport * from './config'\nexport * from './errors'\nexport { CetusClmmSDK, SdkOptions }\nexport default CetusClmmSDK\n"],"mappings":"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","names":["require_bn","__commonJSMin","exports","module","assert","val","msg","inherits","ctor","superCtor","TempCtor","BN","number","base","endian","Buffer","num","left","right","start","i","j","w","off","parseHex4Bits","string","index","c","parseHexByte","lowerBound","r","parseLength","parseBase","str","end","mul","b","len","limbLen","limbPow","total","mod","word","pow","dest","move","src","size","inspect","zeros","groupSizes","groupBases","padding","out","carry","groupSize","groupBase","ret","length","allocate","ArrayType","byteLength","reqLength","res","postfix","position","shift","t","hi","toBitArray","bit","wbit","width","a","bytesNeeded","bitsLeft","cmp","smallMulTo","self","lo","k","ncarry","rword","maxJ","comb10MulTo","o","mid","a0","al0","ah0","a1","al1","ah1","a2","al2","ah2","a3","al3","ah3","a4","al4","ah4","a5","al5","ah5","a6","al6","ah6","a7","al7","ah7","a8","al8","ah8","a9","al9","ah9","b0","bl0","bh0","b1","bl1","bh1","b2","bl2","bh2","b3","bl3","bh3","b4","bl4","bh4","b5","bl5","bh5","b6","bl6","bh6","b7","bl7","bh7","b8","bl8","bh8","b9","bl9","bh9","w0","w1","w2","w3","w4","w5","w6","w7","w8","w9","w10","w11","w12","w13","w14","w15","w16","w17","w18","bigMulTo","hncarry","jumboMulTo","FFTM","x","y","N","l","rb","rbt","rws","iws","rtws","itws","s","rtwdf","itwdf","p","rtwdf_","itwdf_","re","ie","ro","io","rx","n","m","odd","ws","ph","_","rwst","iwst","nrws","nrwst","niwst","rmws","isNegNum","q","bits","carryMask","newCarry","hint","extended","h","mask","maskedWords","mode","bhi","bhiBits","diff","qj","positive","div","dm","half","r2","acc","A","B","C","D","g","yp","xp","im","jm","x1","x2","delta","negative","Red","ctx","primes","MPrime","name","tmp","rlen","input","K256","output","outLen","prev","next","P224","P192","P25519","prime","mod3","one","nOne","lpow","z","inv","windowSize","wnd","current","currentLen","Mont","u","index_exports","__export","CetusLeverageSDK","index_default","leverage_mainnet","__toCommonJS","import_common_sdk","import_common_sdk","leverage_mainnet","import_client","import_sdk","isNumeric","mathceil","mathfloor","bignumberError","tooManyDigits","BASE","LOG_BASE","MAX_SAFE_INTEGER","POWS_TEN","SQRT_BASE","MAX","clone","configObject","div","convertBase","parseNumeric","P","BigNumber","ONE","DECIMAL_PLACES","ROUNDING_MODE","TO_EXP_NEG","TO_EXP_POS","MIN_EXP","MAX_EXP","CRYPTO","MODULO_MODE","POW_PRECISION","FORMAT","ALPHABET","alphabetHasNormalDecimalDigits","v","b","alphabet","c","caseChanged","e","i","isNum","len","str","x","intCheck","round","obj","p","n","s","out","maxOrMin","pow2_53","random53bitInt","dp","a","k","rand","args","sum","decimal","toBaseOut","baseIn","baseOut","j","arr","arrL","sign","callerIsToString","d","r","xc","y","rm","toFixedPoint","coeffToString","multiply","base","m","temp","xlo","xhi","carry","klo","khi","compare","aL","bL","cmp","subtract","more","prod","prodL","q","qc","rem","remL","rem0","xi","xL","yc0","yL","yz","yc","bitFloor","format","id","c0","ne","toExponential","normalise","basePrefix","dotAfter","dotBefore","isInfinityOrNaN","whitespaceOrPlus","p1","p2","sd","ni","rd","pows10","valueOf","half","isModExp","nIsBig","nIsNeg","nIsOdd","isOdd","t","xLTy","xe","ye","xcL","ycL","ylo","yhi","zc","sqrtBase","rep","g1","g2","groupSeparator","intPart","fractionPart","isNeg","intDigits","md","d0","d1","d2","exp","n0","n1","z","l","min","max","name","zs","bignumber_default","import_sdk","import_sui_fe","import_crypto","rnds8Pool","poolPtr","rng","crypto","byteToHex","i","unsafeStringify","arr","offset","import_crypto","native_default","crypto","v4","options","buf","offset","native_default","rnds","rng","i","unsafeStringify","v4_default","calculateUtilizationPercent","reserve","bignumber_default","calculateBorrowAprPercent","utilizationPercent","calculateDepositAprPercent","borrowAprPercent","appendExtraRewards","side","filteredRewards","sdk","v4_default","getUpdatedReserve","changeAmount","getRewardsAprMultiplier","newReserve","totalAmount","newTotalAmount","multiplier","updateRewardsWithMultiplier","perDayRewards","aprRewards","isValid","newPerDayRewards","r","newAprRewards","import_common_sdk","SuiLendModule","sdk","coinType","changeAmount","allLendingMarketData","lstAprPercentMap","list","reserve","r","currentUserData","side","rewards","filteredRewards","appendExtraRewards","stakingYieldAprPercent","aprPercent","newAprPercent","newReserve","getUpdatedReserve","calculateDepositAprPercent","calculateBorrowAprPercent","multiplier","isValid","getRewardsAprMultiplier","perDayRewards","aprRewards","newPerDayRewards","newAprRewards","updateRewardsWithMultiplier","totalAprPercent","newTotalAprPercent","reward","transaction","lendingMarketId","lendingMarketType","cacheKey","forceRefresh","lendingMarkets","LENDING_MARKET","suilendClient","lendingMarket","coinMetadataMap","refreshedRawReserves","reserveMap","reserveCoinTypes","reserveCoinMetadataMap","rewardCoinTypes","activeRewardCoinTypes","rewardCoinMetadataMap","rewardPriceMap","res","json","bignumber_default","err","error","allAppData","result","appData","obligationOwnerCaps","obligations","rewardMap","obligationId","userData","obligation","o","netAprPercent","import_common_sdk","import_bn","import_transactions","LeverageModules","sdk","config","force_refresh","cacheKey","cachedData","marketsTableObject","nextCursor","limit","marketsList","marketsTableData","marketId","marketInfo","params","isQuote","amount","clmmPool","slippage","leverage","baseCoinType","quoteCoinType","tx","routers","inputCoin","quoteCoin","balanceA","balanceB","receipt","clmm_pool","global_config_id","sqrt_price_limit","coinA","coinB","coin_type_a","coin_type_b","by_amount_in","pools","providers","findRouterParams","BN","res","import_aggregator_sdk","import_utils","import_client","import_common_sdk","import_utils","import_client","import_transactions","require_bn","__commonJSMin","exports","module","assert","val","msg","inherits","ctor","superCtor","TempCtor","BN","number","base","endian","Buffer","wr","num","left","right","start","i","j","w","off","parseHex4Bits","string","index","c","parseHexByte","lowerBound","r","parseLength","parseBase","str","end","mul","b","len","limbLen","limbPow","total","mod","word","pow","dest","move","src","size","inspect","zeros","groupSizes","groupBases","padding","out","carry","groupSize","groupBase","ret","length","allocate","ArrayType","byteLength","reqLength","res","postfix","position","shift","t","hi","toBitArray","bit","wbit","width","a","bytesNeeded","bitsLeft","cmp","smallMulTo","self","lo","k","ncarry","rword","maxJ","comb10MulTo","o","mid","a0","al0","ah0","a1","al1","ah1","a2","al2","ah2","a3","al3","ah3","a4","al4","ah4","a5","al5","ah5","a6","al6","ah6","a7","al7","ah7","a8","al8","ah8","a9","al9","ah9","b0","bl0","bh0","b1","bl1","bh1","b2","bl2","bh2","b3","bl3","bh3","b4","bl4","bh4","b5","bl5","bh5","b6","bl6","bh6","b7","bl7","bh7","b8","bl8","bh8","b9","bl9","bh9","w0","w1","w2","w3","w4","w5","w6","w7","w8","w9","w10","w11","w12","w13","w14","w15","w16","w17","w18","bigMulTo","hncarry","jumboMulTo","FFTM","x","y","N","l","rb","rbt","rws","iws","rtws","itws","s","rtwdf","itwdf","p","rtwdf_","itwdf_","re","ie","ro","io","rx","n","m","odd","ws","ph","_","rwst","iwst","nrws","nrwst","niwst","rmws","isNegNum","q","bits","carryMask","newCarry","hint","extended","h","mask","maskedWords","mode","bhi","bhiBits","diff","qj","positive","div","dm","half","r2","acc","A","B","C","D","g","yp","xp","im","jm","x1","x2","delta","negative","Red","ctx","primes","MPrime","name","tmp","rlen","input","K256","output","outLen","prev","next","P224","P192","P25519","prime","mod3","one","nOne","lpow","z","inv","windowSize","wnd","current","currentLen","Mont","u","version","VERSION","_hasBuffer","_TD","_TE","b64ch","b64chs","b64tab","tab","b64re","_fromCC","_U8Afrom","it","_mkUriSafe","m0","_tidyB64","btoaPolyfill","bin","u32","c0","c1","c2","asc","pad","_btoa","_fromUint8Array","u8a","strs","fromUint8Array","urlsafe","cb_utob","cc","re_utob","utob","_encode","encode","encodeURI","re_btou","cb_btou","cccc","cp","offset","btou","atobPolyfill","u24","r1","_atob","_toUint8Array","toUint8Array","_unURI","_decode","decode","isValid","_noEnum","v","extendString","_add","body","extendUint8Array","extendBuiltins","gBase64","SwapErrorCode","PositionErrorCode","PoolErrorCode","VestErrorCode","PartnerErrorCode","ConfigErrorCode","UtilsErrorCode","RouterErrorCode","TypesErrorCode","ClmmError","BaseError","message","errorCode","details","e","code","handleError","error","handleMessageError","ConfigModule","sdk","coin_list","coin_list_handle","getPackagerConfigs","cacheKey","cacheData","updatedCacheData","coin_types","tokenMap","tokenList","coinType","token","normalizeCoinType","unFoundArray","metadataKey","metadata","data","CACHE_TIME_24H","force_refresh","transform_extensions","warpIds","item","objects","coinList","object","DETAILS_KEYS","coin","coin_type","fixCoinType","fields","getObjectFields","getObjectId","extractStructTagFromType","normalizeSuiObjectId","clmm_pools_handle","poolList","pool","pool_id","launchpad_pools_handle","social_medias","data_array","extensions","key","value","decodedValue","packageObjectId","packageObject","previousTx","getObjectPreviousTransactionDigest","tokenConfig","token_config","type","getObjectType","time","CACHE_TIME_5MIN","getFutureTime","CachedContent","import_bn","Gt","poolLiquiditySnapshotType","ClmmPositionStatus","poolFilterEvenTypes","ClmmPartnerModule","ClmmIntegratePoolModule","ClmmIntegratePoolV2Module","ClmmIntegratePoolV3Module","ClmmIntegrateRouterModule","ClmmIntegrateRouterWithPartnerModule","ClmmFetcherModule","ClmmIntegrateUtilsModule","import_bn","re","Gt","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","findAdjustCoin","coinPair","is_adjust_coin_a","CoinAssist","is_adjust_coin_b","raverSlippageAmount","slippageAmount","slippage","PositionUtils","sdk","tx","params","all_coin_asset","all_coin_asset_a","all_coin_asset_b","coin_type_a","normalizeCoinType","coin_type_b","primary_coin_a_input","primary_coin_b_input","primary_coin_inputs","type","all_coins","amount","amount_coins","total_amount","handleMessageError","estimate_gas","Transaction","item","new_gas","newTx","gas_estimate_arg","input_coin_a","input_coin_b","sui_amount","newResult","fixAmount","primaryCoinAInputs","primaryCoinBInputs","need_interval_amount","coin_type","build_vector","fix_amount","curSqrtPrice","coinAmount","liquidityInput","ClmmPoolUtil","Bo","BN","primary_coina_inputs","primary_coinb_inputs","typeArguments","functionName","clmm_pool","integrate","clmmConfig","getPackagerConfigs","asUintN","CLOCK_ADDRESS","ClmmIntegratePoolV2Module","by_amount_in","coin","amount_limit","ClmmIntegrateRouterModule","SwapUtils","_SwapUtils","a2b","MIN_SQRT_PRICE","MAX_SQRT_PRICE","amount_specified_is_input","ZERO","U64_MAX","primaryCoinInputA","primaryCoinInputB","sdk_options","primary_coin_input_a","primary_coin_input_b","sqrtPriceLimit","global_config_id","hasSwapPartner","gasEstimateArg","current_pool","res","to_amount","adjustForSlippage","error","handleError","coin_ab_s","moduleName","ClmmIntegrateRouterWithPartnerModule","coinABs","toCoinType","toCoin","totalAmount","transClmmpoolDataWithoutTicks","pool","Rt","BN","computeSwapStep","currentSqrtPrice","targetSqrtPrice","liquidity","amount","feeRate","byAmountIn","ZERO","a2b","amountIn","amountOut","nextSqrtPrice","feeAmount","amountRemain","MathUtil","FEE_RATE_DENOMINATOR","maxAmountIn","getDeltaUpFromInput","getNextSqrtPriceFromInput","getDeltaDownFromOutput","maxAmountOut","getNextSqrtPriceFromOutput","computeSwap","aToB","poolData","swapTicks","remainAmount","currentLiquidity","current_sqrt_price","swapResult","target_sqrt_price","signed_liquidity_change","sqrt_price_limit","SwapUtils","tick","stepResult","asUintN","import_bn","re","Gt","buildPoolName","coin_type_a","coin_type_b","tick_spacing","coinNameA","extractStructTagFromType","coinNameB","buildPool","objects","type","getMoveObjectType","formatType","fields","getObjectFields","handleMessageError","getObjectId","DETAILS_KEYS","rewarders","item","emissions_per_second","emissionSeconds","Vt","emissionsEveryDay","is_pause","pool_status","asIntN","buildPosition","object","nft","position","ownerWarp","getObjectOwner","buildNFT","deletedResponse","getObjectDeletedResponse","objectNotExistsResponse","getObjectNotExistsResponse","buildPositionInfo","index","amount_owned","growth_inside","tick_lower_index","tick_upper_index","buildTickData","valueItem","buildTickDataByEvent","sqrt_price","liquidity_net","liquidity_gross","fee_growth_outside_a","fee_growth_outside_b","rewarders_growth_outside","buildPositionTransactionInfo","data","txIndex","filterIds","list","timestampMs","events","filterEvenTypes","event","index","type","extractStructTagFromType","info","d","buildPoolTransactionInfo","package_id","pool_id","package_address","poolFilterEvenTypes","buildTransferCoinToSender","sdk","tx","coin","coinType","ClmmIntegrateUtilsModule","buildTransferCoin","recipient","BPS","VestUtils","res","fields","getObjectFields","getObjectType","structTag","global_vesting_periods","item","fixCoinType","subFields","asIntN","PoolModule","position_handle","pagination_args","dataPage","objects","positionObjectIDs","handleMessageError","DETAILS_KEYS","allPosition","force_refresh","allPools","queryAll","cacheAllKey","cacheDate","moveEventType","object","error","handleError","CACHE_TIME_24H","poolImmutables","objectDataResponses","suiObj","pool","buildPool","cacheKey","show_details","poolLiquiditySnapshotType","posSnapshotIds","posSnapshotsData","positionSnapshots","snapshot_handle","pos_ids","assign_pools","allPool","verify_pool_status","cacheData","poolStatus","coins","fee_rate","i","url","response","json","e","pools","poolAddresses","params","isSortedSymbols","normalizeSuiAddress","swap_coin_type_b","metadata_b","packageObject","previousTx","getObjectPreviousTransactionDigest","clmmConfig","order","full_rpc_url","fullClient","sdkOptions","client","createFullClient","SuiClient","limit","query","user_limit","dataList","current_price","slippage","tick_spacing","add_mode_params","price_base_coin","coin_decimals_a","coin_decimals_b","current_sqrt_price","TickMath","tick_lower","tick_upper","TickUtil","min_price","max_price","coin_amount","fix_amount_a","coin_amount_limit_a","coin_amount_limit_b","liquidity_amount","coin_amount_a","coin_amount_b","ClmmPoolUtil","er","BN","Transaction","integrate","clmm_pool","eventConfig","getPackagerConfigs","globalPauseStatusObjectId","poolsId","allCoinAsset","primaryCoinAInputsR","CoinAssist","primaryCoinBInputsR","args","asUintN","CLOCK_ADDRESS","coin_type_a","coin_type_b","uri","calculate_result","initialize_sqrt_price","liquidity","coinMetadataA","coinMetadataB","metadata_a","ticks","start","typeArguments","ClmmFetcherModule","simulateRes","tick","buildTickDataByEvent","vecStart","id","positionInfos","positionReward","buildPositionInfo","tick_handle","allTickData","nextCursor","allTickId","idRes","tick_object_id","buildTickData","tick_index","name","tickScore","tick_id","partner","show_display","balance","refFee","coinAsset","partner_cap","coin_type","global_config_id","ClmmPartnerModule","poolId","status","import_bn","re","Gt","PositionModule","pos_id","origin_pos_id","account_address","assign_pool_ids","all_position","owner_res","has_assign_pool_ids","position","buildPosition","cache_key","position_id","calculate_rewarder","object_data_responses","position_ids","position_list","not_found_ids","position_reward","dynamic_field_object","options","position_info_list","warpIds","option","value","dynamic_field_id","deriveDynamicFieldIdByType","position_info","simulate_res","feeData","feeValueData","parsedJson","posObj","paramItem","result","parsedPosFeeData","posFeeData","posFeeResult","pos_fee_params_list","positionMap","pos_rewarder_info","gas_estimate_arg","input_coin_a","input_coin_b","all_coin_asset","is_adjust_coin_a","is_adjust_coin_b","findAdjustCoin","PositionUtils","needOpenPosition","isValidSuiObjectId","max_amount_a","max_amount_b","primary_coin_a_inputs","primary_coin_b_inputs","ClmmIntegratePoolV2Module","functionName","ClmmIntegratePoolModule","coin_a","coin_b","primary_coin_a_input","primary_coin_b_input","refresh_pool_price","lower_sqrt_price","upper_sqrt_price","Ze","decimal_default","ClmmIntegratePoolV3Module","RewarderModule","ZERO","rewarderInfos","emissionsEveryDay","rewarderInfo","emissionSeconds","MathUtil","kn","posRewardParamsList","rewarder","posRewarderInfo","param","rewarderData","posRewarderResult","amount","rewarderValueData","account","pool_object_id","positions","rewarderAmount","j","ticks_handle","lower_ticks","upper_ticks","pos","coin_id_maps","normalizeCoinType","coin_a_input","coin_b_input","primaryCoinInputs","coinInput","key","primary_coin_inputs","clmm_configs","type_arguments","SwapModule","sdk","rate","c_price","paths","fee","d","item","pathCount","path","fee_rate","decimal_default","feeAmount","path2","price1","price2","feeRate2","fee2","impactValue","output_amount","input_amount","cprice","cprice1","cprice2","params","integrate","tx","Transaction","typeArguments","i","args","ClmmFetcherModule","simulateRes","normalizeSuiAddress","handleMessageError","DETAILS_KEYS","valueData","extractStructTagFromType","tempMaxAmount","ZERO","U64_MAX","tempIndex","amount","be","BN","data","estimatedAmountIn","json_data","current_pool","poolData","transClmmpoolDataWithoutTicks","ticks","a","b","swapResult","computeSwap","isExceed","sqrtPriceLimit","SwapUtils","extraComputeLimit","prePrice","TickMath","afterPrice","priceImpactPct","gas_estimate_arg","all_coin_asset","is_adjust_coin_a","is_adjust_coin_b","findAdjustCoin","VestModule","clmm_vest","vestInfoList","moveEventType","warpIds","object","vestInfo","VestUtils","cacheKey","error","handleError","force_refresh","clmm_vest_id","getPackagerConfigs","cacheValue","res","options","option","clmm_pool_id","coin_type_a","coin_type_b","clmm_position_ids","position_vesting_list","event","parsedJson","versioned_id","cetus_coin_type","clmm_position_id","period","balance","CLOCK_ADDRESS","vest_coin","CoinAssist","SDKConfig","clmmMainnet","FullRpcUrlMainnet","clmmTestnet","FullRpcUrlTestnet","CetusClmmSDK","_CetusClmmSDK","SdkWrapper","PoolModule","PositionModule","ConfigModule","RewarderModule","env","import_bn","re","Gt","D365","ze","H24","S3600","B05","CetusLeverageSDK","_CetusLeverageSDK","options","clmmSDK","SuiLendModule","LeverageModules","xi","leverage_mainnet","index_default","CetusLeverageSDK"]}
|
|
1
|
+
{"version":3,"sources":["../../../node_modules/.pnpm/bn.js@5.2.2/node_modules/bn.js/lib/bn.js","../src/index.ts","../src/sdk.ts","../src/config/mainnet.ts","../src/modules/suilendModule.ts","../../../node_modules/.pnpm/bignumber.js@9.3.1/node_modules/bignumber.js/bignumber.mjs","../src/utils/suiLend.ts","../../../node_modules/.pnpm/uuid@9.0.1/node_modules/uuid/dist/esm-node/rng.js","../../../node_modules/.pnpm/uuid@9.0.1/node_modules/uuid/dist/esm-node/stringify.js","../../../node_modules/.pnpm/uuid@9.0.1/node_modules/uuid/dist/esm-node/native.js","../../../node_modules/.pnpm/uuid@9.0.1/node_modules/uuid/dist/esm-node/v4.js","../src/modules/leverageModules.ts"],"sourcesContent":["(function (module, exports) {\n 'use strict';\n\n // Utils\n function assert (val, msg) {\n if (!val) throw new Error(msg || 'Assertion failed');\n }\n\n // Could use `inherits` module, but don't want to move from single file\n // architecture yet.\n function inherits (ctor, superCtor) {\n ctor.super_ = superCtor;\n var TempCtor = function () {};\n TempCtor.prototype = superCtor.prototype;\n ctor.prototype = new TempCtor();\n ctor.prototype.constructor = ctor;\n }\n\n // BN\n\n function BN (number, base, endian) {\n if (BN.isBN(number)) {\n return number;\n }\n\n this.negative = 0;\n this.words = null;\n this.length = 0;\n\n // Reduction context\n this.red = null;\n\n if (number !== null) {\n if (base === 'le' || base === 'be') {\n endian = base;\n base = 10;\n }\n\n this._init(number || 0, base || 10, endian || 'be');\n }\n }\n if (typeof module === 'object') {\n module.exports = BN;\n } else {\n exports.BN = BN;\n }\n\n BN.BN = BN;\n BN.wordSize = 26;\n\n var Buffer;\n try {\n if (typeof window !== 'undefined' && typeof window.Buffer !== 'undefined') {\n Buffer = window.Buffer;\n } else {\n Buffer = require('buffer').Buffer;\n }\n } catch (e) {\n }\n\n BN.isBN = function isBN (num) {\n if (num instanceof BN) {\n return true;\n }\n\n return num !== null && typeof num === 'object' &&\n num.constructor.wordSize === BN.wordSize && Array.isArray(num.words);\n };\n\n BN.max = function max (left, right) {\n if (left.cmp(right) > 0) return left;\n return right;\n };\n\n BN.min = function min (left, right) {\n if (left.cmp(right) < 0) return left;\n return right;\n };\n\n BN.prototype._init = function init (number, base, endian) {\n if (typeof number === 'number') {\n return this._initNumber(number, base, endian);\n }\n\n if (typeof number === 'object') {\n return this._initArray(number, base, endian);\n }\n\n if (base === 'hex') {\n base = 16;\n }\n assert(base === (base | 0) && base >= 2 && base <= 36);\n\n number = number.toString().replace(/\\s+/g, '');\n var start = 0;\n if (number[0] === '-') {\n start++;\n this.negative = 1;\n }\n\n if (start < number.length) {\n if (base === 16) {\n this._parseHex(number, start, endian);\n } else {\n this._parseBase(number, base, start);\n if (endian === 'le') {\n this._initArray(this.toArray(), base, endian);\n }\n }\n }\n };\n\n BN.prototype._initNumber = function _initNumber (number, base, endian) {\n if (number < 0) {\n this.negative = 1;\n number = -number;\n }\n if (number < 0x4000000) {\n this.words = [number & 0x3ffffff];\n this.length = 1;\n } else if (number < 0x10000000000000) {\n this.words = [\n number & 0x3ffffff,\n (number / 0x4000000) & 0x3ffffff\n ];\n this.length = 2;\n } else {\n assert(number < 0x20000000000000); // 2 ^ 53 (unsafe)\n this.words = [\n number & 0x3ffffff,\n (number / 0x4000000) & 0x3ffffff,\n 1\n ];\n this.length = 3;\n }\n\n if (endian !== 'le') return;\n\n // Reverse the bytes\n this._initArray(this.toArray(), base, endian);\n };\n\n BN.prototype._initArray = function _initArray (number, base, endian) {\n // Perhaps a Uint8Array\n assert(typeof number.length === 'number');\n if (number.length <= 0) {\n this.words = [0];\n this.length = 1;\n return this;\n }\n\n this.length = Math.ceil(number.length / 3);\n this.words = new Array(this.length);\n for (var i = 0; i < this.length; i++) {\n this.words[i] = 0;\n }\n\n var j, w;\n var off = 0;\n if (endian === 'be') {\n for (i = number.length - 1, j = 0; i >= 0; i -= 3) {\n w = number[i] | (number[i - 1] << 8) | (number[i - 2] << 16);\n this.words[j] |= (w << off) & 0x3ffffff;\n this.words[j + 1] = (w >>> (26 - off)) & 0x3ffffff;\n off += 24;\n if (off >= 26) {\n off -= 26;\n j++;\n }\n }\n } else if (endian === 'le') {\n for (i = 0, j = 0; i < number.length; i += 3) {\n w = number[i] | (number[i + 1] << 8) | (number[i + 2] << 16);\n this.words[j] |= (w << off) & 0x3ffffff;\n this.words[j + 1] = (w >>> (26 - off)) & 0x3ffffff;\n off += 24;\n if (off >= 26) {\n off -= 26;\n j++;\n }\n }\n }\n return this._strip();\n };\n\n function parseHex4Bits (string, index) {\n var c = string.charCodeAt(index);\n // '0' - '9'\n if (c >= 48 && c <= 57) {\n return c - 48;\n // 'A' - 'F'\n } else if (c >= 65 && c <= 70) {\n return c - 55;\n // 'a' - 'f'\n } else if (c >= 97 && c <= 102) {\n return c - 87;\n } else {\n assert(false, 'Invalid character in ' + string);\n }\n }\n\n function parseHexByte (string, lowerBound, index) {\n var r = parseHex4Bits(string, index);\n if (index - 1 >= lowerBound) {\n r |= parseHex4Bits(string, index - 1) << 4;\n }\n return r;\n }\n\n BN.prototype._parseHex = function _parseHex (number, start, endian) {\n // Create possibly bigger array to ensure that it fits the number\n this.length = Math.ceil((number.length - start) / 6);\n this.words = new Array(this.length);\n for (var i = 0; i < this.length; i++) {\n this.words[i] = 0;\n }\n\n // 24-bits chunks\n var off = 0;\n var j = 0;\n\n var w;\n if (endian === 'be') {\n for (i = number.length - 1; i >= start; i -= 2) {\n w = parseHexByte(number, start, i) << off;\n this.words[j] |= w & 0x3ffffff;\n if (off >= 18) {\n off -= 18;\n j += 1;\n this.words[j] |= w >>> 26;\n } else {\n off += 8;\n }\n }\n } else {\n var parseLength = number.length - start;\n for (i = parseLength % 2 === 0 ? start + 1 : start; i < number.length; i += 2) {\n w = parseHexByte(number, start, i) << off;\n this.words[j] |= w & 0x3ffffff;\n if (off >= 18) {\n off -= 18;\n j += 1;\n this.words[j] |= w >>> 26;\n } else {\n off += 8;\n }\n }\n }\n\n this._strip();\n };\n\n function parseBase (str, start, end, mul) {\n var r = 0;\n var b = 0;\n var len = Math.min(str.length, end);\n for (var i = start; i < len; i++) {\n var c = str.charCodeAt(i) - 48;\n\n r *= mul;\n\n // 'a'\n if (c >= 49) {\n b = c - 49 + 0xa;\n\n // 'A'\n } else if (c >= 17) {\n b = c - 17 + 0xa;\n\n // '0' - '9'\n } else {\n b = c;\n }\n assert(c >= 0 && b < mul, 'Invalid character');\n r += b;\n }\n return r;\n }\n\n BN.prototype._parseBase = function _parseBase (number, base, start) {\n // Initialize as zero\n this.words = [0];\n this.length = 1;\n\n // Find length of limb in base\n for (var limbLen = 0, limbPow = 1; limbPow <= 0x3ffffff; limbPow *= base) {\n limbLen++;\n }\n limbLen--;\n limbPow = (limbPow / base) | 0;\n\n var total = number.length - start;\n var mod = total % limbLen;\n var end = Math.min(total, total - mod) + start;\n\n var word = 0;\n for (var i = start; i < end; i += limbLen) {\n word = parseBase(number, i, i + limbLen, base);\n\n this.imuln(limbPow);\n if (this.words[0] + word < 0x4000000) {\n this.words[0] += word;\n } else {\n this._iaddn(word);\n }\n }\n\n if (mod !== 0) {\n var pow = 1;\n word = parseBase(number, i, number.length, base);\n\n for (i = 0; i < mod; i++) {\n pow *= base;\n }\n\n this.imuln(pow);\n if (this.words[0] + word < 0x4000000) {\n this.words[0] += word;\n } else {\n this._iaddn(word);\n }\n }\n\n this._strip();\n };\n\n BN.prototype.copy = function copy (dest) {\n dest.words = new Array(this.length);\n for (var i = 0; i < this.length; i++) {\n dest.words[i] = this.words[i];\n }\n dest.length = this.length;\n dest.negative = this.negative;\n dest.red = this.red;\n };\n\n function move (dest, src) {\n dest.words = src.words;\n dest.length = src.length;\n dest.negative = src.negative;\n dest.red = src.red;\n }\n\n BN.prototype._move = function _move (dest) {\n move(dest, this);\n };\n\n BN.prototype.clone = function clone () {\n var r = new BN(null);\n this.copy(r);\n return r;\n };\n\n BN.prototype._expand = function _expand (size) {\n while (this.length < size) {\n this.words[this.length++] = 0;\n }\n return this;\n };\n\n // Remove leading `0` from `this`\n BN.prototype._strip = function strip () {\n while (this.length > 1 && this.words[this.length - 1] === 0) {\n this.length--;\n }\n return this._normSign();\n };\n\n BN.prototype._normSign = function _normSign () {\n // -0 = 0\n if (this.length === 1 && this.words[0] === 0) {\n this.negative = 0;\n }\n return this;\n };\n\n // Check Symbol.for because not everywhere where Symbol defined\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol#Browser_compatibility\n if (typeof Symbol !== 'undefined' && typeof Symbol.for === 'function') {\n try {\n BN.prototype[Symbol.for('nodejs.util.inspect.custom')] = inspect;\n } catch (e) {\n BN.prototype.inspect = inspect;\n }\n } else {\n BN.prototype.inspect = inspect;\n }\n\n function inspect () {\n return (this.red ? '<BN-R: ' : '<BN: ') + this.toString(16) + '>';\n }\n\n /*\n\n var zeros = [];\n var groupSizes = [];\n var groupBases = [];\n\n var s = '';\n var i = -1;\n while (++i < BN.wordSize) {\n zeros[i] = s;\n s += '0';\n }\n groupSizes[0] = 0;\n groupSizes[1] = 0;\n groupBases[0] = 0;\n groupBases[1] = 0;\n var base = 2 - 1;\n while (++base < 36 + 1) {\n var groupSize = 0;\n var groupBase = 1;\n while (groupBase < (1 << BN.wordSize) / base) {\n groupBase *= base;\n groupSize += 1;\n }\n groupSizes[base] = groupSize;\n groupBases[base] = groupBase;\n }\n\n */\n\n var zeros = [\n '',\n '0',\n '00',\n '000',\n '0000',\n '00000',\n '000000',\n '0000000',\n '00000000',\n '000000000',\n '0000000000',\n '00000000000',\n '000000000000',\n '0000000000000',\n '00000000000000',\n '000000000000000',\n '0000000000000000',\n '00000000000000000',\n '000000000000000000',\n '0000000000000000000',\n '00000000000000000000',\n '000000000000000000000',\n '0000000000000000000000',\n '00000000000000000000000',\n '000000000000000000000000',\n '0000000000000000000000000'\n ];\n\n var groupSizes = [\n 0, 0,\n 25, 16, 12, 11, 10, 9, 8,\n 8, 7, 7, 7, 7, 6, 6,\n 6, 6, 6, 6, 6, 5, 5,\n 5, 5, 5, 5, 5, 5, 5,\n 5, 5, 5, 5, 5, 5, 5\n ];\n\n var groupBases = [\n 0, 0,\n 33554432, 43046721, 16777216, 48828125, 60466176, 40353607, 16777216,\n 43046721, 10000000, 19487171, 35831808, 62748517, 7529536, 11390625,\n 16777216, 24137569, 34012224, 47045881, 64000000, 4084101, 5153632,\n 6436343, 7962624, 9765625, 11881376, 14348907, 17210368, 20511149,\n 24300000, 28629151, 33554432, 39135393, 45435424, 52521875, 60466176\n ];\n\n BN.prototype.toString = function toString (base, padding) {\n base = base || 10;\n padding = padding | 0 || 1;\n\n var out;\n if (base === 16 || base === 'hex') {\n out = '';\n var off = 0;\n var carry = 0;\n for (var i = 0; i < this.length; i++) {\n var w = this.words[i];\n var word = (((w << off) | carry) & 0xffffff).toString(16);\n carry = (w >>> (24 - off)) & 0xffffff;\n off += 2;\n if (off >= 26) {\n off -= 26;\n i--;\n }\n if (carry !== 0 || i !== this.length - 1) {\n out = zeros[6 - word.length] + word + out;\n } else {\n out = word + out;\n }\n }\n if (carry !== 0) {\n out = carry.toString(16) + out;\n }\n while (out.length % padding !== 0) {\n out = '0' + out;\n }\n if (this.negative !== 0) {\n out = '-' + out;\n }\n return out;\n }\n\n if (base === (base | 0) && base >= 2 && base <= 36) {\n // var groupSize = Math.floor(BN.wordSize * Math.LN2 / Math.log(base));\n var groupSize = groupSizes[base];\n // var groupBase = Math.pow(base, groupSize);\n var groupBase = groupBases[base];\n out = '';\n var c = this.clone();\n c.negative = 0;\n while (!c.isZero()) {\n var r = c.modrn(groupBase).toString(base);\n c = c.idivn(groupBase);\n\n if (!c.isZero()) {\n out = zeros[groupSize - r.length] + r + out;\n } else {\n out = r + out;\n }\n }\n if (this.isZero()) {\n out = '0' + out;\n }\n while (out.length % padding !== 0) {\n out = '0' + out;\n }\n if (this.negative !== 0) {\n out = '-' + out;\n }\n return out;\n }\n\n assert(false, 'Base should be between 2 and 36');\n };\n\n BN.prototype.toNumber = function toNumber () {\n var ret = this.words[0];\n if (this.length === 2) {\n ret += this.words[1] * 0x4000000;\n } else if (this.length === 3 && this.words[2] === 0x01) {\n // NOTE: at this stage it is known that the top bit is set\n ret += 0x10000000000000 + (this.words[1] * 0x4000000);\n } else if (this.length > 2) {\n assert(false, 'Number can only safely store up to 53 bits');\n }\n return (this.negative !== 0) ? -ret : ret;\n };\n\n BN.prototype.toJSON = function toJSON () {\n return this.toString(16, 2);\n };\n\n if (Buffer) {\n BN.prototype.toBuffer = function toBuffer (endian, length) {\n return this.toArrayLike(Buffer, endian, length);\n };\n }\n\n BN.prototype.toArray = function toArray (endian, length) {\n return this.toArrayLike(Array, endian, length);\n };\n\n var allocate = function allocate (ArrayType, size) {\n if (ArrayType.allocUnsafe) {\n return ArrayType.allocUnsafe(size);\n }\n return new ArrayType(size);\n };\n\n BN.prototype.toArrayLike = function toArrayLike (ArrayType, endian, length) {\n this._strip();\n\n var byteLength = this.byteLength();\n var reqLength = length || Math.max(1, byteLength);\n assert(byteLength <= reqLength, 'byte array longer than desired length');\n assert(reqLength > 0, 'Requested array length <= 0');\n\n var res = allocate(ArrayType, reqLength);\n var postfix = endian === 'le' ? 'LE' : 'BE';\n this['_toArrayLike' + postfix](res, byteLength);\n return res;\n };\n\n BN.prototype._toArrayLikeLE = function _toArrayLikeLE (res, byteLength) {\n var position = 0;\n var carry = 0;\n\n for (var i = 0, shift = 0; i < this.length; i++) {\n var word = (this.words[i] << shift) | carry;\n\n res[position++] = word & 0xff;\n if (position < res.length) {\n res[position++] = (word >> 8) & 0xff;\n }\n if (position < res.length) {\n res[position++] = (word >> 16) & 0xff;\n }\n\n if (shift === 6) {\n if (position < res.length) {\n res[position++] = (word >> 24) & 0xff;\n }\n carry = 0;\n shift = 0;\n } else {\n carry = word >>> 24;\n shift += 2;\n }\n }\n\n if (position < res.length) {\n res[position++] = carry;\n\n while (position < res.length) {\n res[position++] = 0;\n }\n }\n };\n\n BN.prototype._toArrayLikeBE = function _toArrayLikeBE (res, byteLength) {\n var position = res.length - 1;\n var carry = 0;\n\n for (var i = 0, shift = 0; i < this.length; i++) {\n var word = (this.words[i] << shift) | carry;\n\n res[position--] = word & 0xff;\n if (position >= 0) {\n res[position--] = (word >> 8) & 0xff;\n }\n if (position >= 0) {\n res[position--] = (word >> 16) & 0xff;\n }\n\n if (shift === 6) {\n if (position >= 0) {\n res[position--] = (word >> 24) & 0xff;\n }\n carry = 0;\n shift = 0;\n } else {\n carry = word >>> 24;\n shift += 2;\n }\n }\n\n if (position >= 0) {\n res[position--] = carry;\n\n while (position >= 0) {\n res[position--] = 0;\n }\n }\n };\n\n if (Math.clz32) {\n BN.prototype._countBits = function _countBits (w) {\n return 32 - Math.clz32(w);\n };\n } else {\n BN.prototype._countBits = function _countBits (w) {\n var t = w;\n var r = 0;\n if (t >= 0x1000) {\n r += 13;\n t >>>= 13;\n }\n if (t >= 0x40) {\n r += 7;\n t >>>= 7;\n }\n if (t >= 0x8) {\n r += 4;\n t >>>= 4;\n }\n if (t >= 0x02) {\n r += 2;\n t >>>= 2;\n }\n return r + t;\n };\n }\n\n BN.prototype._zeroBits = function _zeroBits (w) {\n // Short-cut\n if (w === 0) return 26;\n\n var t = w;\n var r = 0;\n if ((t & 0x1fff) === 0) {\n r += 13;\n t >>>= 13;\n }\n if ((t & 0x7f) === 0) {\n r += 7;\n t >>>= 7;\n }\n if ((t & 0xf) === 0) {\n r += 4;\n t >>>= 4;\n }\n if ((t & 0x3) === 0) {\n r += 2;\n t >>>= 2;\n }\n if ((t & 0x1) === 0) {\n r++;\n }\n return r;\n };\n\n // Return number of used bits in a BN\n BN.prototype.bitLength = function bitLength () {\n var w = this.words[this.length - 1];\n var hi = this._countBits(w);\n return (this.length - 1) * 26 + hi;\n };\n\n function toBitArray (num) {\n var w = new Array(num.bitLength());\n\n for (var bit = 0; bit < w.length; bit++) {\n var off = (bit / 26) | 0;\n var wbit = bit % 26;\n\n w[bit] = (num.words[off] >>> wbit) & 0x01;\n }\n\n return w;\n }\n\n // Number of trailing zero bits\n BN.prototype.zeroBits = function zeroBits () {\n if (this.isZero()) return 0;\n\n var r = 0;\n for (var i = 0; i < this.length; i++) {\n var b = this._zeroBits(this.words[i]);\n r += b;\n if (b !== 26) break;\n }\n return r;\n };\n\n BN.prototype.byteLength = function byteLength () {\n return Math.ceil(this.bitLength() / 8);\n };\n\n BN.prototype.toTwos = function toTwos (width) {\n if (this.negative !== 0) {\n return this.abs().inotn(width).iaddn(1);\n }\n return this.clone();\n };\n\n BN.prototype.fromTwos = function fromTwos (width) {\n if (this.testn(width - 1)) {\n return this.notn(width).iaddn(1).ineg();\n }\n return this.clone();\n };\n\n BN.prototype.isNeg = function isNeg () {\n return this.negative !== 0;\n };\n\n // Return negative clone of `this`\n BN.prototype.neg = function neg () {\n return this.clone().ineg();\n };\n\n BN.prototype.ineg = function ineg () {\n if (!this.isZero()) {\n this.negative ^= 1;\n }\n\n return this;\n };\n\n // Or `num` with `this` in-place\n BN.prototype.iuor = function iuor (num) {\n while (this.length < num.length) {\n this.words[this.length++] = 0;\n }\n\n for (var i = 0; i < num.length; i++) {\n this.words[i] = this.words[i] | num.words[i];\n }\n\n return this._strip();\n };\n\n BN.prototype.ior = function ior (num) {\n assert((this.negative | num.negative) === 0);\n return this.iuor(num);\n };\n\n // Or `num` with `this`\n BN.prototype.or = function or (num) {\n if (this.length > num.length) return this.clone().ior(num);\n return num.clone().ior(this);\n };\n\n BN.prototype.uor = function uor (num) {\n if (this.length > num.length) return this.clone().iuor(num);\n return num.clone().iuor(this);\n };\n\n // And `num` with `this` in-place\n BN.prototype.iuand = function iuand (num) {\n // b = min-length(num, this)\n var b;\n if (this.length > num.length) {\n b = num;\n } else {\n b = this;\n }\n\n for (var i = 0; i < b.length; i++) {\n this.words[i] = this.words[i] & num.words[i];\n }\n\n this.length = b.length;\n\n return this._strip();\n };\n\n BN.prototype.iand = function iand (num) {\n assert((this.negative | num.negative) === 0);\n return this.iuand(num);\n };\n\n // And `num` with `this`\n BN.prototype.and = function and (num) {\n if (this.length > num.length) return this.clone().iand(num);\n return num.clone().iand(this);\n };\n\n BN.prototype.uand = function uand (num) {\n if (this.length > num.length) return this.clone().iuand(num);\n return num.clone().iuand(this);\n };\n\n // Xor `num` with `this` in-place\n BN.prototype.iuxor = function iuxor (num) {\n // a.length > b.length\n var a;\n var b;\n if (this.length > num.length) {\n a = this;\n b = num;\n } else {\n a = num;\n b = this;\n }\n\n for (var i = 0; i < b.length; i++) {\n this.words[i] = a.words[i] ^ b.words[i];\n }\n\n if (this !== a) {\n for (; i < a.length; i++) {\n this.words[i] = a.words[i];\n }\n }\n\n this.length = a.length;\n\n return this._strip();\n };\n\n BN.prototype.ixor = function ixor (num) {\n assert((this.negative | num.negative) === 0);\n return this.iuxor(num);\n };\n\n // Xor `num` with `this`\n BN.prototype.xor = function xor (num) {\n if (this.length > num.length) return this.clone().ixor(num);\n return num.clone().ixor(this);\n };\n\n BN.prototype.uxor = function uxor (num) {\n if (this.length > num.length) return this.clone().iuxor(num);\n return num.clone().iuxor(this);\n };\n\n // Not ``this`` with ``width`` bitwidth\n BN.prototype.inotn = function inotn (width) {\n assert(typeof width === 'number' && width >= 0);\n\n var bytesNeeded = Math.ceil(width / 26) | 0;\n var bitsLeft = width % 26;\n\n // Extend the buffer with leading zeroes\n this._expand(bytesNeeded);\n\n if (bitsLeft > 0) {\n bytesNeeded--;\n }\n\n // Handle complete words\n for (var i = 0; i < bytesNeeded; i++) {\n this.words[i] = ~this.words[i] & 0x3ffffff;\n }\n\n // Handle the residue\n if (bitsLeft > 0) {\n this.words[i] = ~this.words[i] & (0x3ffffff >> (26 - bitsLeft));\n }\n\n // And remove leading zeroes\n return this._strip();\n };\n\n BN.prototype.notn = function notn (width) {\n return this.clone().inotn(width);\n };\n\n // Set `bit` of `this`\n BN.prototype.setn = function setn (bit, val) {\n assert(typeof bit === 'number' && bit >= 0);\n\n var off = (bit / 26) | 0;\n var wbit = bit % 26;\n\n this._expand(off + 1);\n\n if (val) {\n this.words[off] = this.words[off] | (1 << wbit);\n } else {\n this.words[off] = this.words[off] & ~(1 << wbit);\n }\n\n return this._strip();\n };\n\n // Add `num` to `this` in-place\n BN.prototype.iadd = function iadd (num) {\n var r;\n\n // negative + positive\n if (this.negative !== 0 && num.negative === 0) {\n this.negative = 0;\n r = this.isub(num);\n this.negative ^= 1;\n return this._normSign();\n\n // positive + negative\n } else if (this.negative === 0 && num.negative !== 0) {\n num.negative = 0;\n r = this.isub(num);\n num.negative = 1;\n return r._normSign();\n }\n\n // a.length > b.length\n var a, b;\n if (this.length > num.length) {\n a = this;\n b = num;\n } else {\n a = num;\n b = this;\n }\n\n var carry = 0;\n for (var i = 0; i < b.length; i++) {\n r = (a.words[i] | 0) + (b.words[i] | 0) + carry;\n this.words[i] = r & 0x3ffffff;\n carry = r >>> 26;\n }\n for (; carry !== 0 && i < a.length; i++) {\n r = (a.words[i] | 0) + carry;\n this.words[i] = r & 0x3ffffff;\n carry = r >>> 26;\n }\n\n this.length = a.length;\n if (carry !== 0) {\n this.words[this.length] = carry;\n this.length++;\n // Copy the rest of the words\n } else if (a !== this) {\n for (; i < a.length; i++) {\n this.words[i] = a.words[i];\n }\n }\n\n return this;\n };\n\n // Add `num` to `this`\n BN.prototype.add = function add (num) {\n var res;\n if (num.negative !== 0 && this.negative === 0) {\n num.negative = 0;\n res = this.sub(num);\n num.negative ^= 1;\n return res;\n } else if (num.negative === 0 && this.negative !== 0) {\n this.negative = 0;\n res = num.sub(this);\n this.negative = 1;\n return res;\n }\n\n if (this.length > num.length) return this.clone().iadd(num);\n\n return num.clone().iadd(this);\n };\n\n // Subtract `num` from `this` in-place\n BN.prototype.isub = function isub (num) {\n // this - (-num) = this + num\n if (num.negative !== 0) {\n num.negative = 0;\n var r = this.iadd(num);\n num.negative = 1;\n return r._normSign();\n\n // -this - num = -(this + num)\n } else if (this.negative !== 0) {\n this.negative = 0;\n this.iadd(num);\n this.negative = 1;\n return this._normSign();\n }\n\n // At this point both numbers are positive\n var cmp = this.cmp(num);\n\n // Optimization - zeroify\n if (cmp === 0) {\n this.negative = 0;\n this.length = 1;\n this.words[0] = 0;\n return this;\n }\n\n // a > b\n var a, b;\n if (cmp > 0) {\n a = this;\n b = num;\n } else {\n a = num;\n b = this;\n }\n\n var carry = 0;\n for (var i = 0; i < b.length; i++) {\n r = (a.words[i] | 0) - (b.words[i] | 0) + carry;\n carry = r >> 26;\n this.words[i] = r & 0x3ffffff;\n }\n for (; carry !== 0 && i < a.length; i++) {\n r = (a.words[i] | 0) + carry;\n carry = r >> 26;\n this.words[i] = r & 0x3ffffff;\n }\n\n // Copy rest of the words\n if (carry === 0 && i < a.length && a !== this) {\n for (; i < a.length; i++) {\n this.words[i] = a.words[i];\n }\n }\n\n this.length = Math.max(this.length, i);\n\n if (a !== this) {\n this.negative = 1;\n }\n\n return this._strip();\n };\n\n // Subtract `num` from `this`\n BN.prototype.sub = function sub (num) {\n return this.clone().isub(num);\n };\n\n function smallMulTo (self, num, out) {\n out.negative = num.negative ^ self.negative;\n var len = (self.length + num.length) | 0;\n out.length = len;\n len = (len - 1) | 0;\n\n // Peel one iteration (compiler can't do it, because of code complexity)\n var a = self.words[0] | 0;\n var b = num.words[0] | 0;\n var r = a * b;\n\n var lo = r & 0x3ffffff;\n var carry = (r / 0x4000000) | 0;\n out.words[0] = lo;\n\n for (var k = 1; k < len; k++) {\n // Sum all words with the same `i + j = k` and accumulate `ncarry`,\n // note that ncarry could be >= 0x3ffffff\n var ncarry = carry >>> 26;\n var rword = carry & 0x3ffffff;\n var maxJ = Math.min(k, num.length - 1);\n for (var j = Math.max(0, k - self.length + 1); j <= maxJ; j++) {\n var i = (k - j) | 0;\n a = self.words[i] | 0;\n b = num.words[j] | 0;\n r = a * b + rword;\n ncarry += (r / 0x4000000) | 0;\n rword = r & 0x3ffffff;\n }\n out.words[k] = rword | 0;\n carry = ncarry | 0;\n }\n if (carry !== 0) {\n out.words[k] = carry | 0;\n } else {\n out.length--;\n }\n\n return out._strip();\n }\n\n // TODO(indutny): it may be reasonable to omit it for users who don't need\n // to work with 256-bit numbers, otherwise it gives 20% improvement for 256-bit\n // multiplication (like elliptic secp256k1).\n var comb10MulTo = function comb10MulTo (self, num, out) {\n var a = self.words;\n var b = num.words;\n var o = out.words;\n var c = 0;\n var lo;\n var mid;\n var hi;\n var a0 = a[0] | 0;\n var al0 = a0 & 0x1fff;\n var ah0 = a0 >>> 13;\n var a1 = a[1] | 0;\n var al1 = a1 & 0x1fff;\n var ah1 = a1 >>> 13;\n var a2 = a[2] | 0;\n var al2 = a2 & 0x1fff;\n var ah2 = a2 >>> 13;\n var a3 = a[3] | 0;\n var al3 = a3 & 0x1fff;\n var ah3 = a3 >>> 13;\n var a4 = a[4] | 0;\n var al4 = a4 & 0x1fff;\n var ah4 = a4 >>> 13;\n var a5 = a[5] | 0;\n var al5 = a5 & 0x1fff;\n var ah5 = a5 >>> 13;\n var a6 = a[6] | 0;\n var al6 = a6 & 0x1fff;\n var ah6 = a6 >>> 13;\n var a7 = a[7] | 0;\n var al7 = a7 & 0x1fff;\n var ah7 = a7 >>> 13;\n var a8 = a[8] | 0;\n var al8 = a8 & 0x1fff;\n var ah8 = a8 >>> 13;\n var a9 = a[9] | 0;\n var al9 = a9 & 0x1fff;\n var ah9 = a9 >>> 13;\n var b0 = b[0] | 0;\n var bl0 = b0 & 0x1fff;\n var bh0 = b0 >>> 13;\n var b1 = b[1] | 0;\n var bl1 = b1 & 0x1fff;\n var bh1 = b1 >>> 13;\n var b2 = b[2] | 0;\n var bl2 = b2 & 0x1fff;\n var bh2 = b2 >>> 13;\n var b3 = b[3] | 0;\n var bl3 = b3 & 0x1fff;\n var bh3 = b3 >>> 13;\n var b4 = b[4] | 0;\n var bl4 = b4 & 0x1fff;\n var bh4 = b4 >>> 13;\n var b5 = b[5] | 0;\n var bl5 = b5 & 0x1fff;\n var bh5 = b5 >>> 13;\n var b6 = b[6] | 0;\n var bl6 = b6 & 0x1fff;\n var bh6 = b6 >>> 13;\n var b7 = b[7] | 0;\n var bl7 = b7 & 0x1fff;\n var bh7 = b7 >>> 13;\n var b8 = b[8] | 0;\n var bl8 = b8 & 0x1fff;\n var bh8 = b8 >>> 13;\n var b9 = b[9] | 0;\n var bl9 = b9 & 0x1fff;\n var bh9 = b9 >>> 13;\n\n out.negative = self.negative ^ num.negative;\n out.length = 19;\n /* k = 0 */\n lo = Math.imul(al0, bl0);\n mid = Math.imul(al0, bh0);\n mid = (mid + Math.imul(ah0, bl0)) | 0;\n hi = Math.imul(ah0, bh0);\n var w0 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w0 >>> 26)) | 0;\n w0 &= 0x3ffffff;\n /* k = 1 */\n lo = Math.imul(al1, bl0);\n mid = Math.imul(al1, bh0);\n mid = (mid + Math.imul(ah1, bl0)) | 0;\n hi = Math.imul(ah1, bh0);\n lo = (lo + Math.imul(al0, bl1)) | 0;\n mid = (mid + Math.imul(al0, bh1)) | 0;\n mid = (mid + Math.imul(ah0, bl1)) | 0;\n hi = (hi + Math.imul(ah0, bh1)) | 0;\n var w1 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w1 >>> 26)) | 0;\n w1 &= 0x3ffffff;\n /* k = 2 */\n lo = Math.imul(al2, bl0);\n mid = Math.imul(al2, bh0);\n mid = (mid + Math.imul(ah2, bl0)) | 0;\n hi = Math.imul(ah2, bh0);\n lo = (lo + Math.imul(al1, bl1)) | 0;\n mid = (mid + Math.imul(al1, bh1)) | 0;\n mid = (mid + Math.imul(ah1, bl1)) | 0;\n hi = (hi + Math.imul(ah1, bh1)) | 0;\n lo = (lo + Math.imul(al0, bl2)) | 0;\n mid = (mid + Math.imul(al0, bh2)) | 0;\n mid = (mid + Math.imul(ah0, bl2)) | 0;\n hi = (hi + Math.imul(ah0, bh2)) | 0;\n var w2 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w2 >>> 26)) | 0;\n w2 &= 0x3ffffff;\n /* k = 3 */\n lo = Math.imul(al3, bl0);\n mid = Math.imul(al3, bh0);\n mid = (mid + Math.imul(ah3, bl0)) | 0;\n hi = Math.imul(ah3, bh0);\n lo = (lo + Math.imul(al2, bl1)) | 0;\n mid = (mid + Math.imul(al2, bh1)) | 0;\n mid = (mid + Math.imul(ah2, bl1)) | 0;\n hi = (hi + Math.imul(ah2, bh1)) | 0;\n lo = (lo + Math.imul(al1, bl2)) | 0;\n mid = (mid + Math.imul(al1, bh2)) | 0;\n mid = (mid + Math.imul(ah1, bl2)) | 0;\n hi = (hi + Math.imul(ah1, bh2)) | 0;\n lo = (lo + Math.imul(al0, bl3)) | 0;\n mid = (mid + Math.imul(al0, bh3)) | 0;\n mid = (mid + Math.imul(ah0, bl3)) | 0;\n hi = (hi + Math.imul(ah0, bh3)) | 0;\n var w3 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w3 >>> 26)) | 0;\n w3 &= 0x3ffffff;\n /* k = 4 */\n lo = Math.imul(al4, bl0);\n mid = Math.imul(al4, bh0);\n mid = (mid + Math.imul(ah4, bl0)) | 0;\n hi = Math.imul(ah4, bh0);\n lo = (lo + Math.imul(al3, bl1)) | 0;\n mid = (mid + Math.imul(al3, bh1)) | 0;\n mid = (mid + Math.imul(ah3, bl1)) | 0;\n hi = (hi + Math.imul(ah3, bh1)) | 0;\n lo = (lo + Math.imul(al2, bl2)) | 0;\n mid = (mid + Math.imul(al2, bh2)) | 0;\n mid = (mid + Math.imul(ah2, bl2)) | 0;\n hi = (hi + Math.imul(ah2, bh2)) | 0;\n lo = (lo + Math.imul(al1, bl3)) | 0;\n mid = (mid + Math.imul(al1, bh3)) | 0;\n mid = (mid + Math.imul(ah1, bl3)) | 0;\n hi = (hi + Math.imul(ah1, bh3)) | 0;\n lo = (lo + Math.imul(al0, bl4)) | 0;\n mid = (mid + Math.imul(al0, bh4)) | 0;\n mid = (mid + Math.imul(ah0, bl4)) | 0;\n hi = (hi + Math.imul(ah0, bh4)) | 0;\n var w4 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w4 >>> 26)) | 0;\n w4 &= 0x3ffffff;\n /* k = 5 */\n lo = Math.imul(al5, bl0);\n mid = Math.imul(al5, bh0);\n mid = (mid + Math.imul(ah5, bl0)) | 0;\n hi = Math.imul(ah5, bh0);\n lo = (lo + Math.imul(al4, bl1)) | 0;\n mid = (mid + Math.imul(al4, bh1)) | 0;\n mid = (mid + Math.imul(ah4, bl1)) | 0;\n hi = (hi + Math.imul(ah4, bh1)) | 0;\n lo = (lo + Math.imul(al3, bl2)) | 0;\n mid = (mid + Math.imul(al3, bh2)) | 0;\n mid = (mid + Math.imul(ah3, bl2)) | 0;\n hi = (hi + Math.imul(ah3, bh2)) | 0;\n lo = (lo + Math.imul(al2, bl3)) | 0;\n mid = (mid + Math.imul(al2, bh3)) | 0;\n mid = (mid + Math.imul(ah2, bl3)) | 0;\n hi = (hi + Math.imul(ah2, bh3)) | 0;\n lo = (lo + Math.imul(al1, bl4)) | 0;\n mid = (mid + Math.imul(al1, bh4)) | 0;\n mid = (mid + Math.imul(ah1, bl4)) | 0;\n hi = (hi + Math.imul(ah1, bh4)) | 0;\n lo = (lo + Math.imul(al0, bl5)) | 0;\n mid = (mid + Math.imul(al0, bh5)) | 0;\n mid = (mid + Math.imul(ah0, bl5)) | 0;\n hi = (hi + Math.imul(ah0, bh5)) | 0;\n var w5 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w5 >>> 26)) | 0;\n w5 &= 0x3ffffff;\n /* k = 6 */\n lo = Math.imul(al6, bl0);\n mid = Math.imul(al6, bh0);\n mid = (mid + Math.imul(ah6, bl0)) | 0;\n hi = Math.imul(ah6, bh0);\n lo = (lo + Math.imul(al5, bl1)) | 0;\n mid = (mid + Math.imul(al5, bh1)) | 0;\n mid = (mid + Math.imul(ah5, bl1)) | 0;\n hi = (hi + Math.imul(ah5, bh1)) | 0;\n lo = (lo + Math.imul(al4, bl2)) | 0;\n mid = (mid + Math.imul(al4, bh2)) | 0;\n mid = (mid + Math.imul(ah4, bl2)) | 0;\n hi = (hi + Math.imul(ah4, bh2)) | 0;\n lo = (lo + Math.imul(al3, bl3)) | 0;\n mid = (mid + Math.imul(al3, bh3)) | 0;\n mid = (mid + Math.imul(ah3, bl3)) | 0;\n hi = (hi + Math.imul(ah3, bh3)) | 0;\n lo = (lo + Math.imul(al2, bl4)) | 0;\n mid = (mid + Math.imul(al2, bh4)) | 0;\n mid = (mid + Math.imul(ah2, bl4)) | 0;\n hi = (hi + Math.imul(ah2, bh4)) | 0;\n lo = (lo + Math.imul(al1, bl5)) | 0;\n mid = (mid + Math.imul(al1, bh5)) | 0;\n mid = (mid + Math.imul(ah1, bl5)) | 0;\n hi = (hi + Math.imul(ah1, bh5)) | 0;\n lo = (lo + Math.imul(al0, bl6)) | 0;\n mid = (mid + Math.imul(al0, bh6)) | 0;\n mid = (mid + Math.imul(ah0, bl6)) | 0;\n hi = (hi + Math.imul(ah0, bh6)) | 0;\n var w6 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w6 >>> 26)) | 0;\n w6 &= 0x3ffffff;\n /* k = 7 */\n lo = Math.imul(al7, bl0);\n mid = Math.imul(al7, bh0);\n mid = (mid + Math.imul(ah7, bl0)) | 0;\n hi = Math.imul(ah7, bh0);\n lo = (lo + Math.imul(al6, bl1)) | 0;\n mid = (mid + Math.imul(al6, bh1)) | 0;\n mid = (mid + Math.imul(ah6, bl1)) | 0;\n hi = (hi + Math.imul(ah6, bh1)) | 0;\n lo = (lo + Math.imul(al5, bl2)) | 0;\n mid = (mid + Math.imul(al5, bh2)) | 0;\n mid = (mid + Math.imul(ah5, bl2)) | 0;\n hi = (hi + Math.imul(ah5, bh2)) | 0;\n lo = (lo + Math.imul(al4, bl3)) | 0;\n mid = (mid + Math.imul(al4, bh3)) | 0;\n mid = (mid + Math.imul(ah4, bl3)) | 0;\n hi = (hi + Math.imul(ah4, bh3)) | 0;\n lo = (lo + Math.imul(al3, bl4)) | 0;\n mid = (mid + Math.imul(al3, bh4)) | 0;\n mid = (mid + Math.imul(ah3, bl4)) | 0;\n hi = (hi + Math.imul(ah3, bh4)) | 0;\n lo = (lo + Math.imul(al2, bl5)) | 0;\n mid = (mid + Math.imul(al2, bh5)) | 0;\n mid = (mid + Math.imul(ah2, bl5)) | 0;\n hi = (hi + Math.imul(ah2, bh5)) | 0;\n lo = (lo + Math.imul(al1, bl6)) | 0;\n mid = (mid + Math.imul(al1, bh6)) | 0;\n mid = (mid + Math.imul(ah1, bl6)) | 0;\n hi = (hi + Math.imul(ah1, bh6)) | 0;\n lo = (lo + Math.imul(al0, bl7)) | 0;\n mid = (mid + Math.imul(al0, bh7)) | 0;\n mid = (mid + Math.imul(ah0, bl7)) | 0;\n hi = (hi + Math.imul(ah0, bh7)) | 0;\n var w7 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w7 >>> 26)) | 0;\n w7 &= 0x3ffffff;\n /* k = 8 */\n lo = Math.imul(al8, bl0);\n mid = Math.imul(al8, bh0);\n mid = (mid + Math.imul(ah8, bl0)) | 0;\n hi = Math.imul(ah8, bh0);\n lo = (lo + Math.imul(al7, bl1)) | 0;\n mid = (mid + Math.imul(al7, bh1)) | 0;\n mid = (mid + Math.imul(ah7, bl1)) | 0;\n hi = (hi + Math.imul(ah7, bh1)) | 0;\n lo = (lo + Math.imul(al6, bl2)) | 0;\n mid = (mid + Math.imul(al6, bh2)) | 0;\n mid = (mid + Math.imul(ah6, bl2)) | 0;\n hi = (hi + Math.imul(ah6, bh2)) | 0;\n lo = (lo + Math.imul(al5, bl3)) | 0;\n mid = (mid + Math.imul(al5, bh3)) | 0;\n mid = (mid + Math.imul(ah5, bl3)) | 0;\n hi = (hi + Math.imul(ah5, bh3)) | 0;\n lo = (lo + Math.imul(al4, bl4)) | 0;\n mid = (mid + Math.imul(al4, bh4)) | 0;\n mid = (mid + Math.imul(ah4, bl4)) | 0;\n hi = (hi + Math.imul(ah4, bh4)) | 0;\n lo = (lo + Math.imul(al3, bl5)) | 0;\n mid = (mid + Math.imul(al3, bh5)) | 0;\n mid = (mid + Math.imul(ah3, bl5)) | 0;\n hi = (hi + Math.imul(ah3, bh5)) | 0;\n lo = (lo + Math.imul(al2, bl6)) | 0;\n mid = (mid + Math.imul(al2, bh6)) | 0;\n mid = (mid + Math.imul(ah2, bl6)) | 0;\n hi = (hi + Math.imul(ah2, bh6)) | 0;\n lo = (lo + Math.imul(al1, bl7)) | 0;\n mid = (mid + Math.imul(al1, bh7)) | 0;\n mid = (mid + Math.imul(ah1, bl7)) | 0;\n hi = (hi + Math.imul(ah1, bh7)) | 0;\n lo = (lo + Math.imul(al0, bl8)) | 0;\n mid = (mid + Math.imul(al0, bh8)) | 0;\n mid = (mid + Math.imul(ah0, bl8)) | 0;\n hi = (hi + Math.imul(ah0, bh8)) | 0;\n var w8 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w8 >>> 26)) | 0;\n w8 &= 0x3ffffff;\n /* k = 9 */\n lo = Math.imul(al9, bl0);\n mid = Math.imul(al9, bh0);\n mid = (mid + Math.imul(ah9, bl0)) | 0;\n hi = Math.imul(ah9, bh0);\n lo = (lo + Math.imul(al8, bl1)) | 0;\n mid = (mid + Math.imul(al8, bh1)) | 0;\n mid = (mid + Math.imul(ah8, bl1)) | 0;\n hi = (hi + Math.imul(ah8, bh1)) | 0;\n lo = (lo + Math.imul(al7, bl2)) | 0;\n mid = (mid + Math.imul(al7, bh2)) | 0;\n mid = (mid + Math.imul(ah7, bl2)) | 0;\n hi = (hi + Math.imul(ah7, bh2)) | 0;\n lo = (lo + Math.imul(al6, bl3)) | 0;\n mid = (mid + Math.imul(al6, bh3)) | 0;\n mid = (mid + Math.imul(ah6, bl3)) | 0;\n hi = (hi + Math.imul(ah6, bh3)) | 0;\n lo = (lo + Math.imul(al5, bl4)) | 0;\n mid = (mid + Math.imul(al5, bh4)) | 0;\n mid = (mid + Math.imul(ah5, bl4)) | 0;\n hi = (hi + Math.imul(ah5, bh4)) | 0;\n lo = (lo + Math.imul(al4, bl5)) | 0;\n mid = (mid + Math.imul(al4, bh5)) | 0;\n mid = (mid + Math.imul(ah4, bl5)) | 0;\n hi = (hi + Math.imul(ah4, bh5)) | 0;\n lo = (lo + Math.imul(al3, bl6)) | 0;\n mid = (mid + Math.imul(al3, bh6)) | 0;\n mid = (mid + Math.imul(ah3, bl6)) | 0;\n hi = (hi + Math.imul(ah3, bh6)) | 0;\n lo = (lo + Math.imul(al2, bl7)) | 0;\n mid = (mid + Math.imul(al2, bh7)) | 0;\n mid = (mid + Math.imul(ah2, bl7)) | 0;\n hi = (hi + Math.imul(ah2, bh7)) | 0;\n lo = (lo + Math.imul(al1, bl8)) | 0;\n mid = (mid + Math.imul(al1, bh8)) | 0;\n mid = (mid + Math.imul(ah1, bl8)) | 0;\n hi = (hi + Math.imul(ah1, bh8)) | 0;\n lo = (lo + Math.imul(al0, bl9)) | 0;\n mid = (mid + Math.imul(al0, bh9)) | 0;\n mid = (mid + Math.imul(ah0, bl9)) | 0;\n hi = (hi + Math.imul(ah0, bh9)) | 0;\n var w9 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w9 >>> 26)) | 0;\n w9 &= 0x3ffffff;\n /* k = 10 */\n lo = Math.imul(al9, bl1);\n mid = Math.imul(al9, bh1);\n mid = (mid + Math.imul(ah9, bl1)) | 0;\n hi = Math.imul(ah9, bh1);\n lo = (lo + Math.imul(al8, bl2)) | 0;\n mid = (mid + Math.imul(al8, bh2)) | 0;\n mid = (mid + Math.imul(ah8, bl2)) | 0;\n hi = (hi + Math.imul(ah8, bh2)) | 0;\n lo = (lo + Math.imul(al7, bl3)) | 0;\n mid = (mid + Math.imul(al7, bh3)) | 0;\n mid = (mid + Math.imul(ah7, bl3)) | 0;\n hi = (hi + Math.imul(ah7, bh3)) | 0;\n lo = (lo + Math.imul(al6, bl4)) | 0;\n mid = (mid + Math.imul(al6, bh4)) | 0;\n mid = (mid + Math.imul(ah6, bl4)) | 0;\n hi = (hi + Math.imul(ah6, bh4)) | 0;\n lo = (lo + Math.imul(al5, bl5)) | 0;\n mid = (mid + Math.imul(al5, bh5)) | 0;\n mid = (mid + Math.imul(ah5, bl5)) | 0;\n hi = (hi + Math.imul(ah5, bh5)) | 0;\n lo = (lo + Math.imul(al4, bl6)) | 0;\n mid = (mid + Math.imul(al4, bh6)) | 0;\n mid = (mid + Math.imul(ah4, bl6)) | 0;\n hi = (hi + Math.imul(ah4, bh6)) | 0;\n lo = (lo + Math.imul(al3, bl7)) | 0;\n mid = (mid + Math.imul(al3, bh7)) | 0;\n mid = (mid + Math.imul(ah3, bl7)) | 0;\n hi = (hi + Math.imul(ah3, bh7)) | 0;\n lo = (lo + Math.imul(al2, bl8)) | 0;\n mid = (mid + Math.imul(al2, bh8)) | 0;\n mid = (mid + Math.imul(ah2, bl8)) | 0;\n hi = (hi + Math.imul(ah2, bh8)) | 0;\n lo = (lo + Math.imul(al1, bl9)) | 0;\n mid = (mid + Math.imul(al1, bh9)) | 0;\n mid = (mid + Math.imul(ah1, bl9)) | 0;\n hi = (hi + Math.imul(ah1, bh9)) | 0;\n var w10 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w10 >>> 26)) | 0;\n w10 &= 0x3ffffff;\n /* k = 11 */\n lo = Math.imul(al9, bl2);\n mid = Math.imul(al9, bh2);\n mid = (mid + Math.imul(ah9, bl2)) | 0;\n hi = Math.imul(ah9, bh2);\n lo = (lo + Math.imul(al8, bl3)) | 0;\n mid = (mid + Math.imul(al8, bh3)) | 0;\n mid = (mid + Math.imul(ah8, bl3)) | 0;\n hi = (hi + Math.imul(ah8, bh3)) | 0;\n lo = (lo + Math.imul(al7, bl4)) | 0;\n mid = (mid + Math.imul(al7, bh4)) | 0;\n mid = (mid + Math.imul(ah7, bl4)) | 0;\n hi = (hi + Math.imul(ah7, bh4)) | 0;\n lo = (lo + Math.imul(al6, bl5)) | 0;\n mid = (mid + Math.imul(al6, bh5)) | 0;\n mid = (mid + Math.imul(ah6, bl5)) | 0;\n hi = (hi + Math.imul(ah6, bh5)) | 0;\n lo = (lo + Math.imul(al5, bl6)) | 0;\n mid = (mid + Math.imul(al5, bh6)) | 0;\n mid = (mid + Math.imul(ah5, bl6)) | 0;\n hi = (hi + Math.imul(ah5, bh6)) | 0;\n lo = (lo + Math.imul(al4, bl7)) | 0;\n mid = (mid + Math.imul(al4, bh7)) | 0;\n mid = (mid + Math.imul(ah4, bl7)) | 0;\n hi = (hi + Math.imul(ah4, bh7)) | 0;\n lo = (lo + Math.imul(al3, bl8)) | 0;\n mid = (mid + Math.imul(al3, bh8)) | 0;\n mid = (mid + Math.imul(ah3, bl8)) | 0;\n hi = (hi + Math.imul(ah3, bh8)) | 0;\n lo = (lo + Math.imul(al2, bl9)) | 0;\n mid = (mid + Math.imul(al2, bh9)) | 0;\n mid = (mid + Math.imul(ah2, bl9)) | 0;\n hi = (hi + Math.imul(ah2, bh9)) | 0;\n var w11 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w11 >>> 26)) | 0;\n w11 &= 0x3ffffff;\n /* k = 12 */\n lo = Math.imul(al9, bl3);\n mid = Math.imul(al9, bh3);\n mid = (mid + Math.imul(ah9, bl3)) | 0;\n hi = Math.imul(ah9, bh3);\n lo = (lo + Math.imul(al8, bl4)) | 0;\n mid = (mid + Math.imul(al8, bh4)) | 0;\n mid = (mid + Math.imul(ah8, bl4)) | 0;\n hi = (hi + Math.imul(ah8, bh4)) | 0;\n lo = (lo + Math.imul(al7, bl5)) | 0;\n mid = (mid + Math.imul(al7, bh5)) | 0;\n mid = (mid + Math.imul(ah7, bl5)) | 0;\n hi = (hi + Math.imul(ah7, bh5)) | 0;\n lo = (lo + Math.imul(al6, bl6)) | 0;\n mid = (mid + Math.imul(al6, bh6)) | 0;\n mid = (mid + Math.imul(ah6, bl6)) | 0;\n hi = (hi + Math.imul(ah6, bh6)) | 0;\n lo = (lo + Math.imul(al5, bl7)) | 0;\n mid = (mid + Math.imul(al5, bh7)) | 0;\n mid = (mid + Math.imul(ah5, bl7)) | 0;\n hi = (hi + Math.imul(ah5, bh7)) | 0;\n lo = (lo + Math.imul(al4, bl8)) | 0;\n mid = (mid + Math.imul(al4, bh8)) | 0;\n mid = (mid + Math.imul(ah4, bl8)) | 0;\n hi = (hi + Math.imul(ah4, bh8)) | 0;\n lo = (lo + Math.imul(al3, bl9)) | 0;\n mid = (mid + Math.imul(al3, bh9)) | 0;\n mid = (mid + Math.imul(ah3, bl9)) | 0;\n hi = (hi + Math.imul(ah3, bh9)) | 0;\n var w12 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w12 >>> 26)) | 0;\n w12 &= 0x3ffffff;\n /* k = 13 */\n lo = Math.imul(al9, bl4);\n mid = Math.imul(al9, bh4);\n mid = (mid + Math.imul(ah9, bl4)) | 0;\n hi = Math.imul(ah9, bh4);\n lo = (lo + Math.imul(al8, bl5)) | 0;\n mid = (mid + Math.imul(al8, bh5)) | 0;\n mid = (mid + Math.imul(ah8, bl5)) | 0;\n hi = (hi + Math.imul(ah8, bh5)) | 0;\n lo = (lo + Math.imul(al7, bl6)) | 0;\n mid = (mid + Math.imul(al7, bh6)) | 0;\n mid = (mid + Math.imul(ah7, bl6)) | 0;\n hi = (hi + Math.imul(ah7, bh6)) | 0;\n lo = (lo + Math.imul(al6, bl7)) | 0;\n mid = (mid + Math.imul(al6, bh7)) | 0;\n mid = (mid + Math.imul(ah6, bl7)) | 0;\n hi = (hi + Math.imul(ah6, bh7)) | 0;\n lo = (lo + Math.imul(al5, bl8)) | 0;\n mid = (mid + Math.imul(al5, bh8)) | 0;\n mid = (mid + Math.imul(ah5, bl8)) | 0;\n hi = (hi + Math.imul(ah5, bh8)) | 0;\n lo = (lo + Math.imul(al4, bl9)) | 0;\n mid = (mid + Math.imul(al4, bh9)) | 0;\n mid = (mid + Math.imul(ah4, bl9)) | 0;\n hi = (hi + Math.imul(ah4, bh9)) | 0;\n var w13 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w13 >>> 26)) | 0;\n w13 &= 0x3ffffff;\n /* k = 14 */\n lo = Math.imul(al9, bl5);\n mid = Math.imul(al9, bh5);\n mid = (mid + Math.imul(ah9, bl5)) | 0;\n hi = Math.imul(ah9, bh5);\n lo = (lo + Math.imul(al8, bl6)) | 0;\n mid = (mid + Math.imul(al8, bh6)) | 0;\n mid = (mid + Math.imul(ah8, bl6)) | 0;\n hi = (hi + Math.imul(ah8, bh6)) | 0;\n lo = (lo + Math.imul(al7, bl7)) | 0;\n mid = (mid + Math.imul(al7, bh7)) | 0;\n mid = (mid + Math.imul(ah7, bl7)) | 0;\n hi = (hi + Math.imul(ah7, bh7)) | 0;\n lo = (lo + Math.imul(al6, bl8)) | 0;\n mid = (mid + Math.imul(al6, bh8)) | 0;\n mid = (mid + Math.imul(ah6, bl8)) | 0;\n hi = (hi + Math.imul(ah6, bh8)) | 0;\n lo = (lo + Math.imul(al5, bl9)) | 0;\n mid = (mid + Math.imul(al5, bh9)) | 0;\n mid = (mid + Math.imul(ah5, bl9)) | 0;\n hi = (hi + Math.imul(ah5, bh9)) | 0;\n var w14 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w14 >>> 26)) | 0;\n w14 &= 0x3ffffff;\n /* k = 15 */\n lo = Math.imul(al9, bl6);\n mid = Math.imul(al9, bh6);\n mid = (mid + Math.imul(ah9, bl6)) | 0;\n hi = Math.imul(ah9, bh6);\n lo = (lo + Math.imul(al8, bl7)) | 0;\n mid = (mid + Math.imul(al8, bh7)) | 0;\n mid = (mid + Math.imul(ah8, bl7)) | 0;\n hi = (hi + Math.imul(ah8, bh7)) | 0;\n lo = (lo + Math.imul(al7, bl8)) | 0;\n mid = (mid + Math.imul(al7, bh8)) | 0;\n mid = (mid + Math.imul(ah7, bl8)) | 0;\n hi = (hi + Math.imul(ah7, bh8)) | 0;\n lo = (lo + Math.imul(al6, bl9)) | 0;\n mid = (mid + Math.imul(al6, bh9)) | 0;\n mid = (mid + Math.imul(ah6, bl9)) | 0;\n hi = (hi + Math.imul(ah6, bh9)) | 0;\n var w15 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w15 >>> 26)) | 0;\n w15 &= 0x3ffffff;\n /* k = 16 */\n lo = Math.imul(al9, bl7);\n mid = Math.imul(al9, bh7);\n mid = (mid + Math.imul(ah9, bl7)) | 0;\n hi = Math.imul(ah9, bh7);\n lo = (lo + Math.imul(al8, bl8)) | 0;\n mid = (mid + Math.imul(al8, bh8)) | 0;\n mid = (mid + Math.imul(ah8, bl8)) | 0;\n hi = (hi + Math.imul(ah8, bh8)) | 0;\n lo = (lo + Math.imul(al7, bl9)) | 0;\n mid = (mid + Math.imul(al7, bh9)) | 0;\n mid = (mid + Math.imul(ah7, bl9)) | 0;\n hi = (hi + Math.imul(ah7, bh9)) | 0;\n var w16 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w16 >>> 26)) | 0;\n w16 &= 0x3ffffff;\n /* k = 17 */\n lo = Math.imul(al9, bl8);\n mid = Math.imul(al9, bh8);\n mid = (mid + Math.imul(ah9, bl8)) | 0;\n hi = Math.imul(ah9, bh8);\n lo = (lo + Math.imul(al8, bl9)) | 0;\n mid = (mid + Math.imul(al8, bh9)) | 0;\n mid = (mid + Math.imul(ah8, bl9)) | 0;\n hi = (hi + Math.imul(ah8, bh9)) | 0;\n var w17 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w17 >>> 26)) | 0;\n w17 &= 0x3ffffff;\n /* k = 18 */\n lo = Math.imul(al9, bl9);\n mid = Math.imul(al9, bh9);\n mid = (mid + Math.imul(ah9, bl9)) | 0;\n hi = Math.imul(ah9, bh9);\n var w18 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w18 >>> 26)) | 0;\n w18 &= 0x3ffffff;\n o[0] = w0;\n o[1] = w1;\n o[2] = w2;\n o[3] = w3;\n o[4] = w4;\n o[5] = w5;\n o[6] = w6;\n o[7] = w7;\n o[8] = w8;\n o[9] = w9;\n o[10] = w10;\n o[11] = w11;\n o[12] = w12;\n o[13] = w13;\n o[14] = w14;\n o[15] = w15;\n o[16] = w16;\n o[17] = w17;\n o[18] = w18;\n if (c !== 0) {\n o[19] = c;\n out.length++;\n }\n return out;\n };\n\n // Polyfill comb\n if (!Math.imul) {\n comb10MulTo = smallMulTo;\n }\n\n function bigMulTo (self, num, out) {\n out.negative = num.negative ^ self.negative;\n out.length = self.length + num.length;\n\n var carry = 0;\n var hncarry = 0;\n for (var k = 0; k < out.length - 1; k++) {\n // Sum all words with the same `i + j = k` and accumulate `ncarry`,\n // note that ncarry could be >= 0x3ffffff\n var ncarry = hncarry;\n hncarry = 0;\n var rword = carry & 0x3ffffff;\n var maxJ = Math.min(k, num.length - 1);\n for (var j = Math.max(0, k - self.length + 1); j <= maxJ; j++) {\n var i = k - j;\n var a = self.words[i] | 0;\n var b = num.words[j] | 0;\n var r = a * b;\n\n var lo = r & 0x3ffffff;\n ncarry = (ncarry + ((r / 0x4000000) | 0)) | 0;\n lo = (lo + rword) | 0;\n rword = lo & 0x3ffffff;\n ncarry = (ncarry + (lo >>> 26)) | 0;\n\n hncarry += ncarry >>> 26;\n ncarry &= 0x3ffffff;\n }\n out.words[k] = rword;\n carry = ncarry;\n ncarry = hncarry;\n }\n if (carry !== 0) {\n out.words[k] = carry;\n } else {\n out.length--;\n }\n\n return out._strip();\n }\n\n function jumboMulTo (self, num, out) {\n // Temporary disable, see https://github.com/indutny/bn.js/issues/211\n // var fftm = new FFTM();\n // return fftm.mulp(self, num, out);\n return bigMulTo(self, num, out);\n }\n\n BN.prototype.mulTo = function mulTo (num, out) {\n var res;\n var len = this.length + num.length;\n if (this.length === 10 && num.length === 10) {\n res = comb10MulTo(this, num, out);\n } else if (len < 63) {\n res = smallMulTo(this, num, out);\n } else if (len < 1024) {\n res = bigMulTo(this, num, out);\n } else {\n res = jumboMulTo(this, num, out);\n }\n\n return res;\n };\n\n // Cooley-Tukey algorithm for FFT\n // slightly revisited to rely on looping instead of recursion\n\n function FFTM (x, y) {\n this.x = x;\n this.y = y;\n }\n\n FFTM.prototype.makeRBT = function makeRBT (N) {\n var t = new Array(N);\n var l = BN.prototype._countBits(N) - 1;\n for (var i = 0; i < N; i++) {\n t[i] = this.revBin(i, l, N);\n }\n\n return t;\n };\n\n // Returns binary-reversed representation of `x`\n FFTM.prototype.revBin = function revBin (x, l, N) {\n if (x === 0 || x === N - 1) return x;\n\n var rb = 0;\n for (var i = 0; i < l; i++) {\n rb |= (x & 1) << (l - i - 1);\n x >>= 1;\n }\n\n return rb;\n };\n\n // Performs \"tweedling\" phase, therefore 'emulating'\n // behaviour of the recursive algorithm\n FFTM.prototype.permute = function permute (rbt, rws, iws, rtws, itws, N) {\n for (var i = 0; i < N; i++) {\n rtws[i] = rws[rbt[i]];\n itws[i] = iws[rbt[i]];\n }\n };\n\n FFTM.prototype.transform = function transform (rws, iws, rtws, itws, N, rbt) {\n this.permute(rbt, rws, iws, rtws, itws, N);\n\n for (var s = 1; s < N; s <<= 1) {\n var l = s << 1;\n\n var rtwdf = Math.cos(2 * Math.PI / l);\n var itwdf = Math.sin(2 * Math.PI / l);\n\n for (var p = 0; p < N; p += l) {\n var rtwdf_ = rtwdf;\n var itwdf_ = itwdf;\n\n for (var j = 0; j < s; j++) {\n var re = rtws[p + j];\n var ie = itws[p + j];\n\n var ro = rtws[p + j + s];\n var io = itws[p + j + s];\n\n var rx = rtwdf_ * ro - itwdf_ * io;\n\n io = rtwdf_ * io + itwdf_ * ro;\n ro = rx;\n\n rtws[p + j] = re + ro;\n itws[p + j] = ie + io;\n\n rtws[p + j + s] = re - ro;\n itws[p + j + s] = ie - io;\n\n /* jshint maxdepth : false */\n if (j !== l) {\n rx = rtwdf * rtwdf_ - itwdf * itwdf_;\n\n itwdf_ = rtwdf * itwdf_ + itwdf * rtwdf_;\n rtwdf_ = rx;\n }\n }\n }\n }\n };\n\n FFTM.prototype.guessLen13b = function guessLen13b (n, m) {\n var N = Math.max(m, n) | 1;\n var odd = N & 1;\n var i = 0;\n for (N = N / 2 | 0; N; N = N >>> 1) {\n i++;\n }\n\n return 1 << i + 1 + odd;\n };\n\n FFTM.prototype.conjugate = function conjugate (rws, iws, N) {\n if (N <= 1) return;\n\n for (var i = 0; i < N / 2; i++) {\n var t = rws[i];\n\n rws[i] = rws[N - i - 1];\n rws[N - i - 1] = t;\n\n t = iws[i];\n\n iws[i] = -iws[N - i - 1];\n iws[N - i - 1] = -t;\n }\n };\n\n FFTM.prototype.normalize13b = function normalize13b (ws, N) {\n var carry = 0;\n for (var i = 0; i < N / 2; i++) {\n var w = Math.round(ws[2 * i + 1] / N) * 0x2000 +\n Math.round(ws[2 * i] / N) +\n carry;\n\n ws[i] = w & 0x3ffffff;\n\n if (w < 0x4000000) {\n carry = 0;\n } else {\n carry = w / 0x4000000 | 0;\n }\n }\n\n return ws;\n };\n\n FFTM.prototype.convert13b = function convert13b (ws, len, rws, N) {\n var carry = 0;\n for (var i = 0; i < len; i++) {\n carry = carry + (ws[i] | 0);\n\n rws[2 * i] = carry & 0x1fff; carry = carry >>> 13;\n rws[2 * i + 1] = carry & 0x1fff; carry = carry >>> 13;\n }\n\n // Pad with zeroes\n for (i = 2 * len; i < N; ++i) {\n rws[i] = 0;\n }\n\n assert(carry === 0);\n assert((carry & ~0x1fff) === 0);\n };\n\n FFTM.prototype.stub = function stub (N) {\n var ph = new Array(N);\n for (var i = 0; i < N; i++) {\n ph[i] = 0;\n }\n\n return ph;\n };\n\n FFTM.prototype.mulp = function mulp (x, y, out) {\n var N = 2 * this.guessLen13b(x.length, y.length);\n\n var rbt = this.makeRBT(N);\n\n var _ = this.stub(N);\n\n var rws = new Array(N);\n var rwst = new Array(N);\n var iwst = new Array(N);\n\n var nrws = new Array(N);\n var nrwst = new Array(N);\n var niwst = new Array(N);\n\n var rmws = out.words;\n rmws.length = N;\n\n this.convert13b(x.words, x.length, rws, N);\n this.convert13b(y.words, y.length, nrws, N);\n\n this.transform(rws, _, rwst, iwst, N, rbt);\n this.transform(nrws, _, nrwst, niwst, N, rbt);\n\n for (var i = 0; i < N; i++) {\n var rx = rwst[i] * nrwst[i] - iwst[i] * niwst[i];\n iwst[i] = rwst[i] * niwst[i] + iwst[i] * nrwst[i];\n rwst[i] = rx;\n }\n\n this.conjugate(rwst, iwst, N);\n this.transform(rwst, iwst, rmws, _, N, rbt);\n this.conjugate(rmws, _, N);\n this.normalize13b(rmws, N);\n\n out.negative = x.negative ^ y.negative;\n out.length = x.length + y.length;\n return out._strip();\n };\n\n // Multiply `this` by `num`\n BN.prototype.mul = function mul (num) {\n var out = new BN(null);\n out.words = new Array(this.length + num.length);\n return this.mulTo(num, out);\n };\n\n // Multiply employing FFT\n BN.prototype.mulf = function mulf (num) {\n var out = new BN(null);\n out.words = new Array(this.length + num.length);\n return jumboMulTo(this, num, out);\n };\n\n // In-place Multiplication\n BN.prototype.imul = function imul (num) {\n return this.clone().mulTo(num, this);\n };\n\n BN.prototype.imuln = function imuln (num) {\n var isNegNum = num < 0;\n if (isNegNum) num = -num;\n\n assert(typeof num === 'number');\n assert(num < 0x4000000);\n\n // Carry\n var carry = 0;\n for (var i = 0; i < this.length; i++) {\n var w = (this.words[i] | 0) * num;\n var lo = (w & 0x3ffffff) + (carry & 0x3ffffff);\n carry >>= 26;\n carry += (w / 0x4000000) | 0;\n // NOTE: lo is 27bit maximum\n carry += lo >>> 26;\n this.words[i] = lo & 0x3ffffff;\n }\n\n if (carry !== 0) {\n this.words[i] = carry;\n this.length++;\n }\n this.length = num === 0 ? 1 : this.length;\n\n return isNegNum ? this.ineg() : this;\n };\n\n BN.prototype.muln = function muln (num) {\n return this.clone().imuln(num);\n };\n\n // `this` * `this`\n BN.prototype.sqr = function sqr () {\n return this.mul(this);\n };\n\n // `this` * `this` in-place\n BN.prototype.isqr = function isqr () {\n return this.imul(this.clone());\n };\n\n // Math.pow(`this`, `num`)\n BN.prototype.pow = function pow (num) {\n var w = toBitArray(num);\n if (w.length === 0) return new BN(1);\n\n // Skip leading zeroes\n var res = this;\n for (var i = 0; i < w.length; i++, res = res.sqr()) {\n if (w[i] !== 0) break;\n }\n\n if (++i < w.length) {\n for (var q = res.sqr(); i < w.length; i++, q = q.sqr()) {\n if (w[i] === 0) continue;\n\n res = res.mul(q);\n }\n }\n\n return res;\n };\n\n // Shift-left in-place\n BN.prototype.iushln = function iushln (bits) {\n assert(typeof bits === 'number' && bits >= 0);\n var r = bits % 26;\n var s = (bits - r) / 26;\n var carryMask = (0x3ffffff >>> (26 - r)) << (26 - r);\n var i;\n\n if (r !== 0) {\n var carry = 0;\n\n for (i = 0; i < this.length; i++) {\n var newCarry = this.words[i] & carryMask;\n var c = ((this.words[i] | 0) - newCarry) << r;\n this.words[i] = c | carry;\n carry = newCarry >>> (26 - r);\n }\n\n if (carry) {\n this.words[i] = carry;\n this.length++;\n }\n }\n\n if (s !== 0) {\n for (i = this.length - 1; i >= 0; i--) {\n this.words[i + s] = this.words[i];\n }\n\n for (i = 0; i < s; i++) {\n this.words[i] = 0;\n }\n\n this.length += s;\n }\n\n return this._strip();\n };\n\n BN.prototype.ishln = function ishln (bits) {\n // TODO(indutny): implement me\n assert(this.negative === 0);\n return this.iushln(bits);\n };\n\n // Shift-right in-place\n // NOTE: `hint` is a lowest bit before trailing zeroes\n // NOTE: if `extended` is present - it will be filled with destroyed bits\n BN.prototype.iushrn = function iushrn (bits, hint, extended) {\n assert(typeof bits === 'number' && bits >= 0);\n var h;\n if (hint) {\n h = (hint - (hint % 26)) / 26;\n } else {\n h = 0;\n }\n\n var r = bits % 26;\n var s = Math.min((bits - r) / 26, this.length);\n var mask = 0x3ffffff ^ ((0x3ffffff >>> r) << r);\n var maskedWords = extended;\n\n h -= s;\n h = Math.max(0, h);\n\n // Extended mode, copy masked part\n if (maskedWords) {\n for (var i = 0; i < s; i++) {\n maskedWords.words[i] = this.words[i];\n }\n maskedWords.length = s;\n }\n\n if (s === 0) {\n // No-op, we should not move anything at all\n } else if (this.length > s) {\n this.length -= s;\n for (i = 0; i < this.length; i++) {\n this.words[i] = this.words[i + s];\n }\n } else {\n this.words[0] = 0;\n this.length = 1;\n }\n\n var carry = 0;\n for (i = this.length - 1; i >= 0 && (carry !== 0 || i >= h); i--) {\n var word = this.words[i] | 0;\n this.words[i] = (carry << (26 - r)) | (word >>> r);\n carry = word & mask;\n }\n\n // Push carried bits as a mask\n if (maskedWords && carry !== 0) {\n maskedWords.words[maskedWords.length++] = carry;\n }\n\n if (this.length === 0) {\n this.words[0] = 0;\n this.length = 1;\n }\n\n return this._strip();\n };\n\n BN.prototype.ishrn = function ishrn (bits, hint, extended) {\n // TODO(indutny): implement me\n assert(this.negative === 0);\n return this.iushrn(bits, hint, extended);\n };\n\n // Shift-left\n BN.prototype.shln = function shln (bits) {\n return this.clone().ishln(bits);\n };\n\n BN.prototype.ushln = function ushln (bits) {\n return this.clone().iushln(bits);\n };\n\n // Shift-right\n BN.prototype.shrn = function shrn (bits) {\n return this.clone().ishrn(bits);\n };\n\n BN.prototype.ushrn = function ushrn (bits) {\n return this.clone().iushrn(bits);\n };\n\n // Test if n bit is set\n BN.prototype.testn = function testn (bit) {\n assert(typeof bit === 'number' && bit >= 0);\n var r = bit % 26;\n var s = (bit - r) / 26;\n var q = 1 << r;\n\n // Fast case: bit is much higher than all existing words\n if (this.length <= s) return false;\n\n // Check bit and return\n var w = this.words[s];\n\n return !!(w & q);\n };\n\n // Return only lowers bits of number (in-place)\n BN.prototype.imaskn = function imaskn (bits) {\n assert(typeof bits === 'number' && bits >= 0);\n var r = bits % 26;\n var s = (bits - r) / 26;\n\n assert(this.negative === 0, 'imaskn works only with positive numbers');\n\n if (this.length <= s) {\n return this;\n }\n\n if (r !== 0) {\n s++;\n }\n this.length = Math.min(s, this.length);\n\n if (r !== 0) {\n var mask = 0x3ffffff ^ ((0x3ffffff >>> r) << r);\n this.words[this.length - 1] &= mask;\n }\n\n return this._strip();\n };\n\n // Return only lowers bits of number\n BN.prototype.maskn = function maskn (bits) {\n return this.clone().imaskn(bits);\n };\n\n // Add plain number `num` to `this`\n BN.prototype.iaddn = function iaddn (num) {\n assert(typeof num === 'number');\n assert(num < 0x4000000);\n if (num < 0) return this.isubn(-num);\n\n // Possible sign change\n if (this.negative !== 0) {\n if (this.length === 1 && (this.words[0] | 0) <= num) {\n this.words[0] = num - (this.words[0] | 0);\n this.negative = 0;\n return this;\n }\n\n this.negative = 0;\n this.isubn(num);\n this.negative = 1;\n return this;\n }\n\n // Add without checks\n return this._iaddn(num);\n };\n\n BN.prototype._iaddn = function _iaddn (num) {\n this.words[0] += num;\n\n // Carry\n for (var i = 0; i < this.length && this.words[i] >= 0x4000000; i++) {\n this.words[i] -= 0x4000000;\n if (i === this.length - 1) {\n this.words[i + 1] = 1;\n } else {\n this.words[i + 1]++;\n }\n }\n this.length = Math.max(this.length, i + 1);\n\n return this;\n };\n\n // Subtract plain number `num` from `this`\n BN.prototype.isubn = function isubn (num) {\n assert(typeof num === 'number');\n assert(num < 0x4000000);\n if (num < 0) return this.iaddn(-num);\n\n if (this.negative !== 0) {\n this.negative = 0;\n this.iaddn(num);\n this.negative = 1;\n return this;\n }\n\n this.words[0] -= num;\n\n if (this.length === 1 && this.words[0] < 0) {\n this.words[0] = -this.words[0];\n this.negative = 1;\n } else {\n // Carry\n for (var i = 0; i < this.length && this.words[i] < 0; i++) {\n this.words[i] += 0x4000000;\n this.words[i + 1] -= 1;\n }\n }\n\n return this._strip();\n };\n\n BN.prototype.addn = function addn (num) {\n return this.clone().iaddn(num);\n };\n\n BN.prototype.subn = function subn (num) {\n return this.clone().isubn(num);\n };\n\n BN.prototype.iabs = function iabs () {\n this.negative = 0;\n\n return this;\n };\n\n BN.prototype.abs = function abs () {\n return this.clone().iabs();\n };\n\n BN.prototype._ishlnsubmul = function _ishlnsubmul (num, mul, shift) {\n var len = num.length + shift;\n var i;\n\n this._expand(len);\n\n var w;\n var carry = 0;\n for (i = 0; i < num.length; i++) {\n w = (this.words[i + shift] | 0) + carry;\n var right = (num.words[i] | 0) * mul;\n w -= right & 0x3ffffff;\n carry = (w >> 26) - ((right / 0x4000000) | 0);\n this.words[i + shift] = w & 0x3ffffff;\n }\n for (; i < this.length - shift; i++) {\n w = (this.words[i + shift] | 0) + carry;\n carry = w >> 26;\n this.words[i + shift] = w & 0x3ffffff;\n }\n\n if (carry === 0) return this._strip();\n\n // Subtraction overflow\n assert(carry === -1);\n carry = 0;\n for (i = 0; i < this.length; i++) {\n w = -(this.words[i] | 0) + carry;\n carry = w >> 26;\n this.words[i] = w & 0x3ffffff;\n }\n this.negative = 1;\n\n return this._strip();\n };\n\n BN.prototype._wordDiv = function _wordDiv (num, mode) {\n var shift = this.length - num.length;\n\n var a = this.clone();\n var b = num;\n\n // Normalize\n var bhi = b.words[b.length - 1] | 0;\n var bhiBits = this._countBits(bhi);\n shift = 26 - bhiBits;\n if (shift !== 0) {\n b = b.ushln(shift);\n a.iushln(shift);\n bhi = b.words[b.length - 1] | 0;\n }\n\n // Initialize quotient\n var m = a.length - b.length;\n var q;\n\n if (mode !== 'mod') {\n q = new BN(null);\n q.length = m + 1;\n q.words = new Array(q.length);\n for (var i = 0; i < q.length; i++) {\n q.words[i] = 0;\n }\n }\n\n var diff = a.clone()._ishlnsubmul(b, 1, m);\n if (diff.negative === 0) {\n a = diff;\n if (q) {\n q.words[m] = 1;\n }\n }\n\n for (var j = m - 1; j >= 0; j--) {\n var qj = (a.words[b.length + j] | 0) * 0x4000000 +\n (a.words[b.length + j - 1] | 0);\n\n // NOTE: (qj / bhi) is (0x3ffffff * 0x4000000 + 0x3ffffff) / 0x2000000 max\n // (0x7ffffff)\n qj = Math.min((qj / bhi) | 0, 0x3ffffff);\n\n a._ishlnsubmul(b, qj, j);\n while (a.negative !== 0) {\n qj--;\n a.negative = 0;\n a._ishlnsubmul(b, 1, j);\n if (!a.isZero()) {\n a.negative ^= 1;\n }\n }\n if (q) {\n q.words[j] = qj;\n }\n }\n if (q) {\n q._strip();\n }\n a._strip();\n\n // Denormalize\n if (mode !== 'div' && shift !== 0) {\n a.iushrn(shift);\n }\n\n return {\n div: q || null,\n mod: a\n };\n };\n\n // NOTE: 1) `mode` can be set to `mod` to request mod only,\n // to `div` to request div only, or be absent to\n // request both div & mod\n // 2) `positive` is true if unsigned mod is requested\n BN.prototype.divmod = function divmod (num, mode, positive) {\n assert(!num.isZero());\n\n if (this.isZero()) {\n return {\n div: new BN(0),\n mod: new BN(0)\n };\n }\n\n var div, mod, res;\n if (this.negative !== 0 && num.negative === 0) {\n res = this.neg().divmod(num, mode);\n\n if (mode !== 'mod') {\n div = res.div.neg();\n }\n\n if (mode !== 'div') {\n mod = res.mod.neg();\n if (positive && mod.negative !== 0) {\n mod.iadd(num);\n }\n }\n\n return {\n div: div,\n mod: mod\n };\n }\n\n if (this.negative === 0 && num.negative !== 0) {\n res = this.divmod(num.neg(), mode);\n\n if (mode !== 'mod') {\n div = res.div.neg();\n }\n\n return {\n div: div,\n mod: res.mod\n };\n }\n\n if ((this.negative & num.negative) !== 0) {\n res = this.neg().divmod(num.neg(), mode);\n\n if (mode !== 'div') {\n mod = res.mod.neg();\n if (positive && mod.negative !== 0) {\n mod.isub(num);\n }\n }\n\n return {\n div: res.div,\n mod: mod\n };\n }\n\n // Both numbers are positive at this point\n\n // Strip both numbers to approximate shift value\n if (num.length > this.length || this.cmp(num) < 0) {\n return {\n div: new BN(0),\n mod: this\n };\n }\n\n // Very short reduction\n if (num.length === 1) {\n if (mode === 'div') {\n return {\n div: this.divn(num.words[0]),\n mod: null\n };\n }\n\n if (mode === 'mod') {\n return {\n div: null,\n mod: new BN(this.modrn(num.words[0]))\n };\n }\n\n return {\n div: this.divn(num.words[0]),\n mod: new BN(this.modrn(num.words[0]))\n };\n }\n\n return this._wordDiv(num, mode);\n };\n\n // Find `this` / `num`\n BN.prototype.div = function div (num) {\n return this.divmod(num, 'div', false).div;\n };\n\n // Find `this` % `num`\n BN.prototype.mod = function mod (num) {\n return this.divmod(num, 'mod', false).mod;\n };\n\n BN.prototype.umod = function umod (num) {\n return this.divmod(num, 'mod', true).mod;\n };\n\n // Find Round(`this` / `num`)\n BN.prototype.divRound = function divRound (num) {\n var dm = this.divmod(num);\n\n // Fast case - exact division\n if (dm.mod.isZero()) return dm.div;\n\n var mod = dm.div.negative !== 0 ? dm.mod.isub(num) : dm.mod;\n\n var half = num.ushrn(1);\n var r2 = num.andln(1);\n var cmp = mod.cmp(half);\n\n // Round down\n if (cmp < 0 || (r2 === 1 && cmp === 0)) return dm.div;\n\n // Round up\n return dm.div.negative !== 0 ? dm.div.isubn(1) : dm.div.iaddn(1);\n };\n\n BN.prototype.modrn = function modrn (num) {\n var isNegNum = num < 0;\n if (isNegNum) num = -num;\n\n assert(num <= 0x3ffffff);\n var p = (1 << 26) % num;\n\n var acc = 0;\n for (var i = this.length - 1; i >= 0; i--) {\n acc = (p * acc + (this.words[i] | 0)) % num;\n }\n\n return isNegNum ? -acc : acc;\n };\n\n // WARNING: DEPRECATED\n BN.prototype.modn = function modn (num) {\n return this.modrn(num);\n };\n\n // In-place division by number\n BN.prototype.idivn = function idivn (num) {\n var isNegNum = num < 0;\n if (isNegNum) num = -num;\n\n assert(num <= 0x3ffffff);\n\n var carry = 0;\n for (var i = this.length - 1; i >= 0; i--) {\n var w = (this.words[i] | 0) + carry * 0x4000000;\n this.words[i] = (w / num) | 0;\n carry = w % num;\n }\n\n this._strip();\n return isNegNum ? this.ineg() : this;\n };\n\n BN.prototype.divn = function divn (num) {\n return this.clone().idivn(num);\n };\n\n BN.prototype.egcd = function egcd (p) {\n assert(p.negative === 0);\n assert(!p.isZero());\n\n var x = this;\n var y = p.clone();\n\n if (x.negative !== 0) {\n x = x.umod(p);\n } else {\n x = x.clone();\n }\n\n // A * x + B * y = x\n var A = new BN(1);\n var B = new BN(0);\n\n // C * x + D * y = y\n var C = new BN(0);\n var D = new BN(1);\n\n var g = 0;\n\n while (x.isEven() && y.isEven()) {\n x.iushrn(1);\n y.iushrn(1);\n ++g;\n }\n\n var yp = y.clone();\n var xp = x.clone();\n\n while (!x.isZero()) {\n for (var i = 0, im = 1; (x.words[0] & im) === 0 && i < 26; ++i, im <<= 1);\n if (i > 0) {\n x.iushrn(i);\n while (i-- > 0) {\n if (A.isOdd() || B.isOdd()) {\n A.iadd(yp);\n B.isub(xp);\n }\n\n A.iushrn(1);\n B.iushrn(1);\n }\n }\n\n for (var j = 0, jm = 1; (y.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1);\n if (j > 0) {\n y.iushrn(j);\n while (j-- > 0) {\n if (C.isOdd() || D.isOdd()) {\n C.iadd(yp);\n D.isub(xp);\n }\n\n C.iushrn(1);\n D.iushrn(1);\n }\n }\n\n if (x.cmp(y) >= 0) {\n x.isub(y);\n A.isub(C);\n B.isub(D);\n } else {\n y.isub(x);\n C.isub(A);\n D.isub(B);\n }\n }\n\n return {\n a: C,\n b: D,\n gcd: y.iushln(g)\n };\n };\n\n // This is reduced incarnation of the binary EEA\n // above, designated to invert members of the\n // _prime_ fields F(p) at a maximal speed\n BN.prototype._invmp = function _invmp (p) {\n assert(p.negative === 0);\n assert(!p.isZero());\n\n var a = this;\n var b = p.clone();\n\n if (a.negative !== 0) {\n a = a.umod(p);\n } else {\n a = a.clone();\n }\n\n var x1 = new BN(1);\n var x2 = new BN(0);\n\n var delta = b.clone();\n\n while (a.cmpn(1) > 0 && b.cmpn(1) > 0) {\n for (var i = 0, im = 1; (a.words[0] & im) === 0 && i < 26; ++i, im <<= 1);\n if (i > 0) {\n a.iushrn(i);\n while (i-- > 0) {\n if (x1.isOdd()) {\n x1.iadd(delta);\n }\n\n x1.iushrn(1);\n }\n }\n\n for (var j = 0, jm = 1; (b.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1);\n if (j > 0) {\n b.iushrn(j);\n while (j-- > 0) {\n if (x2.isOdd()) {\n x2.iadd(delta);\n }\n\n x2.iushrn(1);\n }\n }\n\n if (a.cmp(b) >= 0) {\n a.isub(b);\n x1.isub(x2);\n } else {\n b.isub(a);\n x2.isub(x1);\n }\n }\n\n var res;\n if (a.cmpn(1) === 0) {\n res = x1;\n } else {\n res = x2;\n }\n\n if (res.cmpn(0) < 0) {\n res.iadd(p);\n }\n\n return res;\n };\n\n BN.prototype.gcd = function gcd (num) {\n if (this.isZero()) return num.abs();\n if (num.isZero()) return this.abs();\n\n var a = this.clone();\n var b = num.clone();\n a.negative = 0;\n b.negative = 0;\n\n // Remove common factor of two\n for (var shift = 0; a.isEven() && b.isEven(); shift++) {\n a.iushrn(1);\n b.iushrn(1);\n }\n\n do {\n while (a.isEven()) {\n a.iushrn(1);\n }\n while (b.isEven()) {\n b.iushrn(1);\n }\n\n var r = a.cmp(b);\n if (r < 0) {\n // Swap `a` and `b` to make `a` always bigger than `b`\n var t = a;\n a = b;\n b = t;\n } else if (r === 0 || b.cmpn(1) === 0) {\n break;\n }\n\n a.isub(b);\n } while (true);\n\n return b.iushln(shift);\n };\n\n // Invert number in the field F(num)\n BN.prototype.invm = function invm (num) {\n return this.egcd(num).a.umod(num);\n };\n\n BN.prototype.isEven = function isEven () {\n return (this.words[0] & 1) === 0;\n };\n\n BN.prototype.isOdd = function isOdd () {\n return (this.words[0] & 1) === 1;\n };\n\n // And first word and num\n BN.prototype.andln = function andln (num) {\n return this.words[0] & num;\n };\n\n // Increment at the bit position in-line\n BN.prototype.bincn = function bincn (bit) {\n assert(typeof bit === 'number');\n var r = bit % 26;\n var s = (bit - r) / 26;\n var q = 1 << r;\n\n // Fast case: bit is much higher than all existing words\n if (this.length <= s) {\n this._expand(s + 1);\n this.words[s] |= q;\n return this;\n }\n\n // Add bit and propagate, if needed\n var carry = q;\n for (var i = s; carry !== 0 && i < this.length; i++) {\n var w = this.words[i] | 0;\n w += carry;\n carry = w >>> 26;\n w &= 0x3ffffff;\n this.words[i] = w;\n }\n if (carry !== 0) {\n this.words[i] = carry;\n this.length++;\n }\n return this;\n };\n\n BN.prototype.isZero = function isZero () {\n return this.length === 1 && this.words[0] === 0;\n };\n\n BN.prototype.cmpn = function cmpn (num) {\n var negative = num < 0;\n\n if (this.negative !== 0 && !negative) return -1;\n if (this.negative === 0 && negative) return 1;\n\n this._strip();\n\n var res;\n if (this.length > 1) {\n res = 1;\n } else {\n if (negative) {\n num = -num;\n }\n\n assert(num <= 0x3ffffff, 'Number is too big');\n\n var w = this.words[0] | 0;\n res = w === num ? 0 : w < num ? -1 : 1;\n }\n if (this.negative !== 0) return -res | 0;\n return res;\n };\n\n // Compare two numbers and return:\n // 1 - if `this` > `num`\n // 0 - if `this` == `num`\n // -1 - if `this` < `num`\n BN.prototype.cmp = function cmp (num) {\n if (this.negative !== 0 && num.negative === 0) return -1;\n if (this.negative === 0 && num.negative !== 0) return 1;\n\n var res = this.ucmp(num);\n if (this.negative !== 0) return -res | 0;\n return res;\n };\n\n // Unsigned comparison\n BN.prototype.ucmp = function ucmp (num) {\n // At this point both numbers have the same sign\n if (this.length > num.length) return 1;\n if (this.length < num.length) return -1;\n\n var res = 0;\n for (var i = this.length - 1; i >= 0; i--) {\n var a = this.words[i] | 0;\n var b = num.words[i] | 0;\n\n if (a === b) continue;\n if (a < b) {\n res = -1;\n } else if (a > b) {\n res = 1;\n }\n break;\n }\n return res;\n };\n\n BN.prototype.gtn = function gtn (num) {\n return this.cmpn(num) === 1;\n };\n\n BN.prototype.gt = function gt (num) {\n return this.cmp(num) === 1;\n };\n\n BN.prototype.gten = function gten (num) {\n return this.cmpn(num) >= 0;\n };\n\n BN.prototype.gte = function gte (num) {\n return this.cmp(num) >= 0;\n };\n\n BN.prototype.ltn = function ltn (num) {\n return this.cmpn(num) === -1;\n };\n\n BN.prototype.lt = function lt (num) {\n return this.cmp(num) === -1;\n };\n\n BN.prototype.lten = function lten (num) {\n return this.cmpn(num) <= 0;\n };\n\n BN.prototype.lte = function lte (num) {\n return this.cmp(num) <= 0;\n };\n\n BN.prototype.eqn = function eqn (num) {\n return this.cmpn(num) === 0;\n };\n\n BN.prototype.eq = function eq (num) {\n return this.cmp(num) === 0;\n };\n\n //\n // A reduce context, could be using montgomery or something better, depending\n // on the `m` itself.\n //\n BN.red = function red (num) {\n return new Red(num);\n };\n\n BN.prototype.toRed = function toRed (ctx) {\n assert(!this.red, 'Already a number in reduction context');\n assert(this.negative === 0, 'red works only with positives');\n return ctx.convertTo(this)._forceRed(ctx);\n };\n\n BN.prototype.fromRed = function fromRed () {\n assert(this.red, 'fromRed works only with numbers in reduction context');\n return this.red.convertFrom(this);\n };\n\n BN.prototype._forceRed = function _forceRed (ctx) {\n this.red = ctx;\n return this;\n };\n\n BN.prototype.forceRed = function forceRed (ctx) {\n assert(!this.red, 'Already a number in reduction context');\n return this._forceRed(ctx);\n };\n\n BN.prototype.redAdd = function redAdd (num) {\n assert(this.red, 'redAdd works only with red numbers');\n return this.red.add(this, num);\n };\n\n BN.prototype.redIAdd = function redIAdd (num) {\n assert(this.red, 'redIAdd works only with red numbers');\n return this.red.iadd(this, num);\n };\n\n BN.prototype.redSub = function redSub (num) {\n assert(this.red, 'redSub works only with red numbers');\n return this.red.sub(this, num);\n };\n\n BN.prototype.redISub = function redISub (num) {\n assert(this.red, 'redISub works only with red numbers');\n return this.red.isub(this, num);\n };\n\n BN.prototype.redShl = function redShl (num) {\n assert(this.red, 'redShl works only with red numbers');\n return this.red.shl(this, num);\n };\n\n BN.prototype.redMul = function redMul (num) {\n assert(this.red, 'redMul works only with red numbers');\n this.red._verify2(this, num);\n return this.red.mul(this, num);\n };\n\n BN.prototype.redIMul = function redIMul (num) {\n assert(this.red, 'redMul works only with red numbers');\n this.red._verify2(this, num);\n return this.red.imul(this, num);\n };\n\n BN.prototype.redSqr = function redSqr () {\n assert(this.red, 'redSqr works only with red numbers');\n this.red._verify1(this);\n return this.red.sqr(this);\n };\n\n BN.prototype.redISqr = function redISqr () {\n assert(this.red, 'redISqr works only with red numbers');\n this.red._verify1(this);\n return this.red.isqr(this);\n };\n\n // Square root over p\n BN.prototype.redSqrt = function redSqrt () {\n assert(this.red, 'redSqrt works only with red numbers');\n this.red._verify1(this);\n return this.red.sqrt(this);\n };\n\n BN.prototype.redInvm = function redInvm () {\n assert(this.red, 'redInvm works only with red numbers');\n this.red._verify1(this);\n return this.red.invm(this);\n };\n\n // Return negative clone of `this` % `red modulo`\n BN.prototype.redNeg = function redNeg () {\n assert(this.red, 'redNeg works only with red numbers');\n this.red._verify1(this);\n return this.red.neg(this);\n };\n\n BN.prototype.redPow = function redPow (num) {\n assert(this.red && !num.red, 'redPow(normalNum)');\n this.red._verify1(this);\n return this.red.pow(this, num);\n };\n\n // Prime numbers with efficient reduction\n var primes = {\n k256: null,\n p224: null,\n p192: null,\n p25519: null\n };\n\n // Pseudo-Mersenne prime\n function MPrime (name, p) {\n // P = 2 ^ N - K\n this.name = name;\n this.p = new BN(p, 16);\n this.n = this.p.bitLength();\n this.k = new BN(1).iushln(this.n).isub(this.p);\n\n this.tmp = this._tmp();\n }\n\n MPrime.prototype._tmp = function _tmp () {\n var tmp = new BN(null);\n tmp.words = new Array(Math.ceil(this.n / 13));\n return tmp;\n };\n\n MPrime.prototype.ireduce = function ireduce (num) {\n // Assumes that `num` is less than `P^2`\n // num = HI * (2 ^ N - K) + HI * K + LO = HI * K + LO (mod P)\n var r = num;\n var rlen;\n\n do {\n this.split(r, this.tmp);\n r = this.imulK(r);\n r = r.iadd(this.tmp);\n rlen = r.bitLength();\n } while (rlen > this.n);\n\n var cmp = rlen < this.n ? -1 : r.ucmp(this.p);\n if (cmp === 0) {\n r.words[0] = 0;\n r.length = 1;\n } else if (cmp > 0) {\n r.isub(this.p);\n } else {\n if (r.strip !== undefined) {\n // r is a BN v4 instance\n r.strip();\n } else {\n // r is a BN v5 instance\n r._strip();\n }\n }\n\n return r;\n };\n\n MPrime.prototype.split = function split (input, out) {\n input.iushrn(this.n, 0, out);\n };\n\n MPrime.prototype.imulK = function imulK (num) {\n return num.imul(this.k);\n };\n\n function K256 () {\n MPrime.call(\n this,\n 'k256',\n 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f');\n }\n inherits(K256, MPrime);\n\n K256.prototype.split = function split (input, output) {\n // 256 = 9 * 26 + 22\n var mask = 0x3fffff;\n\n var outLen = Math.min(input.length, 9);\n for (var i = 0; i < outLen; i++) {\n output.words[i] = input.words[i];\n }\n output.length = outLen;\n\n if (input.length <= 9) {\n input.words[0] = 0;\n input.length = 1;\n return;\n }\n\n // Shift by 9 limbs\n var prev = input.words[9];\n output.words[output.length++] = prev & mask;\n\n for (i = 10; i < input.length; i++) {\n var next = input.words[i] | 0;\n input.words[i - 10] = ((next & mask) << 4) | (prev >>> 22);\n prev = next;\n }\n prev >>>= 22;\n input.words[i - 10] = prev;\n if (prev === 0 && input.length > 10) {\n input.length -= 10;\n } else {\n input.length -= 9;\n }\n };\n\n K256.prototype.imulK = function imulK (num) {\n // K = 0x1000003d1 = [ 0x40, 0x3d1 ]\n num.words[num.length] = 0;\n num.words[num.length + 1] = 0;\n num.length += 2;\n\n // bounded at: 0x40 * 0x3ffffff + 0x3d0 = 0x100000390\n var lo = 0;\n for (var i = 0; i < num.length; i++) {\n var w = num.words[i] | 0;\n lo += w * 0x3d1;\n num.words[i] = lo & 0x3ffffff;\n lo = w * 0x40 + ((lo / 0x4000000) | 0);\n }\n\n // Fast length reduction\n if (num.words[num.length - 1] === 0) {\n num.length--;\n if (num.words[num.length - 1] === 0) {\n num.length--;\n }\n }\n return num;\n };\n\n function P224 () {\n MPrime.call(\n this,\n 'p224',\n 'ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001');\n }\n inherits(P224, MPrime);\n\n function P192 () {\n MPrime.call(\n this,\n 'p192',\n 'ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff');\n }\n inherits(P192, MPrime);\n\n function P25519 () {\n // 2 ^ 255 - 19\n MPrime.call(\n this,\n '25519',\n '7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed');\n }\n inherits(P25519, MPrime);\n\n P25519.prototype.imulK = function imulK (num) {\n // K = 0x13\n var carry = 0;\n for (var i = 0; i < num.length; i++) {\n var hi = (num.words[i] | 0) * 0x13 + carry;\n var lo = hi & 0x3ffffff;\n hi >>>= 26;\n\n num.words[i] = lo;\n carry = hi;\n }\n if (carry !== 0) {\n num.words[num.length++] = carry;\n }\n return num;\n };\n\n // Exported mostly for testing purposes, use plain name instead\n BN._prime = function prime (name) {\n // Cached version of prime\n if (primes[name]) return primes[name];\n\n var prime;\n if (name === 'k256') {\n prime = new K256();\n } else if (name === 'p224') {\n prime = new P224();\n } else if (name === 'p192') {\n prime = new P192();\n } else if (name === 'p25519') {\n prime = new P25519();\n } else {\n throw new Error('Unknown prime ' + name);\n }\n primes[name] = prime;\n\n return prime;\n };\n\n //\n // Base reduction engine\n //\n function Red (m) {\n if (typeof m === 'string') {\n var prime = BN._prime(m);\n this.m = prime.p;\n this.prime = prime;\n } else {\n assert(m.gtn(1), 'modulus must be greater than 1');\n this.m = m;\n this.prime = null;\n }\n }\n\n Red.prototype._verify1 = function _verify1 (a) {\n assert(a.negative === 0, 'red works only with positives');\n assert(a.red, 'red works only with red numbers');\n };\n\n Red.prototype._verify2 = function _verify2 (a, b) {\n assert((a.negative | b.negative) === 0, 'red works only with positives');\n assert(a.red && a.red === b.red,\n 'red works only with red numbers');\n };\n\n Red.prototype.imod = function imod (a) {\n if (this.prime) return this.prime.ireduce(a)._forceRed(this);\n\n move(a, a.umod(this.m)._forceRed(this));\n return a;\n };\n\n Red.prototype.neg = function neg (a) {\n if (a.isZero()) {\n return a.clone();\n }\n\n return this.m.sub(a)._forceRed(this);\n };\n\n Red.prototype.add = function add (a, b) {\n this._verify2(a, b);\n\n var res = a.add(b);\n if (res.cmp(this.m) >= 0) {\n res.isub(this.m);\n }\n return res._forceRed(this);\n };\n\n Red.prototype.iadd = function iadd (a, b) {\n this._verify2(a, b);\n\n var res = a.iadd(b);\n if (res.cmp(this.m) >= 0) {\n res.isub(this.m);\n }\n return res;\n };\n\n Red.prototype.sub = function sub (a, b) {\n this._verify2(a, b);\n\n var res = a.sub(b);\n if (res.cmpn(0) < 0) {\n res.iadd(this.m);\n }\n return res._forceRed(this);\n };\n\n Red.prototype.isub = function isub (a, b) {\n this._verify2(a, b);\n\n var res = a.isub(b);\n if (res.cmpn(0) < 0) {\n res.iadd(this.m);\n }\n return res;\n };\n\n Red.prototype.shl = function shl (a, num) {\n this._verify1(a);\n return this.imod(a.ushln(num));\n };\n\n Red.prototype.imul = function imul (a, b) {\n this._verify2(a, b);\n return this.imod(a.imul(b));\n };\n\n Red.prototype.mul = function mul (a, b) {\n this._verify2(a, b);\n return this.imod(a.mul(b));\n };\n\n Red.prototype.isqr = function isqr (a) {\n return this.imul(a, a.clone());\n };\n\n Red.prototype.sqr = function sqr (a) {\n return this.mul(a, a);\n };\n\n Red.prototype.sqrt = function sqrt (a) {\n if (a.isZero()) return a.clone();\n\n var mod3 = this.m.andln(3);\n assert(mod3 % 2 === 1);\n\n // Fast case\n if (mod3 === 3) {\n var pow = this.m.add(new BN(1)).iushrn(2);\n return this.pow(a, pow);\n }\n\n // Tonelli-Shanks algorithm (Totally unoptimized and slow)\n //\n // Find Q and S, that Q * 2 ^ S = (P - 1)\n var q = this.m.subn(1);\n var s = 0;\n while (!q.isZero() && q.andln(1) === 0) {\n s++;\n q.iushrn(1);\n }\n assert(!q.isZero());\n\n var one = new BN(1).toRed(this);\n var nOne = one.redNeg();\n\n // Find quadratic non-residue\n // NOTE: Max is such because of generalized Riemann hypothesis.\n var lpow = this.m.subn(1).iushrn(1);\n var z = this.m.bitLength();\n z = new BN(2 * z * z).toRed(this);\n\n while (this.pow(z, lpow).cmp(nOne) !== 0) {\n z.redIAdd(nOne);\n }\n\n var c = this.pow(z, q);\n var r = this.pow(a, q.addn(1).iushrn(1));\n var t = this.pow(a, q);\n var m = s;\n while (t.cmp(one) !== 0) {\n var tmp = t;\n for (var i = 0; tmp.cmp(one) !== 0; i++) {\n tmp = tmp.redSqr();\n }\n assert(i < m);\n var b = this.pow(c, new BN(1).iushln(m - i - 1));\n\n r = r.redMul(b);\n c = b.redSqr();\n t = t.redMul(c);\n m = i;\n }\n\n return r;\n };\n\n Red.prototype.invm = function invm (a) {\n var inv = a._invmp(this.m);\n if (inv.negative !== 0) {\n inv.negative = 0;\n return this.imod(inv).redNeg();\n } else {\n return this.imod(inv);\n }\n };\n\n Red.prototype.pow = function pow (a, num) {\n if (num.isZero()) return new BN(1).toRed(this);\n if (num.cmpn(1) === 0) return a.clone();\n\n var windowSize = 4;\n var wnd = new Array(1 << windowSize);\n wnd[0] = new BN(1).toRed(this);\n wnd[1] = a;\n for (var i = 2; i < wnd.length; i++) {\n wnd[i] = this.mul(wnd[i - 1], a);\n }\n\n var res = wnd[0];\n var current = 0;\n var currentLen = 0;\n var start = num.bitLength() % 26;\n if (start === 0) {\n start = 26;\n }\n\n for (i = num.length - 1; i >= 0; i--) {\n var word = num.words[i];\n for (var j = start - 1; j >= 0; j--) {\n var bit = (word >> j) & 1;\n if (res !== wnd[0]) {\n res = this.sqr(res);\n }\n\n if (bit === 0 && current === 0) {\n currentLen = 0;\n continue;\n }\n\n current <<= 1;\n current |= bit;\n currentLen++;\n if (currentLen !== windowSize && (i !== 0 || j !== 0)) continue;\n\n res = this.mul(res, wnd[current]);\n currentLen = 0;\n current = 0;\n }\n start = 26;\n }\n\n return res;\n };\n\n Red.prototype.convertTo = function convertTo (num) {\n var r = num.umod(this.m);\n\n return r === num ? r.clone() : r;\n };\n\n Red.prototype.convertFrom = function convertFrom (num) {\n var res = num.clone();\n res.red = null;\n return res;\n };\n\n //\n // Montgomery method engine\n //\n\n BN.mont = function mont (num) {\n return new Mont(num);\n };\n\n function Mont (m) {\n Red.call(this, m);\n\n this.shift = this.m.bitLength();\n if (this.shift % 26 !== 0) {\n this.shift += 26 - (this.shift % 26);\n }\n\n this.r = new BN(1).iushln(this.shift);\n this.r2 = this.imod(this.r.sqr());\n this.rinv = this.r._invmp(this.m);\n\n this.minv = this.rinv.mul(this.r).isubn(1).div(this.m);\n this.minv = this.minv.umod(this.r);\n this.minv = this.r.sub(this.minv);\n }\n inherits(Mont, Red);\n\n Mont.prototype.convertTo = function convertTo (num) {\n return this.imod(num.ushln(this.shift));\n };\n\n Mont.prototype.convertFrom = function convertFrom (num) {\n var r = this.imod(num.mul(this.rinv));\n r.red = null;\n return r;\n };\n\n Mont.prototype.imul = function imul (a, b) {\n if (a.isZero() || b.isZero()) {\n a.words[0] = 0;\n a.length = 1;\n return a;\n }\n\n var t = a.imul(b);\n var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m);\n var u = t.isub(c).iushrn(this.shift);\n var res = u;\n\n if (u.cmp(this.m) >= 0) {\n res = u.isub(this.m);\n } else if (u.cmpn(0) < 0) {\n res = u.iadd(this.m);\n }\n\n return res._forceRed(this);\n };\n\n Mont.prototype.mul = function mul (a, b) {\n if (a.isZero() || b.isZero()) return new BN(0)._forceRed(this);\n\n var t = a.mul(b);\n var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m);\n var u = t.isub(c).iushrn(this.shift);\n var res = u;\n if (u.cmp(this.m) >= 0) {\n res = u.isub(this.m);\n } else if (u.cmpn(0) < 0) {\n res = u.iadd(this.m);\n }\n\n return res._forceRed(this);\n };\n\n Mont.prototype.invm = function invm (a) {\n // (AR)^-1 * R^2 = (A^-1 * R^-1) * R^2 = A^-1 * R\n var res = this.imod(a._invmp(this.m).mul(this.r2));\n return res._forceRed(this);\n };\n})(typeof module === 'undefined' || module, this);\n","import { CetusLeverageSDK, SdkOptions } from \"./sdk\";\n\nexport * from './config'\nexport { CetusLeverageSDK, SdkOptions };\nexport default CetusLeverageSDK;\n","import type { BaseSdkOptions, Package } from '@cetusprotocol/common-sdk'\nimport { SdkWrapper } from '@cetusprotocol/common-sdk'\nimport { leverage_mainnet } from './config'\nimport { SuiLendModule } from './modules/suilendModule'\nimport type { LeverageConfig, SuiLendConfig } from './types'\nimport { LeverageModules } from './modules/leverageModules'\nimport { AggregatorClient, Env } from '@cetusprotocol/aggregator-sdk'\nimport { normalizeSuiAddress } from '@mysten/sui/utils'\nimport { SuiClient } from '@mysten/sui/client'\nimport { CetusClmmSDK } from '@cetusprotocol/sui-clmm-sdk'\n\n\nexport interface SdkOptions extends BaseSdkOptions {\n leverage: Package<LeverageConfig>\n suilend: SuiLendConfig\n aggregator_url: string\n providers: string[]\n pyth_urls?: string[]\n env: 'mainnet' | 'testnet'\n}\n\nexport class CetusLeverageSDK extends SdkWrapper<SdkOptions> {\n protected _suilendModule: SuiLendModule\n protected _leverageModules: LeverageModules\n protected _aggregatorClient: AggregatorClient\n protected _clmmSDK: CetusClmmSDK\n\n senderAddress: string | undefined\n\n constructor(options: SdkOptions, clmmSDK?: CetusClmmSDK) {\n super(options)\n this._suilendModule = new SuiLendModule(this)\n this._leverageModules = new LeverageModules(this)\n this._aggregatorClient = new AggregatorClient({\n signer: normalizeSuiAddress('0x0'),\n client: options.sui_client || new SuiClient({ url: options.full_rpc_url! }),\n env: options.env === 'testnet' ? Env.Testnet : Env.Mainnet,\n pythUrls: options.pyth_urls,\n })\n this._clmmSDK = clmmSDK || CetusClmmSDK.createSDK({ env: options.env, full_rpc_url: options.full_rpc_url })\n }\n\n get SuiLendModule() {\n return this._suilendModule\n }\n\n get LeverageModules() {\n return this._leverageModules\n }\n\n get AggregatorClient(): AggregatorClient {\n console.log('🚀🚀🚀 ~ sdk.ts:53 ~ CetusLeverageSDK ~ this._aggregatorClient:', this._aggregatorClient)\n return this._aggregatorClient\n }\n\n get ClmmSDK(): CetusClmmSDK {\n return this._clmmSDK\n }\n\n static createSDK(options: BaseSdkOptions): CetusLeverageSDK {\n return CetusLeverageSDK.createCustomSDK({ ...leverage_mainnet, ...options })\n }\n\n static createCustomSDK<T extends BaseSdkOptions>(options: T & SdkOptions): CetusLeverageSDK {\n return new CetusLeverageSDK(options)\n }\n}\n","import { DefaultProviders, FullRpcUrlMainnet } from '@cetusprotocol/common-sdk'\nimport type { SdkOptions } from '..'\n\nconst SDKConfig = {\n\n}\n\nexport const leverage_mainnet: SdkOptions = {\n full_rpc_url: FullRpcUrlMainnet,\n env: 'mainnet',\n aggregator_url: 'https://api-sui.cetus.zone/router_v2',\n providers: DefaultProviders,\n leverage: {\n package_id: '0xa1265373a081c3529c303a727118205b6a766843fcefa9ffc6d3463b2a7a3117',\n published_at: '0xa1265373a081c3529c303a727118205b6a766843fcefa9ffc6d3463b2a7a3117',\n version: 0,\n config: {\n global_config_id: '0x248fe11489520df1902cef873fb7c83f055506b4510152450fb6925a4fe587f2',\n markets_table_id: '0x353e5a81fbc10a8efddb3217dc5200274bc5afc07496f83350b35fd6d715aba5'\n }\n },\n suilend: {\n lendingMarket: [\n {\n name: \"Main market\",\n slug: \"main\",\n id: \"0x84030d26d85eaa7035084a057f2f11f701b7e2e4eda87551becbc7c97505ece1\",\n type: \"0xf95b06141ed4a174f239417323bde3f209b972f5930d8521ea38a52aff3a6ddf::suilend::MAIN_POOL\",\n ownerCapId:\n \"0xf7a4defe0b6566b6a2674a02a0c61c9f99bd012eed21bc741a069eaa82d35927\",\n },\n {\n name: \"STEAMM LM\",\n slug: \"steamm-lm\",\n id: \"0xc1888ec1b81a414e427a44829310508352aec38252ee0daa9f8b181b6947de9f\",\n type: \"0x0a071f4976abae1a7f722199cf0bfcbe695ef9408a878e7d12a7ca87b7e582a6::lp_rewards::LP_REWARDS\",\n ownerCapId:\n \"0x55a0f33b24e091830302726c8cfbff8cf8abd2ec1f83a4e6f4bf51c7ba3ad5ab\",\n isHidden: true, // Only visible in the admin panel\n },\n ],\n lendingMarketId: '0x84030d26d85eaa7035084a057f2f11f701b7e2e4eda87551becbc7c97505ece1',\n lendingMarketType: '0xf95b06141ed4a174f239417323bde3f209b972f5930d8521ea38a52aff3a6ddf::suilend::MAIN_POOL',\n apiUrl: 'https://d10td5ybgrf39v.cloudfront.net'\n },\n}\n","import type { CetusLeverageSDK } from '../sdk'\nimport { SuilendClient } from '@suilend/sdk/client'\nimport { initializeSuilend, initializeSuilendRewards, initializeObligations, formatRewards, Side, getFilteredRewards, getStakingYieldAprPercent, getDedupedPerDayRewards, getDedupedAprRewards, getTotalAprPercent, getNetAprPercent } from '@suilend/sdk'\nimport { AllAppData } from '../types'\nimport BigNumber from 'bignumber.js'\nimport { appendExtraRewards, calculateBorrowAprPercent, calculateDepositAprPercent, getRewardsAprMultiplier, getUpdatedReserve, updateRewardsWithMultiplier } from '../utils/suiLend'\nimport { d } from '@cetusprotocol/common-sdk'\nimport { Transaction } from '@mysten/sui/dist/cjs/transactions'\n\nexport class SuiLendModule {\n private sdk: CetusLeverageSDK\n\n // 缓存变量\n lendingMarketCache?: AllAppData\n obligationsCache?: Record<string, any>\n\n // 添加 suilendClient 缓存\n private suilendClientCache?: Record<string, SuilendClient>\n\n constructor(sdk: CetusLeverageSDK) {\n this.sdk = sdk\n }\n\n /**\n * 获取或初始化 SuilendClient\n * @param lendingMarketId 借贷市场ID\n * @param lendingMarketType 借贷市场类型\n */\n private async getSuilendClient(lendingMarketId: string, lendingMarketType: string): Promise<SuilendClient> {\n const cacheKey = `${lendingMarketId}_${lendingMarketType}`\n\n if (!this.suilendClientCache) {\n this.suilendClientCache = {}\n }\n\n if (!this.suilendClientCache[cacheKey]) {\n this.suilendClientCache[cacheKey] = await SuilendClient.initialize(\n lendingMarketId,\n lendingMarketType,\n this.sdk.FullClient,\n true,\n )\n }\n\n return this.suilendClientCache[cacheKey]\n }\n\n /**\n * 获取借贷市场数据(缓存)\n * @param forceRefresh 是否强制刷新\n */\n async getLendingMarketData(forceRefresh = false): Promise<AllAppData> {\n if (!forceRefresh && this.lendingMarketCache) {\n return this.lendingMarketCache\n }\n\n const lendingMarkets = this.sdk.sdkOptions?.suilend?.lendingMarket || []\n\n if (!lendingMarkets.length) {\n console.warn('⚠️ No lending markets configured.')\n return {} as AllAppData\n }\n\n try {\n const [allLendingMarketData, lstAprPercentMap] = await Promise.all([\n (async () => {\n const allLendingMarketData: AllAppData[\"allLendingMarketData\"] =\n Object.fromEntries(\n await Promise.all(\n lendingMarkets.map(async (LENDING_MARKET) => {\n // 使用缓存的 SuilendClient\n const suilendClient = await this.getSuilendClient(\n LENDING_MARKET.id,\n LENDING_MARKET.type\n )\n\n const {\n lendingMarket,\n coinMetadataMap,\n refreshedRawReserves,\n reserveMap,\n reserveCoinTypes,\n reserveCoinMetadataMap,\n rewardCoinTypes,\n activeRewardCoinTypes,\n rewardCoinMetadataMap,\n } = await initializeSuilend(this.sdk.FullClient, suilendClient)\n\n const { rewardPriceMap } = await initializeSuilendRewards(\n reserveMap,\n activeRewardCoinTypes,\n )\n\n return [\n LENDING_MARKET.id,\n {\n suilendClient,\n lendingMarket,\n coinMetadataMap,\n refreshedRawReserves,\n reserveMap,\n reserveCoinTypes,\n reserveCoinMetadataMap,\n rewardPriceMap,\n rewardCoinTypes,\n activeRewardCoinTypes,\n rewardCoinMetadataMap,\n },\n ]\n }),\n ),\n )\n return allLendingMarketData\n })(),\n (async () => {\n try {\n const res = await fetch(`${this.sdk.sdkOptions?.suilend?.apiUrl}/springsui/apy`)\n const json: Record<string, string> = await res.json()\n if ((res as any)?.statusCode === 500)\n throw new Error(\"Failed to fetch SpringSui LST APRs\")\n\n return Object.fromEntries(\n Object.entries(json).map(([coinType, aprPercent]) => [\n coinType,\n new BigNumber(aprPercent),\n ]),\n )\n } catch (err) {\n console.error(err)\n return {} as AllAppData[\"lstAprPercentMap\"]\n }\n })(),\n ])\n\n // 存入缓存\n this.lendingMarketCache = { allLendingMarketData, lstAprPercentMap }\n\n return this.lendingMarketCache\n } catch (error) {\n console.log('🚀 getLendingMarketData error:', error)\n throw error\n }\n }\n\n /**\n * 获取 obligations 数据(缓存)\n * @param allAppData 借贷市场数据(可选)\n * @param forceRefresh 是否强制刷新\n */\n async getInitializeObligations(allAppData?: AllAppData, forceRefresh = false): Promise<any> {\n if (!forceRefresh && this.obligationsCache) {\n return this.obligationsCache\n }\n\n if (!allAppData) {\n allAppData = await this.getLendingMarketData()\n }\n\n const result: Record<string, any> = {}\n for (const appData of Object.values(allAppData.allLendingMarketData)) {\n const { obligationOwnerCaps, obligations } = await initializeObligations(\n this.sdk.FullClient,\n appData.suilendClient,\n appData.refreshedRawReserves,\n appData.reserveMap,\n this.sdk.senderAddress,\n )\n\n const rewardMap = formatRewards(\n appData.reserveMap,\n appData.rewardCoinMetadataMap,\n appData.rewardPriceMap as Record<string, BigNumber | undefined>,\n obligations,\n )\n\n result[appData.lendingMarket.id] = {\n obligationOwnerCaps,\n obligations,\n rewardMap,\n }\n }\n\n // 存入缓存\n this.obligationsCache = result\n\n return this.obligationsCache\n }\n\n getSuiLendCoinInfo = (coinType: string, changeAmount: BigNumber) => {\n const { allLendingMarketData, lstAprPercentMap } = this.lendingMarketCache ?? {}\n if (!allLendingMarketData || !lstAprPercentMap) {\n throw new Error('lendingMarketCache is not initialized')\n }\n\n const list: any = Object.values(allLendingMarketData ?? {})[0];\n const reserve = list.lendingMarket.reserves.find((r: any) => r.coinType === coinType);\n if (!reserve) {\n throw new Error('reserve not found')\n }\n const currentUserData = this.obligationsCache?.[list.lendingMarket.id];\n const side: Side = 'borrow' as Side;\n const rewards = currentUserData.rewardMap[reserve.token.coinType]?.[side] ?? [];\n\n const filteredRewards = getFilteredRewards(rewards);\n appendExtraRewards(side, reserve, filteredRewards, this.sdk);\n\n const stakingYieldAprPercent = getStakingYieldAprPercent(side, reserve.coinType, lstAprPercentMap);\n const aprPercent = side === Side.DEPOSIT ? reserve.depositAprPercent : reserve.borrowAprPercent;\n\n let newAprPercent: BigNumber | undefined = aprPercent;\n\n // 更新 reserve 数据\n const newReserve = getUpdatedReserve(reserve, side, changeAmount);\n newAprPercent = side === Side.DEPOSIT\n ? calculateDepositAprPercent(newReserve)\n : calculateBorrowAprPercent(newReserve);\n\n const { multiplier, isValid } = getRewardsAprMultiplier(side, reserve, newReserve);\n\n // 更新奖励\n const perDayRewards = getDedupedPerDayRewards(filteredRewards);\n const aprRewards = getDedupedAprRewards(filteredRewards);\n const { newPerDayRewards, newAprRewards } = updateRewardsWithMultiplier(perDayRewards, aprRewards, multiplier, isValid);\n\n // 总 APR\n const totalAprPercent = getTotalAprPercent(side, aprPercent, filteredRewards, stakingYieldAprPercent);\n const newTotalAprPercent =\n newAprPercent === undefined || newAprRewards.some((reward) => reward.stats.aprPercent === undefined)\n ? undefined\n : getTotalAprPercent(side, newAprPercent, newAprRewards, stakingYieldAprPercent);\n\n // console.log({\n // '最大可出借': reserve.config.borrowLimit.toString(),\n // '已出借': reserve.borrowedAmount.toString(),\n // '剩余可以出借': d(reserve.config.borrowLimit.toString()).sub(d(reserve.borrowedAmount.toString())).toString(),\n // '存款利率': reserve.depositAprPercent.toString(),\n // 'borrow 外部显示利率': totalAprPercent.toString(),\n // 'borrow Interest利率': aprPercent.toString(),\n // 'borrow 质押利率': stakingYieldAprPercent?.toString(),\n // 'reward apr': aprRewards[0]?.stats.aprPercent?.toString(),\n // });\n return {\n borrowLimit: reserve.config.borrowLimit.toString(),\n borrowedAmount: reserve.borrowedAmount.toString(),\n remainingBorrowLimit: d(reserve.config.borrowLimit.toString()).sub(d(reserve.borrowedAmount.toString())).toString(),\n depositAprPercent: reserve.depositAprPercent.toString(),\n totalAprPercent: totalAprPercent.toString(),\n borrowInterest: aprPercent.toString(),\n stakingYieldAprPercent: stakingYieldAprPercent?.toString(),\n rewardAprPercent: aprRewards[0]?.stats.aprPercent?.toString(),\n }\n }\n\n /**\n * 获取用户借贷数据\n * @param obligationId 借贷头寸ID(可选)\n * @param forceRefresh 是否强制刷新\n */\n async getSuiLendUserData(obligationId: string, forceRefresh = false) {\n const { lstAprPercentMap } = this.lendingMarketCache ?? {}\n const obligations = this.obligationsCache ?? {}\n const lendingMarketId = this.sdk.sdkOptions?.suilend?.lendingMarketId\n\n const userData = obligations[lendingMarketId]\n if (!userData) {\n throw new Error(`No user data found for lending market: ${lendingMarketId}`)\n }\n\n // 如果指定了 obligationId,返回特定的借贷头寸数据\n if (obligationId) {\n const obligation = userData.obligations.find((o: any) => o.id === obligationId)\n if (!obligation) {\n throw new Error(`Obligation not found: ${obligationId}`)\n }\n\n const netAprPercent = getNetAprPercent(\n obligation,\n userData.rewardMap,\n lstAprPercentMap ?? {},\n )\n\n return {\n obligation,\n netAprPercent,\n deposits: obligation.deposits,\n borrowedAmount: obligation.borrowedAmount,\n depositedAmount: obligation.depositedAmount,\n netValueUsd: obligation.netValueUsd,\n rewardMap: userData.rewardMap\n }\n }\n\n }\n\n // 创建新的头寸开仓时调用\n createObligation = async (transaction: Transaction) => {\n\n const { lendingMarketId, lendingMarketType } = this.sdk.sdkOptions?.suilend\n const suilendClient = await this.getSuilendClient(\n lendingMarketId,\n lendingMarketType\n )\n\n const obligationOwnerCapId = suilendClient.createObligation(transaction);\n return obligationOwnerCapId\n\n }\n}\n","/*\r\n * bignumber.js v9.3.1\r\n * A JavaScript library for arbitrary-precision arithmetic.\r\n * https://github.com/MikeMcl/bignumber.js\r\n * Copyright (c) 2025 Michael Mclaughlin <M8ch88l@gmail.com>\r\n * MIT Licensed.\r\n *\r\n * BigNumber.prototype methods | BigNumber methods\r\n * |\r\n * absoluteValue abs | clone\r\n * comparedTo | config set\r\n * decimalPlaces dp | DECIMAL_PLACES\r\n * dividedBy div | ROUNDING_MODE\r\n * dividedToIntegerBy idiv | EXPONENTIAL_AT\r\n * exponentiatedBy pow | RANGE\r\n * integerValue | CRYPTO\r\n * isEqualTo eq | MODULO_MODE\r\n * isFinite | POW_PRECISION\r\n * isGreaterThan gt | FORMAT\r\n * isGreaterThanOrEqualTo gte | ALPHABET\r\n * isInteger | isBigNumber\r\n * isLessThan lt | maximum max\r\n * isLessThanOrEqualTo lte | minimum min\r\n * isNaN | random\r\n * isNegative | sum\r\n * isPositive |\r\n * isZero |\r\n * minus |\r\n * modulo mod |\r\n * multipliedBy times |\r\n * negated |\r\n * plus |\r\n * precision sd |\r\n * shiftedBy |\r\n * squareRoot sqrt |\r\n * toExponential |\r\n * toFixed |\r\n * toFormat |\r\n * toFraction |\r\n * toJSON |\r\n * toNumber |\r\n * toPrecision |\r\n * toString |\r\n * valueOf |\r\n *\r\n */\r\n\r\n\r\nvar\r\n isNumeric = /^-?(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:e[+-]?\\d+)?$/i,\r\n mathceil = Math.ceil,\r\n mathfloor = Math.floor,\r\n\r\n bignumberError = '[BigNumber Error] ',\r\n tooManyDigits = bignumberError + 'Number primitive has more than 15 significant digits: ',\r\n\r\n BASE = 1e14,\r\n LOG_BASE = 14,\r\n MAX_SAFE_INTEGER = 0x1fffffffffffff, // 2^53 - 1\r\n // MAX_INT32 = 0x7fffffff, // 2^31 - 1\r\n POWS_TEN = [1, 10, 100, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9, 1e10, 1e11, 1e12, 1e13],\r\n SQRT_BASE = 1e7,\r\n\r\n // EDITABLE\r\n // The limit on the value of DECIMAL_PLACES, TO_EXP_NEG, TO_EXP_POS, MIN_EXP, MAX_EXP, and\r\n // the arguments to toExponential, toFixed, toFormat, and toPrecision.\r\n MAX = 1E9; // 0 to MAX_INT32\r\n\r\n\r\n/*\r\n * Create and return a BigNumber constructor.\r\n */\r\nfunction clone(configObject) {\r\n var div, convertBase, parseNumeric,\r\n P = BigNumber.prototype = { constructor: BigNumber, toString: null, valueOf: null },\r\n ONE = new BigNumber(1),\r\n\r\n\r\n //----------------------------- EDITABLE CONFIG DEFAULTS -------------------------------\r\n\r\n\r\n // The default values below must be integers within the inclusive ranges stated.\r\n // The values can also be changed at run-time using BigNumber.set.\r\n\r\n // The maximum number of decimal places for operations involving division.\r\n DECIMAL_PLACES = 20, // 0 to MAX\r\n\r\n // The rounding mode used when rounding to the above decimal places, and when using\r\n // toExponential, toFixed, toFormat and toPrecision, and round (default value).\r\n // UP 0 Away from zero.\r\n // DOWN 1 Towards zero.\r\n // CEIL 2 Towards +Infinity.\r\n // FLOOR 3 Towards -Infinity.\r\n // HALF_UP 4 Towards nearest neighbour. If equidistant, up.\r\n // HALF_DOWN 5 Towards nearest neighbour. If equidistant, down.\r\n // HALF_EVEN 6 Towards nearest neighbour. If equidistant, towards even neighbour.\r\n // HALF_CEIL 7 Towards nearest neighbour. If equidistant, towards +Infinity.\r\n // HALF_FLOOR 8 Towards nearest neighbour. If equidistant, towards -Infinity.\r\n ROUNDING_MODE = 4, // 0 to 8\r\n\r\n // EXPONENTIAL_AT : [TO_EXP_NEG , TO_EXP_POS]\r\n\r\n // The exponent value at and beneath which toString returns exponential notation.\r\n // Number type: -7\r\n TO_EXP_NEG = -7, // 0 to -MAX\r\n\r\n // The exponent value at and above which toString returns exponential notation.\r\n // Number type: 21\r\n TO_EXP_POS = 21, // 0 to MAX\r\n\r\n // RANGE : [MIN_EXP, MAX_EXP]\r\n\r\n // The minimum exponent value, beneath which underflow to zero occurs.\r\n // Number type: -324 (5e-324)\r\n MIN_EXP = -1e7, // -1 to -MAX\r\n\r\n // The maximum exponent value, above which overflow to Infinity occurs.\r\n // Number type: 308 (1.7976931348623157e+308)\r\n // For MAX_EXP > 1e7, e.g. new BigNumber('1e100000000').plus(1) may be slow.\r\n MAX_EXP = 1e7, // 1 to MAX\r\n\r\n // Whether to use cryptographically-secure random number generation, if available.\r\n CRYPTO = false, // true or false\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.\r\n // This modulo mode is commonly known as 'truncated division' and is\r\n // equivalent to (a % n) in JavaScript.\r\n // FLOOR 3 The remainder has the same sign as the divisor (Python %).\r\n // HALF_EVEN 6 This modulo mode implements the IEEE 754 remainder function.\r\n // EUCLID 9 Euclidian division. q = sign(n) * floor(a / abs(n)).\r\n // The remainder is always positive.\r\n //\r\n // The truncated division, floored division, Euclidian division and IEEE 754 remainder\r\n // modes are commonly used for the modulus operation.\r\n // Although the other rounding modes can also be used, they may not give useful results.\r\n MODULO_MODE = 1, // 0 to 9\r\n\r\n // The maximum number of significant digits of the result of the exponentiatedBy operation.\r\n // If POW_PRECISION is 0, there will be unlimited significant digits.\r\n POW_PRECISION = 0, // 0 to MAX\r\n\r\n // The format specification used by the BigNumber.prototype.toFormat method.\r\n FORMAT = {\r\n prefix: '',\r\n groupSize: 3,\r\n secondaryGroupSize: 0,\r\n groupSeparator: ',',\r\n decimalSeparator: '.',\r\n fractionGroupSize: 0,\r\n fractionGroupSeparator: '\\xA0', // non-breaking space\r\n suffix: ''\r\n },\r\n\r\n // The alphabet used for base conversion. It must be at least 2 characters long, with no '+',\r\n // '-', '.', whitespace, or repeated character.\r\n // '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ$_'\r\n ALPHABET = '0123456789abcdefghijklmnopqrstuvwxyz',\r\n alphabetHasNormalDecimalDigits = true;\r\n\r\n\r\n //------------------------------------------------------------------------------------------\r\n\r\n\r\n // CONSTRUCTOR\r\n\r\n\r\n /*\r\n * The BigNumber constructor and exported function.\r\n * Create and return a new instance of a BigNumber object.\r\n *\r\n * v {number|string|BigNumber} A numeric value.\r\n * [b] {number} The base of v. Integer, 2 to ALPHABET.length inclusive.\r\n */\r\n function BigNumber(v, b) {\r\n var alphabet, c, caseChanged, e, i, isNum, len, str,\r\n x = this;\r\n\r\n // Enable constructor call without `new`.\r\n if (!(x instanceof BigNumber)) return new BigNumber(v, b);\r\n\r\n if (b == null) {\r\n\r\n if (v && v._isBigNumber === true) {\r\n x.s = v.s;\r\n\r\n if (!v.c || v.e > MAX_EXP) {\r\n x.c = x.e = null;\r\n } else if (v.e < MIN_EXP) {\r\n x.c = [x.e = 0];\r\n } else {\r\n x.e = v.e;\r\n x.c = v.c.slice();\r\n }\r\n\r\n return;\r\n }\r\n\r\n if ((isNum = typeof v == 'number') && v * 0 == 0) {\r\n\r\n // Use `1 / n` to handle minus zero also.\r\n x.s = 1 / v < 0 ? (v = -v, -1) : 1;\r\n\r\n // Fast path for integers, where n < 2147483648 (2**31).\r\n if (v === ~~v) {\r\n for (e = 0, i = v; i >= 10; i /= 10, e++);\r\n\r\n if (e > MAX_EXP) {\r\n x.c = x.e = null;\r\n } else {\r\n x.e = e;\r\n x.c = [v];\r\n }\r\n\r\n return;\r\n }\r\n\r\n str = String(v);\r\n } else {\r\n\r\n if (!isNumeric.test(str = String(v))) return parseNumeric(x, str, isNum);\r\n\r\n x.s = str.charCodeAt(0) == 45 ? (str = str.slice(1), -1) : 1;\r\n }\r\n\r\n // Decimal point?\r\n if ((e = str.indexOf('.')) > -1) str = str.replace('.', '');\r\n\r\n // Exponential form?\r\n if ((i = str.search(/e/i)) > 0) {\r\n\r\n // Determine exponent.\r\n if (e < 0) e = i;\r\n e += +str.slice(i + 1);\r\n str = str.substring(0, i);\r\n } else if (e < 0) {\r\n\r\n // Integer.\r\n e = str.length;\r\n }\r\n\r\n } else {\r\n\r\n // '[BigNumber Error] Base {not a primitive number|not an integer|out of range}: {b}'\r\n intCheck(b, 2, ALPHABET.length, 'Base');\r\n\r\n // Allow exponential notation to be used with base 10 argument, while\r\n // also rounding to DECIMAL_PLACES as with other bases.\r\n if (b == 10 && alphabetHasNormalDecimalDigits) {\r\n x = new BigNumber(v);\r\n return round(x, DECIMAL_PLACES + x.e + 1, ROUNDING_MODE);\r\n }\r\n\r\n str = String(v);\r\n\r\n if (isNum = typeof v == 'number') {\r\n\r\n // Avoid potential interpretation of Infinity and NaN as base 44+ values.\r\n if (v * 0 != 0) return parseNumeric(x, str, isNum, b);\r\n\r\n x.s = 1 / v < 0 ? (str = str.slice(1), -1) : 1;\r\n\r\n // '[BigNumber Error] Number primitive has more than 15 significant digits: {n}'\r\n if (BigNumber.DEBUG && str.replace(/^0\\.0*|\\./, '').length > 15) {\r\n throw Error\r\n (tooManyDigits + v);\r\n }\r\n } else {\r\n x.s = str.charCodeAt(0) === 45 ? (str = str.slice(1), -1) : 1;\r\n }\r\n\r\n alphabet = ALPHABET.slice(0, b);\r\n e = i = 0;\r\n\r\n // Check that str is a valid base b number.\r\n // Don't use RegExp, so alphabet can contain special characters.\r\n for (len = str.length; i < len; i++) {\r\n if (alphabet.indexOf(c = str.charAt(i)) < 0) {\r\n if (c == '.') {\r\n\r\n // If '.' is not the first character and it has not be found before.\r\n if (i > e) {\r\n e = len;\r\n continue;\r\n }\r\n } else if (!caseChanged) {\r\n\r\n // Allow e.g. hexadecimal 'FF' as well as 'ff'.\r\n if (str == str.toUpperCase() && (str = str.toLowerCase()) ||\r\n str == str.toLowerCase() && (str = str.toUpperCase())) {\r\n caseChanged = true;\r\n i = -1;\r\n e = 0;\r\n continue;\r\n }\r\n }\r\n\r\n return parseNumeric(x, String(v), isNum, b);\r\n }\r\n }\r\n\r\n // Prevent later check for length on converted number.\r\n isNum = false;\r\n str = convertBase(str, b, 10, x.s);\r\n\r\n // Decimal point?\r\n if ((e = str.indexOf('.')) > -1) str = str.replace('.', '');\r\n else 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) === 48;);\r\n\r\n if (str = str.slice(i, ++len)) {\r\n len -= i;\r\n\r\n // '[BigNumber Error] Number primitive has more than 15 significant digits: {n}'\r\n if (isNum && BigNumber.DEBUG &&\r\n len > 15 && (v > MAX_SAFE_INTEGER || v !== mathfloor(v))) {\r\n throw Error\r\n (tooManyDigits + (x.s * v));\r\n }\r\n\r\n // Overflow?\r\n if ((e = e - i - 1) > MAX_EXP) {\r\n\r\n // Infinity.\r\n x.c = x.e = null;\r\n\r\n // Underflow?\r\n } else if (e < MIN_EXP) {\r\n\r\n // Zero.\r\n x.c = [x.e = 0];\r\n } else {\r\n x.e = e;\r\n x.c = [];\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 element of the coefficient array.\r\n i = (e + 1) % LOG_BASE;\r\n if (e < 0) i += LOG_BASE; // i < 1\r\n\r\n if (i < len) {\r\n if (i) x.c.push(+str.slice(0, i));\r\n\r\n for (len -= LOG_BASE; i < len;) {\r\n x.c.push(+str.slice(i, i += LOG_BASE));\r\n }\r\n\r\n i = LOG_BASE - (str = str.slice(i)).length;\r\n } else {\r\n i -= len;\r\n }\r\n\r\n for (; i--; str += '0');\r\n x.c.push(+str);\r\n }\r\n } else {\r\n\r\n // Zero.\r\n x.c = [x.e = 0];\r\n }\r\n }\r\n\r\n\r\n // CONSTRUCTOR PROPERTIES\r\n\r\n\r\n BigNumber.clone = clone;\r\n\r\n BigNumber.ROUND_UP = 0;\r\n BigNumber.ROUND_DOWN = 1;\r\n BigNumber.ROUND_CEIL = 2;\r\n BigNumber.ROUND_FLOOR = 3;\r\n BigNumber.ROUND_HALF_UP = 4;\r\n BigNumber.ROUND_HALF_DOWN = 5;\r\n BigNumber.ROUND_HALF_EVEN = 6;\r\n BigNumber.ROUND_HALF_CEIL = 7;\r\n BigNumber.ROUND_HALF_FLOOR = 8;\r\n BigNumber.EUCLID = 9;\r\n\r\n\r\n /*\r\n * Configure infrequently-changing library-wide settings.\r\n *\r\n * Accept an object with the following optional properties (if the value of a property is\r\n * a number, it must be an integer within the inclusive range stated):\r\n *\r\n * DECIMAL_PLACES {number} 0 to MAX\r\n * ROUNDING_MODE {number} 0 to 8\r\n * EXPONENTIAL_AT {number|number[]} -MAX to MAX or [-MAX to 0, 0 to MAX]\r\n * RANGE {number|number[]} -MAX to MAX (not zero) or [-MAX to -1, 1 to MAX]\r\n * CRYPTO {boolean} true or false\r\n * MODULO_MODE {number} 0 to 9\r\n * POW_PRECISION {number} 0 to MAX\r\n * ALPHABET {string} A string of two or more unique characters which does\r\n * not contain '.'.\r\n * FORMAT {object} An object with some of the following properties:\r\n * prefix {string}\r\n * groupSize {number}\r\n * secondaryGroupSize {number}\r\n * groupSeparator {string}\r\n * decimalSeparator {string}\r\n * fractionGroupSize {number}\r\n * fractionGroupSeparator {string}\r\n * suffix {string}\r\n *\r\n * (The values assigned to the above FORMAT object properties are not checked for validity.)\r\n *\r\n * E.g.\r\n * BigNumber.config({ DECIMAL_PLACES : 20, ROUNDING_MODE : 4 })\r\n *\r\n * Ignore properties/parameters set to null or undefined, except for ALPHABET.\r\n *\r\n * Return an object with the properties current values.\r\n */\r\n BigNumber.config = BigNumber.set = function (obj) {\r\n var p, v;\r\n\r\n if (obj != null) {\r\n\r\n if (typeof obj == 'object') {\r\n\r\n // DECIMAL_PLACES {number} Integer, 0 to MAX inclusive.\r\n // '[BigNumber Error] DECIMAL_PLACES {not a primitive number|not an integer|out of range}: {v}'\r\n if (obj.hasOwnProperty(p = 'DECIMAL_PLACES')) {\r\n v = obj[p];\r\n intCheck(v, 0, MAX, p);\r\n DECIMAL_PLACES = v;\r\n }\r\n\r\n // ROUNDING_MODE {number} Integer, 0 to 8 inclusive.\r\n // '[BigNumber Error] ROUNDING_MODE {not a primitive number|not an integer|out of range}: {v}'\r\n if (obj.hasOwnProperty(p = 'ROUNDING_MODE')) {\r\n v = obj[p];\r\n intCheck(v, 0, 8, p);\r\n ROUNDING_MODE = v;\r\n }\r\n\r\n // EXPONENTIAL_AT {number|number[]}\r\n // Integer, -MAX to MAX inclusive or\r\n // [integer -MAX to 0 inclusive, 0 to MAX inclusive].\r\n // '[BigNumber Error] EXPONENTIAL_AT {not a primitive number|not an integer|out of range}: {v}'\r\n if (obj.hasOwnProperty(p = 'EXPONENTIAL_AT')) {\r\n v = obj[p];\r\n if (v && v.pop) {\r\n intCheck(v[0], -MAX, 0, p);\r\n intCheck(v[1], 0, MAX, p);\r\n TO_EXP_NEG = v[0];\r\n TO_EXP_POS = v[1];\r\n } else {\r\n intCheck(v, -MAX, MAX, p);\r\n TO_EXP_NEG = -(TO_EXP_POS = v < 0 ? -v : v);\r\n }\r\n }\r\n\r\n // RANGE {number|number[]} Non-zero integer, -MAX to MAX inclusive or\r\n // [integer -MAX to -1 inclusive, integer 1 to MAX inclusive].\r\n // '[BigNumber Error] RANGE {not a primitive number|not an integer|out of range|cannot be zero}: {v}'\r\n if (obj.hasOwnProperty(p = 'RANGE')) {\r\n v = obj[p];\r\n if (v && v.pop) {\r\n intCheck(v[0], -MAX, -1, p);\r\n intCheck(v[1], 1, MAX, p);\r\n MIN_EXP = v[0];\r\n MAX_EXP = v[1];\r\n } else {\r\n intCheck(v, -MAX, MAX, p);\r\n if (v) {\r\n MIN_EXP = -(MAX_EXP = v < 0 ? -v : v);\r\n } else {\r\n throw Error\r\n (bignumberError + p + ' cannot be zero: ' + v);\r\n }\r\n }\r\n }\r\n\r\n // CRYPTO {boolean} true or false.\r\n // '[BigNumber Error] CRYPTO not true or false: {v}'\r\n // '[BigNumber Error] crypto unavailable'\r\n if (obj.hasOwnProperty(p = 'CRYPTO')) {\r\n v = obj[p];\r\n if (v === !!v) {\r\n if (v) {\r\n if (typeof crypto != 'undefined' && crypto &&\r\n (crypto.getRandomValues || crypto.randomBytes)) {\r\n CRYPTO = v;\r\n } else {\r\n CRYPTO = !v;\r\n throw Error\r\n (bignumberError + 'crypto unavailable');\r\n }\r\n } else {\r\n CRYPTO = v;\r\n }\r\n } else {\r\n throw Error\r\n (bignumberError + p + ' not true or false: ' + v);\r\n }\r\n }\r\n\r\n // MODULO_MODE {number} Integer, 0 to 9 inclusive.\r\n // '[BigNumber Error] MODULO_MODE {not a primitive number|not an integer|out of range}: {v}'\r\n if (obj.hasOwnProperty(p = 'MODULO_MODE')) {\r\n v = obj[p];\r\n intCheck(v, 0, 9, p);\r\n MODULO_MODE = v;\r\n }\r\n\r\n // POW_PRECISION {number} Integer, 0 to MAX inclusive.\r\n // '[BigNumber Error] POW_PRECISION {not a primitive number|not an integer|out of range}: {v}'\r\n if (obj.hasOwnProperty(p = 'POW_PRECISION')) {\r\n v = obj[p];\r\n intCheck(v, 0, MAX, p);\r\n POW_PRECISION = v;\r\n }\r\n\r\n // FORMAT {object}\r\n // '[BigNumber Error] FORMAT not an object: {v}'\r\n if (obj.hasOwnProperty(p = 'FORMAT')) {\r\n v = obj[p];\r\n if (typeof v == 'object') FORMAT = v;\r\n else throw Error\r\n (bignumberError + p + ' not an object: ' + v);\r\n }\r\n\r\n // ALPHABET {string}\r\n // '[BigNumber Error] ALPHABET invalid: {v}'\r\n if (obj.hasOwnProperty(p = 'ALPHABET')) {\r\n v = obj[p];\r\n\r\n // Disallow if less than two characters,\r\n // or if it contains '+', '-', '.', whitespace, or a repeated character.\r\n if (typeof v == 'string' && !/^.?$|[+\\-.\\s]|(.).*\\1/.test(v)) {\r\n alphabetHasNormalDecimalDigits = v.slice(0, 10) == '0123456789';\r\n ALPHABET = v;\r\n } else {\r\n throw Error\r\n (bignumberError + p + ' invalid: ' + v);\r\n }\r\n }\r\n\r\n } else {\r\n\r\n // '[BigNumber Error] Object expected: {v}'\r\n throw Error\r\n (bignumberError + 'Object expected: ' + obj);\r\n }\r\n }\r\n\r\n return {\r\n DECIMAL_PLACES: DECIMAL_PLACES,\r\n ROUNDING_MODE: ROUNDING_MODE,\r\n EXPONENTIAL_AT: [TO_EXP_NEG, TO_EXP_POS],\r\n RANGE: [MIN_EXP, MAX_EXP],\r\n CRYPTO: CRYPTO,\r\n MODULO_MODE: MODULO_MODE,\r\n POW_PRECISION: POW_PRECISION,\r\n FORMAT: FORMAT,\r\n ALPHABET: ALPHABET\r\n };\r\n };\r\n\r\n\r\n /*\r\n * Return true if v is a BigNumber instance, otherwise return false.\r\n *\r\n * If BigNumber.DEBUG is true, throw if a BigNumber instance is not well-formed.\r\n *\r\n * v {any}\r\n *\r\n * '[BigNumber Error] Invalid BigNumber: {v}'\r\n */\r\n BigNumber.isBigNumber = function (v) {\r\n if (!v || v._isBigNumber !== true) return false;\r\n if (!BigNumber.DEBUG) return true;\r\n\r\n var i, n,\r\n c = v.c,\r\n e = v.e,\r\n s = v.s;\r\n\r\n out: if ({}.toString.call(c) == '[object Array]') {\r\n\r\n if ((s === 1 || s === -1) && e >= -MAX && e <= MAX && e === mathfloor(e)) {\r\n\r\n // If the first element is zero, the BigNumber value must be zero.\r\n if (c[0] === 0) {\r\n if (e === 0 && c.length === 1) return true;\r\n break out;\r\n }\r\n\r\n // Calculate number of digits that c[0] should have, based on the exponent.\r\n i = (e + 1) % LOG_BASE;\r\n if (i < 1) i += LOG_BASE;\r\n\r\n // Calculate number of digits of c[0].\r\n //if (Math.ceil(Math.log(c[0] + 1) / Math.LN10) == i) {\r\n if (String(c[0]).length == i) {\r\n\r\n for (i = 0; i < c.length; i++) {\r\n n = c[i];\r\n if (n < 0 || n >= BASE || n !== mathfloor(n)) break out;\r\n }\r\n\r\n // Last element cannot be zero, unless it is the only element.\r\n if (n !== 0) return true;\r\n }\r\n }\r\n\r\n // Infinity/NaN\r\n } else if (c === null && e === null && (s === null || s === 1 || s === -1)) {\r\n return true;\r\n }\r\n\r\n throw Error\r\n (bignumberError + 'Invalid BigNumber: ' + v);\r\n };\r\n\r\n\r\n /*\r\n * Return a new BigNumber whose value is the maximum of the arguments.\r\n *\r\n * arguments {number|string|BigNumber}\r\n */\r\n BigNumber.maximum = BigNumber.max = function () {\r\n return maxOrMin(arguments, -1);\r\n };\r\n\r\n\r\n /*\r\n * Return a new BigNumber whose value is the minimum of the arguments.\r\n *\r\n * arguments {number|string|BigNumber}\r\n */\r\n BigNumber.minimum = BigNumber.min = function () {\r\n return maxOrMin(arguments, 1);\r\n };\r\n\r\n\r\n /*\r\n * Return a new BigNumber with a random value equal to or greater than 0 and less than 1,\r\n * and with dp, or DECIMAL_PLACES if dp is omitted, decimal places (or less if trailing\r\n * zeros are produced).\r\n *\r\n * [dp] {number} Decimal places. Integer, 0 to MAX inclusive.\r\n *\r\n * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {dp}'\r\n * '[BigNumber Error] crypto unavailable'\r\n */\r\n BigNumber.random = (function () {\r\n var pow2_53 = 0x20000000000000;\r\n\r\n // Return a 53 bit integer n, where 0 <= n < 9007199254740992.\r\n // Check if Math.random() produces more than 32 bits of randomness.\r\n // If it does, assume at least 53 bits are produced, otherwise assume at least 30 bits.\r\n // 0x40000000 is 2^30, 0x800000 is 2^23, 0x1fffff is 2^21 - 1.\r\n var random53bitInt = (Math.random() * pow2_53) & 0x1fffff\r\n ? function () { return mathfloor(Math.random() * pow2_53); }\r\n : function () { return ((Math.random() * 0x40000000 | 0) * 0x800000) +\r\n (Math.random() * 0x800000 | 0); };\r\n\r\n return function (dp) {\r\n var a, b, e, k, v,\r\n i = 0,\r\n c = [],\r\n rand = new BigNumber(ONE);\r\n\r\n if (dp == null) dp = DECIMAL_PLACES;\r\n else intCheck(dp, 0, MAX);\r\n\r\n k = mathceil(dp / LOG_BASE);\r\n\r\n if (CRYPTO) {\r\n\r\n // Browsers supporting crypto.getRandomValues.\r\n if (crypto.getRandomValues) {\r\n\r\n a = crypto.getRandomValues(new Uint32Array(k *= 2));\r\n\r\n for (; i < k;) {\r\n\r\n // 53 bits:\r\n // ((Math.pow(2, 32) - 1) * Math.pow(2, 21)).toString(2)\r\n // 11111 11111111 11111111 11111111 11100000 00000000 00000000\r\n // ((Math.pow(2, 32) - 1) >>> 11).toString(2)\r\n // 11111 11111111 11111111\r\n // 0x20000 is 2^21.\r\n v = a[i] * 0x20000 + (a[i + 1] >>> 11);\r\n\r\n // Rejection sampling:\r\n // 0 <= v < 9007199254740992\r\n // Probability that v >= 9e15, is\r\n // 7199254740992 / 9007199254740992 ~= 0.0008, i.e. 1 in 1251\r\n if (v >= 9e15) {\r\n b = crypto.getRandomValues(new Uint32Array(2));\r\n a[i] = b[0];\r\n a[i + 1] = b[1];\r\n } else {\r\n\r\n // 0 <= v <= 8999999999999999\r\n // 0 <= (v % 1e14) <= 99999999999999\r\n c.push(v % 1e14);\r\n i += 2;\r\n }\r\n }\r\n i = k / 2;\r\n\r\n // Node.js supporting crypto.randomBytes.\r\n } else if (crypto.randomBytes) {\r\n\r\n // buffer\r\n a = crypto.randomBytes(k *= 7);\r\n\r\n for (; i < k;) {\r\n\r\n // 0x1000000000000 is 2^48, 0x10000000000 is 2^40\r\n // 0x100000000 is 2^32, 0x1000000 is 2^24\r\n // 11111 11111111 11111111 11111111 11111111 11111111 11111111\r\n // 0 <= v < 9007199254740992\r\n v = ((a[i] & 31) * 0x1000000000000) + (a[i + 1] * 0x10000000000) +\r\n (a[i + 2] * 0x100000000) + (a[i + 3] * 0x1000000) +\r\n (a[i + 4] << 16) + (a[i + 5] << 8) + a[i + 6];\r\n\r\n if (v >= 9e15) {\r\n crypto.randomBytes(7).copy(a, i);\r\n } else {\r\n\r\n // 0 <= (v % 1e14) <= 99999999999999\r\n c.push(v % 1e14);\r\n i += 7;\r\n }\r\n }\r\n i = k / 7;\r\n } else {\r\n CRYPTO = false;\r\n throw Error\r\n (bignumberError + 'crypto unavailable');\r\n }\r\n }\r\n\r\n // Use Math.random.\r\n if (!CRYPTO) {\r\n\r\n for (; i < k;) {\r\n v = random53bitInt();\r\n if (v < 9e15) c[i++] = v % 1e14;\r\n }\r\n }\r\n\r\n k = c[--i];\r\n dp %= LOG_BASE;\r\n\r\n // Convert trailing digits to zeros according to dp.\r\n if (k && dp) {\r\n v = POWS_TEN[LOG_BASE - dp];\r\n c[i] = mathfloor(k / v) * v;\r\n }\r\n\r\n // Remove trailing elements which are zero.\r\n for (; c[i] === 0; c.pop(), i--);\r\n\r\n // Zero?\r\n if (i < 0) {\r\n c = [e = 0];\r\n } else {\r\n\r\n // Remove leading elements which are zero and adjust exponent accordingly.\r\n for (e = -1 ; c[0] === 0; c.splice(0, 1), e -= LOG_BASE);\r\n\r\n // Count the digits of the first element of c to determine leading zeros, and...\r\n for (i = 1, v = c[0]; v >= 10; v /= 10, i++);\r\n\r\n // adjust the exponent accordingly.\r\n if (i < LOG_BASE) e -= LOG_BASE - i;\r\n }\r\n\r\n rand.e = e;\r\n rand.c = c;\r\n return rand;\r\n };\r\n })();\r\n\r\n\r\n /*\r\n * Return a BigNumber whose value is the sum of the arguments.\r\n *\r\n * arguments {number|string|BigNumber}\r\n */\r\n BigNumber.sum = function () {\r\n var i = 1,\r\n args = arguments,\r\n sum = new BigNumber(args[0]);\r\n for (; i < args.length;) sum = sum.plus(args[i++]);\r\n return sum;\r\n };\r\n\r\n\r\n // PRIVATE FUNCTIONS\r\n\r\n\r\n // Called by BigNumber and BigNumber.prototype.toString.\r\n convertBase = (function () {\r\n var decimal = '0123456789';\r\n\r\n /*\r\n * Convert string of baseIn to an array of numbers of baseOut.\r\n * Eg. toBaseOut('255', 10, 16) returns [15, 15].\r\n * Eg. toBaseOut('ff', 16, 10) returns [2, 5, 5].\r\n */\r\n function toBaseOut(str, baseIn, baseOut, alphabet) {\r\n var j,\r\n arr = [0],\r\n arrL,\r\n i = 0,\r\n len = str.length;\r\n\r\n for (; i < len;) {\r\n for (arrL = arr.length; arrL--; arr[arrL] *= baseIn);\r\n\r\n arr[0] += alphabet.indexOf(str.charAt(i++));\r\n\r\n for (j = 0; j < arr.length; j++) {\r\n\r\n if (arr[j] > baseOut - 1) {\r\n if (arr[j + 1] == null) 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 // Convert a numeric string of baseIn to a numeric string of baseOut.\r\n // If the caller is toString, we are converting from base 10 to baseOut.\r\n // If the caller is BigNumber, we are converting from baseIn to base 10.\r\n return function (str, baseIn, baseOut, sign, callerIsToString) {\r\n var alphabet, d, e, k, r, x, xc, y,\r\n i = str.indexOf('.'),\r\n dp = DECIMAL_PLACES,\r\n rm = ROUNDING_MODE;\r\n\r\n // Non-integer.\r\n if (i >= 0) {\r\n k = POW_PRECISION;\r\n\r\n // Unlimited precision.\r\n POW_PRECISION = 0;\r\n str = str.replace('.', '');\r\n y = new BigNumber(baseIn);\r\n x = y.pow(str.length - i);\r\n POW_PRECISION = k;\r\n\r\n // Convert str as if an integer, then restore the fraction part by dividing the\r\n // result by its base raised to a power.\r\n\r\n y.c = toBaseOut(toFixedPoint(coeffToString(x.c), x.e, '0'),\r\n 10, baseOut, decimal);\r\n y.e = y.c.length;\r\n }\r\n\r\n // Convert the number as integer.\r\n\r\n xc = toBaseOut(str, baseIn, baseOut, callerIsToString\r\n ? (alphabet = ALPHABET, decimal)\r\n : (alphabet = decimal, ALPHABET));\r\n\r\n // xc now represents str as an integer and converted to baseOut. e is the exponent.\r\n e = k = xc.length;\r\n\r\n // Remove trailing zeros.\r\n for (; xc[--k] == 0; xc.pop());\r\n\r\n // Zero?\r\n if (!xc[0]) return alphabet.charAt(0);\r\n\r\n // Does str represent an integer? If so, no need for the division.\r\n if (i < 0) {\r\n --e;\r\n } else {\r\n x.c = xc;\r\n x.e = e;\r\n\r\n // The sign is needed for correct rounding.\r\n x.s = sign;\r\n x = div(x, y, dp, rm, baseOut);\r\n xc = x.c;\r\n r = x.r;\r\n e = x.e;\r\n }\r\n\r\n // xc now represents str converted to baseOut.\r\n\r\n // The index of the rounding digit.\r\n d = e + dp + 1;\r\n\r\n // The rounding digit: the digit to the right of the digit that may be rounded up.\r\n i = xc[d];\r\n\r\n // Look at the rounding digits and mode to determine whether to round up.\r\n\r\n k = baseOut / 2;\r\n r = r || d < 0 || xc[d + 1] != null;\r\n\r\n r = rm < 4 ? (i != null || r) && (rm == 0 || rm == (x.s < 0 ? 3 : 2))\r\n : i > k || i == k &&(rm == 4 || r || rm == 6 && xc[d - 1] & 1 ||\r\n rm == (x.s < 0 ? 8 : 7));\r\n\r\n // If the index of the rounding digit is not greater than zero, or xc represents\r\n // zero, then the result of the base conversion is zero or, if rounding up, a value\r\n // such as 0.00001.\r\n if (d < 1 || !xc[0]) {\r\n\r\n // 1^-dp or 0\r\n str = r ? toFixedPoint(alphabet.charAt(1), -dp, alphabet.charAt(0)) : alphabet.charAt(0);\r\n } else {\r\n\r\n // Truncate xc to the required number of decimal places.\r\n xc.length = d;\r\n\r\n // Round up?\r\n if (r) {\r\n\r\n // Rounding up may mean the previous digit has to be rounded up and so on.\r\n for (--baseOut; ++xc[--d] > baseOut;) {\r\n xc[d] = 0;\r\n\r\n if (!d) {\r\n ++e;\r\n xc = [1].concat(xc);\r\n }\r\n }\r\n }\r\n\r\n // Determine trailing zeros.\r\n for (k = xc.length; !xc[--k];);\r\n\r\n // E.g. [4, 11, 15] becomes 4bf.\r\n for (i = 0, str = ''; i <= k; str += alphabet.charAt(xc[i++]));\r\n\r\n // Add leading zeros, decimal point and trailing zeros as required.\r\n str = toFixedPoint(str, e, alphabet.charAt(0));\r\n }\r\n\r\n // The caller will add the sign.\r\n return str;\r\n };\r\n })();\r\n\r\n\r\n // Perform division in the specified base. Called by div and convertBase.\r\n div = (function () {\r\n\r\n // Assume non-zero x and k.\r\n function multiply(x, k, base) {\r\n var m, temp, xlo, xhi,\r\n carry = 0,\r\n i = x.length,\r\n klo = k % SQRT_BASE,\r\n khi = k / SQRT_BASE | 0;\r\n\r\n for (x = x.slice(); i--;) {\r\n xlo = x[i] % SQRT_BASE;\r\n xhi = x[i] / SQRT_BASE | 0;\r\n m = khi * xlo + xhi * klo;\r\n temp = klo * xlo + ((m % SQRT_BASE) * SQRT_BASE) + carry;\r\n carry = (temp / base | 0) + (m / SQRT_BASE | 0) + khi * xhi;\r\n x[i] = temp % base;\r\n }\r\n\r\n if (carry) x = [carry].concat(x);\r\n\r\n return x;\r\n }\r\n\r\n function compare(a, b, aL, bL) {\r\n var i, cmp;\r\n\r\n if (aL != bL) {\r\n cmp = aL > bL ? 1 : -1;\r\n } else {\r\n\r\n for (i = cmp = 0; i < aL; i++) {\r\n\r\n if (a[i] != b[i]) {\r\n cmp = a[i] > b[i] ? 1 : -1;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return cmp;\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.splice(0, 1));\r\n }\r\n\r\n // x: dividend, y: divisor.\r\n return function (x, y, dp, rm, base) {\r\n var cmp, e, i, more, n, prod, prodL, q, qc, rem, remL, rem0, xi, xL, yc0,\r\n yL, yz,\r\n s = x.s == y.s ? 1 : -1,\r\n xc = x.c,\r\n yc = y.c;\r\n\r\n // Either NaN, Infinity or 0?\r\n if (!xc || !xc[0] || !yc || !yc[0]) {\r\n\r\n return new BigNumber(\r\n\r\n // Return NaN if either NaN, or both Infinity or 0.\r\n !x.s || !y.s || (xc ? yc && xc[0] == yc[0] : !yc) ? NaN :\r\n\r\n // Return ±0 if x is ±0 or y is ±Infinity, or return ±Infinity as y is ±0.\r\n xc && xc[0] == 0 || !yc ? s * 0 : s / 0\r\n );\r\n }\r\n\r\n q = new BigNumber(s);\r\n qc = q.c = [];\r\n e = x.e - y.e;\r\n s = dp + e + 1;\r\n\r\n if (!base) {\r\n base = BASE;\r\n e = bitFloor(x.e / LOG_BASE) - bitFloor(y.e / LOG_BASE);\r\n s = s / LOG_BASE | 0;\r\n }\r\n\r\n // Result exponent may be one less then the current value of e.\r\n // The coefficients of the BigNumbers from convertBase may have trailing zeros.\r\n for (i = 0; yc[i] == (xc[i] || 0); i++);\r\n\r\n if (yc[i] > (xc[i] || 0)) e--;\r\n\r\n if (s < 0) {\r\n qc.push(1);\r\n more = true;\r\n } else {\r\n xL = xc.length;\r\n yL = yc.length;\r\n i = 0;\r\n s += 2;\r\n\r\n // Normalise xc and yc so highest order digit of yc is >= base / 2.\r\n\r\n n = mathfloor(base / (yc[0] + 1));\r\n\r\n // Not necessary, but to handle odd bases where yc[0] == (base / 2) - 1.\r\n // if (n > 1 || n++ == 1 && yc[0] < base / 2) {\r\n if (n > 1) {\r\n yc = multiply(yc, n, base);\r\n xc = multiply(xc, n, base);\r\n yL = yc.length;\r\n xL = xc.length;\r\n }\r\n\r\n xi = yL;\r\n rem = xc.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 yz = yc.slice();\r\n yz = [0].concat(yz);\r\n yc0 = yc[0];\r\n if (yc[1] >= base / 2) yc0++;\r\n // Not necessary, but to prevent trial digit n > base, when using base 3.\r\n // else if (base == 3 && yc0 == 1) yc0 = 1 + 1e-15;\r\n\r\n do {\r\n n = 0;\r\n\r\n // Compare divisor and remainder.\r\n cmp = compare(yc, rem, yL, remL);\r\n\r\n // If divisor < remainder.\r\n if (cmp < 0) {\r\n\r\n // Calculate trial digit, n.\r\n\r\n rem0 = rem[0];\r\n if (yL != remL) rem0 = rem0 * base + (rem[1] || 0);\r\n\r\n // n is how many times the divisor goes into the current remainder.\r\n n = mathfloor(rem0 / yc0);\r\n\r\n // Algorithm:\r\n // product = divisor multiplied by trial digit (n).\r\n // Compare product and remainder.\r\n // If product is greater than remainder:\r\n // Subtract divisor from product, decrement trial digit.\r\n // Subtract product from remainder.\r\n // If product was less than remainder at the last compare:\r\n // Compare new remainder and divisor.\r\n // If remainder is greater than divisor:\r\n // Subtract divisor from remainder, increment trial digit.\r\n\r\n if (n > 1) {\r\n\r\n // n may be > base only when base is 3.\r\n if (n >= base) n = base - 1;\r\n\r\n // product = divisor * trial digit.\r\n prod = multiply(yc, n, base);\r\n prodL = prod.length;\r\n remL = rem.length;\r\n\r\n // Compare product and remainder.\r\n // If product > remainder then trial digit n too high.\r\n // n is 1 too high about 5% of the time, and is not known to have\r\n // ever been more than 1 too high.\r\n while (compare(prod, rem, prodL, remL) == 1) {\r\n n--;\r\n\r\n // Subtract divisor from product.\r\n subtract(prod, yL < prodL ? yz : yc, prodL, base);\r\n prodL = prod.length;\r\n cmp = 1;\r\n }\r\n } else {\r\n\r\n // n is 0 or 1, cmp is -1.\r\n // If n is 0, there is no need to compare yc and rem again below,\r\n // so change cmp to 1 to avoid it.\r\n // If n is 1, leave cmp as -1, so yc and rem are compared again.\r\n if (n == 0) {\r\n\r\n // divisor < remainder, so n must be at least 1.\r\n cmp = n = 1;\r\n }\r\n\r\n // product = divisor\r\n prod = yc.slice();\r\n prodL = prod.length;\r\n }\r\n\r\n if (prodL < remL) prod = [0].concat(prod);\r\n\r\n // Subtract product from remainder.\r\n subtract(rem, prod, remL, base);\r\n remL = rem.length;\r\n\r\n // If product was < remainder.\r\n if (cmp == -1) {\r\n\r\n // Compare divisor and new remainder.\r\n // If divisor < new remainder, subtract divisor from remainder.\r\n // Trial digit n too low.\r\n // n is 1 too low about 5% of the time, and very rarely 2 too low.\r\n while (compare(yc, rem, yL, remL) < 1) {\r\n n++;\r\n\r\n // Subtract divisor from remainder.\r\n subtract(rem, yL < remL ? yz : yc, remL, base);\r\n remL = rem.length;\r\n }\r\n }\r\n } else if (cmp === 0) {\r\n n++;\r\n rem = [0];\r\n } // else cmp === 1 and n will be 0\r\n\r\n // Add the next digit, n, to the result array.\r\n qc[i++] = n;\r\n\r\n // Update the remainder.\r\n if (rem[0]) {\r\n rem[remL++] = xc[xi] || 0;\r\n } else {\r\n rem = [xc[xi]];\r\n remL = 1;\r\n }\r\n } while ((xi++ < xL || rem[0] != null) && s--);\r\n\r\n more = rem[0] != null;\r\n\r\n // Leading zero?\r\n if (!qc[0]) qc.splice(0, 1);\r\n }\r\n\r\n if (base == BASE) {\r\n\r\n // To calculate q.e, first get the number of digits of qc[0].\r\n for (i = 1, s = qc[0]; s >= 10; s /= 10, i++);\r\n\r\n round(q, dp + (q.e = i + e * LOG_BASE - 1) + 1, rm, more);\r\n\r\n // Caller is convertBase.\r\n } else {\r\n q.e = e;\r\n q.r = +more;\r\n }\r\n\r\n return q;\r\n };\r\n })();\r\n\r\n\r\n /*\r\n * Return a string representing the value of BigNumber n in fixed-point or exponential\r\n * notation rounded to the specified decimal places or significant digits.\r\n *\r\n * n: a BigNumber.\r\n * i: the index of the last digit required (i.e. the digit that may be rounded up).\r\n * rm: the rounding mode.\r\n * id: 1 (toExponential) or 2 (toPrecision).\r\n */\r\n function format(n, i, rm, id) {\r\n var c0, e, ne, len, str;\r\n\r\n if (rm == null) rm = ROUNDING_MODE;\r\n else intCheck(rm, 0, 8);\r\n\r\n if (!n.c) return n.toString();\r\n\r\n c0 = n.c[0];\r\n ne = n.e;\r\n\r\n if (i == null) {\r\n str = coeffToString(n.c);\r\n str = id == 1 || id == 2 && (ne <= TO_EXP_NEG || ne >= TO_EXP_POS)\r\n ? toExponential(str, ne)\r\n : toFixedPoint(str, ne, '0');\r\n } else {\r\n n = round(new BigNumber(n), i, rm);\r\n\r\n // n.e may have changed if the value was rounded up.\r\n e = n.e;\r\n\r\n str = coeffToString(n.c);\r\n len = str.length;\r\n\r\n // toPrecision returns exponential notation if the number of significant digits\r\n // specified is less than the number of digits necessary to represent the integer\r\n // part of the value in fixed-point notation.\r\n\r\n // Exponential notation.\r\n if (id == 1 || id == 2 && (i <= e || e <= TO_EXP_NEG)) {\r\n\r\n // Append zeros?\r\n for (; len < i; str += '0', len++);\r\n str = toExponential(str, e);\r\n\r\n // Fixed-point notation.\r\n } else {\r\n i -= ne + (id === 2 && e > ne);\r\n str = toFixedPoint(str, e, '0');\r\n\r\n // Append zeros?\r\n if (e + 1 > len) {\r\n if (--i > 0) for (str += '.'; i--; str += '0');\r\n } else {\r\n i += e - len;\r\n if (i > 0) {\r\n if (e + 1 == len) str += '.';\r\n for (; i--; str += '0');\r\n }\r\n }\r\n }\r\n }\r\n\r\n return n.s < 0 && c0 ? '-' + str : str;\r\n }\r\n\r\n\r\n // Handle BigNumber.max and BigNumber.min.\r\n // If any number is NaN, return NaN.\r\n function maxOrMin(args, n) {\r\n var k, y,\r\n i = 1,\r\n x = new BigNumber(args[0]);\r\n\r\n for (; i < args.length; i++) {\r\n y = new BigNumber(args[i]);\r\n if (!y.s || (k = compare(x, y)) === 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 * Strip trailing zeros, calculate base 10 exponent and check against MIN_EXP and MAX_EXP.\r\n * Called by minus, plus and times.\r\n */\r\n function normalise(n, c, e) {\r\n var i = 1,\r\n j = c.length;\r\n\r\n // Remove trailing zeros.\r\n for (; !c[--j]; c.pop());\r\n\r\n // Calculate the base 10 exponent. First get the number of digits of c[0].\r\n for (j = c[0]; j >= 10; j /= 10, i++);\r\n\r\n // Overflow?\r\n if ((e = i + e * LOG_BASE - 1) > MAX_EXP) {\r\n\r\n // Infinity.\r\n n.c = n.e = null;\r\n\r\n // Underflow?\r\n } else if (e < MIN_EXP) {\r\n\r\n // Zero.\r\n n.c = [n.e = 0];\r\n } else {\r\n n.e = e;\r\n n.c = c;\r\n }\r\n\r\n return n;\r\n }\r\n\r\n\r\n // Handle values that fail the validity test in BigNumber.\r\n parseNumeric = (function () {\r\n var basePrefix = /^(-?)0([xbo])(?=\\w[\\w.]*$)/i,\r\n dotAfter = /^([^.]+)\\.$/,\r\n dotBefore = /^\\.([^.]+)$/,\r\n isInfinityOrNaN = /^-?(Infinity|NaN)$/,\r\n whitespaceOrPlus = /^\\s*\\+(?=[\\w.])|^\\s+|\\s+$/g;\r\n\r\n return function (x, str, isNum, b) {\r\n var base,\r\n s = isNum ? str : str.replace(whitespaceOrPlus, '');\r\n\r\n // No exception on ±Infinity or NaN.\r\n if (isInfinityOrNaN.test(s)) {\r\n x.s = isNaN(s) ? null : s < 0 ? -1 : 1;\r\n } else {\r\n if (!isNum) {\r\n\r\n // basePrefix = /^(-?)0([xbo])(?=\\w[\\w.]*$)/i\r\n s = s.replace(basePrefix, function (m, p1, p2) {\r\n base = (p2 = p2.toLowerCase()) == 'x' ? 16 : p2 == 'b' ? 2 : 8;\r\n return !b || b == base ? p1 : m;\r\n });\r\n\r\n if (b) {\r\n base = b;\r\n\r\n // E.g. '1.' to '1', '.1' to '0.1'\r\n s = s.replace(dotAfter, '$1').replace(dotBefore, '0.$1');\r\n }\r\n\r\n if (str != s) return new BigNumber(s, base);\r\n }\r\n\r\n // '[BigNumber Error] Not a number: {n}'\r\n // '[BigNumber Error] Not a base {b} number: {n}'\r\n if (BigNumber.DEBUG) {\r\n throw Error\r\n (bignumberError + 'Not a' + (b ? ' base ' + b : '') + ' number: ' + str);\r\n }\r\n\r\n // NaN\r\n x.s = null;\r\n }\r\n\r\n x.c = x.e = null;\r\n }\r\n })();\r\n\r\n\r\n /*\r\n * Round x to sd significant digits using rounding mode rm. Check for over/under-flow.\r\n * If r is truthy, it is known that there are more digits after the rounding digit.\r\n */\r\n function round(x, sd, rm, r) {\r\n var d, i, j, k, n, ni, rd,\r\n xc = x.c,\r\n pows10 = POWS_TEN;\r\n\r\n // if x is not Infinity or NaN...\r\n if (xc) {\r\n\r\n // rd is the rounding digit, i.e. the digit after the digit that may be rounded up.\r\n // n is a base 1e14 number, the value of the element of array x.c containing rd.\r\n // ni is the index of n within x.c.\r\n // d is the number of digits of n.\r\n // i is the index of rd within n including leading zeros.\r\n // j is the actual index of rd within n (if < 0, rd is a leading zero).\r\n out: {\r\n\r\n // Get the number of digits of the first element of xc.\r\n for (d = 1, k = xc[0]; k >= 10; k /= 10, d++);\r\n i = sd - d;\r\n\r\n // If the rounding digit is in the first element of xc...\r\n if (i < 0) {\r\n i += LOG_BASE;\r\n j = sd;\r\n n = xc[ni = 0];\r\n\r\n // Get the rounding digit at index j of n.\r\n rd = mathfloor(n / pows10[d - j - 1] % 10);\r\n } else {\r\n ni = mathceil((i + 1) / LOG_BASE);\r\n\r\n if (ni >= xc.length) {\r\n\r\n if (r) {\r\n\r\n // Needed by sqrt.\r\n for (; xc.length <= ni; xc.push(0));\r\n n = rd = 0;\r\n d = 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 n = k = xc[ni];\r\n\r\n // Get the number of digits of n.\r\n for (d = 1; k >= 10; k /= 10, d++);\r\n\r\n // Get the index of rd within n.\r\n i %= LOG_BASE;\r\n\r\n // Get the index of rd within n, adjusted for leading zeros.\r\n // The number of leading zeros of n is given by LOG_BASE - d.\r\n j = i - LOG_BASE + d;\r\n\r\n // Get the rounding digit at index j of n.\r\n rd = j < 0 ? 0 : mathfloor(n / pows10[d - j - 1] % 10);\r\n }\r\n }\r\n\r\n r = r || sd < 0 ||\r\n\r\n // Are there any non-zero digits after the rounding digit?\r\n // The expression n % pows10[d - j - 1] returns all digits of n to the right\r\n // of the digit at j, e.g. if n is 908714 and j is 2, the expression gives 714.\r\n xc[ni + 1] != null || (j < 0 ? n : n % pows10[d - j - 1]);\r\n\r\n r = rm < 4\r\n ? (rd || r) && (rm == 0 || rm == (x.s < 0 ? 3 : 2))\r\n : rd > 5 || rd == 5 && (rm == 4 || r || 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 ? n / pows10[d - j] : 0 : xc[ni - 1]) % 10) & 1 ||\r\n rm == (x.s < 0 ? 8 : 7));\r\n\r\n if (sd < 1 || !xc[0]) {\r\n xc.length = 0;\r\n\r\n if (r) {\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 xc[0] = pows10[(LOG_BASE - sd % LOG_BASE) % LOG_BASE];\r\n x.e = -sd || 0;\r\n } else {\r\n\r\n // Zero.\r\n xc[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 xc.length = ni;\r\n k = 1;\r\n ni--;\r\n } else {\r\n xc.length = ni + 1;\r\n k = pows10[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 n.\r\n xc[ni] = j > 0 ? mathfloor(n / pows10[d - j] % pows10[j]) * k : 0;\r\n }\r\n\r\n // Round up?\r\n if (r) {\r\n\r\n for (; ;) {\r\n\r\n // If the digit to be rounded up is in the first element of xc...\r\n if (ni == 0) {\r\n\r\n // i will be the length of xc[0] before k is added.\r\n for (i = 1, j = xc[0]; j >= 10; j /= 10, i++);\r\n j = xc[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 (xc[0] == BASE) xc[0] = 1;\r\n }\r\n\r\n break;\r\n } else {\r\n xc[ni] += k;\r\n if (xc[ni] != BASE) break;\r\n xc[ni--] = 0;\r\n k = 1;\r\n }\r\n }\r\n }\r\n\r\n // Remove trailing zeros.\r\n for (i = xc.length; xc[--i] === 0; xc.pop());\r\n }\r\n\r\n // Overflow? Infinity.\r\n if (x.e > MAX_EXP) {\r\n x.c = x.e = null;\r\n\r\n // Underflow? Zero.\r\n } else if (x.e < MIN_EXP) {\r\n x.c = [x.e = 0];\r\n }\r\n }\r\n\r\n return x;\r\n }\r\n\r\n\r\n function valueOf(n) {\r\n var str,\r\n e = n.e;\r\n\r\n if (e === null) return n.toString();\r\n\r\n str = coeffToString(n.c);\r\n\r\n str = e <= TO_EXP_NEG || e >= TO_EXP_POS\r\n ? toExponential(str, e)\r\n : toFixedPoint(str, e, '0');\r\n\r\n return n.s < 0 ? '-' + str : str;\r\n }\r\n\r\n\r\n // PROTOTYPE/INSTANCE METHODS\r\n\r\n\r\n /*\r\n * Return a new BigNumber whose value is the absolute value of this BigNumber.\r\n */\r\n P.absoluteValue = P.abs = function () {\r\n var x = new BigNumber(this);\r\n if (x.s < 0) x.s = 1;\r\n return x;\r\n };\r\n\r\n\r\n /*\r\n * Return\r\n * 1 if the value of this BigNumber is greater than the value of BigNumber(y, b),\r\n * -1 if the value of this BigNumber is less than the value of BigNumber(y, b),\r\n * 0 if they have the same value,\r\n * or null if the value of either is NaN.\r\n */\r\n P.comparedTo = function (y, b) {\r\n return compare(this, new BigNumber(y, b));\r\n };\r\n\r\n\r\n /*\r\n * If dp is undefined or null or true or false, return the number of decimal places of the\r\n * value of this BigNumber, or null if the value of this BigNumber is ±Infinity or NaN.\r\n *\r\n * Otherwise, if dp is a number, return a new BigNumber whose value is the value of this\r\n * BigNumber rounded to a maximum of dp decimal places using rounding mode rm, or\r\n * ROUNDING_MODE if rm is omitted.\r\n *\r\n * [dp] {number} Decimal places: integer, 0 to MAX inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {dp|rm}'\r\n */\r\n P.decimalPlaces = P.dp = function (dp, rm) {\r\n var c, n, v,\r\n x = this;\r\n\r\n if (dp != null) {\r\n intCheck(dp, 0, MAX);\r\n if (rm == null) rm = ROUNDING_MODE;\r\n else intCheck(rm, 0, 8);\r\n\r\n return round(new BigNumber(x), dp + x.e + 1, rm);\r\n }\r\n\r\n if (!(c = x.c)) return null;\r\n n = ((v = c.length - 1) - bitFloor(this.e / LOG_BASE)) * LOG_BASE;\r\n\r\n // Subtract the number of trailing zeros of the last number.\r\n if (v = c[v]) for (; v % 10 == 0; v /= 10, n--);\r\n if (n < 0) n = 0;\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 BigNumber whose value is the value of this BigNumber divided by the value of\r\n * BigNumber(y, b), rounded according to DECIMAL_PLACES and ROUNDING_MODE.\r\n */\r\n P.dividedBy = P.div = function (y, b) {\r\n return div(this, new BigNumber(y, b), DECIMAL_PLACES, ROUNDING_MODE);\r\n };\r\n\r\n\r\n /*\r\n * Return a new BigNumber whose value is the integer part of dividing the value of this\r\n * BigNumber by the value of BigNumber(y, b).\r\n */\r\n P.dividedToIntegerBy = P.idiv = function (y, b) {\r\n return div(this, new BigNumber(y, b), 0, 1);\r\n };\r\n\r\n\r\n /*\r\n * Return a BigNumber whose value is the value of this BigNumber exponentiated by n.\r\n *\r\n * If m is present, return the result modulo m.\r\n * If n is negative round according to DECIMAL_PLACES and ROUNDING_MODE.\r\n * If POW_PRECISION is non-zero and m is not present, round to POW_PRECISION using ROUNDING_MODE.\r\n *\r\n * The modular power operation works efficiently when x, n, and m are integers, otherwise it\r\n * is equivalent to calculating x.exponentiatedBy(n).modulo(m) with a POW_PRECISION of 0.\r\n *\r\n * n {number|string|BigNumber} The exponent. An integer.\r\n * [m] {number|string|BigNumber} The modulus.\r\n *\r\n * '[BigNumber Error] Exponent not an integer: {n}'\r\n */\r\n P.exponentiatedBy = P.pow = function (n, m) {\r\n var half, isModExp, i, k, more, nIsBig, nIsNeg, nIsOdd, y,\r\n x = this;\r\n\r\n n = new BigNumber(n);\r\n\r\n // Allow NaN and ±Infinity, but not other non-integers.\r\n if (n.c && !n.isInteger()) {\r\n throw Error\r\n (bignumberError + 'Exponent not an integer: ' + valueOf(n));\r\n }\r\n\r\n if (m != null) m = new BigNumber(m);\r\n\r\n // Exponent of MAX_SAFE_INTEGER is 15.\r\n nIsBig = n.e > 14;\r\n\r\n // If x is NaN, ±Infinity, ±0 or ±1, or n is ±Infinity, NaN or ±0.\r\n if (!x.c || !x.c[0] || x.c[0] == 1 && !x.e && x.c.length == 1 || !n.c || !n.c[0]) {\r\n\r\n // The sign of the result of pow when x is negative depends on the evenness of n.\r\n // If +n overflows to ±Infinity, the evenness of n would be not be known.\r\n y = new BigNumber(Math.pow(+valueOf(x), nIsBig ? n.s * (2 - isOdd(n)) : +valueOf(n)));\r\n return m ? y.mod(m) : y;\r\n }\r\n\r\n nIsNeg = n.s < 0;\r\n\r\n if (m) {\r\n\r\n // x % m returns NaN if abs(m) is zero, or m is NaN.\r\n if (m.c ? !m.c[0] : !m.s) return new BigNumber(NaN);\r\n\r\n isModExp = !nIsNeg && x.isInteger() && m.isInteger();\r\n\r\n if (isModExp) x = x.mod(m);\r\n\r\n // Overflow to ±Infinity: >=2**1e10 or >=1.0000024**1e15.\r\n // Underflow to ±0: <=0.79**1e10 or <=0.9999975**1e15.\r\n } else if (n.e > 9 && (x.e > 0 || x.e < -1 || (x.e == 0\r\n // [1, 240000000]\r\n ? x.c[0] > 1 || nIsBig && x.c[1] >= 24e7\r\n // [80000000000000] [99999750000000]\r\n : x.c[0] < 8e13 || nIsBig && x.c[0] <= 9999975e7))) {\r\n\r\n // If x is negative and n is odd, k = -0, else k = 0.\r\n k = x.s < 0 && isOdd(n) ? -0 : 0;\r\n\r\n // If x >= 1, k = ±Infinity.\r\n if (x.e > -1) k = 1 / k;\r\n\r\n // If n is negative return ±0, else return ±Infinity.\r\n return new BigNumber(nIsNeg ? 1 / k : k);\r\n\r\n } else if (POW_PRECISION) {\r\n\r\n // Truncating each coefficient array to a length of k after each multiplication\r\n // equates to truncating significant digits to POW_PRECISION + [28, 41],\r\n // i.e. there will be a minimum of 28 guard digits retained.\r\n k = mathceil(POW_PRECISION / LOG_BASE + 2);\r\n }\r\n\r\n if (nIsBig) {\r\n half = new BigNumber(0.5);\r\n if (nIsNeg) n.s = 1;\r\n nIsOdd = isOdd(n);\r\n } else {\r\n i = Math.abs(+valueOf(n));\r\n nIsOdd = i % 2;\r\n }\r\n\r\n y = new BigNumber(ONE);\r\n\r\n // Performs 54 loop iterations for n of 9007199254740991.\r\n for (; ;) {\r\n\r\n if (nIsOdd) {\r\n y = y.times(x);\r\n if (!y.c) break;\r\n\r\n if (k) {\r\n if (y.c.length > k) y.c.length = k;\r\n } else if (isModExp) {\r\n y = y.mod(m); //y = y.minus(div(y, m, 0, MODULO_MODE).times(m));\r\n }\r\n }\r\n\r\n if (i) {\r\n i = mathfloor(i / 2);\r\n if (i === 0) break;\r\n nIsOdd = i % 2;\r\n } else {\r\n n = n.times(half);\r\n round(n, n.e + 1, 1);\r\n\r\n if (n.e > 14) {\r\n nIsOdd = isOdd(n);\r\n } else {\r\n i = +valueOf(n);\r\n if (i === 0) break;\r\n nIsOdd = i % 2;\r\n }\r\n }\r\n\r\n x = x.times(x);\r\n\r\n if (k) {\r\n if (x.c && x.c.length > k) x.c.length = k;\r\n } else if (isModExp) {\r\n x = x.mod(m); //x = x.minus(div(x, m, 0, MODULO_MODE).times(m));\r\n }\r\n }\r\n\r\n if (isModExp) return y;\r\n if (nIsNeg) y = ONE.div(y);\r\n\r\n return m ? y.mod(m) : k ? round(y, POW_PRECISION, ROUNDING_MODE, more) : y;\r\n };\r\n\r\n\r\n /*\r\n * Return a new BigNumber whose value is the value of this BigNumber rounded to an integer\r\n * using rounding mode rm, or ROUNDING_MODE if rm is omitted.\r\n *\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {rm}'\r\n */\r\n P.integerValue = function (rm) {\r\n var n = new BigNumber(this);\r\n if (rm == null) rm = ROUNDING_MODE;\r\n else intCheck(rm, 0, 8);\r\n return round(n, n.e + 1, rm);\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this BigNumber is equal to the value of BigNumber(y, b),\r\n * otherwise return false.\r\n */\r\n P.isEqualTo = P.eq = function (y, b) {\r\n return compare(this, new BigNumber(y, b)) === 0;\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this BigNumber is a finite number, otherwise return false.\r\n */\r\n P.isFinite = function () {\r\n return !!this.c;\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this BigNumber is greater than the value of BigNumber(y, b),\r\n * otherwise return false.\r\n */\r\n P.isGreaterThan = P.gt = function (y, b) {\r\n return compare(this, new BigNumber(y, b)) > 0;\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this BigNumber is greater than or equal to the value of\r\n * BigNumber(y, b), otherwise return false.\r\n */\r\n P.isGreaterThanOrEqualTo = P.gte = function (y, b) {\r\n return (b = compare(this, new BigNumber(y, b))) === 1 || b === 0;\r\n\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this BigNumber is an integer, otherwise return false.\r\n */\r\n P.isInteger = function () {\r\n return !!this.c && bitFloor(this.e / LOG_BASE) > this.c.length - 2;\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this BigNumber is less than the value of BigNumber(y, b),\r\n * otherwise return false.\r\n */\r\n P.isLessThan = P.lt = function (y, b) {\r\n return compare(this, new BigNumber(y, b)) < 0;\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this BigNumber is less than or equal to the value of\r\n * BigNumber(y, b), otherwise return false.\r\n */\r\n P.isLessThanOrEqualTo = P.lte = function (y, b) {\r\n return (b = compare(this, new BigNumber(y, b))) === -1 || b === 0;\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this BigNumber is NaN, otherwise return false.\r\n */\r\n P.isNaN = function () {\r\n return !this.s;\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this BigNumber is negative, otherwise return false.\r\n */\r\n P.isNegative = function () {\r\n return this.s < 0;\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this BigNumber is positive, otherwise return false.\r\n */\r\n P.isPositive = function () {\r\n return this.s > 0;\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this BigNumber is 0 or -0, otherwise return false.\r\n */\r\n P.isZero = function () {\r\n return !!this.c && this.c[0] == 0;\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 BigNumber whose value is the value of this BigNumber minus the value of\r\n * BigNumber(y, b).\r\n */\r\n P.minus = function (y, b) {\r\n var i, j, t, xLTy,\r\n x = this,\r\n a = x.s;\r\n\r\n y = new BigNumber(y, b);\r\n b = y.s;\r\n\r\n // Either NaN?\r\n if (!a || !b) return new BigNumber(NaN);\r\n\r\n // Signs differ?\r\n if (a != b) {\r\n y.s = -b;\r\n return x.plus(y);\r\n }\r\n\r\n var xe = x.e / LOG_BASE,\r\n ye = y.e / LOG_BASE,\r\n xc = x.c,\r\n yc = y.c;\r\n\r\n if (!xe || !ye) {\r\n\r\n // Either Infinity?\r\n if (!xc || !yc) return xc ? (y.s = -b, y) : new BigNumber(yc ? x : NaN);\r\n\r\n // Either zero?\r\n if (!xc[0] || !yc[0]) {\r\n\r\n // Return y if y is non-zero, x if x is non-zero, or zero if both are zero.\r\n return yc[0] ? (y.s = -b, y) : new BigNumber(xc[0] ? x :\r\n\r\n // IEEE 754 (2008) 6.3: n - n = -0 when rounding to -Infinity\r\n ROUNDING_MODE == 3 ? -0 : 0);\r\n }\r\n }\r\n\r\n xe = bitFloor(xe);\r\n ye = bitFloor(ye);\r\n xc = xc.slice();\r\n\r\n // Determine which is the bigger number.\r\n if (a = xe - ye) {\r\n\r\n if (xLTy = a < 0) {\r\n a = -a;\r\n t = xc;\r\n } else {\r\n ye = xe;\r\n t = yc;\r\n }\r\n\r\n t.reverse();\r\n\r\n // Prepend zeros to equalise exponents.\r\n for (b = a; b--; t.push(0));\r\n t.reverse();\r\n } else {\r\n\r\n // Exponents equal. Check digit by digit.\r\n j = (xLTy = (a = xc.length) < (b = yc.length)) ? a : b;\r\n\r\n for (a = b = 0; b < j; b++) {\r\n\r\n if (xc[b] != yc[b]) {\r\n xLTy = xc[b] < yc[b];\r\n break;\r\n }\r\n }\r\n }\r\n\r\n // x < y? Point xc to the array of the bigger number.\r\n if (xLTy) {\r\n t = xc;\r\n xc = yc;\r\n yc = t;\r\n y.s = -y.s;\r\n }\r\n\r\n b = (j = yc.length) - (i = xc.length);\r\n\r\n // Append zeros to xc if shorter.\r\n // No need to add zeros to yc if shorter as subtract only needs to start at yc.length.\r\n if (b > 0) for (; b--; xc[i++] = 0);\r\n b = BASE - 1;\r\n\r\n // Subtract yc from xc.\r\n for (; j > a;) {\r\n\r\n if (xc[--j] < yc[j]) {\r\n for (i = j; i && !xc[--i]; xc[i] = b);\r\n --xc[i];\r\n xc[j] += BASE;\r\n }\r\n\r\n xc[j] -= yc[j];\r\n }\r\n\r\n // Remove leading zeros and adjust exponent accordingly.\r\n for (; xc[0] == 0; xc.splice(0, 1), --ye);\r\n\r\n // Zero?\r\n if (!xc[0]) {\r\n\r\n // Following IEEE 754 (2008) 6.3,\r\n // n - n = +0 but n - n = -0 when rounding towards -Infinity.\r\n y.s = ROUNDING_MODE == 3 ? -1 : 1;\r\n y.c = [y.e = 0];\r\n return y;\r\n }\r\n\r\n // No need to check for Infinity as +x - +y != Infinity && -x - -y != Infinity\r\n // for finite x and y.\r\n return normalise(y, xc, ye);\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 BigNumber whose value is the value of this BigNumber modulo the value of\r\n * BigNumber(y, b). The result depends on the value of MODULO_MODE.\r\n */\r\n P.modulo = P.mod = function (y, b) {\r\n var q, s,\r\n x = this;\r\n\r\n y = new BigNumber(y, b);\r\n\r\n // Return NaN if x is Infinity or NaN, or y is NaN or zero.\r\n if (!x.c || !y.s || y.c && !y.c[0]) {\r\n return new BigNumber(NaN);\r\n\r\n // Return x if y is Infinity or x is zero.\r\n } else if (!y.c || x.c && !x.c[0]) {\r\n return new BigNumber(x);\r\n }\r\n\r\n if (MODULO_MODE == 9) {\r\n\r\n // Euclidian division: q = sign(y) * floor(x / abs(y))\r\n // r = x - qy where 0 <= r < abs(y)\r\n s = y.s;\r\n y.s = 1;\r\n q = div(x, y, 0, 3);\r\n y.s = s;\r\n q.s *= s;\r\n } else {\r\n q = div(x, y, 0, MODULO_MODE);\r\n }\r\n\r\n y = x.minus(q.times(y));\r\n\r\n // To match JavaScript %, ensure sign of zero is sign of dividend.\r\n if (!y.c[0] && MODULO_MODE == 1) y.s = x.s;\r\n\r\n return y;\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 BigNumber whose value is the value of this BigNumber multiplied by the value\r\n * of BigNumber(y, b).\r\n */\r\n P.multipliedBy = P.times = function (y, b) {\r\n var c, e, i, j, k, m, xcL, xlo, xhi, ycL, ylo, yhi, zc,\r\n base, sqrtBase,\r\n x = this,\r\n xc = x.c,\r\n yc = (y = new BigNumber(y, b)).c;\r\n\r\n // Either NaN, ±Infinity or ±0?\r\n if (!xc || !yc || !xc[0] || !yc[0]) {\r\n\r\n // Return NaN if either is NaN, or one is 0 and the other is Infinity.\r\n if (!x.s || !y.s || xc && !xc[0] && !yc || yc && !yc[0] && !xc) {\r\n y.c = y.e = y.s = null;\r\n } else {\r\n y.s *= x.s;\r\n\r\n // Return ±Infinity if either is ±Infinity.\r\n if (!xc || !yc) {\r\n y.c = y.e = null;\r\n\r\n // Return ±0 if either is ±0.\r\n } else {\r\n y.c = [0];\r\n y.e = 0;\r\n }\r\n }\r\n\r\n return y;\r\n }\r\n\r\n e = bitFloor(x.e / LOG_BASE) + bitFloor(y.e / LOG_BASE);\r\n y.s *= x.s;\r\n xcL = xc.length;\r\n ycL = yc.length;\r\n\r\n // Ensure xc points to longer array and xcL to its length.\r\n if (xcL < ycL) {\r\n zc = xc;\r\n xc = yc;\r\n yc = zc;\r\n i = xcL;\r\n xcL = ycL;\r\n ycL = i;\r\n }\r\n\r\n // Initialise the result array with zeros.\r\n for (i = xcL + ycL, zc = []; i--; zc.push(0));\r\n\r\n base = BASE;\r\n sqrtBase = SQRT_BASE;\r\n\r\n for (i = ycL; --i >= 0;) {\r\n c = 0;\r\n ylo = yc[i] % sqrtBase;\r\n yhi = yc[i] / sqrtBase | 0;\r\n\r\n for (k = xcL, j = i + k; j > i;) {\r\n xlo = xc[--k] % sqrtBase;\r\n xhi = xc[k] / sqrtBase | 0;\r\n m = yhi * xlo + xhi * ylo;\r\n xlo = ylo * xlo + ((m % sqrtBase) * sqrtBase) + zc[j] + c;\r\n c = (xlo / base | 0) + (m / sqrtBase | 0) + yhi * xhi;\r\n zc[j--] = xlo % base;\r\n }\r\n\r\n zc[j] = c;\r\n }\r\n\r\n if (c) {\r\n ++e;\r\n } else {\r\n zc.splice(0, 1);\r\n }\r\n\r\n return normalise(y, zc, e);\r\n };\r\n\r\n\r\n /*\r\n * Return a new BigNumber whose value is the value of this BigNumber negated,\r\n * i.e. multiplied by -1.\r\n */\r\n P.negated = function () {\r\n var x = new BigNumber(this);\r\n x.s = -x.s || null;\r\n return 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 BigNumber whose value is the value of this BigNumber plus the value of\r\n * BigNumber(y, b).\r\n */\r\n P.plus = function (y, b) {\r\n var t,\r\n x = this,\r\n a = x.s;\r\n\r\n y = new BigNumber(y, b);\r\n b = y.s;\r\n\r\n // Either NaN?\r\n if (!a || !b) return new BigNumber(NaN);\r\n\r\n // Signs differ?\r\n if (a != b) {\r\n y.s = -b;\r\n return x.minus(y);\r\n }\r\n\r\n var xe = x.e / LOG_BASE,\r\n ye = y.e / LOG_BASE,\r\n xc = x.c,\r\n yc = y.c;\r\n\r\n if (!xe || !ye) {\r\n\r\n // Return ±Infinity if either ±Infinity.\r\n if (!xc || !yc) return new BigNumber(a / 0);\r\n\r\n // Either zero?\r\n // Return y if y is non-zero, x if x is non-zero, or zero if both are zero.\r\n if (!xc[0] || !yc[0]) return yc[0] ? y : new BigNumber(xc[0] ? x : a * 0);\r\n }\r\n\r\n xe = bitFloor(xe);\r\n ye = bitFloor(ye);\r\n xc = xc.slice();\r\n\r\n // Prepend zeros to equalise exponents. Faster to use reverse then do unshifts.\r\n if (a = xe - ye) {\r\n if (a > 0) {\r\n ye = xe;\r\n t = yc;\r\n } else {\r\n a = -a;\r\n t = xc;\r\n }\r\n\r\n t.reverse();\r\n for (; a--; t.push(0));\r\n t.reverse();\r\n }\r\n\r\n a = xc.length;\r\n b = yc.length;\r\n\r\n // Point xc to the longer array, and b to the shorter length.\r\n if (a - b < 0) {\r\n t = yc;\r\n yc = xc;\r\n xc = t;\r\n b = a;\r\n }\r\n\r\n // Only start adding at yc.length - 1 as the further digits of xc can be ignored.\r\n for (a = 0; b;) {\r\n a = (xc[--b] = xc[b] + yc[b] + a) / BASE | 0;\r\n xc[b] = BASE === xc[b] ? 0 : xc[b] % BASE;\r\n }\r\n\r\n if (a) {\r\n xc = [a].concat(xc);\r\n ++ye;\r\n }\r\n\r\n // No need to check for zero, as +x + +y != 0 && -x + -y != 0\r\n // ye = MAX_EXP + 1 possible\r\n return normalise(y, xc, ye);\r\n };\r\n\r\n\r\n /*\r\n * If sd is undefined or null or true or false, return the number of significant digits of\r\n * the value of this BigNumber, or null if the value of this BigNumber is ±Infinity or NaN.\r\n * If sd is true include integer-part trailing zeros in the count.\r\n *\r\n * Otherwise, if sd is a number, return a new BigNumber whose value is the value of this\r\n * BigNumber rounded to a maximum of sd significant digits using rounding mode rm, or\r\n * ROUNDING_MODE if rm is omitted.\r\n *\r\n * sd {number|boolean} number: significant digits: integer, 1 to MAX inclusive.\r\n * boolean: whether to count integer-part trailing zeros: true or false.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {sd|rm}'\r\n */\r\n P.precision = P.sd = function (sd, rm) {\r\n var c, n, v,\r\n x = this;\r\n\r\n if (sd != null && sd !== !!sd) {\r\n intCheck(sd, 1, MAX);\r\n if (rm == null) rm = ROUNDING_MODE;\r\n else intCheck(rm, 0, 8);\r\n\r\n return round(new BigNumber(x), sd, rm);\r\n }\r\n\r\n if (!(c = x.c)) return null;\r\n v = c.length - 1;\r\n n = v * LOG_BASE + 1;\r\n\r\n if (v = c[v]) {\r\n\r\n // Subtract the number of trailing zeros of the last element.\r\n for (; v % 10 == 0; v /= 10, n--);\r\n\r\n // Add the number of digits of the first element.\r\n for (v = c[0]; v >= 10; v /= 10, n++);\r\n }\r\n\r\n if (sd && x.e + 1 > n) n = x.e + 1;\r\n\r\n return n;\r\n };\r\n\r\n\r\n /*\r\n * Return a new BigNumber whose value is the value of this BigNumber shifted by k places\r\n * (powers of 10). Shift to the right if n > 0, and to the left if n < 0.\r\n *\r\n * k {number} Integer, -MAX_SAFE_INTEGER to MAX_SAFE_INTEGER inclusive.\r\n *\r\n * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {k}'\r\n */\r\n P.shiftedBy = function (k) {\r\n intCheck(k, -MAX_SAFE_INTEGER, MAX_SAFE_INTEGER);\r\n return this.times('1e' + k);\r\n };\r\n\r\n\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 * Return a new BigNumber whose value is the square root of the value of this BigNumber,\r\n * rounded according to DECIMAL_PLACES and ROUNDING_MODE.\r\n */\r\n P.squareRoot = P.sqrt = function () {\r\n var m, n, r, rep, t,\r\n x = this,\r\n c = x.c,\r\n s = x.s,\r\n e = x.e,\r\n dp = DECIMAL_PLACES + 4,\r\n half = new BigNumber('0.5');\r\n\r\n // Negative/NaN/Infinity/zero?\r\n if (s !== 1 || !c || !c[0]) {\r\n return new BigNumber(!s || s < 0 && (!c || c[0]) ? NaN : c ? x : 1 / 0);\r\n }\r\n\r\n // Initial estimate.\r\n s = Math.sqrt(+valueOf(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 = coeffToString(c);\r\n if ((n.length + e) % 2 == 0) n += '0';\r\n s = Math.sqrt(+n);\r\n e = bitFloor((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 BigNumber(n);\r\n } else {\r\n r = new BigNumber(s + '');\r\n }\r\n\r\n // Check for zero.\r\n // r could be zero if MIN_EXP is changed after the this value was created.\r\n // This would cause a division by zero (x/t) and hence Infinity below, which would cause\r\n // coeffToString to throw.\r\n if (r.c[0]) {\r\n e = r.e;\r\n s = e + dp;\r\n if (s < 3) s = 0;\r\n\r\n // Newton-Raphson iteration.\r\n for (; ;) {\r\n t = r;\r\n r = half.times(t.plus(div(x, t, dp, 1)));\r\n\r\n if (coeffToString(t.c).slice(0, s) === (n = coeffToString(r.c)).slice(0, s)) {\r\n\r\n // The exponent of r may here be one less than the final result exponent,\r\n // e.g 0.0009999 (e-4) --> 0.001 (e-3), so adjust s so the rounding digits\r\n // are indexed correctly.\r\n if (r.e < e) --s;\r\n n = n.slice(s - 3, s + 1);\r\n\r\n // The 4th rounding digit may be in error by -1 so if the 4 rounding digits\r\n // are 9999 or 4999 (i.e. approaching a rounding boundary) continue the\r\n // 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\r\n // exact result as the nines may infinitely repeat.\r\n if (!rep) {\r\n round(t, t.e + DECIMAL_PLACES + 2, 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 dp += 4;\r\n s += 4;\r\n rep = 1;\r\n } else {\r\n\r\n // If rounding digits are null, 0{0,4} or 50{0,3}, check for exact\r\n // result. 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 round(r, r.e + DECIMAL_PLACES + 2, 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\r\n return round(r, r.e + DECIMAL_PLACES + 1, ROUNDING_MODE, m);\r\n };\r\n\r\n\r\n /*\r\n * Return a string representing the value of this BigNumber in exponential notation and\r\n * rounded using ROUNDING_MODE to dp fixed decimal places.\r\n *\r\n * [dp] {number} Decimal places. Integer, 0 to MAX inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {dp|rm}'\r\n */\r\n P.toExponential = function (dp, rm) {\r\n if (dp != null) {\r\n intCheck(dp, 0, MAX);\r\n dp++;\r\n }\r\n return format(this, dp, rm, 1);\r\n };\r\n\r\n\r\n /*\r\n * Return a string representing the value of this BigNumber in fixed-point notation rounding\r\n * to dp fixed decimal places using rounding mode rm, or ROUNDING_MODE if rm is omitted.\r\n *\r\n * Note: as with JavaScript's number type, (-0).toFixed(0) is '0',\r\n * but e.g. (-0.00001).toFixed(0) is '-0'.\r\n *\r\n * [dp] {number} Decimal places. Integer, 0 to MAX inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {dp|rm}'\r\n */\r\n P.toFixed = function (dp, rm) {\r\n if (dp != null) {\r\n intCheck(dp, 0, MAX);\r\n dp = dp + this.e + 1;\r\n }\r\n return format(this, dp, rm);\r\n };\r\n\r\n\r\n /*\r\n * Return a string representing the value of this BigNumber in fixed-point notation rounded\r\n * using rm or ROUNDING_MODE to dp decimal places, and formatted according to the properties\r\n * of the format or FORMAT object (see BigNumber.set).\r\n *\r\n * The formatting object may contain some or all of the properties shown below.\r\n *\r\n * FORMAT = {\r\n * prefix: '',\r\n * groupSize: 3,\r\n * secondaryGroupSize: 0,\r\n * groupSeparator: ',',\r\n * decimalSeparator: '.',\r\n * fractionGroupSize: 0,\r\n * fractionGroupSeparator: '\\xA0', // non-breaking space\r\n * suffix: ''\r\n * };\r\n *\r\n * [dp] {number} Decimal places. Integer, 0 to MAX inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n * [format] {object} Formatting options. See FORMAT pbject above.\r\n *\r\n * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {dp|rm}'\r\n * '[BigNumber Error] Argument not an object: {format}'\r\n */\r\n P.toFormat = function (dp, rm, format) {\r\n var str,\r\n x = this;\r\n\r\n if (format == null) {\r\n if (dp != null && rm && typeof rm == 'object') {\r\n format = rm;\r\n rm = null;\r\n } else if (dp && typeof dp == 'object') {\r\n format = dp;\r\n dp = rm = null;\r\n } else {\r\n format = FORMAT;\r\n }\r\n } else if (typeof format != 'object') {\r\n throw Error\r\n (bignumberError + 'Argument not an object: ' + format);\r\n }\r\n\r\n str = x.toFixed(dp, rm);\r\n\r\n if (x.c) {\r\n var i,\r\n arr = str.split('.'),\r\n g1 = +format.groupSize,\r\n g2 = +format.secondaryGroupSize,\r\n groupSeparator = format.groupSeparator || '',\r\n intPart = arr[0],\r\n fractionPart = arr[1],\r\n isNeg = x.s < 0,\r\n intDigits = isNeg ? intPart.slice(1) : intPart,\r\n len = intDigits.length;\r\n\r\n if (g2) {\r\n i = g1;\r\n g1 = g2;\r\n g2 = i;\r\n len -= i;\r\n }\r\n\r\n if (g1 > 0 && len > 0) {\r\n i = len % g1 || g1;\r\n intPart = intDigits.substr(0, i);\r\n for (; i < len; i += g1) intPart += groupSeparator + intDigits.substr(i, g1);\r\n if (g2 > 0) intPart += groupSeparator + intDigits.slice(i);\r\n if (isNeg) intPart = '-' + intPart;\r\n }\r\n\r\n str = fractionPart\r\n ? intPart + (format.decimalSeparator || '') + ((g2 = +format.fractionGroupSize)\r\n ? fractionPart.replace(new RegExp('\\\\d{' + g2 + '}\\\\B', 'g'),\r\n '$&' + (format.fractionGroupSeparator || ''))\r\n : fractionPart)\r\n : intPart;\r\n }\r\n\r\n return (format.prefix || '') + str + (format.suffix || '');\r\n };\r\n\r\n\r\n /*\r\n * Return an array of two BigNumbers representing the value of this BigNumber as a simple\r\n * fraction with an integer numerator and an integer denominator.\r\n * The denominator will be a positive non-zero value less than or equal to the specified\r\n * maximum denominator. If a maximum denominator is not specified, the denominator will be\r\n * the lowest value necessary to represent the number exactly.\r\n *\r\n * [md] {number|string|BigNumber} Integer >= 1, or Infinity. The maximum denominator.\r\n *\r\n * '[BigNumber Error] Argument {not an integer|out of range} : {md}'\r\n */\r\n P.toFraction = function (md) {\r\n var d, d0, d1, d2, e, exp, n, n0, n1, q, r, s,\r\n x = this,\r\n xc = x.c;\r\n\r\n if (md != null) {\r\n n = new BigNumber(md);\r\n\r\n // Throw if md is less than one or is not an integer, unless it is Infinity.\r\n if (!n.isInteger() && (n.c || n.s !== 1) || n.lt(ONE)) {\r\n throw Error\r\n (bignumberError + 'Argument ' +\r\n (n.isInteger() ? 'out of range: ' : 'not an integer: ') + valueOf(n));\r\n }\r\n }\r\n\r\n if (!xc) return new BigNumber(x);\r\n\r\n d = new BigNumber(ONE);\r\n n1 = d0 = new BigNumber(ONE);\r\n d1 = n0 = new BigNumber(ONE);\r\n s = coeffToString(xc);\r\n\r\n // Determine initial denominator.\r\n // d is a power of 10 and the minimum max denominator that specifies the value exactly.\r\n e = d.e = s.length - x.e - 1;\r\n d.c[0] = POWS_TEN[(exp = e % LOG_BASE) < 0 ? LOG_BASE + exp : exp];\r\n md = !md || n.comparedTo(d) > 0 ? (e > 0 ? d : n1) : n;\r\n\r\n exp = MAX_EXP;\r\n MAX_EXP = 1 / 0;\r\n n = new BigNumber(s);\r\n\r\n // n0 = d1 = 0\r\n n0.c[0] = 0;\r\n\r\n for (; ;) {\r\n q = div(n, d, 0, 1);\r\n d2 = d0.plus(q.times(d1));\r\n if (d2.comparedTo(md) == 1) break;\r\n d0 = d1;\r\n d1 = d2;\r\n n1 = n0.plus(q.times(d2 = n1));\r\n n0 = d2;\r\n d = n.minus(q.times(d2 = d));\r\n n = d2;\r\n }\r\n\r\n d2 = div(md.minus(d0), d1, 0, 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 e = e * 2;\r\n\r\n // Determine which fraction is closer to x, n0/d0 or n1/d1\r\n r = div(n1, d1, e, ROUNDING_MODE).minus(x).abs().comparedTo(\r\n div(n0, d0, e, ROUNDING_MODE).minus(x).abs()) < 1 ? [n1, d1] : [n0, d0];\r\n\r\n MAX_EXP = exp;\r\n\r\n return r;\r\n };\r\n\r\n\r\n /*\r\n * Return the value of this BigNumber converted to a number primitive.\r\n */\r\n P.toNumber = function () {\r\n return +valueOf(this);\r\n };\r\n\r\n\r\n /*\r\n * Return a string representing the value of this BigNumber rounded to sd significant digits\r\n * using rounding mode rm or ROUNDING_MODE. If sd is less than the number of digits\r\n * necessary to represent the integer part of the value in fixed-point notation, then use\r\n * exponential notation.\r\n *\r\n * [sd] {number} Significant digits. Integer, 1 to MAX inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {sd|rm}'\r\n */\r\n P.toPrecision = function (sd, rm) {\r\n if (sd != null) intCheck(sd, 1, MAX);\r\n return format(this, sd, rm, 2);\r\n };\r\n\r\n\r\n /*\r\n * Return a string representing the value of this BigNumber in base b, or base 10 if b is\r\n * omitted. If a base is specified, including base 10, round according to DECIMAL_PLACES and\r\n * ROUNDING_MODE. If a base is not specified, and this BigNumber has a positive exponent\r\n * that is equal to or greater than TO_EXP_POS, or a negative exponent equal to or less than\r\n * TO_EXP_NEG, return exponential notation.\r\n *\r\n * [b] {number} Integer, 2 to ALPHABET.length inclusive.\r\n *\r\n * '[BigNumber Error] Base {not a primitive number|not an integer|out of range}: {b}'\r\n */\r\n P.toString = function (b) {\r\n var str,\r\n n = this,\r\n s = n.s,\r\n e = n.e;\r\n\r\n // Infinity or NaN?\r\n if (e === null) {\r\n if (s) {\r\n str = 'Infinity';\r\n if (s < 0) str = '-' + str;\r\n } else {\r\n str = 'NaN';\r\n }\r\n } else {\r\n if (b == null) {\r\n str = e <= TO_EXP_NEG || e >= TO_EXP_POS\r\n ? toExponential(coeffToString(n.c), e)\r\n : toFixedPoint(coeffToString(n.c), e, '0');\r\n } else if (b === 10 && alphabetHasNormalDecimalDigits) {\r\n n = round(new BigNumber(n), DECIMAL_PLACES + e + 1, ROUNDING_MODE);\r\n str = toFixedPoint(coeffToString(n.c), n.e, '0');\r\n } else {\r\n intCheck(b, 2, ALPHABET.length, 'Base');\r\n str = convertBase(toFixedPoint(coeffToString(n.c), e, '0'), 10, b, s, true);\r\n }\r\n\r\n if (s < 0 && n.c[0]) str = '-' + str;\r\n }\r\n\r\n return str;\r\n };\r\n\r\n\r\n /*\r\n * Return as toString, but do not accept a base argument, and include the minus sign for\r\n * negative zero.\r\n */\r\n P.valueOf = P.toJSON = function () {\r\n return valueOf(this);\r\n };\r\n\r\n\r\n P._isBigNumber = true;\r\n\r\n P[Symbol.toStringTag] = 'BigNumber';\r\n\r\n // Node.js v10.12.0+\r\n P[Symbol.for('nodejs.util.inspect.custom')] = P.valueOf;\r\n\r\n if (configObject != null) BigNumber.set(configObject);\r\n\r\n return BigNumber;\r\n}\r\n\r\n\r\n// PRIVATE HELPER FUNCTIONS\r\n\r\n// These functions don't need access to variables,\r\n// e.g. DECIMAL_PLACES, in the scope of the `clone` function above.\r\n\r\n\r\nfunction bitFloor(n) {\r\n var i = n | 0;\r\n return n > 0 || n === i ? i : i - 1;\r\n}\r\n\r\n\r\n// Return a coefficient array as a string of base 10 digits.\r\nfunction coeffToString(a) {\r\n var s, z,\r\n i = 1,\r\n j = a.length,\r\n r = a[0] + '';\r\n\r\n for (; i < j;) {\r\n s = a[i++] + '';\r\n z = LOG_BASE - s.length;\r\n for (; z--; s = '0' + s);\r\n r += s;\r\n }\r\n\r\n // Determine trailing zeros.\r\n for (j = r.length; r.charCodeAt(--j) === 48;);\r\n\r\n return r.slice(0, j + 1 || 1);\r\n}\r\n\r\n\r\n// Compare the value of BigNumbers x and y.\r\nfunction compare(x, y) {\r\n var a, b,\r\n xc = x.c,\r\n yc = y.c,\r\n i = x.s,\r\n j = y.s,\r\n k = x.e,\r\n l = y.e;\r\n\r\n // Either NaN?\r\n if (!i || !j) return null;\r\n\r\n a = xc && !xc[0];\r\n b = yc && !yc[0];\r\n\r\n // Either zero?\r\n if (a || b) return a ? b ? 0 : -j : i;\r\n\r\n // Signs differ?\r\n if (i != j) return i;\r\n\r\n a = i < 0;\r\n b = k == l;\r\n\r\n // Either Infinity?\r\n if (!xc || !yc) return b ? 0 : !xc ^ a ? 1 : -1;\r\n\r\n // Compare exponents.\r\n if (!b) return k > l ^ a ? 1 : -1;\r\n\r\n j = (k = xc.length) < (l = yc.length) ? k : l;\r\n\r\n // Compare digit by digit.\r\n for (i = 0; i < j; i++) if (xc[i] != yc[i]) return xc[i] > yc[i] ^ a ? 1 : -1;\r\n\r\n // Compare lengths.\r\n return k == l ? 0 : k > l ^ a ? 1 : -1;\r\n}\r\n\r\n\r\n/*\r\n * Check that n is a primitive number, an integer, and in range, otherwise throw.\r\n */\r\nfunction intCheck(n, min, max, name) {\r\n if (n < min || n > max || n !== mathfloor(n)) {\r\n throw Error\r\n (bignumberError + (name || 'Argument') + (typeof n == 'number'\r\n ? n < min || n > max ? ' out of range: ' : ' not an integer: '\r\n : ' not a primitive number: ') + String(n));\r\n }\r\n}\r\n\r\n\r\n// Assumes finite n.\r\nfunction isOdd(n) {\r\n var k = n.c.length - 1;\r\n return bitFloor(n.e / LOG_BASE) == k && n.c[k] % 2 != 0;\r\n}\r\n\r\n\r\nfunction toExponential(str, e) {\r\n return (str.length > 1 ? str.charAt(0) + '.' + str.slice(1) : str) +\r\n (e < 0 ? 'e' : 'e+') + e;\r\n}\r\n\r\n\r\nfunction toFixedPoint(str, e, z) {\r\n var len, zs;\r\n\r\n // Negative exponent?\r\n if (e < 0) {\r\n\r\n // Prepend zeros.\r\n for (zs = z + '.'; ++e; zs += z);\r\n str = zs + str;\r\n\r\n // Positive exponent\r\n } else {\r\n len = str.length;\r\n\r\n // Append zeros.\r\n if (++e > len) {\r\n for (zs = z, e -= len; --e; zs += z);\r\n str += zs;\r\n } else if (e < len) {\r\n str = str.slice(0, e) + '.' + str.slice(e);\r\n }\r\n }\r\n\r\n return str;\r\n}\r\n\r\n\r\n// EXPORT\r\n\r\n\r\nexport var BigNumber = clone();\r\n\r\nexport default BigNumber;\r\n","import { AprRewardSummary, linearlyInterpolate, ParsedReserve, PerDayRewardSummary, Side } from \"@suilend/sdk\";\nimport { CetusLeverageSDK } from \"../sdk\";\nimport { NORMALIZED_flSUI_COINTYPE, NORMALIZED_jugSUI_COINTYPE, NORMALIZED_LBTC_COINTYPE } from '@suilend/sui-fe'\nimport BigNumber from \"bignumber.js\";\nimport { v4 as uuidv4 } from 'uuid'\n\nexport function calculateUtilizationPercent(reserve: ParsedReserve): BigNumber {\n return reserve.depositedAmount.eq(0)\n ? new BigNumber(0)\n : reserve.borrowedAmount.div(reserve.depositedAmount).times(100);\n}\n\nexport function calculateBorrowAprPercent(reserve: ParsedReserve): BigNumber | undefined {\n const utilizationPercent = calculateUtilizationPercent(reserve);\n if (utilizationPercent.gt(100)) return undefined;\n\n return linearlyInterpolate(\n reserve.config.interestRate,\n \"utilPercent\",\n \"aprPercent\",\n utilizationPercent,\n );\n}\n\nexport function calculateDepositAprPercent(reserve: ParsedReserve): BigNumber | undefined {\n const utilizationPercent = calculateUtilizationPercent(reserve);\n const borrowAprPercent = calculateBorrowAprPercent(reserve);\n\n if (borrowAprPercent === undefined || utilizationPercent.gt(100)) return undefined;\n\n return new BigNumber(utilizationPercent.div(100))\n .times(borrowAprPercent.div(100))\n .times(1 - reserve.config.spreadFeeBps / 10000)\n .times(100);\n}\n\nexport function appendExtraRewards(\n side: Side,\n reserve: ParsedReserve,\n filteredRewards: any[],\n sdk: CetusLeverageSDK,\n) {\n if (side === Side.DEPOSIT) {\n if ([NORMALIZED_flSUI_COINTYPE, NORMALIZED_jugSUI_COINTYPE].includes(reserve.coinType)) {\n filteredRewards.push({\n stats: {\n id: uuidv4(),\n isActive: true,\n rewardIndex: -1,\n reserve,\n rewardCoinType: \"LIQ_AG\",\n mintDecimals: 0,\n symbol: \"LiqAg Points\",\n iconUrl: `${sdk.sdkOptions?.suilend?.apiUrl}/partners/LiqAg.png`,\n perDay: new BigNumber(0.036),\n side: Side.DEPOSIT,\n },\n obligationClaims: {},\n });\n }\n\n if (reserve.coinType === NORMALIZED_LBTC_COINTYPE) {\n filteredRewards.push({\n stats: {\n id: uuidv4(),\n isActive: true,\n rewardIndex: -1,\n reserve,\n rewardCoinType: \"LOMBARD\",\n mintDecimals: 0,\n symbol: \"3x Lombard Lux\",\n iconUrl: `${sdk.sdkOptions?.suilend?.apiUrl}/partners/Lombard Lux.png`,\n perDay: new BigNumber(0),\n side: Side.DEPOSIT,\n },\n obligationClaims: {},\n });\n }\n }\n}\n\nexport function getUpdatedReserve(reserve: ParsedReserve, side: Side, changeAmount: BigNumber): ParsedReserve {\n return {\n ...reserve,\n depositedAmount:\n side === Side.DEPOSIT\n ? BigNumber.max(reserve.depositedAmount.plus(changeAmount), 0)\n : reserve.depositedAmount,\n borrowedAmount:\n side === Side.BORROW\n ? BigNumber.max(reserve.borrowedAmount.plus(changeAmount), 0)\n : reserve.borrowedAmount,\n };\n}\n\n\nexport function getRewardsAprMultiplier(\n side: Side,\n reserve: ParsedReserve,\n newReserve: ParsedReserve\n): { multiplier: BigNumber; isValid: boolean } {\n const totalAmount = side === Side.DEPOSIT ? reserve.depositedAmount : reserve.borrowedAmount;\n const newTotalAmount = side === Side.DEPOSIT ? newReserve.depositedAmount : newReserve.borrowedAmount;\n\n const multiplier = newTotalAmount.eq(0) ? new BigNumber(-1) : totalAmount.div(newTotalAmount);\n return { multiplier, isValid: !multiplier.eq(-1) };\n}\n\n\nexport function updateRewardsWithMultiplier(\n perDayRewards: PerDayRewardSummary[],\n aprRewards: AprRewardSummary[],\n multiplier: BigNumber,\n isValid: boolean\n) {\n const newPerDayRewards = perDayRewards.map((r) => ({\n ...r,\n stats: {\n ...r.stats,\n perDay: isValid ? r.stats.perDay.times(multiplier) : undefined,\n },\n })) as PerDayRewardSummary[];\n\n const newAprRewards = aprRewards.map((r) => ({\n ...r,\n stats: {\n ...r.stats,\n aprPercent: isValid ? r.stats.aprPercent.times(multiplier) : undefined,\n },\n })) as AprRewardSummary[];\n\n return { newPerDayRewards, newAprRewards };\n}\n\n\n","import crypto from 'crypto';\nconst rnds8Pool = new Uint8Array(256); // # of random values to pre-allocate\n\nlet poolPtr = rnds8Pool.length;\nexport default function rng() {\n if (poolPtr > rnds8Pool.length - 16) {\n crypto.randomFillSync(rnds8Pool);\n poolPtr = 0;\n }\n\n return rnds8Pool.slice(poolPtr, poolPtr += 16);\n}","import validate from './validate.js';\n/**\n * Convert array of 16 byte values to UUID string format of the form:\n * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\n */\n\nconst byteToHex = [];\n\nfor (let i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).slice(1));\n}\n\nexport function unsafeStringify(arr, offset = 0) {\n // Note: Be careful editing this code! It's been tuned for performance\n // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434\n return byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]];\n}\n\nfunction stringify(arr, offset = 0) {\n const uuid = unsafeStringify(arr, offset); // Consistency check for valid UUID. If this throws, it's likely due to one\n // of the following:\n // - One or more input array values don't map to a hex octet (leading to\n // \"undefined\" in the uuid)\n // - Invalid input values for the RFC `version` or `variant` fields\n\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n\n return uuid;\n}\n\nexport default stringify;","import crypto from 'crypto';\nexport default {\n randomUUID: crypto.randomUUID\n};","import native from './native.js';\nimport rng from './rng.js';\nimport { unsafeStringify } from './stringify.js';\n\nfunction v4(options, buf, offset) {\n if (native.randomUUID && !buf && !options) {\n return native.randomUUID();\n }\n\n options = options || {};\n const rnds = options.random || (options.rng || rng)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`\n\n rnds[6] = rnds[6] & 0x0f | 0x40;\n rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided\n\n if (buf) {\n offset = offset || 0;\n\n for (let i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n\n return buf;\n }\n\n return unsafeStringify(rnds);\n}\n\nexport default v4;","import { CetusLeverageSDK } from \"../sdk\";\nimport { getPackagerConfigs, CACHE_TIME_5MIN, CoinAssist, CLOCK_ADDRESS, getDefaultSqrtPriceLimit } from \"@cetusprotocol/common-sdk\";\nimport { FlashSwapParams, OpenShortParams, RepayFlashSwapParams } from \"../types\";\nimport Decimal from \"decimal.js\";\nimport BN from \"bn.js\";\nimport { FindRouterParams, RouterData } from \"@cetusprotocol/aggregator-sdk\";\nimport { Transaction } from \"@mysten/sui/dist/cjs/transactions\";\n\nexport class LeverageModules {\n protected _sdk: CetusLeverageSDK\n\n constructor(sdk: CetusLeverageSDK) {\n this._sdk = sdk\n }\n\n // 获取合约config信息 包含是否禁用做多、做空\n getLeverageConfig = async () => {\n const config = getPackagerConfigs(this._sdk.sdkOptions.leverage)\n const globalConfigData: any = await this._sdk.FullClient.getObject({\n id: config.global_config_id,\n options: {\n showContent: true,\n }\n })\n const globalConfig = globalConfigData.data.content.fields\n return globalConfig\n }\n\n getLeverageMarketsList = async (force_refresh = false) => {\n const cacheKey = 'leverage_markets_list'\n\n // 尝试从缓存获取数据\n const cachedData = this._sdk.getCache<any[]>(cacheKey, force_refresh)\n if (cachedData) {\n return cachedData\n }\n\n const config = getPackagerConfigs(this._sdk.sdkOptions.leverage)\n\n const marketsTableObject: any = await this._sdk.FullClient.getObject({\n id: config.markets_table_id,\n options: {\n showContent: true,\n }\n })\n let nextCursor: string | null = null\n const limit = 50\n const marketsList: any = []\n\n while (true) {\n const marketsTableData = await this._sdk.FullClient.getDynamicFields({\n parentId: marketsTableObject.data.content.fields.list.fields.id.id,\n limit,\n cursor: nextCursor,\n })\n marketsList.push(...marketsTableData.data)\n if (marketsTableData.data.length < limit) {\n break\n }\n nextCursor = marketsTableData.nextCursor\n }\n\n // 将结果存入缓存,设置5分钟过期时间\n this._sdk.updateCache(cacheKey, marketsList, CACHE_TIME_5MIN)\n\n return marketsList\n }\n\n getLeverageMarketInfo = async (marketId: string) => {\n const cacheKey = `leverage_market_info_${marketId}`\n const cachedData = this._sdk.getCache<any>(cacheKey)\n if (cachedData) {\n return cachedData\n }\n const marketInfo = await this._sdk.FullClient.getObject({\n id: marketId,\n options: {\n showContent: true,\n }\n })\n // this.sdk.updateCache(cacheKey, marketInfo.data.content.fields, CACHE_TIME_5MIN)\n // return marketInfo.data.content.fields\n }\n\n openShort = async (params: OpenShortParams) => {\n const { isQuote, marketId, amount, clmmPool, slippage } = params\n const { leverage } = this._sdk.sdkOptions\n // const { baseCoinType, quoteCoinType } = this._sdk.getCache<any>(`leverage_market_info_${marketId}`)\n const baseCoinType = '0x2::sui::SUI'\n const quoteCoinType = '0xdba34672e30cb065b1f93e3ab55318768fd6fef66c15942c9f7cb846e2f900e7::usdc::USDC'\n const tx = new Transaction()\n if (!isQuote) {\n const routers: any = await this.findRouters(baseCoinType, quoteCoinType, amount, true, [clmmPool])\n const inputCoin = CoinAssist.buildCoinWithBalance(BigInt(amount.toString()), baseCoinType, tx)\n const quoteCoin = await this._sdk.AggregatorClient.routerSwap({\n routers: routers.route_obj,\n byAmountIn: true,\n inputCoin,\n slippage,\n txb: tx,\n })\n // 闪电贷借资产\n const { balanceA, balanceB, receipt } = this.flashSwap({\n amount: amount,\n clmmPool,\n baseCoinType,\n quoteCoinType,\n tx,\n })\n\n // 抵押资产调用合约方法\n\n // 借资产调用合约方法\n\n // 偿还闪电贷\n // this.repayFlashSwap({\n // clmmPool,\n // coinA: balanceA,\n // coinB: balanceB,\n // tx,\n // baseCoinType,\n // quoteCoinType,\n // })\n\n\n // // 创建仓位\n\n // tx.moveCall({\n // target: `${leverage.published_at}::pool::open_short`,\n // arguments: [\n // tx.object(global_config_id),\n // tx.object(clmmPool),\n // ],\n // })\n\n }\n }\n\n flashSwap = (params: FlashSwapParams) => {\n const { clmm_pool } = this._sdk.ClmmSDK.sdkOptions\n const { global_config_id } = getPackagerConfigs(this._sdk.ClmmSDK.sdkOptions.clmm_pool)\n const { amount, clmmPool, baseCoinType, quoteCoinType, tx } = params\n const sqrt_price_limit = getDefaultSqrtPriceLimit(true).toString()\n const [balanceA, balanceB, receipt] = tx.moveCall({\n target: `${clmm_pool.published_at}::pool::flash_swap`,\n arguments: [\n tx.object(global_config_id),\n tx.object(clmmPool),\n tx.pure.bool(true),\n tx.pure.bool(true),\n tx.pure.u64(amount.toString()),\n tx.pure.u128(sqrt_price_limit),\n tx.object(CLOCK_ADDRESS),\n ],\n typeArguments: [baseCoinType, quoteCoinType],\n })\n return { balanceA, balanceB, receipt }\n }\n\n repayFlashSwap = (params: RepayFlashSwapParams) => {\n const { clmm_pool } = this._sdk.ClmmSDK.sdkOptions\n const { global_config_id } = getPackagerConfigs(this._sdk.ClmmSDK.sdkOptions.clmm_pool)\n const { clmmPool, coinA, coinB, tx, baseCoinType, quoteCoinType } = params\n tx.moveCall({\n target: `${clmm_pool.published_at}::pool::repay_flash_swap`,\n arguments: [\n tx.object(global_config_id),\n tx.object(clmmPool),\n tx.object(coinA),\n tx.object(coinB),\n tx.object(CLOCK_ADDRESS),\n ],\n typeArguments: [baseCoinType, quoteCoinType],\n })\n }\n\n public async findRouters(\n coin_type_a: string,\n coin_type_b: string,\n amount: Decimal,\n by_amount_in: boolean,\n pools: string[],\n ) {\n const { providers } = this._sdk.sdkOptions\n\n try {\n const findRouterParams: FindRouterParams = {\n from: coin_type_a,\n target: coin_type_b,\n amount: new BN(amount.toFixed(0).toString()),\n byAmountIn: by_amount_in,\n depth: 3,\n providers,\n }\n const res = await this._sdk.AggregatorClient.findRouters(findRouterParams)\n if (res?.error?.code === 10001) {\n return {\n ...res,\n is_exceed: res.insufficientLiquidity,\n }\n }\n if (res?.insufficientLiquidity) {\n return {\n ...res,\n is_exceed: res.insufficientLiquidity,\n }\n }\n if (!res?.routes || res?.routes?.length === 0) {\n throw Error('Aggregator no router')\n }\n\n return {\n amount_in: res.amountIn.toString(),\n amount_out: res.amountOut.toString(),\n is_exceed: res.insufficientLiquidity,\n route_obj: res,\n byAmountIn: true,\n originRes: res,\n }\n } catch (error) {\n try {\n if (pools) {\n const res: any = await this._sdk.AggregatorClient.swapInPools({\n from: coin_type_a,\n target: coin_type_b,\n amount: new BN(amount.toFixed(0).toString()),\n byAmountIn: by_amount_in,\n pools,\n })\n\n if (res) {\n return {\n amount_in: res.routeData.amountIn.toString(),\n amount_out: res.routeData.amountOut.toString(),\n is_exceed: res.isExceed,\n route_obj: res.routeData,\n byAmountIn: true,\n originRes: res,\n }\n }\n return null\n }\n return null\n } catch (e) {\n return null\n }\n }\n }\n\n}"],"mappings":"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","names":["require_bn","__commonJSMin","exports","module","assert","val","msg","inherits","ctor","superCtor","TempCtor","BN","number","base","endian","Buffer","num","left","right","start","i","j","w","off","parseHex4Bits","string","index","c","parseHexByte","lowerBound","r","parseLength","parseBase","str","end","mul","b","len","limbLen","limbPow","total","mod","word","pow","dest","move","src","size","inspect","zeros","groupSizes","groupBases","padding","out","carry","groupSize","groupBase","ret","length","allocate","ArrayType","byteLength","reqLength","res","postfix","position","shift","t","hi","toBitArray","bit","wbit","width","a","bytesNeeded","bitsLeft","cmp","smallMulTo","self","lo","k","ncarry","rword","maxJ","comb10MulTo","o","mid","a0","al0","ah0","a1","al1","ah1","a2","al2","ah2","a3","al3","ah3","a4","al4","ah4","a5","al5","ah5","a6","al6","ah6","a7","al7","ah7","a8","al8","ah8","a9","al9","ah9","b0","bl0","bh0","b1","bl1","bh1","b2","bl2","bh2","b3","bl3","bh3","b4","bl4","bh4","b5","bl5","bh5","b6","bl6","bh6","b7","bl7","bh7","b8","bl8","bh8","b9","bl9","bh9","w0","w1","w2","w3","w4","w5","w6","w7","w8","w9","w10","w11","w12","w13","w14","w15","w16","w17","w18","bigMulTo","hncarry","jumboMulTo","FFTM","x","y","N","l","rb","rbt","rws","iws","rtws","itws","s","rtwdf","itwdf","p","rtwdf_","itwdf_","re","ie","ro","io","rx","n","m","odd","ws","ph","_","rwst","iwst","nrws","nrwst","niwst","rmws","isNegNum","q","bits","carryMask","newCarry","hint","extended","h","mask","maskedWords","mode","bhi","bhiBits","diff","qj","positive","div","dm","half","r2","acc","A","B","C","D","g","yp","xp","im","jm","x1","x2","delta","negative","Red","ctx","primes","MPrime","name","tmp","rlen","input","K256","output","outLen","prev","next","P224","P192","P25519","prime","mod3","one","nOne","lpow","z","inv","windowSize","wnd","current","currentLen","Mont","u","index_exports","__export","CetusLeverageSDK","index_default","leverage_mainnet","__toCommonJS","import_common_sdk","import_common_sdk","leverage_mainnet","import_client","import_sdk","isNumeric","mathceil","mathfloor","bignumberError","tooManyDigits","BASE","LOG_BASE","MAX_SAFE_INTEGER","POWS_TEN","SQRT_BASE","MAX","clone","configObject","div","convertBase","parseNumeric","P","BigNumber","ONE","DECIMAL_PLACES","ROUNDING_MODE","TO_EXP_NEG","TO_EXP_POS","MIN_EXP","MAX_EXP","CRYPTO","MODULO_MODE","POW_PRECISION","FORMAT","ALPHABET","alphabetHasNormalDecimalDigits","v","b","alphabet","c","caseChanged","e","i","isNum","len","str","x","intCheck","round","obj","p","n","out","maxOrMin","pow2_53","random53bitInt","dp","a","k","rand","args","sum","decimal","toBaseOut","baseIn","baseOut","j","arr","arrL","sign","callerIsToString","d","r","xc","y","rm","toFixedPoint","coeffToString","multiply","base","m","temp","xlo","xhi","carry","klo","khi","compare","aL","bL","cmp","subtract","more","prod","prodL","q","qc","rem","remL","rem0","xi","xL","yc0","yL","yz","s","yc","bitFloor","format","id","c0","ne","toExponential","normalise","basePrefix","dotAfter","dotBefore","isInfinityOrNaN","whitespaceOrPlus","p1","p2","sd","ni","rd","pows10","valueOf","half","isModExp","nIsBig","nIsNeg","nIsOdd","isOdd","t","xLTy","xe","ye","xcL","ycL","ylo","yhi","zc","sqrtBase","rep","g1","g2","groupSeparator","intPart","fractionPart","isNeg","intDigits","md","d0","d1","d2","exp","n0","n1","z","l","min","max","name","zs","bignumber_default","import_sdk","import_sui_fe","import_crypto","rnds8Pool","poolPtr","rng","crypto","byteToHex","i","unsafeStringify","arr","offset","import_crypto","native_default","crypto","v4","options","buf","offset","native_default","rnds","rng","i","unsafeStringify","v4_default","calculateUtilizationPercent","reserve","bignumber_default","calculateBorrowAprPercent","utilizationPercent","calculateDepositAprPercent","borrowAprPercent","appendExtraRewards","side","filteredRewards","sdk","v4_default","getUpdatedReserve","changeAmount","getRewardsAprMultiplier","newReserve","totalAmount","newTotalAmount","multiplier","updateRewardsWithMultiplier","perDayRewards","aprRewards","isValid","newPerDayRewards","r","newAprRewards","import_common_sdk","SuiLendModule","sdk","coinType","changeAmount","allLendingMarketData","lstAprPercentMap","list","reserve","r","currentUserData","side","rewards","filteredRewards","appendExtraRewards","stakingYieldAprPercent","aprPercent","newAprPercent","newReserve","getUpdatedReserve","calculateDepositAprPercent","calculateBorrowAprPercent","multiplier","isValid","getRewardsAprMultiplier","perDayRewards","aprRewards","newPerDayRewards","newAprRewards","updateRewardsWithMultiplier","totalAprPercent","newTotalAprPercent","reward","transaction","lendingMarketId","lendingMarketType","cacheKey","forceRefresh","lendingMarkets","LENDING_MARKET","suilendClient","lendingMarket","coinMetadataMap","refreshedRawReserves","reserveMap","reserveCoinTypes","reserveCoinMetadataMap","rewardCoinTypes","activeRewardCoinTypes","rewardCoinMetadataMap","rewardPriceMap","res","json","bignumber_default","err","error","allAppData","result","appData","obligationOwnerCaps","obligations","rewardMap","obligationId","userData","obligation","o","netAprPercent","import_common_sdk","import_bn","import_transactions","LeverageModules","sdk","config","force_refresh","cacheKey","cachedData","marketsTableObject","nextCursor","limit","marketsList","marketsTableData","marketId","marketInfo","params","isQuote","amount","clmmPool","slippage","leverage","baseCoinType","quoteCoinType","tx","routers","inputCoin","quoteCoin","balanceA","balanceB","receipt","clmm_pool","global_config_id","sqrt_price_limit","coinA","coinB","coin_type_a","coin_type_b","by_amount_in","pools","providers","findRouterParams","BN","res","import_aggregator_sdk","import_utils","import_client","import_sui_clmm_sdk","CetusLeverageSDK","_CetusLeverageSDK","options","clmmSDK","SuiLendModule","LeverageModules","leverage_mainnet","index_default","CetusLeverageSDK"]}
|